From 77fe2d5efbd35ee81465d4f5cd9c08b426fdfc55 Mon Sep 17 00:00:00 2001 From: Marcus Kammer Date: Tue, 2 Aug 2022 12:34:59 +0200 Subject: [PATCH] Add clones websites --- .../cloudflare-static/email-decode.min.js | 1 + .../resources/swe-book/html/ch01.html | 394 + .../resources/swe-book/html/ch02.html | 382 + .../resources/swe-book/html/ch03.html | 542 ++ .../resources/swe-book/html/ch04.html | 206 + .../resources/swe-book/html/ch05.html | 397 + .../resources/swe-book/html/ch06.html | 308 + .../resources/swe-book/html/ch07.html | 421 + .../resources/swe-book/html/ch08.html | 443 + .../resources/swe-book/html/ch09.html | 375 + .../resources/swe-book/html/ch10.html | 549 ++ .../resources/swe-book/html/ch11.html | 434 + .../resources/swe-book/html/ch12.html | 863 ++ .../resources/swe-book/html/ch13.html | 757 ++ .../resources/swe-book/html/ch14.html | 838 ++ .../resources/swe-book/html/ch15.html | 237 + .../resources/swe-book/html/ch16.html | 348 + .../resources/swe-book/html/ch17.html | 354 + .../resources/swe-book/html/ch18.html | 589 ++ .../resources/swe-book/html/ch19.html | 387 + .../resources/swe-book/html/ch20.html | 213 + .../resources/swe-book/html/ch21.html | 471 + .../resources/swe-book/html/ch22.html | 414 + .../resources/swe-book/html/ch23.html | 567 ++ .../resources/swe-book/html/ch24.html | 199 + .../resources/swe-book/html/ch25.html | 499 + .../resources/swe-book/html/ch26.html | 33 + .../resources/swe-book/html/foreword.html | 23 + .../swe-book/html/images/seag_0101.png | Bin 0 -> 24730 bytes .../swe-book/html/images/seag_0102.png | Bin 0 -> 27469 bytes .../swe-book/html/images/seag_0601.png | Bin 0 -> 31849 bytes .../swe-book/html/images/seag_0602.png | Bin 0 -> 63736 bytes .../swe-book/html/images/seag_1101.png | Bin 0 -> 757595 bytes .../swe-book/html/images/seag_1103.png | Bin 0 -> 20457 bytes .../swe-book/html/images/seag_1104.png | Bin 0 -> 21740 bytes .../swe-book/html/images/seag_1105.png | Bin 0 -> 90648 bytes .../swe-book/html/images/seag_1401.png | Bin 0 -> 12768 bytes .../swe-book/html/images/seag_1402.png | Bin 0 -> 58458 bytes .../swe-book/html/images/seag_1403.png | Bin 0 -> 63015 bytes .../swe-book/html/images/seag_1404.png | Bin 0 -> 20296 bytes .../swe-book/html/images/seag_1405.png | Bin 0 -> 42020 bytes .../swe-book/html/images/seag_1406.png | Bin 0 -> 46643 bytes .../swe-book/html/images/seag_1601.png | Bin 0 -> 37997 bytes .../swe-book/html/images/seag_1701.png | Bin 0 -> 289325 bytes .../swe-book/html/images/seag_1702.png | Bin 0 -> 616957 bytes .../swe-book/html/images/seag_1703.png | Bin 0 -> 39038 bytes .../swe-book/html/images/seag_1704.png | Bin 0 -> 28495 bytes .../swe-book/html/images/seag_1801.png | Bin 0 -> 5909 bytes .../swe-book/html/images/seag_1802.png | Bin 0 -> 15474 bytes .../swe-book/html/images/seag_1803.png | Bin 0 -> 25621 bytes .../swe-book/html/images/seag_1804.png | Bin 0 -> 30077 bytes .../swe-book/html/images/seag_1805.png | Bin 0 -> 11490 bytes .../swe-book/html/images/seag_1901.png | Bin 0 -> 16462 bytes .../swe-book/html/images/seag_1902.png | Bin 0 -> 46606 bytes .../swe-book/html/images/seag_1903.png | Bin 0 -> 262593 bytes .../swe-book/html/images/seag_1904.png | Bin 0 -> 216116 bytes .../swe-book/html/images/seag_1905.png | Bin 0 -> 95522 bytes .../swe-book/html/images/seag_1906.png | Bin 0 -> 180729 bytes .../swe-book/html/images/seag_1907.png | Bin 0 -> 93552 bytes .../swe-book/html/images/seag_1908.png | Bin 0 -> 273634 bytes .../swe-book/html/images/seag_2001.png | Bin 0 -> 150149 bytes .../swe-book/html/images/seag_2002.png | Bin 0 -> 26913 bytes .../swe-book/html/images/seag_2101.png | Bin 0 -> 13245 bytes .../swe-book/html/images/seag_2301.png | Bin 0 -> 27708 bytes .../swe-book/html/images/seag_2302.png | Bin 0 -> 48140 bytes .../swe-book/html/images/seag_2303.png | Bin 0 -> 38301 bytes .../swe-book/html/images/seag_2304.png | Bin 0 -> 34232 bytes .../swe-book/html/images/seag_2305.png | Bin 0 -> 20042 bytes .../abseil.io/resources/swe-book/html/ix.html | 8644 +++++++++++++++++ .../resources/swe-book/html/part1.html | 16 + .../resources/swe-book/html/part2.html | 21 + .../resources/swe-book/html/part3.html | 23 + .../resources/swe-book/html/part4.html | 25 + .../resources/swe-book/html/part5.html | 16 + .../resources/swe-book/html/pr01.html | 271 + .../swe-book/html/theme/html/html.css | 1529 +++ .../resources/swe-book/html/toc.html | 1995 ++++ clones/asdf.common-lisp.dev/asdf.html | 6745 +++++++++++++ clones/colinallen.dnsalias.org/lp/lp.html | 294 + clones/colinallen.dnsalias.org/lp/lp.pdf | Bin 0 -> 853440 bytes .../colinallen.dnsalias.org/lp/next_motif.gif | Bin 0 -> 172 bytes .../lp/next_motif_gr.gif | Bin 0 -> 172 bytes .../colinallen.dnsalias.org/lp/node-rest.html | 62 + clones/colinallen.dnsalias.org/lp/node1.html | 88 + clones/colinallen.dnsalias.org/lp/node10.html | 84 + .../colinallen.dnsalias.org/lp/node100.html | 56 + .../colinallen.dnsalias.org/lp/node101.html | 65 + .../colinallen.dnsalias.org/lp/node102.html | 60 + .../colinallen.dnsalias.org/lp/node103.html | 99 + .../colinallen.dnsalias.org/lp/node104.html | 42 + .../colinallen.dnsalias.org/lp/node105.html | 60 + .../colinallen.dnsalias.org/lp/node106.html | 63 + .../colinallen.dnsalias.org/lp/node107.html | 55 + .../colinallen.dnsalias.org/lp/node108.html | 63 + .../colinallen.dnsalias.org/lp/node109.html | 59 + clones/colinallen.dnsalias.org/lp/node11.html | 60 + .../colinallen.dnsalias.org/lp/node110.html | 64 + .../colinallen.dnsalias.org/lp/node111.html | 57 + .../colinallen.dnsalias.org/lp/node112.html | 58 + .../colinallen.dnsalias.org/lp/node113.html | 97 + .../colinallen.dnsalias.org/lp/node114.html | 68 + .../colinallen.dnsalias.org/lp/node115.html | 63 + .../colinallen.dnsalias.org/lp/node116.html | 33 + clones/colinallen.dnsalias.org/lp/node12.html | 73 + clones/colinallen.dnsalias.org/lp/node13.html | 76 + clones/colinallen.dnsalias.org/lp/node14.html | 120 + clones/colinallen.dnsalias.org/lp/node15.html | 65 + clones/colinallen.dnsalias.org/lp/node16.html | 78 + clones/colinallen.dnsalias.org/lp/node17.html | 99 + clones/colinallen.dnsalias.org/lp/node18.html | 60 + clones/colinallen.dnsalias.org/lp/node19.html | 44 + clones/colinallen.dnsalias.org/lp/node2.html | 63 + clones/colinallen.dnsalias.org/lp/node20.html | 69 + clones/colinallen.dnsalias.org/lp/node21.html | 39 + clones/colinallen.dnsalias.org/lp/node22.html | 49 + clones/colinallen.dnsalias.org/lp/node23.html | 83 + clones/colinallen.dnsalias.org/lp/node24.html | 41 + clones/colinallen.dnsalias.org/lp/node25.html | 128 + clones/colinallen.dnsalias.org/lp/node26.html | 60 + clones/colinallen.dnsalias.org/lp/node27.html | 63 + clones/colinallen.dnsalias.org/lp/node28.html | 128 + clones/colinallen.dnsalias.org/lp/node29.html | 61 + clones/colinallen.dnsalias.org/lp/node3.html | 103 + clones/colinallen.dnsalias.org/lp/node30.html | 41 + clones/colinallen.dnsalias.org/lp/node31.html | 68 + clones/colinallen.dnsalias.org/lp/node32.html | 55 + clones/colinallen.dnsalias.org/lp/node33.html | 46 + clones/colinallen.dnsalias.org/lp/node34.html | 67 + clones/colinallen.dnsalias.org/lp/node35.html | 68 + clones/colinallen.dnsalias.org/lp/node36.html | 50 + clones/colinallen.dnsalias.org/lp/node37.html | 117 + clones/colinallen.dnsalias.org/lp/node38.html | 76 + clones/colinallen.dnsalias.org/lp/node39.html | 49 + clones/colinallen.dnsalias.org/lp/node4.html | 78 + clones/colinallen.dnsalias.org/lp/node40.html | 100 + clones/colinallen.dnsalias.org/lp/node41.html | 60 + clones/colinallen.dnsalias.org/lp/node42.html | 49 + clones/colinallen.dnsalias.org/lp/node43.html | 211 + clones/colinallen.dnsalias.org/lp/node44.html | 216 + clones/colinallen.dnsalias.org/lp/node45.html | 209 + clones/colinallen.dnsalias.org/lp/node46.html | 153 + clones/colinallen.dnsalias.org/lp/node47.html | 211 + clones/colinallen.dnsalias.org/lp/node48.html | 124 + clones/colinallen.dnsalias.org/lp/node49.html | 88 + clones/colinallen.dnsalias.org/lp/node5.html | 131 + clones/colinallen.dnsalias.org/lp/node50.html | 53 + clones/colinallen.dnsalias.org/lp/node51.html | 99 + clones/colinallen.dnsalias.org/lp/node52.html | 71 + clones/colinallen.dnsalias.org/lp/node53.html | 39 + clones/colinallen.dnsalias.org/lp/node54.html | 99 + clones/colinallen.dnsalias.org/lp/node55.html | 69 + clones/colinallen.dnsalias.org/lp/node56.html | 145 + clones/colinallen.dnsalias.org/lp/node57.html | 41 + clones/colinallen.dnsalias.org/lp/node58.html | 47 + clones/colinallen.dnsalias.org/lp/node59.html | 148 + clones/colinallen.dnsalias.org/lp/node6.html | 79 + clones/colinallen.dnsalias.org/lp/node60.html | 124 + clones/colinallen.dnsalias.org/lp/node61.html | 60 + clones/colinallen.dnsalias.org/lp/node62.html | 162 + clones/colinallen.dnsalias.org/lp/node63.html | 60 + clones/colinallen.dnsalias.org/lp/node64.html | 101 + clones/colinallen.dnsalias.org/lp/node65.html | 40 + clones/colinallen.dnsalias.org/lp/node66.html | 63 + clones/colinallen.dnsalias.org/lp/node67.html | 61 + clones/colinallen.dnsalias.org/lp/node68.html | 58 + clones/colinallen.dnsalias.org/lp/node69.html | 56 + clones/colinallen.dnsalias.org/lp/node7.html | 52 + clones/colinallen.dnsalias.org/lp/node70.html | 46 + clones/colinallen.dnsalias.org/lp/node71.html | 80 + clones/colinallen.dnsalias.org/lp/node72.html | 139 + clones/colinallen.dnsalias.org/lp/node73.html | 70 + clones/colinallen.dnsalias.org/lp/node74.html | 70 + clones/colinallen.dnsalias.org/lp/node75.html | 58 + clones/colinallen.dnsalias.org/lp/node76.html | 55 + clones/colinallen.dnsalias.org/lp/node77.html | 70 + clones/colinallen.dnsalias.org/lp/node78.html | 77 + clones/colinallen.dnsalias.org/lp/node79.html | 59 + clones/colinallen.dnsalias.org/lp/node8.html | 68 + clones/colinallen.dnsalias.org/lp/node80.html | 68 + clones/colinallen.dnsalias.org/lp/node81.html | 57 + clones/colinallen.dnsalias.org/lp/node82.html | 62 + clones/colinallen.dnsalias.org/lp/node83.html | 67 + clones/colinallen.dnsalias.org/lp/node84.html | 40 + clones/colinallen.dnsalias.org/lp/node85.html | 60 + clones/colinallen.dnsalias.org/lp/node86.html | 35 + clones/colinallen.dnsalias.org/lp/node87.html | 94 + clones/colinallen.dnsalias.org/lp/node88.html | 70 + clones/colinallen.dnsalias.org/lp/node89.html | 94 + clones/colinallen.dnsalias.org/lp/node9.html | 119 + clones/colinallen.dnsalias.org/lp/node90.html | 126 + clones/colinallen.dnsalias.org/lp/node91.html | 72 + clones/colinallen.dnsalias.org/lp/node92.html | 114 + clones/colinallen.dnsalias.org/lp/node93.html | 62 + clones/colinallen.dnsalias.org/lp/node94.html | 57 + clones/colinallen.dnsalias.org/lp/node95.html | 59 + clones/colinallen.dnsalias.org/lp/node96.html | 66 + clones/colinallen.dnsalias.org/lp/node97.html | 59 + clones/colinallen.dnsalias.org/lp/node98.html | 77 + clones/colinallen.dnsalias.org/lp/node99.html | 60 + .../lp/previous_motif.gif | Bin 0 -> 220 bytes .../lp/previous_motif_gr.gif | Bin 0 -> 220 bytes .../colinallen.dnsalias.org/lp/relinks.html | 102 + .../colinallen.dnsalias.org/lp/up_motif.gif | Bin 0 -> 145 bytes .../lp/up_motif_gr.gif | Bin 0 -> 145 bytes .../book/a-few-format-recipes.html | 481 + ...tion-handling-conditions-and-restarts.html | 460 + ...eyond-lists-other-uses-for-cons-cells.html | 335 + clones/gigamonkeys.com/book/blurbs.html | 298 + clones/gigamonkeys.com/book/collections.html | 520 + .../book/conclusion-whats-next.html | 692 ++ .../book/figures/account-hierarchy.png | Bin 0 -> 1467 bytes .../book/figures/after-append.png | Bin 0 -> 1192 bytes .../book/figures/alist-abc-123.png | Bin 0 -> 1117 bytes .../book/figures/copy-list-list-or-tree.png | Bin 0 -> 3273 bytes .../book/figures/copy-tree-list-or-tree.png | Bin 0 -> 3046 bytes .../book/figures/list-1-2-3.png | Bin 0 -> 477 bytes .../book/figures/list-or-tree.png | Bin 0 -> 1942 bytes .../book/figures/mixed-list.png | Bin 0 -> 1080 bytes .../book/figures/one-cons-cell.png | Bin 0 -> 184 bytes .../book/figures/plist-abc-123.png | Bin 0 -> 801 bytes .../book/figures/restart-call-stack.png | Bin 0 -> 1463 bytes .../book/files-and-file-io.html | 619 ++ clones/gigamonkeys.com/book/functions.html | 498 + clones/gigamonkeys.com/book/index.html | 161 + .../book/introduction-why-lisp.html | 365 + .../gigamonkeys.com/book/jolt_logo16_sm.gif | Bin 0 -> 6136 bytes ...ather-rinse-repeat-a-tour-of-the-repl.html | 431 + .../book/letter-to-reader.html | 71 + .../book/loop-for-black-belts.html | 469 + .../book/macros-defining-your-own.html | 558 ++ .../macros-standard-control-constructs.html | 388 + .../book/numbers-characters-and-strings.html | 438 + .../book/object-reorientation-classes.html | 680 ++ ...bject-reorientation-generic-functions.html | 588 ++ ...practical-a-portable-pathname-library.html | 364 + .../book/practical-a-shoutcast-server.html | 404 + .../book/practical-a-simple-database.html | 709 ++ .../book/practical-a-spam-filter.html | 789 ++ ...-html-generation-library-the-compiler.html | 616 ++ ...ml-generation-library-the-interpreter.html | 610 ++ .../book/practical-an-id3-parser.html | 1098 +++ .../book/practical-an-mp3-browser.html | 863 ++ .../book/practical-an-mp3-database.html | 623 ++ ...ctical-building-a-unit-test-framework.html | 386 + .../book/practical-parsing-binary-files.html | 967 ++ ...cal-web-programming-with-allegroserve.html | 700 ++ .../book/practicals-1.0.3.tar.gz | Bin 0 -> 204800 bytes .../gigamonkeys.com/book/practicals-1.0.3.zip | Bin 0 -> 239354 bytes ...ing-in-the-large-packages-and-symbols.html | 547 ++ .../book/screenshots/hello-world.jpg | Bin 0 -> 15455 bytes .../book/screenshots/new-sample.jpg | Bin 0 -> 24602 bytes .../book/screenshots/random-number.jpg | Bin 0 -> 16214 bytes .../book/screenshots/set-cookie.jpg | Bin 0 -> 16420 bytes .../screenshots/show-cookies-no-cookies.jpg | Bin 0 -> 15603 bytes .../screenshots/show-cookies-one-cookie.jpg | Bin 0 -> 16855 bytes .../book/screenshots/show-query-params-1a.jpg | Bin 0 -> 17758 bytes .../book/screenshots/show-query-params-2.jpg | Bin 0 -> 18633 bytes .../book/screenshots/simple-form.jpg | Bin 0 -> 17393 bytes clones/gigamonkeys.com/book/small-cover.gif | Bin 0 -> 6738 bytes clones/gigamonkeys.com/book/style.css | 106 + .../book/syntax-and-semantics.html | 559 ++ .../book/the-special-operators.html | 732 ++ ...-it-lisp-for-a-reason-list-processing.html | 453 + clones/gigamonkeys.com/book/variables.html | 531 + .../cl-cookbook/AppendixA.jpg | Bin 0 -> 8061 bytes .../cl-cookbook/AppendixB.jpg | Bin 0 -> 8152 bytes .../cl-cookbook/AppendixC.jpg | Bin 0 -> 62243 bytes .../cl-cookbook/arrays.html | 1098 +++ .../cl-cookbook/assets/atom-slime.png | Bin 0 -> 432969 bytes .../cl-cookbook/assets/cl-flamegraph.png | Bin 0 -> 16842 bytes .../cl-cookbook/assets/cl-logo-blue.png | Bin 0 -> 22556 bytes .../cl-cookbook/assets/cl-repl.png | Bin 0 -> 30795 bytes .../cl-cookbook/assets/clack-errors.png | Bin 0 -> 174635 bytes .../assets/commonlisp-vscode-alive.png | Bin 0 -> 91731 bytes .../cl-cookbook/assets/commonlisp-vscode.png | Bin 0 -> 138703 bytes .../cl-cookbook/assets/coverage.png | Bin 0 -> 41906 bytes .../cl-cookbook/assets/editor-sublime.png | Bin 0 -> 31911 bytes .../assets/emacs-company-elisp.png | Bin 0 -> 33590 bytes .../cl-cookbook/assets/emacs-helpful.png | Bin 0 -> 91974 bytes .../cl-cookbook/assets/emacs-teaser.png | Bin 0 -> 98783 bytes .../assets/emacs-which-key-minibuffer.png | Bin 0 -> 27502 bytes .../cl-cookbook/assets/geany.png | Bin 0 -> 96048 bytes .../cl-cookbook/assets/github.css | 30 + .../assets/gui/gtk3-hello-buttons.png | Bin 0 -> 7874 bytes .../cl-cookbook/assets/gui/ltk-on-macos.png | Bin 0 -> 32811 bytes .../cl-cookbook/assets/gui/nuklear-test.png | Bin 0 -> 24137 bytes .../cl-cookbook/assets/gui/nuklear.png | Bin 0 -> 108136 bytes .../cl-cookbook/assets/gui/qtools-intro.png | Bin 0 -> 3692 bytes .../cl-cookbook/assets/highlight-lisp.js | 519 + .../cl-cookbook/assets/img-ci-build.png | Bin 0 -> 34794 bytes .../cl-cookbook/assets/iup-demo.png | Bin 0 -> 114351 bytes .../cl-cookbook/assets/jquery-3.2.1.min.js | 4 + .../assets/jquery.toc/jquery.toc.min.js | 2 + .../cl-cookbook/assets/jupyterpreview.png | Bin 0 -> 75135 bytes .../cl-cookbook/assets/lem-terminal.png | Bin 0 -> 225779 bytes .../assets/lispworks/class-browser.png | Bin 0 -> 122121 bytes .../lispworks/function-call-browser.png | Bin 0 -> 56227 bytes .../assets/lispworks/process-browser.png | Bin 0 -> 46723 bytes .../cl-cookbook/assets/lispworks/stepper.gif | Bin 0 -> 14500 bytes .../assets/lispworks/toolbar-debugger.png | Bin 0 -> 14764 bytes .../assets/lispworks/two-sided-view.png | Bin 0 -> 194310 bytes .../cl-cookbook/assets/log4cl.png | Bin 0 -> 42079 bytes .../cl-cookbook/assets/portacle.png | Bin 0 -> 77788 bytes .../cl-cookbook/assets/slimv.jpg | Bin 0 -> 147416 bytes .../cl-cookbook/assets/sockets-lisp-chat.gif | Bin 0 -> 440866 bytes .../cl-cookbook/assets/style.css | 1 + .../cl-cookbook/assets/toggle-toc.js | 42 + .../assets/vscode-gifs/attach-repl.gif | Bin 0 -> 125250 bytes .../assets/vscode-gifs/compile.gif | Bin 0 -> 167855 bytes .../assets/vscode-gifs/debug-abort.gif | Bin 0 -> 384338 bytes .../assets/vscode-gifs/debug-fix.gif | Bin 0 -> 897707 bytes .../assets/vscode-gifs/disassemble.gif | Bin 0 -> 673991 bytes .../assets/vscode-gifs/docker-connect.gif | Bin 0 -> 3685300 bytes .../cl-cookbook/assets/vscode-gifs/eval.gif | Bin 0 -> 102128 bytes .../assets/vscode-gifs/in-line-eval.gif | Bin 0 -> 45436 bytes .../assets/vscode-gifs/macro-expand.gif | Bin 0 -> 485242 bytes .../assets/vscode-gifs/skeleton.gif | Bin 0 -> 211824 bytes .../assets/weblocks-quickstart-check-task.gif | Bin 0 -> 28371 bytes .../assets/youtube-little-bits-lisp.jpg | Bin 0 -> 9161 bytes .../cl-cookbook/assets/zenity-prompt.png | Bin 0 -> 8020 bytes .../cl-cookbook/clos.html | 1756 ++++ .../cl-cookbook/dandelion.png | Bin 0 -> 144060 bytes .../cl-cookbook/data-structures.html | 1953 ++++ .../cl-cookbook/databases.html | 952 ++ .../cl-cookbook/dates_and_times.html | 582 ++ .../cl-cookbook/debugging.html | 560 ++ .../cl-cookbook/drafts/defmodel.lisp.html | 154 + .../cl-cookbook/editor-support.html | 337 + .../cl-cookbook/emacs-ide.html | 1051 ++ .../cl-cookbook/error_handling.html | 688 ++ .../cl-cookbook/ffi.html | 225 + .../cl-cookbook/files.html | 745 ++ .../cl-cookbook/functions.html | 740 ++ .../cl-cookbook/getting-started.html | 591 ++ .../cl-cookbook/gui.html | 1098 +++ .../cl-cookbook/index.html | 274 + .../cl-cookbook/io.html | 293 + .../cl-cookbook/iteration.html | 1501 +++ .../cl-cookbook/license.html | 145 + .../cl-cookbook/lispworks.html | 652 ++ .../cl-cookbook/macros.html | 795 ++ .../cl-cookbook/misc.html | 210 + .../cl-cookbook/numbers.html | 703 ++ .../cl-cookbook/orly-cover.png | Bin 0 -> 74485 bytes .../cl-cookbook/os.html | 615 ++ .../cl-cookbook/packages.html | 316 + .../cl-cookbook/pattern_matching.html | 315 + .../cl-cookbook/performance.html | 769 ++ .../cl-cookbook/process.html | 2348 +++++ .../cl-cookbook/regexp.html | 234 + .../cl-cookbook/scripting.html | 595 ++ .../cl-cookbook/simple-restarts.png | Bin 0 -> 35627 bytes .../cl-cookbook/sockets.html | 270 + .../cl-cookbook/strings.html | 1229 +++ .../cl-cookbook/systems.html | 294 + .../cl-cookbook/testing.html | 904 ++ .../cl-cookbook/type.html | 602 ++ .../cl-cookbook/vscode-alive.html | 669 ++ .../cl-cookbook/web-scraping.html | 436 + .../cl-cookbook/web.html | 1166 +++ .../cl-cookbook/websockets.html | 416 + .../cl-cookbook/win32.html | 1311 +++ clones/sicp/mitpress.mit.edu/robots.txt | 61 + .../files/sicp/full-text/book/book-Z-C.css | 80 + .../sicp/full-text/book/book-Z-G-D-11.gif | Bin 0 -> 61 bytes .../sicp/full-text/book/book-Z-G-D-12.gif | Bin 0 -> 59 bytes .../sicp/full-text/book/book-Z-G-D-13.gif | Bin 0 -> 65 bytes .../sicp/full-text/book/book-Z-G-D-14.gif | Bin 0 -> 52 bytes .../sicp/full-text/book/book-Z-G-D-15.gif | Bin 0 -> 51 bytes .../sicp/full-text/book/book-Z-G-D-16.gif | Bin 0 -> 54 bytes .../sicp/full-text/book/book-Z-G-D-17.gif | Bin 0 -> 56 bytes .../sicp/full-text/book/book-Z-G-D-18.gif | Bin 0 -> 46 bytes .../sicp/full-text/book/book-Z-G-D-19.gif | Bin 0 -> 55 bytes .../sicp/full-text/book/book-Z-G-D-20.gif | Bin 0 -> 54 bytes .../sicp/full-text/book/book-Z-G-D-3.gif | Bin 0 -> 61 bytes .../sicp/full-text/book/book-Z-G-D-4.gif | Bin 0 -> 58 bytes .../sicp/full-text/book/book-Z-G-D-6.gif | Bin 0 -> 56 bytes .../sicp/full-text/book/book-Z-G-D-9.gif | Bin 0 -> 52 bytes .../files/sicp/full-text/book/book-Z-H-1.html | 70 + .../sicp/full-text/book/book-Z-H-10.html | 1404 +++ .../sicp/full-text/book/book-Z-H-11.html | 1324 +++ .../sicp/full-text/book/book-Z-H-12.html | 1250 +++ .../sicp/full-text/book/book-Z-H-13.html | 218 + .../sicp/full-text/book/book-Z-H-14.html | 765 ++ .../sicp/full-text/book/book-Z-H-15.html | 2242 +++++ .../sicp/full-text/book/book-Z-H-16.html | 1423 +++ .../sicp/full-text/book/book-Z-H-17.html | 895 ++ .../sicp/full-text/book/book-Z-H-18.html | 1422 +++ .../sicp/full-text/book/book-Z-H-19.html | 104 + .../files/sicp/full-text/book/book-Z-H-2.html | 91 + .../sicp/full-text/book/book-Z-H-20.html | 936 ++ .../sicp/full-text/book/book-Z-H-21.html | 664 ++ .../sicp/full-text/book/book-Z-H-22.html | 2201 +++++ .../sicp/full-text/book/book-Z-H-23.html | 1036 ++ .../sicp/full-text/book/book-Z-H-24.html | 2057 ++++ .../sicp/full-text/book/book-Z-H-25.html | 205 + .../sicp/full-text/book/book-Z-H-26.html | 1942 ++++ .../sicp/full-text/book/book-Z-H-27.html | 722 ++ .../sicp/full-text/book/book-Z-H-28.html | 1385 +++ .../sicp/full-text/book/book-Z-H-29.html | 2737 ++++++ .../files/sicp/full-text/book/book-Z-H-3.html | 50 + .../sicp/full-text/book/book-Z-H-30.html | 109 + .../sicp/full-text/book/book-Z-H-31.html | 982 ++ .../sicp/full-text/book/book-Z-H-32.html | 1014 ++ .../sicp/full-text/book/book-Z-H-33.html | 678 ++ .../sicp/full-text/book/book-Z-H-34.html | 1030 ++ .../sicp/full-text/book/book-Z-H-35.html | 2352 +++++ .../sicp/full-text/book/book-Z-H-36.html | 417 + .../sicp/full-text/book/book-Z-H-37.html | 581 ++ .../sicp/full-text/book/book-Z-H-38.html | 3701 +++++++ .../files/sicp/full-text/book/book-Z-H-4.html | 169 + .../files/sicp/full-text/book/book-Z-H-5.html | 208 + .../files/sicp/full-text/book/book-Z-H-6.html | 91 + .../files/sicp/full-text/book/book-Z-H-7.html | 145 + .../files/sicp/full-text/book/book-Z-H-8.html | 157 + .../files/sicp/full-text/book/book-Z-H-9.html | 201 + .../files/sicp/full-text/book/book.html | 172 + .../files/sicp/full-text/book/ch1-Z-G-1.gif | Bin 0 -> 1646 bytes .../files/sicp/full-text/book/ch1-Z-G-10.gif | Bin 0 -> 1292 bytes .../files/sicp/full-text/book/ch1-Z-G-11.gif | Bin 0 -> 238 bytes .../files/sicp/full-text/book/ch1-Z-G-12.gif | Bin 0 -> 732 bytes .../files/sicp/full-text/book/ch1-Z-G-13.gif | Bin 0 -> 5358 bytes .../files/sicp/full-text/book/ch1-Z-G-14.gif | Bin 0 -> 278 bytes .../files/sicp/full-text/book/ch1-Z-G-15.gif | Bin 0 -> 133 bytes .../files/sicp/full-text/book/ch1-Z-G-16.gif | Bin 0 -> 173 bytes .../files/sicp/full-text/book/ch1-Z-G-17.gif | Bin 0 -> 330 bytes .../files/sicp/full-text/book/ch1-Z-G-18.gif | Bin 0 -> 284 bytes .../files/sicp/full-text/book/ch1-Z-G-19.gif | Bin 0 -> 275 bytes .../files/sicp/full-text/book/ch1-Z-G-2.gif | Bin 0 -> 418 bytes .../files/sicp/full-text/book/ch1-Z-G-20.gif | Bin 0 -> 209 bytes .../files/sicp/full-text/book/ch1-Z-G-21.gif | Bin 0 -> 313 bytes .../files/sicp/full-text/book/ch1-Z-G-22.gif | Bin 0 -> 312 bytes .../files/sicp/full-text/book/ch1-Z-G-23.png | Bin 0 -> 11261 bytes .../files/sicp/full-text/book/ch1-Z-G-24.gif | Bin 0 -> 263 bytes .../files/sicp/full-text/book/ch1-Z-G-25.gif | Bin 0 -> 813 bytes .../files/sicp/full-text/book/ch1-Z-G-26.gif | Bin 0 -> 289 bytes .../files/sicp/full-text/book/ch1-Z-G-27.gif | Bin 0 -> 365 bytes .../files/sicp/full-text/book/ch1-Z-G-28.gif | Bin 0 -> 833 bytes .../files/sicp/full-text/book/ch1-Z-G-29.gif | Bin 0 -> 561 bytes .../files/sicp/full-text/book/ch1-Z-G-3.gif | Bin 0 -> 454 bytes .../files/sicp/full-text/book/ch1-Z-G-30.gif | Bin 0 -> 335 bytes .../files/sicp/full-text/book/ch1-Z-G-31.gif | Bin 0 -> 454 bytes .../files/sicp/full-text/book/ch1-Z-G-32.gif | Bin 0 -> 430 bytes .../files/sicp/full-text/book/ch1-Z-G-33.gif | Bin 0 -> 323 bytes .../files/sicp/full-text/book/ch1-Z-G-34.gif | Bin 0 -> 436 bytes .../files/sicp/full-text/book/ch1-Z-G-35.gif | Bin 0 -> 338 bytes .../files/sicp/full-text/book/ch1-Z-G-36.gif | Bin 0 -> 330 bytes .../files/sicp/full-text/book/ch1-Z-G-37.gif | Bin 0 -> 292 bytes .../files/sicp/full-text/book/ch1-Z-G-38.gif | Bin 0 -> 355 bytes .../files/sicp/full-text/book/ch1-Z-G-4.gif | Bin 0 -> 360 bytes .../files/sicp/full-text/book/ch1-Z-G-5.gif | Bin 0 -> 185 bytes .../files/sicp/full-text/book/ch1-Z-G-6.gif | Bin 0 -> 1229 bytes .../files/sicp/full-text/book/ch1-Z-G-7.gif | Bin 0 -> 2420 bytes .../files/sicp/full-text/book/ch1-Z-G-8.gif | Bin 0 -> 287 bytes .../files/sicp/full-text/book/ch1-Z-G-9.gif | Bin 0 -> 396 bytes .../files/sicp/full-text/book/ch2-Z-G-1.gif | Bin 0 -> 349 bytes .../files/sicp/full-text/book/ch2-Z-G-10.gif | Bin 0 -> 217 bytes .../files/sicp/full-text/book/ch2-Z-G-11.gif | Bin 0 -> 449 bytes .../files/sicp/full-text/book/ch2-Z-G-12.gif | Bin 0 -> 2191 bytes .../files/sicp/full-text/book/ch2-Z-G-13.gif | Bin 0 -> 1050 bytes .../files/sicp/full-text/book/ch2-Z-G-14.gif | Bin 0 -> 344 bytes .../files/sicp/full-text/book/ch2-Z-G-15.gif | Bin 0 -> 1726 bytes .../files/sicp/full-text/book/ch2-Z-G-16.gif | Bin 0 -> 679 bytes .../files/sicp/full-text/book/ch2-Z-G-17.gif | Bin 0 -> 1941 bytes .../files/sicp/full-text/book/ch2-Z-G-18.gif | Bin 0 -> 258 bytes .../files/sicp/full-text/book/ch2-Z-G-19.gif | Bin 0 -> 304 bytes .../files/sicp/full-text/book/ch2-Z-G-2.gif | Bin 0 -> 333 bytes .../files/sicp/full-text/book/ch2-Z-G-20.gif | Bin 0 -> 328 bytes .../files/sicp/full-text/book/ch2-Z-G-21.gif | Bin 0 -> 1952 bytes .../files/sicp/full-text/book/ch2-Z-G-22.gif | Bin 0 -> 537 bytes .../files/sicp/full-text/book/ch2-Z-G-23.gif | Bin 0 -> 3277 bytes .../files/sicp/full-text/book/ch2-Z-G-24.gif | Bin 0 -> 3327 bytes .../files/sicp/full-text/book/ch2-Z-G-25.gif | Bin 0 -> 46223 bytes .../files/sicp/full-text/book/ch2-Z-G-26.gif | Bin 0 -> 792 bytes .../files/sicp/full-text/book/ch2-Z-G-27.gif | Bin 0 -> 659 bytes .../files/sicp/full-text/book/ch2-Z-G-28.gif | Bin 0 -> 627 bytes .../files/sicp/full-text/book/ch2-Z-G-29.gif | Bin 0 -> 488 bytes .../files/sicp/full-text/book/ch2-Z-G-3.gif | Bin 0 -> 258 bytes .../files/sicp/full-text/book/ch2-Z-G-30.gif | Bin 0 -> 36899 bytes .../files/sicp/full-text/book/ch2-Z-G-31.gif | Bin 0 -> 13186 bytes .../files/sicp/full-text/book/ch2-Z-G-32.gif | Bin 0 -> 19691 bytes .../files/sicp/full-text/book/ch2-Z-G-33.gif | Bin 0 -> 19071 bytes .../files/sicp/full-text/book/ch2-Z-G-34.gif | Bin 0 -> 967 bytes .../files/sicp/full-text/book/ch2-Z-G-35.gif | Bin 0 -> 1003 bytes .../files/sicp/full-text/book/ch2-Z-G-36.gif | Bin 0 -> 988 bytes .../files/sicp/full-text/book/ch2-Z-G-37.gif | Bin 0 -> 1335 bytes .../files/sicp/full-text/book/ch2-Z-G-38.gif | Bin 0 -> 1745 bytes .../files/sicp/full-text/book/ch2-Z-G-39.gif | Bin 0 -> 43914 bytes .../files/sicp/full-text/book/ch2-Z-G-4.gif | Bin 0 -> 273 bytes .../files/sicp/full-text/book/ch2-Z-G-40.gif | Bin 0 -> 2372 bytes .../files/sicp/full-text/book/ch2-Z-G-41.gif | Bin 0 -> 44981 bytes .../files/sicp/full-text/book/ch2-Z-G-42.gif | Bin 0 -> 1506 bytes .../files/sicp/full-text/book/ch2-Z-G-43.gif | Bin 0 -> 511 bytes .../files/sicp/full-text/book/ch2-Z-G-44.gif | Bin 0 -> 835 bytes .../files/sicp/full-text/book/ch2-Z-G-45.gif | Bin 0 -> 529 bytes .../files/sicp/full-text/book/ch2-Z-G-46.gif | Bin 0 -> 133 bytes .../files/sicp/full-text/book/ch2-Z-G-47.gif | Bin 0 -> 314 bytes .../files/sicp/full-text/book/ch2-Z-G-48.gif | Bin 0 -> 434 bytes .../files/sicp/full-text/book/ch2-Z-G-49.gif | Bin 0 -> 265 bytes .../files/sicp/full-text/book/ch2-Z-G-5.gif | Bin 0 -> 414 bytes .../files/sicp/full-text/book/ch2-Z-G-50.gif | Bin 0 -> 324 bytes .../files/sicp/full-text/book/ch2-Z-G-51.gif | Bin 0 -> 1491 bytes .../files/sicp/full-text/book/ch2-Z-G-52.gif | Bin 0 -> 587 bytes .../files/sicp/full-text/book/ch2-Z-G-53.gif | Bin 0 -> 2267 bytes .../files/sicp/full-text/book/ch2-Z-G-54.gif | Bin 0 -> 1905 bytes .../files/sicp/full-text/book/ch2-Z-G-55.gif | Bin 0 -> 474 bytes .../files/sicp/full-text/book/ch2-Z-G-56.gif | Bin 0 -> 591 bytes .../files/sicp/full-text/book/ch2-Z-G-57.gif | Bin 0 -> 517 bytes .../files/sicp/full-text/book/ch2-Z-G-58.gif | Bin 0 -> 393 bytes .../files/sicp/full-text/book/ch2-Z-G-59.gif | Bin 0 -> 1213 bytes .../files/sicp/full-text/book/ch2-Z-G-6.gif | Bin 0 -> 2174 bytes .../files/sicp/full-text/book/ch2-Z-G-60.gif | Bin 0 -> 260 bytes .../files/sicp/full-text/book/ch2-Z-G-61.gif | Bin 0 -> 285 bytes .../files/sicp/full-text/book/ch2-Z-G-62.gif | Bin 0 -> 2265 bytes .../files/sicp/full-text/book/ch2-Z-G-63.gif | Bin 0 -> 2000 bytes .../files/sicp/full-text/book/ch2-Z-G-64.gif | Bin 0 -> 2882 bytes .../files/sicp/full-text/book/ch2-Z-G-65.gif | Bin 0 -> 1025 bytes .../files/sicp/full-text/book/ch2-Z-G-66.gif | Bin 0 -> 448 bytes .../files/sicp/full-text/book/ch2-Z-G-67.gif | Bin 0 -> 3204 bytes .../files/sicp/full-text/book/ch2-Z-G-68.gif | Bin 0 -> 389 bytes .../files/sicp/full-text/book/ch2-Z-G-69.gif | Bin 0 -> 143 bytes .../files/sicp/full-text/book/ch2-Z-G-7.gif | Bin 0 -> 294 bytes .../files/sicp/full-text/book/ch2-Z-G-70.gif | Bin 0 -> 249 bytes .../files/sicp/full-text/book/ch2-Z-G-71.gif | Bin 0 -> 519 bytes .../files/sicp/full-text/book/ch2-Z-G-72.gif | Bin 0 -> 528 bytes .../files/sicp/full-text/book/ch2-Z-G-73.gif | Bin 0 -> 349 bytes .../files/sicp/full-text/book/ch2-Z-G-74.gif | Bin 0 -> 238 bytes .../files/sicp/full-text/book/ch2-Z-G-75.gif | Bin 0 -> 189 bytes .../files/sicp/full-text/book/ch2-Z-G-76.gif | Bin 0 -> 351 bytes .../files/sicp/full-text/book/ch2-Z-G-77.gif | Bin 0 -> 132 bytes .../files/sicp/full-text/book/ch2-Z-G-78.gif | Bin 0 -> 452 bytes .../files/sicp/full-text/book/ch2-Z-G-79.gif | Bin 0 -> 164 bytes .../files/sicp/full-text/book/ch2-Z-G-8.gif | Bin 0 -> 266 bytes .../files/sicp/full-text/book/ch2-Z-G-80.gif | Bin 0 -> 153 bytes .../files/sicp/full-text/book/ch2-Z-G-81.gif | Bin 0 -> 143 bytes .../files/sicp/full-text/book/ch2-Z-G-9.gif | Bin 0 -> 190 bytes .../files/sicp/full-text/book/ch3-Z-G-1.gif | Bin 0 -> 250 bytes .../files/sicp/full-text/book/ch3-Z-G-10.gif | Bin 0 -> 1520 bytes .../files/sicp/full-text/book/ch3-Z-G-11.gif | Bin 0 -> 2108 bytes .../files/sicp/full-text/book/ch3-Z-G-12.gif | Bin 0 -> 3355 bytes .../files/sicp/full-text/book/ch3-Z-G-13.gif | Bin 0 -> 1800 bytes .../files/sicp/full-text/book/ch3-Z-G-14.gif | Bin 0 -> 1879 bytes .../files/sicp/full-text/book/ch3-Z-G-15.gif | Bin 0 -> 2033 bytes .../files/sicp/full-text/book/ch3-Z-G-16.gif | Bin 0 -> 1930 bytes .../files/sicp/full-text/book/ch3-Z-G-17.gif | Bin 0 -> 807 bytes .../files/sicp/full-text/book/ch3-Z-G-18.gif | Bin 0 -> 1114 bytes .../files/sicp/full-text/book/ch3-Z-G-19.gif | Bin 0 -> 1257 bytes .../files/sicp/full-text/book/ch3-Z-G-2.gif | Bin 0 -> 976 bytes .../files/sicp/full-text/book/ch3-Z-G-20.gif | Bin 0 -> 1505 bytes .../files/sicp/full-text/book/ch3-Z-G-21.gif | Bin 0 -> 1510 bytes .../files/sicp/full-text/book/ch3-Z-G-22.gif | Bin 0 -> 1926 bytes .../files/sicp/full-text/book/ch3-Z-G-23.gif | Bin 0 -> 3988 bytes .../files/sicp/full-text/book/ch3-Z-G-24.gif | Bin 0 -> 516 bytes .../files/sicp/full-text/book/ch3-Z-G-25.gif | Bin 0 -> 873 bytes .../files/sicp/full-text/book/ch3-Z-G-26.gif | Bin 0 -> 998 bytes .../files/sicp/full-text/book/ch3-Z-G-27.gif | Bin 0 -> 2275 bytes .../files/sicp/full-text/book/ch3-Z-G-28.gif | Bin 0 -> 134 bytes .../files/sicp/full-text/book/ch3-Z-G-29.gif | Bin 0 -> 182 bytes .../files/sicp/full-text/book/ch3-Z-G-3.gif | Bin 0 -> 1244 bytes .../files/sicp/full-text/book/ch3-Z-G-30.gif | Bin 0 -> 1273 bytes .../files/sicp/full-text/book/ch3-Z-G-31.gif | Bin 0 -> 3018 bytes .../files/sicp/full-text/book/ch3-Z-G-32.gif | Bin 0 -> 3813 bytes .../files/sicp/full-text/book/ch3-Z-G-33.gif | Bin 0 -> 2169 bytes .../files/sicp/full-text/book/ch3-Z-G-34.gif | Bin 0 -> 636 bytes .../files/sicp/full-text/book/ch3-Z-G-35.gif | Bin 0 -> 1695 bytes .../files/sicp/full-text/book/ch3-Z-G-36.gif | Bin 0 -> 395 bytes .../files/sicp/full-text/book/ch3-Z-G-37.gif | Bin 0 -> 308 bytes .../files/sicp/full-text/book/ch3-Z-G-38.gif | Bin 0 -> 355 bytes .../files/sicp/full-text/book/ch3-Z-G-39.gif | Bin 0 -> 420 bytes .../files/sicp/full-text/book/ch3-Z-G-4.gif | Bin 0 -> 1483 bytes .../files/sicp/full-text/book/ch3-Z-G-40.gif | Bin 0 -> 528 bytes .../files/sicp/full-text/book/ch3-Z-G-41.gif | Bin 0 -> 257 bytes .../files/sicp/full-text/book/ch3-Z-G-42.gif | Bin 0 -> 392 bytes .../files/sicp/full-text/book/ch3-Z-G-43.gif | Bin 0 -> 444 bytes .../files/sicp/full-text/book/ch3-Z-G-44.gif | Bin 0 -> 271 bytes .../files/sicp/full-text/book/ch3-Z-G-45.gif | Bin 0 -> 838 bytes .../files/sicp/full-text/book/ch3-Z-G-46.gif | Bin 0 -> 647 bytes .../files/sicp/full-text/book/ch3-Z-G-47.gif | Bin 0 -> 762 bytes .../files/sicp/full-text/book/ch3-Z-G-48.gif | Bin 0 -> 242 bytes .../files/sicp/full-text/book/ch3-Z-G-49.gif | Bin 0 -> 1275 bytes .../files/sicp/full-text/book/ch3-Z-G-5.gif | Bin 0 -> 2493 bytes .../files/sicp/full-text/book/ch3-Z-G-50.gif | Bin 0 -> 358 bytes .../files/sicp/full-text/book/ch3-Z-G-51.gif | Bin 0 -> 1425 bytes .../files/sicp/full-text/book/ch3-Z-G-52.gif | Bin 0 -> 794 bytes .../files/sicp/full-text/book/ch3-Z-G-53.gif | Bin 0 -> 1925 bytes .../files/sicp/full-text/book/ch3-Z-G-54.gif | Bin 0 -> 287 bytes .../files/sicp/full-text/book/ch3-Z-G-55.gif | Bin 0 -> 400 bytes .../files/sicp/full-text/book/ch3-Z-G-56.gif | Bin 0 -> 239 bytes .../files/sicp/full-text/book/ch3-Z-G-57.gif | Bin 0 -> 412 bytes .../files/sicp/full-text/book/ch3-Z-G-58.gif | Bin 0 -> 796 bytes .../files/sicp/full-text/book/ch3-Z-G-59.gif | Bin 0 -> 2097 bytes .../files/sicp/full-text/book/ch3-Z-G-6.gif | Bin 0 -> 1981 bytes .../files/sicp/full-text/book/ch3-Z-G-60.gif | Bin 0 -> 898 bytes .../files/sicp/full-text/book/ch3-Z-G-7.gif | Bin 0 -> 1930 bytes .../files/sicp/full-text/book/ch3-Z-G-8.gif | Bin 0 -> 2489 bytes .../files/sicp/full-text/book/ch3-Z-G-9.gif | Bin 0 -> 2519 bytes .../files/sicp/full-text/book/ch4-Z-G-1.gif | Bin 0 -> 1742 bytes .../files/sicp/full-text/book/ch4-Z-G-10.gif | Bin 0 -> 184 bytes .../files/sicp/full-text/book/ch4-Z-G-2.gif | Bin 0 -> 1815 bytes .../files/sicp/full-text/book/ch4-Z-G-3.gif | Bin 0 -> 1344 bytes .../files/sicp/full-text/book/ch4-Z-G-4.gif | Bin 0 -> 1491 bytes .../files/sicp/full-text/book/ch4-Z-G-5.gif | Bin 0 -> 1338 bytes .../files/sicp/full-text/book/ch4-Z-G-6.gif | Bin 0 -> 2050 bytes .../files/sicp/full-text/book/ch4-Z-G-7.gif | Bin 0 -> 440 bytes .../files/sicp/full-text/book/ch4-Z-G-8.gif | Bin 0 -> 258 bytes .../files/sicp/full-text/book/ch4-Z-G-9.gif | Bin 0 -> 392 bytes .../files/sicp/full-text/book/ch5-Z-G-1.gif | Bin 0 -> 1454 bytes .../files/sicp/full-text/book/ch5-Z-G-2.gif | Bin 0 -> 1186 bytes .../files/sicp/full-text/book/ch5-Z-G-3.gif | Bin 0 -> 2146 bytes .../files/sicp/full-text/book/ch5-Z-G-4.gif | Bin 0 -> 3527 bytes .../files/sicp/full-text/book/ch5-Z-G-5.gif | Bin 0 -> 2741 bytes .../files/sicp/full-text/book/ch5-Z-G-6.gif | Bin 0 -> 3210 bytes .../files/sicp/full-text/book/ch5-Z-G-7.gif | Bin 0 -> 2618 bytes .../files/sicp/full-text/book/ch5-Z-G-8.gif | Bin 0 -> 3494 bytes .../files/sicp/full-text/book/ch5-Z-G-9.gif | Bin 0 -> 2141 bytes .../files/sicp/full-text/book/chip.jpg | Bin 0 -> 148450 bytes .../files/sicp/full-text/book/cover.jpg | Bin 0 -> 51902 bytes .../programming/css/images/BulletSquare.png | Bin 0 -> 104 bytes .../programming/css/programming_notes.css | 446 + .../home/ehchua/programming/favicon.ico | Bin 0 -> 318 bytes .../home/ehchua/programming/scripts/footer.js | 4 + .../home/ehchua/programming/scripts/header.js | 4 + .../webprogramming/HTTP_Basics.html | 1305 +++ .../images/HTML_FileUploadForm.png | Bin 0 -> 5833 bytes .../webprogramming/images/HTML_LoginForm.png | Bin 0 -> 3896 bytes .../webprogramming/images/HTML_SampleForm.png | Bin 0 -> 13083 bytes .../webprogramming/images/HTTP.png | Bin 0 -> 36506 bytes .../images/HTTP_MessageFormat.png | Bin 0 -> 11766 bytes .../webprogramming/images/HTTP_OverTCPIP.png | Bin 0 -> 23859 bytes .../images/HTTP_RequestMessage.png | Bin 0 -> 15255 bytes .../images/HTTP_RequestMessageExample.png | Bin 0 -> 22586 bytes .../images/HTTP_ResponseMessage.png | Bin 0 -> 15461 bytes .../images/HTTP_ResponseMessageExample.png | Bin 0 -> 25653 bytes .../webprogramming/images/HTTP_Steps.png | Bin 0 -> 40414 bytes .../webprogramming/images/TheWeb.png | Bin 0 -> 65002 bytes 635 files changed, 128436 insertions(+) create mode 100644 clones/abseil.io/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js create mode 100644 clones/abseil.io/resources/swe-book/html/ch01.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch02.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch03.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch04.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch05.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch06.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch07.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch08.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch09.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch10.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch11.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch12.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch13.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch14.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch15.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch16.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch17.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch18.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch19.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch20.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch21.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch22.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch23.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch24.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch25.html create mode 100644 clones/abseil.io/resources/swe-book/html/ch26.html create mode 100644 clones/abseil.io/resources/swe-book/html/foreword.html create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_0101.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_0102.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_0601.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_0602.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1101.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1103.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1104.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1105.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1401.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1402.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1403.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1404.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1405.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1406.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1601.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1701.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1702.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1703.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1704.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1801.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1802.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1803.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1804.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1805.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1901.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1902.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1903.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1904.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1905.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1906.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1907.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_1908.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2001.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2002.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2101.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2301.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2302.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2303.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2304.png create mode 100644 clones/abseil.io/resources/swe-book/html/images/seag_2305.png create mode 100644 clones/abseil.io/resources/swe-book/html/ix.html create mode 100644 clones/abseil.io/resources/swe-book/html/part1.html create mode 100644 clones/abseil.io/resources/swe-book/html/part2.html create mode 100644 clones/abseil.io/resources/swe-book/html/part3.html create mode 100644 clones/abseil.io/resources/swe-book/html/part4.html create mode 100644 clones/abseil.io/resources/swe-book/html/part5.html create mode 100644 clones/abseil.io/resources/swe-book/html/pr01.html create mode 100644 clones/abseil.io/resources/swe-book/html/theme/html/html.css create mode 100644 clones/abseil.io/resources/swe-book/html/toc.html create mode 100644 clones/asdf.common-lisp.dev/asdf.html create mode 100644 clones/colinallen.dnsalias.org/lp/lp.html create mode 100644 clones/colinallen.dnsalias.org/lp/lp.pdf create mode 100644 clones/colinallen.dnsalias.org/lp/next_motif.gif create mode 100644 clones/colinallen.dnsalias.org/lp/next_motif_gr.gif create mode 100644 clones/colinallen.dnsalias.org/lp/node-rest.html create mode 100644 clones/colinallen.dnsalias.org/lp/node1.html create mode 100644 clones/colinallen.dnsalias.org/lp/node10.html create mode 100644 clones/colinallen.dnsalias.org/lp/node100.html create mode 100644 clones/colinallen.dnsalias.org/lp/node101.html create mode 100644 clones/colinallen.dnsalias.org/lp/node102.html create mode 100644 clones/colinallen.dnsalias.org/lp/node103.html create mode 100644 clones/colinallen.dnsalias.org/lp/node104.html create mode 100644 clones/colinallen.dnsalias.org/lp/node105.html create mode 100644 clones/colinallen.dnsalias.org/lp/node106.html create mode 100644 clones/colinallen.dnsalias.org/lp/node107.html create mode 100644 clones/colinallen.dnsalias.org/lp/node108.html create mode 100644 clones/colinallen.dnsalias.org/lp/node109.html create mode 100644 clones/colinallen.dnsalias.org/lp/node11.html create mode 100644 clones/colinallen.dnsalias.org/lp/node110.html create mode 100644 clones/colinallen.dnsalias.org/lp/node111.html create mode 100644 clones/colinallen.dnsalias.org/lp/node112.html create mode 100644 clones/colinallen.dnsalias.org/lp/node113.html create mode 100644 clones/colinallen.dnsalias.org/lp/node114.html create mode 100644 clones/colinallen.dnsalias.org/lp/node115.html create mode 100644 clones/colinallen.dnsalias.org/lp/node116.html create mode 100644 clones/colinallen.dnsalias.org/lp/node12.html create mode 100644 clones/colinallen.dnsalias.org/lp/node13.html create mode 100644 clones/colinallen.dnsalias.org/lp/node14.html create mode 100644 clones/colinallen.dnsalias.org/lp/node15.html create mode 100644 clones/colinallen.dnsalias.org/lp/node16.html create mode 100644 clones/colinallen.dnsalias.org/lp/node17.html create mode 100644 clones/colinallen.dnsalias.org/lp/node18.html create mode 100644 clones/colinallen.dnsalias.org/lp/node19.html create mode 100644 clones/colinallen.dnsalias.org/lp/node2.html create mode 100644 clones/colinallen.dnsalias.org/lp/node20.html create mode 100644 clones/colinallen.dnsalias.org/lp/node21.html create mode 100644 clones/colinallen.dnsalias.org/lp/node22.html create mode 100644 clones/colinallen.dnsalias.org/lp/node23.html create mode 100644 clones/colinallen.dnsalias.org/lp/node24.html create mode 100644 clones/colinallen.dnsalias.org/lp/node25.html create mode 100644 clones/colinallen.dnsalias.org/lp/node26.html create mode 100644 clones/colinallen.dnsalias.org/lp/node27.html create mode 100644 clones/colinallen.dnsalias.org/lp/node28.html create mode 100644 clones/colinallen.dnsalias.org/lp/node29.html create mode 100644 clones/colinallen.dnsalias.org/lp/node3.html create mode 100644 clones/colinallen.dnsalias.org/lp/node30.html create mode 100644 clones/colinallen.dnsalias.org/lp/node31.html create mode 100644 clones/colinallen.dnsalias.org/lp/node32.html create mode 100644 clones/colinallen.dnsalias.org/lp/node33.html create mode 100644 clones/colinallen.dnsalias.org/lp/node34.html create mode 100644 clones/colinallen.dnsalias.org/lp/node35.html create mode 100644 clones/colinallen.dnsalias.org/lp/node36.html create mode 100644 clones/colinallen.dnsalias.org/lp/node37.html create mode 100644 clones/colinallen.dnsalias.org/lp/node38.html create mode 100644 clones/colinallen.dnsalias.org/lp/node39.html create mode 100644 clones/colinallen.dnsalias.org/lp/node4.html create mode 100644 clones/colinallen.dnsalias.org/lp/node40.html create mode 100644 clones/colinallen.dnsalias.org/lp/node41.html create mode 100644 clones/colinallen.dnsalias.org/lp/node42.html create mode 100644 clones/colinallen.dnsalias.org/lp/node43.html create mode 100644 clones/colinallen.dnsalias.org/lp/node44.html create mode 100644 clones/colinallen.dnsalias.org/lp/node45.html create mode 100644 clones/colinallen.dnsalias.org/lp/node46.html create mode 100644 clones/colinallen.dnsalias.org/lp/node47.html create mode 100644 clones/colinallen.dnsalias.org/lp/node48.html create mode 100644 clones/colinallen.dnsalias.org/lp/node49.html create mode 100644 clones/colinallen.dnsalias.org/lp/node5.html create mode 100644 clones/colinallen.dnsalias.org/lp/node50.html create mode 100644 clones/colinallen.dnsalias.org/lp/node51.html create mode 100644 clones/colinallen.dnsalias.org/lp/node52.html create mode 100644 clones/colinallen.dnsalias.org/lp/node53.html create mode 100644 clones/colinallen.dnsalias.org/lp/node54.html create mode 100644 clones/colinallen.dnsalias.org/lp/node55.html create mode 100644 clones/colinallen.dnsalias.org/lp/node56.html create mode 100644 clones/colinallen.dnsalias.org/lp/node57.html create mode 100644 clones/colinallen.dnsalias.org/lp/node58.html create mode 100644 clones/colinallen.dnsalias.org/lp/node59.html create mode 100644 clones/colinallen.dnsalias.org/lp/node6.html create mode 100644 clones/colinallen.dnsalias.org/lp/node60.html create mode 100644 clones/colinallen.dnsalias.org/lp/node61.html create mode 100644 clones/colinallen.dnsalias.org/lp/node62.html create mode 100644 clones/colinallen.dnsalias.org/lp/node63.html create mode 100644 clones/colinallen.dnsalias.org/lp/node64.html create mode 100644 clones/colinallen.dnsalias.org/lp/node65.html create mode 100644 clones/colinallen.dnsalias.org/lp/node66.html create mode 100644 clones/colinallen.dnsalias.org/lp/node67.html create mode 100644 clones/colinallen.dnsalias.org/lp/node68.html create mode 100644 clones/colinallen.dnsalias.org/lp/node69.html create mode 100644 clones/colinallen.dnsalias.org/lp/node7.html create mode 100644 clones/colinallen.dnsalias.org/lp/node70.html create mode 100644 clones/colinallen.dnsalias.org/lp/node71.html create mode 100644 clones/colinallen.dnsalias.org/lp/node72.html create mode 100644 clones/colinallen.dnsalias.org/lp/node73.html create mode 100644 clones/colinallen.dnsalias.org/lp/node74.html create mode 100644 clones/colinallen.dnsalias.org/lp/node75.html create mode 100644 clones/colinallen.dnsalias.org/lp/node76.html create mode 100644 clones/colinallen.dnsalias.org/lp/node77.html create mode 100644 clones/colinallen.dnsalias.org/lp/node78.html create mode 100644 clones/colinallen.dnsalias.org/lp/node79.html create mode 100644 clones/colinallen.dnsalias.org/lp/node8.html create mode 100644 clones/colinallen.dnsalias.org/lp/node80.html create mode 100644 clones/colinallen.dnsalias.org/lp/node81.html create mode 100644 clones/colinallen.dnsalias.org/lp/node82.html create mode 100644 clones/colinallen.dnsalias.org/lp/node83.html create mode 100644 clones/colinallen.dnsalias.org/lp/node84.html create mode 100644 clones/colinallen.dnsalias.org/lp/node85.html create mode 100644 clones/colinallen.dnsalias.org/lp/node86.html create mode 100644 clones/colinallen.dnsalias.org/lp/node87.html create mode 100644 clones/colinallen.dnsalias.org/lp/node88.html create mode 100644 clones/colinallen.dnsalias.org/lp/node89.html create mode 100644 clones/colinallen.dnsalias.org/lp/node9.html create mode 100644 clones/colinallen.dnsalias.org/lp/node90.html create mode 100644 clones/colinallen.dnsalias.org/lp/node91.html create mode 100644 clones/colinallen.dnsalias.org/lp/node92.html create mode 100644 clones/colinallen.dnsalias.org/lp/node93.html create mode 100644 clones/colinallen.dnsalias.org/lp/node94.html create mode 100644 clones/colinallen.dnsalias.org/lp/node95.html create mode 100644 clones/colinallen.dnsalias.org/lp/node96.html create mode 100644 clones/colinallen.dnsalias.org/lp/node97.html create mode 100644 clones/colinallen.dnsalias.org/lp/node98.html create mode 100644 clones/colinallen.dnsalias.org/lp/node99.html create mode 100644 clones/colinallen.dnsalias.org/lp/previous_motif.gif create mode 100644 clones/colinallen.dnsalias.org/lp/previous_motif_gr.gif create mode 100644 clones/colinallen.dnsalias.org/lp/relinks.html create mode 100644 clones/colinallen.dnsalias.org/lp/up_motif.gif create mode 100644 clones/colinallen.dnsalias.org/lp/up_motif_gr.gif create mode 100644 clones/gigamonkeys.com/book/a-few-format-recipes.html create mode 100644 clones/gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html create mode 100644 clones/gigamonkeys.com/book/beyond-lists-other-uses-for-cons-cells.html create mode 100644 clones/gigamonkeys.com/book/blurbs.html create mode 100644 clones/gigamonkeys.com/book/collections.html create mode 100644 clones/gigamonkeys.com/book/conclusion-whats-next.html create mode 100644 clones/gigamonkeys.com/book/figures/account-hierarchy.png create mode 100644 clones/gigamonkeys.com/book/figures/after-append.png create mode 100644 clones/gigamonkeys.com/book/figures/alist-abc-123.png create mode 100644 clones/gigamonkeys.com/book/figures/copy-list-list-or-tree.png create mode 100644 clones/gigamonkeys.com/book/figures/copy-tree-list-or-tree.png create mode 100644 clones/gigamonkeys.com/book/figures/list-1-2-3.png create mode 100644 clones/gigamonkeys.com/book/figures/list-or-tree.png create mode 100644 clones/gigamonkeys.com/book/figures/mixed-list.png create mode 100644 clones/gigamonkeys.com/book/figures/one-cons-cell.png create mode 100644 clones/gigamonkeys.com/book/figures/plist-abc-123.png create mode 100644 clones/gigamonkeys.com/book/figures/restart-call-stack.png create mode 100644 clones/gigamonkeys.com/book/files-and-file-io.html create mode 100644 clones/gigamonkeys.com/book/functions.html create mode 100644 clones/gigamonkeys.com/book/index.html create mode 100644 clones/gigamonkeys.com/book/introduction-why-lisp.html create mode 100644 clones/gigamonkeys.com/book/jolt_logo16_sm.gif create mode 100644 clones/gigamonkeys.com/book/lather-rinse-repeat-a-tour-of-the-repl.html create mode 100644 clones/gigamonkeys.com/book/letter-to-reader.html create mode 100644 clones/gigamonkeys.com/book/loop-for-black-belts.html create mode 100644 clones/gigamonkeys.com/book/macros-defining-your-own.html create mode 100644 clones/gigamonkeys.com/book/macros-standard-control-constructs.html create mode 100644 clones/gigamonkeys.com/book/numbers-characters-and-strings.html create mode 100644 clones/gigamonkeys.com/book/object-reorientation-classes.html create mode 100644 clones/gigamonkeys.com/book/object-reorientation-generic-functions.html create mode 100644 clones/gigamonkeys.com/book/practical-a-portable-pathname-library.html create mode 100644 clones/gigamonkeys.com/book/practical-a-shoutcast-server.html create mode 100644 clones/gigamonkeys.com/book/practical-a-simple-database.html create mode 100644 clones/gigamonkeys.com/book/practical-a-spam-filter.html create mode 100644 clones/gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html create mode 100644 clones/gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html create mode 100644 clones/gigamonkeys.com/book/practical-an-id3-parser.html create mode 100644 clones/gigamonkeys.com/book/practical-an-mp3-browser.html create mode 100644 clones/gigamonkeys.com/book/practical-an-mp3-database.html create mode 100644 clones/gigamonkeys.com/book/practical-building-a-unit-test-framework.html create mode 100644 clones/gigamonkeys.com/book/practical-parsing-binary-files.html create mode 100644 clones/gigamonkeys.com/book/practical-web-programming-with-allegroserve.html create mode 100644 clones/gigamonkeys.com/book/practicals-1.0.3.tar.gz create mode 100644 clones/gigamonkeys.com/book/practicals-1.0.3.zip create mode 100644 clones/gigamonkeys.com/book/programming-in-the-large-packages-and-symbols.html create mode 100644 clones/gigamonkeys.com/book/screenshots/hello-world.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/new-sample.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/random-number.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/set-cookie.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/show-cookies-no-cookies.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/show-cookies-one-cookie.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/show-query-params-1a.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/show-query-params-2.jpg create mode 100644 clones/gigamonkeys.com/book/screenshots/simple-form.jpg create mode 100644 clones/gigamonkeys.com/book/small-cover.gif create mode 100644 clones/gigamonkeys.com/book/style.css create mode 100644 clones/gigamonkeys.com/book/syntax-and-semantics.html create mode 100644 clones/gigamonkeys.com/book/the-special-operators.html create mode 100644 clones/gigamonkeys.com/book/they-called-it-lisp-for-a-reason-list-processing.html create mode 100644 clones/gigamonkeys.com/book/variables.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/AppendixA.jpg create mode 100644 clones/lispcookbook.github.io/cl-cookbook/AppendixB.jpg create mode 100644 clones/lispcookbook.github.io/cl-cookbook/AppendixC.jpg create mode 100644 clones/lispcookbook.github.io/cl-cookbook/arrays.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/atom-slime.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/cl-flamegraph.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/cl-logo-blue.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/cl-repl.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/clack-errors.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/commonlisp-vscode-alive.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/commonlisp-vscode.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/coverage.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/editor-sublime.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/emacs-company-elisp.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/emacs-helpful.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/emacs-teaser.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/emacs-which-key-minibuffer.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/geany.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/github.css create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/gui/gtk3-hello-buttons.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/gui/ltk-on-macos.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/gui/nuklear-test.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/gui/nuklear.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/gui/qtools-intro.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/highlight-lisp.js create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/img-ci-build.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/iup-demo.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/jquery-3.2.1.min.js create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/jquery.toc/jquery.toc.min.js create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/jupyterpreview.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/lem-terminal.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/lispworks/class-browser.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/lispworks/function-call-browser.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/lispworks/process-browser.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/lispworks/stepper.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/lispworks/toolbar-debugger.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/lispworks/two-sided-view.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/log4cl.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/portacle.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/slimv.jpg create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/sockets-lisp-chat.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/style.css create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/toggle-toc.js create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/attach-repl.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/compile.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/debug-abort.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/debug-fix.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/disassemble.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/docker-connect.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/eval.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/in-line-eval.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/macro-expand.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/vscode-gifs/skeleton.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/weblocks-quickstart-check-task.gif create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/youtube-little-bits-lisp.jpg create mode 100644 clones/lispcookbook.github.io/cl-cookbook/assets/zenity-prompt.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/clos.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/dandelion.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/data-structures.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/databases.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/dates_and_times.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/debugging.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/drafts/defmodel.lisp.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/editor-support.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/emacs-ide.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/error_handling.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/ffi.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/files.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/functions.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/getting-started.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/gui.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/index.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/io.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/iteration.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/license.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/lispworks.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/macros.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/misc.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/numbers.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/orly-cover.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/os.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/packages.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/pattern_matching.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/performance.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/process.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/regexp.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/scripting.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/simple-restarts.png create mode 100644 clones/lispcookbook.github.io/cl-cookbook/sockets.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/strings.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/systems.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/testing.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/type.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/vscode-alive.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/web-scraping.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/web.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/websockets.html create mode 100644 clones/lispcookbook.github.io/cl-cookbook/win32.html create mode 100644 clones/sicp/mitpress.mit.edu/robots.txt create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-C.css create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-11.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-12.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-13.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-14.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-15.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-16.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-17.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-18.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-19.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-20.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-3.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-4.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-6.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-9.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-1.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-10.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-11.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-13.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-14.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-15.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-16.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-17.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-18.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-19.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-2.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-20.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-21.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-22.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-23.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-25.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-26.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-27.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-28.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-29.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-3.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-30.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-31.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-32.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-33.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-34.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-35.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-36.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-37.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-38.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-4.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-5.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-6.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-7.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-8.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-9.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-1.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-10.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-11.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-12.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-13.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-14.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-15.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-16.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-17.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-18.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-19.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-2.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-20.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-21.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-22.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-23.png create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-24.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-25.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-26.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-27.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-28.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-29.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-3.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-30.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-31.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-32.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-33.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-34.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-35.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-36.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-37.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-38.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-4.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-5.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-6.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-7.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-8.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-9.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-1.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-10.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-11.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-12.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-13.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-14.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-15.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-16.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-17.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-18.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-19.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-2.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-20.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-21.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-22.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-23.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-24.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-25.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-26.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-27.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-28.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-29.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-3.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-30.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-31.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-32.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-33.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-34.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-35.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-36.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-37.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-38.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-39.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-4.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-40.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-41.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-42.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-43.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-44.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-45.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-46.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-47.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-48.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-49.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-5.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-50.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-51.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-52.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-53.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-54.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-55.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-56.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-57.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-58.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-59.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-6.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-60.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-61.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-62.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-63.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-64.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-65.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-66.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-67.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-68.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-69.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-7.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-70.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-71.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-72.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-73.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-74.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-75.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-76.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-77.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-78.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-79.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-8.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-80.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-81.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-9.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-1.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-10.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-11.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-12.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-13.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-14.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-15.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-16.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-17.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-18.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-19.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-2.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-20.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-21.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-22.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-23.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-24.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-25.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-26.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-27.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-28.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-29.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-3.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-30.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-31.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-32.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-33.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-34.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-35.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-36.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-37.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-38.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-39.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-4.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-40.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-41.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-42.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-43.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-44.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-45.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-46.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-47.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-48.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-49.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-5.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-50.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-51.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-52.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-53.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-54.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-55.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-56.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-57.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-58.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-59.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-6.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-60.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-7.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-8.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch3-Z-G-9.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-1.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-10.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-2.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-3.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-4.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-5.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-6.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-7.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-8.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch4-Z-G-9.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-1.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-2.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-3.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-4.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-5.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-6.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-7.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-8.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch5-Z-G-9.gif create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/chip.jpg create mode 100644 clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/cover.jpg create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/css/images/BulletSquare.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/css/programming_notes.css create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/favicon.ico create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/scripts/footer.js create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/scripts/header.js create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTML_FileUploadForm.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTML_LoginForm.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTML_SampleForm.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_MessageFormat.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_OverTCPIP.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_RequestMessage.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_RequestMessageExample.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_ResponseMessage.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_ResponseMessageExample.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP_Steps.png create mode 100644 clones/www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/TheWeb.png diff --git a/clones/abseil.io/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js b/clones/abseil.io/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js new file mode 100644 index 00000000..725b7c67 --- /dev/null +++ b/clones/abseil.io/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js @@ -0,0 +1 @@ +!function(){"use strict";function e(e){try{if("undefined"==typeof console)return;"error"in console?console.error(e):console.log(e)}catch(e){}}function t(e){return d.innerHTML='',d.childNodes[0].getAttribute("href")||""}function r(e,t){var r=e.substr(t,2);return parseInt(r,16)}function n(n,c){for(var o="",a=r(n,c),i=c+2;i-1&&(o.href="mailto:"+n(o.href,a+l.length))}catch(i){e(i)}}function o(t){for(var r=t.querySelectorAll(u),c=0;c + + + + Software Engineering at Google + + + + +
+

What Is Software Engineering?

+ + + + + +
+

Nothing is built on stone; all is built on sand, but we must build as if the sand were stone.

+ +

Jorge Luis Borges

+
+ +

We see three critical differences between programming and software engineering: time, scale, and the trade-offs at play.   On a software engineering project, engineers need to be more concerned with the passage of time and the eventual need for change. In a software engineering organization, we need to be more concerned about scale and efficiency, both for the software we produce as well as for the organization that is producing it. Finally, as software engineers, we are asked to make more complex decisions with higher-stakes outcomes, often based on imprecise estimates of time and growth.

+ +

Within Google, we sometimes say, “Software engineering is programming integrated over time.†Programming  is certainly a significant part of software engineering: after all, programming is how you generate new software in the first place. If you accept this distinction, it also becomes clear that we might need to delineate between programming tasks (development) and software engineering tasks (development, modification, maintenance). The addition of time adds an important new dimension to programming. Cubes aren’t squares, distance isn’t velocity. Software engineering isn’t programming.

+ +

One way to see the impact of time on a program is to think about the question, “What is the expected life span1 of your code?†Reasonable answers to this question vary by roughly a factor of 100,000. It is just as reasonable to think of code that needs to last for a few minutes as it is to imagine code that will live for decades. Generally, code on the short end of that spectrum is unaffected by time. It is unlikely that you need to adapt to a new version of your underlying libraries, operating system (OS), hardware, or language version for a program whose utility spans only an hour. These short-lived systems are effectively “just†a programming problem, in the same way that a cube compressed far enough in one dimension is a square. As we expand that time to allow for longer life spans, change becomes more important. Over a span of a decade or more, most program dependencies, whether implicit or explicit, will likely change. This recognition is at the root of our distinction between software engineering and programming.

+ +

This distinction is at the core of what we call sustainability for software.  Your project is sustainable if, for the expected life span of your software, you are capable of reacting to whatever valuable change comes along, for either technical or business reasons.  Importantly, we are looking only for capability—you might choose not to perform a given upgrade, either for lack of value or other priorities.2 When you are fundamentally incapable of reacting to a change in underlying technology or product direction, you’re placing a high-risk bet on the hope that such a change never becomes critical. For short-term projects, that might be a safe bet. Over multiple decades, it probably isn’t.3

+ +

Another way to look at software engineering is to consider scale.  How many people are involved? What part do they play in the development and maintenance over time? A programming task is often an act of individual creation, but a software engineering task is a team effort. An early attempt to define software engineering produced a good definition for this viewpoint: “The multiperson development of multiversion programs.â€4 This suggests the difference between software engineering and programming is one of both time and people. Team collaboration presents new problems, but also provides more potential to produce valuable systems than any single programmer could.

+ +

Team organization, project composition, and the policies and practices of a software project all dominate this aspect of software engineering complexity. These problems are inherent to scale: as the organization grows and its projects expand, does it become more efficient at producing software? Does our development workflow become more efficient as we grow, or do our version control policies and testing strategies cost us proportionally more? Scale issues around communication and human scaling have been discussed since the early days of software engineering, going all the way back to the Mythical Man Month.5 Such scale issues are often matters of policy and are fundamental to the question of software sustainability: how much will it cost to do the things that we need to do repeatedly? 

+ +

We can also say that software engineering is different from programming in terms of the complexity of decisions that need to be made and their stakes. In software engineering, we are regularly forced to evaluate the trade-offs between several paths forward, sometimes with high stakes and often with imperfect value metrics. The job of a software engineer, or a software engineering leader, is to aim for sustainability and management of the scaling costs for the organization, the product, and the development workflow. With those inputs in mind, evaluate your trade-offs and make rational decisions. We might sometimes defer maintenance changes, or even embrace policies that don’t scale well, with the knowledge that we’ll need to revisit those decisions. Those choices should be explicit and clear about the deferred costs.

+ +

Rarely is there a one-size-fits-all solution in software engineering, and the same applies to this book. Given a factor of 100,000 for reasonable answers on “How long will this software live,†a range of perhaps a factor of 10,000 for “How many engineers are in your organization,†and who-knows-how-much for “How many compute resources are available for your project,†Google’s experience will probably not match yours. In this book, we aim to present what we’ve found that works for us in the construction and maintenance of software that we expect to last for decades, with tens of thousands of engineers, and world-spanning compute resources. Most of the practices that we find are necessary at that scale will also work well for smaller endeavors: consider this a report on one engineering ecosystem that we think could be good as you scale up. In a few places, super-large scale comes with its own costs, and we’d be happier to not be paying extra overhead. We call those out as a warning. Hopefully if your organization grows large enough to be worried about those costs, you can find a better answer.

+ +

Before we get to specifics about teamwork, culture, policies, and tools, let’s first elaborate on these primary themes of time, scale, and trade-offs.

+ +
+

Time and Change

+ +

When a novice is learning to program, the life span of the resulting code is usually measured in hours or days.   Programming assignments and exercises tend to be write-once, with little to no refactoring and certainly no long-term maintenance. These programs are often not rebuilt or executed ever again after their initial production. This isn’t surprising in a pedagogical setting. Perhaps in secondary or post-secondary education, we may find a team project course or hands-on thesis. If so, such projects are likely the only time student code will live longer than a month or so. Those developers might need to refactor some code, perhaps as a response to changing requirements, but it is unlikely they are being asked to deal with broader changes to their environment.

+ +

We also find developers of short-lived code in common industry settings. Mobile apps often have a fairly short life span,6 and for better or worse, full rewrites are relatively common. Engineers at an early-stage startup might rightly choose to focus on immediate goals over long-term investments: the company might not live long enough to reap the benefits of an infrastructure investment that pays off slowly. A serial startup developer could very reasonably have 10 years of development experience and little or no experience maintaining any piece of software expected to exist for longer than a year or two.

+ +

On the other end of the spectrum, some successful projects have an effectively unbounded life span: we can’t reasonably predict an endpoint for Google Search, the Linux kernel, or the Apache HTTP Server project.  For most Google projects, we must assume that they will live indefinitely—we cannot predict when we won’t need to upgrade our dependencies, language versions, and so on. As their lifetimes grow, these long-lived projects eventually have a different feel to them than programming assignments or startup development.

+ +

Consider Figure 1-1, which demonstrates two software projects on opposite ends of this “expected life span†spectrum.  For a programmer working on a task with an expected life span of hours, what types of maintenance are reasonable to expect? That is, if a new version of your OS comes out while you’re working on a Python script that will be executed one time, should you drop what you’re doing and upgrade? Of course not: the upgrade is not critical. But on the opposite end of the spectrum, Google Search being stuck on a version of our OS from the 1990s would be a clear problem.

+ +
Life span and the importance of upgrades +
Figure 1-1. Life span and the importance of upgrades
+
+ +

The low and high points on the expected life span spectrum suggest that there’s a transition somewhere. Somewhere along the line between a one-off program and a project that lasts for decades, a transition happens: a project must begin to react to changing externalities.7 For any project that didn’t plan for upgrades from the start, that transition is likely very painful for three reasons, each of which compounds the others:

+ +
    +
  • +

    You’re performing a task that hasn’t yet been done for this project; more hidden assumptions have been baked-in.

    +
  • +
  • +

    The engineers trying to do the upgrade are less likely to have experience in this sort of task.

    +
  • +
  • +

    The size of the upgrade is often larger than usual, doing several years’ worth of upgrades at once instead of a more incremental upgrade.

    +
  • +
+ +

And thus, after actually going through such an upgrade once (or giving up part way through), it’s pretty reasonable to overestimate the cost of doing a subsequent upgrade and decide “Never again.†Companies that come to this conclusion end up committing to just throwing things out and rewriting their code, or deciding to never upgrade again. Rather than take the natural approach by avoiding a painful task, sometimes the more responsible answer is to invest in making it less painful. It all depends on the cost of your upgrade, the value it provides, and the expected life span of the project in question.

+ +

Getting through not only that first big upgrade, but getting to the point at which you can reliably stay current going forward, is the essence of long-term sustainability for your project. Sustainability requires planning and managing the impact of required change. For many projects at Google, we believe we have achieved this sort of sustainability, largely through trial and error.

+ +

So, concretely, how does short-term programming differ from producing code with a much longer expected life span? Over time, we need to be much more aware of the difference between “happens to work†and “is maintainable.†There is no perfect solution for identifying these issues. That is unfortunate, because keeping software maintainable for the long-term is a constant battle.

+ +
+

Hyrum’s Law

+ +

If you are maintaining a  project that is used by  other engineers, the most important lesson about “it works†versus “it is maintainable†is what we’ve come to call Hyrum’s Law:

+ +
+

With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.

+
+ +

In our experience, this axiom is a dominant factor in any discussion of changing software over time. It is conceptually akin to entropy: discussions of change and maintenance over time must be aware of Hyrum’s Law8 just as discussions of efficiency or thermodynamics must be mindful of entropy. Just because entropy never decreases doesn’t mean we shouldn’t try to be efficient. Just because Hyrum’s Law will apply when maintaining software doesn’t mean we can’t plan for it or try to better understand it. We can mitigate it, but we know that it can never be eradicated.

+ +

Hyrum’s Law represents the practical knowledge that—even with the best of intentions, the best engineers, and solid practices for code review—we cannot assume perfect adherence to published contracts or best practices. As an API owner, you will gain some flexibility and freedom by being clear about interface promises, but in practice, the complexity and difficulty of a given change also depends on how useful a user finds some observable behavior of your API. If users cannot depend on such things, your API will be easy to change. Given enough time and enough users, even the most innocuous change will break something;9 your analysis of the value of that change must incorporate the difficulty in investigating, identifying, and resolving those breakages.

+
+ +
+

Example: Hash Ordering

+ +

Consider the example of hash iteration ordering.   If we insert five elements into a hash-based set, in what order do we get them out?

+ +
>>> for i in {"apple", "banana", "carrot", "durian", "eggplant"}: print(i)
+... 
+durian
+carrot
+apple
+eggplant
+banana
+ +

Most programmers know that hash tables are non-obviously ordered. Few know the specifics of whether the particular hash table they are using is intending to provide that particular ordering forever. This might seem unremarkable, but over the past decade or two, the computing industry’s experience using such types has evolved:

+ +
    +
  • +

    Hash flooding10 attacks provide an increased incentive for nondeterministic hash iteration.

    +
  • +
  • +

    Potential efficiency  gains from research into improved hash algorithms or hash containers require changes to hash iteration order.

    +
  • +
  • +

    Per Hyrum’s Law, programmers will write programs that depend on the order in which a hash table is traversed, if  they have the ability to do so.

    +
  • +
+ +

As a result, if you ask any expert “Can I assume a particular output sequence for my hash container?†that expert will presumably say “No.†By and large that is correct, but perhaps simplistic. A more nuanced answer is, “If your code is short-lived, with no changes to your hardware, language runtime, or choice of data structure, such an assumption is fine. If you don’t know how long your code will live, or you cannot promise that nothing you depend upon will ever change, such an assumption is incorrect.†Moreover, even if your own implementation does not depend on hash container order, it might be used by other code that implicitly creates such a dependency. For example, if your library serializes values into a Remote Procedure Call (RPC) response, the RPC caller might wind up depending on the order of those values.

+ +

This is a very basic example of the difference between “it works†and “it is correct.†For a short-lived program, depending on the iteration order of your containers will not cause any technical problems. For a software engineering project, on the other hand, such reliance on a defined order is a risk—given enough time, something will make it valuable to change that iteration order. That value can manifest in a number of ways, be it efficiency, security, or merely future-proofing the data structure to allow for future changes. When that value becomes clear, you will need to weigh the trade-offs between that value and the pain of breaking your developers or customers.

+ +

Some languages specifically randomize hash ordering between library versions or even between execution of the same program in an attempt to prevent dependencies. But even this still allows for some Hyrum’s Law surprises: there is code that uses hash iteration ordering as an inefficient random-number generator. Removing such randomness now would break those users. Just as entropy increases in every thermodynamic system, Hyrum’s Law applies to every observable behavior.

+ +

Thinking over the differences between code written with a “works now†and a “works indefinitely†mentality, we can extract some clear relationships. Looking at code as an artifact with a (highly) variable lifetime requirement, we can begin to categorize programming styles: code that depends on brittle and unpublished features of its dependencies is   likely to be described as “hacky†or “clever,†whereas code  that follows best practices and has planned for the future is more likely to be described as “clean†and “maintainable.†Both have their purposes, but which one you select depends crucially on the expected life span of the code in question.   We’ve taken to saying, “It’s programming if 'clever' is a compliment, but it’s software engineering if 'clever' is an accusation.â€

+
+ +
+

Why Not Just Aim for “Nothing Changes�

+ +

Implicit in all of this discussion of time and the need to react to change is the assumption that change might be necessary.  Is it?

+ +

As with effectively everything else in this book, it depends.  We’ll readily commit to “For most projects, over a long enough time period, everything underneath them might need to be changed.†If you have a  project written in pure C with no external dependencies (or only external dependencies that promise great long-term stability, like POSIX), you might well be able to avoid any form of refactoring or difficult upgrade. C does a great job of providing stability—in many respects, that is its primary purpose.

+ +

Most projects have far more exposure to shifting underlying technology. Most programming languages and runtimes change much more than C does. Even libraries implemented in pure C might change to support new features, which can affect downstream users.  Security problems are disclosed in all manner of technology, from processors to networking libraries to application code. Every piece of technology upon which your project depends has some (hopefully small) risk of containing critical bugs and security vulnerabilities that might come to light only after you’ve started relying on it.  If you are incapable of deploying a patch for Heartbleed or mitigating speculative execution problems like Meltdown and Spectre because you’ve assumed (or promised) that nothing will ever change, that is a significant gamble. 

+ +

Efficiency improvements further complicate the picture.  We want to outfit our datacenters with cost-effective computing equipment, especially enhancing CPU efficiency. However, algorithms and data structures from early-day Google are simply less efficient on modern equipment: a linked-list or a binary search tree will still work fine, but the ever-widening gap between CPU cycles versus memory latency impacts what “efficient†code looks like. Over time, the value in upgrading to newer hardware can be diminished without accompanying design changes to the software.  Backward compatibility ensures that older systems still function, but that is no guarantee that old optimizations are still helpful. Being unwilling or unable to take advantage of such opportunities risks incurring large costs. Efficiency concerns like this are particularly subtle: the original design might have been perfectly logical and following reasonable best practices. It’s only after an evolution of backward-compatible changes that a new, more efficient option becomes important. No mistakes were made, but the passage of time still made change valuable.

+ +

Concerns like those just mentioned are why there are large risks for long-term projects that haven’t invested in sustainability. We must be capable of responding to these sorts of issues and taking advantage of these opportunities, regardless of whether they directly affect us or manifest in only the transitive closure of technology we build upon. Change is not inherently good. We shouldn’t change just for the sake of change. But we do need to be capable of change. If we allow for that eventual necessity, we should also consider whether to invest in making that capability cheap. As every system administrator knows, it’s one thing to know in theory that you can recover from tape, and another to know in practice exactly how to do it and how much it will cost when it becomes necessary. Practice and expertise are great drivers of efficiency and reliability.  

+
+
+ +
+

Scale and Efficiency

+ +

As noted in the Site Reliability Engineering (SRE) book,11 Google’s production system as a whole is among the most complex machines created by humankind.   The complexity involved in building such a machine and keeping it running smoothly has required countless hours of thought, discussion, and redesign from experts across our organization and around the globe. So, we have already written a book about the complexity of keeping that machine running at that scale.

+ +

Much of this book focuses on the complexity of scale of the organization that produces such a machine, and the processes that we use to keep that machine running over time.   Consider again the concept of codebase sustainability: “Your organization’s codebase is sustainable when you are able to change all of the things that you ought to change, safely, and can do so for the life of your codebase.†Hidden in the discussion of capability is also one of costs: if changing something comes at inordinate cost, it will likely be deferred.  If costs grow superlinearly over time, the operation clearly is not scalable.12 Eventually, time will take hold and something unexpected will arise that you absolutely must change. When your project doubles in scope and you need to perform that task again, will it be twice as labor intensive? Will you even have the human resources required to address the issue next time?

+ +

Human costs are not the only finite resource that needs to scale. Just as software itself needs to scale well with traditional resources such as compute, memory, storage, and bandwidth, the development of that software also needs to scale, both in terms of human time involvement and the compute resources that power your development workflow. If the compute cost for your test cluster grows superlinearly, consuming more compute resources per person each quarter, you’re on an unsustainable path and need to make changes soon.

+ +

Finally, the most precious asset of a software organization—the codebase itself—also needs to scale.  If your build system or version control system scales superlinearly over time, perhaps as a result of growth and increasing changelog history, a point might come at which you simply cannot proceed. Many questions, such as “How long does it take to do a full build?â€, “How long does it take to pull a fresh copy of the repository?â€, or “How much will it cost to upgrade to a new language version?†aren’t actively monitored and change at a slow pace. They can easily become like the metaphorical boiled frog; it is far too easy for problems to worsen slowly and never manifest as a singular moment of crisis. Only with an organization-wide awareness and commitment to scaling are you likely to keep on top of these issues.

+ +

Everything your organization relies upon to produce and maintain code should be scalable in terms of overall cost and resource consumption. In particular, everything your organization must do repeatedly should be scalable in terms of human effort. Many common policies don’t seem to be scalable in this sense.

+ +
+

Policies That Don’t Scale

+ +

With a little practice, it becomes easier to spot policies with bad  scaling properties. Most commonly, these can be identified by considering the work imposed on a single engineer and imagining the organization scaling up by 10 or 100 times. When we are 10 times larger, will we add 10 times more work with which our sample engineer needs to keep up? Does the amount of work our engineer must perform grow as a function of the size of the organization? Does the work scale up with the size of the codebase? If either of these are true, do we have any mechanisms in place to automate or optimize that work? If not, we have scaling problems.

+ +

Consider a traditional approach to deprecation.  We discuss deprecation much more in Deprecation, but the common approach to deprecation serves as a great example of scaling problems. A new Widget has been developed. The decision is made that everyone should use the new one and stop using the old one. To motivate this, project leads say “We’ll delete the old Widget on August 15th; make sure you’ve converted to the new Widget.â€

+ +

This type of approach might work in a small software setting but quickly fails as both the depth and breadth of the dependency graph increases. Teams depend on an ever-increasing number of Widgets, and a single build break can affect a growing percentage of the company. Solving these problems in a scalable way means changing the way we do deprecation: instead of pushing migration work to customers, teams can internalize it themselves, with all the economies of scale that provides.

+ +

In 2012, we tried to put a stop to this with rules mitigating churn: infrastructure teams must do the work to move their internal users to new versions themselves or do the update in place, in backward-compatible fashion.  This policy, which we’ve called the “Churn Rule,†scales better: dependent projects are no longer spending progressively greater effort just to keep up. We’ve also learned that having a dedicated group of experts execute the change scales better than asking for more maintenance effort from every user: experts spend some time learning the whole problem in depth and then apply that expertise to every subproblem. Forcing users to respond to churn means that every affected team does a worse job ramping up, solves their immediate problem, and then throws away that now-useless knowledge. Expertise scales better.

+ +

The traditional use of development branches is another example of policy that has built-in scaling problems. An organization might identify that merging large features into trunk has destabilized the product and conclude, “We need tighter controls on when things merge. We should merge less frequently.†This leads quickly to every team or every feature having separate dev branches. Whenever any branch is decided to be “complete,†it is tested and merged into trunk, triggering some potentially expensive work for other engineers still working on their dev branch, in the form of resyncing and testing. Such branch management can be made to work for a small organization juggling 5 to 10 such branches. As the size of an organization (and the number of branches) increases, it quickly becomes apparent that we’re paying an ever-increasing amount of overhead to do the same task. We’ll need a different approach as we scale up, and we discuss that in Version Control and Branch Management.

+
+ +
+

Policies That Scale Well

+ +

What sorts of policies result in better costs as the organization grows?  Or, better still, what sorts of policies can we put in place that provide superlinear value as the organization grows?

+ +

One of our favorite internal policies is a great enabler of infrastructure teams, protecting their ability to make infrastructure changes safely. “If a product experiences outages or other problems as a result of infrastructure changes, but the issue wasn’t surfaced  by tests in our Continuous Integration (CI) system, it is not the fault of the infrastructure change.†More colloquially, this is phrased as “If you liked it, you should have put a CI test on it,†which we call “The Beyoncé Rule."13 From a scaling  perspective, the Beyoncé Rule implies that complicated, one-off bespoke tests that aren’t triggered by our common CI system do not count. Without this, an engineer on an infrastructure team could conceivably need to track down every team with any affected code and ask them how to run their tests. We could do that when there were a hundred engineers. We definitely cannot afford to do that anymore.

+ +

We’ve found that expertise and shared communication forums offer great value as an organization scales.  As engineers discuss and answer questions in shared forums, knowledge tends to spread. New experts grow. If you have a hundred engineers writing Java, a single friendly and helpful Java expert willing to answer questions will soon produce a hundred engineers writing better Java code. Knowledge is viral, experts are carriers, and there’s a lot to be said for the value of clearing away the common stumbling blocks for your engineers. We cover this in greater detail in Knowledge Sharing.

+
+ +
+

Example: Compiler Upgrade

+ +

Consider the daunting task of upgrading your compiler.    Theoretically, a compiler upgrade should be cheap given how much effort languages take to be backward compatible, but how cheap of an operation is it in practice? If you’ve never done such an upgrade before, how would you evaluate whether your codebase is compatible with that change?

+ +

In our experience, language and compiler upgrades are subtle and difficult tasks even when they are broadly expected to be backward compatible. A compiler upgrade will almost always result in minor changes to behavior: fixing miscompilations, tweaking optimizations, or potentially changing the results of anything that was previously undefined. How would you evaluate the correctness of your entire codebase against all of these potential outcomes?

+ +

The most storied compiler upgrade in Google’s history took place all the way back in 2006. At that point, we had been operating for a few years and had several thousand engineers on staff. We hadn’t updated compilers in about five years. Most of our engineers had no experience with a compiler change. Most of our code had been exposed to only a single compiler version. It was a difficult and painful task for a team of (mostly) volunteers, which eventually became a matter of finding shortcuts and simplifications in order to work around upstream compiler and language changes that we didn’t know how to adopt.14 In the end, the 2006 compiler upgrade was extremely painful. Many Hyrum’s Law problems, big and small, had crept into the codebase and served to deepen our dependency on a particular compiler version. Breaking those implicit dependencies was painful. The engineers in question were taking a risk: we didn’t have the Beyoncé Rule yet, nor did we have a pervasive CI system, so it was difficult to know the impact of the change ahead of time or be sure they wouldn’t be blamed for regressions.

+ +

This story isn’t at all unusual. Engineers at many companies can tell a similar story about a painful upgrade. What is unusual is that we recognized after the fact that the task had been painful and began focusing on technology and organizational changes to overcome the scaling problems and turn scale to our advantage: automation (so that a single human can do more), consolidation/consistency (so that low-level changes have a limited problem scope), and expertise (so that a few humans can do more).

+ +

The more frequently you change your infrastructure, the easier it becomes to do so. We have found that most of the time, when code is updated as part of something like a compiler upgrade, it becomes less brittle and easier to upgrade in the future. In an ecosystem in which most code has gone through several upgrades, it stops depending on the nuances of the underlying implementation; instead, it depends on the actual abstraction guaranteed by the language or OS. Regardless of what exactly you are upgrading, expect the first upgrade for a codebase to be significantly more expensive than later upgrades, even controlling for other factors.

+ +

Through this and other experiences, we’ve discovered many factors that affect the flexibility  of a codebase:

+ +
+
Expertise
+
We know how to do this; for some languages, we’ve now done hundreds of compiler upgrades across many platforms.
+
Stability
+
There is less change between releases because we adopt releases more regularly; for some languages, we’re now deploying compiler upgrades every week or two.
+
Conformity
+
There is less code that hasn’t been through an upgrade already, again because we are upgrading regularly.
+
Familiarity
+
Because we do this regularly enough, we can spot redundancies in the process of performing an upgrade and attempt to automate. This overlaps significantly with SRE views on toil.15
+
Policy
+
We have processes and policies like the Beyoncé Rule. The net effect of these processes is that upgrades remain feasible because infrastructure teams do not need to worry about every unknown usage, only the ones that are visible in our CI systems.
+
+ +

The underlying lesson is not about the frequency or difficulty of compiler upgrades, but that as soon as we became aware that compiler upgrade tasks were necessary, we found ways to make sure to perform those tasks with a constant number of engineers, even as the codebase grew.16 If we had instead decided that the task was too expensive and should be avoided in the future, we might still be using a decade-old compiler version. We would be paying perhaps 25% extra for computational resources as a result of missed optimization opportunities. Our central infrastructure could be vulnerable to significant security risks given that a 2006-era compiler is certainly not helping to mitigate speculative execution vulnerabilities. Stagnation is an option, but often not a wise one.   

+
+ +
+

Shifting Left

+ +

One of the broad truths we’ve seen to be true is the idea that finding problems earlier in the developer workflow usually reduces costs.    Consider a timeline of the developer workflow for a feature that progresses from left to right, starting from conception and design, progressing through implementation, review, testing, commit, canary, and eventual production deployment. Shifting problem detection to the “left†earlier on this timeline makes it cheaper to fix than waiting longer, as shown in Figure 1-2.

+ +

This term seems to have originated from arguments that security mustn’t be deferred until the end of the development process, with requisite calls to “shift left on security.†The argument in this case is relatively simple: if a security problem is discovered only after your product has gone to production, you have a very expensive problem. If it is caught before deploying to production, it may still take a lot of work to identify and remedy the problem, but it’s cheaper. If you can catch it before the original developer commits the flaw to version control, it’s even cheaper: they already have an understanding of the feature; revising according to new security constraints is cheaper than committing and forcing someone else to triage it and fix it.

+ +
Timeline of the developer workflow +
Figure 1-2. Timeline of the developer workflow
+
+ +

The same basic pattern emerges many times in this book. Bugs that are caught by static analysis and code review before they are committed are much cheaper than bugs that make it to production. Providing tools and practices that highlight quality, reliability, and security early in the development process is a common goal for many of our infrastructure teams. No single process or tool needs to be perfect, so we can assume a defense-in-depth approach, hopefully catching as many defects on the left side of the graph as possible.   

+
+
+ +
+

Trade-offs and Costs

+ +

If we understand how to program, understand the lifetime  of the software we’re maintaining, and  understand how to maintain  it as we scale up with more engineers producing and maintaining new features, all that is left is to make good decisions. This seems obvious: in software engineering, as in life, good choices lead to good outcomes. However, the ramifications of this observation are easily overlooked. Within Google, there is a strong distaste for “because I said so.†It is important for there to be a decider for any topic and clear escalation paths when decisions seem to be wrong, but the goal is consensus, not unanimity. It’s fine and expected to see some instances of “I don’t agree with your metrics/valuation, but I see how you can come to that conclusion.†Inherent in all of this is the idea that there needs to be a reason for everything; “just because,†“because I said so,†or “because everyone else does it this way†are places where bad decisions lurk. Whenever it is efficient to do so, we should be able to explain our work when deciding between the general costs for two engineering options.

+ +

What do we mean by cost?  We are not only talking about dollars here. “Cost†roughly translates to effort and can involve any or all of these factors:

+ +
    +
  • +

    Financial costs (e.g., money)

    +
  • +
  • +

    Resource costs (e.g., CPU time)

    +
  • +
  • +

    Personnel costs (e.g., engineering effort)

    +
  • +
  • +

    Transaction costs (e.g., what does it cost to take action?)

    +
  • +
  • +

    Opportunity costs (e.g., what does it cost to not take action?)

    +
  • +
  • +

    Societal costs (e.g., what impact will this choice have on society at large?)

    +
  • +
+ +

Historically, it’s been particularly easy to ignore the question of societal costs.  However, Google and other large tech companies can now credibly deploy products with billions of users. In many cases, these products are a clear net benefit, but when we’re operating at such a scale, even small discrepancies in usability, accessibility, fairness, or potential for abuse are magnified, often to the detriment of groups that are already marginalized. Software pervades so many aspects of society and culture; therefore, it is wise for us to be aware of both the good and the bad that we enable when making product and technical decisions. We discuss this much more in Engineering for Equity.

+ +

In addition to the aforementioned costs (or our estimate of them), there are biases: status quo bias, loss aversion, and others.  When we evaluate cost, we need to keep all of the previously listed costs in mind: the health of an organization isn’t just whether there is money in the bank, it’s also whether its members are feeling valued and productive.  In highly creative and lucrative fields like software engineering, financial cost is usually not the limiting factor—personnel cost usually is. Efficiency gains from keeping engineers happy, focused, and engaged can easily dominate other factors, simply because focus and productivity are so variable, and a 10-to-20% difference is easy to imagine.

+ +
+

Example: Markers

+ +

In many organizations, whiteboard markers are treated as precious goods. They are tightly controlled and always in short supply.   Invariably, half of the markers at any given whiteboard are dry and unusable. How often have you been in a meeting that was disrupted by lack of a working marker? How often have you had your train of thought derailed by a marker running out? How often have all the markers just gone missing, presumably because some other team ran out of markers and had to abscond with yours? All for a product that costs less than a dollar.

+ +

Google tends to have unlocked closets full of office supplies, including whiteboard markers, in most work areas. With a moment’s notice it is easy to grab dozens of markers in a variety of colors. Somewhere along the line we made an explicit trade-off: it is far more important to optimize for obstacle-free brainstorming than to protect against someone wandering off with a bunch of markers.

+ +

We aim to have the same level of eyes-open and explicit weighing of the cost/benefit trade-offs involved for everything we do, from office supplies and employee perks through day-to-day experience for developers to how to provision and run global-scale services.   We often say, “Google is a data-driven culture.†In fact, that’s a simplification: even when there isn’t data, there might still be evidence, precedent, and argument. Making good engineering decisions is all about weighing all of the available inputs and making informed decisions about the trade-offs. Sometimes, those decisions are based on instinct or accepted best practice, but only after we have exhausted approaches that try to measure or estimate the true underlying costs.

+ +

In the end, decisions in an engineering group  should come down to very few things:

+ +
    +
  • +

    We are doing this because we must (legal requirements, customer requirements).

    +
  • +
  • +

    We are doing this because it is the best option (as determined by some appropriate decider) we can see at the time, based on current evidence.

    +
  • +
+ +

Decisions should not be “We are doing this because I said so.â€17

+
+ +
+

Inputs to Decision Making

+ +

When we are  weighing data, we  find two common  scenarios:

+ +
    +
  • +

    All of the quantities involved are measurable or can at least be estimated. This usually means that we’re evaluating trade-offs between CPU and network, or dollars and RAM, or considering whether to spend two weeks of engineer-time in order to save N CPUs across our datacenters.

    +
  • +
  • +

    Some of the quantities are subtle, or we don’t know how to measure them. Sometimes this manifests as “We don’t know how much engineer-time this will take.†Sometimes it is even more nebulous: how do you measure the engineering cost of a poorly designed API? Or the societal impact of a product choice?

    +
  • +
+ +

There is little reason to be deficient on the first type of decision. Any software engineering organization can and should track the current cost for compute resources, engineer-hours, and other quantities you interact with regularly. Even if you don’t want to publicize to your organization the exact dollar amounts, you can still produce a conversion table: this many CPUs cost the same as this much RAM or this much network bandwidth.

+ +

With an agreed-upon conversion table in hand, every engineer can do their own analysis. “If I spend two weeks changing this linked-list into a higher-performance structure, I’m going to use five gibibytes more production RAM but save two thousand CPUs. Should I do it?†Not only does this question depend upon the relative cost of RAM and CPUs, but also on personnel costs (two weeks of support for a software engineer) and opportunity costs (what else could that engineer produce in two weeks?).

+ +

For the second type of decision, there is no easy answer. We rely on experience, leadership, and precedent to negotiate these issues.  We’re investing in research to help us quantify the hard-to-quantify (see Measuring Engineering Productivity). However, the best broad suggestion that we have is to be aware that not everything is measurable or predictable and to attempt to treat such decisions with the same priority and greater care. They are often just as important, but more difficult to manage.

+
+ +
+

Example: Distributed Builds

+ +

Consider your build. According to completely unscientific Twitter polling, something like 60 to 70% of developers build locally, even with today’s large, complicated builds.    This leads directly to nonjokes as illustrated by this "Compiling" comic—how much productive time in your organization is lost waiting for a build? Compare that to the cost to run something like distcc for a small group. Or, how much does it cost to run a small build farm for a large group? How many weeks/months does it take for those costs to be a net win?

+ +

Back in the mid-2000s, Google relied purely on a local build system: you checked out code and you compiled it locally. We had massive local machines in some cases (you could build Maps on your desktop!), but compilation times became longer and longer as the codebase grew. Unsurprisingly, we incurred increasing overhead in personnel costs due to lost time, as well as increased resource costs for larger and more powerful local machines, and so on. These resource costs were particularly troublesome: of course we want people to have as fast a build as possible, but most of the time, a high-performance desktop development machine will sit idle. This doesn’t feel like the proper way to invest those resources.

+ +

Eventually, Google developed its own distributed build system. Development of this system incurred a cost, of course: it took engineers time to develop, it took more engineer time to change everyone’s habits and workflow and learn the new system, and of course it cost additional computational resources. But the overall savings were clearly worth it: builds became faster, engineer-time was recouped, and hardware investment could focus on managed shared infrastructure (in actuality, a subset of our production fleet) rather than ever-more-powerful desktop machines. Build Systems and Build Philosophy goes into more of the details on our approach to distributed builds and the relevant trade-offs.

+ +

So, we built a new system, deployed it to production, and sped up everyone’s build. Is that the happy ending to the story? Not quite: providing a distributed build system made massive improvements to engineer productivity, but as time went on, the distributed builds themselves became bloated. What was constrained in the previous case by individual engineers (because they had a vested interest in keeping their local builds as fast as possible) was unconstrained within a distributed build system. Bloated or unnecessary dependencies in the build graph became all too common. When everyone directly felt the pain of a nonoptimal build and was incentivized to be vigilant, incentives were better aligned. By removing those incentives and hiding bloated dependencies in a parallel distributed build, we created a situation in which consumption could run rampant, and almost nobody was incentivized to keep an eye on build bloat.  This is reminiscent of Jevons Paradox: consumption of a resource may increase as a response to greater efficiency in its use.

+ +

Overall, the saved costs associated with adding a distributed build system far, far outweighed the negative costs associated with its construction and maintenance. But, as we saw with increased consumption, we did not foresee all of these costs. Having blazed ahead, we found ourselves in a situation in which we needed to reconceptualize the goals and constraints of the system and our usage, identify best practices (small dependencies, machine-management of dependencies), and fund the tooling and maintenance for the new ecosystem. Even a relatively simple trade-off of the form “We’ll spend $$$s for compute resources to recoup engineer time†had unforeseen downstream effects.

+
+ +
+

Example: Deciding Between Time and Scale

+ +

Much of the time, our major themes of time and scale overlap and work in conjunction.     A policy like the Beyoncé Rule scales well and helps us maintain things over time. A change to an OS interface might require many small refactorings to adapt to, but most of those changes will scale well because they are of a similar form: the OS change doesn’t manifest differently for every caller and every project.

+ +

Occasionally time and scale come into conflict, and nowhere so clearly as in the basic question: should we add a dependency or fork/reimplement it to better suit our local needs?   

+ +

This question can arise at many levels of the software stack because it is regularly the case that a bespoke solution customized for your narrow problem space may outperform the general utility solution that needs to handle all possibilities. By forking or reimplementing utility code and customizing it for your narrow domain, you can add new features with greater ease, or optimize with greater certainty, regardless of whether we are talking about a microservice, an in-memory cache, a compression routine, or anything else in our software ecosystem. Perhaps more important, the control you gain from such a fork isolates you from changes in your underlying dependencies: those changes aren’t dictated by another team or third-party provider. You are in control of how and when to react to the passage of time and necessity to change.

+ +

On the other hand, if every developer forks everything used in their software project instead of reusing  what exists, scalability suffers alongside sustainability.  Reacting to a security issue in an underlying library is no longer a matter of updating a single dependency and its users: it is now a matter of identifying every vulnerable fork of that dependency and the users of those forks.

+ +

As with most software engineering decisions, there isn’t a one-size-fits-all answer to this situation. If your project life span is short, forks are less risky. If the fork in question is provably limited in scope, that helps, as well—avoid forks for interfaces that could operate across time or project-time boundaries (data structures, serialization formats, networking protocols). Consistency has great value, but generality comes with its own costs, and you can often win by doing your own thing—if you do it carefully.

+
+ +
+

Revisiting Decisions, Making Mistakes

+ +

One of the unsung  benefits of committing to a data-driven culture is the combined ability and necessity of admitting to mistakes.     A decision will be made at some point, based on the available data—hopefully based on good data and only a few assumptions, but implicitly based on currently available data. As new data comes in, contexts change, or assumptions are dispelled, it might become clear that a decision was in error or that it made sense at the time but no longer does. This is particularly critical for a long-lived organization: time doesn’t only trigger changes in technical dependencies and software systems, but in data used to drive decisions.

+ +

We believe strongly in data informing decisions, but we recognize that the data will change over time, and new data may present itself. This means, inherently, that decisions will need to be revisited from time to time over the life span of the system in question. For long-lived projects, it’s often critical to have the ability to change directions after an initial decision is made. And, importantly, it means that the deciders need to have the right to admit mistakes. Contrary to some people’s instincts, leaders who admit mistakes are more respected, not less.

+ +

Be evidence driven, but also realize that things that can’t be measured may still have value. If you’re a leader, that’s what you’ve been asked to do: exercise judgement, assert that things are important.    We’ll speak more on leadership in Chapters How to Lead a Team and Leading at Scale.

+
+
+ +
+

Software Engineering Versus Programming

+ +

When presented  with  our distinction between software engineering and programming, you might ask whether there is an inherent value judgement in play. Is programming somehow worse than software engineering? Is a project that is expected to last a decade with a team of hundreds inherently more valuable than one that is useful for only a month and built by two people?

+ +

Of course not. Our point is not that software engineering is superior, merely that these represent two different problem domains with distinct constraints, values, and best practices. Rather, the value in pointing out this difference comes from recognizing that some tools are great in one domain but not in the other. You probably don’t need to rely on integration tests (see Larger Testing) and Continuous Deployment (CD) practices (see Continuous Delivery) for a project that will last only a few days. Similarly, all of our long-term concerns about semantic versioning (SemVer) and dependency management in software engineering projects (see Dependency Management) don’t really apply for short-term programming projects: use whatever is available to solve the task at hand.

+ +

We believe it is important to differentiate between the related-but-distinct terms “programming†and “software engineering.†Much of that difference stems from the management of code over time, the impact of time on scale, and decision making in the face of those ideas. Programming is the immediate act of producing code. Software engineering is the set of policies, practices, and tools that are necessary to make that code useful for as long as it needs to be used and allowing collaboration across a team.

+
+ +
+

Conclusion

+ +

This book discusses all of these topics: policies for an organization and for a single programmer, how to evaluate and refine your best practices, and the tools and technologies that go into maintainable software. Google has worked hard to have a sustainable codebase and culture. We don’t necessarily think that our approach is the one true way to do things, but it does provide proof by example that it can be done. We hope it will provide a useful framework for thinking about the general problem: how do you maintain your code for as long as it needs to keep working?

+
+ +
+

TL;DRs

+ +
    +
  • +

    “Software engineering†differs from “programming†in dimensionality: programming is about producing code. Software engineering extends that to include the maintenance of that code for its useful life span.

    +
  • +
  • +

    There is a factor of at least 100,000 times between the life spans of short-lived code and long-lived code. It is silly to assume that the same best practices apply universally on both ends of that spectrum.

    +
  • +
  • +

    Software is sustainable when, for the expected life span of the code, we are capable of responding to changes in dependencies, technology, or product requirements. We may choose to not change things, but we need to be capable.

    +
  • +
  • +

    Hyrum’s Law: with a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.

    +
  • +
  • +

    Every task your organization has to do repeatedly should be scalable (linear or better) in terms of human input. Policies are a wonderful tool for making process scalable.

    +
  • +
  • +

    Process inefficiencies and other software-development tasks tend to scale up slowly. Be careful about boiled-frog problems.

    +
  • +
  • +

    Expertise pays off particularly well when combined with economies of scale.

    +
  • +
  • +

    “Because I said so†is a terrible reason to do things.

    +
  • +
  • +

    Being data driven is a good start, but in reality, most decisions are based on a mix of data, assumption, precedent, and argument. It’s best when objective data makes up the majority of those inputs, but it can rarely be all of them.

    +
  • +
  • +

    Being data driven over time implies the need to change directions when the data changes (or when assumptions are dispelled). Mistakes or revised plans are inevitable.

    +
  • +
+
+

1We don’t mean “execution lifetime,†we mean “maintenance lifetimeâ€â€”how long will the code continue to be built, executed, and maintained? How long will this software provide value?

2This is perhaps a reasonable hand-wavy definition of technical debt: things that “should†be done, but aren’t yet—the delta between our code and what we wish it was.

3Also consider the issue of whether we know ahead of time that a project is going to be long lived.

4There is some question as to the original attribution of this quote; consensus seems to be that it was originally phrased by Brian Randell or Margaret Hamilton, but it might have been wholly made up by Dave Parnas. The common citation for it is “Software Engineering Techniques: Report of a conference sponsored by the NATO Science Committee,†Rome, Italy, 27–31 Oct. 1969, Brussels, Scientific Affairs Division, NATO.

5Frederick P. Brooks Jr. The Mythical Man-Month: Essays on Software Engineering (Boston: Addison-Wesley, 1995).

6Appcelerator, “Nothing is Certain Except Death, Taxes and a Short Mobile App Lifespan,†Axway Developer blog, December 6, 2012.

7Your own priorities and tastes will inform where exactly that transition happens. We’ve found that most projects seem to be willing to upgrade within five years. Somewhere between 5 and 10 years seems like a conservative estimate for this transition in general.

8To his credit, Hyrum tried really hard to humbly call this “The Law of Implicit Dependencies,†but “Hyrum’s Law†is the shorthand that most people at Google have settled on.

9See “Workflow,†an xkcd comic.

10A type of Denial-of-Service (DoS) attack in which an untrusted user knows the structure of a hash table and the hash function and provides data in such a way as to degrade the algorithmic performance of operations on the table.

11Beyer, B. et al. Site Reliability Engineering: How Google Runs Production Systems. (Boston: O'Reilly Media, 2016).

12Whenever we use “scalable†in an informal context in this chapter, we mean “sublinear scaling with regard to human interactions.â€

13This is a reference to the popular song "Single Ladies," which includes the refrain “If you liked it then you shoulda put a ring on it.â€

14Specifically, interfaces from the C++ standard library needed to be referred to in namespace std, and an optimization change for std::string turned out to be a significant pessimization for our usage, thus requiring some additional workarounds.

15Beyer et al. Site Reliability Engineering: How Google Runs Production Systems, Chapter 5, "Eliminating Toil."

16In our experience, an average software engineer (SWE) produces a pretty constant number of lines of code per unit time. For a fixed SWE population, a codebase grows linearly—proportional to the count of SWE-months over time. If your tasks require effort that scales with lines of code, that’s concerning.

17This is not to say that decisions need to be made unanimously, or even with broad consensus; in the end, someone must be the decider. This is primarily a statement of how the decision-making process should flow for whoever is actually responsible for the decision.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch02.html b/clones/abseil.io/resources/swe-book/html/ch02.html new file mode 100644 index 00000000..649d7cf1 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch02.html @@ -0,0 +1,382 @@ + + + + + Software Engineering at Google + + + + +
+

How to Work Well on Teams

+ + + + + +

Because this chapter is about the cultural and social aspects of software engineering at Google, it makes sense to begin by focusing on the one variable over which you definitely have control: you.

+ +

People are inherently imperfect—we like to say that humans are mostly a collection of intermittent bugs. But before you can understand the bugs in your coworkers, you need to understand the bugs in yourself. We’re going to ask you to think about your own reactions, behaviors, and attitudes—and in return, we hope you gain some real insight into how to become a more efficient and successful software engineer who spends less energy dealing with people-related problems and more time writing great code.

+ +

The critical idea in this chapter is that software development is a team endeavor. And to succeed on an engineering team—or in any other creative collaboration—you need to reorganize your behaviors around the core principles of humility, respect, and trust.

+ +

Before we get ahead of ourselves, let’s begin by observing how software engineers tend to behave in general.

+ +
+

Help Me Hide My Code

+ +

For the past 20 years, my colleague Ben1 and I have spoken at many programming conferences. In 2006, we launched Google’s (now deprecated) open source Project Hosting service, and at first, we used to get lots of questions and requests about the product. But around mid-2008, we began to notice a trend in the sort of requests we were getting:

+ +
+

"Can you please give Subversion on Google Code the ability to hide specific branches?"

+ +

"Can you make it possible to create open source projects that start out hidden to the world and then are revealed when they’re ready?"

+ +

"Hi, I want to rewrite all my code from scratch, can you please wipe all the history?"

+
+ +

Can you spot a common theme to these requests?

+ +

The answer is insecurity. People  are afraid of others seeing and judging their work in progress. In one sense, insecurity is just a part of human nature—nobody likes to be criticized, especially for things that aren’t finished. Recognizing this theme tipped us off to a more general trend within software development: insecurity is actually a symptom of a larger problem.

+
+ +
+

The Genius Myth

+ +

Many humans have the instinct to find and worship idols.    For software engineers, those might be Linus Torvalds, Guido Van Rossum, Bill Gates—all heroes who changed the world with heroic feats. Linus wrote Linux by himself, right?

+ +

Actually, what Linus  did was write just the beginnings of a proof-of-concept Unix-like kernel and show it to an email list.  That was no small accomplishment, and it was definitely an impressive achievement, but it was just the tip of the iceberg. Linux is hundreds of times bigger than that initial kernel and was developed by thousands of smart people. Linus’ real achievement was to lead these people and coordinate their work; Linux is the shining result not of his original idea, but of the collective labor  of the  community. (And Unix itself was not entirely written by Ken Thompson and Dennis Ritchie, but by a group of smart people at Bell Labs.)

+ +

On that same note, did Guido Van Rossum personally write all of Python?  Certainly, he wrote the first version.  But hundreds of others were responsible for contributing to subsequent versions, including ideas, features, and bug fixes.  Steve Jobs led an entire team that built the Macintosh, and although Bill Gates is known for writing a BASIC interpreter for early home computers, his bigger achievement was building a successful company around MS-DOS.  Yet they all became leaders and symbols of the collective achievements of their communities. The Genius Myth is the tendency that we as humans need to ascribe the success of a team to a single person/leader. 

+ +

And what about Michael Jordan?

+ +

It’s the same story.  We idolized him, but the fact is that he didn’t win every basketball game by himself. His true genius was in the way he worked with his team. The team’s coach, Phil Jackson, was extremely clever, and his coaching techniques are legendary. He recognized that one player alone never wins a championship, and so he assembled an entire “dream team†around MJ. This team was a well-oiled machine—at least as impressive as Michael himself.

+ +

So, why do we repeatedly idolize the individual in these stories? Why do people buy products endorsed by celebrities? Why do we want to buy Michelle Obama’s dress or Michael Jordan’s shoes?

+ +

Celebrity is a big part of it.  Humans have a natural instinct to find leaders and role models, idolize them, and attempt to imitate them. We all need heroes for inspiration, and the programming world has its heroes, too.  The phenomenon of “techie-celebrity†has almost spilled over into mythology. We all want to write something world-changing like Linux or design the next brilliant programming language.

+ +

Deep down, many engineers secretly wish to be seen as geniuses.  This fantasy goes something like this:

+ +
    +
  • +

    You are struck by an awesome new concept.

    +
  • +
  • +

    You vanish into your cave for weeks or months, slaving away at a perfect implementation of your idea.

    +
  • +
  • +

    You then “unleash†your software on the world, shocking everyone with your genius.

    +
  • +
  • +

    Your peers are astonished by your cleverness.

    +
  • +
  • +

    People line up to use your software.

    +
  • +
  • +

    Fame and fortune follow naturally.

    +
  • +
+ +

But hold on: time for a reality check. You’re probably not a genius.

+ +

No offense, of course—we’re sure that you’re a very intelligent person. But do you realize how rare actual geniuses really are? Sure, you write code, and that’s a tricky skill. But even if you are a genius, it turns out that that’s not enough. Geniuses still make mistakes, and having brilliant ideas and elite programming skills doesn’t guarantee that your software will be a hit. Worse, you might find yourself solving only analytical problems and not human problems.  Being a genius is most definitely not an excuse for being a jerk: anyone—genius or not—with poor social skills tends to be a poor teammate.  The vast majority of the work at Google (and at most companies!) doesn’t require genius-level intellect, but 100% of the work requires a minimal level of social skills. What will make or break your career, especially at a company like Google, is how well you collaborate with others.

+ +

It turns out that this  Genius Myth is just another manifestation of our insecurity. Many programmers are afraid to share work they’ve only just started because it means peers will see their mistakes and know the author of the code is not a genius.

+ +

To quote a friend:

+ +
+

I know I get SERIOUSLY insecure about people looking before something is done. Like they are going to seriously judge me and think I’m an idiot.

+
+ +

This is an extremely common feeling among programmers, and the natural reaction is to hide in a cave, work, work, work, and then polish, polish, polish, sure that no one will see your goof-ups and that you’ll still have a chance to unveil your masterpiece when you’re done. Hide away until your code is perfect.

+ +

Another common motivation for hiding your work is the fear that another programmer might take your idea and run with it before you get around to working on it. By keeping it secret, you control the idea.

+ +

We know what you’re probably thinking now: so what? Shouldn’t people be allowed to work however they want?

+ +

Actually, no. In this case, we assert that you’re doing it wrong, and it is a big deal. Here’s why.

+
+ +
+

Hiding Considered Harmful

+ +

If you spend all of your  time working alone, you’re increasing the risk of unnecessary failure and cheating your potential for growth.  Even though software development is deeply intellectual work that can require deep concentration and alone time, you must play that off against the value (and need!) for collaboration and review.

+ +

First of all, how do you even know whether you’re on the right track?

+ +

Imagine you’re a bicycle-design enthusiast, and one day you get a brilliant idea for a completely new way to design a gear shifter. You order parts and proceed to spend weeks holed up in your garage trying to build a prototype. When your neighbor—also a bike advocate—asks you what’s up, you decide not to talk about it. You don’t want anyone to know about your project until it’s absolutely perfect. Another few months go by and you’re having trouble making your prototype work correctly. But because you’re working in secrecy, it’s impossible to solicit advice from your mechanically inclined friends.

+ +

Then, one day your neighbor pulls his bike out of his garage with a radical new gear-shifting mechanism. Turns out he’s been building something very similar to your invention, but with the help of some friends down at the bike shop. At this point, you’re exasperated. You show him your work. He points out that your design had some simple flaws—ones that might have been fixed in the first week if you had shown him. There are a number of lessons to learn here.

+ +
+

Early Detection

+ +

If you keep your great idea hidden  from the world and refuse to show anyone anything until the implementation is polished, you’re taking a huge gamble. It’s easy to make fundamental design mistakes early on. You risk reinventing wheels.2 And you forfeit the benefits of collaboration, too: notice how much faster your neighbor moved by working with others? This is why people dip their toes in the water before jumping in the deep end: you need to make sure that you’re working on the right thing, you’re doing it correctly, and it hasn’t been done before. The chances of an early misstep are high. The more feedback you solicit early on, the more you lower this risk.3 Remember the tried-and-true mantra of “Fail early, fail fast, fail often.â€

+ +

Early sharing isn’t just about preventing personal missteps and getting your ideas vetted.  It’s also important to strengthen what we call the bus factor of your project.

+
+ +
+

The Bus Factor

+ +
+

Bus factor (noun): the number of people that need to get hit by a bus before your project is completely doomed.

+
+ +

How dispersed is the knowledge and know-how in your project?   If you’re the only person who understands how the prototype code works, you might enjoy good job security—but if you get hit by a bus, the project is toast. If you’re working with a colleague, however, you’ve doubled the bus factor. And if you have a small team designing and prototyping together, things are even better—the project won’t be marooned when a team member disappears. Remember: team members might not literally be hit by buses, but other unpredictable life events still happen. Someone might get married, move away, leave the company, or take leave to care for a sick relative. Ensuring that there is at least good documentation in addition to a primary and a secondary owner for each area of responsibility helps future-proof your project’s success and increases your project’s bus factor. Hopefully most engineers recognize that it is better to be one part of a successful project than the critical part of a failed project.

+ +

Beyond the bus factor, there’s the issue of overall pace of progress. It’s easy to forget that working alone is often a tough slog, much slower than people want to admit. How much do you learn when working alone?  How fast do you move? Google and Stack Overflow are great sources of opinions and information, but they’re no substitute for actual human experience. Working with other people directly increases the collective wisdom behind the effort. When you become stuck on something absurd, how much time do you waste pulling yourself out of the hole? Think about how different the experience would be if you had a couple of peers to look over your shoulder and tell you—instantly—how you goofed and how to get past the problem. This is exactly why teams sit together (or do pair programming) in software engineering companies. Programming is hard. Software engineering is even harder. You need that second pair of eyes.

+
+ +
+

Pace of Progress

+ +

Here’s another analogy. Think about how you work with your compiler.  When you sit down to write a large piece of software, do you spend days writing 10,000 lines of code, and then, after writing that final, perfect line, press the “compile†button for the very first time? Of course you don’t. Can you imagine what sort of disaster would result?  Programmers work best in tight feedback loops: write a new function, compile. Add a test, compile. Refactor some code, compile. This way, we discover and fix typos and bugs as soon as possible after generating code. We want the compiler at our side for every little step; some environments can even compile our code as we type. This is how we keep code quality high and make sure our software is evolving correctly, bit by bit.  The current DevOps philosophy toward tech productivity is explicit about these sorts of goals: get feedback as early as possible, test as early as possible, and think about security and production environments as early as possible.  This is all bundled into the idea of "shifting left" in the developer workflow; the earlier we find a problem, the cheaper it is to fix it.

+ +

The same sort of rapid feedback loop is needed not just at the code level, but at the whole-project level, too. Ambitious projects evolve quickly and must adapt to changing environments as they go. Projects run into unpredictable design obstacles or political hazards, or we simply discover that things aren’t working as planned. Requirements morph unexpectedly. How do you get that feedback loop so that you know the instant your plans or designs need to change? Answer: by working in a team. Most engineers know the quote, “Many eyes make all bugs shallow,†but a better version might be, “Many eyes make sure your project stays relevant and on track.†People working in caves awaken to discover that while their original vision might be complete, the world has changed and their project has become irrelevant.

+ + +
+ +
+

In Short, Don’t Hide

+ +

So, what “hiding†boils down to is this: working alone is inherently riskier than working with others. Even though you might be afraid of someone stealing your idea or thinking you’re not intelligent, you should be much more concerned about wasting huge swaths of your time toiling away on the wrong thing.

+ +

Don’t become another statistic. 

+
+
+ +
+

It’s All About the Team

+ +

So, let’s back up now and put all of these ideas together.

+ +

The point  we’ve been hammering away at is that, in the realm of programming, lone craftspeople are extremely rare—and even when they do exist, they don’t perform superhuman achievements in a vacuum; their world-changing accomplishment is almost always the result of a spark of inspiration followed by a heroic team effort.

+ +

A great team makes brilliant use of its superstars, but the whole is always greater than the sum of its parts. But creating a superstar team is fiendishly difficult.

+ +

Let’s put this idea into simpler words: software engineering is a team endeavor.

+ +

This concept directly contradicts the inner Genius Programmer fantasy so many of us hold, but it’s not enough to be brilliant when you’re alone in your hacker’s lair. You’re not going to change the world or delight millions of computer users by hiding and preparing your secret invention. You need to work with other people. Share your vision. Divide the labor. Learn from others. Create a brilliant team.

+ +

Consider this: how many pieces of widely used, successful software can you name that were truly written by a single person? (Some people might say “LaTeX,†but it’s hardly “widely used,†unless you consider the number of people writing scientific papers to be a statistically significant portion of all computer users!)

+ +

High-functioning teams are gold and the true key to success. You should be aiming for this experience however you can.

+ +
+

The Three Pillars of Social Interaction

+ +

So, if teamwork is the best route to producing great software, how does one build (or find) a great team?  

+ +

To reach collaborative nirvana, you first need to learn and embrace what I call the “three pillars†of social skills. These three principles aren’t just about greasing the wheels of relationships; they’re the foundation on which all healthy interaction and collaboration are based:

+ +
+
Pillar 1: Humility
+
You are not the center of the universe (nor is your code!). You’re neither omniscient nor infallible.  You’re open to self-improvement.
+
Pillar 2: Respect
+
You genuinely care about others you work with.  You treat them kindly and appreciate their abilities and accomplishments.
+
Pillar 3: Trust
+
You believe others are  competent and will do the right thing, and you’re OK with letting them drive when appropriate.5
+
+ +

If you perform a root-cause analysis on almost any social conflict, you can ultimately trace it back to a lack of humility, respect, and/or trust. That might sound implausible at first, but give it a try. Think about some nasty or uncomfortable social situation currently in your life. At the basest level, is everyone being appropriately humble? Are people really respecting one another? Is there mutual trust?

+
+ +
+

Why Do These Pillars Matter?

+ +

When you began this chapter, you probably weren’t planning to sign up for some sort of weekly support group.   We empathize. Dealing with social problems can be difficult: people are messy, unpredictable, and often annoying to interface with. Rather than putting energy into analyzing social situations and making strategic moves, it’s tempting to write off the whole effort. It’s much easier to hang out with a predictable compiler, isn’t it? Why bother with the social stuff at all?

+ +

Here’s a quote from a  famous lecture by Richard Hamming:

+ +
+

By taking the trouble to tell jokes to the secretaries and being a little friendly, I got superb secretarial help. For instance, one time for some idiot reason all the reproducing services at Murray Hill were tied up. Don’t ask me how, but they were. I wanted something done. My secretary called up somebody at Holmdel, hopped [into] the company car, made the hour-long trip down and got it reproduced, and then came back. It was a payoff for the times I had made an effort to cheer her up, tell her jokes and be friendly; it was that little extra work that later paid off for me. By realizing you have to use the system and studying how to get the system to do your work, you learn how to adapt the system to your desires.

+
+ +

The moral is this: do not underestimate the power of playing the social game. It’s not about tricking or manipulating people; it’s about creating relationships to get things done. Relationships always outlast projects. When you’ve got richer relationships with your coworkers, they’ll be more willing to go the extra mile when you need them.

+
+ +
+

Humility, Respect, and Trust in Practice

+ +

All of this preaching about humility, respect, and trust sounds like a sermon.   Let’s come out of the clouds and think about how to apply these ideas in real-life situations.    We’re going to examine a list of specific behaviors and examples that you can start with. Many of them might sound obvious at first, but after you begin thinking about them, you’ll notice how often you (and your peers) are guilty of not following them—we’ve certainly noticed this about ourselves!

+ +
+

Lose the ego

+ +

OK, this is sort of a simpler way of telling someone without enough humility to lose their ’tude.  Nobody wants to work with someone who consistently behaves like they’re the most important person in the room. Even if you know you’re the wisest person in the discussion, don’t wave it in people’s faces. For example, do you always feel like you need to have the first or last word on every subject? Do you feel the need to comment on every detail in a proposal or discussion? Or do you know somebody who does these things?

+ +

Although it’s important to be humble, that doesn’t mean you need to be a doormat; there’s nothing wrong with self-confidence.  Just don’t come off like a know-it-all. Even better, think about going for a “collective†ego, instead; rather than worrying about whether you’re personally awesome, try to build a sense of team accomplishment and group pride. For example, the Apache Software Foundation has a long history of creating communities around software projects. These communities have incredibly strong identities and reject people who are more concerned with self-promotion.

+ +

Ego manifests itself in many ways, and a lot of the time, it can get in the way of your productivity and slow you down.  Here’s another great story from Hamming’s lecture that illustrates this point perfectly (emphasis ours):

+ +
+

John Tukey almost always dressed very casually. He would go into an important office and it would take a long time before the other fellow realized that this is a first-class man and he had better listen. For a long time, John has had to overcome this kind of hostility. It’s wasted effort! I didn’t say you should conform; I said, “The appearance of conforming gets you a long way.†If you chose to assert your ego in any number of ways, “I am going to do it my way,†you pay a small steady price throughout the whole of your professional career. And this, over a whole lifetime, adds up to an enormous amount of needless trouble. […] By realizing you have to use the system and studying how to get the system to do your work, you learn how to adapt the system to your desires. Or you can fight it steadily, as a small, undeclared war, for the whole of your life.

+
+
+ +
+

Learn to give and take criticism

+ +

A few years ago, Joe started a new job as a programmer.  After his first week, he really began digging into the codebase. Because he cared about what was going on, he started gently questioning other teammates about their contributions. He sent simple code reviews by email, politely asking about design assumptions or pointing out places where logic could be improved. After a couple of weeks, he was summoned to his director’s office. “What’s the problem?†Joe asked. “Did I do something wrong?†The director looked concerned: “We’ve had a lot of complaints about your behavior, Joe. Apparently, you’ve been really harsh toward your teammates, criticizing them left and right. They’re upset. You need to tone it down.†Joe was utterly baffled. Surely, he thought, his code reviews should have been welcomed and appreciated by his peers. In this case, however, Joe should have been more sensitive to the team’s widespread insecurity and should have used a subtler means to introduce code reviews into the culture—perhaps even something as simple as discussing the idea with the team in advance and asking team members to try it out for a few weeks.

+ +

In a professional software engineering environment, criticism is almost never personal—it’s usually just part of the process of making a better project.  The trick is to make sure you (and those around you) understand the difference between a constructive criticism of someone’s creative output and a flat-out assault against someone’s character. The latter is useless—it’s petty and nearly impossible to act on. The former can (and should!) be helpful and give guidance on how to improve. And, most important, it’s imbued with respect: the person giving the constructive criticism genuinely cares about the other person and wants them to improve themselves or their work. Learn to respect your peers and give constructive criticism politely. If you truly respect someone, you’ll be motivated to choose tactful, helpful phrasing—a skill acquired with much practice. We cover this much more in Code Review.

+ +

On the other side of the conversation, you need to learn to accept criticism as well. This means not just being humble about your skills, but trusting that the other person has your best interests (and those of your project!) at heart and doesn’t actually think you’re an idiot. Programming is a skill like anything else: it improves with practice. If a peer pointed out ways in which you could improve your juggling, would you take it as an attack on your character and value as a human being? We hope not. In the same way, your self-worth shouldn’t be connected to the code you write—or any creative project you build. To repeat ourselves: you are not your code. Say that over and over. You are not what you make. You need to not only believe it yourself, but get your coworkers to believe it, too.

+ +

For example, if you have an insecure collaborator, here’s what not to say: “Man, you totally got the control flow wrong on that method there.  You should be using the standard xyzzy code pattern like everyone else.†This feedback is full of antipatterns: you’re telling someone they’re “wrong†(as if the world were black and white), demanding they change something, and accusing them of creating something that goes against what everyone else is doing (making them feel stupid). Your coworker will immediately be put on the offense, and their response is bound to be overly emotional.

+ +

A better way to say the same thing might be, “Hey, I’m confused by the control flow in this section here. I wonder if the xyzzy code pattern might make this clearer and easier to maintain?†Notice how you’re using humility to make the question about you, not them. They’re not wrong; you’re just having trouble understanding the code. The suggestion is merely offered up as a way to clarify things for poor little you while possibly helping the project’s long-term sustainability goals. You’re also not demanding anything—you’re giving your collaborator the ability to peacefully reject the suggestion. The discussion stays focused on the code itself, not on anyone’s value or coding skills.

+
+ +
+

Fail fast and iterate

+ +

There’s a well-known urban legend in the business world about a manager who makes a mistake and loses an impressive $10 million.  He dejectedly goes into the office the next day and starts packing up his desk, and when he gets the inevitable “the CEO wants to see you in his office†call, he trudges into the CEO’s office and quietly slides a piece of paper across the desk.

+ +
+

“What’s this?†asks the CEO.

+ +

“My resignation,†says the executive. “I assume you called me in here to fire me.â€

+ +

“Fire you?†responds the CEO, incredulously. “Why would I fire you? I just spent $10 million training you!â€6

+
+ +

It’s an extreme story, to be sure, but the CEO in this story understands that firing the executive wouldn’t undo the $10 million loss, and it would compound it by losing a valuable executive who he can be very sure won’t make that kind of mistake again.

+ +

At Google, one of our favorite mottos is that “Failure is an option.†It’s widely recognized that if you’re not failing now and then, you’re not being innovative enough or taking enough risks. Failure is viewed as a golden opportunity to learn and improve for the next go-around.7 In fact, Thomas Edison  is often quoted as saying, “If I find 10,000 ways something won’t work, I haven’t failed. I am not discouraged, because every wrong attempt discarded is another step forward.â€

+ +

Over in Google X—the division that works on “moonshots†like self-driving cars and internet access delivered by balloons—failure is deliberately built into its incentive system. People come up with outlandish ideas and coworkers are actively encouraged to shoot them down as fast as possible. Individuals are rewarded (and even compete) to see how many ideas they can disprove or invalidate in a fixed period of time. Only when a concept truly cannot be debunked at a whiteboard by all peers does it proceed to early prototype.     

+
+
+ +
+

Blameless Post-Mortem Culture

+ +

The key to learning from your mistakes is to document your failures  by performing a root-cause  analysis  and writing up a “postmortem,†as it’s called at Google (and many other companies). Take extra care to make sure the postmortem document isn’t just a useless list of apologies or excuses or finger-pointing—that’s not its purpose. A proper postmortem should always contain an explanation of what was learned and what is going to change as a result of the learning experience. Then, make sure that the postmortem is readily accessible and that the team really follows through on the proposed changes. Properly documenting failures also makes it easier for other people (present and future) to know what happened and avoid repeating history. Don’t erase your tracks—light them up like a runway for those who follow you!

+ +

A good postmortem should include the following:

+ +
    +
  • +

    A brief summary of the event

    +
  • +
  • +

    A timeline of the event, from discovery through investigation to resolution

    +
  • +
  • +

    The primary cause of the event

    +
  • +
  • +

    Impact and damage assessment

    +
  • +
  • +

    A set of action items (with owners) to fix the problem immediately

    +
  • +
  • +

    A set of action items to prevent the event from happening again

    +
  • +
  • +

    Lessons learned

    +
  • +
+ +
+

Learn patience

+ +

Years ago, I was writing a tool to convert CVS repositories to Subversion (and later, Git).  Due to the vagaries of CVS, I kept unearthing bizarre bugs. Because my longtime friend and coworker Karl knew CVS quite intimately, we decided we should work together to fix these bugs.

+ +

A problem arose when we began pair programming: I’m a bottom-up engineer who is content to dive into the muck and dig my way out by trying a lot of things quickly and skimming over the details. Karl, however, is a top-down engineer who wants to get the full lay of the land and dive into the implementation of almost every method on the call stack before proceeding to tackle the bug. This resulted in some epic interpersonal conflicts, disagreements, and the occasional heated argument. It got to the point at which the two of us simply couldn’t pair-program together: it was too frustrating for us both.

+ +

That said, we had a longstanding history of trust and respect for each other. Combined with patience, this helped us work out a new method of collaborating. We would sit together at the computer, identify the bug, and then split up and attack the problem from two directions at once (top-down and bottom-up) before coming back together with our findings. Our patience and willingness to improvise new working styles not only saved the project, but also our friendship.

+
+ +
+

Be open to influence

+ +

The more open you are to influence, the more you are able to influence; the more vulnerable you are, the stronger you appear.  These statements sound like bizarre contradictions. But everyone can think of someone they’ve worked with who is just maddeningly stubborn—no matter how much people try to persuade them, they dig their heels in even more. What eventually happens to such team members? In our experience, people stop listening to their opinions or objections; instead, they end up “routing around†them like an obstacle everyone takes for granted. You certainly don’t want to be that person, so keep this idea in your head: it’s OK for someone else to change your mind. In the opening chapter of this book, we said that engineering is inherently about trade-offs. It’s impossible for you to be right about everything all the time unless you have an unchanging environment and perfect knowledge, so of course you should change your mind when presented with new evidence. Choose your battles carefully: to be heard properly, you first need to listen to others. It’s better to do this listening before putting a stake in the ground or firmly announcing a decision—if you’re constantly changing your mind, people will think you’re wishy-washy.

+ +

The idea of vulnerability can seem strange, too.  If someone admits ignorance of the topic at hand or the solution to a problem, what sort of credibility will they have in a group? Vulnerability is a show of weakness, and that destroys trust, right? 

+ +

Not true. Admitting that you’ve made a mistake or you’re simply out of your league can increase your status over the long run. In fact, the willingness to express vulnerability is an outward show of humility, it demonstrates accountability and the willingness to take responsibility, and it’s a signal that you trust others’ opinions. In return, people end up respecting your honesty and strength. Sometimes, the best thing you can do is just say, “I don’t know.â€

+ +

Professional politicians, for example, are notorious for never admitting error or ignorance, even when it’s patently obvious that they’re wrong or unknowledgeable about a subject. This behavior exists primarily because politicians are constantly under attack by their opponents, and it’s why most people don’t believe a word that politicians say. When you’re writing software, however, you don’t need to be continually on the defensive—your teammates are collaborators, not competitors. You all have the same goal.    

+
+
+ +
+

Being Googley

+ +

At Google, we have our own internal version of the principles of “humility, respect, and trust†when it comes to behavior and human interactions.   

+ +

From the earliest days of our culture, we often referred to actions as being “Googley†or “not Googley.†The word was never explicitly defined; rather, everyone just sort of took it to mean “don’t be evil†or “do the right thing†or “be good to each other.†Over time, people also started using the term “Googley†as an informal test for culture-fit whenever we would interview a candidate for an engineering job, or when writing internal performance reviews of one another. People would often express opinions about others using the term; for example, “the person coded well, but didn’t seem to have a very Googley attitude.â€

+ +

Of course, we eventually realized that the term “Googley†was being overloaded with meaning; worse yet, it could become a source of unconscious bias in hiring or evaluations. If “Googley†means something different to every employee, we run the risk of the term starting to mean “is just like me.†Obviously, that’s not a good test for hiring—we don’t want to hire people “just like me,†but people from a diverse set of backgrounds and with different opinions and experiences. An interviewer’s personal desire to have a beer with a candidate (or coworker) should never be considered a valid signal about somebody else’s performance or ability to thrive at Google.   

+ +

Google eventually fixed the problem by explicitly defining a rubric for what we mean by “Googleynessâ€â€”a set of attributes and behaviors that we look for that represent strong leadership and exemplify “humility, respect, and trustâ€:

+ +
+
Thrives in ambiguity
+
Can deal with conflicting messages or directions, build consensus, and make progress against a problem, even when the environment is constantly shifting.
+
Values feedback
+
Has humility to both receive and give feedback gracefully and understands how valuable feedback is for personal (and team) development.
+
Challenges status quo
+
Is able to set ambitious goals and pursue them even when there might be resistance or inertia from others.
+
Puts the user first
+
Has empathy and respect for users of Google’s products and pursues actions that are in their best interests.
+
Cares about the team
+
Has empathy and respect for coworkers and actively works to help them without being asked, improving team cohesion.
+
Does the right thing
+
Has a strong sense of ethics about everything they do; willing to make difficult or inconvenient decisions to protect the integrity of the team and product.
+
+ +

Now that we have these best-practice behaviors better defined, we’ve begun to shy away from using the term “Googley.†It’s always better to be specific about expectations!

+
+
+ +
+

Conclusion

+ +

The foundation for almost any software endeavor—of almost any size—is a well-functioning team. Although the Genius Myth of the solo software developer still persists, the truth is that no one really goes it alone. For a software organization to stand the test of time, it must have a healthy culture, rooted in humility, trust, and respect that revolves around the team, rather than the individual. Further, the creative nature of software development requires that people take risks and occasionally fail; for people to accept that failure, a healthy team environment must exist. 

+
+ +
+

TL;DRs

+ +
    +
  • +

    Be aware of the trade-offs of working in isolation.

    +
  • +
  • +

    Acknowledge the amount of time that you and your team spend communicating and in interpersonal conflict. A small investment in understanding personalities and working styles of yourself and others can go a long way toward improving productivity.

    +
  • +
  • +

    If you want to work effectively with a team or a large organization, be aware of your preferred working style and that of others.

    +
  • +
+
+

1Ben Collins-Sussman, also an author within this book.

2Literally, if you are, in fact, a bike designer.

3I should note that sometimes it’s dangerous to get too much feedback too early in the process if you’re still unsure of your general direction or goal.

4I do, however, acknowledge that serious introverts likely need more peace, quiet, and alone time than most people and might benefit from a quieter environment, if not their own office.

5This is incredibly difficult if you’ve been burned in the past by delegating to incompetent people.

6You can find a dozen variants of this legend on the web, attributed to different famous managers.

7By the same token, if you do the same thing over and over and keep failing, it’s not failure, it’s incompetence.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch03.html b/clones/abseil.io/resources/swe-book/html/ch03.html new file mode 100644 index 00000000..a976e6ec --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch03.html @@ -0,0 +1,542 @@ + + + + + Software Engineering at Google + + + + +
+

Knowledge Sharing

+ + + + + +

Your organization understands your problem domain better than some random person on the internet; your organization should be able to answer most of its own questions.  To achieve that, you need both experts who know the answers to those questions and mechanisms to distribute their knowledge, which is what we’ll explore in this chapter. These mechanisms range from the utterly simple (Ask questions; Write down what you know) to the much more structured, such as tutorials and classes.  Most importantly, however, your organization needs a culture of learning, and that requires creating the psychological safety that permits people to admit to a lack of knowledge.

+ +
+

Challenges to Learning

+ +

Sharing expertise across an organization is not an easy task.   Without a strong culture of learning, challenges can emerge. Google has experienced a number of these challenges, especially as the company has scaled:

+ +
+
Lack of psychological safety
+
An environment in which people are afraid to take risks or make mistakes in front of others because they fear being punished for it. This often manifests as a culture of fear or a tendency to avoid transparency. 
+
Information islands
+
+

Knowledge fragmentation that occurs in different parts of an organization that don’t communicate  with one another or use shared resources. In such an environment, each group develops its own way of doing things.1 This often leads to the following:

+
+
Information fragmentation
+

Each island has an incomplete picture of the bigger whole.

+
Information duplication
+

Each island has reinvented its own way of doing something.

+
Information skew
+

Each island has its own ways of doing the same thing, and these might or might not conflict.

+
+
+
Single point of failure (SPOF)
+

A bottleneck that occurs when critical information is available from only a single person.  This is related to bus factor, which is discussed in more detail in How to Work Well on Teams.

+

SPOFs can arise out of good intentions: it can be easy to fall into a habit of “Let me take care of that for you.†But this approach optimizes for short-term efficiency (“It’s faster for me to do itâ€) at the cost of poor long-term scalability (the team never learns how to do whatever it is that needs to be done). This mindset also tends to lead to all-or-nothing expertise.

+
All-or-nothing expertise
+
A group of people that is split between people who know “everything†and novices, with little middle ground.  This problem often reinforces itself if experts always do everything themselves and don’t take the time to develop new experts through mentoring or documentation. In this scenario, knowledge and responsibilities continue to accumulate on those who already have expertise, and new team members or novices are left to fend for themselves and ramp up more slowly.
+
Parroting
+
Mimicry without understanding. This is typically characterized by mindlessly copying patterns or code without understanding their purpose, often under the assumption that said code is needed for unknown reasons. 
+
Haunted graveyards
+
Places, often in code, that people avoid touching or changing because they are afraid that something might go wrong.  Unlike the aforementioned parroting, haunted graveyards are characterized by people avoiding action because of fear and superstition.
+
+ +

In the rest of this chapter, we dive into strategies that Google’s engineering organizations have found to be successful in addressing these challenges.

+
+ +
+

Philosophy

+ +

Software engineering can be defined as the multiperson development of multiversion programs.2 People are at the core of software engineering: code is an important output but only a small part of building a product.  Crucially, code does not emerge spontaneously out of nothing, and neither does expertise. Every expert was once a novice: an organization’s success depends on growing and investing in its people.

+ +

Personalized, one-to-one advice from an expert is always invaluable. Different team members have different areas of expertise, and so the best teammate to ask for any given question will vary.  But if the expert goes on vacation or switches teams, the team can be left in the lurch. And although one person might be able to provide personalized help for one-to-many, this doesn’t scale and is limited to small numbers of “many.â€

+ +

Documented knowledge, on the other hand, can better scale not just to the team but to the entire organization.  Mechanisms such as a team wiki enable many authors to share their expertise with a larger group. But even though written documentation is more scalable than one-to-one conversations, that scalability comes with some trade-offs: it might be more generalized and less applicable to individual learners’ situations, and it comes with the added maintenance cost required to keep information relevant and up to date over time.

+ +

Tribal knowledge exists in the gap between what individual team members know and what is documented.  Human experts know these things that aren’t written down. If we document that knowledge and maintain it, it is now available not only to somebody with direct one-to-one access to the expert today, but to anybody who can find and view the documentation.

+ +

So in a magical world in which everything is always perfectly and immediately documented, we wouldn’t need to consult a person any more, right? Not quite. Written knowledge has scaling advantages, but so does targeted human help. A human expert can synthesize their expanse of knowledge. They can assess what information is applicable to the individual’s use case, determine whether the documentation is still relevant, and know where to find it. Or, if they don’t know where to find the answers, they might know who does.

+ +

Tribal and written knowledge complement each other. Even a perfectly expert team with perfect documentation needs to communicate with one another, coordinate with other teams, and adapt their strategies over time. No single knowledge-sharing approach is the correct solution for all types of learning, and the particulars of a good mix will likely vary based on your organization.  Institutional knowledge evolves over time, and the knowledge-sharing methods that work best for your organization will likely change as it grows. Train, focus on learning and growth, and build your own stable of experts: there is no such thing as too much engineering expertise.

+
+ +
+

Setting the Stage: Psychological Safety

+ +

Psychological  safety is critical to  promoting a learning environment.

+ +

To learn, you must first acknowledge that there are things you don’t understand. We should welcome such honesty rather than punish it. (Google does this pretty well, but sometimes engineers are reluctant to admit they don’t understand something.)

+ +

An enormous part of learning is being able to try things and feeling safe to fail. In a healthy environment, people feel comfortable asking questions, being wrong, and learning new things. This is a baseline expectation for all Google teams; indeed, our research has shown that psychological safety is the most important part of an effective team.

+ +
+

Mentorship

+ +

At Google, we try to set the tone as soon as a “Noogler†(new Googler) engineer joins the company.   One important way of building psychological safety is to assign Nooglers a mentor—someone who is not their team member, manager, or tech lead—whose responsibilities explicitly include answering questions and helping the Noogler ramp up. Having an officially assigned mentor to ask for help makes it easier for the newcomer and means that they don’t need to worry about taking up too much of their coworkers’ time.

+ +

A mentor is a volunteer who has been at Google for more than a year and who is available to advise on anything from using Google infrastructure to navigating Google culture. Crucially, the mentor is there to be a safety net to talk to if the mentee doesn’t know whom else to ask for advice. This mentor is not on the same team as the mentee, which can make the mentee feel more comfortable about asking for help in tricky situations.

+ +

Mentorship formalizes and facilitates learning, but learning itself is an ongoing process. There will always be opportunities for coworkers to learn from one another, whether it’s a new employee joining the organization or an experienced engineer learning a new technology. With a healthy team, teammates will be open not just to answering but also to asking questions: showing that they don’t know something and learning from one another.

+
+ +
+

Psychological Safety in Large Groups

+ +

Asking a nearby teammate for help is easier than approaching a large group of mostly strangers.  But as we’ve seen, one-to-one solutions don’t scale well. Group solutions are more scalable, but they are also scarier. It can be intimidating for novices to form a question and ask it of a large group, knowing that their question might be archived for many years. The need for psychological safety is amplified in large groups. Every member of the group has a role to play in creating and maintaining a safe environment that ensures that newcomers are confident asking questions and up-and-coming experts feel empowered to help those newcomers without the fear of having their answers attacked by established experts.

+ +

The most important way to achieve this safe and welcoming environment is for group interactions to  be  cooperative,  not adversarial. Table 3-1 lists some examples of recommended patterns (and their corresponding antipatterns) of group interactions.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3-1. Group interaction patterns
Recommended patterns (cooperative)Antipatterns (adversarial)
Basic questions or mistakes are guided in the proper directionBasic questions or mistakes are picked on, and the person asking the question is chastised
Explanations are given with the intent of helping the person asking the question learnExplanations are given with the intent of showing off one’s own knowledge
Responses are kind, patient, and helpfulResponses are condescending, snarky, and unconstructive
Interactions are shared discussions for finding solutionsInteractions are arguments with “winners†and “losersâ€
+ +

These antipatterns can emerge unintentionally: someone might be trying to be helpful but is accidentally condescending and unwelcoming.  We find the Recurse Center’s social rules to be helpful here:

+ +
+
No feigned surprise ("What?! I can’t believe you don’t know what the stack is!")
+
Feigned surprise is a barrier to psychological safety and makes members of the group afraid of admitting to a lack of knowledge.
+
No “well-actuallysâ€
+
Pedantic corrections that tend to be about grandstanding rather than precision.
+
No back-seat driving
+
Interrupting an existing discussion to offer opinions without committing to the conversation.
+
No subtle “-isms†("It’s so easy my grandmother could do it!â€)
+
Small expressions  of bias (racism, ageism, homophobia) that can make individuals feel unwelcome, disrespected, or unsafe.  
+
+
+
+ +
+

Growing Your Knowledge

+ +

Knowledge sharing starts with yourself.  It is important to recognize that you always have something to learn. The following guidelines allow you to augment your own personal knowledge.

+ +
+

Ask Questions

+ +

If you take away only a single thing from this chapter, it is this: always be learning; always be asking questions.   

+ +

We tell Nooglers that ramping up can take around six months. This extended period is necessary to ramp up on Google’s large, complex infrastructure, but it also reinforces the idea that learning is an ongoing, iterative process. One of the biggest mistakes that beginners make is not to ask for help when they’re stuck. You might be tempted to struggle through it alone or feel fearful that your questions are “too simple.†“I just need to try harder before I ask anyone for help,†you think. Don’t fall into this trap! Your coworkers are often the best source of information: leverage this valuable resource.

+ +

There is no magical day when you suddenly always know exactly what to do in every situation—there’s always more to learn. Engineers who have been at Google for years still have areas in which they don’t feel like they know what they are doing, and that’s OK! Don’t be afraid to say "I don’t know what that is; could you explain it?" Embrace not knowing things as an area of opportunity rather than one to fear.3

+ +

It doesn’t matter whether you’re new to a team or a senior leader: you should always be in an environment in which there’s something to learn. If not, you stagnate (and should find a new environment).

+ +

It’s especially critical for those in leadership roles to model this behavior: it’s important not to mistakenly equate “seniority†with “knowing everything.†In fact, the more you know, the more you know you don’t know. Openly asking questions4 or expressing gaps in knowledge reinforces that it’s OK for others to do the same.

+ +

On the receiving end, patience and kindness when answering questions fosters an environment in which people feel safe looking for help.  Making it easier to overcome the initial hesitation to ask a question sets the tone early: reach out to solicit questions, and make it easy for even “trivial†questions to get an answer. Although engineers could probably figure out tribal knowledge on their own, they’re not here to work in a vacuum. Targeted help allows engineers to be productive faster, which in turn makes their entire team more productive.

+
+ +
+

Understand Context

+ +

Learning is not just about understanding new things; it also includes developing an understanding of the decisions behind the design and implementation of existing things.   Suppose that your team inherits a legacy codebase for a critical piece of infrastructure that has existed for many years. The original authors are long gone, and the code is difficult to understand. It can be tempting to rewrite from scratch rather than spend time learning the existing code. But instead of thinking “I don’t get it†and ending your thoughts there, dive deeper: what questions should you be asking?

+ +

Consider  the principle of “Chesterton’s fenceâ€: before removing or changing something, first understand why it’s there.

+ +
+

In the matter of reforming things, as distinct from deforming them, there is one plain and simple principle; a principle which will probably be called a paradox. There exists in such a case a certain institution or law; let us say, for the sake of simplicity, a fence or gate erected across a road. The more modern type of reformer goes gaily up to it and says, "I don’t see the use of this; let us clear it away.†To which the more intelligent type of reformer will do well to answer: "If you don’t see the use of it, I certainly won’t let you clear it away. Go away and think. Then, when you can come back and tell me that you do see the use of it, I may allow you to destroy it."

+
+ +

This doesn’t mean that code can’t lack clarity or that existing design patterns can’t be wrong, but engineers have a tendency to reach for “this is bad!†far more quickly than is often warranted, especially for unfamiliar code, languages, or paradigms. Google is not immune to this. Seek out and understand context, especially for decisions that seem unusual. After you’ve understood the context and purpose of the code, consider whether your change still makes sense. If it does, go ahead and make it; if it doesn’t, document your reasoning for future readers.

+ +

Many Google style guides explicitly include context to help readers understand the rationale behind the style guidelines instead of just memorizing a list of arbitrary rules. More subtly, understanding the rationale behind a given guideline allows authors to make informed decisions about when the guideline shouldn’t apply or whether the guideline needs updating.  See Style Guides and Rules.

+
+
+ +
+

Scaling Your Questions: Ask the Community

+ +

Getting one-to-one help is high bandwidth but necessarily limited in scale.    And as a learner, it can be difficult to remember every detail. Do your future self a favor: when you learn something from a one-to-one discussion, write it down.

+ +

Chances are that future newcomers will have the same questions you had. Do them a favor, too, and share what you write down.

+ +

Although sharing the answers you receive can be useful, it’s also beneficial to seek help not from individuals but from the greater community. In this section, we examine different forms of community-based learning. Each of these approaches—group chats, mailing lists, and question-and-answer systems—have different trade-offs and complement one another. But each of them enables the knowledge seeker to get help from a broader community of peers and experts and also ensures that answers are broadly available to current and future members of that community.

+ +
+

Group Chats

+ +

When you have a question, it can sometimes be difficult to get help from the right person.  Maybe you’re not sure who knows the answer, or the person you want to ask is busy. In these situations, group chats are great, because you can ask your question to many people at once and have a quick back-and-forth conversation with whoever is available. As a bonus, other members of the group chat can learn from the question and answer, and many forms of group chat can be automatically archived and searched later.

+ +

Group chats tend to be devoted either to topics or to teams. Topic-driven group chats are typically open so that anyone can drop in to ask a question. They tend to attract experts and can grow quite large, so questions are usually answered quickly. Team-oriented chats, on the other hand, tend to be smaller and restrict membership. As a result, they might not have the same reach as a topic-driven chat, but their smaller size can feel safer to a newcomer.

+ +

Although group chats are great for quick questions, they don’t provide much structure, which can make it difficult to extract meaningful information from a conversation in which you’re not actively involved. As soon as you need to share information outside of the group, or make it available to refer back to later, you should write a document or email a mailing list.

+
+ +
+

Mailing Lists

+ +

Most topics at Google have a [email protected] or [email protected] Google Groups mailing list that anyone at the company can join or email.  Asking a question on a public mailing list is a lot like asking a group chat: the question reaches a lot of people who could potentially answer it and anyone following the list can learn from the answer. Unlike group chats, though, public mailing lists are easy to share with a wider audience: they are packaged into searchable archives, and email threads provide more structure than group chats. At Google, mailing lists are also indexed and can be discovered by Moma, Google’s intranet search engine.

+ +

When you find an answer to a question you asked on a mailing list, it can be tempting to get on with your work. Don’t do it! You never know when someone will need the same information in the future, so it’s a best practice to post the answer back to the list.

+ +

Mailing lists are not without their trade-offs. They’re well suited for complicated questions that require a lot of context, but they’re clumsy for the quick back-and-forth exchanges at which group chats excel. A thread about a particular problem is generally most useful while it is active. Email archives are immutable, and it can be hard to determine whether an answer discovered in an old discussion thread is still relevant to a present-day situation. Additionally, the signal-to-noise ratio can be lower than other mediums like formal documentation because the problem that someone is having with their specific workflow might not be applicable to you.

+ + +
+ +
+

YAQS: Question-and-Answer Platform

+ +

YAQS (“Yet Another Question Systemâ€) is a Google-internal version of a Stack Overflow–like website, making it easy for Googlers to link to existing or work-in-progress code as well as discuss confidential information.  

+ +

Like Stack Overflow, YAQS shares many of the same advantages of mailing lists and adds refinements: answers marked as helpful are promoted in the user interface, and users can edit questions and answers so that they remain accurate and useful as code and facts change. As a result, some mailing lists have been superseded by YAQS, whereas others have evolved into more general discussion lists that are less focused on problem solving.   

+
+
+ +
+

Scaling Your Knowledge: You Always Have Something to Teach

+ +

Teaching is not limited to experts, nor is expertise a binary state in which you are either a novice or an expert.  Expertise is a multidimensional vector of what you know: everyone has varying levels of expertise across different areas. This is one of the reasons why diversity is critical to organizational success: different people bring different perspectives and expertise to the table (see Engineering for Equity). Google engineers teach others in a variety of ways, such as office hours, giving tech talks, teaching classes, writing documentation, and reviewing code.

+ +
+

Office Hours

+ +

Sometimes it’s really important to have a human to talk to, and in those instances, office hours can be a good solution.  Office hours are a regularly scheduled (typically weekly) event during which one or more people make themselves available to answer questions about a particular topic. Office hours are almost never the first choice for knowledge sharing: if you have an urgent question, it can be painful to wait for the next session for an answer; and if you’re hosting office hours, they take up time and need to be regularly promoted. That said, they do provide a way for people to talk to an expert in person. This is particularly useful if the problem is still ambiguous enough that the engineer doesn’t yet know what questions to ask (such as when they’re just starting to design a new service) or whether the problem is about something so specialized that there just isn’t documentation on it.

+
+ +
+

Tech Talks and Classes

+ +

Google has a robust culture of both internal and external5 tech talks and classes. Our engEDU (Engineering Education) team   focuses on providing Computer Science education to many audiences, ranging from Google engineers to students around the world. At a more grassroots level, our g2g (Googler2Googler) program lets Googlers sign up to give or attend talks and classes from fellow Googlers.6 The program is wildly successful, with thousands of participating Googlers teaching topics from the technical (e.g., “Understanding Vectorization in Modern CPUsâ€) to the just-for-fun (e.g., "Beginner Swing Dance").

+ +

Tech talks typically consist of a speaker presenting directly to an audience. Classes, on the other hand, can have a lecture component but often center on in-class exercises and therefore require more active participation from attendees. As a result, instructor-led classes are typically more demanding and expensive to create and maintain than tech talks and are reserved for the most important or difficult topics. That said, after a class has been created, it can be scaled relatively easily because many instructors can teach a class from the same course materials. We’ve found that classes tend to work best when the following circumstances exist:

+ +
    +
  • +

    The topic is complicated enough that it’s a frequent source of misunderstanding. Classes take a lot of work to create, so they should be developed only when they’re addressing specific needs.

    +
  • +
  • +

    The topic is relatively stable. Updating class materials is a lot of work, so if the subject is rapidly evolving, other forms of sharing knowledge will have a better bang for the buck.

    +
  • +
  • +

    The topic benefits from having teachers available to answer questions and provide personalized help. If students can easily learn without directed help, self-serve mediums like documentation or recordings are more efficient. A number of introductory classes at Google also have self-study versions.

    +
  • +
  • +

    There is enough demand to offer the class regularly. Otherwise, potential learners will get the information they need in other ways rather than waiting for the class. At Google, this is particularly a problem for small, geographically remote offices.

    +
  • +
+
+ +
+

Documentation

+ +

Documentation is written knowledge whose primary goal is to help its readers learn something.  Not all written knowledge is necessarily documentation, although it can be useful as a paper trail. For example, it’s possible to find an answer to a problem in a mailing list thread, but the primary goal of the original question on the thread was to seek answers, and only secondarily to document the discussion for others.

+ +

In this section, we focus on spotting opportunities for contributing to and creating formal documentation, from small things like fixing a typo to larger efforts such as documenting tribal knowledge.

+ +
Note
+

For a more comprehensive discussion of documentation, see Documentation.

+
+ +
+

Updating documentation

+ +

The first time you learn something is the best time to see ways that the existing documentation and training materials can be improved.  By the time you’ve absorbed and understood a new process or system, you might have forgotten what was difficult or what simple steps were missing from the “Getting Started†documentation. At this stage, if you find a mistake or omission in the documentation, fix it! Leave the campground cleaner than you found it,7 and try to update the documents yourself, even when that documentation is owned by a different part of the organization.

+ +

At Google, engineers feel empowered to update documentation regardless of who owns it—and we often do—even if the fix is as small as correcting a typo. This level of community upkeep increased notably with the introduction of g3doc,8 which made it much easier for Googlers to find a documentation owner to review their suggestion. It also leaves an auditable trail of change history no different than that for code.

+
+ +
+

Creating documentation

+ +

As your proficiency grows, write your own documentation and update existing docs.  For example, if you set up a new development flow, document the steps. You can then make it easier for others to follow in your path by pointing them to your document. Even better, make it easier for people to find the document themselves. Any sufficiently undiscoverable or unsearchable documentation might as well not exist. This is another area in which g3doc shines because the documentation is predictably located right next to the source code, as opposed to off in an (unfindable) document or webpage somewhere.

+ +

Finally, make sure there’s a mechanism for feedback.  If there’s no easy and direct way for readers to indicate that documentation is outdated or inaccurate, they are likely not to bother telling anyone, and the next newcomer will come across the same problem. People are more willing to contribute changes if they feel that someone will actually notice and consider their suggestions. At Google, you can file a documentation bug directly from the document itself.

+ +

In addition, Googlers can easily leave comments on g3doc pages. Other Googlers can see and respond to these comments and, because leaving a comment automatically files a bug for the documentation owner, the reader doesn’t need to figure out who to contact.

+
+ +
+

Promoting documentation

+ +

Traditionally, encouraging engineers to document their work can be difficult. Writing documentation takes time and effort that could be spent on coding, and the benefits that result from  that work are not immediate and are mostly reaped by others. Asymmetrical trade-offs like these are good for the organization as a whole given that many people can benefit from the time investment of a few, but without good incentives, it can be challenging to encourage such behavior. We discuss some of these structural incentives in the section Incentives and recognition.

+ +

However, a document author can often directly benefit from writing documentation. Suppose that team members always ask you for help debugging certain kinds of production failures. Documenting your procedures requires an upfront investment of time, but after that work is done, you can save time in the future by pointing team members to the documentation and providing hands-on help only when needed.

+ +

Writing documentation also helps your team and organization scale. First, the information in the documentation becomes canonicalized as a reference: team members can refer to the shared document and even update it themselves. Second, the canonicalization may spread outside the team. Perhaps some parts of the documentation are not unique to the team’s configuration and become useful for other teams looking to resolve similar problems. 

+
+
+ +
+

Code

+ +

At a meta level, code is knowledge, so the very act of writing code can be considered a form of knowledge transcription.  Although knowledge sharing might not be a direct intent of production code, it is often an emergent side effect, which can be facilitated by code readability and clarity. 

+ +

Code documentation is one way to share knowledge; clear documentation not only benefits consumers of the library, but also future maintainers.  Similarly, implementation comments transmit knowledge across time: you’re writing these comments expressly for the sake of future readers (including Future You!). In terms of trade-offs, code comments are subject to the same downsides as general documentation: they need to be actively maintained or they can quickly become out of date, as anyone who has ever read a comment that directly contradicts the code can attest.

+ +

Code reviews (see Code Review) are often a learning opportunity  for both author(s) and reviewer(s). For example, a reviewer’s suggestion might introduce the author to a new testing pattern, or a reviewer might learn of a new library by seeing the author use it in their code.  Google standardizes mentoring through code review with the readability process, as detailed in  the case study at the end of this chapter. 

+
+
+ +
+

Scaling Your Organization’s Knowledge

+ +

Ensuring that expertise is appropriately shared across the organization becomes more difficult as the organization grows.  Some things, like culture, are important at every stage of growth, whereas others, like establishing canonical sources of information, might be more beneficial for more mature organizations.

+ +
+

Cultivating a Knowledge-Sharing Culture

+ +

Organizational culture is the squishy human thing that many companies treat as an afterthought.   But at Google, we believe that focusing on the culture and environment first9 results in better outcomes than focusing on only the output—such as the code—of that environment.

+ +

Making major organizational shifts is difficult, and countless books have been written on the topic. We don’t pretend to have all the answers, but we can share specific steps Google has taken to create a culture that promotes learning.

+ +

See the book Work Rules!10 for a more in-depth examination of Google’s culture.

+ +
+

Respect

+ +

The bad behavior of just a few individuals can make an entire team or community unwelcoming. In such an environment,  novices learn to take their questions elsewhere, and potential new experts stop trying and don’t have room to grow. In the worst cases, the group reduces to its most toxic members. It can be difficult to recover from this state.

+ +

Knowledge sharing can and should be done with kindness and respect.  In tech, tolerance—or worse, reverence—of the “brilliant jerk†is both  pervasive and harmful, but being an expert and being kind are not mutually exclusive. The Leadership section of Google’s software engineering job ladder outlines this clearly:

+ +
+

Although a measure of technical leadership is expected at higher levels, not all leadership is directed at technical problems. Leaders improve the quality of the people around them, improve the team’s psychological safety, create a culture of teamwork and collaboration, defuse tensions within the team, set an example of Google’s culture and values, and make Google a more vibrant and exciting place to work. Jerks are not good leaders.

+
+ +

This expectation is modeled by senior leadership: Urs Hölzle (Senior Vice President of Technical Infrastructure) and Ben Treynor Sloss (Vice President, Founder of Google SRE) wrote a regularly cited internal document (“No Jerksâ€) about why Googlers should care about respectful behavior at work and what to do about it.

+
+ +
+

Incentives and recognition

+ +

Good culture must be actively nurtured, and encouraging  a culture of knowledge sharing requires a commitment to recognizing and rewarding it at a systemic level. It’s a common mistake for organizations to pay lip service to a set of values while actively rewarding behavior that does not enforce those values. People react to incentives over platitudes, and so it’s important to put your money where your mouth is by putting in place a system of compensation and awards.

+ +

Google uses a variety of  recognition mechanisms, from company-wide standards such as performance review and promotion criteria to peer-to-peer awards between Googlers.

+ +

Our software engineering ladder, which we use to calibrate rewards like compensation and promotion across the company, encourages engineers to share knowledge by noting these expectations explicitly. At more senior levels, the ladder explicitly calls out the importance of wider influence, and this expectation increases as seniority increases. At the highest levels, examples of leadership include the following:

+ +
    +
  • +

    Growing future leaders by serving as mentors to junior staff, helping them develop both technically and in their Google role

    +
  • +
  • +

    Sustaining and developing the software community at Google via code and design reviews, engineering education and development, and expert guidance to others in the field

    +
  • +
+ +
Note
+

See Chapters How to Lead a Team and Leading at Scale for more on leadership.

+
+ +

Job ladder expectations are a top-down way to direct a culture, but culture is also formed from the bottom up.  At Google, the peer bonus program is one way we embrace the bottom-up culture. Peer bonuses are a monetary award and formal recognition that any Googler can bestow on any other Googler for above-and-beyond work.11 For example, when Ravi sends a peer bonus to Julia for being a top contributor to a mailing list—regularly answering questions that benefit many readers—he is publicly recognizing her knowledge-sharing work and its impact beyond her team. Because peer bonuses are employee driven, not management driven, they can have an important and powerful grassroots effect.

+ +

Similar to peer bonuses  are kudos: public acknowledgement of contributions (typically smaller in impact or effort than those meriting a peer bonus) that boost the visibility of peer-to-peer contributions.

+ +

When a Googler gives another Googler a peer bonus or kudos, they can choose to copy additional groups or individuals on the award email, boosting recognition of the peer’s work. It’s also common for the recipient’s manager to forward the award email to the team to celebrate one another’s achievements.

+ +

A system in which people can formally and easily recognize their peers is a powerful tool for encouraging peers to keep doing the awesome things they do. It’s not the bonus that matters: it’s the peer acknowledgement.  

+
+
+ +
+

Establishing Canonical Sources of Information

+ +

Canonical sources of  information are  centralized, company-wide corpuses of information that provide a way to standardize and propagate expert knowledge. They work best for information that is relevant to all engineers within the organization, which is otherwise prone to information islands. For example, a guide to setting up a basic developer workflow should be made canonical, whereas a guide for running a local Frobber instance is more relevant just to the engineers working on Frobber.

+ +

Establishing canonical sources of information requires higher investment than maintaining more localized information such as team documentation, but it also has broader benefits. Providing centralized references for the entire organization makes broadly required information easier and more predictable to find and counters problems with information fragmentation that can arise when multiple teams grappling with similar problems produce their own—often conflicting—guides.

+ +

Because canonical information is highly visible and intended to provide a shared understanding at the organizational level, it’s important that the content is actively maintained and vetted by subject matter experts. The more complex a topic, the more critical it is that canonical content has explicit owners. Well-meaning readers might see that something is out of date but lack the expertise to make the significant structural changes needed to fix it, even if tooling makes it easy to suggest updates.

+ +

Creating and maintaining centralized, canonical sources of information is expensive and time consuming, and not all content needs to be shared at an organizational level. When considering how much effort to invest in this resource, consider your audience. Who benefits from this information? You? Your team? Your product area? All engineers? 

+ +
+

Developer guides

+ +

Google has a broad and deep set of  official guidance  for engineers, including style guides, official software engineering best practices,12 guides for code review13 and testing,14 and Tips of the Week (TotW).15

+ +

The corpus of information is so large that it’s impractical to expect engineers to read it all end to end, much less be able to absorb so much information at once. Instead, a human expert already familiar with a guideline can send a link to a fellow engineer, who then can read the reference and learn more. The expert saves time by not needing to personally explain a company-wide practice, and the learner now knows that there is a canonical source of trustworthy information that they can access whenever necessary. Such a process scales knowledge because it enables human experts to recognize and solve a specific information need by leveraging common, scalable resources.

+
+ + + +
+

Codelabs

+ +

Google codelabs are guided, hands-on  tutorials that teach engineers  new concepts or processes by combining explanations, working best-practice example code, and code exercises.17 A canonical collection of codelabs for technologies broadly used across Google is available at go/codelab. These codelabs go through several rounds of formal review and testing before publication. Codelabs are an interesting halfway point between static documentation and instructor-led classes, and they share the best and worst features of each. Their hands-on nature makes them more engaging than traditional documentation, but engineers can still access them on demand and complete them on their own; but they are expensive to maintain and are not tailored to the learner’s specific needs.

+
+ +
+

Static analysis

+ +

Static analysis tools are a powerful way to share best practices that can be checked programmatically.   Every programming language has its own particular static analysis tools, but they have the same general purpose: to alert code authors and reviewers to ways in which code can be improved to follow style and best practices. Some tools go one step further and offer to automatically apply those improvements to the code.

+ +
Note
+

See Static Analysis for details on static analysis tools and how they’re used at Google.

+
+ +

Setting up static analysis tools requires an upfront investment, but as soon as they are in place, they scale efficiently. When a check for a best practice is added to a tool, every engineer using that tool becomes aware of that best practice. This also frees up engineers to teach other things: the time and effort that would have gone into manually teaching the (now automated) best practice can instead be used to teach something else. Static analysis tools augment engineers’ knowledge. They enable an organization to apply more best practices and apply them more consistently than would otherwise be possible.  

+
+
+ +
+

Staying in the Loop

+ +

Some information is critical to do one’s job, such as knowing how to do a typical development workflow.  Other information, such as updates on popular productivity tools, is less critical but still useful. For this type of knowledge, the formality of the information sharing medium depends on the importance of the information being delivered. For example, users expect official documentation to be kept up to date, but typically have no such expectation for newsletter content, which therefore requires less maintenance and upkeep from the owner.

+ +
+

Newsletters

+ +

Google has a number of company-wide newsletters that  are sent to all engineers, including EngNews (engineering news), Ownd (Privacy/Security news), and Google’s Greatest Hits (report of the most interesting outages of the quarter). These are a good way to communicate information that is of interest to engineers but isn’t mission critical. For this type of update, we’ve found that newsletters get better engagement when they are sent less frequently and contain more useful, interesting content. Otherwise, newsletters can be perceived as spam.

+ +

Even though most Google newsletters are sent via email, some are more creative in their distribution. Testing on the Toilet (testing tips) and Learning on the Loo (productivity tips) are single-page newsletters posted inside toilet stalls. This unique delivery medium helps the Testing on the Toilet and Learning on the Loo stand out from other newsletters, and all issues are archived online.

+ +
Note
+

See Testing Overview for a history of how Testing on the Toilet came to be.

+
+
+ +
+

Communities

+ +

Googlers like to form cross-organizational communities around various topics to share knowledge.  These open channels make it easier to learn from others outside your immediate circle and avoid information islands and duplication. Google Groups are especially popular: Google has thousands of internal groups with varying levels of formality. Some are dedicated to troubleshooting; others, like the Code Health group, are more for discussion and guidance. Internal Google+ is also popular among Googlers as a source of informal information because people will post interesting technical breakdowns or details about projects they  are working on. 

+
+
+
+ +
+

Readability: Standardized Mentorship Through Code Review

+ +

At Google, “readability†refers to more than just code  readability; it is a standardized,    Google-wide mentorship process for disseminating programming language best practices. Readability covers a wide breadth of expertise, including but not limited to language idioms, code structure, API design, appropriate use of common libraries, documentation, and test coverage.

+ +

Readability started as a one-person effort. In Google’s early days, Craig Silverstein (employee ID #3) would sit down in person with every new hire and do a line-by-line “readability review†of their first major code commit. It was a nitpicky review that covered everything from ways the code could be improved to whitespace conventions. This gave Google’s codebase a uniform appearance but, more important, it taught best practices, highlighted what shared infrastructure was available, and showed new hires what it’s like to write code at Google.

+ +

Inevitably, Google’s hiring rate grew beyond what one person could keep up with. So many engineers found the process valuable that they volunteered their own time to scale the program. Today, around 20% of Google engineers are participating in the readability process at any given time, as either reviewers or code authors.

+ +
+

What Is the Readability Process?

+ +

Code review is mandatory at Google. Every changelist (CL)18 requires readability approval, which indicates that someone who has readability certification for that language has approved the CL.   Certified authors implicitly provide readability approval of their own CLs; otherwise, one or more qualified reviewers must explicitly give readability approval for the CL. This requirement was added after Google grew to a point where it was no longer possible to enforce that every engineer received code reviews that taught best practices to the desired rigor.

+ +
Note
+

See Code Review for an overview of the Google code review process and what Approval means in this context.

+
+ +

Within Google, having readability certification is commonly referred to as “having readability†for a language. Engineers with readability have demonstrated that they consistently write clear, idiomatic, and maintainable code that exemplifies Google’s best practices and coding style for a given language. They do this by submitting CLs through the readability process, during which a centralized group of readability reviewers review the CLs and give feedback on how much it demonstrates the various areas of mastery. As authors internalize the readability guidelines, they receive fewer and fewer comments on their CLs until they eventually graduate from the process and formally receive readability. Readability brings increased responsibility: engineers with readability are trusted to continue to apply their knowledge to their own code and to act as reviewers for other engineers’ code.

+ +

Around 1 to 2% of Google engineers are readability reviewers. All reviewers are volunteers, and anyone with readability is welcome to self-nominate to become a readability reviewer. Readability reviewers are held to the highest standards because they are expected not just to have deep language expertise, but also an aptitude for teaching through code review. They are expected to treat readability as first and foremost a mentoring and cooperative process, not a gatekeeping or adversarial one. Readability reviewers and CL authors alike are encouraged to have discussions during the review process. Reviewers provide relevant citations for their comments so that authors can learn about the rationales that went into the style guidelines (“Chesterton’s fenceâ€). If the rationale for any given guideline is unclear, authors should ask for clarification (“ask questionsâ€).

+ +

Readability is deliberately a human-driven process that aims to scale knowledge in a standardized yet personalized way. As a complementary blend of written and tribal knowledge, readability combines the advantages of written documentation, which can be accessed with citable references, with the advantages of expert human reviewers, who know which guidelines to cite. Canonical guidelines and language recommendations are comprehensively documented—which is good!—but the corpus of information is so large19 that it can be overwhelming, especially to newcomers.

+
+ +
+

Why Have This Process?

+ +

Code is read far more than it is written, and this effect is magnified at Google’s scale and in our (very large) monorepo.20 Any engineer  can look at and learn from the wealth of knowledge that is the code of other teams, and powerful tools like Kythe make it easy to find references throughout the entire codebase (see Code Search). An important feature of documented best practices (see Style Guides and Rules) is that they provide consistent standards for all Google code to follow. Readability is both an enforcement and propagation mechanism for these standards.

+ +

One of the primary advantages of the readability program is that it exposes engineers to more than just their own team’s tribal knowledge. To earn readability in a given language, engineers must send CLs through a centralized set of readability reviewers who review code across the entire company. Centralizing the process makes a significant trade-off: the program is limited to scaling linearly rather than sublinearly with organization growth, but it makes it easier to enforce consistency, avoid islands, and avoid (often unintentional) drifting from established norms.

+ +

The value of codebase-wide consistency cannot  be overstated: even with tens of thousands of engineers writing code over decades, it ensures that code in a given language will look similar across the corpus. This enables readers to focus on what the code does rather than being distracted by why it looks different than code that they’re used to. Large-scale change authors (see Large-Scale Changes) can more easily make changes across the entire monorepo, crossing the boundaries of thousands of teams. People can change teams and be confident that the way that the new team uses a given language is not drastically different than their previous team.

+ +

These benefits come with some costs: readability is a heavyweight process compared to other mediums like documentation and classes because it is mandatory and enforced by Google tooling (see Critique: Google’s Code Review Tool). These costs are nontrivial and include the following:

+ +
    +
  • +

    Increased friction for teams that do not have any team members with readability, because they need to find reviewers from outside their team to give readability approval on CLs.

    +
  • +
  • +

    Potential for additional rounds of code review for authors who need readability review.

    +
  • +
  • +

    Scaling disadvantages of being a human-driven process. Limited to scaling linearly to organization growth because it depends on human reviewers doing specialized code reviews.

    +
  • +
+ +

The question, then, is whether the benefits outweigh the costs. There’s also the factor of time: the full effect of the benefits versus the costs are not on the same timescale. The program makes a deliberate trade-off of increased short-term code-review latency and upfront costs for the long-term payoffs of higher-quality code, repository-wide code consistency, and increased engineer expertise. The longer timescale of the benefits comes with the expectation that code is written with a potential lifetime of years, if not decades.21

+ +

As with most—or perhaps all—engineering processes, there’s always room for improvement. Some of the costs can be mitigated with tooling. A number of readability comments address issues that could be detected statically and commented on automatically by static analysis tooling. As we continue to invest in static analysis, readability reviewers can increasingly focus on higher-order areas, like whether a particular block of code is understandable by outside readers who are not intimately familiar with the codebase instead of automatable detections like whether a line has trailing whitespace.

+ +

But aspirations aren’t enough. Readability is a controversial program: some engineers complain that it’s an unnecessary bureaucratic hurdle and a poor use of engineer time.  Are readability’s trade-offs worthwhile? For the answer, we turned to our trusty Engineering Productivity Research (EPR) team.  

+ +

The EPR team performed in-depth studies of readability, including but not limited to whether people were hindered by the process, learned anything, or changed their behavior after graduating. These studies showed that readability has a net positive impact on engineering velocity. CLs by authors with readability take statistically significantly less time to review and submit than CLs by authors who do not have readability.22 Self-reported engineer satisfaction with their code quality—lacking more objective measures for code quality—is higher among engineers who have readability versus those who do not. A significant majority of engineers who complete the program report satisfaction with the process and find it worthwhile. They report learning from reviewers and changing their own behavior to avoid readability issues when writing and reviewing code.

+ +
Note
+

For an in-depth look at this study and Google’s internal engineering productivity research, see Measuring Engineering Productivity.

+
+ +

Google has a very strong culture of code review, and readability is a natural extension of that culture. Readability grew from the passion of a single engineer to a formal program of human experts mentoring all Google engineers. It evolved and changed with Google’s growth, and it will continue to evolve as Google’s needs change.    

+
+
+ +
+

Conclusion

+ +

Knowledge is in some ways the most important (though intangible) capital of a software engineering organization, and sharing of that knowledge is crucial for making an organization resilient and redundant in the face of change. A culture that promotes open and honest knowledge sharing distributes that knowledge efficiently across the organization and allows that organization to scale over time. In most cases, investments into easier knowledge sharing reap manyfold dividends over the life of a company.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Psychological safety is the foundation for fostering a knowledge-sharing environment.

    +
  • +
  • +

    Start small: ask questions and write things down.

    +
  • +
  • +

    Make it easy for people to get the help they need from both human experts and documented references.

    +
  • +
  • +

    At a systemic level, encourage and reward those who take time to teach and broaden their expertise beyond just themselves, their team, or their organization.

    +
  • +
  • +

    There is no silver bullet: empowering a knowledge-sharing culture requires a combination of multiple strategies, and the exact mix that works best for your organization will likely change over time. 

    +
  • +
+
+

1In other words, rather than developing a single global maximum, we have a bunch of local maxima.

2David Lorge Parnas, Software Engineering: Multi-person Development of Multi-version Programs (Heidelberg: Springer-Verlag Berlin, 2011).

3Impostor syndrome is not uncommon among high achievers, and Googlers are no exception—in fact, a majority of this book’s authors have impostor syndrome. We acknowledge that fear of failure can be difficult for those with impostor syndrome and can reinforce an inclination to avoid branching out.

4See “How to ask good questions.â€

5https://talksat.withgoogle.com and https://www.youtube.com/GoogleTechTalks, to name a few.

6The g2g program is detailed in: Laszlo Bock, Work Rules!: Insights from Inside Google That Will Transform How You Live and Lead (New York: Twelve Books, 2015). It includes descriptions of different aspects of the program as well as how to evaluate impact and recommendations for what to focus on when setting up similar programs.

7See “The Boy Scout Rule†and Kevlin Henney, 97 Things Every Programmer Should Know (Boston: O’Reilly, 2010).

8g3doc stands for “google3 documentation.†google3 is the name of the current incarnation of Google’s monolithic source repository.

9Laszlo Bock, Work Rules!: Insights from Inside Google That Will Transform How You Live and Lead (New York: Twelve Books, 2015).

10Ibid.

11Peer bonuses include a cash award and a certificate as well as being a permanent part of a Googler’s award record in an internal tool called gThanks.

12Such as books about software engineering at Google.

13See Code Review.

14See Testing Overview.

15Available for multiple languages. Externally available for C++ at https://abseil.io/tips.

16go/ links are unrelated to the Go language.

17External codelabs are available at https://codelabs.developers.google.com.

18A changelist is a list of files that make up a change in a version control system. A changelist is synonymous with a changeset.

19As of 2019, just the Google C++ style guide is 40 pages long. The secondary material making up the complete corpus of best practices is many times longer.

20For why Google uses a monorepo, see https://cacm.acm.org/magazines/2016/7/204032-why-google-stores-billions-of-lines-of-code-in-a-single-repository/fulltext. Note also that not all of Google’s code lives within the monorepo; readability as described here applies only to the monorepo because it is a notion of within-repository consistency.

21For this reason, code that is known to have a short time span is exempt from readability requirements. Examples include the experimental/ directory (explicitly designated for experimental code and cannot push to production) and the Area 120 program, a workshop for Google’s experimental products.

22This includes controlling for a variety of factors, including tenure at Google and the fact that CLs for authors who do not have readability typically need additional rounds of review compared to authors who already have readability.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch04.html b/clones/abseil.io/resources/swe-book/html/ch04.html new file mode 100644 index 00000000..efbf186c --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch04.html @@ -0,0 +1,206 @@ + + + + + Software Engineering at Google + + + + +
+

Engineering for Equity

+ + + + + +

In earlier chapters, we’ve explored the  contrast between programming as the production of code that addresses the problem of the moment, and software engineering as the broader application of code, tools, policies, and processes to a dynamic and ambiguous problem that can span decades or even lifetimes. In this chapter, we’ll discuss the unique responsibilities of an engineer when designing products for a broad base of users. Further, we evaluate how an organization, by embracing diversity, can design systems that work for everyone, and avoid perpetuating harm against our users.

+ +

As new as the field of software engineering is, we’re newer still at understanding the impact it has on underrepresented people and diverse societies. We did not write this chapter because we know all the answers. We do not. In fact, understanding how to engineer products that empower and respect all our users is still something Google is learning to do. We have had many public failures in protecting our most vulnerable users, and so we are writing this chapter because the path forward to more equitable products begins with evaluating our own failures and encouraging growth.

+ +

We are also writing this chapter because of the increasing imbalance of power between those who make development decisions that impact the world and those who simply must accept and live with those decisions that sometimes disadvantage already marginalized communities globally. It is important to share and reflect on what we’ve learned so far with the next generation of software engineers. It is even more important that we help influence the next generation of engineers to be better than we are today.

+ +

Just picking up this book means that you likely aspire to be an exceptional engineer. You want to solve problems. You aspire to build products that drive positive outcomes for the broadest base of people, including people who are the most difficult to reach. To do this, you will need to consider how the tools you build will be leveraged to change the trajectory of humanity, hopefully for the better.

+ +
+

Bias Is the Default

+ +

When engineers do not focus on users of different nationalities, ethnicities, races, genders, ages, socioeconomic statuses, abilities, and belief systems, even the most talented staff will inadvertently fail their users.   Such failures are often unintentional; all people have certain biases, and social scientists have recognized over the past several decades that most people exhibit unconscious bias, enforcing and promulgating existing stereotypes. Unconscious bias is insidious and often more difficult to mitigate than intentional acts of exclusion. Even when we want to do the right thing, we might not recognize our own biases. By the same token, our organizations must also recognize that such bias exists and work to address it in their workforces, product development, and user outreach.

+ +

Because of bias, Google has at times failed to represent users equitably within their products, with launches over the past several years that did not focus enough on underrepresented groups. Many users attribute our lack of awareness in these cases to the fact that our engineering population is mostly male, mostly White or Asian, and certainly not representative of all the communities that use our products. The lack of representation of such users in our workforce1 means that we often do not have the requisite diversity to understand how the use of our products can affect underrepresented or vulnerable users.

+ + + +

In this example, our product was inadequately designed and executed, failing to properly consider all racial groups, and as a result, failed our users and caused Google bad press. Other technology suffers from similar failures: autocomplete can return offensive or racist results. Google’s Ad system could be manipulated to show racist or offensive ads. YouTube might not catch hate speech, though it is technically outlawed on that platform.

+ +

In all of these cases, the technology itself is not really to blame. Autocomplete, for example, was not designed to target users or to discriminate. But it was also not resilient enough in its design to exclude discriminatory language that is considered hate speech. As a result, the algorithm returned results that caused harm to our users. The harm to Google itself should also be obvious: reduced user trust and engagement with the company. For example, Black, Latinx, and Jewish applicants could lose faith in Google as a platform or even as an inclusive environment itself, therefore undermining Google’s goal of improving representation in hiring.

+ +

How could this happen? After all, Google hires technologists with impeccable education and/or professional experience—exceptional programmers who write the best code and test their work. "Build for everyone" is a Google brand statement, but the truth is that we still have a long way to go before we can claim that we do. One way to address these problems is to help the software engineering organization itself look like the populations for whom we build products.

+
+ +
+

Understanding the Need for Diversity

+ +

At Google, we  believe that being an exceptional  engineer requires that you also focus on bringing diverse perspectives into product design and implementation. It also means that Googlers responsible for hiring or interviewing other engineers must contribute to building a more representative workforce. For example, if you interview other engineers for positions at your company, it is important to learn how biased outcomes happen in hiring. There are significant prerequisites for understanding how to anticipate harm and prevent it. To get to the point where we can build for everyone, we first must understand our representative populations. We need to encourage engineers to have a wider scope of educational training. 

+ +

The first order of business is to disrupt the notion that as a person with a computer science degree and/or work experience, you have all the skills you need to become an exceptional engineer. A computer science degree is often a necessary foundation. However, the degree alone (even when coupled with work experience) will not make you an engineer. It is also important to disrupt the idea that only people with computer science degrees can design and build products. Today, most programmers do have a computer science degree; they are successful at building code, establishing theories of change, and applying methodologies for problem solving. However, as the aforementioned examples demonstrate, this approach is insufficient for inclusive and equitable engineering.

+ +

Engineers should begin by focusing all work within the framing of the complete ecosystem they seek to influence.  At minimum, they need to understand the population demographics of their users. Engineers should focus on people who are different than themselves, especially people who might attempt to use their products to cause harm. The most difficult users to consider are those who are disenfranchised by the processes and the environment in which they access technology. To address this challenge, engineering teams need to be representative of their existing and future users. In the absence of diverse representation on engineering teams, individual engineers need to learn how to build for all users.

+
+ +
+

Building Multicultural Capacity

+ +

One mark of an exceptional engineer is the ability to understand how products can advantage and disadvantage different  groups of human beings.  Engineers are expected to have technical aptitude, but they should also have the discernment to know when to build something and when not to. Discernment includes building the capacity to identify and reject features or products that drive adverse outcomes. This is a lofty and difficult goal, because there is an enormous amount of individualism that goes into being a high-performing engineer. Yet to succeed, we must extend our focus beyond our own communities to the next billion users or to current users who might be disenfranchised or left behind by our products.

+ +

Over time, you might build tools that billions of people use daily—tools that influence how people think about the value of human lives, tools that monitor human activity, and tools that capture and persist sensitive data, such as images of their children and loved ones, as well as other types of sensitive data. As an engineer, you might wield more power than you realize: the power to literally change society. It’s critical that on your journey to becoming an exceptional engineer, you understand the innate responsibility needed to exercise power without causing harm. The first step is to recognize the default state of your bias caused by many societal and educational factors. After you recognize this, you’ll be able to consider the often-forgotten use cases or users who can benefit or be harmed by the products you build.

+ +

The industry continues to move forward, building new use cases for artificial intelligence (AI) and machine learning at an ever-increasing speed. To stay competitive, we drive toward scale and efficacy in building a high-talent engineering and technology workforce. Yet we need to pause and consider the fact that today, some people have the ability to design the future of technology and others do not. We need to understand whether the software systems we build will eliminate the potential for entire populations to experience shared prosperity and provide equal access to technology.

+ +

Historically, companies faced with a decision between completing a strategic objective that drives market dominance and revenue and one that potentially slows momentum toward that goal have opted for speed and shareholder value. This tendency is exacerbated by the fact that many companies value individual performance and excellence, yet often fail to effectively drive accountability on product equity across all areas. Focusing on underrepresented users is a clear opportunity to promote equity. To continue to be competitive in the technology sector, we need to learn to engineer for global equity.

+ +

Today, we worry when companies design technology to scan, capture, and identify people walking down the street. We worry about privacy and how governments might use this information now and in the future. Yet most technologists do not have the requisite perspective of underrepresented groups to understand the impact of racial variance in facial recognition or to understand how applying AI can drive harmful and inaccurate results.

+ +

Currently, AI-driven facial-recognition software continues to disadvantage people of color or ethnic minorities.  Our research is not comprehensive enough and does not include a wide enough range of different skin tones. We cannot expect the output to be valid if both the training data and those creating the software represent only a small subsection of people. In those cases, we should be willing to delay development in favor of trying to get more complete and accurate data, and a more comprehensive and inclusive product.

+ +

Data science itself is challenging for humans to evaluate, however.  Even when we do have representation, a training set can still be biased and produce invalid results. A study completed in  2016 found that more than 117 million American adults are in a law enforcement facial recognition database.5 Due to the disproportionate policing of Black communities and disparate outcomes in arrests, there could be racially biased error rates in utilizing such a database in facial recognition. Although the software is being developed and deployed at ever-increasing rates, the independent testing is not. To correct for this egregious misstep, we need to have the integrity to slow down and ensure that our inputs contain as little bias as possible. Google now offers statistical training within the context of AI to help ensure that datasets are not intrinsically biased.

+ +

Therefore, shifting the focus of  your industry experience to include more comprehensive, multicultural, race and gender studies education is not only your responsibility, but also the responsibility of your employer. Technology companies must ensure that their employees are continually receiving professional development and that this development is comprehensive and multidisciplinary. The requirement is not that one individual take it upon themselves to learn about other cultures or other demographics alone. Change requires that each of us, individually or as leaders of teams, invest in continuous professional development that builds not just our software development and leadership skills, but also our capacity to understand the diverse experiences throughout humanity.  

+
+ +
+

Making Diversity Actionable

+ +

Systemic equity and fairness are attainable if we are willing to accept that we are all accountable for the  systemic  discrimination we see in the technology sector. We are accountable for the failures in the system. Deferring or abstracting away personal accountability is ineffective, and depending on your role, it could be irresponsible. It is also irresponsible to fully attribute dynamics at your specific company or within your team to the larger societal issues that contribute to inequity. A favorite line among diversity proponents and detractors alike goes something like this: “We are working hard to fix (insert systemic discrimination topic), but accountability is hard. How do we combat (insert hundreds of years) of historical discrimination?†This line of inquiry is a detour to a more philosophical or academic conversation and away from focused efforts to improve work conditions or outcomes.  Part of building multicultural capacity requires a more comprehensive understanding of how systems of inequality in society impact the workplace, especially in the technology sector.

+ +

If you are an engineering manager working on hiring more people from underrepresented groups, deferring to the historical impact of discrimination in the world is a useful academic exercise.  However, it is critical to move beyond the academic conversation to a focus on quantifiable and actionable steps that you can take to drive equity and fairness. For example, as a hiring software engineer manager, you’re accountable for ensuring that your candidate slates are balanced. Are there women or other underrepresented groups in the pool of candidates’ reviews? After you hire someone, what opportunities for growth have you provided, and is the distribution of opportunities equitable? Every technology lead or software engineering manager has the means to augment equity on their teams. It is important that we acknowledge that, although there are significant systemic challenges, we are all part of the system. It is our problem to fix.

+
+ +
+

Reject Singular Approaches

+ +

We cannot perpetuate solutions that present a single philosophy or methodology for fixing inequity in the technology sector.  Our problems are complex and multifactorial. Therefore, we must disrupt singular approaches to advancing representation in the workplace, even if they are promoted by people we admire or who have institutional power.

+ +

One singular narrative held dear in the technology industry is that lack of representation in the workforce can be addressed solely by fixing the hiring pipelines. Yes, that is a fundamental step, but that is not the immediate issue we need to fix. We need to recognize systemic inequity in progression and retention while simultaneously focusing on more representative hiring and educational disparities across lines of race, gender, and socioeconomic and immigration status, for example.

+ +

In the technology industry, many people from underrepresented groups are passed over daily for opportunities and advancement. Attrition among Black+ Google employees outpaces attrition from all other groups and confounds progress on representation goals. If we want to drive change and increase representation, we need to evaluate whether we’re creating an ecosystem in which all aspiring engineers and other technology professionals can thrive.

+ +

Fully understanding an entire problem space is critical to determining how to fix it. This holds true for everything from a critical data migration to the hiring of a representative workforce. For example, if you are an engineering manager who wants to hire more women, don’t just focus on building a pipeline. Focus on other aspects of the hiring, retention, and progression ecosystem and how inclusive it might or might not be to women. Consider whether your recruiters are demonstrating the ability to identify strong candidates who are women as well as men. If you manage a diverse engineering team, focus on psychological safety and invest in increasing multicultural capacity on the team so that new team members feel welcome.

+ +

A common methodology today is to build for the majority use case first, leaving improvements and features that address edge cases for later. But this approach is flawed; it gives users who are already advantaged in access to technology a head start, which increases inequity.  Relegating the consideration of all user groups to the point when design has been nearly completed is to lower the bar of what it means to be an excellent engineer. Instead, by building in inclusive design from the start and raising development standards for development to make tools delightful and accessible for people who struggle to access technology, we enhance the experience for all users.

+ +

Designing for the user who is least like you is not just wise, it’s a best practice. There are pragmatic and immediate next steps that all technologists, regardless of domain, should consider when developing products that avoid disadvantaging or underrepresenting users. It begins with more comprehensive user-experience research. This research should be done with user groups that are multilingual and multicultural and that span multiple countries, socioeconomic class, abilities, and age ranges. Focus on the most difficult or least represented use case first.

+
+ +
+

Challenge Established Processes

+ +

Challenging yourself to build more equitable systems goes beyond designing more inclusive product specifications.  Building equitable systems sometimes means challenging established processes that drive invalid results.

+ +

Consider a recent case evaluated for equity implications. At Google, several engineering teams worked to build a global hiring requisition system. The system supports both external hiring and internal mobility. The engineers and product managers involved did a great job of listening to the requests of what they considered to be their core user group: recruiters.  The recruiters were focused on minimizing wasted time for hiring managers and applicants, and they presented the development team with use cases focused on scale and efficiency for those people. To drive efficiency, the recruiters asked the engineering team to include a feature that would highlight performance ratings—specifically lower ratings—to the hiring manager and recruiter as soon as an internal transfer expressed interest in a job.

+ +

On its face, expediting the evaluation process and helping jobseekers save time is a great goal. So where is the potential equity concern? The following equity questions were raised:

+ +
    +
  • +

    Are developmental assessments a predictive measure of performance?

    +
  • +
  • +

    Are the performance assessments being presented to prospective managers free of individual bias?

    +
  • +
  • +

    Are performance assessment scores standardized across organizations?

    +
  • +
+ +

If the answer to any of these questions is “no,†presenting performance ratings could still drive inequitable, and therefore invalid, results.

+ +

When an exceptional engineer questioned whether past performance was in fact predictive of future performance, the reviewing team decided to conduct a thorough review. In the end, it was determined that candidates who had received a poor performance rating were likely to overcome the poor rating if they found a new team. In fact, they were just as likely to receive a satisfactory or exemplary performance rating as candidates who had never received a poor rating. In short, performance ratings are indicative only of how a person is performing in their given role at the time they are being evaluated. Ratings, although an important way to measure performance during a specific period, are not predictive of future performance and should not be used to gauge readiness for a future role or qualify an internal candidate for a different team. (They can, however, be used to evaluate whether an employee is properly or improperly slotted on their current team; therefore, they can provide an opportunity to evaluate how to better support an internal candidate moving forward.)

+ +

This analysis definitely took up significant project time, but the positive trade-off was a more equitable internal mobility process.

+
+ +
+

Values Versus Outcomes

+ +

Google has a strong track record of investing in hiring.  As the previous example illustrates, we also continually evaluate our processes in order to improve equity and inclusion.  More broadly, our core values are based on respect and an unwavering commitment to a diverse and inclusive workforce. Yet, year after year, we have also missed our mark on hiring a representative workforce that reflects our users around the globe. The struggle to improve our equitable outcomes persists despite the policies and programs in place to help support inclusion initiatives and promote excellence in hiring and progression. The failure point is not in the values, intentions, or investments of the company, but rather in the application of those policies at the implementation level.

+ +

Old habits are hard to break. The users you might be used to designing for today—the ones you are used to getting feedback from—might not be representative of all the users you need to reach. We see this play out frequently across all kinds of products, from wearables that do not work for women’s bodies to video-conferencing software that does not work well for people with darker skin tones.

+ +

So, what’s the way out?

+ +
    +
  1. +

    Take a hard look in the mirror. At Google, we have the brand slogan, “Build For Everyone.†How can we  build for everyone when we do not have a representative workforce or engagement model that centralizes community feedback first? We can’t. The truth is that we have at times very publicly failed to protect our most vulnerable users from racist, antisemitic, and homophobic content.

    +
  2. +
  3. +

    Don’t build for everyone. Build with everyone. We are not building for everyone yet. That work does not happen in a vacuum, and it certainly doesn’t happen when the technology is still not representative of the population as a whole. That said, we can’t pack up and go home. So how do we build for everyone? We build with our users. We need to engage our users across the spectrum of humanity and be intentional about putting the most vulnerable communities at the center of our design. They should not be an afterthought.

    +
  4. +
  5. +

    Design for the user who will have the most difficulty using your product. Building for those with additional challenges will make the product better for everyone. Another way of thinking about this is: don’t trade equity for short-term velocity.

    +
  6. +
  7. +

    Don’t assume equity; measure equity throughout your systems. Recognize that decision makers are also subject to bias and might be undereducated about the causes of inequity. You might not have the expertise to identify or measure the scope of an equity issue. Catering to a single userbase might mean disenfranchising another; these trade-offs can be difficult to spot and impossible to reverse. Partner with individuals or teams that are subject matter experts in diversity, equity, and inclusion.

    +
  8. +
  9. +

    Change is possible. The problems we’re facing with technology today, from surveillance to disinformation to online harassment, are genuinely overwhelming. We can’t solve these with the failed approaches of the past or with just the skills we already have. We need to change.

    +
  10. +
+
+ +
+

Stay Curious, Push Forward

+ +

The path to equity is long and complex.  However, we can and should transition from simply building tools and services to growing our understanding of how the products we engineer impact humanity. Challenging our education, influencing our teams and managers, and doing more comprehensive user research are all ways to make progress. Although change is uncomfortable and the path to high performance can be painful, it is possible through collaboration and creativity.

+ +

Lastly, as future exceptional engineers, we should focus first on the users most impacted by bias and discrimination.  Together, we can work to accelerate progress by focusing on Continuous Improvement and owning our failures. Becoming an engineer is an involved and continual process. The goal is to make changes that push humanity forward without further disenfranchising the disadvantaged. As future exceptional engineers, we have faith that we can prevent future failures in the system.

+
+ +
+

Conclusion

+ +

Developing software, and developing a software organization, is a team effort. As a software organization scales, it must respond and adequately design for its user base, which in the interconnected world of computing today involves everyone, locally and around the world. More effort must be made to make both the development teams that design software and the products that they produce reflect the values of such a diverse and encompassing set of users. And, if an engineering organization wants to scale, it cannot ignore underrepresented groups; not only do such engineers from these groups augment the organization itself, they provide unique and necessary perspectives for the design and implementation of software that is truly useful to the world at large.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Bias is the default.

    +
  • +
  • +

    Diversity is necessary to design properly for a comprehensive user base.

    +
  • +
  • +

    Inclusivity is critical not just to improving the hiring pipeline for underrepresented groups, but to providing a truly supportive work environment for all people.

    +
  • +
  • +

    Product velocity must be evaluated against providing a product that is truly useful to all users. It’s better to slow down than to release a product that might cause harm to some users. 

    +
  • +
+
+

1Google’s 2019 Diversity Report.

2@jackyalcine. 2015. “Google Photos, Y’all Fucked up. My Friend’s Not a Gorilla.†Twitter, June 29, 2015. https://twitter.com/jackyalcine/status/615329515909156865.

3Many reports in 2018–2019 pointed to a lack of diversity across tech. Some notables include the National Center for Women & Information Technology, and Diversity in Tech.

4Tom Simonite, “When It Comes to Gorillas, Google Photos Remains Blind,†Wired, January 11, 2018.

5Stephen Gaines and Sara Williams. “The Perpetual Lineup: Unregulated Police Face Recognition in America.†Center on Privacy & Technology at Georgetown Law, October 18, 2016.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch05.html b/clones/abseil.io/resources/swe-book/html/ch05.html new file mode 100644 index 00000000..f0f818cf --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch05.html @@ -0,0 +1,397 @@ + + + + + Software Engineering at Google + + + + +
+

How to Lead a Team

+ + + + + +

We’ve covered a lot of ground so far on the  culture and composition of teams writing software, and in this chapter, we’ll take a look at the person ultimately responsible for making it all work. 

+ +

No team can function well without a leader, especially at Google, where engineering is almost exclusively a team endeavor. At Google, we recognize two different leadership roles. A Manager is a leader of people, whereas a Tech Lead leads technology efforts. Although the responsibilities of these two roles require similar planning skills, they require quite different people skills.

+ +

A boat without a captain is nothing more than a floating waiting room: unless someone grabs the rudder and starts the engine, it’s just going to drift along aimlessly with the current. A piece of software is just like that boat: if no one pilots it, you’re left with a group of engineers burning up valuable time, just sitting around waiting for something to happen (or worse, still writing code that you don’t need). Although this chapter is about people management and technical leadership, it is still worth a read if you’re an individual contributor because it will likely help you understand your own leaders a bit better.

+ +
+

Managers and Tech Leads (and Both)

+ +

Whereas every engineering team generally has a leader, they acquire those leaders in different ways.   This is certainly true at Google; sometimes an experienced manager comes in to run a team, and sometimes an individual contributor is promoted into a leadership position (usually of a smaller team).

+ +

In nascent teams, both roles will sometimes be filled by the same person: a Tech Lead Manager (TLM). On larger teams, an experienced people manager will step in to take on the management role while a senior engineer with extensive experience will step into the tech lead role. Even though manager and tech lead each play an important part in the growth and productivity of an engineering team, the people skills required to succeed in each role are wildly different.

+ +
+

The Engineering Manager

+ +

Many companies bring in trained people managers who might know little to nothing about software engineering to run their engineering teams.    Google decided early on, however, that its software engineering managers should have an engineering background. This meant hiring experienced managers who used to be software engineers, or training software engineers to be managers (more on this later).

+ +

At the highest level, an engineering manager is responsible for the performance, productivity, and happiness of every person on their team—including their tech lead—while still making sure that the needs of the business are met by the product for which they are responsible. Because the needs of the business and the needs of individual team members don’t always align, this can often place a manager in a difficult position.

+
+ +
+

The Tech Lead

+ +

The tech lead (TL) of a team—who  will often report  to the manager  of that team—is responsible for (surprise!) the technical aspects of the product, including technology decisions and choices, architecture, priorities, velocity, and general project management (although on larger teams they might have program managers helping out with this). The TL will usually work hand in hand with the engineering manager to ensure that the team is adequately staffed for their product and that engineers are set to work on tasks that best match their skill sets and skill levels. Most TLs are also individual contributors, which often forces them to choose between doing something quickly themselves or delegating it to a team member to do (sometimes) more slowly. The latter is most often the correct decision for the TL as they grow the size and capability of their team. 

+
+ +
+

The Tech Lead Manager

+ +

On small and nascent teams for which engineering managers need a strong technical skill set, the  default  is often  to have a TLM: a single person who can handle both the people and technical needs of their team. Sometimes, a TLM is a more senior person, but more often than not, the role is taken on by someone who was, until recently, an individual contributor. 

+ +

At Google, it’s customary for larger, well-established teams to have a pair of leaders—one TL and one engineering manager—working together as partners. The theory is that it’s really difficult to do both jobs at the same time (well) without completely burning out, so it’s better to have two specialists crushing each role with dedicated focus.

+ +

The job of TLM is a tricky one and often requires the TLM to learn how to balance individual work, delegation, and people management. As such, it usually requires a high degree of mentoring and assistance from more experienced TLMs. (In fact, we recommend that in addition to taking a number of classes that Google offers on this subject, a newly minted TLM seek out a senior mentor who can advise them regularly as they grow into the role.)

+ + +
+
+ +
+

Moving from an Individual Contributor Role to a Leadership Role

+ +

Whether or not they’re officially  appointed, someone needs to  get into the driver’s seat if your product is ever going to go anywhere, and if you’re the motivated, impatient type, that person might be you. You might find yourself sucked into helping your team resolve conflicts, make decisions, and coordinate people. It happens all the time, and often by accident. Maybe you never intended to become a “leader,†but somehow it happened anyway.  Some people refer to this affliction as “manageritis.â€

+ +

Even if you’ve sworn to yourself that you’ll never become a manager, at some point in your career, you’re likely to find yourself in a leadership position, especially if you’ve been successful in your role. The rest of this chapter is intended to help you understand what to do when this happens.

+ +

We’re not here to attempt to convince you to become a manager, but rather to help show why the best leaders work to serve their team using the principles of humility, respect, and trust. Understanding the ins and outs of leadership is a vital skill for influencing the direction of your work. If you want to steer the boat for your project and not just go along for the ride, you need to know how to navigate, or you’ll run yourself (and your project) onto a sandbar.

+ +
+

The Only Thing to Fear Is…Well, Everything

+ +

Aside from the general sense of malaise that most people feel when they hear the word "manager," there are a number of reasons that most people don’t want to become managers.   The biggest reason you’ll hear in the software development world is that you spend much less time writing code. This is true whether you become a TL or an engineering manager, and I’ll talk more about this later in the chapter, but first, let’s cover some more reasons why most of us avoid becoming managers.

+ +

If you’ve spent the majority of your career writing code, you typically end a day with something you can point to—whether it’s code, a design document, or a pile of bugs you just closed—and say, “That’s what I did today.†But at the end of a busy day of “management,†you’ll usually find yourself thinking, “I didn’t do a damned thing today.†It’s the equivalent of spending years counting the number of apples you picked each day and changing to a job growing bananas, only to say to yourself at the end of each day, “I didn’t pick any apples,†happily ignoring the flourishing banana trees sitting next to you. Quantifying management work is more difficult than counting widgets you turned out, but just making it possible for your team to be happy and productive is a big measure of your job. Just don’t fall into the trap of counting apples when you’re growing bananas.1

+ +

Another big reason for not becoming a manager is often unspoken  but rooted in the famous “Peter Principle,†which states that “In a hierarchy every employee tends to rise to his level of incompetence.†Google generally avoids this by requiring that a person perform the job above their current level for a period of time (i.e., to “exceeds expectations†at their current level) before being promoted to that level. Most people have had a manager who was incapable of doing their job or was just really bad at managing people,2 and we know some people who have worked only for bad managers. If you’ve been exposed only to crappy managers for your entire career, why would you ever want to be a manager? Why would you want to be promoted to a role that you don’t feel able to do?

+ +

There are, however, great reasons to consider becoming a TL or manager. First, it’s a way to scale yourself. Even if you’re great at writing code, there’s still an upper limit to the amount of code you can write. Imagine how much code a team of great engineers could write under your leadership! Second, you might just be really good at it—many people who find themselves sucked into the leadership vacuum of a project discover that they’re exceptionally skilled at providing the kind of guidance, help, and air cover a team or a company needs. Someone has to lead, so why not you?

+
+ +
+

Servant Leadership

+ +

There seems to be a sort of disease that strikes managers in which they forget about all the  awful things their managers  did to them and suddenly  begin doing these same things to “manage†the people that report to them. The symptoms of this disease include, but are by no means limited to, micromanaging, ignoring low performers, and hiring pushovers. Without prompt treatment, this disease can kill an entire team. The best advice I received when I first became a manager at Google was from Steve Vinter, an engineering director at the time. He said, “Above all, resist the urge to manage.†One of the greatest urges of the newly minted manager is to actively “manage†their employees because that’s what a manager does, right? This typically has disastrous consequences.

+ +

The cure for the “management†disease is a liberal application of “servant leadership,†which is a nice way of saying the most important thing you can do as a leader is to serve your team, much like a butler or majordomo tends to the health and well-being of a household. As a servant leader, you should strive to create an atmosphere of humility, respect, and trust. This might mean removing bureaucratic obstacles that a team member can’t remove by themselves, helping a team achieve consensus, or even buying dinner for the team when they’re working late at the office. The servant leader fills in the cracks to smooth the way for their team and advises them when necessary, but still isn’t afraid of getting their hands dirty. The only managing that a servant leader does is to manage both the technical and social health of the team; as tempting as it might be to focus on purely the technical health of the team, the social health of the team is just as important (but often infinitely more difficult to manage).  

+
+
+ +
+

The Engineering Manager

+ +

So, what is  actually expected of a manager at  a modern  software company? Before the computing age, “management†and “labor†might have taken on almost antagonistic roles, with the manager wielding all of the power and labor requiring collective action to achieve its own ends. But that isn’t how modern software companies work.

+ +
+

Manager Is a Four-Letter Word

+ +

Before talking about the core responsibilities of an engineering manager at Google, let’s review the history of managers.    The present-day concept of the pointy-haired manager is partially a carryover, first from military hierarchy and later adopted by the Industrial Revolution—more than a hundred years ago! Factories began popping up everywhere, and they required (usually unskilled) workers to keep the machines going. Consequently, these workers required supervisors to manage them, and because it was easy to replace these workers with other people who were desperate for a job, the managers had little motivation to treat their employees well or improve conditions for them. Whether humane or not, this method worked well for many years when the employees had nothing more to do than perform rote tasks.

+ +

Managers frequently treated employees in the same way that cart drivers would treat their mules: they motivated them by alternately  leading them forward with a carrot, and, when that didn’t work, whipping them with a stick. This carrot-and-stick method of management survived the transition from the factory3 to the modern office, where the stereotype of the tough-as-nails manager-as-mule-driver flourished in the middle part of the twentieth century when employees would work at the same job for years and years.

+ +

This continues today in some industries—even in industries that require creative thinking and problem solving—despite numerous studies suggesting that the anachronistic carrot and stick is ineffective and harmful to the productivity of creative people. Whereas the assembly-line worker of years past could be trained in days and replaced at will, software engineers working on large codebases can take months to get up to speed on a new team. Unlike the replaceable assembly-line worker, these people need nurturing, time, and space to think and create.

+
+ +
+

Today’s Engineering Manager

+ +

Most people still use the title “manager†despite the fact that it’s often an anachronism.    The title itself often encourages new managers to manage their reports. Managers can wind up acting like parents,4 and consequently employees react like children. To frame this in the context of humility, respect, and trust: if a manager makes it obvious that they trust their employee, the employee feels positive pressure to live up to that trust. It’s that simple. A good manager forges the way for a team, looking out for their safety and well-being, all while making sure their needs are met. If there’s one thing you remember from this chapter, make it this:

+ +
+

Traditional managers worry about how to get things done, whereas great managers worry about what things get done (and trust their team to figure out how to do it).

+
+ +

A new engineer, Jerry, joined my team a few years ago. Jerry’s last manager (at a different company) was adamant that he be at his desk from 9:00 to 5:00 every day, and assumed that if he wasn’t there, he wasn’t working enough (which is, of course, a ridiculous assumption). On his first day working with me, Jerry came to me at 4:40 p.m. and stammered out an apology that he had to leave 15 minutes early because he had an appointment that he had been unable to reschedule. I looked at him, smiled, and told him flat out, “Look, as long as you get your job done, I don’t care what time you leave the office.†Jerry stared blankly at me for a few seconds, nodded, and went on his way. I treated Jerry like an adult; he always got his work done, and I never had to worry about him being at his desk, because he didn’t need a babysitter to get his work done. If your employees are so uninterested in their job that they actually need traditional-manager babysitting to be convinced to work, that is your real problem.

+ + +
+
+ +
+

Antipatterns

+ +

Before we  go over a litany  of “design patterns†for successful TLs and engineering managers, we’re going to review a collection of the patterns that you don’t want to follow if you want to be a successful manager.  We’ve observed these destructive patterns in a handful of bad managers that we’ve encountered in our careers, and in more than a few cases, ourselves.

+ +
+

Antipattern: Hire Pushovers

+ +

If you’re a manager and you’re feeling insecure in your role (for whatever reason), one way to make sure no one questions your authority or threatens your job is to hire people you can push around.    You can achieve this by hiring people who aren’t as smart or ambitious as you are, or just people who are more insecure than you. Even though this will cement your position as the team leader and decision maker, it will mean a lot more work for you. Your team won’t be able to make a move without you leading them like dogs on a leash. If you build a team of pushovers, you probably can’t take a vacation; the moment you leave the room, productivity comes to a screeching halt. But surely this is a small price to pay for feeling secure in your job, right?

+ +

Instead, you should strive to hire people who are smarter than you and can replace you. This can be difficult because these very same people will challenge you on a regular basis (in addition to letting you know when you make a mistake). These very same people will also consistently impress you and make great things happen. They’ll be able to direct themselves to a much greater extent, and some will be eager to lead the team, as well. You shouldn’t see this as an attempt to usurp your power; instead, look at it as an opportunity for you to lead an additional team, investigate new opportunities, or even take a vacation without worrying about checking in on the team every day to make sure it’s getting its work done. It’s also a great chance to learn and grow—it’s a lot easier to expand your expertise when surrounded by people who are smarter than you.

+
+ +
+

Antipattern: Ignore Low Performers

+ +

Early in  my career  as a manager at Google, the time  came for me to hand out bonus letters to my team, and I grinned as I told my manager, “I love being a manager!†Without missing a beat, my manager, a long-time industry veteran, replied, “Sometimes you get to be the tooth fairy, other times you have to be the dentist.â€

+ +

It’s never any fun to pull teeth. We’ve seen team leaders do all the right things to build incredibly strong teams only to have these teams fail to excel (and eventually fall apart) because of just one or two low performers. We understand that the human aspect is the most challenging part of writing software, but the most difficult part of dealing with humans is handling someone who isn’t meeting expectations. Sometimes, people miss expectations because they’re not working long enough or hard enough, but the most difficult cases are when someone just isn’t capable of doing their job no matter how long or hard they work.

+ +

Google’s Site Reliability Engineering (SRE) team has a motto: “Hope is not a strategy.†And  nowhere is hope more overused as a strategy than in dealing with a low performer. Most team leaders grit their teeth, avert their eyes, and just hope that the low performer either magically improves or just goes away. Yet it is extremely rare that this person does either.

+ +

While the leader is hoping and the low performer isn’t improving (or leaving), high performers on the team waste valuable time pulling the low performer along, and team morale leaks away into the ether. You can be sure that the team knows the low performer is there even if you’re ignoring them—in fact, the team is acutely aware of who the low performers are, because they have to carry them.

+ +

Ignoring low performers is not only a way to keep new high performers from joining your team, but it’s also a way to encourage existing high performers to leave. You eventually wind up with an entire team of low performers because they’re the only ones who can’t leave of their own volition. Lastly, you aren’t even doing the low performer any favors by keeping them on the team; often, someone who wouldn’t do well on your team could actually have plenty of impact somewhere else.

+ +

The benefit of dealing with a low performer as quickly as possible is that you can put yourself in the position of helping them up or out. If you immediately deal with a low performer, you’ll often find that they merely need some encouragement or direction to slip into a higher state of productivity. If you wait too long to deal with a low performer, their relationship with the team is going to be so sour and you’re going to be so frustrated that you’re not going to be able to help them.

+ +

How do you effectively coach a low performer?  The best analogy is to imagine that you’re helping a limping person learn to walk again, then jog, then run alongside the rest of the team.  It almost always requires temporary micromanagement, but still a whole lot of humility, respect, and trust—particularly respect. Set up a specific time frame (say, two months) and some very specific goals you expect them to achieve in that period. Make the goals small, incremental, and measurable so that there’s an opportunity for lots of small successes. Meet with the team member every week to check on progress, and be sure you set really explicit expectations around each upcoming milestone so that it’s easy to measure success or failure. If the low performer can’t keep up, it will become quite obvious to both of you early in the process. At this point, the person will often acknowledge that things aren’t going well and decide to quit; in other cases, determination will kick in and they’ll “up their game†to meet expectations. Either way, by working directly with the low performer, you’re catalyzing important and necessary changes.

+
+ +
+

Antipattern: Ignore Human Issues

+ +

A manager has two major areas of focus for their team: the social and the technical. It’s rather  common  for managers to  be stronger in the technical side at Google, and because most managers are promoted from a technical job (for which the primary goal of their job was to solve technical problems), they can tend to ignore human issues. It’s tempting to focus all of your energy on the technical side of your team because, as an individual contributor, you spend the vast majority of your time solving technical problems. When you were a student, your classes were all about learning the technical ins and outs of your work. Now that you’re a manager, however, you ignore the human element of your team at your own peril.

+ +

Let’s begin with an example of a leader ignoring the human element in his team. Years ago, Jake had his first child. Jake and Katie had worked together for years, both remotely and in the same office, so in the weeks following the arrival of the new baby, Jake worked from home. This worked out great for the couple, and Katie was totally fine with it because she was already used to working remotely with Jake. They were their usual productive selves until their manager, Pablo (who worked in a different office), found out that Jake was working from home for most of the week. Pablo was upset that Jake wasn’t going into the office to work with Katie, despite the fact that Jake was just as productive as always and that Katie was fine with the situation. Jake attempted to explain to Pablo that he was just as productive as he would be if he came into the office and that it was much easier on him and his wife for him to mostly work from home for a few weeks. Pablo’s response: “Dude, people have kids all the time. You need to go into the office.†Needless to say, Jake (normally a mild-mannered engineer) was enraged and lost a lot of respect for Pablo.

+ +

There are numerous ways in which Pablo could have handled this differently: he could have showed some understanding that Jake wanted to spend more time at home with his wife and, if his productivity and team weren’t being affected, just let him continue to do so for a while. He could have negotiated that Jake go into the office for one or two days a week until things settled down. Regardless of the end result, a little bit of empathy would have gone a long way toward keeping Jake happy in this situation.

+
+ +
+

Antipattern: Be Everyone’s Friend

+ +

The first foray that most people have into leadership of any sort is when they become the  manager  or TL of a team of which they were formerly members. Many leads don’t want to lose the friendships they’ve cultivated with their teams, so they will sometimes work extra hard to maintain friendships with their team members after becoming a team lead. This can be a recipe for disaster and for a lot of broken friendships. Don’t confuse friendship with leading with a soft touch: when you hold power over someone’s career, they might feel pressure to artificially reciprocate gestures of friendship.

+ +

Remember that you can lead a team and build consensus without being a close friend of your team (or a monumental hard-ass). Likewise, you can be a tough leader without tossing your existing friendships to the wind. We’ve found that having lunch with your team can be an effective way to stay socially connected to them without making them uncomfortable—this gives you a chance to have informal conversations outside the normal work environment.

+ +

Sometimes, it can be tricky to move into a management role over someone who has been a good friend and a peer. If the friend who is being managed is not self-managing and is not a hard worker, it can be stressful for everyone. We recommend that you avoid getting into this situation whenever possible, but if you can’t, pay extra attention to your relationship with those folks.

+
+ +
+

Antipattern: Compromise the Hiring Bar

+ +

Steve Jobs once said: “A people hire other A people; B people hire C people.†It’s incredibly  easy to  fall  victim to this adage, and even more so when you’re trying to hire quickly.  A common approach I’ve seen outside of Google is that a team needs to hire 5 engineers, so it sifts through a pile of applications, interviews 40 or 50 people, and picks the best 5 candidates regardless of whether they meet the hiring bar.

+ +

This is one of the fastest ways to build a mediocre team.

+ +

The cost of finding the appropriate person—whether by paying recruiters, paying for advertising, or pounding the pavement for references—pales in comparison to the cost of dealing with an employee who you never should have hired in the first place. This “cost†manifests itself in lost team productivity, team stress, time spent managing the employee up or out, and the paperwork and stress involved in firing the employee. That’s assuming, of course, that you try to avoid the monumental cost of just leaving them on the team. If you’re managing a team for which you don’t have a say over hiring and you’re unhappy with the hires being made for your team, you need to fight tooth and nail for higher-quality engineers. If you’re still handed substandard engineers, maybe it’s time to look for another job. Without the raw materials for a great team, you’re doomed.

+
+ +
+

Antipattern: Treat Your Team Like Children

+ +

The best way to show  your team that  you don’t trust it is to treat team members like kids—people tend to act the way you treat them, so  if you treat them like children or prisoners, don’t be surprised when that’s how they behave. You can manifest this behavior by micromanaging them or simply by being disrespectful of their abilities and giving them no opportunity to be responsible for their work. If it’s permanently necessary to micromanage people because you don’t trust them, you have a hiring failure on your hands. Well, it’s a failure unless your goal was to build a team that you can spend the rest of your life babysitting. If you hire people worthy of trust and show these people you trust them, they’ll usually rise to the occasion (sticking with the basic premise, as we mentioned earlier, that you’ve hired good people).

+ +

The results of this level of trust go all the way to more mundane things like office and computer supplies. As another example, Google provides employees with cabinets stocked with various and sundry office supplies (e.g., pens, notebooks, and other “legacy†implements of creation) that are free to take as employees need them. The IT department runs numerous “Tech Stops†that provide self-service areas that are like a mini electronics store. These contain lots of computer accessories and doodads (power supplies, cables, mice, USB drives, etc.) that would be easy to just grab and walk off with en masse, but because Google employees are being trusted to check these items out, they feel a responsibility to Do The Right Thing. Many people from typical corporations react in horror to hearing this, exclaiming that surely Google is hemorrhaging money due to people “stealing†these items. That’s certainly possible, but what about the costs of having a workforce that behaves like children or that has to waste valuable time formally requesting cheap office supplies? Surely  that’s more  expensive than the price of a few pens and USB cables. 

+
+
+ +
+

Positive Patterns

+ +

Now  that we’ve covered antipatterns, let’s turn to  positive patterns for successful leadership and management that we’ve learned from our experiences at Google, from watching other successful leaders and, most of all, from our own leadership mentors. These patterns are not only those that we’ve had great success implementing, but the patterns that we’ve always respected the most in the leaders who we follow.

+ +
+

Lose the Ego

+ +

We talked about “losing the ego†a few chapters ago when we first examined humility, respect, and  trust, but it’s  especially important  when you’re a team leader. This pattern is frequently misunderstood as encouraging people to be doormats and let others walk all over them, but that’s not the case at all. Of course, there’s a fine line between being humble and letting others take advantage of you, but humility is not the same as lacking confidence. You can still have self-confidence and opinions without being an egomaniac. Big personal egos are difficult to handle on any team, especially in the team’s leader. Instead, you should work to cultivate a strong collective team ego and identity.

+ +

Part of “losing the ego†is trust: you need to trust your team.  That means respecting the abilities and prior accomplishments of the team members, even if they’re new to your team.

+ +

If you’re not micromanaging your team, you can be pretty certain the folks working in the trenches know the details of their work better than you do. This means that although you might be the one driving the team to consensus and helping to set the direction, the nuts and bolts of how to accomplish your goals are best decided by the people who are putting the product together. This gives them not only a greater sense of ownership, but also a greater sense of accountability and responsibility for the success (or failure) of their product. If you have a good team and you let it set the bar for the quality and rate of its work, it will accomplish more than by you standing over team members with a carrot and a stick.

+ +

Most people new to a leadership role feel an enormous responsibility to get everything right, to know everything, and to have all the answers. We can assure you that you will not get everything right, nor will you have all the answers, and if you act like you do, you’ll quickly lose the respect of your team. A lot of this comes down to having a basic sense of security in your role. Think back to when you were an individual contributor; you could smell insecurity a mile away. Try to appreciate inquiry: when someone questions a decision or statement you made, remember that this person is usually just trying to better understand you. If you encourage inquiry, you’re much more likely to get the kind of constructive criticism that will make you a better leader of a better team. Finding people who will give you good constructive criticism is incredibly difficult, and it’s even more difficult to get this kind of criticism from people who “work for you.†Think about the big picture of what you’re trying to accomplish as a team, and accept feedback and criticism openly; avoid the urge to be territorial.

+ +

The last part  of losing the ego is a simple one, but many engineers would rather be boiled in oil than do it: apologize when you make a mistake. And we don’t mean you should just sprinkle “I’m sorry†throughout your conversation like salt on popcorn—you need to sincerely mean it. You are absolutely going to make mistakes, and whether or not you admit it, your team is going to know you’ve made a mistake. Your team members will know regardless of whether they talk to you (and one thing is guaranteed: they will talk about it with one another). Apologizing doesn’t cost money. People have enormous respect for leaders who apologize when they screw up, and contrary to popular belief, apologizing doesn’t make you vulnerable. In fact, you’ll usually gain respect from people when you apologize, because apologizing tells people that you are level headed, good at assessing situations, and—coming back to humility, respect, and trust—humble.

+
+ +
+

Be a Zen Master

+ +

As an engineer, you’ve likely developed an excellent sense of skepticism and cynicism, but  this can be  a liability when you’re trying to lead a team.  This is not to say that you should be naively optimistic at every turn, but you would do well to be less vocally skeptical while still letting your team know you’re aware of the intricacies and obstacles involved in your work. Mediating your reactions and maintaining your calm is more important as you lead more people, because your team will (both unconsciously and consciously) look to you for clues on how to act and react to whatever is going on around you.

+ +

A simple way to visualize this effect is to see your company’s organization chart as a chain of gears, with the individual contributor as a tiny gear with just a few teeth all the way at one end, and each successive manager above them as another gear, ending with the CEO as the largest gear with many hundreds of teeth. This means that every time that individual’s “manager gear†(with maybe a few dozen teeth) makes a single revolution, the “individual’s gear†makes two or three revolutions. And the CEO can make a small movement and send the hapless employee, at the end of a chain of six or seven gears, spinning wildly! The farther you move up the chain, the faster you can set the gears below you spinning, whether or not you intend to.

+ +

Another way of thinking about this is the maxim that the leader is always on stage. This means that if you’re in an overt leadership position, you are always being watched: not just when you run a meeting or give a talk, but even when you’re just sitting at your desk answering emails. Your peers are watching you for subtle clues in your body language, your reactions to small talk, and your signals as you eat lunch. Do they read confidence or fear? As a leader, your job is to inspire, but inspiration is a 24/7 job. Your visible attitude about absolutely everything—no matter how trivial—is unconsciously noticed and spreads infectiously to your team.

+ +

One of the early managers at Google, Bill Coughran, a VP of engineering, had truly mastered the ability to maintain calm at all times. No matter what blew up, no matter what crazy thing happened, no matter how big the firestorm, Bill would never panic. Most of the time he’d place one arm across his chest, rest his chin in his hand, and ask questions about the problem, usually to a completely panicked engineer. This had the effect of calming them and helping them to focus on solving the problem instead of running around like a chicken with its head cut off. Some of us used to joke that if someone came in and told Bill that 19 of the company’s offices had been attacked by space aliens, Bill’s response would be, “Any idea why they didn’t make it an even 20?â€

+ +

This brings us to another Zen management trick: asking questions.  When a team member asks you for advice, it’s usually pretty exciting because you’re finally getting the chance to fix something. That’s exactly what you did for years before moving into a leadership position, so you usually go leaping into solution mode, but that is the last place you should be. The person asking for advice typically doesn’t want you to solve their problem, but rather to help them solve it, and the easiest way to do this is to ask this person questions. This isn’t to say that you should replace yourself with a Magic 8 Ball, which would be maddening and unhelpful. Instead, you can apply some humility, respect, and trust and try to help the person solve the problem on their own by trying to refine and explore the problem. This will usually lead the employee to the answer,6 and it will be that person’s answer, which leads back to the ownership and responsibility we went over earlier in this chapter. Whether or not you have the answer, using this technique will almost always leave the employee with the impression that you did. Tricky, eh? Socrates would be proud of you.

+
+ +
+

Be a Catalyst

+ +

In chemistry, a catalyst is something that accelerates a chemical reaction, but which itself is not consumed in the reaction.    One of the ways in which catalysts (e.g., enzymes) work is to bring reactants into close proximity: instead of bouncing around randomly in a solution, the reactants are much more likely to favorably interact with one another when the catalyst helps bring them together. This is a role you’ll often need to play as a leader, and there are a number of ways you can go about it.

+ +

One of the most common things a team leader does is to build consensus.  This might mean that you drive the process from start to finish, or you just give it a gentle push in the right direction to speed it up. Working to build team consensus is a leadership skill that is often used by unofficial leaders because it’s one way you can lead without any actual authority. If you have the authority, you can direct and dictate direction, but that’s less effective overall than building consensus.7 If your team is looking to move quickly, sometimes it will voluntarily concede authority and direction to one or more team leads. Even though this might look like a dictatorship or oligarchy, when it’s done voluntarily, it’s a form of consensus.

+
+ +
+

Remove Roadblocks

+ +

Sometimes, your team already has consensus about what you need to do, but it hit a roadblock and became stuck.    This could be a technical or organizational roadblock, but jumping in to help the team get moving again is a common leadership technique. There are some roadblocks that, although virtually impossible for your team members to get past, will be easy for you to handle, and helping your team understand that you’re glad (and able) to help out with these roadblocks is valuable.

+ +

One time, a team spent several weeks trying to work past an obstacle with Google’s legal department. When the team finally reached its collective wits’ end and went to its manager with the problem, the manager had it solved in less than two hours simply because he knew the right person to contact to discuss the matter. Another time, a team needed some server resources and just couldn’t get them allocated. Fortunately, the team’s manager was in communication with other teams across the company and managed to get the team exactly what it needed that very afternoon. Yet another time, one of the engineers was having trouble with an arcane bit of Java code. Although the team’s manager was not a Java expert, she was able to connect the engineer to another engineer who knew exactly what the problem was. You don’t need to know all the answers to help remove roadblocks, but it usually helps to know the people who do. In many cases, knowing the right person is more valuable than knowing the right answer.

+
+ +
+

Be a Teacher and a Mentor

+ +

One of the most difficult things to do as a TL is to watch a more junior team member spend 3 hours working on something that you know you can knock out in 20 minutes.    Teaching people and giving them a chance to learn on their own can be incredibly difficult at first, but it’s a vital component of effective leadership.  This is especially important for new hires who, in addition to learning your team’s technology and codebase, are learning your team’s culture and the appropriate level of responsibility to assume. A good mentor must balance the trade-offs of a mentee’s time learning versus their time contributing to their product as part of an effective effort to scale the team as it grows.

+ +

Much like the role of manager, most people don’t apply for the role of mentor—they usually become one when a leader is looking for someone to mentor a new team member. It doesn’t take a lot of formal education or preparation to be a mentor. Primarily, you need three things: experience with your team’s processes and systems, the ability to explain things to someone else, and the ability to gauge how much help your mentee needs. The last thing is probably the most important—giving your mentee enough information is what you’re supposed to be doing, but if you overexplain things or ramble on endlessly, your mentee will probably tune you out rather than politely tell you they got it.

+
+ +
+

Set Clear Goals

+ +

This is one of those patterns that, as obvious as it sounds, is solidly ignored by an enormous number of leaders.    If you’re going to get your team moving rapidly in one direction, you need to make sure that every team member understands and agrees on what the direction is. Imagine your product is a big truck (and not a series of tubes). Each team member has in their hand a rope tied to the front of the truck, and as they work on the product, they’ll pull the truck in their own direction. If your intention is to pull the truck (or product) northbound as quickly as possible, you can’t have team members pulling every which way—you want them all pulling the truck north. If you’re going to have clear goals, you need to set clear priorities and help your team decide how it should make trade-offs when the time comes.

+ +

The easiest way to set a clear goal and get your team pulling the product in the same direction is to create a concise mission statement for the team. After you’ve helped the team define its direction and goals, you can step back and give it more autonomy, periodically checking in to make sure everyone is still on the right track. This not only frees up your time to handle other leadership tasks, it also drastically increases the efficiency of your team. Teams can (and do) succeed without clear goals, but they typically waste a great deal of energy as each team member pulls the product in a slightly different direction. This frustrates you, slows progress for the team, and forces you to use more and more of your own energy to correct the course.

+
+ +
+

Be Honest

+ +

This doesn’t mean that we’re assuming you are lying to your team, but it merits a mention because  you’ll inevitably  find yourself in a  position in which you can’t tell your team something or, even worse, you need to tell everyone something they don’t want to hear. One manager we know tells new team members, “I won’t lie to you, but I will tell you when I can’t tell you something or if I just don’t know.â€

+ +

If a team member approaches you about something you can’t share, it’s OK to just tell them you know the answer but are not at liberty to say anything. Even more common is when a team member asks you something you don’t know the answer to: you can tell that person you don’t know. This is another one of those things that seems blindingly obvious when you read it, but many people in a manager role feel that if they don’t know the answer to something, it proves that they’re weak or out of touch. In reality, the only thing it proves is that they’re human.

+ +

Giving hard feedback is…well, hard.  The first time you need to tell one of your reports that they made a mistake or didn’t do their job as well as expected can be incredibly stressful. Most management texts advise that you use the “compliment sandwich†to soften the blow when delivering hard feedback. A compliment sandwich looks something like this:

+ +
+

You’re a solid member of the team and one of our smartest engineers. That being said, your code is convoluted and almost impossible for anyone else on the team to understand. But you’ve got great potential and a wicked cool T-shirt collection.

+
+ +

Sure, this softens the blow, but with this sort of beating around the bush, most people will walk out of this meeting thinking only, “Sweet! I’ve got cool T-shirts!†We strongly advise against using the compliment sandwich, not because we think you should be unnecessarily cruel or harsh, but because most people won’t hear the critical message, which is that something needs to change. It’s possible to employ respect here: be kind and empathetic when delivering constructive criticism without resorting to the compliment sandwich. In fact, kindness and empathy are critical if you want the recipient to hear the criticism and not immediately go on the defensive.

+ +

Years ago, a colleague picked up a team member, Tim, from another manager who insisted that Tim was impossible to work with. He said that Tim never responded to feedback or criticism and instead just kept doing the same things he’d been told he shouldn’t do. Our colleague sat in on a few of the manager’s meetings with Tim to watch the interaction between the manager and Tim, and noticed that the manager made extensive use of the compliment sandwich so as not to hurt Tim’s feelings. When they brought Tim onto their team, they sat down with him and very clearly explained that Tim needed to make some changes to work more effectively with the team:

+ +
+

We’re quite sure that you’re not aware of this, but the way that you’re interacting with the team is alienating and angering them, and if you want to be effective, you need to refine your communication skills, and we’re committed to helping you do that.

+
+ +

They didn’t give Tim any compliments or candy-coat the issue, but just as important, they weren’t mean—they just laid out the facts as they saw them based on Tim’s performance with the previous team. Lo and behold, within a matter of weeks (and after a few more “refresher†meetings), Tim’s performance improved dramatically. Tim just needed very clear feedback and direction.

+ +

When you’re providing direct feedback or criticism, your delivery is key to making sure that your message is heard and not deflected. If you put the recipient on the defensive, they’re not going to be thinking of how they can change, but rather how they can argue with you to show you that you’re wrong. Our colleague Ben once managed an engineer who we’ll call Dean. Dean had extremely strong opinions and would argue with the rest of the team about anything. It could be something as big as the team’s mission or as small as the placement of a widget on a web page; Dean would argue with the same conviction and vehemence either way, and he refused to let anything slide. After months of this behavior, Ben met with Dean to explain to him that he was being too combative. Now, if Ben had just said, “Dean, stop being such a jerk,†you can be pretty sure Dean would have disregarded it entirely. Ben thought hard about how he could get Dean to understand how his actions were adversely affecting the team, and he came up with the following metaphor:

+ +
+

Every time a decision is made, it’s like a train coming through town—when you jump in front of the train to stop it, you slow the train down and potentially annoy the engineer driving the train. A new train comes by every 15 minutes, and if you jump in front of every train, not only do you spend a lot of your time stopping trains, but eventually one of the engineers driving the train is going to get mad enough to run right over you. So, although it’s OK to jump in front of some trains, pick and choose the ones you want to stop to make sure you’re stopping only the trains that really matter.

+
+ +

This anecdote not only injected a bit of humor into the situation, but also made it easier for Ben and Dean to discuss the effect that Dean’s “train stopping†was having on the team in addition to the energy Dean was spending on it.

+
+ +
+

Track Happiness

+ +

As a leader, one way you can make your team more productive (and less likely to leave) in the  long term is to take  some time to gauge their happiness.  The best leaders we’ve worked with have all been amateur psychologists, looking in on their team members’ welfare from time to time, making sure they get recognition for what they do, and trying to make certain they are happy with their work. One TLM we know makes a spreadsheet of all the grungy, thankless tasks that need to be done and makes certain these tasks are evenly spread across the team. Another TLM watches the hours his team is working and uses comp time and fun team outings to avoid burnout and exhaustion. Yet another starts one-on-one sessions with his team members by dealing with their technical issues as a way to break the ice, and then takes some time to make sure each engineer has everything they need to get their work done. After they’ve warmed up, he talks to the engineer for a bit about how they’re enjoying the work and what they’re looking forward to next.

+ +

A good simple way to track your team’s happiness8 is to ask the team member at the end of each one-on-one meeting, “What do you need?†This simple question is a great way to wrap up and make sure each team member has what they need to be productive and happy, although you might need to carefully probe a bit to get details. If you ask this every time you have a one-on-one, you’ll find that eventually your team will remember this and sometimes even come to you with a laundry list of things it needs to make everyone’s job better.  

+
+
+ +
+

The Unexpected Question

+ +

Shortly after I started at Google, I had my first meeting  with then-CEO Eric Schmidt, and at  the end Eric asked me, “Is there anything you need?†I had prepared a million defensive responses to difficult questions or challenges but was completely unprepared for this. So I sat there, dumbstruck and staring. You can be sure I had something ready the next time I was asked that question!

+ +

It can also be worthwhile as a leader to pay some attention to your team’s happiness outside the office.  Our colleague Mekka starts his one-on-ones by asking his reports to rate their happiness on a scale of 1 to 10, and oftentimes his reports will use this as a way to discuss happiness in and outside of the office. Be wary of assuming that people have no life outside of work—having unrealistic expectations about the amount of time people can put into their work will cause people to lose respect for you, or worse, to burn out. We’re not advocating that you pry into your team members’ personal lives, but being sensitive to personal situations that your team members are going through can give you a lot of insight as to why they might be more or less productive at any given time. Giving a little extra slack to a team member who is currently having a tough time at home can make them a lot more willing to put in longer hours when your team has a tight deadline to hit later.

+ +

A big part of tracking your team members’ happiness is tracking their careers.  If you ask a team member where they see their career in five years, most of the time you’ll get a shrug and a blank look. When put on the spot, most people won’t say much about this, but there are usually a few things that everyone would like to do in the next five years: be promoted, learn something new, launch something important, and work with smart people. Regardless of whether they verbalize this, most people are thinking about it. If you’re going to be an effective leader, you should be thinking about how you can help make all those things happen and let your team know you’re thinking about this. The most important part of this is to take these implicit goals and make them explicit so that when you’re giving career advice you have a real set of metrics with which to evaluate situations and opportunities.

+ +

Tracking happiness comes down to not just monitoring careers, but also giving your team members opportunities to improve themselves, be recognized for the work they do, and have a little fun along the way.

+
+ +
+

Other Tips and Tricks

+ +

Following are other miscellaneous tips and tricks that we at Google recommend  when you’re in a leadership position:

+ +
+
Delegate, but get your hands dirty
+
When moving from an individual contributor role to a leadership role, achieving a balance is one of the most difficult things to do. Initially, you’re inclined to do all of the work yourself, and after being in a leadership role for a long time, it’s easy to get into the habit of doing none of the work yourself. If you’re new to a leadership role, you probably need to work hard to delegate work to other engineers on your team, even if it will take them a lot longer than you to accomplish that work. Not only is this one way for you to maintain your sanity, but also it’s how the rest of your team will learn. If you’ve been leading teams for a while or if you pick up a new team, one of the easiest ways to gain the team’s respect and get up to speed on what they’re doing is to get your hands dirty—usually by taking on a grungy task that no one else wants to do. You can have a resume and a list of achievements a mile long, but nothing lets a team know how skillful and dedicated (and humble) you are like jumping in and actually doing some hard work.
+
Seek to replace yourself
+
Unless you want to keep doing the exact same job for the rest of your career, seek to replace yourself. This starts, as we mentioned earlier, with the hiring process: if you want a member of your team to replace you, you need to hire people capable of replacing you, which we usually sum up by saying that you need to “hire people smarter than you.†After you have team members capable of doing your job, you need to give them opportunities to take on more responsibilities or occasionally lead the team. If you do this, you’ll quickly see who has the most aptitude to lead as well as who wants to lead the team. Remember that some people prefer to just be high-performing individual contributors, and that’s OK. We’ve always been amazed at companies that take their best engineers and—against their wishes—throw these engineers into management roles. This usually subtracts a great engineer from your team and adds a subpar manager.
+
Know when to make waves
+
You will (inevitably and frequently) have difficult situations crop up in which every cell in your body is screaming at you to do nothing about it. It might be the engineer on your team whose technical chops aren’t up to par. It might be the person who jumps in front of every train. It might be the unmotivated employee who is working 30 hours a week. “Just wait a bit and it will get better,†you’ll tell yourself. “It will work itself out,†you’ll rationalize. Don’t fall into this trap—these are the situations for which you need to make the biggest waves and you need to make them now. Rarely will these problems work themselves out, and the longer you wait to address them, the more they’ll adversely affect the rest of the team and the more they’ll keep you up at night thinking about them. By waiting, you’re only delaying the inevitable and causing untold damage in the process. So act, and act quickly.
+
Shield your team from chaos
+
When you step into a leadership role, the first thing you’ll usually discover is that outside your team is  a world of chaos and uncertainty (or even insanity) that you never saw when you were an individual contributor. When I first became a manager back in the 1990s (before going back to being an individual contributor), I was taken aback by the sheer volume of uncertainty and organizational chaos that was happening in my company. I asked another manager what had caused this sudden rockiness in the otherwise calm company, and the other manager laughed hysterically at my naivete: the chaos had always been present, but my previous manager had shielded me and the rest of my team from it.
+
Give your team air cover
+
Whereas it’s important that you keep your team informed about what’s going on “above†them in the company, it’s just as important that you defend them from a lot of the uncertainty and frivolous demands that can be imposed upon you from outside your team. Share as much information as you can with your team, but don’t distract them with organizational craziness that is extremely unlikely to ever actually affect them.
+
Let your team know when they’re doing well
+
Many new team leads can get so caught up in dealing with the shortcomings of their team members that they neglect to provide positive feedback often enough. Just as you let someone know when they screw up, be sure to let them know when they do well, and be sure to let them (and the rest of the team) know when they knock one out of the park.
+
+ +

Lastly, here’s something the best leaders know and use often when they have adventurous team members who want to try new things:

+ +
+
It’s easy to say “yes†to something that’s easy to undo
+
If you have a team member who wants to take a day or two to try using a new tool or library9 that could speed up your product (and you’re not on a tight deadline), it’s easy to say, “Sure, give it a shot.†If, on the other hand, they want to do something like launch a product that you’re going to have to support for the next 10 years, you’ll likely want to give it a bit more thought. Really good leaders have a good sense for when something can be undone, but more things are undoable than you think (and this applies to both technical and nontechnical decisions).
+
+
+ +
+

People Are Like Plants

+ +

My wife is the youngest of six children, and her mother was faced with the difficult task of figuring out how to raise six very different children, each of whom needed different things.  I asked my mother-in-law how she managed this (see what I did there?), and she responded that kids are like plants: some are like cacti and need little water but lots of sunshine, others are like African violets and need diffuse light and moist soil, and still others are like tomatoes and will truly excel if you give them a little fertilizer. If you have six kids and give each one the same amount of water, light, and fertilizer, they’ll all get equal treatment, but the odds are good that none of them will get what they actually need.

+ +

And so your team members are also like plants: some need more light, and some need more water (and some need more…fertilizer). It’s your job as their leader to determine who needs what and then give it to them—except instead of light, water, and fertilizer, your team needs varying amounts of motivation and direction.

+ +

To get all of your team members what they need, you need to motivate the ones who are in a rut and provide stronger direction to those who are distracted or uncertain of what to do.  Of course, there are those who are “adrift†and need both motivation and direction. So, with this combination of motivation and direction, you can make your team happy and productive. And you don’t want to give them too much of either—because if they don’t need motivation or direction and you try giving it to them, you’re just going to annoy them.

+ +

Giving  direction is fairly straightforward—it requires a basic understanding of what needs to be done, some simple organizational skills, and enough coordination to break it down into manageable tasks. With these tools in hand, you can provide sufficient guidance for an engineer in need of directional help. Motivation, however, is a bit more sophisticated and merits some explanation.

+ +
+

Intrinsic Versus Extrinsic Motivation

+ +

There are two types  of motivation: extrinsic, which originates  from outside forces (such as monetary compensation), and intrinsic, which  comes from within.  In his book Drive,10 Dan Pink explains that the way to make people the happiest and most productive isn’t to motivate them extrinsically (e.g., throw piles of cash at them); rather, you need to work to increase their intrinsic motivation. Dan claims you can increase intrinsic motivation by giving people three things: autonomy, mastery, and purpose.11

+ +

A person  has autonomy when they have the ability to act on their own without someone micromanaging them.12 With autonomous employees (and Google strives to hire mostly autonomous engineers), you might give them the general direction in which they need to take the product but leave it up to them to decide how to get there. This helps with motivation not only because they have a closer relationship with the product (and likely know better than you how to build it), but also because it gives them a much greater sense of ownership of the product. The bigger their stake is in the success of the product, the greater their interest is in seeing it succeed.

+ +

Mastery in its basest form simply means that you need to give someone the opportunity  to improve existing skills and learn new ones. Giving ample opportunities for mastery not only helps to motivate people, it also makes them better over time, which makes for stronger teams.13 An employee’s skills are like the blade of a knife: you can spend tens of thousands of dollars to find people with the sharpest skills for your team, but if you use that knife for years without sharpening it, you will wind up with a dull knife that is inefficient, and in some cases useless. Google gives ample opportunities for engineers to learn new things and master their craft so as to keep them sharp, efficient, and effective.

+ +

Of course, all the autonomy and mastery in the world isn’t going to help motivate someone if they’re doing work for no reason at all, which is why you need to give their work purpose.  Many people work on products that have great significance, but they’re kept at arm’s length from the positive effects their products might have on their company, their customers, or even the world. Even for cases in which the product might have a much smaller impact, you can motivate your team by seeking the reason for their efforts and making this reason clear to them. If you can help them to see this purpose in their work, you’ll see a tremendous increase in their motivation and productivity.14 One manager we know keeps a close eye on the email feedback that Google gets for its product (one of the “smaller-impact†products), and whenever she sees a message from a customer talking about how the company’s product has helped them personally or helped their business, she immediately forwards it to the engineering team. This not only motivates the team, but also frequently inspires team members to think about ways in which they can make their product even better.

+
+
+ +
+

Conclusion

+ +

Leading a team is a different task than that of being a software engineer. As a result, good software engineers do not always make good managers, and that’s OK—effective organizations allow productive career paths for both individual contributors and people managers. Although Google has found that software engineering experience itself is invaluable for managers, the most important skills an effective manager brings to the table are social ones. Good managers enable their engineering teams by helping them work well, keeping them focused on proper goals, and insulating them from problems outside the group, all while following the three pillars of humility, trust, and respect.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Don’t "manage" in the traditional sense; focus on leadership, influence, and serving your team.

    +
  • +
  • +

    Delegate where possible; don’t DIY (Do It Yourself).

    +
  • +
  • +

    Pay particular attention to the focus, direction, and velocity of  your team.

    +
  • +
+
+

1Another difference that takes getting used to is that the things we do as managers typically pay off over a longer timeline.

2Yet another reason companies shouldn’t force people into management as part of a career path: if an engineer is able to write reams of great code and has no desire at all to manage people or lead a team, by forcing them into a management or TL role, you’re losing a great engineer and gaining a crappy manager. This is not only a bad idea, but it’s actively harmful.

3For more fascinating information on optimizing the movements of factory workers, read up on Scientific Management or Taylorism, especially its effects on worker morale.

4If you have kids, the odds are good that you can remember with startling clarity the first time you said something to your child that made you stop and exclaim (perhaps even aloud), “Holy crap, I’ve become my mother.â€

5Public criticism of an individual is not only ineffective (it puts people on the defense), but rarely necessary, and most often is just mean or cruel. You can be sure the rest of the team already knows when an individual has failed, so there’s no need to rub it in.

6See also “Rubber duck debugging.â€

7Attempting to achieve 100% consensus can also be harmful. You need to be able to decide to proceed even if not everyone is on the same page or there is still some uncertainty.

8Google also runs an annual employee survey called “Googlegeist†that rates employee happiness across many dimensions. This provides good feedback but isn’t what we would call “simple.â€

9To gain a better understanding of just how “undoable†technical changes can be, see Large-Scale Changes.

10See Dan’s fantastic TED talk on this subject.

11This assumes that the people in question are being paid well enough that income is not a source of stress.

12This assumes that you have people on your team who don’t need micromanagement.

13Of course, it also means they’re more valuable and marketable employees, so it’s easier for them to pick up and leave you if they’re not enjoying their work. See the pattern in Track Happiness.

14Adam M. Grant, “The Significance of Task Significance: Job Performance Effects, Relational Mechanisms, and Boundary Conditions,†Journal of Applied Psychology, 93, No. 1 (2018), http://bit.ly/task_significance.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch06.html b/clones/abseil.io/resources/swe-book/html/ch06.html new file mode 100644 index 00000000..c8bb782f --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch06.html @@ -0,0 +1,308 @@ + + + + + Software Engineering at Google + + + + +
+

Leading at Scale

+ + + + + +

In How to Lead a Team, we talked about what it means to go from being an “individual contributor†to being an explicit leader of a team.  It’s a natural progression to go from leading one team to leading a set of related teams, and this chapter talks about how to be effective as you continue along the path of engineering leadership.

+ +

As your role evolves, all the best practices still apply. You’re still a “servant leaderâ€; you’re just serving a larger group. That said, the scope of problems you’re solving becomes larger and more abstract. You’re gradually forced to become “higher level.†That is, you’re less and less able to get into the technical or engineering details of things, and you’re being pushed to go "broad" rather than "deep." At every step, this process is frustrating: you mourn the loss of these details, and you come to realize that your prior engineering expertise is becoming less and less relevant to your job. Instead, your effectiveness depends more than ever on your general technical intuition and ability to galvanize engineers to move in good directions.

+ +

The process is often demoralizing—until one day you notice that you’re actually having much more impact as a leader than you ever had as an individual contributor. It’s a satisfying but bittersweet realization.

+ +

So, assuming that we understand the basics of leadership, what does it take to scale yourself into a really good leader? That’s what we talk about here, using what we call “the three Always of leadershipâ€: Always Be Deciding, Always Be Leaving, Always Be Scaling.

+ +
+

Always Be Deciding

+ +

Managing a team of teams means making ever more  decisions at ever-higher levels. Your job  becomes  more about high-level strategy rather than how to solve any specific engineering task. At this level, most of the decisions you’ll make are about finding the correct set of trade-offs.

+ +
+

The Parable of the Airplane

+ +

Lindsay Jones is a friend of ours who is a professional theatrical sound designer and composer.  He spends his life flying around the United States, hopping from production to production, and he’s full of crazy (and true) stories about air travel. Here’s one of our favorite stories:

+ +
+

It’s 6 a.m., we’re all boarded on the plane and ready to go. The captain comes on the PA system and explains to us that, somehow, someone has overfilled the fuel tank by 10,000 gallons. Now, I’ve flown on planes for a long time, and I didn’t know that such a thing was possible. I mean, if I overfill my car by a gallon, I’m gonna have gas all over my shoes, right?

+ +

Well, so anyway, the captain then says that we have two options: we can either wait for the truck to come suck the fuel back out of the plane, which is going to take over an hour, or twenty people have to get off the plane right now to even out the weight.

+ +

No one moves.

+ +

Now, there’s this guy across the aisle from me in first class, and he is absolutely livid. He reminds me of Frank Burns on M*A*S*H; he’s just super indignant and sputtering everywhere, demanding to know who’s responsible. It’s an amazing showcase, it’s like he’s Margaret Dumont in the Marx Brothers movies.

+ +

So, he grabs his wallet and pulls out this massive wad of cash! And he’s like “I cannot be late for this meeting!! I will give $40 to any person who gets off this plane right now!â€

+ +

Sure enough, people take him up on it. He gives out $40 to 20 people (which is $800 in cash, by the way!) and they all leave.

+ +

So, now we’re all set and we head out to the runway, and the captain comes back on the PA again. The plane’s computer has stopped working. No one knows why. Now we gotta get towed back to the gate.

+ +

Frank Burns is apoplectic. I mean, seriously, I thought he was gonna have a stroke. He’s cursing and screaming. Everyone else is just looking at each other.

+ +

We get back to the gate and this guy is demanding another flight. They offer to book him on the 9:30, which is too late. He’s like, “Isn’t there another flight before 9:30?â€

+ +

The gate agent is like, “Well, there was another flight at 8, but it’s all full now. They’re closing the doors now.â€

+ +

And he’s like, “Full?! Whaddya mean it’s full? There’s not one open seat on that plane?!?!?!â€

+ +

The gate agent is like, “No sir, that plane was wide open until 20 passengers showed up out of nowhere and took all the seats. They were the happiest passengers I’ve ever seen, they were laughing all the way down the jet bridge.â€

+ +

It was a very quiet ride on the 9:30 flight.

+
+ +

This story is, of course, about trade-offs.  Although most of this book focuses on various technical trade-offs in engineering systems, it turns out that trade-offs also apply to human behaviors. As a leader, you need to make decisions about what your teams should do each week. Sometimes the trade-offs are obvious (“if we work on this project, it delays that other one…â€); sometimes the trade-offs have unforeseeable consequences that can come back to bite you, as in the preceding story.

+ +

At the highest level, your job as a leader—either of a single team or a larger organization—is to guide people toward solving difficult, ambiguous problems. By ambiguous, we mean that the problem has no obvious solution and might even be unsolvable. Either way, the problem needs to be explored, navigated, and (hopefully) wrestled into a state in which it’s under control. If writing code is analogous to chopping down trees, your job as a leader is to “see the forest through the trees†and find a workable path through that forest, directing engineers toward the important trees. There are three main steps to this process. First, you need to identify the blinders; next, you need to identify the trade-offs; and then you need to decide and iterate on a solution.

+
+ +
+

Identify the Blinders

+ +

When you first approach a problem, you’ll often discover that a group of people has already been  wrestling with it for years.  These folks have been steeped in the problem for so long that they’re wearing “blindersâ€â€”that is, they’re no longer able to see the forest. They make a bunch of assumptions about the problem (or solution) without realizing it. “This is how we’ve always done it,†they’ll say, having lost the ability to consider the status quo critically. Sometimes, you’ll discover bizarre coping mechanisms or rationalizations that have evolved to justify the status quo. This is where you—with fresh eyes—have a great advantage. You can see these blinders, ask questions, and then consider new strategies. (Of course, being unfamiliar with the problem isn’t a requirement for good leadership, but it’s often an advantage.)

+
+ +
+

Identify the Key Trade-Offs

+ +

By definition, important and ambiguous problems do not have magic "silver bullet" solutions.   There’s no answer that works forever in all situations. There is only the best answer for the moment, and it almost certainly involves making trade-offs in one direction or another. It’s your job to call out the trade-offs, explain them to everyone, and then help decide how to balance them.

+
+ +
+

Decide, Then Iterate

+ +

After you understand the trade-offs  and how they work, you’re empowered. You can use this information to make the best decision for this particular month.  Next month, you might need to reevaluate and rebalance the trade-offs again; it’s an iterative process.  This is what we mean when we say Always Be Deciding.

+ +

There’s a risk here. If you don’t frame your process as continuous rebalancing of trade-offs, your teams are likely to fall into the trap of searching for the perfect solution, which can then lead to what some call “analysis paralysis.†You need to make your teams comfortable with iteration.  One way of doing this is to lower the stakes and calm nerves by explaining: “We’re going to try this decision and see how it goes. Next month, we can undo the change or make a different decision.†This keeps folks flexible and in a state of learning from their choices.

+ + +
+
+ +
+

Always Be Leaving

+ +

At face value, Always Be Leaving sounds like terrible advice. Why would a good leader be trying to leave?   In fact, this is a famous quote from Bharat Mediratta, a former Google engineering director. What he meant was that it’s not just your job to solve an ambiguous problem, but to get your organization to solve it by itself, without you present. If you can do that, it frees you up to move to a new problem (or new organization), leaving a trail of self-sufficient success in your wake.

+ +

The antipattern here, of course, is a situation in which you’ve set yourself up to be a single point of failure (SPOF).  As we  noted earlier in this book, Googlers have a term for that, the bus factor: the number of people that need to get hit by a bus before your project is completely doomed.

+ +

Of course, the "bus" here is just a metaphor. People become sick; they switch teams or companies; they move away. As a litmus test, think about a difficult problem that your team is making good progress on. Now imagine that you, the leader, disappear. Does your team keep going? Does it continue to be successful? Here’s an even simpler test: think about the last vacation you took that was at least a week long. Did you keep checking your work email? (Most leaders do.) Ask yourself why. Will things fall apart if you don’t pay attention? If so, you have very likely made yourself an SPOF. You need to fix that.

+ +
+

Your Mission: Build a “Self-Driving†Team

+ +

Coming back to Bharat’s quote: being a successful leader means  building an organization that is able to solve the difficult problem by itself. That organization needs to have a strong set of leaders, healthy engineering processes, and a positive, self-perpetuating culture that persists over time. Yes, this is difficult; but it gets back to the fact that leading a team of teams is often more about organizing people rather than being a technical wizard. Again, there are three main parts to constructing this sort of self-sufficient group: dividing the problem space, delegating subproblems, and iterating as needed.

+
+ +
+

Dividing the Problem Space

+ +

Challenging problems are usually composed of difficult subproblems.  If you’re leading a team of teams, an obvious choice is to put a team in charge of each subproblem. The risk, however, is that the subproblems can change over time, and rigid team boundaries won’t be able to notice or adapt to this fact. If you’re able, consider an organizational structure that is looser—one in which subteams can change size, individuals can migrate between subteams, and the problems assigned to subteams can morph over time. This involves walking a fine line between “too rigid†and “too vague.†On the one hand, you want your subteams to have a clear sense of problem, purpose, and steady accomplishment; on the other hand, people need the freedom to change direction and try new things in response to a changing environment.

+ +
+

Example: Subdividing the “latency problem†of Google Search

+ +

When approaching the problem of  Search latency, we realized that the problem could, at a minimum, be subdivided into two general spaces: work that addressed the symptoms of latency, and different work that addressed the causes of latency. It was obvious that we needed to staff many projects to optimize our codebase for speed, but focusing only on speed wouldn’t be enough. There were still thousands of engineers increasing the complexity and "quality" of search results, undoing the speed improvements as quickly as they landed, so we also needed people to focus on a parallel problem space of preventing latency in the first place. We discovered gaps in our metrics, in our latency analysis tools, and in our developer education and documentation. By assigning different teams to work on latency causes and symptoms at the same time, we were able to systematically control latency over the long term. (Also, notice how these teams owned the problems, not specific solutions!)

+
+ +
+

Delegating subproblems to leaders

+ +

It’s essentially a cliché for management books to talk about "delegation," but there’s a reason for that: delegation is really difficult to learn.  It goes against all our instincts for efficiency and achievement. That difficulty is the reason for the adage, “If you want something done right, do it yourself.â€

+ +

That said, if you agree that your mission is to build a self-driving organization, the main mechanism of teaching is through delegation. You must build a set of self-sufficient leaders, and delegation is absolutely the most effective way to train them. You give them an assignment, let them fail, and then try again and try again. Silicon Valley has well-known mantras about “failing fast and iterating.†That philosophy doesn’t just apply to engineering design, but to human learning as well.

+ +

As a leader, your plate is constantly filling up with important tasks that need to be done. Most of these tasks are things that are fairly easy for you to do. Suppose that you’re working diligently through your inbox, responding to problems, and then you decide to put 20 minutes aside to fix a longstanding and nagging issue. But before you carry out the task, be mindful and stop yourself. Ask this critical question: Am I really the only one who can do this work?

+ +

Sure, it might be most efficient for you to do it, but then you’re failing to train your leaders. You’re not building a self-sufficient organization. Unless the task is truly time sensitive and on fire, bite the bullet and assign the work to someone else—presumably someone who you know can do it but will probably take much longer to finish. Coach them on the work if need be. You need to create opportunities for your leaders to grow; they need to learn to "level up" and do this work themselves so that you’re no longer in the critical path.

+ +

The corollary here is that you need to be mindful of your own purpose as a leader of leaders. If you find yourself deep in the weeds, you’re doing a disservice to your organization. When you get to work each day, ask yourself a different critical question: What can I do that nobody else on my team can do?

+ +

There are a number of good answers. For example, you can protect your teams from organizational politics; you can give them encouragement; you can make sure everyone is treating one another well, creating a culture of humility, trust, and respect. It’s also important to “manage up,†making sure your management chain understands what your group is doing and staying connected to the company at large. But often the most common and important answer to this question is: “I can see the forest through the trees.†In other words, you can define a high-level strategy. Your strategy needs to cover not just overall technical direction, but an organizational strategy as well. You’re building a blueprint for how the ambiguous problem is solved and how your organization can manage the problem over time. You’re continuously mapping out the forest, and then assigning the tree-cutting to others.

+
+ +
+

Adjusting and iterating

+ +

Let’s assume that you’ve now reached the point at which you’ve built a self-sustaining machine. You’re no longer an SPOF. Congratulations! What do you do now?

+ +

Before answering, note that you have actually liberated yourself—you now have the freedom to "Always Be Leaving." This could be the freedom to tackle a new, adjacent problem, or perhaps you could even move yourself to a whole new department and problem space, making room for the careers of the leaders you’ve trained. This is a great way of avoiding personal burnout.

+ +

The simple answer to “what now?†is to direct this machine and keep it healthy. But unless there’s a crisis, you should use a gentle touch. The book Debugging Teams2 has a parable about making mindful adjustments:

+ +
+

There’s a story about a Master of all things mechanical who had long since retired. His former company was having a problem that no one could fix, so they called in the Master to see if he could help find the problem. The Master examined the machine, listened to it, and eventually pulled out a worn piece of chalk and made a small X on the side of the machine. He informed the technician that there was a loose wire that needed repair at that very spot. The technician opened the machine and tightened the loose wire, thus fixing the problem. When the Master’s invoice arrived for $10,000, the irate CEO wrote back demanding a breakdown for this ridiculously high charge for a simple chalk mark! The Master responded with another invoice, showing a $1 cost for the chalk to make the mark, and $9,999 for knowing where to put it.

+ +

To us, this is a story about wisdom: that a single, carefully considered adjustment can have gigantic effects. We use this technique when managing people. We imagine our team as flying around in a great blimp, headed slowly and surely in a certain direction. Instead of micromanaging and trying to make continuous course corrections, we spend most of the week carefully watching and listening. At the end of the week we make a small chalk mark in a precise location on the blimp, then give a small but critical "tap" to adjust the course.

+
+ +

This is what good management is about: 95% observation and listening, and 5% making critical adjustments in just the right place. Listen to your leaders and skip-reports. Talk to your customers, and remember that often (especially if your team builds engineering infrastructure), your “customers†are not end users out in the world, but your coworkers. Customers’ happiness requires just as much intense listening as your reports’ happiness. What’s working and what isn’t? Is this self-driving blimp headed in the proper direction? Your direction should be iterative, but thoughtful and minimal, making the minimum adjustments necessary to correct course. If you regress into micromanagement, you risk becoming an SPOF again! “Always Be Leaving†is a call to macromanagement.

+
+ +
+

Take care in anchoring a team’s identity

+ +

A common mistake is to put a team in charge of a specific product rather than a general problem.  A product is a solution to a problem. The life expectancy of solutions can be short, and products can be replaced by better solutions. However, a problem—if chosen well—can be evergreen. Anchoring a team identity to a specific solution (“We are the team that manages the Git repositoriesâ€) can lead to all sorts of angst over time. What if a large percentage of your engineers want to switch to a new version control system? The team is likely to "dig in," defend its solution, and resist change, even if this is not the best path for the organization. The team clings to its blinders, because the solution has become part of the team’s identity and self-worth. If the team instead owns the problem (e.g., “We are the team that provides version control to the companyâ€), it is freed up to experiment with different solutions over time.  

+
+
+
+ +
+

Always Be Scaling

+ +

A lot of leadership books talk about “scaling†in the context of learning to “maximize your impactâ€â€”strategies to grow your team and influence.   We’re not going to discuss those things here beyond what we’ve already mentioned. It’s probably obvious that building a self-driving organization with strong leaders is already a great recipe for growth and success.

+ +

Instead, we’re going to discuss team scaling from a defensive and personal point of view rather than an offensive one. As a leader, your most precious resource is your limited pool of time, attention, and energy. If you aggressively build out your teams’ responsibilities and power without learning to protect your personal sanity in the process, the scaling is doomed to fail. And so we’re going to talk about how to effectively scale yourself through this process.

+ +
+

The Cycle of Success

+ +

When a team tackles a difficult problem, there’s a standard pattern that emerges, a particular cycle.  It looks like this:

+ +
+
Analysis
+
First, you receive the problem and start to wrestle with it. You identify the blinders, find all the trade-offs, and build consensus about how to manage them.
+
Struggle
+
You start moving on the work, whether or not your team thinks it’s ready. You prepare for failures, retries, and iteration. At this point, your job is mostly about herding cats. Encourage your leaders and experts on the ground to form opinions and then listen carefully and devise an overall strategy, even if you have to "fake it" at first.3
+
Traction
+
Eventually your team begins to figure things out. You’re making smarter decisions, and real progress is made. Morale improves. You’re iterating on trade-offs, and the organization is beginning to drive itself around the problem. Nice job!
+
Reward
+
Something unexpected happens. Your manager takes you aside and congratulates you on your success. You discover your reward isn’t just a pat on the back, but a whole new problem to tackle. That’s right: the reward for success is more work…and more responsibility! Often, it’s a problem that is similar or adjacent to the first one, but equally difficult.
+
+ +

So now you’re in a pickle. You’ve been given a new problem, but (usually) not more people. Somehow you need to solve both problems now, which likely means that the original problem still needs to be managed with half as many people in half the time. You need the other half of your people to tackle the new work! We refer to this final step as the compression stage: you’re taking everything you’ve been doing and compressing it down to half the size.

+ +

So really, the cycle of success is more of a spiral (see Figure 6-2). Over months and years, your organization is scaling by tackling new problems and then figuring out how to compress them so that it can take on new, parallel struggles. If you’re lucky, you’re allowed to hire more people as you go. More often than not, though, your hiring doesn’t keep pace with the scaling. Larry Page, one of Google’s founders, would probably refer to this spiral as “uncomfortably exciting.â€

+ +
The spiral of success +
Figure 6-2. The spiral of success
+
+ +

The spiral of success is a conundrum—it’s something that’s difficult to manage, and yet it’s the main paradigm for scaling a team of teams. The act of compressing a problem isn’t just about figuring out how to maximize your team’s efficiency, but also about learning to scale your own time and attention to match the new breadth of responsibility.

+
+ +
+

Important Versus Urgent

+ +

Think back to a time when you weren’t yet a leader, but still a carefree individual contributor.    If you used to be a programmer, your life was likely calmer and more panic-free. You had a list of work to do, and each day you’d methodically work down your list, writing code and debugging problems. Prioritizing, planning, and executing your work was straightforward.

+ +

As you moved into leadership, though, you might have noticed that your main mode of work became less predictable and more about firefighting. That is, your job became less proactive and more reactive. The higher up in leadership you go, the more escalations you receive. You are the "finally" clause in a long list of code blocks! All of your means of communication—email, chat rooms, meetings—begin to feel like a Denial-of-Service attack against your time and attention. In fact, if you’re not mindful, you end up spending 100% of your time in reactive mode. People are throwing balls at you, and you’re frantically jumping from one ball to the next, trying not to let any of them hit the ground.

+ +

A lot of books have discussed this problem.  The management author Stephen Covey is famous for talking about the idea of distinguishing between things that are important versus things that are urgent. In fact, it was US President Dwight D. Eisenhower who popularized this idea in a famous 1954 quote:

+ +
+

I have two kinds of problems, the urgent and the important. The urgent are not important, and the important are never urgent.

+
+ +

This tension is one of the biggest dangers to your effectiveness as a leader. If you let yourself slip into pure reactive mode (which happens almost automatically), you spend every moment of your life on urgent things, but almost none of those things are important in the big picture. Remember that your job as a leader is to do things that only you can do, like mapping a path through the forest. Building that meta-strategy is incredibly important, but almost never urgent. It’s always easier to respond to that next urgent email.

+ +

So how can you force yourself to work mostly on important things, rather than urgent things? Here are a few key techniques:

+ +
+
Delegate
+
Many of the urgent things you see can be delegated back to other leaders in your organization. You might feel guilty if it’s a trivial task; or you might worry that handing off an issue is inefficient because it might take those other leaders longer to fix. But it’s good training for them, and it frees up your time to work on important things that only you can do.
+
Schedule dedicated time
+
Regularly block out two hours or more to sit quietly and work only on important-but-not-urgent things—things like team strategy, career paths for your leaders, or how you plan to collaborate with neighboring teams.
+
Find a tracking system that works
+
There are dozens of systems for tracking and prioritizing work.  Some are software based (e.g., specific “to-do†tools), some are pen-and-paper based (the “Bullet Journal†method), and some systems are agnostic to implementation. In this last category, David Allen’s book, Getting Things Done, is quite popular among engineering managers; it’s an abstract algorithm for working through tasks and maintaining a prized "inbox zero." The point here is to try these different systems and determine what works for you. Some of them will click with you and some will not, but you definitely need to find something more effective than tiny Post-It notes decorating your computer screen. 
+
+
+ +
+

Learn to Drop Balls

+ +

There’s one more key technique for managing your time, and on the surface it sounds radical.  For many, it contradicts years of engineering instinct. As an engineer, you pay attention to detail; you make lists, you check things off lists, you’re precise, and you finish what you start. That’s why it feels so good to close bugs in a bug tracker, or whittle your email down to inbox zero. But as a leader of leaders, your time and attention are under constant attack. No matter how much you try to avoid it, you end up dropping balls on the floor—there are just too many of them being thrown at you. It’s overwhelming, and you probably feel guilty about this all the time.

+ +

So, at this point, let’s step back and take a frank look at the situation. If dropping some number of balls is inevitable, isn’t it better to drop certain balls deliberately rather than accidentally? At least then you have some semblance of control.

+ +

Here’s a great way to do that.

+ +

Marie Kondo is an organizational consultant and the author  of the extremely popular book The Life-Changing Magic of Tidying Up. Her philosophy is about effectively decluttering all of the junk from your house, but it works for abstract clutter as well.

+ +

Think of your physical possessions as living in three piles. About 20% of your things are just useless—things that you literally never touch anymore, and all very easy to throw away. About 60% of your things are somewhat interesting; they vary in importance to you, and you sometimes use them, sometimes not. And then about 20% of your possessions are exceedingly important: these are the things you use all the time, that have deep emotional meaning, or, in Ms. Kondo’s words, spark deep “joy†just holding them. The thesis of her book is that most people declutter their lives incorrectly: they spend time tossing the bottom 20% in the garbage, but the remaining 80% still feels too cluttered. She argues that the true work of decluttering is about identifying the top 20%, not the bottom 20%. If you can identify only the critical things, you should then toss out the other 80%. It sounds extreme, but it’s quite effective. It is greatly freeing to declutter so radically.

+ +

It turns out that you can also apply this philosophy to your inbox or task list—the barrage of balls being thrown at you. Divide your pile of balls into three groups: the bottom 20% are probably neither urgent nor important and very easy to delete or ignore. There’s a middle 60%, which might contain some bits of urgency or importance, but it’s a mixed bag. At the top, there’s 20% of things that are absolutely, critically important.

+ +

And so now, as you work through your tasks, do not try to tackle the top 80%—you’ll still end up overwhelmed and mostly working on urgent-but-not-important tasks. Instead, mindfully identify the balls that strictly fall in the top 20%—critical things that only you can do—and focus strictly on them. Give yourself explicit permission to drop the other 80%.

+ +

It might feel terrible to do so at first, but as you deliberately drop so many balls, you’ll discover two amazing things. First, even if you don’t delegate that middle 60% of tasks, your subleaders often notice and pick them up automatically. Second, if something in that middle bucket is truly critical, it ends up coming back to you anyway, eventually migrating up into the top 20%. You simply need to trust that things below your top-20% threshold will either be taken care of or evolve appropriately. Meanwhile, because you’re focusing only on the critically important things, you’re able to scale your time and attention to cover your group’s ever-growing responsibilities.

+
+ +
+

Protecting Your Energy

+ +

We’ve talked about protecting your time and attention—but your personal energy is the other piece of the equation.  All of this scaling is simply exhausting. In an environment like this, how do you stay charged and optimistic?

+ +

Part of the answer is that over time, as you grow older, your overall stamina builds up. Early in your career, working eight hours a day in an office can feel like a shock; you come home tired and dazed. But just like training for a marathon, your brain and body build up larger reserves of stamina over time.

+ +

The other key part of the answer is that leaders gradually learn to manage their energy more intelligently. It’s something they learn to pay constant attention to. Typically, this means being aware of how much energy you have at any given moment, and making deliberate choices to “recharge†yourself at specific moments, in specific ways. Here are some great examples of mindful energy management:

+ +
+
Take real vacations
+
A weekend is not a vacation. It takes at least three days to "forget" about your work; it takes at least a week to actually feel refreshed. But if you check your work email or chats, you ruin the recharge. A flood of worry comes back into your mind, and all of the benefit of psychological distancing dissipates. The vacation recharges only if you are truly disciplined about disconnecting.4 And, of course, this is possible only if you’ve built a self-driving organization.
+
Make it trivial to disconnect
+
When you disconnect, leave your work laptop at the office. If you have work communications on your phone, remove them. For example, if your company uses G Suite (Gmail, Google Calendar, etc.), a great trick is to install these apps in a "work profile" on your phone. This causes a second set of work-badged apps to appear on your phone. For example, you’ll now have two Gmail apps: one for personal email, one for work email. On an Android phone, you can then press a single button to disable the entire work profile at once. All the work apps gray out, as if they were uninstalled, and you can’t “accidentally†check work messages until you re-enable the work profile.
+
Take real weekends, too
+
A weekend isn’t as effective as a vacation, but it still has some rejuvenating power. Again, this recharge works only if you disconnect from work communications. Try truly signing out on Friday night, spend the weekend doing things you love, and then sign in again on Monday morning when you’re back in the office.
+
Take breaks during the day
+
Your brain operates in natural 90-minute cycles.5 Use the opportunity to get up and walk around the office, or spend 10 minutes walking outside. Tiny breaks like this are only tiny recharges, but they can make a tremendous difference in your stress levels and how you feel over the next two hours of work.
+
Give yourself permission to take a mental health day
+
Sometimes, for no reason, you just have a bad day. You might have slept well, eaten well, exercised—and yet you are still in a terrible mood anyway. If you’re a leader, this is an awful thing. Your bad mood sets the tone for everyone around you, and it can lead to terrible decisions (emails you shouldn’t have sent, overly harsh judgements, etc.). If you find yourself in this situation, just turn around and go home, declaring a sick day. Better to get nothing done that day than to do active damage.
+
+ +

In the end, managing your energy is just as important as managing your time. If you learn to master these things, you’ll be ready to tackle the broader cycle of scaling responsibility and building a self-sufficient team.

+
+
+ +
+

Conclusion

+ +

Successful leaders naturally take on more responsibility as they progress (and that’s a good and natural thing). Unless they effectively come up with techniques to properly make decisions quickly, delegate when needed, and manage their increased responsibility, they might end up feeling overwhelmed. Being an effective leader doesn’t mean that you need to make perfect decisions, do everything yourself, or work twice as hard. Instead, strive to always be deciding, always be leaving, and always be scaling.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Always Be Deciding: Ambiguous problems have no magic answer; they’re all about finding the right trade-offs of the moment, and iterating.

    +
  • +
  • +

    Always Be Leaving: Your job, as a leader, is to build an organization that automatically solves a class of ambiguous problems—over time—without you needing to be present.

    +
  • +
  • +

    Always Be Scaling: Success generates more responsibility over time, and you must proactively manage the scaling of this work in order to protect your scarce resources of personal time, attention, and energy. 

    +
  • +
+
+

1“Code yellow†is Google’s term for “emergency hackathon to fix a critical problem.†Affected teams are expected to suspend all work and focus 100% attention on the problem until the state of emergency is declared over.

2Brian W. Fitzpatrick and Ben Collins-Sussman, Debugging Teams: Better Productivity through Collaboration (Boston: O’Reilly, 2016).

3It’s easy for imposter syndrome to kick in at this point. One technique for fighting the feeling that you don’t know what you’re doing is to simply pretend that some expert out there knows exactly what to do, and that they’re simply on vacation and you’re temporarily subbing in for them. It’s a great way to remove the personal stakes and give yourself permission to fail and learn.

4You need to plan ahead and build around the assumption that your work simply won’t get done during vacation. Working hard (or smart) just before and after your vacation mitigates this issue.

5You can read more about BRAC at https://en.wikipedia.org/wiki/Basic_rest-activity_cycle.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch07.html b/clones/abseil.io/resources/swe-book/html/ch07.html new file mode 100644 index 00000000..39ddfc82 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch07.html @@ -0,0 +1,421 @@ + + + + + Software Engineering at Google + + + + +
+

Measuring Engineering Productivity

+ + + + + +

Google is a data-driven company.  We back up most of our products and design decisions with hard data. The culture of data-driven decision making, using appropriate metrics, has some drawbacks, but overall, relying on data tends to make most decisions objective rather than subjective, which is often a good thing. Collecting and analyzing data on the human side of things, however, has its own challenges.  Specifically, within software engineering, Google has found that having a team of specialists focus on engineering productivity itself to be very valuable and important as the company scales and can leverage insights from such a team.

+ +
+

Why Should We Measure Engineering Productivity?

+ +

Let’s presume that you  have a thriving business (e.g., you run an online search engine), and you want to increase your business’s scope (enter into the enterprise application market, or the cloud market, or the mobile market). Presumably, to increase the scope of your business, you’ll need to also increase the size of your engineering organization. However, as organizations grow in size linearly, communication costs grow quadratically.1 Adding more people will be necessary to increase the scope of your business, but the communication overhead costs will not scale linearly as you add additional personnel. As a result, you won’t be able to scale the scope of your business linearly to the size of your engineering organization.

+ +

There is another way to address our scaling problem, though: we could make each individual more productive. If we can increase the  productivity of individual engineers in the organization, we can increase the scope of our business without the commensurate increase in communication overhead.

+ +

Google has had to grow quickly into new businesses, which has meant learning how to make our engineers more productive. To do this, we needed to understand what makes them productive, identify inefficiencies in our engineering processes, and fix the identified problems. Then, we would repeat the cycle as needed in a continuous improvement loop. By doing this, we would be able to scale our engineering organization with the increased demand on it.

+ +

However, this improvement cycle also takes human resources. It would not be worthwhile to improve the productivity of your engineering organization by the equivalent of 10 engineers per year if it took 50 engineers per year to understand and fix productivity blockers. Therefore, our goal is to not only improve software engineering productivity, but to do so efficiently.

+ +

At Google, we addressed these trade-offs by creating a team of researchers dedicated to understanding engineering productivity. Our research team includes people from the software engineering research field and generalist software engineers, but we also include social scientists from a variety of fields, including cognitive psychology and behavioral economics. The addition of people from the social sciences allows us to not only study the software artifacts that engineers produce, but to also understand the human side of software development, including personal motivations, incentive structures, and strategies for managing complex tasks. The goal of the team is to take a data-driven approach to measuring and improving engineering productivity.

+ +

In this chapter, we walk through how our research team achieves this goal. This begins with the triage process: there are many parts of software development that we can measure, but what should we measure? After a project is selected, we walk through how the research team identifies meaningful metrics that will identify the problematic parts of the process. Finally, we look at how Google uses these metrics to track improvements to productivity.

+ +

For this chapter, we follow one concrete example posed by the C++ and Java language teams at Google: readability. For most of Google’s existence, these teams have managed the readability process at Google. (For more on readability, see Knowledge Sharing.) The readability process was put in place in the early days of Google, before automatic formatters (Style Guides and Rules) and linters that block submission were commonplace (Code Review). The process itself is expensive to run because it requires hundreds of engineers performing readability reviews for other engineers in order to grant readability to them. Some engineers viewed it as an archaic hazing process that no longer held utility, and it was a favorite topic to argue about around the lunch table. The concrete question from the language teams was this: is the time spent on the readability process worthwhile? 

+
+ +
+

Triage: Is It Even Worth Measuring?

+ +

Before we decide how to measure the productivity of engineers, we need to know when a metric is even worth measuring.   The measurement itself is expensive: it takes people to measure the process, analyze the results, and disseminate them to the rest of the company. Furthermore, the measurement process itself might be onerous and slow down the rest of the engineering organization. Even if it is not slow, tracking progress might change engineers' behavior, possibly in ways that mask the underlying issues. We need to measure and estimate smartly; although we don’t want to guess, we shouldn’t waste time and resources measuring unnecessarily.

+ +

At Google, we’ve come up with a series of questions to help teams determine whether it’s even worth measuring productivity in the first place. We first ask people to describe what they want to measure in the form of a concrete question; we find that the more concrete people can make this question, the more likely they are to derive benefit from the process. When the readability team approached us, its question was simple: are the costs of an engineer going through the readability process worth the benefits they might be deriving for the company?

+ +

We then ask them to consider the following aspects of their question:

+ +
+
What result are you expecting, and why?
+
+

Even though we might like to pretend that we are neutral investigators, we are not. We do have preconceived notions about what ought to happen. By acknowledging this at the outset, we can try to address these biases and prevent post hoc explanations of the results.

+ +

When this question was posed to the readability team, it noted that it was not sure. People were certain the costs had been worth the benefits at one point in time, but with the advent of autoformatters and static analysis tools, no one was entirely certain. There was a growing belief that the process now served as a hazing ritual. Although it might still provide engineers with benefits (and they had survey data showing that people did claim these benefits), it was not clear whether it was worth the time commitment of the authors or the reviewers of the code.

+
+
If the data supports your expected result, what action will be taken?
+
+

We ask this because if no action will be taken, there is no point in measuring. Notice that an action might in fact be “maintain the status quo†if there is a planned change that will occur if we didn’t have this result.

+ +

When asked about this, the answer from the readability team was straightforward: if the benefit was enough to justify the costs of the process, they would link to the research and the data on the FAQ about readability and advertise it to set expectations.

+
+
If we get a negative result, will appropriate action be taken?
+
+

We ask this question because in many cases, we find that a negative result will not change a decision. There might be other inputs into a decision that would override any negative result. If that is the case, it might not be worth measuring in the first place. This is the question that stops most of the projects that our research team takes on; we learn that the decision makers were interested in knowing the results, but for other reasons, they will not choose to change course.

+ +

In the case of readability, however, we had a strong statement of action from the team. It committed that, if our analysis showed that the costs either outweighed the benefit or the benefits were negligible, the team would kill the process. As different programming languages have different levels of maturity in formatters and static analyses, this evaluation would happen on a per-language basis.

+
+
Who is going to decide to take action on the result, and when would they do it?
+
+

We ask this to ensure that the person requesting the measurement is the one who is empowered to take action (or is doing so directly on their behalf). Ultimately, the goal of measuring our software process is to help people make business decisions. It’s important to understand who that individual is, including what form of data convinces them. Although the best research includes a variety of approaches (everything from structured interviews to statistical analyses of logs), there might be limited time in which to provide decision makers with the data they need. In those cases, it might be best to cater to the decision maker. Do they tend to make decisions by empathizing through the stories that can be retrieved from interviews?2 Do they trust survey results or logs data? Do they feel comfortable with complex statistical analyses? If the decider doesn’t believe the form of the result in principle, there is again no point in measuring the process.

+ +

In the case of readability, we had a clear decision maker for each programming language. Two language teams, Java and C++, actively reached out to us for assistance, and the others were waiting to see what happened with those languages first.3 The decision makers trusted engineers’ self-reported experiences for understanding happiness and learning, but the decision makers wanted to see “hard numbers†based on logs data for velocity and code quality. This meant that we needed to include both qualitative and quantitative analysis for these metrics. There was not a hard deadline for this work, but there was an internal conference that would make for a useful time for an announcement if there was going to be a change. That deadline gave us several months in which to complete the work.

+
+
+ +

By asking these questions, we find that in many cases, measurement is simply not worthwhile…and that’s OK! There are many good reasons to not measure the impact of a tool or process on productivity. Here are some examples that we’ve seen:

+ +
+
You can’t afford to change the process/tools right now
+
There might be time constraints or financial constraints that prevent this. For example, you might determine that if only you switched to a faster build tool, it would save hours of time every week. However, the switchover will mean pausing development while everyone converts over, and there’s a major funding deadline approaching such that you cannot afford the interruption. Engineering trade-offs are not evaluated in a vacuum—in a case like this, it’s important to realize that the broader context completely justifies delaying action on a result.
+
Any results will soon be invalidated by other factors
+
+

Examples here might include measuring the software process of an organization just before a planned reorganization. Or measuring the amount of technical debt for a deprecated system.

+ +

The decision maker has strong opinions, and you are unlikely to be able to provide a large enough body of evidence, of the right type, to change their beliefs.

+ +

This comes down to knowing your audience. Even at Google, we sometimes find people who have unwavering beliefs on a topic due to their past experiences. We have found stakeholders who never trust survey data because they do not believe self-reports. We’ve also found stakeholders who are swayed best by a compelling narrative that was informed by a small number of interviews. And, of course, there are stakeholders who are swayed only by logs analysis. In all cases, we attempt to triangulate on the truth using mixed methods, but if a stakeholder is limited to believing only in methods that are not appropriate for the problem, there is no point in doing the work.

+
+
The results will be used only as vanity metrics to support something you were going to do anyway
+
This is perhaps the most common reason we tell people at Google not to measure a software process. Many times, people have planned a decision for multiple reasons, and improving the software development process is only one benefit of several. For example, the release tool team at Google once requested a measurement to a planned change to the release workflow system. Due to the nature of the change, it was obvious that the change would not be worse than the current state, but they didn’t know if it was a minor improvement or a large one. We asked the team: if it turns out to only be a minor improvement, would you spend the resources to implement the feature anyway, even if it didn’t look to be worth the investment? The answer was yes! The feature happened to improve productivity, but this was a side effect: it was also more performant and lowered the release tool team’s maintenance burden.
+
The only metrics available are not precise enough to measure the problem and can be confounded by other factors
+
In some cases, the metrics needed (see the upcoming section on how to identify metrics) are simply unavailable. In these cases, it can be tempting to measure using other metrics that are less precise (lines of code written, for example). However, any results from these metrics will be uninterpretable. If the metric confirms the stakeholders’ preexisting beliefs, they might end up proceeding with their plan without consideration that the metric is not an accurate measure. If it does not confirm their beliefs, the imprecision of the metric itself provides an easy explanation, and the stakeholder might, again, proceed with their plan.
+
+ +

When you are successful at measuring your software process, you aren’t setting out to prove a hypothesis correct or incorrect; success means giving a stakeholder the data they need to make a decision. If that stakeholder won’t use the data, the project is always a failure. We should only measure a software process when a concrete decision will be made based on the outcome. For the readability team, there was a clear decision to be made. If the metrics showed the process to be beneficial, they would publicize the result. If not, the process would be abolished. Most important, the readability team had the authority to make this decision.  

+
+ +
+

Selecting Meaningful Metrics with Goals and Signals

+ +

After we decide to measure a software process, we need to determine what metrics to use.   Clearly, lines of code (LOC) won’t do,4 but how do we actually measure engineering productivity?

+ +

At Google, we use the Goals/Signals/Metrics (GSM) framework  to guide metrics creation. 

+ +
    +
  • +

    A goal is a desired end result. It’s phrased in terms of what you want to understand at a high level and should not contain references to specific ways to measure it. 

    +
  • +
  • +

    A signal is how you might know that you’ve achieved the end result.  Signals are things we would like to measure, but they might not be measurable themselves.

    +
  • +
  • +

    A metric is proxy for a signal.  It is the thing we actually can measure. It might not be the ideal measurement, but it is something that we believe is close enough.

    +
  • +
+ +

The GSM framework encourages several desirable properties when creating metrics. First, by creating goals  first, then signals, and finally metrics, it prevents the streetlight effect. The term comes from the full phrase “looking for your keys under the streetlightâ€: if you look only where you can see, you might not be looking in the right place. With metrics, this occurs when we use the metrics that we have easily accessible and that are easy to measure, regardless of whether those metrics suit our needs. Instead, GSM forces us to think about which metrics will actually help us achieve our goals, rather than simply what we have readily available.

+ +

Second, GSM helps prevent both metrics creep and metrics bias by encouraging us to come up with the appropriate set of metrics, using a principled approach, in advance of actually measuring the result. Consider the case in which we select metrics without a principled approach and then the results do not meet our stakeholders' expectations. At that point, we run the risk that stakeholders will propose that we use different metrics that they believe will produce the desired result. And because we didn’t select based on a principled approach at the start, there’s no reason to say that they’re wrong! Instead, GSM encourages us to select metrics based on their ability to measure the original goals. Stakeholders can easily see that these metrics map to their original goals and agree, in advance, that this is the best set of metrics for measuring the outcomes.

+ +

Finally, GSM can show us where we have measurement coverage and where we do not. When we run through the GSM process, we list all our goals and create signals for each one. As we will see in the examples, not all signals are going to be measurable—and that’s OK! With GSM, at least we have identified what is not measurable. By identifying these missing metrics, we can assess whether it is worth creating new metrics or even worth measuring at all.

+ +

The important  thing is to maintain traceability. For each metric, we should be able to trace back to the signal that it is meant to be a proxy for and to the goal it is trying to measure. This ensures that we know which metrics we are measuring and why we are measuring them.  

+
+ +
+

Goals

+ +

A goal should be written in terms of a desired property, without reference to any metric.   By themselves, these goals are not measurable, but a good set of goals is something that everyone can agree on before proceeding onto signals and then metrics.

+ +

To make this work, we need to have identified the correct set of goals to measure in the first place. This would seem straightforward: surely the team knows the goals of their work!  However, our research team has found that in many cases, people forget to include all the possible trade-offs within productivity, which could lead to mismeasurement.

+ +

Taking the readability example, let’s assume that the team was so focused on making the readability process fast and easy that it had forgotten the goal about code quality. The team set up tracking measurements for how long it takes to get through the review process and how happy engineers are with the process. One of our teammates proposes the following:

+ +
+

I can make your review velocity very fast: just remove code reviews entirely.

+
+ +

Although this is obviously an extreme example, teams forget core trade-offs all the time when measuring: they become so focused on improving velocity that they forget to measure quality (or vice versa). To combat this, our research team divides productivity into five core components. These five components are in trade-off with one another, and we encourage teams to consider goals in each of these components to ensure that they are not inadvertently improving one while driving others downward.  To help people remember all five components, we use the mnemonic “QUANTSâ€:

+ +
+
Quality of the code
+
What is the quality of the code produced?   Are the test cases good enough to prevent regressions? How good is an architecture at mitigating risk and changes?
+
Attention from engineers
+
How frequently do engineers reach a state of flow?  How much are they distracted by notifications? Does a tool encourage engineers to context switch?
+
Intellectual complexity
+
How much cognitive load is required to complete a task?  What is the inherent complexity of the problem being solved? Do engineers need to deal with unnecessary complexity?
+
Tempo and velocity
+
How quickly can engineers accomplish their tasks?  How fast can they push their releases out? How many tasks do they complete in a given timeframe?
+
Satisfaction
+
How happy are engineers with their tools?  How well does a tool meet engineers' needs? How satisfied are they with their work and their end product? Are engineers feeling burned out?
+
+ +

Going back to the readability example, our research team worked with the readability team to identify several productivity goals of the readability process:

+ +
+
Quality of the code
+
Engineers write higher-quality code as a result of the readability process; they write more consistent code as a result of the readability process; and they contribute to a culture of code health as a result of the readability process.
+
Attention from engineers
+
We did not have any attention goal for readability. This is OK! Not all questions about engineering productivity involve trade-offs in all five areas.
+
Intellectual complexity
+
Engineers learn about the Google codebase and best coding practices as a result of the readability process, and they receive mentoring during the readability process.
+
Tempo and velocity
+
Engineers complete work tasks faster and more efficiently as a result of the readability process.
+
Satisfaction
+
Engineers see the benefit of the readability process and have positive feelings about participating in it.
+
+
+ +
+

Signals

+ +

A signal is the way in which we will know we’ve achieved our goal.  Not all signals are measurable, but that’s acceptable at this stage.  There is not a 1:1 relationship between signals and goals. Every goal should have at least one signal, but they might have more. Some goals might also share a signal. Table 7-1 shows some example signals for the goals of the readability process measurement.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 7-1. Signals and goals
GoalsSignals
Engineers write higher-quality code as a result of the readability process.Engineers who have been granted readability judge their code to be of higher quality than engineers who have not been granted readability.
+ The readability process has a positive impact on code quality.
Engineers learn about the Google codebase and best coding practices as a result of the readability process.Engineers report learning from the readability process.
Engineers receive mentoring during the readability process.Engineers report positive interactions with experienced Google engineers who serve as reviewers during the readability process.
Engineers complete work tasks faster and more efficiently as a result of the readability process.Engineers who have been granted readability judge themselves to be more productive than engineers who have not been granted readability.
+ Changes written by engineers who have been granted readability are faster to review than changes written by engineers who have not been granted readability.
Engineers see the benefit of the readability process and have positive feelings about participating in it.Engineers view the readability process as being worthwhile.
+
+ +
+

Metrics

+ +

Metrics are where we finally determine how we will measure the signal.    Metrics are not the signal themselves; they are the measurable proxy of the signal. Because they are a proxy, they might not be a perfect measurement. For this reason, some signals might have multiple metrics as we try to triangulate on the underlying signal.

+ +

For example, to measure whether engineers' code is reviewed faster after readability, we might use a combination of both survey data and logs data. Neither of these metrics really provide the underlying truth. (Human perceptions are fallible, and logs metrics might not be measuring the entire picture of the time an engineer spends reviewing a piece of code or can be confounded by factors unknown at the time, like the size or difficulty of a code change.) However, if these metrics show different results, it signals that possibly one of them is incorrect and we need to explore further. If they are the same, we have more confidence that we have reached some kind of truth.

+ +

Additionally, some signals might not have any associated metric because the signal might simply be unmeasurable at this time. Consider, for example, measuring code quality. Although academic literature has proposed many proxies for code quality, none of them have truly captured it. For readability, we had a decision of either using a poor proxy and possibly making a decision based on it, or simply acknowledging that this is a point that cannot currently be measured. Ultimately, we decided not to capture this as a quantitative measure, though we did ask engineers to self-rate their code quality.

+ +

Following the GSM framework is a great way to clarify the goals for why you are measuring your software process and how it will actually be measured. However, it’s still possible that the metrics selected are not telling the complete story because they are not capturing the desired signal. At Google, we use qualitative data to validate our metrics and ensure that they are capturing the intended signal. 

+
+ +
+

Using Data to Validate Metrics

+ +

As an example, we once created a metric for measuring each engineer’s median build latency; the  goal  was to capture the “typical experience†of engineers’ build latencies. We then ran an experience sampling study. In this style of study, engineers are interrupted in context of doing a task of interest to answer a few questions. After an engineer started a build, we automatically sent them a small survey about their experiences and expectations of build latency. However, in a few cases, the engineers responded that they had not started a build! It turned out that automated tools were starting up builds, but the engineers were not blocked on these results and so it didn’t “count†toward their “typical experience.†We then adjusted the metric to exclude such builds.5

+ +

Quantitative metrics are useful because they give you power and scale. You can measure the experience of engineers across the entire company over a large period of time and have confidence in the results. However, they don’t provide any context or narrative. Quantitative metrics don’t explain why an engineer chose to use an antiquated tool to accomplish their task, or why they took an unusual workflow, or why they circumvented a standard process.  Only qualitative studies can provide this information, and only qualitative studies can then provide insight on the next steps to improve a process.

+ +

Consider now the signals presented in Table 7-2. What metrics might you create to measure each of those? Some of these signals might be measurable by analyzing tool and code logs. Others are measurable only by directly asking engineers. Still others might not be perfectly measurable—how do we truly measure code quality, for example?

+ +

Ultimately, when evaluating the impact of readability on productivity, we ended up with a combination of metrics from three sources. First, we had a survey that was specifically about the readability process.    This survey was given to people after they completed the process; this allowed us to get their immediate feedback about the process. This hopefully avoids recall bias,6 but it does introduce both recency bias7 and sampling bias.8 Second, we used a large-scale quarterly survey to track items that were not specifically about readability; instead, they were purely about metrics that we expected readability should affect. Finally, we used fine-grained logs metrics from our developer tools to determine how much time the logs claimed it took engineers to complete specific tasks.9 Table 7-2 presents the complete list of metrics with their corresponding signals and goals.  

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 7-2. Goals, signals, and metrics
QUANTSGoalSignalMetric
Quality of the codeEngineers write higher-quality code as a result of the readability process.Engineers who have been granted readability judge their code to be of higher quality than engineers who have not been granted readability.Quarterly Survey: Proportion of engineers who report being satisfied with the quality of their own code
  The readability process has a positive impact on code quality.Readability Survey: Proportion of engineers reporting that readability reviews have no impact or negative impact on code quality
   Readability Survey: Proportion of engineers reporting that participating in the readability process has improved code quality for their team
 Engineers write more consistent code as a result of the readability process.Engineers are given consistent feedback and direction in code reviews by readability reviewers as a part of the readability process.Readability Survey: Proportion of engineers reporting inconsistency in readability reviewers’ comments and readability criteria.
 Engineers contribute to a culture of code health as a result of the readability process.Engineers who have been granted readability regularly comment on style and/or readability issues in code reviews.Readability Survey: Proportion of engineers reporting that they regularly comment on style and/or readability issues in code reviews
Attention from engineersn/an/an/a
Intellectual complexityEngineers learn about the Google codebase and best coding practices as a result of the readability process.Engineers report learning from the readability process.Readability Survey: Proportion of engineers reporting that they learned about four relevant topics
   Readability Survey: Proportion of engineers reporting that learning or gaining expertise was a strength of the readability process
 Engineers receive mentoring during the readability process.Engineers report positive interactions with experienced Google engineers who serve as reviewers during the readability process.Readability Survey: Proportion of engineers reporting that working with readability reviewers was a strength of the readability process
Tempo/velocityEngineers are more productive as a result of the readability process.Engineers who have been granted readability judge themselves to be more productive than engineers who have not been granted readability.Quarterly Survey: Proportion of engineers reporting that they’re highly productive
  Engineers report that completing the readability process positively affects their engineering velocity.Readability Survey: Proportion of engineers reporting that not having readability reduces team engineering velocity
  Changelists (CLs) written by engineers who have been granted readability are faster to review than CLs written by engineers who have not been granted readability.Logs data: Median review time for CLs from authors with readability and without readability
  CLs written by engineers who have been granted readability are easier to shepherd through code review than CLs written by engineers who have not been granted readability.Logs data: Median shepherding time for CLs from authors with readability and without readability
  CLs written by engineers who have been granted readability are faster to get through code review than CLs written by engineers who have not been granted readability.Logs data: Median time to submit for CLs from authors with readability and without readability
  The readability process does not have a negative impact on engineering velocity.Readability Survey: Proportion of engineers reporting that the readability process negatively impacts their velocity
   Readability Survey: Proportion of engineers reporting that readability reviewers responded promptly
   Readability Survey: Proportion of engineers reporting that timeliness of reviews was a strength of the readability process
SatisfactionEngineers see the benefit of the readability process and have positive feelings about participating in it.Engineers view the readability process as being an overall positive experience.Readability Survey: Proportion of engineers reporting that their experience with the readability process was positive overall
  Engineers view the readability process as being worthwhileReadability Survey: Proportion of engineers reporting that the readability process is worthwhile
   Readability Survey: Proportion of engineers reporting that the quality of readability reviews is a strength of the process
   Readability Survey: Proportion of engineers reporting that thoroughness is a strength of the process
  Engineers do not view the readability process as frustrating.Readability Survey: Proportion of engineers reporting that the readability process is uncertain, unclear, slow, or frustrating
   Quarterly Survey: Proportion of engineers reporting that they’re satisfied with their own engineering velocity
+
+ +
+

Taking Action and Tracking Results

+ +

Recall our  original  goal in this chapter: we want to take action and improve productivity.  After performing research on a topic, the team at Google always prepares a list of recommendations for how we can continue to improve.  We might suggest new features to a tool, improving latency of a tool, improving documentation, removing obsolete processes, or even changing the incentive structures for the engineers. Ideally, these recommendations are “tool drivenâ€: it does no good to tell engineers to change their process or way of thinking if the tools do not support them in doing so. We instead always assume that engineers will make the appropriate trade-offs if they have the proper data available and the suitable tools at their disposal.

+ +

For readability, our study showed that it was overall worthwhile: engineers who had achieved readability were satisfied with the process and felt they learned from it. Our logs showed that they also had their code reviewed faster and submitted it faster, even accounting for no longer needing as many reviewers. Our study also showed places for improvement with the process: engineers identified pain points that would have made the process faster or more pleasant. The language teams took these recommendations and improved the tooling and process to make it faster and to be more transparent so that engineers would have a more pleasant experience.

+
+ +
+

Conclusion

+ +

At Google, we’ve found that staffing a team of engineering productivity specialists has widespread benefits to software engineering; rather than relying on each team to chart its own course to increase productivity, a centralized team can focus on broad-based solutions to complex problems. Such “human-based†factors are notoriously difficult to measure, and it is important for experts to understand the data being analyzed given that many of the trade-offs involved in changing engineering processes are difficult to measure accurately and often have unintended consequences. Such a team must remain data driven and aim to eliminate subjective bias.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Before measuring productivity, ask whether the result is actionable, regardless of whether the result is positive or negative. If you can’t do anything with the result, it is likely not worth measuring.

    +
  • +
  • +

    Select meaningful metrics using the GSM framework. A good metric is a reasonable proxy to the signal you’re trying to measure, and it is traceable back to your original goals.

    +
  • +
  • +

    Select metrics that cover all parts of productivity (QUANTS). By doing this, you ensure that you aren’t improving one aspect of productivity (like developer velocity) at the cost of another (like code quality).

    +
  • +
  • +

    Qualitative metrics are metrics, too! Consider having a survey mechanism for tracking longitudinal metrics about engineers’ beliefs. Qualitative metrics should also align with the quantitative metrics; if they do not, it is likely the quantitative metrics that are incorrect.

    +
  • +
  • +

    Aim to create recommendations that are built into the developer workflow and incentive structures. Even though it is sometimes necessary to recommend additional training or documentation, change is more likely to occur if it is built into the developer’s daily habits. 

    +
  • +
+
+

1Frederick P. Brooks, The Mythical Man-Month: Essays on Software Engineering (New York: Addison-Wesley, 1995).

2It’s worth pointing out here that our industry currently disparages “anecdata,†and everyone has a goal of being “data driven.†Yet anecdotes continue to exist because they are powerful. An anecdote can provide context and narrative that raw numbers cannot; it can provide a deep explanation that resonates with others because it mirrors personal experience. Although our researchers do not make decisions on anecdotes, we do use and encourage techniques such as structured interviews and case studies to deeply understand phenomena and provide context to quantitative data.

3Java and C++ have the greatest amount of tooling support. Both have mature formatters and static analysis tools that catch common mistakes. Both are also heavily funded internally. Even though other language teams, like Python, were interested in the results, clearly there was not going to be a benefit for Python to remove readability if we couldn’t even show the same benefit for Java or C++.

4“From there it is only a small step to measuring ‘programmer productivity’ in terms of ‘number of lines of code produced per month.’ This is a very costly measuring unit because it encourages the writing of insipid code, but today I am less interested in how foolish a unit it is from even a pure business point of view. My point today is that, if we wish to count lines of code, we should not regard them as ‘lines produced’ but as ‘lines spent’: the current conventional wisdom is so foolish as to book that count on the wrong side of the ledger.†Edsger Dijkstra, on the cruelty of really teaching computing science, EWD Manuscript 1036.

5It has routinely been our experience at Google that when the quantitative and qualitative metrics disagree, it was because the quantitative metrics were not capturing the expected result.

6Recall bias is the bias from memory. People are more likely to recall events that are particularly interesting or frustrating.

7Recency bias is another form of bias from memory in which people are biased toward their most recent experience. In this case, as they just successfully completed the process, they might be feeling particularly good about it.

8Because we asked only those people who completed the process, we aren’t capturing the opinions of those who did not complete the process.

9There is a temptation to use such metrics to evaluate individual engineers, or perhaps even to identify high and low performers. Doing so would be counterproductive, though. If productivity metrics are used for performance reviews, engineers will be quick to game the metrics, and they will no longer be useful for measuring and improving productivity across the organization. The only way to make these measurements work is to let go of the idea of measuring individuals and embrace measuring the aggregate effect.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch08.html b/clones/abseil.io/resources/swe-book/html/ch08.html new file mode 100644 index 00000000..2a94aa7b --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch08.html @@ -0,0 +1,443 @@ + + + + + Software Engineering at Google + + + + +
+

Style Guides and Rules

+ + + + + +

Most engineering organizations have rules governing their codebases—rules about where source files  are stored, rules about the formatting of the code, rules about naming and patterns and exceptions and threads. Most software engineers are working within the bounds of a set of policies that control how they operate. At Google, to manage our codebase, we maintain a set of style guides that define our rules. 

+ +

Rules are laws. They are not just suggestions or recommendations, but strict, mandatory laws. As such, they are universally enforceable—rules may not be disregarded except as approved on a need-to-use basis. In contrast to rules, guidance provides recommendations and best practices. These bits are good to follow, even highly advisable to follow, but unlike rules, they usually have some room for variance.

+ +

We collect the rules that we define, the do’s and don’ts of writing code that must be followed, in our programming style guides, which are treated as canon. “Style†might be a bit of a misnomer here, implying a collection limited to formatting practices. Our style guides are more than that; they are the full set of conventions that govern our code. That’s not to say that our style guides are strictly prescriptive; style guide rules may call for judgement, such as the rule to use names that are “as descriptive as possible, within reason.†Rather, our style guides serve as the definitive source for the rules to which our engineers are held accountable.

+ +

We maintain separate style guides for each of the programming languages used at Google.1 At a high level, all of the guides have similar  goals, aiming to steer code development with an eye to sustainability.  At the same time, there is a lot of variation among them in scope, length, and content. Programming languages have different strengths, different features, different priorities, and different historical paths to adoption within Google’s ever-evolving repositories of code. It is far more practical, therefore, to independently tailor each language’s guidelines. Some of our style guides are concise, focusing on a few overarching principles like naming and formatting, as demonstrated in our Dart, R, and Shell guides. Other style guides include far more detail, delving into specific language features and stretching into far lengthier documents—notably, our C++, Python, and Java guides. Some style guides put a premium on typical non-Google use of the language—our Go style guide is very short, adding just a few rules to a summary directive to adhere to the practices outlined in the externally recognized conventions. Others include rules that fundamentally differ from external norms; our C++ rules disallow use of exceptions, a language feature widely used outside of Google code.

+ +

The wide variance among even our own style guides makes it difficult to pin down the precise description of what a style guide should cover. The decisions guiding the development of Google’s style guides stem from the need to keep our codebase sustainable. Other organizations’ codebases will inherently have different requirements for sustainability that necessitate a different set of tailored rules. This chapter discusses the principles and processes that steer the development of our rules and guidance, pulling examples primarily from Google’s C++, Python, and Java style guides.

+ +
+

Why Have Rules?

+ +

So why do we have rules?  The goal of having  rules in place is to encourage “good†behavior and discourage “bad†behavior. The interpretation of “good†and “bad†varies by organization, depending on what the organization cares about. Such designations are not universal preferences; good versus bad is subjective, and tailored to needs. For some organizations, “good†might promote usage patterns that support a small memory footprint or prioritize potential runtime optimizations. In other organizations, “good†might promote choices that exercise new language features. Sometimes, an organization cares most deeply about consistency, so that anything inconsistent with existing patterns is “bad.†We must first recognize what a given organization values; we use rules and guidance to encourage and discourage behavior accordingly.

+ +

As an organization grows, the established rules and guidelines shape the common vocabulary of coding. A common vocabulary allows engineers to concentrate on what their code needs to say rather than how they’re saying it. By shaping this vocabulary, engineers will tend to do the "good" things by default, even subconsciously. Rules thus give us broad leverage to nudge common development patterns in desired directions.

+
+ +
+

Creating the Rules

+ +

When defining  a set of rules, the key  question is not, “What rules should we have?†The question to ask is, “What goal are we trying to advance?†When we focus on the goal that the rules will be serving, identifying which rules support this goal makes it easier to distill the set of useful rules. At Google, where the style guide serves as law for coding practices, we do not ask, “What goes into the style guide?†but rather, “Why does something go into the style guide?†What does our organization gain by having a set of rules to regulate writing code?

+ +
+

Guiding Principles

+ +

Let’s put things in context: Google’s engineering organization is composed of more than 30,000 engineers.   That engineering population exhibits a wild variance in skill and background. About 60,000 submissions are made each day to a codebase of more than two billion lines of code that will likely exist for decades. We’re optimizing for a different set of values than most other organizations need, but to some degree, these concerns are ubiquitous—we need to sustain an engineering environment that is resilient to both scale and time.

+ +

In this context, the goal of our rules is to manage the complexity of our development environment, keeping the codebase manageable while still allowing engineers to work productively. We are making a trade-off here: the large body of rules that helps us toward this goal does mean we are restricting choice. We lose some flexibility and we might even offend some people, but the gains of consistency and reduced conflict furnished by an authoritative standard win out.

+ +

Given this view, we recognize a number of overarching principles that guide the development of our rules, which must:

+ +
    +
  • +

    Pull their weight

    +
  • +
  • +

    Optimize for the reader

    +
  • +
  • +

    Be consistent

    +
  • +
  • +

    Avoid error-prone and surprising constructs

    +
  • +
  • +

    Concede to practicalities when necessary

    +
  • +
+ +
+

Rules must pull their weight

+ +

Not everything should go into a style guide.  There is a nonzero cost in asking all of the engineers in an organization to learn and adapt to any new rule that is set. With too many rules,2 not only will it become harder for engineers to remember all relevant rules as they write their code, but it also becomes harder for new engineers to learn their way. More rules also make it more challenging and more expensive to maintain the rule set.

+ +

To this end, we deliberately chose not to include rules expected to be self-evident. Google’s style guide is not intended to be interpreted in a lawyerly fashion; just because something isn’t explicitly outlawed does not imply that it is legal. For example, the C++ style guide has no rule against the use of goto. C++ programmers already tend to avoid it, so including an explicit rule forbidding it would introduce unnecessary overhead. If just one or two engineers are getting something wrong, adding to everyone’s mental load by creating new rules doesn’t scale.

+
+ +
+

Optimize for the reader

+ +

Another principle of our rules is to optimize for the reader of the code rather than the author.  Given the passage of time, our code will be read far more frequently than it is written. We’d rather the code be tedious to type than difficult to read. In our Python style guide, when discussing conditional expressions, we recognize that they are shorter than if statements and therefore more convenient for code authors. However, because they tend to be more difficult for readers to understand than the more verbose if statements, we restrict their usage. We value “simple to read†over “simple to write.†We’re making a trade-off here: it can cost more upfront when engineers must repeatedly type potentially longer, descriptive names for variables and types. We choose to pay this cost for the readability it provides for all future readers.

+ +

As part of this prioritization, we also require that engineers leave explicit evidence of intended behavior in their code. We want readers to clearly understand what the code is doing as they read it. For example, our Java, JavaScript, and C++ style guides mandate use of the override annotation or keyword whenever a method overrides a superclass method. Without the explicit in-place evidence of design, readers can likely figure out this intent, though it would take a bit more digging on the part of each reader working through the code.

+ +

Evidence of intended behavior becomes even more important when it might be surprising. In C++, it is sometimes difficult to track the ownership of a pointer just by reading a snippet of code. If a pointer is passed to a function, without being familiar with the behavior of the function, we can’t be sure what to expect. Does the caller still own the pointer? Did the function take ownership? Can I continue using the pointer after the function returns or might it have been deleted? To avoid this problem, our C++ style guide prefers the use of std::unique_ptr when ownership transfer is intended. unique_ptr is a construct that manages pointer ownership, ensuring that only one copy of the pointer ever exists. When a function takes a unique_ptr as an argument and intends to take ownership of the pointer, callers must explicitly invoke move semantics:

+ +
// Function that takes a Foo* and may or may not assume ownership of
+// the passed pointer.
+void TakeFoo(Foo* arg);
+
+// Calls to the function don’t tell the reader anything about what to
+// expect with regard to ownership after the function returns.
+Foo* my_foo(NewFoo());
+TakeFoo(my_foo);
+ +

Compare this to the following:

+ +
// Function that takes a std::unique_ptr<Foo>.
+void TakeFoo(std::unique_ptr<Foo> arg);
+
+// Any call to the function explicitly shows that ownership is
+// yielded and the unique_ptr cannot be used after the function
+// returns.
+std::unique_ptr<Foo> my_foo(FooFactory());
+TakeFoo(std::move(my_foo));
+ +

Given the style guide rule, we guarantee that all call sites will include clear evidence of ownership transfer whenever it applies. With this signal in place, readers of the code don’t need to understand the behavior of every function call. We provide enough information in the API to reason about its interactions. This clear documentation of behavior at the call sites ensures that code snippets remain readable and understandable. We aim for local reasoning, where the goal is clear understanding of what’s happening at the call site without needing to find and reference other code, including the function’s implementation.

+ +

Most style guide rules covering comments are also designed to support this goal of in-place evidence for readers.  Documentation  comments (the block comments prepended to a given file, class, or function) describe the design or intent of the code that follows.  Implementation comments (the comments interspersed throughout the code itself) justify or highlight non-obvious choices, explain tricky bits, and underscore important parts of the code. We have style guide rules covering both types of comments, requiring engineers to provide the explanations another engineer might be looking for when reading through the code.

+
+ +
+

Be consistent

+ +

Our view on consistency within our codebase is similar to the philosophy we apply to our Google offices.   With a large, distributed engineering population, teams are frequently split among offices, and Googlers often find themselves traveling to other sites. Although each office maintains its unique personality, embracing local flavor and style, for anything necessary to get work done, things are deliberately kept the same. A visiting Googler’s badge will work with all local badge readers; any Google devices will always get WiFi; the video conferencing setup in any conference room will have the same interface. A Googler doesn’t need to spend time learning how to get this all set up; they know that it will be the same no matter where they are. It’s easy to move between offices and still get work done.

+ +

That’s what we strive for with our source code. Consistency is what enables any engineer to jump into an unfamiliar part of the codebase and get to work fairly quickly. A local project can have its unique personality, but its tools are the same, its techniques are the same, its libraries are the same, and it all Just Works.

+
+ +
+

Advantages of consistency

+ +

Even though it might feel restrictive for an  office to be disallowed from customizing a badge reader or video conferencing interface, the consistency benefits far outweigh the creative freedom we lose. It’s the same with code: being consistent may feel constraining at times, but it means more engineers get more work done with less effort:3

+ +
    +
  • +

    When a codebase is internally consistent in its style and norms, engineers writing code and others reading it can focus on what’s getting done rather than how it is presented. To a large degree, this consistency allows for expert chunking.4 When we solve our problems with the same interfaces and format the code in a consistent way, it’s easier for experts to glance at some code, zero in on what’s important, and understand what it’s doing. It also makes it easier to modularize code and spot duplication. For these reasons, we focus a lot of attention on consistent naming conventions, consistent use of common patterns, and consistent formatting and structure. There are also many rules that put forth a decision on a seemingly small issue solely to guarantee that things are done in only one way. For example, take the choice of the number of spaces to use for indentation or the limit set on line length.5 It’s the consistency of having one answer rather than the answer itself that is the valuable part here.

    +
  • +
  • +

    Consistency enables scaling.  Tooling is key for an organization to scale, and consistent code makes it easier to build tools that can understand, edit, and generate code. The full benefits of the tools that depend on uniformity can’t be applied if everyone has little pockets of code that differ—if a tool can keep source files updated by adding missing imports or removing unused includes, if different projects are choosing different sorting strategies for their import lists, the tool might not be able to work everywhere. When everyone is using the same components and when everyone’s code follows the same rules for structure and organization, we can invest in tooling that works everywhere, building in automation for many of our maintenance tasks. If each team needed to separately invest in a bespoke version of the same tool, tailored for their unique environment, we would lose that advantage.

    +
  • +
  • +

    Consistency helps when scaling the human part of an organization, too. As an organization grows, the number of engineers working on the codebase increases. Keeping the code that everyone is working on as consistent as possible enables better mobility across projects, minimizing the ramp-up time for an engineer switching teams and building in the ability for the organization to flex and adapt as headcount needs fluctuate. A growing organization also means that people in other roles interact with the code—SREs, library engineers, and code janitors, for example. At Google, these roles often span multiple projects, which means engineers unfamiliar with a given team’s project might jump in to work on that project’s code. A consistent experience across the codebase makes this efficient.

    +
  • +
  • +

    Consistency also ensures resilience to time. As time passes, engineers leave projects, new people join, ownership shifts, and projects merge or split. Striving for a consistent codebase ensures that these transitions are low cost and allows us nearly unconstrained fluidity for both the code and the engineers working on it, simplifying the processes necessary for long-term maintenance.

    +
  • +
+ + + +
+

Setting the standard

+ +

When we advocate for consistency, we tend to  focus on internal consistency. Sometimes, local conventions spring up before global ones are adopted, and it isn’t reasonable to adjust everything to match. In that case, we advocate a hierarchy of consistency: “Be consistent†starts locally, where the norms within a given file precede those of a given team, which precede those of the larger project, which precede those of the overall codebase. In fact, the style guides contain a number of rules that explicitly defer to local conventions,6 valuing this local consistency over a scientific technical choice.

+ +

However, it is not always enough for an organization to create and stick to a set of internal conventions. Sometimes, the standards adopted by the external community should be taken into account.

+ + + +

If conventions already exist, it is usually a good idea for an organization to be consistent with the outside world. For small, self-contained, and short-lived efforts, it likely won’t make a difference; internal consistency matters more than anything happening outside the project’s limited scope. Once the passage of time and potential scaling become factors, the likelihood of your code interacting with outside projects or even ending up in the outside world increase. Looking long-term, adhering to the widely accepted standard will likely pay off.

+
+
+ +
+

Avoid error-prone and surprising constructs

+ +

Our style guides restrict the use of some of the more surprising, unusual, or tricky constructs in the languages that we use.   Complex features often have subtle pitfalls not obvious at first glance.  Using these features without thoroughly understanding their complexities makes it easy to misuse them and introduce bugs. Even if a construct is well understood by a project’s engineers, future project members and maintainers are not guaranteed to have the same understanding.

+ +

This reasoning is behind our Python style guide ruling to avoid using power features such as reflection.  The reflective Python functions hasattr() and getattr() allow a user to access attributes of objects using strings:

+ +
if hasattr(my_object, 'foo'):
+some_var = getattr(my_object, 'foo')
+ +

Now, with that example, everything might seem fine. But consider this:

+ +

some_file.py:

+ +
A_CONSTANT = [
+'foo',
+'bar',
+'baz',
+]
+ +

other_file.py:

+ +
values = []
+for field in some_file.A_CONSTANT:
+values.append(getattr(my_object, field))
+ +

When searching through code, how do you know that the fields foo, bar, and baz are being accessed here? There’s no clear evidence left for the reader. You don’t easily see and therefore can’t easily validate which strings are used to access attributes of your object. What if, instead of reading those values from A_CONSTANT, we read them from a Remote Procedure Call (RPC) request message or from a data store? Such obfuscated code could cause a major security flaw, one that would be very difficult to notice, simply by validating the message incorrectly. It’s also difficult to test and verify such code.

+ +

Python’s dynamic nature allows such behavior, and in very limited circumstances, using hasattr() and getattr() is valid. In most cases, however, they just cause obfuscation and introduce bugs.

+ +

Although these advanced language features might perfectly solve a problem for an expert who knows how to leverage them, power features are often more difficult to understand and are not very widely used. We need all of our engineers able to operate in the codebase, not just the experts. It’s not just support for the novice software engineer, but it’s also a better environment for SREs—if an SRE is debugging a production outage, they will jump into any bit of suspect code, even code written in a language in which they are not fluent. We place higher value on simplified, straightforward code that is easier to understand and maintain.

+
+ +
+

Concede to practicalities

+ +

In the words of Ralph Waldo Emerson: “A foolish consistency is the hobgoblin of little minds.†In  our  quest  for a consistent, simplified codebase, we do not want to blindly ignore all else. We know that some of the rules in our style guides will encounter cases that warrant exceptions, and that’s OK. When necessary, we permit concessions to optimizations and practicalities that might otherwise conflict with our rules.

+ +

Performance matters.  Sometimes, even if it means sacrificing consistency or readability, it just makes sense to accommodate performance optimizations. For example, although our C++ style guide prohibits use of exceptions, it includes a rule that allows the use of noexcept, an exception-related language specifier that can trigger compiler optimizations.

+ +

Interoperability also matters.  Code that is designed to work with specific non-Google pieces might do better if tailored for its target. For example, our C++ style guide includes an exception to the general CamelCase naming guideline that permits use of the standard library’s snake_case style for entities that mimic standard library features.8 The C++ style guide also allows exemptions for Windows programming, where compatibility with platform features requires multiple inheritance, something explicitly forbidden for all other C++ code. Both our Java and JavaScript style guides explicitly state that generated code, which frequently interfaces with or depends on components outside of a project’s ownership, is out of scope for the guide’s rules.9 Consistency is vital;  adaptation is key.  

+
+
+ +
+

The Style Guide

+ +

So, what does go into a language style guide?  There are roughly three categories into which all style guide rules fall:

+ +
    +
  • +

    Rules to avoid dangers

    +
  • +
  • +

    Rules to enforce best practices

    +
  • +
  • +

    Rules to ensure consistency

    +
  • +
+ +
+

Avoiding danger

+ +

First and foremost, our style guides include rules about language features that either must or must not be done for technical reasons.   We have rules about how to use static members and variables; rules about using lambda expressions; rules about handling exceptions; rules about building for threading, access control, and class inheritance. We cover which language features to use and which constructs to avoid. We call out standard vocabulary types that may be used and for what purposes. We specifically include rulings on the hard-to-use and the hard-to-use-correctly—some language features have nuanced usage patterns that might not be intuitive or easy to apply properly, causing subtle bugs to creep in. For each ruling in the guide, we aim to include the pros and cons that were weighed with an explanation of the decision that was reached. Most of these decisions are based on the need for resilience to time, supporting and encouraging maintainable language usage.

+
+ +
+

Enforcing best practices

+ +

Our style guides also include rules enforcing some best practices of writing source code.    These rules help keep the codebase healthy and maintainable. For example, we specify where and how code authors must include comments.10 Our rules for comments cover general conventions for commenting and extend to include specific cases that must include in-code documentation—cases in which intent is not always obvious, such as fall-through in switch statements, empty exception catch blocks, and template metaprogramming. We also have rules detailing the structuring of source files, outlining the organization of expected content. We have rules about naming: naming of packages, of classes, of functions, of variables. All of these rules are intended to guide engineers to practices that support healthier, more sustainable code.

+ +

Some of the best practices enforced by our style guides are designed to make source code more readable. Many formatting rules fall under this category. Our style guides specify when and how to use vertical and horizontal whitespace in order to improve readability. They also cover line length limits and brace alignment. For some languages, we cover formatting requirements by deferring to autoformatting tools—gofmt for Go, dartfmt for Dart. Itemizing a detailed list of formatting requirements or naming a tool that must be applied, the goal is the same: we have a consistent set of formatting rules designed to improve readability that we apply to all of our code.

+ +

Our style guides also include limitations on new and not-yet-well-understood language features.  The goal is to preemptively install safety fences around a feature’s potential pitfalls while we all go through the learning process. At the same time, before everyone takes off running, limiting use gives us a chance to watch the usage patterns that develop and extract best practices from the examples we observe. For these new features, at the outset, we are sometimes not sure of the proper guidance to give. As adoption spreads, engineers wanting to use the new features in different ways discuss their examples with the style guide owners, asking for allowances to permit additional use cases beyond those covered by the initial restrictions. Watching the waiver requests that come in, we get a sense of how the feature is getting used and eventually collect enough examples to generalize good practice from bad. After we have that information, we can circle back to the restrictive ruling and amend it to allow wider use.

+ + +
+ +
+

Building in consistency

+ +

Our style guides also contain rules that cover a lot of the smaller stuff.    For these rules, we make and document a decision primarily to make and document a decision. Many rules in this category don’t have significant technical impact. Things like naming conventions, indentation spacing, import ordering: there is usually no clear, measurable, technical benefit for one form over another, which might be why the technical community tends to keep debating them.11 By choosing one, we’ve dropped out of the endless debate cycle and can just move on. Our engineers no longer spend time discussing two spaces versus four. The important bit for this category of rules is not what we’ve chosen for a given rule so much as the fact that we have chosen.

+
+ +
+

And for everything else...

+ +

With all that, there’s a lot that’s not in our style guides.   We try to focus on the things that have the greatest impact on the health of our codebase. There are absolutely best practices left unspecified by these documents, including many fundamental pieces of good engineering advice: don’t be clever, don’t fork the codebase, don’t reinvent the wheel, and so on. Documents like our style guides can’t serve to take a complete novice all the way to a master-level understanding of software engineering—there are some things we assume, and this is intentional.

+
+
+
+ +
+

Changing the Rules

+ +

Our style guides aren’t static.   As with most things, given the passage of time, the landscape within which a style guide decision was made and the factors that guided a given ruling are likely to change. Sometimes, conditions change enough to warrant reevaluation. If a new language version is released, we might want to update our rules to allow or exclude new features and idioms. If a rule is causing engineers to invest effort to circumvent it, we might need to reexamine the benefits the rule was supposed to provide. If the tools that we use to enforce a rule become overly complex and burdensome to maintain, the rule itself might have decayed and need to be revisited. Noticing when a rule is ready for another look is an important part of the process that keeps our rule set relevant and up to date.

+ +

The decisions behind rules captured in our style guides are backed by evidence. When adding a rule, we spend time discussing and analyzing the relevant pros and cons as well as the potential consequences, trying to verify that a given change is appropriate for the scale at which Google operates. Most entries in Google’s style guides include these considerations, laying out the pros and cons that were weighed during the process and giving the reasoning for the final ruling. Ideally, we prioritize this detailed reasoning and include it with every rule.

+ +

Documenting the reasoning behind a given decision gives us the advantage of being able to recognize when things need to change. Given the passage of time and changing conditions, a good decision made previously might not be the best current one. With influencing factors clearly noted, we are able to identify when changes related to one or more of these factors warrant reevaluating the rule.

+ + + +
+

The Process

+ +

Recognizing that  things will need to change, given the long lifetime and ability to scale that we are aiming for, we created a process for updating our rules. The process for changing our style guide is solution based. Proposals for style guide updates are framed with this view, identifying an existing problem and presenting the proposed change as a way to fix it. “Problems,†in this process, are not hypothetical examples of things that could go wrong; problems are proven with patterns found in existing Google code. Given a demonstrated problem, because we have the detailed reasoning behind the existing style guide decision, we can reevaluate, checking whether a different conclusion now makes more sense.

+ +

The community of engineers writing code governed by the style guide are often best positioned to notice when a rule might need to be changed. Indeed, here at Google, most changes to our style guides begin with community discussion. Any engineer can ask questions or propose a change, usually by starting with the language-specific mailing lists dedicated to style guide discussions.

+ +

Proposals for style guide changes might come fully-formed, with specific, updated wording suggested, or might start as vague questions about the applicability of a given rule. Incoming ideas are discussed by the community, receiving feedback from other language users. Some proposals are rejected by community consensus, gauged to be unnecessary, too ambiguous, or not beneficial. Others receive positive feedback, gauged to have merit either as-is or with some suggested refinement. These proposals, the ones that make it through community review, are subject to final decision-making approval.

+
+ +
+

The Style Arbiters

+ +

At Google, for each language’s style guide, final decisions and approvals are made by the style  guide’s owners—our style arbiters.  For each programming language, a group of long-time language experts are the owners of the style guide and the designated decision makers. The style arbiters for a given language are often senior members of the language’s library team and other long-time Googlers with relevant language experience.

+ +

The actual decision making for any style guide change is a discussion of the engineering trade-offs for the proposed modification. The arbiters make decisions within the context of the agreed-upon goals for which the style guide optimizes. Changes are not made according to personal preference; they’re trade-off judgments. In fact, the C++ style arbiter group currently consists of four members. This might seem strange: having an odd number of committee members would prevent tied votes in case of a split decision. However, because of the nature of the decision making approach, where nothing is “because I think it should be this way†and everything is an evaluation of trade-off, decisions are made by consensus rather than by voting. The four-member group is happily functional as-is.

+
+ +
+

Exceptions

+ +

Yes, our rules are law, but yes, some rules warrant exceptions.  Our rules are typically designed for the greater, general case. Sometimes, specific situations would benefit from an exemption to a particular rule. When such a scenario arises, the style arbiters are consulted to determine whether there is a valid case for granting a waiver to a particular rule.

+ +

Waivers are not granted lightly. In C++ code, if a macro API is introduced, the style guide mandates that it be named using a project-specific prefix. Because of the way C++ handles macros, treating them as members of the global namespace, all macros that are exported from header files must have globally unique names to prevent collisions. The style guide rule regarding macro naming does allow for arbiter-granted exemptions for some utility macros that are genuinely global. However, when the reason behind a waiver request asking to exclude a project-specific prefix comes down to preferences due to macro name length or project consistency, the waiver is rejected. The integrity of the codebase outweighs the consistency of the project here.

+ +

Exceptions are allowed for cases in which it is gauged to be more beneficial to permit the rule-breaking than to avoid it. The C++ style guide disallows implicit type conversions, including single-argument constructors. However, for types that are designed to transparently wrap other types, where the underlying data is still accurately and precisely represented, it’s perfectly reasonable to allow implicit conversion. In such cases, waivers to the no-implicit-conversion rule are granted. Having such a clear case for valid exemptions might indicate that the rule in question needs to be clarified or amended. However, for this specific rule, enough waiver requests are received that appear to fit the valid case for exemption but in fact do not—either because the specific type in question is not actually a transparent wrapper type or because the type is a wrapper but is not actually needed—that keeping the rule in place as-is is still worthwhile.  

+
+
+ +
+

Guidance

+ +

In addition to rules, we curate programming guidance in various forms, ranging from long, in-depth discussion of complex topics to short, pointed advice on best practices that we endorse.  

+ +

Guidance represents the collected wisdom of our engineering experience, documenting the best practices that we’ve extracted from the lessons learned along the way. Guidance tends to focus on things that we’ve observed people frequently getting wrong or new things that are unfamiliar and therefore subject to confusion. If the rules are the “musts,†our guidance is the “shoulds.â€

+ +

One example of a pool of guidance that we cultivate is a set of primers for some of the predominant languages that we use. While our style guides are prescriptive, ruling on which language features are allowed and which are disallowed, the primers are descriptive, explaining the features that the guides endorse. They are quite broad in their coverage, touching on nearly every topic that an engineer new to the language’s use at Google would need to reference. They do not delve into every detail of a given topic, but they provide explanations and recommended use. When an engineer needs to figure out how to apply a feature that they want to use, the primers aim to serve as the go-to guiding reference.

+ +

A few years ago, we began publishing a series of C++ tips that offered a mix of general language advice and Google-specific tips. We cover hard things—object lifetime, copy and move semantics, argument-dependent lookup; new things—C++ 11 features as they were adopted in the codebase, preadopted C++17 types like string_view, optional, and variant; and things that needed a gentle nudge of correction—reminders not to use using directives, warnings to remember to look out for implicit bool conversions. The tips grow out of actual problems encountered, addressing real programming issues that are not covered by the style guides. Their advice, unlike the rules in the style guide, are not true canon; they are still in the category of advice rather than rule. However, given the way they grow from observed patterns rather than abstract ideals, their broad and direct applicability set them apart from most other advice as a sort of “canon of the common.†Tips are narrowly focused and relatively short, each one no more than a few minutes’ read. This “Tip of the Week†series has been extremely successful internally, with frequent citations during code reviews and technical discussions.12

+ +

Software engineers come in to a new project or codebase with knowledge of the programming language they are going to be using, but lacking the knowledge of how the programming language is used within Google. To bridge this gap, we maintain a series of “<Language>@Google 101†courses for each of the primary programming languages in use. These full-day courses focus on what makes development with that language different in our codebase. They cover the most frequently used libraries and idioms, in-house preferences, and custom tool usage. For a C++ engineer who has just become a Google C++ engineer, the course fills in the missing pieces that make them not just a good engineer, but a good Google codebase engineer.

+ +

In addition to teaching courses that aim to get someone completely unfamiliar with our setup up and running quickly, we also cultivate ready references for engineers deep in the codebase to find the information that could help them on the go. These references vary in form and span the languages that we use. Some of the useful references that we maintain internally include the following:

+ +
    +
  • +

    Language-specific advice for the areas that are generally  more difficult to get correct (such as concurrency and hashing).

    +
  • +
  • +

    Detailed breakdowns of new features that are introduced with a language update and  advice on how to use them within the codebase.

    +
  • +
  • +

    Listings of key abstractions and  data structures provided by our libraries.  This keeps us from reinventing structures that already exist and provides a response to, “I need a thing, but I don’t know what it’s called in our libraries.â€

    +
  • +
+
+ +
+

Applying the Rules

+ +

Rules, by their nature, lend greater value when they are enforceable.   Rules can be enforced socially, through teaching and training, or technically, with tooling. We have various formal training courses at Google that cover many of the best practices that our rules require. We also invest resources in keeping our documentation up to date to ensure that reference material remains accurate and current.  A key part of our overall training approach when it comes to awareness and understanding of our rules is the role that code reviews play. The readability process that we run here at Google—where engineers new to Google’s development environment for a given language are mentored through code reviews—is, to a great extent, about cultivating the habits and patterns required by our style guides (see details on the readability process in Knowledge Sharing). The process is an important piece of how we ensure that these practices are learned and applied across project boundaries.

+ +

Although some level of training is always necessary—engineers must, after all, learn the rules so that they can write code that follows them—when it comes to checking for compliance, rather than exclusively depending on engineer-based verification, we strongly prefer to automate enforcement with tooling.

+ +

Automated rule enforcement ensures that rules are not dropped or forgotten as time passes or as an organization scales up. New people join; they might not yet know all the rules. Rules change over time; even with good communication, not everyone will remember the current state of everything. Projects grow and add new features; rules that had previously not been relevant are suddenly applicable. An engineer checking for rule compliance depends on either memory or documentation, both of which can fail. As long as our tooling stays up to date, in sync with our rule changes, we know that our rules are being applied by all our engineers for all our projects.

+ +

Another advantage to automated enforcement is minimization of the variance in how a rule is interpreted and applied. When we write a script or use a tool to check for compliance, we validate all inputs against a single, unchanging definition of the rule. We aren’t leaving interpretation up to each individual engineer. Human engineers view everything with a perspective colored by their biases. Unconscious or not, potentially subtle, and even possibly harmless, biases still change the way people view things. Leaving enforcement up to engineers is likely to see inconsistent interpretation and application of the rules, potentially with inconsistent expectations of accountability. The more that we delegate to the tools, the fewer entry points we leave for human biases to enter.

+ +

Tooling also makes enforcement scalable. As an organization grows, a single team of experts can write tools that the rest of the company can use. If the company doubles in size, the effort to enforce all rules across the entire organization doesn’t double, it costs about the same as it did before.

+ +

Even with the advantages we get by incorporating tooling, it might not be possible to automate enforcement for all rules. Some technical rules explicitly call for human judgment. In the C++ style guide, for example: “Avoid complicated template metaprogramming.†“Use auto to avoid type names that are noisy, obvious, or unimportant—cases where the type doesn’t aid in clarity for the reader.†“Composition is often more appropriate than inheritance.†In the Java style guide: “There’s no single correct recipe for how to [order the members and initializers of your class]; different classes may order their contents in different ways.†“It is very rarely correct to do nothing in response to a caught exception.†“It is extremely rare to override Object.finalize.†For all of these rules, judgment is required and tooling can’t (yet!) take that place.

+ +

Other rules are social rather than technical, and it is often unwise to solve social problems with a technical solution. For many of the rules that fall under this category, the details tend to be a bit less well defined and tooling would become complex and expensive. It’s often better to leave enforcement of those rules to humans. For example, when it comes to the size of a given code change (i.e., the number of files affected and lines modified) we recommend that engineers favor smaller changes. Small changes are easier for engineers to review, so reviews tend to be faster and more thorough. They’re also less likely to introduce bugs because it’s easier to reason about the potential impact and effects of a smaller change. The definition of small, however, is somewhat nebulous. A change that propagates the identical one-line update across hundreds of files might actually be easy to review. By contrast, a smaller, 20-line change might introduce complex logic with side effects that are difficult to evaluate. We recognize that there are many different measurements of size, some of which may be subjective—particularly when taking the complexity of a change into account. This is why we do not have any tooling to autoreject a proposed change that exceeds an arbitrary line limit. Reviewers can (and do) push back if they judge a change to be too large. For this and similar rules, enforcement is up to the discretion of the engineers authoring and reviewing the code. When it comes to technical rules, however, whenever it is feasible, we favor technical enforcement.

+ +
+

Error Checkers

+ +

Many rules covering language usage can be enforced with static analysis tools.  In fact, an  informal survey of the C++ style guide by some of our C++ librarians in mid-2018 estimated that roughly 90% of its rules could be automatically verified. Error-checking tools take a set of rules or patterns and verify that a given code sample fully complies. Automated verification removes the burden of remembering all applicable rules from the code author. If an engineer only needs to look for violation warnings—many of which come with suggested fixes—surfaced during code review by an analyzer that has been tightly integrated into the development workflow, we minimize the effort that it takes to comply with the rules. When we began using tools to flag deprecated functions based on source tagging, surfacing both the warning and the suggested fix in-place, the problem of having new usages of deprecated APIs disappeared almost overnight. Keeping the cost of compliance down makes it more likely for engineers to happily follow through.

+ +

We use  tools like clang-tidy (for C++) and Error Prone (for Java) to  automate the process of enforcing rules. See Static Analysis for an in-depth discussion of our approach.

+ +

The tools we use are designed and tailored to support the rules that we define. Most tools in support of rules are absolutes; everybody must comply with the rules, so everybody uses the tools that check them. Sometimes, when tools support best practices where there’s a bit more flexibility in conforming to the conventions, there are opt-out mechanisms to allow projects to adjust for their needs.

+
+ +
+

Code Formatters

+ +

At Google, we generally use automated style checkers and formatters to enforce consistent formatting within our code.   The question of line lengths has stopped being interesting.13 Engineers just run the style checkers and keep moving forward. When formatting is done the same way every time, it becomes a non-issue during code review, eliminating the review cycles that are otherwise spent finding, flagging, and fixing minor style nits.

+ +

In managing the largest codebase ever, we’ve had the opportunity to observe the results of formatting done by humans versus formatting done by automated tooling. The robots are better on average than the humans by a significant amount. There are some places where domain expertise matters—formatting a matrix, for example, is something a human can usually do better than a general-purpose formatter. Failing that, formatting code with an automated style checker rarely goes wrong.

+ +

We enforce use of these formatters with presubmit checks: before code can be submitted, a service checks whether running the formatter on the code produces any diffs. If it does, the submit is rejected with instructions on how to run the formatter to fix the code. Most code at Google is subject to such a presubmit check. For our code, we use clang-format for C++; an in-house wrapper around yapf for Python; gofmt for Go; dartfmt for Dart; and buildifier for our BUILD files.

+ + +
+
+ +
+

Conclusion

+ +

For any organization, but  especially  for an organization as large as Google’s engineering force, rules help us to manage complexity and build a maintainable codebase. A shared set of rules frames the engineering processes so that they can scale up and keep growing, keeping both the codebase and the organization sustainable for the long term.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Rules and guidance should aim to support resilience to time and scaling.

    +
  • +
  • +

    Know the data so that rules can be adjusted.

    +
  • +
  • +

    Not everything should be a rule.

    +
  • +
  • +

    Consistency is key.

    +
  • +
  • +

    Automate enforcement when possible.

    +
  • +
+
+

1Many of our style guides have external versions, which you can find at https://google.github.io/styleguide. We cite numerous examples from these guides within this chapter.

2Tooling matters here. The measure for “too many†is not the raw number of rules in play, but how many an engineer needs to remember. For example, in the bad-old-days pre-clang-format, we needed to remember a ton of formatting rules. Those rules haven’t gone away, but with our current tooling, the cost of adherence has fallen dramatically. We’ve reached a point at which somebody could add an arbitrary number of formatting rules and nobody would care, because the tool just does it for you.

3Credit to H. Wright for the real-world comparison, made at the point of having visited around 15 different Google offices.

4"Chunking" is a cognitive process that groups pieces of information together into meaningful “chunks†rather than keeping note of them individually. Expert chess players, for example, think about configurations of pieces rather than the positions of the individuals.

5See 4.2 Block indentation: +2 spaces, Spaces vs. Tabs, 4.4 Column limit:100 and Line Length.

6Use of const, for example.

7Style formatting for BUILD files implemented with Starlark is applied by buildifier. See https://github.com/bazelbuild/buildtools.

8See Exceptions to Naming Rules. As an example, our open sourced Abseil libraries use snake_case naming for types intended to be replacements for standard types. See the types defined in https://github.com/abseil/abseil-cpp/blob/master/absl/utility/utility.h. These are C++11 implementation of C++14 standard types and therefore use the standard’s favored snake_case style instead of Google’s preferred CamelCase form.

9See Generated code: mostly exempt.

10See https://google.github.io/styleguide/cppguide.html#Comments, http://google.github.io/styleguide/pyguide#38-comments-and-docstrings, and https://google.github.io/styleguide/javaguide.html#s7-javadoc, where multiple languages define general comment rules.

11Such discussions are really just bikeshedding, an illustration of Parkinson's law of triviality.

12https://abseil.io/tips has a selection of some of our most popular tips.

13When you consider that it takes at least two engineers to have the discussion and multiply that by the number of times this conversation is likely to happen within a collection of more than 30,000 engineers, it turns out that “how many characters†can become a very expensive question.

14In December 2018, Go was the #4 language on GitHub as measured by pull requests.

15Robert Griesemer’s 2015 talk, "The Cultural Evolution of gofmt," provides details on the motivation, design, and impact of gofmt on Go and other languages.

16Russ Cox explained in 2009 that gofmt was about automated changes: “So we have all the hard parts of a program manipulation tool just sitting waiting to be used. Agreeing to accept 'gofmt style' is the piece that makes it doable in a finite amount of code.â€

17The Go AST and format packages each have thousands of importers.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch09.html b/clones/abseil.io/resources/swe-book/html/ch09.html new file mode 100644 index 00000000..9306dc75 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch09.html @@ -0,0 +1,375 @@ + + + + + Software Engineering at Google + + + + +
+

Code Review

+ + + + + +

Code review is a process in which code is reviewed by someone other than the author, often before the introduction of that code into a codebase.  Although that is a simple definition, implementations of the process of code review vary widely throughout the software industry. Some organizations have a select group of “gatekeepers†across the codebase that review changes. Others delegate code review processes to smaller teams, allowing different teams to require different levels of code review. At Google, essentially every change is reviewed before being committed, and every engineer is responsible for initiating reviews and reviewing changes.

+ +

Code reviews generally require a combination of a process and a tool supporting that process. At Google, we use  a custom code review tool, Critique, to support our process.1 Critique is an important enough tool at Google to warrant its own chapter in this book. This chapter focuses on the process of code review as it is practiced at Google rather than the specific tool, both because these foundations are older than the tool and because most of these insights can be adapted to whatever tool you might use for code review.

+ +
Note
+

For more information on Critique, see Critique: Google’s Code Review Tool.

+
+ +

Some  of the benefits of code review, such as detecting bugs in code before they enter a codebase, are well established2 and somewhat obvious (if imprecisely measured). Other benefits, however, are more subtle. Because the code review process at Google is so ubiquitous and extensive, we’ve noticed many of these more subtle effects, including psychological ones, which provide many benefits to an organization over time and scale.

+ +
+

Code Review Flow

+ +

Code reviews can happen at many stages of software development.  At Google, code reviews take place before a change can be committed to the codebase; this stage is also known as a precommit review. The primary end goal of a code review is to get another engineer to consent to the change, which we denote by tagging the change as “looks good to me†(LGTM).  We use this LGTM as a necessary permissions “bit†(combined with other bits noted below) to allow the change to be committed.

+ +

A typical code review at Google goes through the following steps:

+ +
    +
  1. +

    A user writes a change to the codebase in their workspace. This author then creates a snapshot of the change: a patch and corresponding description that are uploaded to the code review tool. This change produces a diff against the codebase, which is used to evaluate what code has changed.

    +
  2. +
  3. +

    The author can use this initial patch to apply automated review comments or do self-review. When the author is satisfied with the diff of the change, they mail the change to one or more reviewers. This process notifies those reviewers, asking them to view and comment on the snapshot.

    +
  4. +
  5. +

    Reviewers open the change in the code review tool and post comments on the diff. Some comments request explicit resolution. Some are merely informational.

    +
  6. +
  7. +

    The author modifies the change and uploads new snapshots based on the feedback and then replies back to the reviewers. Steps 3 and 4 may be repeated multiple times.

    +
  8. +
  9. +

    After the reviewers are happy with the latest state of the change, they agree to the change and accept it by marking it as "looks good to me" (LGTM). Only one LGTM is required by default, although convention might request that all reviewers agree to the change.

    +
  10. +
  11. +

    After a change is marked LGTM, the author is allowed to commit the change to the codebase, provided they resolve all comments and that the change is approved. We’ll cover approval in the next section.

    +
  12. +
+ +

We’ll go over this process in more detail later in this chapter.

+ + +
+ +
+

How Code Review Works at Google

+ +

We’ve pointed out roughly how the typical code review process works, but the devil is in the details.  This section outlines in detail how code review works at Google and how these practices allow it to scale properly over time.

+ +

There are three aspects of review  that require “approval†for any given change at Google:

+ +
    +
  • +

    A correctness and comprehension check from another engineer that the code is appropriate and does what the author claims it does. This is often a team member, though it does not need to be.  This is reflected in the LGTM permissions “bit,†which will be set after a peer reviewer agrees that the code “looks good†to them.

    +
  • +
  • +

    Approval from one of the code owners that the code is appropriate for this particular part of the codebase (and can be checked into a particular directory). This approval might be implicit if the author is such an owner. Google’s codebase is a tree structure with hierarchical owners of particular directories. (See Version Control and Branch Management). Owners act as gatekeepers for their particular directories.  A change might be proposed by any engineer and LGTM'ed by any other engineer, but an owner of the directory in question must also approve this addition to their part of the codebase. Such an owner might be a tech lead or other engineer deemed expert in that particular area of the codebase. It’s generally up to each team to decide how broadly or narrowly to assign ownership privileges.

    +
  • +
  • +

    Approval from someone with language “readabilityâ€3 that the code conforms to the language’s style and  best practices, checking whether the code is written in the manner we expect. This approval, again, might be implicit if the author has such readability. These engineers are pulled from a company-wide pool of engineers who have been granted readability in that programming language.

    +
  • +
+ +

Although this level of control sounds onerous—and, admittedly, it sometimes is—most reviews have one person assuming all three roles, which speeds up the process quite a bit. Importantly, the author can also assume the latter two roles, needing only an LGTM from another engineer to check code into their own codebase, provided they already have readability in that language (which owners often do).

+ +

These requirements allow the code review process to be quite flexible. A tech lead who is an owner of a project and has that code’s language readability can submit a code change with only an LGTM from another engineer.  An intern without such authority can submit the same change to the same codebase, provided they get approval from an owner with language readability. The three aforementioned permission “bits†can be combined in any combination. An author can even request more than one LGTM from separate people by explicitly tagging the change as wanting an LGTM from all reviewers.

+ +

In practice, most code reviews that require more than one approval usually go through a two-step process: gaining an LGTM from a peer engineer, and then seeking approval from appropriate code owner/readability reviewer(s). This allows the two roles to focus on different aspects of the code review and saves review time. The primary reviewer can focus on code correctness and the general validity of the code change; the code owner can focus on whether this change is appropriate for their part of the codebase without having to focus on the details of each line of code. An approver is often looking for something different than a peer reviewer, in other words. After all, someone is trying to check in code to their project/directory. They are more concerned with questions such as: “Will this code be easy or difficult to maintain?†“Does it add to my technical debt?†“Do we have the expertise to maintain it within our team?â€

+ +

If all three of these types of reviews can be handled by one reviewer, why not just have those types of reviewers handle all code reviews? The short answer is scale. Separating the three roles adds flexibility to the code review process. If you are working with a peer on a new function within a utility library, you can get someone on your team to review the code for code correctness and comprehension. After several rounds (perhaps over several days), your code satisfies your peer reviewer and you get an LGTM. Now, you need only get an owner of the library (and owners often have appropriate readability) to approve the change. 

+ + +
+ +
+

Code Review Benefits

+ +

Across the industry, code review itself is not controversial, although it is far from a universal practice.  Many (maybe even most) other companies and open source projects have some form of code review, and most view the process as important as a sanity check on the introduction of new code into a codebase. Software engineers understand some of the more obvious benefits of code review, even if they might not personally think it applies in all cases. But at Google, this process is generally more thorough and wide spread than at most other companies.

+ +

Google’s culture, like that of a lot of software companies, is based on giving engineers wide latitude in how they do their jobs.  There is a recognition that strict processes tend not to work well for a dynamic company needing to respond quickly to new technologies, and that bureaucratic rules tend not to work well with creative professionals. Code review, however, is a mandate, one of the few blanket processes in which all software engineers at Google must participate. Google requires code review for almost4 every code change to the codebase, no matter how small. This mandate does have a cost and effect on engineering velocity given that it does slow down the introduction of new code into a codebase and can impact time-to-production for any given code change. (Both of these are common complaints by software engineers of strict code review processes.) Why, then, do we require this process? Why do we believe that this is a long-term benefit?

+ +

A well-designed code review process and a culture of taking code review seriously provides the following benefits:

+ +
    +
  • +

    Checks code correctness

    +
  • +
  • +

    Ensures the code change is comprehensible to other engineers

    +
  • +
  • +

    Enforces consistency across the codebase

    +
  • +
  • +

    Psychologically promotes team ownership

    +
  • +
  • +

    Enables knowledge sharing

    +
  • +
  • +

    Provides a historical record of the code review itself

    +
  • +
+ +

Many of these benefits are critical to a software organization over time, and many of them are beneficial to not only the author but also the reviewers. The following sections go into more specifics for each of these items.

+ +
+

Code Correctness

+ +

An obvious benefit of code review is that it allows a reviewer to check the “correctness†of the code change.   Having another set of eyes look over a change helps ensure that the change does what was intended. Reviewers typically look for whether a change has proper testing, is properly designed, and functions correctly and efficiently. In many cases, checking code correctness is checking whether the particular change can introduce bugs into the codebase.

+ +

Many reports point to the efficacy of code review in the prevention of future bugs in software. A study at IBM found that discovering defects earlier in a process, unsurprisingly, led to less time required to fix them later on.5 The investment in the time for code review saved time otherwise spent in testing, debugging, and performing regressions, provided that the code review process itself was streamlined to keep it lightweight. This latter point is important; code review processes that are heavyweight, or that don’t scale properly, become unsustainable.6 We will get into some best practices for keeping the process lightweight later in this chapter.

+ +

To prevent the evaluation of correctness from becoming more subjective than objective, authors are generally given deference to their particular approach, whether it be in the design or the function of the introduced change. A reviewer shouldn’t propose alternatives because of personal opinion. Reviewers can propose alternatives, but only if they improve comprehension (by being less complex, for example) or functionality (by being more efficient, for example). In general, engineers are encouraged to approve changes that improve the codebase rather than wait for consensus on a more “perfect†solution. This focus tends to speed up code reviews.

+ +

As tooling becomes stronger, many correctness checks are performed automatically through  techniques such as static analysis and  automated testing (though tooling might never completely obviate the value for human-based inspection of code—see Static Analysis for more information). Though this tooling has its limits, it has definitely lessoned the need to rely on human-based code reviews for checking code correctness.

+ +

That said, checking for defects during the initial code review process is still an integral part of a general “shift left†strategy, aiming to discover and resolve issues at the earliest possible time so that they don’t require escalated costs and resources farther down in the development cycle. A code review is neither a panacea nor the only check for such correctness, but it is an element of a defense-in-depth against such problems in software. As a result, code review does not need to be “perfect†to achieve results.

+ +

Surprisingly enough, checking for code correctness is not the primary benefit Google accrues from the process of code review. Checking for code correctness generally ensures that a change works, but more importance is attached to ensuring that a code change is understandable and makes sense over time and as the codebase itself scales. To evaluate those aspects, we need to look at factors other than whether the code is simply logically “correct†or understood.

+
+ +
+

Comprehension of Code

+ +

A code review typically is the first opportunity for someone other than the author to inspect a change.   This perspective allows a reviewer to do something that even the best engineer cannot do: provide feedback unbiased by an author’s perspective. A code review is often the first test of whether a given change is understandable to a broader audience. This perspective is vitally important because code will be read many more times than it is written, and understanding and comprehension are critically important.

+ +

It is often useful to find a reviewer who has a different perspective from the author, especially a reviewer who might need, as part of their job, to maintain or use the code being proposed within the change. Unlike the deference reviewers should give authors regarding design decisions, it’s often useful to treat questions on code comprehension using the maxim “the customer is always right.†In some respect, any questions you get now will be multiplied many-fold over time, so view each question on code comprehension as valid. This doesn’t mean that you need to change your approach or your logic in response to the criticism, but it does mean that you might need to explain it more clearly.

+ +

Together, the code correctness and code comprehension checks are the main criteria for an LGTM from another engineer, which is one of the approval bits needed for an approved code review. When an engineer marks a code review as LGTM, they are saying that the code does what it says and that it is understandable. Google, however, also requires that the code be sustainably maintained, so we have additional approvals needed for code in certain cases.

+
+ +
+

Code Consistency

+ +

At scale, code that you write will be depended on, and eventually maintained, by someone else.   Many others will need to read your code and understand what you did. Others (including automated tools) might need to refactor your code long after you’ve moved to another project. Code, therefore, needs to conform to some standards of consistency so that it can be understood and maintained. Code should also avoid being overly complex; simpler code is easier for others to understand and maintain as well. Reviewers can assess how well this code lives up to the standards of the codebase itself during code review. A code review, therefore, should act to ensure code health.

+ +

It is for maintainability that the LGTM state of a  code review (indicating code correctness and comprehension) is separated from that of readability approval. Readability approvals can be granted only by individuals who have successfully gone through the process of code readability training in a particular programming language. For example, Java code requires approval from an engineer who has “Java readability.â€

+ +

A readability approver is tasked with reviewing  code to ensure that it follows agreed-on best practices for that particular programming language, is consistent with the codebase for that language within Google’s code repository, and avoids being overly complex. Code that is consistent and simple is easier to understand and easier for tools to update when it comes time for refactoring, making it more resilient. If a particular pattern is always done in one fashion in the codebase, it’s easier to write a tool to refactor it.

+ +

Additionally, code might be written only once, but it will be read dozens, hundreds, or even thousands of times. Having code that is consistent across the codebase improves comprehension for all of engineering, and this consistency even affects the process of code review itself. Consistency sometimes clashes with functionality; a readability reviewer may prefer a less complex change that may not be functionally “better†but is easier to understand.

+ +

With a more consistent codebase, it is easier for engineers to step in and review code on someone else’s projects. Engineers might occasionally need to look outside the team for help in a code review. Being able to reach out and ask experts to review the code, knowing they can expect the code itself to be consistent, allows those engineers to focus more properly on code correctness and comprehension.

+
+ +
+

Psychological and Cultural Benefits

+ +

Code review also has important cultural benefits: it reinforces to software engineers that code is not “theirs†but in fact part of a collective enterprise.    Such psychological benefits can be subtle but are still important. Without code review, most engineers would naturally gravitate toward personal style and their own approach to software design. The code review process forces an author to not only let others have input, but to compromise for the sake of the greater good.

+ +

It is human nature to be proud of one’s craft and to be reluctant to open up one’s code to criticism by others. It is also natural to be somewhat reticent to welcome critical feedback about code that one writes. The code review process provides a mechanism to mitigate what might otherwise be an emotionally charged interaction. Code review, when it works best, provides not only a challenge to an engineer’s assumptions, but also does so in a prescribed, neutral manner, acting to temper any criticism which might otherwise be directed to the author if provided in an unsolicited manner. After all, the process requires critical review (we in fact call our code review tool “Critiqueâ€), so you can’t fault a reviewer for doing their job and being critical. The code review process itself, therefore, can act as the “bad cop,†whereas the reviewer can still be seen as the “good cop.â€

+ +

Of course, not all, or even most, engineers need such psychological devices. But buffering such criticism through the process of code review often provides a much gentler introduction for most engineers to the expectations of the team. Many engineers joining Google, or a new team, are intimidated by code review. It is easy to think that any form of critical review reflects negatively on a person’s job performance. But over time, almost all engineers come to expect to be challenged when sending a code review and come to value the advice and questions offered through this process (though, admittedly, this sometimes takes a while).

+ +

Another psychological benefit of code review is validation. Even the most capable engineers can suffer from imposter syndrome and be too self-critical. A process like code review acts as validation and recognition for one’s work. Often, the process involves an exchange of ideas and knowledge sharing (covered in the next section), which benefits both the reviewer and the reviewee. As an engineer grows in their domain knowledge, it’s sometimes difficult for them to get positive feedback on how they improve. The process of code review can provide that mechanism.

+ +

The process of initiating a code review also forces all authors to take a little extra care with their changes. Many software engineers are not perfectionists; most will admit that code that “gets the job done†is better than code that is perfect but that takes too long to develop. Without code review, it’s natural that many of us would cut corners, even with the full intention of correcting such defects later. “Sure, I don’t have all of the unit tests done, but I can do that later.†A code review forces an engineer to resolve those issues before sending the change. Collecting the components of a change for code review psychologically forces an engineer to make sure that all of their ducks are in a row. The little moment of reflection that comes before sending off your change is the perfect time to read through your change and make sure you’re not missing anything.

+
+ +
+

Knowledge Sharing

+ +

One of the most important, but underrated, benefits of code review is in knowledge sharing.   Most authors pick reviewers who are experts, or at least knowledgeable, in the area under review. The review process allows reviewers to impart domain knowledge to the author, allowing the reviewer(s) to offer suggestions, new techniques, or advisory information to the author. (Reviewers can even mark some comments “FYI,†requiring no action; they are simply added as an aid to the author.) Authors who become particularly proficient in an area of the codebase will often become owners as well, who then in turn will be able to act as reviewers for other engineers.

+ +

Part of the code review process of feedback and confirmation involves asking questions on why the change is done in a particular way. This exchange of information facilitates knowledge sharing. In fact, many code reviews involve an exchange of information both ways: the authors as well as the reviewers can learn new techniques and patterns from code review. At Google, reviewers may even directly share suggested edits with an author within the code review tool itself.

+ +

An engineer may not read every email sent to them, but they tend to respond to every code review sent. This knowledge sharing can occur across time zones and projects as well, using Google’s scale to disseminate information quickly to engineers in all corners of the codebase. Code review is a perfect time for knowledge transfer: it is timely and actionable. (Many engineers at Google “meet†other engineers first through their code reviews!)

+ +

Given the amount of time Google engineers spend in code review, the knowledge accrued is quite significant. A Google engineer’s primary task is still programming, of course, but a large chunk of their time is still spent in code review. The code review process provides one of the primary ways that software engineers interact with one another and exchange information about coding techniques. Often, new patterns are advertised within the context of code review, sometimes through refactorings such as large-scale changes.

+ +

Moreover, because each change becomes part of the codebase, code review acts as a historical record. Any engineer can inspect the Google codebase and determine when some particular pattern was introduced and bring up the actual code review in question. Often, that archeology provides insights to many more engineers than the original author and reviewer(s). 

+
+
+ +
+

Code Review Best Practices

+ +

Code review can, admittedly, introduce friction  and delay to an organization. Most of these issues are not problems with code review per se, but with their chosen implementation of code review. Keeping the code review process running smoothly at Google is no different, and it requires a number of best practices to ensure that code review is worth the effort put into the process. Most of those practices emphasize keeping the process nimble and quick so that code review can scale properly.

+ +
+

Be Polite and Professional

+ +

As pointed out in the Culture section of this book, Google heavily fosters a culture of trust and respect.   This filters down into our perspective on code review. A software engineer needs an LGTM from only one other engineer to satisfy our requirement on code comprehension, for example. Many engineers make comments and LGTM a change with the understanding that the change can be submitted after those changes are made, without any additional rounds of review. That said, code reviews can introduce anxiety and stress to even the most capable engineers. It is critically important to keep all feedback and criticism firmly in the professional realm. 

+ +

In general, reviewers should defer to authors on particular approaches and only point out alternatives if the author’s approach is deficient. If an author can demonstrate that several approaches are equally valid, the reviewer should accept the preference of the author. Even in those cases, if defects are found in an approach, consider the review a learning opportunity (for both sides!). All comments should remain strictly professional. Reviewers should be careful about jumping to conclusions based on a code author’s particular approach. It’s better to ask questions on why something was done the way it was before assuming that approach is wrong.

+ +

Reviewers should be prompt with their feedback. At Google, we expect feedback from a code review within 24 (working) hours. If a reviewer is unable to complete a review in that time, it’s good practice (and expected) to respond that they’ve at least seen the change and will get to the review as soon as possible. Reviewers should avoid responding to the code review in piecemeal fashion. Few things annoy an author more than getting feedback from a review, addressing it, and then continuing to get unrelated further feedback in the review process.

+ +

As much as we expect professionalism on the part of the reviewer, we expect professionalism on the part of the author as well. Remember that you are not your code, and that this change you propose is not “yours†but the team’s. After you check that piece of code into the codebase, it is no longer yours in any case. Be receptive to questions on your approach, and be prepared to explain why you did things in certain ways. Remember that part of the responsibility of an author is to make sure this code is understandable and maintainable for the future.

+ +

It’s important to treat each reviewer comment within a code review as a TODO item; a particular comment might not need to be accepted without question, but it should at least be addressed. If you disagree with a reviewer’s comment, let them know, and let them know why and don’t mark a comment as resolved until each side has had a chance to offer alternatives. One common way to keep such debates civil if an author doesn’t agree with a reviewer is to offer an alternative and ask the reviewer to PTAL (please take another look). Remember that code review is a learning opportunity for both the reviewer and the author. That insight often helps to mitigate any chances for disagreement.

+ +

By the same token, if you are an owner of code and responding to a code review within your codebase, be amenable to changes from an outside author. As long as the change is an improvement to the codebase, you should still give deference to the author that the change indicates something that could and should be improved.

+
+ +
+

Write Small Changes

+ +

Probably the most important practice to keep the code review process nimble is to keep changes small.   A code review should ideally be easy to digest and focus on a single issue, both for the reviewer and the author. Google’s code review process discourages massive changes consisting of fully formed projects, and reviewers can rightfully reject such changes as being too large for a single review. Smaller changes also prevent engineers from wasting time waiting for reviews on larger changes, reducing downtime. These small changes have benefits further down in the software development process as well. It is far easier to determine the source of a bug within a change if that particular change is small enough to narrow it down.

+ +

That said, it’s important to acknowledge that a code review process that relies on small changes is sometimes difficult to reconcile with the introduction of major new features. A set of small, incremental code changes can be easier to digest individually, but more difficult to comprehend within a larger scheme. Some engineers at Google admittedly are not fans of the preference given to small changes. Techniques exist for managing such code changes (development on integration branches, management of changes using a diff base different than HEAD), but those techniques inevitably involve more overhead. Consider the optimization for small changes just that: an optimization, and allow your process to accommodate the occasional larger change.

+ +

“Small†changes should generally be limited to about 200 lines of code. A small change should be easy on a reviewer and, almost as important, not be so cumbersome that additional changes are delayed waiting for an extensive review. Most changes at Google are expected to be reviewed within about a day.7 (This doesn’t necessarily mean that the review is over within a day, but that initial feedback is provided within a day.) About 35% of the changes at Google are to a single file.8 Being easy on a reviewer allows for quicker changes to the codebase and benefits the author as well. The author wants a quick review; waiting on an extensive review for a week or so would likely impact follow-on changes. A small initial review also can prevent much more expensive wasted effort on an incorrect approach further down the line.

+ +

Because code reviews are typically small, it’s common for almost all code reviews at Google to be reviewed by one and only one person. Were that not the case—if a team were expected to weigh in on all changes to a common codebase—there is no way the process itself would scale. By keeping the code reviews small, we enable this optimization. It’s not uncommon for multiple people to comment on any given change—most code reviews are sent to a team member, but also CC’d to appropriate teams—but the primary reviewer is still the one whose LGTM is desired, and only one LGTM is necessary for any given change.  Any other comments, though important, are still optional.

+ +

Keeping changes small also allows the “approval†reviewers to more quickly approve any given changes. They can quickly inspect whether the primary code reviewer did due diligence and focus purely on whether this change augments the codebase while maintaining code health over time.

+
+ +
+

Write Good Change Descriptions

+ +

A change description should indicate its type of change on the first line, as a summary.    The first line is prime real estate and is used to provide summaries within the code review tool itself, to act as the subject line in any associated emails, and to become the visible line Google engineers see in a history summary within Code Search (see Code Search), so that first line is important. 

+ +

Although the first line should be a summary of the entire change, the description should still go into detail on what is being changed and why. A description of “Bug fix†is not helpful to a reviewer or a future code archeologist. If several related modifications were made in the change, enumerate them within a list (while still keeping it on message and small). The description is the historical record for this change, and tools such as Code Search allow you to find who wrote what line in any particular change in the codebase. Drilling down into the original change is often useful when trying to fix a bug.

+ +

Descriptions aren’t the only opportunity for adding documentation to a change. When writing a public API, you generally don’t want to leak implementation details, but by all means do so within the actual implementation, where you should comment liberally. If a reviewer does not understand why you did something, even if it is correct, it is a good indicator that such code needs better structure or better comments (or both). If, during the code review process, a new decision is reached, update the change description, or add appropriate comments within the implementation. A code review is not just something that you do in the present time; it is something you do to record what you did for posterity.

+
+ +
+

Keep Reviewers to a Minimum

+ +

Most code reviews at  Google are reviewed by precisely one reviewer.9 Because the code  review process allows the bits on code correctness, owner acceptance, and language readability to be handled by one individual, the code review process scales quite well across an organization the size of Google.

+ +

There is a tendency within the industry, and within individuals, to try to get additional input (and unanimous consent) from a cross-section of engineers. After all, each additional reviewer can add their own particular insight to the code review in question. But we’ve found that this leads to diminishing returns; the most important LGTM is the first one, and subsequent ones don’t add as much as you might think to the equation. The cost of additional reviewers quickly outweighs their value.

+ +

The code review process is optimized around the trust we place in our engineers to do the right thing. In certain cases, it can be useful to get a particular change reviewed by multiple people, but even in those cases, those reviewers should focus on different aspects of the same change.

+
+ +
+

Automate Where Possible

+ +

Code review is a human process, and that human input is important, but if there are components of the code process that can be automated, try to do so.  Opportunities to automate mechanical human tasks should be explored; investments in proper tooling reap dividends.  At Google, our code review tooling allows authors to automatically submit and automatically sync changes to the source control system upon approval (usually used for fairly simple changes).

+ +

One of the most important technological improvements regarding automation over the past few years is automatic static analysis of a given code change (see Static Analysis). Rather than require authors to run tests, linters, or formatters, the current Google code review tooling provides most of that utility automatically through  what is known as presubmits. A presubmit process is run when a change is initially sent to a reviewer. Before that change is sent, the presubmit process can detect a variety of problems with the existing change, reject the current change (and prevent sending an awkward email to a reviewer), and ask the original author to fix the change first. Such automation not only helps out with the code review process itself, it also allows the reviewers to focus on more important concerns than formatting. 

+
+
+ +
+

Types of Code Reviews

+ +

All code reviews are not alike! Different  types of code review require different levels of focus on the various aspects of the review process. Code changes at Google generally fall into one of the following buckets (though there is sometimes overlap):

+ +
    +
  • +

    Greenfield reviews and new feature development

    +
  • +
  • +

    Behavioral changes, improvements, and optimizations

    +
  • +
  • +

    Bug fixes and rollbacks

    +
  • +
  • +

    Refactorings and large-scale changes

    +
  • +
+ +
+

Greenfield Code Reviews

+ +

The least common type of code review is that of entirely new code, a so-called greenfield review.   A greenfield review is the most important time to evaluate whether the code will stand the test of time: that it will be easier to maintain as time and scale change the underlying assumptions of the code. Of course, the introduction of entirely new code should not come as a surprise. As mentioned earlier in this chapter, code is a liability, so the introduction of entirely new code should generally solve a real problem rather than simply provide yet another alternative.  At Google, we generally require new code and/or projects to undergo an extensive design review, apart from a code review. A code review is not the time to debate design decisions already made in the past (and by the same token, a code review is not the time to introduce the design of a proposed API).

+ +

To ensure that code is sustainable, a greenfield review should ensure that an API matches an agreed design (which may require reviewing a design document) and is tested fully, with all API endpoints having some form of unit test, and that those tests fail when the code’s assumptions change. (See Testing Overview).  The code should also have proper owners (one of the first reviews in a new project is often of a single OWNERS file for the new directory), be sufficiently commented, and provide supplemental documentation, if needed.  A greenfield review might also necessitate the introduction of a project into the continuous integration system. (See Continuous Integration).

+
+ +
+

Behavioral Changes, Improvements, and Optimizations

+ +

Most changes at Google generally fall into the broad category of modifications to existing code within the codebase.  These additions may include modifications to API endpoints,  improvements to existing implementations, or optimizations for other factors such as performance.  Such changes are the bread and butter of most software engineers.

+ +

In each of these cases, the guidelines that apply to a greenfield review also apply: is this change necessary, and does this change improve the codebase? Some of the best modifications to a codebase are actually deletions! Getting rid of dead or obsolete code is one of the best ways to improve the overall code health of a codebase.

+ +

Any behavioral modifications  should necessarily include revisions to appropriate tests for any new API behavior. Augmentations to the implementation should be tested in a Continuous Integration (CI) system to ensure that those modifications don’t break any underlying assumptions of the existing tests. As well, optimizations should of course ensure that they don’t affect those tests and might need to include performance benchmarks for the reviewers to consult. Some optimizations might also require benchmark tests.

+
+ +
+

Bug Fixes and Rollbacks

+ +

Inevitably, you will need to submit a change for  a bug fix to your  codebase. When doing so, avoid the temptation to address other issues. Not only does this risk increasing the size of the code review, it also makes it more difficult to perform regression testing or for others to roll back your change. A bug fix should focus solely on fixing the indicated bug and (usually) updating associated tests to catch the error that occurred in the first place.

+ +

Addressing the bug with a revised test is often necessary. The bug surfaced because existing tests were either inadequate, or the code had certain assumptions that were not met. As a reviewer of a bug fix, it is important to ask for updates to unit tests if applicable.

+ +

Sometimes, a code change in a codebase as large as Google’s causes some dependency to fail that was either not detected properly by tests or that unearths an untested part of the codebase.  In those cases, Google allows such changes to be “rolled back,†usually by the affected downstream customers. A rollback consists of a change that essentially undoes the previous change. Such rollbacks can be created in seconds because they just revert the previous change to a known state, but they still require a code review.

+ +

It also becomes critically important that any change that could cause a potential rollback (and that includes all changes!) be as small and atomic as possible so that a rollback, if needed, does not cause further breakages on other dependencies that can be difficult to untangle. At Google, we’ve seen developers start to depend on new code very quickly after it is submitted, and rollbacks sometimes break these developers as a result. Small changes help to mitigate these concerns, both because of their atomicity, and because reviews of small changes tend to be done quickly.

+
+ +
+

Refactorings and Large-Scale Changes

+ +

Many changes at Google are automatically generated: the author of the change isn’t a person, but a machine.   We discuss more  about the large-scale change (LSC) process in Large-Scale Changes, but even machine-generated changes require review. In cases where the change is considered low risk, it is reviewed by designated reviewers who have approval privileges for our entire codebase. But for cases in which the change might be risky or otherwise requires local domain expertise, individual engineers might be asked to review automatically generated changes as part of their normal workflow.

+ +

At first look, a review for an automatically generated change should be handled the same as any other code review: the reviewer should check for correctness and applicability of the change. However, we encourage reviewers to limit comments in the associated change and only flag concerns that are specific to their code, not the underlying tool or LSC generating the changes. While the specific change might be machine generated, the overall process generating these changes has already been reviewed, and individual teams cannot hold a veto over the process, or it would not be possible to scale such changes across the organization. If there is a concern about the underlying tool or process, reviewers can escalate out of band to an LSC oversight group for more information.

+ +

We also encourage reviewers of automatic changes to avoid expanding their scope. When reviewing a new feature or a change written by a teammate, it is often reasonable to ask the author to address related concerns within the same change, so long as the request still follows the earlier advice to keep the change small. This does not apply to automatically generated changes because the human running the tool might have hundreds of changes in flight, and even a small percentage of changes with review comments or unrelated questions limits the scale at which the human can effectively operate the tool. 

+
+
+ +
+

Conclusion

+ +

Code review is one of the most important and critical processes at Google. Code review acts as the glue connecting engineers with one another, and the code review process is the primary developer workflow upon which almost all other processes must hang, from testing to static analysis to CI. A code review process must scale appropriately, and for that reason, best practices, including small changes and rapid feedback and iteration, are important to maintain developer satisfaction and appropriate production velocity.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Code review has many benefits, including ensuring code correctness, comprehension, and consistency across a codebase.

    +
  • +
  • +

    Always check your assumptions through someone else; optimize for the reader.

    +
  • +
  • +

    Provide the opportunity for critical feedback while remaining professional.

    +
  • +
  • +

    Code review is important for knowledge sharing throughout an organization.

    +
  • +
  • +

    Automation is critical for scaling the process.

    +
  • +
  • +

    The code review itself provides a historical record. 

    +
  • +
+
+

1We also use Gerrit to review Git code, primarily for our open source projects. However, Critique is the primary tool of a typical software engineer at Google.

2Steve McConnell, Code Complete (Redmond: Microsoft Press, 2004).

3At Google, “readability†does not refer simply to comprehension, but to the set of styles and best practices that allow code to be maintainable to other engineers. See Knowledge Sharing.

4Some changes to documentation and configurations might not require a code review, but it is often still preferable to obtain such a review.

5“Advances in Software Inspection,†IEEE Transactions on Software Engineering, SE-12(7): 744–751, July 1986. Granted, this study took place before robust tooling and automated testing had become so important in the software development process, but the results still seem relevant in the modern software age.

6Rigby, Peter C. and Christian Bird. 2013. "Convergent contemporary software peer review practices." ESEC/FSE 2013: Proceedings of the 2013 9th Joint Meeting on Foundations of Software Engineering, August 2013: 202-212. https://dl.acm.org/doi/10.1145/2491411.2491444.

7Caitlin Sadowski, Emma Söderberg, Luke Church, Michal Sipko, and Alberto Bacchelli, "Modern code review: a case study at Google."

8Ibid.

9Ibid.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch10.html b/clones/abseil.io/resources/swe-book/html/ch10.html new file mode 100644 index 00000000..1fbbfcbf --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch10.html @@ -0,0 +1,549 @@ + + + + + Software Engineering at Google + + + + +
+

Documentation

+ + + + + +

Of the complaints most engineers have about writing, using, and maintaining code, a singular common frustration  is the lack of quality documentation. “What are the side effects of this method?†“I got an error after step 3.†“What does this acronym mean?†“Is this document up to date?†Every software engineer has voiced complaints about the quality, quantity, or sheer lack of documentation throughout their career, and the software engineers at Google are no different.

+ +

Technical writers and project managers may help, but software engineers will always need to write most documentation themselves. Engineers, therefore, need the proper tools and incentives to do so effectively. The key to making it easier for them to write quality documentation is to introduce processes and tools that scale with the organization and that tie into their existing workflow.

+ +

Overall, the state of engineering documentation in the late 2010s is similar to the state of software testing in the late 1980s. Everyone recognizes that more effort needs to be made to improve it, but there is not yet organizational recognition of its critical benefits. That is changing, if slowly. At Google, our most successful efforts have been when documentation is treated like code and incorporated into the traditional engineering workflow, making it easier for engineers to write and maintain simple documents.

+ +
+

What Qualifies as Documentation?

+ +

When we refer to “documentation,†we’re talking about every  supplemental text that an engineer needs to write to do their job: not only standalone documents, but code comments as well. (In fact, most of the documentation an engineer at Google writes comes in the form of code comments.) We’ll discuss the various types of engineering documents further in this chapter.

+
+ +
+

Why Is Documentation Needed?

+ +

Quality documentation has tremendous benefits for an engineering organization. Code and APIs become more comprehensible, reducing mistakes.  Project teams are more focused when their design goals and team objectives are clearly stated. Manual processes are easier to follow when the steps are clearly outlined. Onboarding new members to a team or code base takes much less effort if the process is clearly documented.

+ +

But because documentation’s benefits are all necessarily downstream, they generally don’t reap immediate benefits to the author. Unlike testing, which (as we’ll see) quickly provides benefits to a programmer, documentation generally requires more effort up front and doesn’t provide clear benefits to an author until later. But, like investments in testing, the investment made in documentation will pay for itself over time. After all, you might write a document only once,1 but it will be read hundreds, perhaps thousands of times afterward; its initial cost is amortized across all the future readers. Not only does documentation scale over time, but it is critical for the rest of the organization to scale as well. It helps answer questions like these:

+ +
    +
  • +

    Why were these design decisions made?

    +
  • +
  • +

    Why did we implement this code in this manner?

    +
  • +
  • +

    Why did I implement this code in this manner, if you’re looking at your own code two years later?

    +
  • +
+ +

If documentation conveys all these benefits, why is it generally considered “poor†by engineers? One reason, as we’ve mentioned, is that the benefits aren’t immediate, especially to the writer. But there are several other reasons:

+ +
    +
  • +

    Engineers often view writing as a separate skill than that of programming. (We’ll try to illustrate that this isn’t quite the case, and even where it is, it isn’t necessarily a separate skill from that of software engineering.)

    +
  • +
  • +

    Some engineers don’t feel like they are capable writers. But you don’t need a robust command of English2 to produce workable documentation. You just need to step outside yourself a bit and see things from the audience’s perspective.

    +
  • +
  • +

    Writing documentation is often more difficult because of limited tools support or integration into the developer workflow.

    +
  • +
  • +

    Documentation is viewed as an extra burden—something else to maintain—rather than something that will make maintenance of their existing code easier.

    +
  • +
+ +

Not every engineering team needs a technical writer (and even if that were the case, there aren’t enough of them). This means that engineers will, by and large, write most of the documentation themselves. So, instead of forcing engineers to become technical writers, we should instead think about how to make writing documentation easier for engineers. Deciding how much effort to devote to documentation is a decision your organization will need to make at some point.

+ +

Documentation benefits several different groups. Even to the writer, documentation provides the following benefits:

+ +
    +
  • +

    It helps  formulate an API. Writing documentation is one of the surest ways to figure out if your API makes sense. Often, the writing of the documentation itself leads engineers to reevaluate design decisions that otherwise wouldn’t be questioned. If you can’t explain it and can’t define it, you probably haven’t designed it well enough.

    +
  • +
  • +

    It provides a road map for maintenance and a historical record. Tricks in code should be avoided, in any case, but good comments help out a great deal when you’re staring at code you wrote two years ago, trying to figure out what’s wrong.

    +
  • +
  • +

    It makes your code look more professional and drive traffic. Developers will naturally assume that a well-documented API is a better-designed API. That’s not always the case, but they are often highly correlated. Although this benefit sounds cosmetic, it’s not quite so: whether a product has good documentation is usually a pretty good indicator of how well a product will be maintained.

    +
  • +
  • +

    It will prompt fewer questions from other users. This is probably the biggest benefit over time to someone writing the documentation. If you have to explain something to someone more than once, it usually makes sense to document that process.

    +
  • +
+ +

As great as these benefits are to the writer of documentation, the lion’s share of documentation’s benefits will naturally accrue to the reader. Google’s C++ Style Guide notes the maxim “optimize for the reader.†This maxim applies not just to code, but to the comments around code, or the documentation set attached to an API. Much like testing, the effort you put into writing good documents will reap benefits many times over its lifetime. Documentation is critical over time, and reaps tremendous benefits for especially critical code as an organization scales. 

+
+ +
+

Documentation Is Like Code

+ +

Software engineers who write in a single, primary programming language still often reach for different languages to solve specific problems.  An engineer might write shell scripts or Python to run command-line tasks, or they might write most of their backend code in C++ but write some middleware code in Java, and so on. Each language is a tool in the toolbox.

+ +

Documentation should be no different: it’s a tool, written in a different language (usually English) to accomplish a particular task. Writing documentation is not much different than writing code. Like a programming language, it has rules, a particular syntax, and style decisions, often to accomplish a similar purpose as that within code: enforce consistency, improve clarity, and avoid (comprehension) errors. Within technical documentation, grammar is important not because one needs rules, but to standardize the voice and avoid confusing or distracting the reader. Google requires a certain comment style for many of its languages for this reason.

+ +

Like code, documents should also have owners. Documents without owners become stale and difficult to maintain. Clear ownership also makes it easier to handle documentation through existing developer workflows: bug tracking systems, code review tooling, and so forth. Of course, documents with different owners can still conflict with one another.  In those cases, it is important to designate canonical documentation: determine the primary source and consolidate other associated documents into that primary source (or deprecate the duplicates).

+ +

The prevalent  usage of “go/ links†at Google (see Knowledge Sharing) makes this process easier. Documents with straightforward go/ links often become the canonical source of truth. One other way to promote canonical documents is to associate them directly with the code they document by placing them directly under source control and alongside the source code itself.

+ +

Documentation is often so tightly coupled to code that it should, as much as possible, be treated as code. That is, your documentation should:

+ +
    +
  • +

    Have internal policies or rules to be followed

    +
  • +
  • +

    Be placed under source control

    +
  • +
  • +

    Have clear ownership responsible for maintaining the docs

    +
  • +
  • +

    Undergo reviews for changes (and change with the code it documents)

    +
  • +
  • +

    Have issues tracked, as bugs are tracked in code

    +
  • +
  • +

    Be periodically evaluated (tested, in some respect)

    +
  • +
  • +

    If possible, be measured for aspects such as accuracy, freshness, etc. (tools have still not caught up here)

    +
  • +
+ +

The more engineers treat documentation as “one of†the necessary tasks of software development, the less they will resent the upfront costs of writing, and the more they will reap the long-term benefits. In addition, making the task of documentation easier reduces those upfront costs. 

+ + +
+ +
+

Know Your Audience

+ +

One of the most important mistakes that engineers make when writing documentation is to write only for themselves.  It’s natural to do so, and writing for yourself is not without value: after all, you might need to look at this code in a few years and try to figure out what you once meant. You also might be of approximately the same skill set as someone reading your document. But if you write only for yourself, you are going to make certain assumptions, and given that your document might be read by a very wide audience (all of engineering, external developers), even a few lost readers is a large cost. As an organization grows, mistakes in documentation become more prominent, and your assumptions often do not apply.

+ +

Instead, before you begin writing, you should (formally or informally) identify the audience(s) your documents need to satisfy. A design document might need to persuade decision makers. A tutorial might need to provide very explicit instructions to someone utterly unfamiliar with your codebase. An API might need to provide complete and accurate reference information for any users of that API, be they experts or novices. Always try to identify a primary audience and write to that audience.

+ +

Good documentation need not be polished or “perfect.†One mistake engineers make when writing documentation is assuming they need to be much better writers. By that measure, few software engineers would write. Think about writing like you do about testing or any other process you need to do as an engineer. Write to your audience, in the voice and style that they expect. If you can read, you can write. Remember that your audience is standing where you once stood, but without your new domain knowledge. So you don’t need to be a great writer; you just need to get someone like you as familiar with the domain as you now are. (And as long as you get a stake in the ground, you can improve this document over time.)

+ +
+

Types of Audiences

+ +

We’ve pointed out that you should write at the skill level and domain knowledge appropriate for your audience.  But who precisely is your audience? Chances are, you have multiple audiences based on one or more of the following criteria:

+ +
    +
  • +

    Experience level (expert programmers, or junior engineers who might not even be familiar—gulp!—with the language). 

    +
  • +
  • +

    Domain knowledge (team members, or other engineers in your organization who are familiar only with API endpoints). 

    +
  • +
  • +

    Purpose (end users who might need your API to do a specific task and need to find that  information quickly, or software gurus who are responsible for the guts of a particularly hairy implementation that you hope no one else needs to maintain).

    +
  • +
+ +

In some cases, different audiences require different writing styles, but in most cases, the trick is to write in a way that applies as broadly to your different audience groups as possible. Often, you will need to explain a complex topic to both an expert and a novice. Writing for the expert with domain knowledge may allow you to cut corners, but you’ll confuse the novice; conversely, explaining everything in detail to the novice will doubtless annoy the expert.

+ +

Obviously, writing such documents is a balancing act and there’s no silver bullet, but one thing we’ve found is that it helps to keep your documents short. Write descriptively enough to explain complex topics to people unfamiliar with the topic, but don’t lose or annoy experts. Writing a short document often requires you to write a longer one (getting all the information down) and then doing an edit pass, removing duplicate information where you can. This might sound tedious, but keep in mind that this expense is spread across all the readers of the documentation.  As Blaise Pascal once said, “If I had more time, I would have written you a shorter letter.†By keeping a document short and clear, you will ensure that it will satisfy both an expert and a novice.

+ +

Another important audience distinction is based on how a user encounters a document:

+ +
    +
  • +

    Seekers are engineers who know what they want and want to know if what they are looking at fits the bill.  A key pedagogical device for this audience is consistency. If you are writing reference documentation for this group—within a code file, for example—you will want to have your comments follow a similar format so that readers can quickly scan a reference and see whether they find what they are looking for.

    +
  • +
  • +

    Stumblers might not know exactly what they want.  They might have only a vague idea of how to implement what they are working with. The key for this audience is clarity. Provide overviews or introductions (at the top of a file, for example) that explain the purpose of the code they are looking at. It’s also useful to identify when a doc is not appropriate for an audience. A lot of documents at Google begin with a “TL;DR statement†such as “TL;DR: if you are not interested in C++ compilers at Google, you can stop reading now.â€

    +
  • +
+ +

Finally, one important audience distinction is between that of a customer (e.g., a user of an API) and that of a  provider (e.g., a member of the project team).  As much as possible, documents intended for one should be kept apart from documents intended for the other. Implementation details are important to a team member for maintenance purposes; end users should not need to read such information. Often, engineers denote design decisions within the reference API of a library they publish. Such reasonings belong more appropriately in specific documents (design documents) or, at best, within the implementation details of code hidden behind an interface. 

+
+
+ +
+

Documentation Types

+ +

Engineers write various different types of documentation as part of their work: design  documents, code comments, how-to documents, project pages, and more. These all count as “documentation.†But it is important to know the different types, and to not mix types. A document should have, in general, a singular purpose, and stick to it. Just as an API should do one thing and do it well, avoid trying to do several things within one document. Instead, break out those pieces more logically.

+ +

There are several main types of documents that software engineers often need to write:

+ +
    +
  • +

    Reference documentation, including code comments

    +
  • +
  • +

    Design documents

    +
  • +
  • +

    Tutorials

    +
  • +
  • +

    Conceptual documentation

    +
  • +
  • +

    Landing pages

    +
  • +
+ +

It was common in the early days of Google for teams to have monolithic wiki pages with bunches of links (many broken or obsolete), some conceptual information about how the system worked, an API reference, and so on, all sprinkled together. Such documents fail because they don’t serve a single purpose (and they also get so long that no one will read them; some notorious wiki pages scrolled through several dozens of screens). Instead, make sure your document has a singular purpose, and if adding something to that page doesn’t make sense, you probably want to find, or even create, another document for that purpose.

+ +
+

Reference Documentation

+ +

Reference  documentation is the most common type that engineers  need to write; indeed, they often need to write some form of reference documents every day. By reference documentation, we mean anything that documents the usage of code within the codebase.  Code comments are the most common form of reference documentation that an engineer must maintain. Such comments can be divided into two basic camps: API comments versus implementation comments.  Remember the audience differences between these two: API comments don’t need to discuss implementation details or design decisions and can’t assume a user is as versed in the API as the author.  Implementation comments, on the other hand, can assume a lot more domain knowledge of the reader, though be careful in assuming too much: people leave projects, and sometimes it’s safer to be methodical about exactly why you wrote this code the way you did.

+ +

Most reference documentation, even when provided as separate documentation from the code, is generated from  comments within the codebase itself. (As it should; reference documentation should be single-sourced as much as possible.) Some languages such as Java or Python have specific commenting frameworks (Javadoc, PyDoc, GoDoc) meant to make generation of this reference documentation easier.  Other languages, such as C++, have no standard “reference documentation†implementation, but because C++ separates out its API surface (in header or .h files) from the implementation (.cc files), header files are often a natural place to document a C++ API.  

+ +

Google takes this approach: a C++ API deserves to have its reference documentation live within the header file. Other reference documentation is embedded directly in the Java, Python, and Go source code as well. Because Google’s Code Search browser (see Code Search) is so robust, we’ve found little benefit to providing separate generated reference documentation. Users in Code Search not only search code easily, they can usually find the original definition of that code as the top result. Having the documentation alongside the code’s definitions also makes the documentation easier to discover and maintain.

+ +

We all know that code comments are essential to a well-documented API. But what precisely is a “good†comment? Earlier in this chapter, we identified two major audiences for reference documentation: seekers and stumblers. Seekers know what they want; stumblers don’t. The key win for seekers is a consistently commented codebase so that they can quickly scan an API and find what they are looking for. The key win for stumblers is clearly identifying the purpose of an API, often at the top of a file header. We’ll walk through some code comments in the subsections that follow. The code commenting guidelines that follow apply to C++, but similar rules are in place at Google for other languages.

+ +
+

File comments

+ +

Almost all  code files at Google  must contain a file comment. (Some header files that contain only one utility function, etc., might deviate from this standard.) File comments should begin with a header of the following form:

+ +
+
// -----------------------------------------------------------------------------
+// str_cat.h
+// -----------------------------------------------------------------------------
+//
+// This header file contains functions for efficiently concatenating and appending
+// strings: StrCat() and StrAppend(). Most of the work within these routines is
+// actually handled through use of a special AlphaNum type, which was designed
+// to be used as a parameter type that efficiently manages conversion to
+// strings and avoids copies in the above operations.
+…
+
+ +

Generally, a file comment should begin with an outline of what’s contained in the code you are reading. It should identify the code’s main use cases and intended audience (in the preceding case, developers who want to concatenate strings). Any API that cannot be succinctly described in the first paragraph or two is usually the sign of an API that is not well thought out. Consider breaking the API into separate components in those cases.

+
+ +
+

Class comments

+ +

Most modern programming  languages are object oriented.  Class comments are therefore important for defining the API “objects†in use in a codebase. All public classes (and structs) at Google must contain a class comment describing the class/struct, important methods of that class, and the purpose of the class. Generally, class comments should be “nouned†with documentation emphasizing their object aspect. That is, say, “The Foo class contains x, y, z, allows you to do Bar, and has the following Baz aspects,†and so on.

+ +

Class comments should generally begin with a comment of the following form:

+ +
+
// -----------------------------------------------------------------------------
+// AlphaNum
+// -----------------------------------------------------------------------------
+//
+// The AlphaNum class acts as the main parameter type for StrCat() and
+// StrAppend(), providing efficient conversion of numeric, boolean, and
+// hexadecimal values (through the Hex type) into strings.
+
+
+ +
+

Function comments

+ +

All free functions, or public methods of a class, at Google must also contain a function comment  describing what the function does.  Function comments should stress the active nature of their use, beginning with an indicative verb describing what the function does and what is returned.

+ +

Function comments should generally begin with a comment of the following form:

+ +
+
// StrCat()
+//
+// Merges the given strings or numbers, using no delimiter(s),
+// returning the merged result as a string.
+…
+
+ +

Note that starting a function comment with a declarative verb introduces consistency across a header file. A seeker can quickly scan an API and read just the verb to get an idea of whether the function is appropriate: “Merges, Deletes, Creates,†and so on.

+ +

Some documentation styles (and some documentation generators) require various forms of boilerplate on function comments, like "Returns:", "Throws:", and so forth, but at Google we haven’t found them to be necessary. It is often clearer to present such information in a single prose comment that’s not broken up into artificial section boundaries:

+ +
+
// Creates a new record for a customer with the given name and address,
+// and returns the record ID, or throws `DuplicateEntryError` if a
+// record with that name already exists.
+int AddCustomer(string name, string address);
+
+ +

Notice how the postcondition, parameters, return value, and exceptional cases are naturally documented together (in this case, in a single sentence), because they are not independent of one another. Adding explicit boilerplate sections would make the comment more verbose and  repetitive, but  no clearer (and arguably less clear). 

+
+
+ +
+

Design Docs

+ +

Most teams at Google require an approved design document before starting work on any major project.   A software engineer typically writes the proposed design document using a specific design doc template approved by the team. Such documents are designed to be collaborative, so they are often shared in Google Docs, which has good collaboration tools. Some teams require such design documents to be discussed and debated at specific team meetings, where the finer points of the design can be discussed or critiqued by experts. In some respects, these design discussions act as a form of code review before any code is written.

+ +

Because the development of a design document is one of the first processes an engineer undertakes before deploying a new system, it is also a convenient place to ensure that various concerns are covered. The canonical design document templates at Google require engineers to consider aspects of their design such as security implications, internationalization, storage requirements and privacy concerns, and so on. In most cases, such parts of those design documents are reviewed by experts in those domains.

+ +

A good design document should cover the goals of the design, its implementation strategy, and propose key design decisions with an emphasis on their individual trade-offs. The best design documents suggest design goals and cover alternative designs, denoting their strong and weak points.

+ +

A good design document, once approved, also acts not only as a historical record, but as a measure of whether the project successfully achieved its goals. Most teams archive their design documents in an appropriate location within their team documents so that they can review them at a later time. It’s often useful to review a design document before a product is launched to ensure that the stated goals when the design document was written remain the stated goals at launch (and if they do not, either the document or the product can be adjusted accordingly).

+
+ +
+

Tutorials

+ +

Every software engineer, when they join a new team, will want to get up to speed as quickly as possible.   Having a tutorial that walks someone through the setup of a new project is invaluable; “Hello World†has established itself as one of the best ways to ensure that all team members start off on the right foot.  This goes for documents as well as code. Most projects deserve a “Hello World†document that assumes nothing and gets the engineer to make something “real†happen.

+ +

Often, the best time to write a tutorial, if one does not yet exist, is when you first join a team. (It’s also the best time to find bugs in any existing tutorial you are following.) Get a notepad or other way to take notes, and write down everything you need to do along the way, assuming no domain knowledge or special setup constraints; after you’re done, you’ll likely know what mistakes you made during the process—and why—and can then edit down your steps to get a more streamlined tutorial. Importantly, write everything you need to do along the way; try not to assume any particular setup, permissions, or domain knowledge. If you do need to assume some other setup, state that clearly in the beginning of the tutorial as a set of prerequisites.

+ +

Most tutorials require you to perform a number of steps, in order. In those cases, number those steps explicitly. If the focus of the tutorial is on the user (say, for external developer documentation), then number each action that a user needs to undertake. Don’t number actions that the system may take in response to such user actions.  It is critical and important to number explicitly every step when doing this. Nothing is more annoying than an error on step 4 because you forget to tell someone to properly authorize their username, for example.

+ +
+

Example: A bad tutorial

+ +
    +
  1. +

    Download the package from our server at http://example.com

    +
  2. +
  3. +

    Copy the shell script to your home directory

    +
  4. +
  5. +

    Execute the shell script

    +
  6. +
  7. +

    The foobar system will communicate with the authentication system

    +
  8. +
  9. +

    Once authenticated, foobar will bootstrap a new database named “bazâ€

    +
  10. +
  11. +

    Test “baz†by executing a SQL command on the command line

    +
  12. +
  13. +

    Type: CREATE DATABASE my_foobar_db;

    +
  14. +
+ +

In the preceding procedure, steps 4 and 5 happen on the server end. It’s unclear whether the user needs to do anything, but they don’t, so those side effects can be mentioned as part of step 3. As well, it’s unclear whether step 6 and step 7 are different. (They aren’t.) Combine all atomic user operations into single steps so that the user knows they need to do something at each step in the process. Also, if your tutorial has user-visible input or output, denote that on separate lines (often using the convention of a monospaced bold font).

+
+ +
+

Example: A bad tutorial made better

+ +
    +
  1. +

    Download the  package from our server at http://example.com:

    + +
    $ curl -I http://example.com
    +
  2. +
  3. +

    Copy the shell script to your home directory:

    + +
    $ cp foobar.sh ~
    +
  4. +
  5. +

    Execute the shell script in your home directory:

    + +
    $ cd ~; foobar.sh
    + +

    The foobar system will first communicate with the authentication system. Once authenticated, foobar will bootstrap a new database named “baz†and open an input shell.

    +
  6. +
  7. +

    Test “baz†by executing a SQL command on the command line:

    + +
    baz:$ CREATE DATABASE my_foobar_db;
    +
  8. +
+ +

Note how each step requires specific user intervention. If, instead, the tutorial had a focus on some other aspect (e.g., a document about the “life of a serverâ€), number those steps from the perspective of that focus (what the server does).

+
+
+ +
+

Conceptual Documentation

+ +

Some code requires deeper explanations or insights than can be obtained simply by reading the reference documentation.   In those cases, we need conceptual documentation to provide overviews of the APIs or systems. Some examples of conceptual documentation might be a library overview for a popular API, a document describing the life cycle of data within a server, and so on. In almost all cases, a conceptual document is meant to augment, not replace, a reference documentation set. Often this leads to duplication of some information, but with a purpose: to promote clarity. In those cases, it is not necessary for a conceptual document to cover all edge cases (though a reference should cover those cases religiously). In this case, sacrificing some accuracy is acceptable for clarity. The main point of a conceptual document is to impart understanding.

+ +

“Concept†documents are the most difficult forms of documentation to write. As a result, they are often the most neglected type of document within a software engineer’s toolbox. One problem engineers face when writing conceptual documentation is that it often cannot be embedded directly within the source code because there isn’t a canonical location to place it.  Some APIs have a relatively broad API surface area, in which case, a file comment might be an appropriate place for a “conceptual†explanation of the API. But often, an API works in conjunction with other APIs and/or modules. The only logical place to document such complex behavior is through a separate conceptual document. If comments are the unit tests of documentation, conceptual documents are the integration tests.

+ +

Even when an API is appropriately scoped, it often makes sense to provide a separate conceptual document. For example, Abseil’s StrFormat library covers a variety of concepts that accomplished users of the API should understand. In those cases, both internally and externally, we provide a format concepts document.

+ +

A concept document needs to be useful to a broad audience: both experts and novices alike. Moreover, it needs to emphasize clarity, so it often needs to sacrifice completeness (something best reserved for a reference) and (sometimes) strict accuracy. That’s not to say a conceptual document should intentionally be inaccurate; it just means that it should focus on common usage and leave rare usages or side effects for reference documentation.

+
+ +
+

Landing Pages

+ +

Most engineers are members of a team, and most teams have a “team page†somewhere on their company’s intranet.   Often, these sites are a bit of a mess: a typical landing page might contain some interesting links, sometimes several documents titled “read this first!â€, and some information both for the team and for its customers. Such documents start out useful but rapidly turn into disasters; because they become so cumbersome to maintain, they will eventually get so obsolete that they will be fixed by only the brave or the desperate.

+ +

Luckily, such documents look intimidating, but are actually straightforward to fix: ensure that a landing page clearly identifies its purpose, and then include only links to other pages for more information. If something on a landing page is doing more than being a traffic cop, it is not doing its job. If you have a separate setup document, link to that from the landing page as a separate document. If you have too many links on the landing page (your page should not scroll multiple screens), consider breaking up the pages by taxonomy, under different sections.

+ +

Most poorly configured landing pages serve two different purposes: they are the “goto†page for someone who is a user of your product or API, or they are the home page for a team. Don’t have the page serve both masters—it will become confusing. Create a separate “team page†as an internal page apart from the main landing page. What the team needs to know is often quite different than what a customer of your API needs to know. 

+
+
+ +
+

Documentation Reviews

+ +

At Google, all code needs to be reviewed, and our code review process is well understood and accepted.  In general, documentation also needs review (though this is less universally accepted). If you want to “test†whether your documentation works, you should generally have someone else review it.

+ +

A technical document benefits from three different types of reviews, each emphasizing different aspects:

+ +
    +
  • +

    A technical review, for accuracy.  This review is usually done by a subject matter expert, often another member of your team. Often, this is part of a code review itself.

    +
  • +
  • +

    An audience review, for clarity.  This is usually someone unfamiliar with the domain. This might be someone new to your team or a customer of your API.

    +
  • +
  • +

    A writing review, for consistency.  This is often a technical writer or volunteer.

    +
  • +
+ +

Of course, some of these lines are sometimes blurred, but if your document is high profile or might end up being externally published, you probably want to ensure that it receives more types of reviews. (We’ve used a similar review process for this book.) Any document tends to benefit from the aforementioned reviews, even if some of those reviews are ad hoc. That said, even getting one reviewer to review your text is preferable to having no one review it.

+ +

Importantly, if documentation is tied into the engineering workflow, it will often improve over time. Most documents at Google now implicitly go through an audience review because at some point, their audience will be using them, and hopefully letting you know when they aren’t working (via bugs or other forms of feedback).

+ + +
+ +
+

Documentation Philosophy

+ +

Caveat: the following section is more of a treatise on technical writing  best practices (and personal opinion) than of “how Google does it.†Consider it optional for software engineers to fully grasp, though understanding these concepts will likely allow you to more easily write technical information.

+ +
+

WHO, WHAT, WHEN, WHERE, and WHY

+ +

Most technical documentation answers a “HOW†question.  How does this work? How do I program to this API? How do I set up this server? As a result, there’s a tendency for software engineers to jump straight into the “HOW†on any given document and ignore the other questions associated with it: the WHO, WHAT, WHEN, WHERE, and WHY.  It’s true that none of those are generally as important as the HOW—a design document is an exception because an equivalent aspect is often the WHY—but without a proper framing of technical documentation, documents end up confusing. Try to address the other questions in the first two paragraphs of any document:

+ +
    +
  • +

    WHO was discussed previously: that’s the audience. But sometimes you also need to explicitly call out and address the audience in a document. Example: “This document is for new engineers on the Secret Wizard project.â€

    +
  • +
  • +

    WHAT identifies the purpose of this document: “This document is a tutorial designed to start a Frobber server in a test environment.†Sometimes, merely writing the WHAT helps you frame the document appropriately. If you start adding information that isn’t applicable to the WHAT, you might want to move that information into a separate document.

    +
  • +
  • +

    WHEN identifies when this document was created, reviewed, or updated. Documents in source code have this date noted implicitly, and some other publishing schemes automate this as well. But, if not, make sure to note the date on which the document was written (or last revised) on the document itself.

    +
  • +
  • +

    WHERE is often implicit as well, but decide where the document should live. Usually, the preference should be under some sort of version control, ideally with the source code it documents. But other formats work for different purposes as well. At Google, we often use Google Docs for easy collaboration, particularly on design issues. At some point, however, any shared document becomes less of a discussion and more of a stable historical record. At that point, move it to someplace more permanent, with clear ownership, version control, and responsibility.

    +
  • +
  • +

    WHY sets up the purpose for the document. Summarize what you expect someone to take away from the document after reading it. A good rule of thumb is to establish the WHY in the introduction to a document. When you write the summary, verify whether you’ve met your original expectations (and revise accordingly).

    +
  • +
+
+ +
+

The Beginning, Middle, and End

+ +

All documents—indeed, all parts of documents—have a beginning, middle, and end.  Although it sounds amazingly  silly, most documents should often have, at a minimum, those three sections. A document with only one section has only one thing to say, and very few documents have only one thing to say. Don’t be afraid to add sections to your document; they break up the flow into logical pieces and provide readers with a roadmap of what the document covers.

+ +

Even the simplest document usually has more than one thing to say. Our popular “C++ Tips of the Week†have traditionally been very short, focusing on one small piece of advice. However, even here, having sections helps. Traditionally, the first section denotes the problem, the middle section goes through the recommended solutions, and the conclusion summarizes the takeaways. Had the document consisted of only one section, some readers would doubtless have difficulty teasing out the important points.

+ +

Most engineers loathe redundancy, and with good reason.  But in documentation, redundancy is often useful. An important point buried within a wall of text can be difficult to remember or tease out. On the other hand, placing that point at a more prominent location early can lose context provided later on. Usually, the solution is to introduce and summarize the point within an introductory paragraph, and then use the rest of the section to make your case in a more detailed fashion. In this case, redundancy helps the reader understand the importance of what is being stated.

+
+ +
+

The Parameters of Good Documentation

+ +

There are usually three aspects of good  documentation: completeness, accuracy, and clarity.  You rarely get all three within the same document; as you try to make a document more “complete,†for example, clarity can begin to suffer. If you try to document every possible use case of an API, you might end up with an incomprehensible mess.  For programming languages, being completely accurate in all cases (and documenting all possible side effects) can also affect clarity. For other documents, trying to be clear about a complicated topic can subtly affect the accuracy of the document; you might decide to ignore some rare side effects in a conceptual document, for example, because the point of the document is to familiarize someone with the usage of an API, not provide a dogmatic overview of all intended behavior.

+ +

In each case, a “good document†is defined as the document that is doing its intended job. As a result, you rarely want a document doing more than one job. For each document (and for each document type), decide on its focus and adjust the writing appropriately. Writing a conceptual document? You probably don’t need to cover every part of the API. Writing a reference? You probably want this complete, but perhaps must sacrifice some clarity. Writing a landing page? Focus on organization and keep discussion to a minimum. All of this adds up to quality, which, admittedly, is stubbornly difficult to accurately measure.

+ +

How can you quickly improve the quality of a document? Focus on the needs of the audience. Often, less is more. For example, one mistake engineers often make is adding design decisions or implementation details to an API document. Much like you should ideally separate the interface from an implementation within a well-designed API, you should avoid discussing design decisions in an API document. Users don’t need to know this information. Instead, put those decisions in a specialized document for that purpose (usually a design doc).

+
+ +
+

Deprecating Documents

+ +

Just like old code can cause problems, so can old documents.   Over time, documents become stale, obsolete, or (often) abandoned. Try as much as possible to avoid abandoned documents, but when a document no longer serves any purpose, either remove it or identify it as obsolete (and, if available, indicate where to go for new information). Even for unowned documents, someone adding a note that “This no longer works!†is more helpful than saying nothing and leaving something that seems authoritative but no longer works.

+ +

At Google, we often attach “freshness dates†to documentation. Such documents note the last time a document was reviewed, and metadata in the documentation set will send email reminders when the document hasn’t been touched in, for example, three months. Such freshness dates, as shown in the following example—and tracking your documents as bugs—can help make a documentation set easier to maintain over time, which is the main concern for a document:

+ +
+
<!--*
+# Document freshness: For more information, see go/fresh-source.
+freshness: { owner: `username` reviewed: '2019-02-27' }
+*-->
+
+ +

Users who own such a document have an incentive to keep that freshness date current (and if the document is under source control, that requires a code review). As a result, it’s a low-cost means to ensure that a document is looked over from time to time. At Google, we found that including the owner of a document in this freshness date within the document itself with a byline of “Last reviewed by...†led to increased adoption as well. 

+
+
+ +
+

When Do You Need Technical Writers?

+ +

When  Google was young and growing, there weren’t enough technical writers in software engineering. (That’s still the case.) Those projects deemed important tended to receive a technical writer, regardless of whether that team really needed one.  The idea was that the writer could relieve the team of some of the burden of writing and maintaining documents and (theoretically) allow the important project to achieve greater velocity. This turned out to be a bad assumption.

+ +

We learned that most engineering teams can write documentation for themselves (their team) perfectly fine; it’s only when they are writing documents for another audience that they tend to need help because it’s difficult to write to another audience. The feedback loop within your team regarding documents is more immediate, the domain knowledge and assumptions are clearer, and the perceived needs are more obvious. Of course, a technical writer can often do a better job with grammar and organization, but supporting a single team isn’t the best use of a limited and specialized resource; it doesn’t scale. It introduced a perverse incentive: become an important project and your software engineers won’t need to write documents. Discouraging engineers from writing documents turns out to be the opposite of what you want to do.

+ +

Because they are a limited resource, technical writers should generally focus on tasks that software engineers don’t need to do as part of their normal duties. Usually, this involves writing documents that cross API boundaries. Project Foo might clearly know what documentation Project Foo needs, but it probably has a less clear idea what Project Bar needs. A technical writer is better able to stand in as a person unfamiliar with the domain. In fact, it’s one of their critical roles: to challenge the assumptions your team makes about the utility of your project. It’s one of the reasons why many, if not most, software engineering technical writers tend to focus on this specific type of API documentation.

+
+ +
+

Conclusion

+ +

Google has made good strides in addressing documentation quality over the past decade, but to be frank, documentation at Google is not yet a first-class citizen. For comparison, engineers have gradually accepted that testing is necessary for any code change, no matter how small. As well, testing tooling is robust, varied and plugged into an engineering workflow at various points. Documentation is not ingrained at nearly the same level.

+ +

To be fair, there’s not necessarily the same need to address documentation as with testing. Tests can be made atomic (unit tests) and can follow prescribed form and function. Documents, for the most part, cannot. Tests can be automated, and schemes to automate documentation are often lacking. Documents are necessarily subjective; the quality of the document is measured not by the writer, but by the reader, and often quite asynchronously. That said, there is a recognition that documentation is important, and processes around document development are improving. In this author’s opinion, the quality of documentation at Google is better than in most software engineering shops.

+ +

To change the quality of engineering documentation, engineers—and the entire engineering organization—need to accept that they are both the problem and the solution. Rather than throw up their hands at the state of documentation, they need to realize that producing quality documentation is part of their job and saves them time and effort in the long run. For any piece of code that you expect to live more than a few months, the extra cycles you put in documenting that code will not only help others, it will help you maintain that code as well.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Documentation is hugely important over time and scale.

    +
  • +
  • +

    Documentation changes should leverage the existing developer workflow.

    +
  • +
  • +

    Keep documents focused on one purpose.

    +
  • +
  • +

    Write for your audience, not yourself. 

    +
  • +
+
+

1OK, you will need to maintain it and revise it occasionally.

2English is still the primary language for most programmers, and most technical documentation for programmers relies on an understanding of English.

3When we deprecated GooWiki, we found that around 90% of the documents had no views or updates in the previous few months.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch11.html b/clones/abseil.io/resources/swe-book/html/ch11.html new file mode 100644 index 00000000..7f933235 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch11.html @@ -0,0 +1,434 @@ + + + + + Software Engineering at Google + + + + +
+

Testing Overview

+ + + + + +

Testing has always been a part of programming.  In fact, the first time you wrote a computer program you almost certainly threw some sample data at it to see whether it performed as you expected. For a long time, the state of the art in software testing resembled a very similar process, largely manual and error prone. However, since the early 2000s, the software industry’s approach to testing has evolved dramatically to cope with the size and complexity of modern software systems. Central to that evolution has been the practice of developer-driven, automated testing.

+ +

Automated testing can prevent bugs from escaping into the wild and affecting your users.  The later in the development cycle a bug is caught, the more expensive it is; exponentially so in many cases.1 However, “catching bugs†is only part of the motivation. An equally important reason why you want to test your software is to support the ability to change. Whether you’re adding new features, doing a refactoring focused on code health, or undertaking a larger redesign, automated testing can quickly catch mistakes, and this makes it possible to change software with confidence.

+ +

Companies that can iterate faster can adapt more rapidly to changing technologies, market conditions, and customer tastes. If you have a robust testing practice, you needn’t fear change—you can embrace it as an essential quality of developing software. The more and faster you want to change your systems, the more you need a fast way to test them.

+ +

The act of writing tests also improves the design of your systems. As the first clients of your code, a test can tell you much about your design choices. Is your system too tightly coupled to a database? Does the API support the required use cases? Does your system handle all of the edge cases? Writing automated tests forces you to confront these issues early on in the development cycle. Doing so generally leads to more modular software that enables greater flexibility later on.

+ +

Much ink has been spilled about the subject of testing software, and for good reason: for such an important practice, doing it well still seems to be a mysterious craft to many. At Google, while we have come a long way, we still face difficult problems getting our processes to scale reliably across the company. In this chapter, we’ll share what we have learned to help further the conversation.

+ +
+

Why Do We Write Tests?

+ +

To better understand how to get the most out of testing, let’s start from the beginning.  When we talk about automated testing, what are we really talking about?

+ +

The simplest test is defined by:

+ +
    +
  • +

    A single behavior you are testing, usually a method or API that you are calling

    +
  • +
  • +

    A specific input, some value that you pass to the API

    +
  • +
  • +

    An observable output or behavior

    +
  • +
  • +

    A controlled environment such as a single isolated process

    +
  • +
+ +

When you execute a test like this, passing the input to the system and verifying the output, you will learn whether the system behaves as you expect. Taken in aggregate, hundreds or thousands of simple tests (usually called a test suite) can tell you how well your entire product conforms to its intended design and, more important, when it doesn’t. 

+ +

Creating and maintaining a healthy test suite takes real effort. As a codebase grows, so too will the test suite. It will begin to face challenges like instability and slowness. A failure to address these problems will cripple a test suite. Keep in mind that tests derive their value from the trust engineers place in them. If testing becomes a productivity sink, constantly inducing toil and uncertainty, engineers will lose trust and begin to find workarounds. A bad test suite can be worse than no test suite at all.

+ +

In addition to empowering companies to build great products quickly, testing is becoming critical to ensuring the safety of important products and services in our lives. Software is more involved in our lives than ever before, and defects can cause more than a little annoyance: they can cost massive amounts of money, loss of property, or, worst of all, loss of life.2

+ +

At Google, we have determined that testing cannot be an afterthought. Focusing on quality and testing is part of how we do our jobs. We have learned, sometimes painfully, that failing to build quality into our products and services inevitably leads to bad outcomes. As a result, we have built testing into the heart of our engineering culture.

+ +
+

The Story of Google Web Server

+ +

In Google’s early days, engineer-driven testing was often assumed to be of little importance.  Teams regularly relied on smart people to get the software right. A few systems ran large integration tests, but mostly it was the Wild West.  One product in particular seemed to suffer the worst: it was called the Google Web Server, also known as GWS.

+ +

GWS is the web server responsible for serving Google Search queries and is as important to Google Search as air traffic control is to an airport. Back in 2005, as the project swelled in size and complexity, productivity had slowed dramatically. Releases were becoming buggier, and it was taking longer and longer to push them out. Team members had little confidence when making changes to the service, and often found out something was wrong only when features stopped working in production. (At one point, more than 80% of production pushes contained user-affecting bugs that had to be rolled back.)

+ +

To address these problems, the tech lead (TL) of GWS decided to institute a policy of engineer-driven, automated testing. As part of this policy, all new code changes were required to include tests, and those tests would be run continuously. Within a year of instituting this policy, the number of emergency pushes dropped by half. This drop occurred despite the fact that the project was seeing a record number of new changes every quarter. Even in the face of unprecedented growth and change, testing brought renewed productivity and confidence to one of the most critical projects at Google. Today, GWS has tens of thousands of tests, and releases almost every day with relatively few customer-visible failures.

+ +

The changes in GWS marked a watershed for testing culture at Google as teams in other parts of the company saw the benefits of testing and moved to adopt similar tactics.

+ +

One of the key insights the GWS experience taught us was that you can’t rely on programmer ability alone to avoid product defects.  Even if each engineer writes only the occasional bug, after you have enough people working on the same project, you will be swamped by the ever-growing list of defects. Imagine a hypothetical 100-person team whose engineers are so good that they each write only a single bug a month. Collectively, this group of amazing engineers still produces five new bugs every workday. Worse yet, in a complex system, fixing one bug can often cause another, as engineers adapt to known bugs and code around them.

+ +

The best teams find ways to turn the collective wisdom of its members into a benefit for the entire team. That is exactly what automated testing does. After an engineer on the team writes a test, it is added to the pool of common resources available to others. Everyone else on the team can now run the test and will benefit when it detects an issue.  Contrast this with an approach based on debugging, wherein each time a bug occurs, an engineer must pay the cost of digging into it with a debugger. The cost in engineering resources is night and day and was the fundamental reason GWS was able to turn its fortunes around.

+
+ +
+

Testing at the Speed of Modern Development

+ +

Software systems are growing larger and ever more complex.  A typical application or service at Google is made up of thousands or millions of lines of code. It uses hundreds of libraries or frameworks and must be delivered via unreliable networks to an increasing number of platforms running with an uncountable number of configurations. To make matters worse, new versions are pushed to users frequently, sometimes multiple times each day. This is a far cry from the world of shrink-wrapped software that saw updates only once or twice a year.

+ +

The ability for humans to manually validate every behavior in a system has been unable to keep pace with the explosion of features and platforms in most software. Imagine what it would take to manually test all of the functionality of  Google Search, like finding flights, movie times, relevant images, and of course web search results (see Figure 11-1). Even if you can determine how to solve that problem, you then need to multiply that workload by every language, country, and device Google Search must support, and don’t forget to check for things like accessibility and security. Attempting to assess product quality by asking humans to manually interact with every feature just doesn’t scale. When it comes to testing, there is one clear answer: automation.

+ +
Screenshots of two complex Google search results +
Figure 11-1. Screenshots of two complex Google search results
+
+
+ +
+

Write, Run, React

+ +

In its purest form, automating  testing consists of three activities: writing tests, running tests, and reacting to test failures. An automated test is a small bit of code, usually a single function or method, that calls into an isolated part of a larger system that you want to test. The test code sets up an expected environment, calls into the system, usually with a known input, and verifies the result. Some of the tests are very small, exercising a single code path; others are much larger and can involve entire systems, like a mobile operating system or web browser.

+ +

An example test presents a deliberately simple test in Java using no frameworks or testing libraries. This is not how you would write an entire test suite, but at its core every automated test looks similar to this very simple example.

+ +
+
Example 11-1. An example test
+ +
// Verifies a Calculator class can handle negative results.
+public void main(String[] args) {
+   Calculator calculator = new Calculator();
+   int expectedResult = -3;
+   int actualResult = calculator.subtract(2, 5); // Given 2, Subtracts 5.
+   assert(expectedResult == actualResult);
+}
+
+
+ +

Unlike the QA processes of yore, in which rooms of dedicated software testers pored over new versions of a system, exercising every possible behavior, the engineers who build systems today play an active and integral role in writing and running automated tests for their own code. Even in companies where QA is a prominent organization, developer-written tests are commonplace. At the speed and scale that today’s systems are being developed, the only way to keep up is by sharing the development of tests around the entire engineering staff.

+ +

Of course, writing tests is different from writing good tests. It can be quite difficult to train tens of thousands of engineers to write good tests. We will discuss what we have learned about writing good tests in the chapters that follow.

+ +

Writing tests is only the first step in the process of automated testing. After you have written tests, you need to run them. Frequently. At its core, automated testing consists of repeating the same action over and over, only requiring human attention when something breaks. We will discuss this Continuous Integration (CI) and testing in Continuous Integration. By expressing  tests as code instead of a manual series of steps, we can run them every time the code changes—easily thousands of times per day. Unlike human testers, machines never grow tired or bored.

+ +

Another benefit of having tests expressed as code is that it is easy to modularize them for execution in various environments. Testing the behavior of Gmail in Firefox requires no more effort than doing so in Chrome, provided you have configurations for both of these systems.3 Running tests for a user interface (UI) in Japanese or German can be done using the same test code as for English.

+ +

Products and services under active development will inevitably experience test failures.  What really makes a testing process effective is how it addresses test failures. Allowing failing tests to pile up quickly defeats any value they were providing, so it is imperative not to let that happen. Teams that prioritize fixing a broken test within minutes of a failure are able to keep confidence high and failure isolation fast, and therefore derive more value out of their tests. 

+ +

In summary, a healthy automated testing culture encourages everyone to share the work of writing tests. Such a culture also ensures that tests are run regularly. Last, and perhaps most important, it places an emphasis on fixing broken tests quickly so as to maintain high confidence in the process. 

+
+ +
+

Benefits of Testing Code

+ +

To developers coming  from organizations that  don’t have a strong testing culture, the idea of writing tests as a means of improving productivity and velocity might seem antithetical. After all, the act of writing tests can take just as long (if not longer!) than implementing a feature would take in the first place. On the contrary, at Google, we’ve found that investing in software tests provides several key benefits to developer productivity:

+ +
+
Less debugging
+
As you would expect, tested code has fewer defects when it is submitted. Critically, it also has fewer defects throughout its existence; most of them will be caught before the code is submitted. A piece of code at Google is expected to be modified dozens of times in its lifetime. It will be changed by other teams and even automated code maintenance systems. A test written once continues to pay dividends and prevent costly defects and annoying debugging sessions through the lifetime of the project. Changes to a project, or the dependencies of a project, that break a test can be quickly detected by test infrastructure and rolled back before the problem is ever released to production.
+
Increased confidence in changes
+
All software changes. Teams with good tests can review and accept changes to their project with confidence because all important behaviors of their project are continuously verified. Such projects encourage refactoring. Changes that refactor code while preserving existing behavior should (ideally) require no changes to existing tests.
+
Improved documentation
+
Software documentation is notoriously unreliable. From outdated requirements to missing edge cases, it is common for documentation to have a tenuous relationship to the code. Clear, focused tests that exercise one behavior at a time function as executable documentation. If you want to know what the code does in a particular case, look at the test for that case. Even better, when requirements change and new code breaks an existing test, we get a clear signal that the “documentation†is now out of date. Note that tests work best as documentation only if care is taken to keep them clear and concise.
+
Simpler reviews
+
All code at Google is reviewed by at least one other engineer before it can be submitted (see Code Review for more details). A code reviewer spends less effort verifying code works as expected if the code review includes thorough tests that demonstrate code correctness, edge cases, and error conditions. Instead of the tedious effort needed to mentally walk each case through the code, the reviewer can verify that each case has a passing test.
+
Thoughtful design
+
Writing tests for new code is a practical means of exercising the API design of the code itself. If new code is difficult to test, it is often because the code being tested has too many responsibilities or difficult-to-manage dependencies. Well-designed code should be modular, avoiding tight coupling and focusing on specific responsibilities. Fixing design issues early often means less rework later.
+
Fast, high-quality releases
+
With a healthy automated test suite, teams can release new versions of their application with confidence. Many projects at Google release a new version to production every day—even large projects with hundreds of engineers and thousands of code changes submitted every day. This would not be possible  without  automated testing. 
+
+
+
+ +
+

Designing a Test Suite

+ +

Today, Google operates at a massive scale, but we  haven’t always been so large, and the foundations of our approach were laid long ago. Over the years, as our codebase has grown, we have learned a lot about how to approach the design and execution of a test suite, often by making mistakes and cleaning up afterward.

+ +

One of the lessons we learned fairly early on is that engineers favored writing larger, system-scale tests, but that these tests were slower, less reliable, and more difficult to debug than smaller tests. Engineers, fed up with debugging the system-scale tests, asked themselves, “Why can’t we just test one server at a time?†or, “Why do we need to test a whole server at once? We could test smaller modules individually.†Eventually, the desire to reduce pain led teams to develop smaller and smaller tests, which turned out to be faster, more stable, and generally less painful.

+ +

This led to a lot of discussion around the company about the exact meaning of “small.†Does small mean unit test? What about integration tests, what size are those? We have come to the conclusion that there are two distinct dimensions for every test case: size and scope. Size refers to the resources that are required to run a test case: things like memory, processes, and time. Scope refers to the specific code paths we are verifying. Note that executing a line of code is different from verifying that it worked as expected. Size and scope are interrelated but distinct concepts.

+ +
+

Test Size

+ +

At Google, we classify every one of our tests into a size  and encourage engineers to always write  the smallest possible test for a given piece of functionality. A test’s size is determined not by its number of lines of code, but by how it runs, what it is allowed to do, and how many resources it consumes. In fact, in some cases, our definitions of small, medium, and large are actually encoded as constraints the testing infrastructure can enforce on a test. We go into the details in a moment, but in brief, small tests run in a single process, medium tests run on a single machine, and large tests run wherever they want, as demonstrated in Figure 11-2.4

+ +
Test sizes +
Figure 11-2. Test sizes
+
+ +

We make this distinction, as opposed to the more traditional “unit†or “integration,†because the most important qualities we want from our test suite are speed and determinism, regardless of the scope of the test. Small tests, regardless of the scope, are almost always faster and more deterministic than tests that involve more infrastructure or consume more resources. Placing restrictions on small tests makes speed and determinism much easier to achieve. As test sizes grow, many of the restrictions are relaxed. Medium tests have more flexibility but also more risk of nondeterminism. Larger tests are saved for only the most complex and difficult testing scenarios. Let’s take a closer look at the exact constraints imposed on each type of test.

+ +
+

Small tests

+ +

Small tests are the most constrained of the three test sizes.   The primary constraint is that small tests must run in a single process. In many languages, we restrict this even further to say that they must run on a single thread. This means that the code performing the test must run in the same process as the code being tested. You can’t run a server and have a separate test process connect to it. It also means that you can’t run a third-party program such as a database as part of your test.

+ +

The other important constraints on small tests are that they aren’t allowed to sleep, perform I/O operations,5 or make any other blocking calls. This means that small tests aren’t allowed to access the network or disk. Testing code that relies on these sorts of operations requires the use of test doubles (see Test Doubles) to replace the heavyweight dependency with a lightweight, in-process dependency.

+ +

The purpose of these restrictions is to ensure that small tests don’t have access to the main sources of test slowness or nondeterminism. A test that runs on a single process and never makes blocking calls can effectively run as fast as the CPU can handle. It’s difficult (but certainly not impossible) to accidentally make such a test slow or nondeterministic. The constraints on small tests provide a sandbox that prevents engineers from shooting themselves in the foot.

+ +

These restrictions might seem excessive at first, but consider a modest suite of a couple hundred small test cases running throughout the day.  If even a few of them fail nondeterministically (often called flaky tests), tracking down the cause becomes a serious drain on productivity.  At Google’s scale, such a problem could grind our testing infrastructure to a halt.

+ +

At Google, we encourage engineers to try to write small tests whenever possible, regardless of the scope of the test, because it keeps the entire test suite running fast and reliably. For more discussion on small versus unit tests, see Unit Testing.

+
+ +
+

Medium tests

+ +

The constraints placed on small tests can be too restrictive for many interesting kinds of tests.   The next rung up the ladder of test sizes is the medium test. Medium tests can span multiple processes, use threads, and can make blocking calls, including network calls, to localhost. The only remaining restriction is that medium tests aren’t allowed to make network calls to any system other than localhost. In other words, the test must be contained within a single machine.

+ +

The ability to run multiple processes opens up a lot of possibilities. For example, you could run a database instance to validate that the code you’re testing integrates correctly in a more realistic setting. Or you could test a combination of web UI and server code. Tests of web applications often involve tools like WebDriver that start a real browser and control it remotely via the test process.

+ +

Unfortunately, with increased flexibility comes increased potential for tests to become slow and nondeterministic. Tests that span processes or are allowed to make blocking calls are dependent on the operating system and third-party processes to be fast and deterministic, which isn’t something we can guarantee in general. Medium tests still provide a bit of protection by preventing access to remote machines via the network, which is far and away the biggest source of slowness and nondeterminism in most systems. Still, when writing medium tests, the "safety" is off, and engineers need to be much more careful.

+
+ +
+

Large tests

+ +

Finally, we have  large tests.  Large tests remove the localhost restriction imposed on medium tests, allowing the test and the system being tested to span across multiple machines. For example, the test might run against a system in a remote cluster.

+ +

As before, increased flexibility comes with increased risk. Having to deal with a system that spans multiple machines and the network connecting them increases the chance of slowness and nondeterminism significantly compared to running on a single machine. We mostly reserve large tests for full-system end-to-end tests that are more about validating configuration than pieces of code, and for tests of legacy components for which it is impossible to use test doubles. We’ll talk more about use cases for large tests in Larger Testing. Teams at Google will frequently isolate their large tests from their small or medium tests, running them only during the build and release process so as not to impact developer workflow.

+ + +
+ +
+

Properties common to all test sizes

+ +

All tests should strive to be hermetic: a test should contain all of the information necessary to set up, execute, and tear down its environment.  Tests should assume as little as possible about the outside environment, such as the order in which the tests are run. For example, they should not rely on a shared database. This constraint becomes more challenging with larger tests, but effort should still be made to ensure isolation.

+ +

A test should contain only the information required to exercise the behavior in question. Keeping tests clear and simple aids reviewers in verifying that the code does what it says it does.  Clear code also aids in diagnosing failure when they fail. We like to say that “a test should be obvious upon inspection.†Because there are no tests for the tests themselves, they require manual review as an important check on correctness. As a corollary to this, we also strongly discourage the use of control flow statements like conditionals and loops in a test. More complex test flows risk containing bugs themselves and make it more difficult to determine the cause of a test failure.

+ +

Remember that tests are often revisited only when something breaks. When you are called to fix a broken test that you have never seen before, you will be thankful someone took the time to make it easy to understand. Code is read far more than it is written, so make sure you write the test you’d like to read!

+ +
+

Test sizes in practice

+ +

Having precise definitions of test sizes has allowed us to create tools to enforce them.  Enforcement enables us to scale our test suites and still make certain guarantees about speed, resource utilization, and stability. The extent to which these definitions are enforced at Google varies by language. For example, we run all Java tests using a custom security manager that will cause all tests tagged as small to fail if they attempt to do something prohibited, such as establish a network connection.

+
+
+
+ +
+

Test Scope

+ +

Though we at Google put a lot of emphasis on test size, another important property to consider is test scope.   Test scope refers to how much code is being validated by a given test. Narrow-scoped tests (commonly called unit tests) are designed to validate the logic in a small, focused part of the codebase, like an individual class or method.  Medium-scoped tests (commonly called integration tests) are designed to verify interactions between a small number of components; for example, between a server and its database.  Large-scoped tests (commonly referred to by names like functional tests, end-to-end tests, or system tests) are designed to validate the interaction of several distinct parts of the system, or emergent behaviors that aren’t expressed in a single class or method.   

+ +

It’s important to note that when we talk about unit tests as being narrowly scoped, we’re referring to the code that is being validated, not the code that is being executed. It’s  quite common for a class to have many dependencies or other classes it refers to, and these dependencies will naturally be invoked while testing the target class. Though some other testing strategies make heavy use  of test doubles (fakes or mocks) to avoid executing code outside of the system under test, at Google, we prefer to keep the real dependencies in place when it is feasible to do so. Test Doubles discusses this issue in more detail.

+ +

Narrow-scoped tests tend to be small, and broad-scoped tests tend to be medium or large, but this isn’t always the case. For example, it’s possible to write a broad-scoped test of a server endpoint that covers all of its normal parsing, request validation, and business logic, which is nevertheless small because it uses doubles to stand in for all out-of-process dependencies like a database or filesystem. Similarly, it’s possible to write a narrow-scoped test of a single method that must be medium sized. For example, modern web frameworks often bundle HTML and JavaScript together, and testing a UI component like a date picker often requires running an entire browser, even to validate a single code path.

+ +

Just as we encourage tests of smaller size, at Google, we also encourage engineers to write tests of narrower scope.  As a very rough guideline, we tend to aim to have a mix of around 80% of our tests being narrow-scoped unit tests that validate the majority of our business logic; 15% medium-scoped integration tests that validate the interactions between two or more components; and 5% end-to-end tests that validate the entire system. Figure 11-3 depicts how we can visualize this as a pyramid.

+ +
Google’s version of Mike Cohn’s test pyramid; percentages are by test case count, and every team’s mix will be a little different +
Figure 11-3. Google’s version of Mike Cohn’s test pyramid;6 percentages are by test case count, and every team’s mix will be a little different
+
+ +

Unit tests form an excellent base because they are fast, stable, and dramatically narrow the scope and reduce the cognitive load required to identify all the possible behaviors a class or function has.   Additionally, they make failure diagnosis quick and painless.  Two antipatterns to be aware of are the "ice cream cone" and the "hourglass," as illustrated in Figure 11-4.

+ +

With the ice cream cone, engineers write many end-to-end tests but few integration or unit tests. Such suites tend to be slow, unreliable, and difficult to work with. This pattern often appears in projects that start as prototypes and are quickly rushed to production, never stopping to address testing debt.

+ +

The hourglass involves many end-to-end tests and many unit tests but few integration tests. It isn’t quite as bad as the ice cream cone, but it still results in many end-to-end test failures that could have been caught quicker and more easily with a suite of medium-scope tests. The hourglass pattern occurs when tight coupling makes it difficult to instantiate individual dependencies in isolation.

+ +
Test suite antipatterns +
Figure 11-4. Test suite antipatterns
+
+ +

Our recommended mix of tests is determined by our two primary goals: engineering productivity and product confidence. Favoring unit tests gives us high confidence quickly, and early in the development process. Larger tests act as sanity checks as the product develops; they should not be viewed as a primary method for catching bugs.

+ +

When considering your own mix, you might want a different balance. If you emphasize integration testing, you might discover that your test suites take longer to run but catch more issues between components. When you emphasize unit tests, your test suites can complete very quickly, and you will catch many common logic bugs. But, unit tests cannot verify the interactions between components, like a contract between two systems developed by different teams. A good test suite contains a blend of different test sizes and scopes that are appropriate to the local architectural and organizational realities.  

+
+ +
+

The Beyoncé Rule

+ +

We are often asked, when coaching new hires, which behaviors or properties actually need to be tested?   The straightforward answer is: test everything that you don’t want to break. In other words, if you want to be confident that a system exhibits a particular behavior, the only way to be sure it will is to write an automated test for it. This includes all of the usual suspects like testing performance, behavioral correctness, accessibility, and security. It also includes less obvious properties like testing how a system handles failure.

+ +

We have a name for this general philosophy: we call it the Beyoncé Rule. Succinctly, it can be stated as follows: “If you liked it, then you shoulda put a test on it.†The Beyoncé Rule is often invoked by infrastructure teams that are responsible for making changes across the entire codebase. If unrelated infrastructure changes pass all of your tests but still break your team’s product, you are on the hook for fixing it and adding the additional tests.

+ + +
+ +
+

A Note on Code Coverage

+ +

Code coverage is a measure of which lines of feature code are exercised by which tests.   If you have 100 lines of code and your tests execute 90 of them, you have 90% code coverage.7 Code coverage is often held up as the gold standard metric for understanding test quality, and that is somewhat unfortunate. It is possible to exercise a lot of lines of code with a few tests, never checking that each line is doing anything useful. That’s because code coverage only measures that a line was invoked, not what happened as a result. (We recommend only measuring coverage from small tests to avoid coverage inflation that occurs when executing larger tests.)

+ +

An even more insidious problem with code coverage is that, like other metrics, it quickly becomes a goal unto itself. It is common for teams to establish a bar for expected code coverage—for instance, 80%. At first, that sounds eminently reasonable; surely you want to have at least that much coverage. In practice, what happens is that instead of treating 80% like a floor, engineers treat it like a ceiling. Soon, changes begin landing with no more than 80% coverage. After all, why do more work than the metric requires?

+ +

A better way to approach the quality of your test suite is to think about the behaviors that are tested. Do you have confidence that everything your customers expect to work will work? Do you feel confident you can catch breaking changes in your dependencies? Are your tests stable and reliable? Questions like these are a more holistic way to think about a test suite. Every product and team is going to be different; some will have difficult-to-test interactions with hardware, some involve massive datasets. Trying to answer the question “do we have enough tests?†with a single number ignores a lot of context and is unlikely to be useful. Code coverage can provide some insight into untested code, but it is not a substitute for thinking critically about how well your system is tested. 

+
+
+ +
+

Testing at Google Scale

+ +

Much of the guidance  to this point can be applied to codebases of almost any size. However, we should spend some time on what we have learned testing at our very large scale. To understand how testing works at Google, you need an understanding of our development environment, the most important fact about which is that most of Google’s code is kept in a single, monolithic repository (monorepo). Almost every line of code for every product and service we operate is all stored in one place. We have more than two billion lines of code in the repository today.

+ +

Google’s codebase experiences close to 25 million lines of change every week. Roughly half of them are made by the tens of thousands of engineers working in our monorepo, and the other half by our automated systems, in the form of configuration updates or large-scale changes (Large-Scale Changes). Many of those changes are initiated from outside the immediate project. We don’t place many limitations on the ability of engineers to reuse code.

+ +

The openness of our codebase encourages a level of co-ownership that lets everyone take responsibility for the codebase. One benefit of such openness is the ability to directly fix bugs in a product or service you use (subject to approval, of course) instead of complaining about it. This also implies that many people will make changes in a part of the codebase owned by someone else.

+ +

Another thing that makes Google a little different is that almost no teams use repository branching.  All changes are committed to the repository head and are immediately visible for everyone to see. Furthermore, all software builds are performed using the last committed change that our testing infrastructure has validated.  When a product or service is built, almost every dependency required to run it is also built from source, also from the head of the repository.  Google manages testing at this scale by use of a CI system.  One of the key components of our CI system is our Test Automated Platform (TAP).

+ +
Note
+

For more information on TAP and our CI philosophy, see Continuous Integration.

+
+ +

Whether you are considering our size, our monorepo, or the number of products we offer, Google’s engineering environment is complex. Every week it experiences millions of changing lines, billions of test cases being run, tens of thousands of binaries being built, and hundreds of products being updated—talk about complicated!

+ +
+

The Pitfalls of a Large Test Suite

+ +

As a codebase grows, you will inevitably need  to make changes to existing code. When poorly written, automated tests can make it more difficult to make those changes.  Brittle tests—those that over-specify expected outcomes or rely on extensive and complicated boilerplate—can actually resist change. These poorly written tests can fail even when unrelated changes are made.

+ +

If you have ever made a five-line change to a feature only to find dozens of unrelated, broken tests, you have felt the friction of brittle tests. Over time, this friction can make a team reticent to perform necessary refactoring to keep a codebase healthy. The subsequent chapters will cover strategies that you can use to improve the robustness and quality of your tests.

+ +

Some of the worst offenders of brittle tests come from the misuse  of mock objects. Google’s codebase has suffered so badly from an abuse of mocking frameworks that it has led some engineers to declare “no more mocks!†Although that is a strong statement, understanding the limitations of mock objects can help you avoid misusing them.

+ +
Note
+

For more information on working effectively with mock objects, see Test Doubles.

+
+ +

In addition to the friction caused by brittle tests, a larger suite of tests will be slower to run. The slower a test suite, the less frequently it will be run, and the less benefit it provides. We use a number of techniques to speed up our test suite, including parallelizing execution and using faster hardware. However, these kinds of tricks are eventually swamped by a large number of individually slow test cases.

+ +

Tests can become slow for many reasons, like booting significant portions of a system, firing up an emulator before execution, processing large datasets, or waiting for disparate systems to synchronize. Tests often start fast enough but slow down as the system grows. For example, maybe you have an integration test exercising a single dependency that takes five seconds to respond, but over the years you grow to depend on a dozen services, and now the same tests take five minutes.

+ +

Tests can also become slow due to unnecessary speed limits introduced by functions like sleep() and setTimeout(). Calls to these functions are often used as naive heuristics before checking the result of nondeterministic behavior. Sleeping for half a second here or there doesn’t seem too dangerous at first; however, if a “wait-and-check†is embedded in a widely used utility, pretty soon you have added minutes of idle time to every run of your test suite. A better solution is to actively poll for a state transition with a frequency closer to microseconds. You can combine this with a timeout value in case a test fails to reach a stable state.

+ +

Failing to keep a test suite deterministic and fast ensures it will become roadblock to productivity. At Google, engineers who encounter these tests have found ways to work around slowdowns, with some going as far as to skip the tests entirely when submitting changes. Obviously, this is a risky practice and should be discouraged, but if a test suite is causing more harm than good, eventually engineers will find a way to get their job done, tests or no tests.

+ +

The secret to living with a large test suite is to treat it with respect. Incentivize engineers to care about their tests; reward them as much for having rock-solid tests as you would for having a great feature launch. Set appropriate performance goals and refactor slow or marginal tests. Basically, treat your tests like production code. When simple changes begin taking nontrivial time, spend effort making your tests less brittle.

+ +

In addition to developing the proper culture, invest in your testing infrastructure by developing linters, documentation, or other assistance that makes it more difficult to write bad tests. Reduce the number of frameworks and tools you need to support to increase the efficiency of the time you invest to improve things.8 If you don’t invest in making it easy to manage your tests, eventually engineers will decide it isn’t worth having them at all. 

+
+
+ +
+

History of Testing at Google

+ +

Now that we’ve discussed how Google approaches testing, it might be enlightening to learn how we got here.  As mentioned previously, Google’s engineers didn’t always embrace the value of automated testing. In fact, until 2005, testing was closer to a curiosity than a disciplined practice. Most of the testing was done manually, if it was done at all. However, from 2005 to 2006, a testing revolution occurred and changed the way we approach software engineering. Its effects continue to reverberate within the company to this day.

+ +

The experience of the GWS project, which we discussed at the opening of this chapter, acted as a catalyst. It made it clear how powerful automated testing could be. Following the improvements to GWS in 2005, the practices began spreading across the entire company. The tooling was primitive. However, the volunteers, who came to be known as the Testing Grouplet, didn’t let that slow them down.

+ +

Three key initiatives helped usher automated testing into the company’s consciousness: Orientation Classes, the Test Certified program, and Testing on the Toilet. Each one had influence in a completely different way, and together they reshaped Google’s engineering culture.

+ +
+

Orientation Classes

+ +

Even though much of the early  engineering staff at Google eschewed testing, the pioneers of automated testing at Google knew that at the rate the company was growing, new engineers would quickly outnumber existing team members. If they could reach all the new hires in the company, it could be an extremely effective avenue for introducing cultural change. Fortunately, there was, and still is, a single choke point that all new engineering hires pass through: orientation.

+ +

Most of Google’s early orientation program concerned things like medical benefits and how Google Search worked, but starting in 2005 it also began including an hour-long discussion of the value of automated testing.9 The class covered the various benefits of testing, such as increased productivity, better documentation, and support for refactoring. It also covered how to write a good test. For many Nooglers (new Googlers) at the time, such a class was their first exposure to this material. Most important, all of these ideas were presented as though they were standard practice at the company. The new hires had no idea that they were being used as trojan horses to sneak this idea into their unsuspecting teams.

+ +

As Nooglers joined their teams following orientation, they began writing tests and questioning those on the team who didn’t. Within only a year or two, the population of engineers who had been taught testing outnumbered the pretesting culture engineers. As a result, many new projects started off on the right foot.

+ +

Testing has now become more widely practiced in the industry, so most new hires arrive with the expectations of automated testing firmly in place. Nonetheless, orientation classes continue to set expectations about testing and connect what Nooglers know about testing outside of Google to the challenges of doing so in our very large and very complex codebase.

+
+ +
+

Test Certified

+ +

Initially, the larger and more complex parts of our codebase appeared resistant to good testing practices.  Some projects had such poor code quality that they were almost impossible to test. To give projects a clear path forward, the Testing Grouplet devised a certification program that they called Test Certified. Test Certified aimed to give teams a way to understand the maturity of their testing processes and, more critically, cookbook instructions on how to improve it.

+ +

The program was organized into five levels, and each level required some concrete actions to improve the test hygiene on the team. The levels were designed in such a way that each step up could be accomplished within a quarter, which made it a convenient fit for Google’s internal planning cadence.

+ +

Test Certified Level 1 covered the basics: set up a continuous build; start tracking code coverage; classify all your tests as small, medium, or large; identify (but don’t necessarily fix) flaky tests; and create a set of fast (not necessarily comprehensive) tests that can be run quickly. Each subsequent level added more challenges like “no releases with broken tests†or “remove all nondeterministic tests.†By Level 5, all tests were automated, fast tests were running before every commit, all nondeterminism had been removed, and every behavior was covered. An internal dashboard applied social pressure by showing the level of every team. It wasn’t long before teams were competing with one another to climb the ladder.

+ +

By the time the Test Certified program was replaced by an automated approach in 2015 (more on pH later), it had helped more than 1,500 projects improve their testing culture.

+
+ +
+

Testing on the Toilet

+ +

Of all the methods the Testing Grouplet used to try  to improve testing at Google, perhaps none was  more off-beat than Testing on the Toilet (TotT). The goal of TotT was fairly simple: actively raise awareness about testing across the entire company. The question is, what’s the best way to do that in a company with employees scattered around the world?

+ +

The Testing Grouplet considered the idea of a regular email newsletter, but given the heavy volume of email everyone deals with at Google, it was likely to become lost in the noise. After a little bit of brainstorming, someone proposed the idea of posting flyers in the restroom stalls as a joke. We quickly recognized the genius in it: the bathroom is one place that everyone must visit at least once each day, no matter what. Joke or not, the idea was cheap enough to implement that it had to be tried.

+ +

In April 2006, a short writeup covering how to improve testing in Python appeared in restroom stalls across Google. This first episode was posted by a small band of volunteers. To say the reaction was polarized is an understatement; some saw it as an invasion of personal space, and they objected strongly. Mailing lists lit up with complaints, but the TotT creators were content: the people complaining were still talking about testing.

+ +

Ultimately, the uproar subsided and TotT quickly became a staple of Google culture. To date, engineers from across the company have produced several hundred episodes, covering almost every aspect of testing imaginable (in addition to a variety of other technical topics). New episodes are eagerly anticipated and some engineers even volunteer to post the episodes around their own buildings. We intentionally limit each episode to exactly one page, challenging authors to focus on the most important and actionable advice. A good episode contains something an engineer can take back to the desk immediately and try.

+ +

Ironically for a publication that appears in one of the more private locations, TotT has had an outsized public impact. Most external visitors see an episode at some point in their visit, and such encounters often lead to funny conversations about how Googlers always seem to be thinking about code. Additionally, TotT episodes make great blog posts, something the original TotT authors recognized early on. They began publishing lightly edited versions publicly, helping to share our experience with the industry at large.

+ +

Despite starting as a joke, TotT has had the longest run and the most profound impact of any of the testing initiatives started by the Testing Grouplet.

+
+ +
+

Testing Culture Today

+ +

Testing culture at Google today has come a long way from 2005.   Nooglers still attend orientation classes on testing, and TotT continues to be distributed almost weekly. However, the expectations of testing have more deeply embedded themselves in the daily developer workflow.

+ +

Every code change at Google is required to go through code review. And every change is expected to include both the feature code and tests. Reviewers are expected to review the quality and correctness of both. In fact, it is perfectly reasonable to block a change if it is missing tests.

+ +

As a replacement for Test Certified, one of our engineering productivity teams recently launched a tool called Project Health (pH).  The pH tool continuously gathers dozens of metrics on the health of a project, including test coverage and test latency, and makes them available internally. pH is measured on a scale of one (worst) to five (best). A pH-1 project is seen as a problem for the team to address. Almost every team that runs a continuous build automatically gets a pH score.

+ +

Over time, testing has become an integral part of Google’s engineering culture. We have myriad ways to reinforce its value to engineers across the company. Through a combination of training, gentle nudges, mentorship, and, yes, even a little friendly competition, we have created the clear expectation that testing is everyone’s job.

+ +

Why didn’t we start by mandating the writing of tests?

+ +

The Testing Grouplet had considered asking for a testing mandate from senior leadership but quickly decided against it. Any mandate on how to develop code would be seriously counter to Google culture and likely slow the progress, independent of the idea being mandated. The belief was that successful ideas would spread, so the focus became demonstrating success.

+ +

If engineers were deciding to write tests on their own, it meant that they had fully accepted the idea and were likely to keep doing the right thing—even if no one was compelling them to. 

+
+
+ +
+

The Limits of Automated Testing

+ +

Automated testing  is not suitable for all testing tasks.  For example, testing the quality of search results often involves human judgment. We conduct targeted, internal studies using Search Quality Raters who execute real queries and record their impressions. Similarly, it is difficult to capture the nuances of audio and video quality in an automated test, so we often use human judgment to evaluate the performance of telephony or video-calling systems.

+ +

In addition to qualitative judgements, there are certain creative assessments at which humans excel. For example, searching for complex security vulnerabilities is something that humans do better than automated systems. After a human has discovered and understood a flaw, it can be added to an automated security testing system like Google’s Cloud Security Scanner where it can be run continuously and at scale.

+ +

A more  generalized term for this technique is Exploratory Testing. Exploratory Testing is a fundamentally creative endeavor in which someone treats the application under test as a puzzle to be broken, maybe by executing an unexpected set of steps or by inserting unexpected data. When conducting an exploratory test, the specific problems to be found are unknown at the start. They are gradually uncovered by probing commonly overlooked code paths or unusual responses from the application. As with the detection of security vulnerabilities, as soon as an exploratory test discovers an issue, an automated test should be added to prevent future regressions.

+ +

Using automated testing to cover well-understood behaviors enables the expensive and qualitative efforts of human testers to focus on the parts of your products for which they can provide the most value—and avoid boring them to tears in the process.

+
+ +
+

Conclusion

+ +

The adoption of developer-driven automated testing has been one of the most transformational software engineering practices at Google. It has enabled us to build larger systems with larger teams, faster than we ever thought possible. It has helped us keep up with the increasing pace of technological change. Over the past 15 years, we have successfully transformed our engineering culture to elevate testing into a cultural norm. Despite the company growing by a factor of almost 100 times since the journey began, our commitment to quality and testing is stronger today than it has ever been.

+ +

This chapter has been written to help orient you to how Google thinks about testing. In the next few chapters, we are going to dive even deeper into some key topics that have helped shape our understanding of what it means to write good, stable, and reliable tests. We will discuss the what, why, and how of unit tests, the most common kind of test at Google. We will wade into the debate on how to effectively use test doubles in tests through techniques such as faking, stubbing, and interaction testing. Finally, we will discuss the challenges with testing larger and more complex systems, like many of those we have at Google.

+ +

At the conclusion of these three chapters, you should have a much deeper and clearer picture of the testing strategies we use and, more important, why we use them.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Automated testing is foundational to enabling software to change.

    +
  • +
  • +

    For tests to scale, they must be automated.

    +
  • +
  • +

    A balanced test suite is necessary for maintaining healthy test coverage.

    +
  • +
  • +

    “If you liked it, you should have put a test on it.â€

    +
  • +
  • +

    Changing the testing culture in organizations  takes time.

    +
  • +
+
+

1See "Defect Prevention: Reducing Costs and Enhancing Quality."

2See "Failure at Dhahran."

3Getting the behavior right across different browsers and languages is a different story! But, ideally, the end-user experience should be the same for everyone.

4Technically, we have four sizes of test at Google: small, medium, large, and enormous. The internal difference between large and enormous is actually subtle and historical; so, in this book, most descriptions of large actually apply to our notion of enormous.

5There is a little wiggle room in this policy. Tests are allowed to access a filesystem if they use a hermetic, in-memory implementation.

6Mike Cohn, Succeeding with Agile: Software Development Using Scrum (New York: Addison-Wesley Professional, 2009).

7Keep in mind that there are different kinds of coverage (line, path, branch, etc.), and each says something different about which code has been tested. In this simple example, line coverage is being used.

8Each supported language at Google has one standard test framework and one standard mocking/stubbing library. One set of infrastructure runs most tests in all languages across the entire codebase.

9This class was so successful that an updated version is still taught today. In fact, it is one of the longest-running orientation classes in the company’s history.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch12.html b/clones/abseil.io/resources/swe-book/html/ch12.html new file mode 100644 index 00000000..751a9b16 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch12.html @@ -0,0 +1,863 @@ + + + + + Software Engineering at Google + + + + +
+

Unit Testing

+ + + + + +

The previous chapter introduced two of the main axes along which Google classifies tests: size and scope.  To recap, size refers to the resources consumed by a test and what it is allowed to do, and scope refers to how much code a test is intended to validate. Though Google has clear definitions for test size, scope tends to be a little fuzzier. We use the term unit test to refer to tests of relatively narrow scope, such as of a single class or method. Unit tests are usually small in size, but this isn’t always the case.

+ +

After preventing bugs, the most important purpose of a test is to improve engineers’ productivity.  Compared to broader-scoped tests, unit tests have many properties that make them an excellent way to optimize productivity:

+ +
    +
  • +

    They tend to be small according to Google’s definitions of test size.  Small tests are fast and deterministic, allowing developers to run them frequently as part of their workflow and get immediate feedback. 

    +
  • +
  • +

    They tend to be easy to write at the same time as the code they’re testing, allowing engineers to focus their tests on the code they’re working on without having to set up and understand a larger system.

    +
  • +
  • +

    They promote high levels of test coverage because they are quick and easy to write. High test coverage allows engineers to make changes with confidence that they aren’t breaking anything.

    +
  • +
  • +

    They tend to make it easy to understand what’s wrong when they fail because each test is conceptually simple and focused on a particular part of the system.

    +
  • +
  • +

    They can serve as documentation and examples, showing engineers how to use the part of the system being tested and how that system is intended to work.

    +
  • +
+ +

Due to their many advantages, most tests written at Google are unit tests, and as a rule of thumb, we encourage engineers to aim for a mix of about 80% unit tests and 20% broader-scoped tests. This advice, coupled with the ease of writing unit tests and the speed with which they run, means that engineers run a lot of unit tests—it’s not at all unusual for an engineer to execute thousands of unit tests (directly or indirectly) during the average workday.

+ +

Because they make up such a big part of engineers’ lives, Google puts a lot of focus on test maintainability. Maintainable tests  are ones that "just work": after writing them, engineers don’t need to think about them again until they fail, and those failures indicate real bugs with clear causes. The bulk of this chapter focuses on exploring the idea of maintainability and techniques for achieving it.

+ +
+

The Importance of Maintainability

+ +

Imagine this scenario: Mary wants to add a simple  new feature to the product and is able to implement it quickly, perhaps requiring only a couple dozen lines of code. But when she goes to check in her change, she gets a screen full of errors back from the automated testing system. She spends the rest of the day going through those failures one by one. In each case, the change introduced no actual bug, but broke some of the assumptions that the test made about the internal structure of the code, requiring those tests to be updated. Often, she has difficulty figuring out what the tests were trying to do in the first place, and the hacks she adds to fix them make those tests even more difficult to understand in the future. Ultimately, what should have been a quick job ends up taking hours or even days of busywork, killing Mary’s productivity and sapping her morale.

+ +

Here, testing had the opposite of its intended effect by draining productivity rather than improving it while not meaningfully increasing the quality of the code under test. This scenario is far too common, and Google engineers struggle with it every day. There’s no magic bullet, but many engineers at Google have been working to develop sets of patterns and practices to alleviate these problems, which we encourage the rest of the company to follow.

+ +

The problems Mary ran into weren’t her fault, and there was nothing she could have done to avoid them: bad tests must be fixed before they are checked in, lest they impose a drag on future engineers. Broadly speaking, the issues she encountered fall into two categories. First, the tests she was working with were brittle: they broke in response to a harmless and unrelated change that introduced no real bugs. Second, the tests were unclear: after they were failing, it was difficult to determine what was wrong, how to fix it, and what those tests were supposed to be doing in the first place.

+
+ +
+

Preventing Brittle Tests

+ +

As just defined, a  brittle test  is one that fails in the face of an unrelated change to production code that does not introduce any real bugs.1 Such tests must be diagnosed and fixed by engineers as part of their work. In small codebases with only a few engineers, having to tweak a few tests for every change might not be a big problem. But if a team regularly writes brittle tests, test maintenance will inevitably consume a larger and larger proportion of the team’s time as they are forced to comb through an increasing number of failures in an ever-growing test suite. If a set of tests needs to be manually tweaked by engineers for each change, calling it an "automated test suite" is a bit of a stretch!

+ +

Brittle tests cause pain in codebases of any size, but they become particularly acute at Google’s scale. An individual engineer might easily run thousands of tests in a single day during the course of their work, and a single large-scale change (see Large-Scale Changes) can trigger hundreds of thousands of tests. At this scale, spurious breakages that affect even a small percentage of tests can waste huge amounts of engineering time. Teams at Google vary quite a bit in terms of how brittle their test suites are, but we’ve identified a few practices and patterns that tend to make tests more robust to change.

+ +
+

Strive for Unchanging Tests

+ +

Before talking about patterns for avoiding brittle tests, we need to answer a question: just how  often should we expect to need to change a test after writing it? Any time spent updating old tests is time that can’t be spent on more valuable work. Therefore, the ideal test is unchanging: after it’s written, it never needs to change unless the requirements of the system under test change. 

+ +

What does this look like in practice? We need to think about the kinds of changes that engineers make to production code and how we should expect tests to respond to those changes.  Fundamentally, there are four kinds of changes:

+ +
+
Pure refactorings
+
When an engineer refactors the internals  of a system without modifying its interface, whether for performance, clarity, or any other reason, the system’s tests shouldn’t need to change. The role of tests in this case is to ensure that the refactoring didn’t change the system’s behavior. Tests that need to be changed during a refactoring indicate that either the change is affecting the system’s behavior and isn’t a pure refactoring, or that the tests were not written at an appropriate level of abstraction. Google’s reliance on large-scale changes (described in Large-Scale Changes) to do such refactorings makes this case particularly important for us.
+
New features
+
When an engineer adds new  features or behaviors to an existing system, the system’s existing behaviors should remain unaffected. The engineer must write new tests to cover the new behaviors, but they shouldn’t need to change any existing tests. As with refactorings, a change to existing tests when adding new features suggest unintended consequences of that feature or inappropriate tests.
+
Bug fixes
+
Fixing a bug is much like  adding a new feature: the presence of the bug suggests that a case was missing from the initial test suite, and the bug fix should include that missing test case. Again, bug fixes typically shouldn’t require updates to existing tests.
+
Behavior changes
+
Changing a system’s existing behavior is the one case when we expect to have to make updates to the system’s existing tests.  Note that such changes tend to be significantly more expensive than the other three types. A system’s users are likely to rely on its current behavior, and changes to that behavior require coordination with those users to avoid confusion or breakages. Changing a test in this case indicates that we’re breaking an explicit contract of the system, whereas changes in the previous cases indicate that we’re breaking an unintended contract. Low-level libraries will often invest significant effort in avoiding the need to ever make a behavior change so as not to break their users.
+
+ +

The takeaway is that after you write a test, you shouldn’t need to touch that test again as you refactor the system, fix bugs, or add new features. This understanding is what makes it possible to work with a system at scale: expanding it requires writing only a small number of new tests related to the change you’re making rather than potentially having to touch every test that has ever been written against the system. Only breaking changes in a system’s behavior should require going back to change its tests, and in such situations, the cost of updating those tests tends to be small relative to the cost of updating all of the system’s users.

+
+ +
+

Test via Public APIs

+ +

Now that we  understand  our goal, let’s look at some practices for making sure that tests don’t need to change unless the requirements of the system being tested change. By far the most important way to ensure this is to write tests that invoke the system being tested in the same way its users would; that is, make calls against its public API rather than its implementation details. If tests work the same way as the system’s users, by definition, change that breaks a test might also break a user. As an additional bonus, such tests can serve as useful examples and documentation for users.

+ +

Consider A transaction API, which validates a transaction and saves it to a database.

+ +
+
Example 12-1. A transaction API
+ +
public void processTransaction(Transaction transaction) {
+  if (isValid(transaction)) {
+    saveToDatabase(transaction);
+  }
+}
+
+private boolean isValid(Transaction t) {
+  return t.getAmount() < t.getSender().getBalance();
+}
+
+private void saveToDatabase(Transaction t) {
+  String s = t.getSender() + "," + t.getRecipient() + "," + t.getAmount();
+  database.put(t.getId(), s);
+}
+
+public void setAccountBalance(String accountName, int balance) {
+  // Write the balance to the database directly
+}
+
+public void getAccountBalance(String accountName) {
+  // Read transactions from the database to determine the account balance
+}
+
+ +

A tempting way to test this code would be to remove the "private" visibility modifiers and test the implementation logic directly, as demonstrated in A naive test of a transaction API’s implementation.

+ +
+
Example 12-2. A naive test of a transaction API’s implementation
+ +
@Test
+public void emptyAccountShouldNotBeValid() {
+  assertThat(processor.isValid(newTransaction().setSender(EMPTY_ACCOUNT)))
+      .isFalse();
+}
+
+@Test
+public void shouldSaveSerializedData() {
+  processor.saveToDatabase(newTransaction()
+      .setId(123)
+      .setSender("me")
+      .setRecipient("you")
+      .setAmount(100));
+  assertThat(database.get(123)).isEqualTo("me,you,100");
+}
+
+ +

This test interacts with the transaction processor in a much different way than its real users would: it peers into the system’s internal state and calls methods that aren’t publicly exposed as part of the system’s API. As a result, the test is brittle, and almost any refactoring of the system under test (such as renaming its methods, factoring them out into a helper class, or changing the serialization format) would cause the test to break, even if such a change would be invisible to the class’s real users.

+ +

Instead, the same test coverage can be achieved by testing only against the class’s public API, as shown in Testing the public API.2

+ +
+
Example 12-3. Testing the public API
+ +
@Test
+public void shouldTransferFunds() {
+  processor.setAccountBalance("me", 150);
+  processor.setAccountBalance("you", 20);
+
+  processor.processTransaction(newTransaction()
+      .setSender("me")
+      .setRecipient("you")
+      .setAmount(100));
+
+  assertThat(processor.getAccountBalance("me")).isEqualTo(50);
+  assertThat(processor.getAccountBalance("you")).isEqualTo(120);
+}
+
+@Test
+public void shouldNotPerformInvalidTransactions() {
+  processor.setAccountBalance("me", 50);
+  processor.setAccountBalance("you", 20);
+
+  processor.processTransaction(newTransaction()
+      .setSender("me")
+      .setRecipient("you")
+      .setAmount(100));
+
+  assertThat(processor.getAccountBalance("me")).isEqualTo(50);
+  assertThat(processor.getAccountBalance("you")).isEqualTo(20);
+}
+
+ +

Tests using only public APIs are, by definition, accessing the system under test in the same manner that its users would. Such tests are more realistic and less brittle because they form explicit contracts: if such a test breaks, it implies that an existing user of the system will also be broken. Testing only these contracts means that you’re free to do whatever internal refactoring of the system you want without having to worry about making tedious changes to tests.

+ +

It’s not always clear what constitutes a "public API," and the question really gets to the heart of what a "unit" is in unit testing.   Units can be as small as an individual function or as broad as a set of several related packages/modules. When we say "public API" in this context, we’re really talking about the API exposed by that unit to third parties outside of the team that owns the code. This doesn’t always align with the notion of visibility provided by some programming languages; for example, classes in Java might define themselves as "public" to be accessible by other packages in the same unit but are not intended for use by other parties outside of the unit. Some languages like Python have no built-in notion of visibility (often relying on conventions like prefixing private method names with underscores), and build systems like Bazel can further restrict who is allowed to depend on APIs declared public by the programming language.

+ +

Defining an appropriate scope for a unit  and hence what should be considered the public API is more art than science, but here are some rules of thumb:

+ +
    +
  • +

    If a method or class exists only to support one or two other classes (i.e., it is a "helper class"), it probably shouldn’t be considered its own unit, and its functionality should be tested through those classes instead of directly.

    +
  • +
  • +

    If a package or class is designed to be accessible by anyone without having to consult with its owners, it almost certainly constitutes a unit that should be tested directly, where its tests access the unit in the same way that the users would.

    +
  • +
  • +

    If a package or class can be accessed only by the people who own it, but it is designed to provide a general piece of functionality useful in a range of contexts (i.e., it is a "support library"), it should also be considered a unit and tested directly. This will usually create some redundancy in testing given that the support library’s code will be covered both by its own tests and the tests of its users. However, such redundancy can be valuable: without it, a gap in test coverage could be introduced if one of the library’s users (and its tests) were ever removed.

    +
  • +
+ +

At Google, we’ve found that engineers sometimes need to be persuaded that testing via public APIs is better than testing against implementation details. The reluctance is understandable because it’s often much easier to write tests focused on the piece of code you just wrote rather than figuring out how that code affects the system as a whole. Nevertheless, we have found it valuable to encourage such practices, as the extra upfront effort pays for itself many times over in reduced maintenance burden. Testing against public APIs won’t completely prevent brittleness, but it’s the most important thing you can do to ensure that your tests fail only in the event of meaningful changes to your system.  

+
+ +
+

Test State, Not Interactions

+ +

Another way that tests commonly  depend on implementation details involves not which methods of the system the test calls, but how the results of those calls are verified.  In general, there are two ways to verify that a system under test behaves as expected.  With state testing, you observe the system itself to see what it looks like after invoking with it. With interaction testing, you instead check that the system took an expected sequence of actions on its collaborators in response to invoking it. Many tests will perform a combination of state and interaction validation.

+ +

Interaction tests tend to be more brittle than state tests for the same reason that it’s more brittle to test a private method than to test a public method: interaction tests check how a system arrived at its result, whereas usually you should care only what the result is. A brittle interaction test illustrates a test that uses a test double (explained further in Test Doubles) to verify how  a system interacts with a database.

+ +
+
Example 12-4. A brittle interaction test
+ +
@Test
+public void shouldWriteToDatabase() {
+  accounts.createUser("foobar");
+  verify(database).put("foobar");
+}
+
+ +

The test verifies that a specific call was made against a database API, but there are a couple different ways it could go wrong:

+ +
    +
  • +

    If a bug in the system under test causes the record to be deleted from the database shortly after it was written, the test will pass even though we would have wanted it to fail.

    +
  • +
  • +

    If the system under test is refactored to call a slightly different API to write an equivalent record, the test will fail even though we would have wanted it to pass.

    +
  • +
+ +

It’s much less brittle to directly test against the state of the system, as demonstrated in Testing against state.

+ +
+
Example 12-5. Testing against state
+ +
@Test
+public void shouldCreateUsers() {
+  accounts.createUser("foobar");
+  assertThat(accounts.getUser("foobar")).isNotNull();
+}
+
+ +

This test more accurately expresses what we care about: the state of the system under test after interacting with it.

+ +

The most common reason for problematic interaction tests is an over reliance on mocking frameworks.  These frameworks make it easy to create test doubles that record and verify every call made against them, and to use those doubles in place of real objects in tests. This strategy leads directly to brittle interaction tests, and so we tend to prefer the use of real objects in favor of mocked objects, as long as the real objects are fast and deterministic.

+ +
Note
+

For a more extensive discussion of test doubles and mocking frameworks, when they should be used, and safer alternatives, see Test Doubles.

+
+
+
+ +
+

Writing Clear Tests

+ +

Sooner or later, even if we’ve completely  avoided  brittleness, our tests will fail. Failure  is a good  thing—test failures provide useful signals to engineers, and are one of the main ways that a unit test provides value.

+ +

  Test failures happen for one of two reasons:3

+ +
    +
  • +

    The system under test has a problem or is incomplete. This result is exactly what tests are designed for: alerting you to bugs so that you can fix them.

    +
  • +
  • +

    The test itself is flawed. In this case, nothing is wrong with the system under test, but the test was specified incorrectly. If this was an existing test rather than one that you just wrote, this means that the test is brittle. The previous section discussed how to avoid brittle tests, but it’s rarely possible to eliminate them entirely.

    +
  • +
+ +

When a test fails, an engineer’s first job is to identify which of these cases the failure falls into and then to diagnose the actual problem. The speed at which the engineer can do so depends on the test’s clarity. A clear test is one whose purpose for existing and reason for failing is immediately clear to the engineer diagnosing a failure. Tests fail to achieve clarity when their reasons for failure aren’t obvious or when it’s difficult to figure out why they were originally written. Clear tests also bring other benefits, such as documenting the system under test and more easily serving as a basis for new tests.

+ +

Test clarity becomes significant over time. Tests will often outlast the engineers who wrote them, and the requirements and understanding of a system will shift subtly as it ages. It’s entirely possible that a failing test might have been written years ago by an engineer no longer on the team, leaving no way to figure out its purpose or how to fix it. This stands in contrast with unclear production code, whose purpose you can usually determine with enough effort by looking at what calls it and what breaks when it’s removed. With an unclear test, you might never understand its purpose, since removing the test will have no effect other than (potentially) introducing a subtle hole in test coverage.

+ +

In the worst case, these obscure tests just end up getting deleted when engineers can’t figure out how to fix them. Not only does removing such tests introduce a hole in test coverage, but it also indicates that the test has been providing zero value for perhaps the entire period it has existed (which could have been years).

+ +

For a test suite to scale and be useful over time, it’s important that each individual test in that suite be as clear as possible. This section explores techniques and ways of thinking about tests to achieve clarity.

+ +
+

Make Your Tests Complete and Concise

+ +

Two high-level properties that  help tests achieve  clarity are completeness and conciseness. A  test is complete when its body contains all of the information a reader needs in order to understand how it arrives at its result. A test is concise when it contains no other distracting or irrelevant information. An incomplete and cluttered test shows a test that is neither complete nor concise:

+ +
+
Example 12-6. An incomplete and cluttered test
+ +
@Test
+public void shouldPerformAddition() {
+  Calculator calculator = new Calculator(new RoundingStrategy(), 
+      "unused", ENABLE_COSINE_FEATURE, 0.01, calculusEngine, false);
+  int result = calculator.calculate(newTestCalculation());
+  assertThat(result).isEqualTo(5); // Where did this number come from?
+}
+
+ +

The test is passing a lot of irrelevant information into the constructor, and the actual important parts of the test are hidden inside of a helper method. The test can be made more complete by clarifying the inputs of the helper method, and more concise by using another helper to hide the irrelevant details of constructing the calculator, as illustrated in A complete, concise test.

+ +
+
Example 12-7. A complete, concise test
+ +
@Test
+public void shouldPerformAddition() {
+  Calculator calculator = newCalculator();
+  int result = calculator.calculate(newCalculation(2, Operation.PLUS, 3));
+  assertThat(result).isEqualTo(5);
+}
+
+ +

Ideas we discuss later, especially around code sharing, will tie back to completeness and conciseness.  In particular, it can often be worth violating the DRY (Don’t Repeat Yourself) principle if it leads to clearer tests. Remember: a test’s body should contain all of the information needed to understand it without containing any irrelevant or distracting information.

+
+ +
+

Test Behaviors, Not Methods

+ +

The first instinct of many engineers is to try to match the structure of their tests to the structure of their code such that every production method has a corresponding test method.      This pattern can be convenient at first, but over time it leads to problems: as the method being tested grows more complex, its test also grows in complexity and becomes more difficult to reason about. For example, consider the snippet of code in A transaction snippet, which displays the results of a transaction.

+ +
+
Example 12-8. A transaction snippet
+ +
public void displayTransactionResults(User user, Transaction transaction) {
+  ui.showMessage("You bought a " + transaction.getItemName());
+  if (user.getBalance() < LOW_BALANCE_THRESHOLD) {
+    ui.showMessage("Warning: your balance is low!");
+  }
+}
+
+ +

It wouldn’t be uncommon to find a test covering both of the messages that might be shown by the  method, as  presented in A method-driven test.

+ +
+
Example 12-9. A method-driven test
+ +
@Test
+public void testDisplayTransactionResults() {
+  transactionProcessor.displayTransactionResults(
+      newUserWithBalance(
+          LOW_BALANCE_THRESHOLD.plus(dollars(2))),
+      new Transaction("Some Item", dollars(3)));
+
+  assertThat(ui.getText()).contains("You bought a Some Item");
+  assertThat(ui.getText()).contains("your balance is low");
+}
+
+ +

With such tests, it’s likely that the test started out covering only the first method. Later, an engineer expanded the test when the second message was added (violating the idea of unchanging tests that we discussed earlier). This modification sets a bad precedent: as the method under test becomes more complex and implements more functionality, its unit test will become increasingly convoluted and grow more and more difficult to work with.

+ +

The problem is that framing tests around methods can naturally encourage unclear tests because a single method often does a few different things under the hood and might have several tricky edge and corner cases.  There’s a better way: rather than writing a test for each method, write a test for each behavior.4 A behavior is any guarantee that a system makes about how it will respond to a series of inputs while in a particular state.5 Behaviors can often be expressed using the words "given," "when," and "then": “Given that a bank  account is empty, when attempting to withdraw money from it, then the transaction is rejected." The mapping between methods and behaviors is many-to-many: most nontrivial methods implement multiple behaviors, and some behaviors rely on the interaction of multiple methods. The previous example can be rewritten using behavior-driven tests, as presented in A behavior-driven test.

+ +
+
Example 12-10. A behavior-driven test
+ +
@Test
+public void displayTransactionResults_showsItemName() {
+  transactionProcessor.displayTransactionResults(
+      new User(), new Transaction("Some Item"));
+  assertThat(ui.getText()).contains("You bought a Some Item");
+}
+
+@Test
+public void displayTransactionResults_showsLowBalanceWarning() {
+  transactionProcessor.displayTransactionResults(
+      newUserWithBalance(
+          LOW_BALANCE_THRESHOLD.plus(dollars(2))),
+      new Transaction("Some Item", dollars(3)));
+  assertThat(ui.getText()).contains("your balance is low");
+}
+
+ +

The extra boilerplate required to split apart the single test is more than worth it, and the resulting tests are much clearer than the original test. Behavior-driven tests tend to be clearer than method-oriented tests for several reasons. First, they read more like natural language, allowing them to be naturally understood rather than requiring laborious mental parsing. Second, they more clearly express cause and effect because each test is more limited in scope. Finally, the fact that each test is short and descriptive makes it easier to see what functionality is already tested and encourages engineers to add new streamlined test methods instead of piling onto existing methods.

+ +
+

Structure tests to emphasize behaviors

+ +

Thinking about tests as being coupled to behaviors instead of methods significantly affects how they should be structured.    Remember that every behavior has three parts: a "given" component that defines how the system is set up, a "when" component that defines the action to be taken on the system, and a "then" component that validates the result.6 Tests are clearest when this structure is explicit.  Some frameworks like Cucumber and Spock directly bake in given/when/then. Other languages can use whitespace and optional comments to make the structure stand out, such as that shown in A well-structured test.

+ +
+
Example 12-11. A well-structured test
+ +
@Test
+public void transferFundsShouldMoveMoneyBetweenAccounts() {
+  // Given two accounts with initial balances of $150 and $20
+  Account account1 = newAccountWithBalance(usd(150));
+  Account account2 = newAccountWithBalance(usd(20));
+
+  // When transferring $100 from the first to the second account
+  bank.transferFunds(account1, account2, usd(100));
+
+  // Then the new account balances should reflect the transfer
+  assertThat(account1.getBalance()).isEqualTo(usd(50));
+  assertThat(account2.getBalance()).isEqualTo(usd(120));
+}
+
+ +

This level of description isn’t always necessary in trivial tests, and it’s usually sufficient to omit the comments and rely on whitespace to make the sections clear. However, explicit comments can make more sophisticated tests easier to understand. This pattern makes it possible to read tests at three levels of granularity:

+ +
    +
  1. +

    A reader can start by looking at the test method name (discussed below) to get a rough description of the behavior being tested.

    +
  2. +
  3. +

    If that’s not enough, the reader can look at the given/when/then comments for a formal description of the behavior.

    +
  4. +
  5. +

    Finally, a reader can look at the actual code to see precisely how that behavior is expressed.

    +
  6. +
+ +

This pattern is  most commonly violated by interspersing assertions among multiple calls to the system under test (i.e., combining the "when" and "then" blocks). Merging the "then" and "when" blocks in this way can make the test less clear because it makes it difficult to distinguish the action being performed from the expected result.

+ +

When a test does want to validate each step in a multistep process, it’s acceptable to define alternating sequences of when/then blocks. Long blocks can also be made more descriptive by splitting them up with the word "and." Alternating when/then blocks within a test shows what a relatively complex, behavior-driven test might look like. 

+ +
+
Example 12-12. Alternating when/then blocks within a test
+ +
@Test
+public void shouldTimeOutConnections() {
+  // Given two users
+  User user1 = newUser();
+  User user2 = newUser();
+
+  // And an empty connection pool with a 10-minute timeout
+  Pool pool = newPool(Duration.minutes(10));
+
+  // When connecting both users to the pool
+  pool.connect(user1);
+  pool.connect(user2);
+
+  // Then the pool should have two connections
+  assertThat(pool.getConnections()).hasSize(2);
+
+  // When waiting for 20 minutes
+  clock.advance(Duration.minutes(20));
+
+  // Then the pool should have no connections
+  assertThat(pool.getConnections()).isEmpty();
+
+  // And each user should be disconnected
+  assertThat(user1.isConnected()).isFalse();
+  assertThat(user2.isConnected()).isFalse();
+}
+
+ +

When writing such tests, be careful to ensure that you’re not inadvertently testing multiple behaviors at the same time. Each test should cover only a single behavior, and the vast majority of unit tests require only one "when" and one "then" block.

+
+ +
+

Name tests after the behavior being tested

+ +

Method-oriented  tests are usually named  after the method being tested (e.g., a test for the updateBalance method is usually called testUpdateBalance). With more focused behavior-driven tests, we have a lot more flexibility and the chance to convey useful information in the test’s name. The test name is very important: it will often be the first or only token visible in failure reports, so it’s your best opportunity to communicate the problem when the test breaks. It’s also the most straightforward way to express the intent of the test.

+ +

A test’s name should summarize the behavior it is testing. A good name describes both the actions that are being taken on a system and the expected outcome. Test names will sometimes include additional information like the state of the system or its environment before taking action on it. Some languages and frameworks make this easier than others by allowing tests to be nested within one another and named using strings, such as in Some sample nested naming patterns, which uses Jasmine.

+ +
+
Example 12-13. Some sample nested naming patterns
+ +
describe("multiplication", function() {
+  describe("with a positive number", function() {
+    var positiveNumber = 10;
+    it("is positive with another positive number", function() {
+      expect(positiveNumber * 10).toBeGreaterThan(0);
+    });
+    it("is negative with a negative number", function() {
+      expect(positiveNumber * -10).toBeLessThan(0);
+    });
+  });
+  describe("with a negative number", function() {
+    var negativeNumber = 10;
+    it("is negative with a positive number", function() {
+      expect(negativeNumber * 10).toBeLessThan(0);
+    });
+    it("is positive with another negative number", function() {
+      expect(negativeNumber * -10).toBeGreaterThan(0);
+    });
+  });
+});
+
+ +

Other languages  require us to encode all of this information in a method name, leading to method naming patterns like that shown in Some sample method naming patterns.

+ +
+
Example 12-14. Some sample method naming patterns
+ +
multiplyingTwoPositiveNumbersShouldReturnAPositiveNumber
+multiply_positiveAndNegative_returnsNegative
+divide_byZero_throwsException
+
+ +

Names like this are much more verbose than we’d normally want to write for methods in production code, but the use case is different: we never need to write code that calls these, and their names frequently need to be read by humans in reports. Hence, the extra verbosity is warranted.

+ +

Many different naming strategies are acceptable so long as they’re used consistently within a single test class. A good trick if you’re stuck is to try starting the test name with the word "should." When taken with the name of the class being tested, this naming scheme allows the test name to be read as a sentence. For example, a test of a BankAccount class named shouldNotAllowWithdrawalsWhenBalanceIsEmpty can be read as "BankAccount should not allow withdrawals when balance is empty." By reading the names of all the test methods in a suite, you should get a good sense of the behaviors implemented by the system under test. Such names also help ensure that the test stays focused on a single behavior: if you need to use the word "and" in a test name, there’s a good chance that you’re actually testing multiple behaviors and should be writing multiple tests!   

+
+
+ +
+

Don’t Put Logic in Tests

+ +

Clear tests are trivially correct upon inspection; that is, it is obvious that a test is doing the correct thing just from glancing at it.   This is possible in test code because each test needs to handle only a particular set of inputs, whereas production code must be generalized to handle any input.  For production code, we’re able to write tests that ensure complex logic is correct. But test code doesn’t have that luxury—if you feel like you need to write a test to verify your test, something has gone wrong!

+ +

Complexity is most often introduced in the form of logic. Logic is defined via the imperative parts of programming languages such as operators, loops, and conditionals.  When a piece of code contains logic, you need to do a bit of mental computation to determine its result instead of just reading it off of the screen.  It doesn’t take much logic to make a test more difficult to reason about. For example, does the test in Logic concealing a bug look correct to you?

+ +
+
Example 12-15. Logic concealing a bug
+ +
@Test
+public void shouldNavigateToAlbumsPage() {
+  String baseUrl = "http://photos.google.com/";
+  Navigator nav = new Navigator(baseUrl);
+  nav.goToAlbumPage();
+  assertThat(nav.getCurrentUrl()).isEqualTo(baseUrl + "/albums");
+}
+
+ +

There’s not much logic here: really just one string concatenation. But if we simplify the test by removing that one bit of logic, a bug immediately becomes clear, as demonstrated in A test without logic reveals the bug.

+ +
+
Example 12-16. A test without logic reveals the bug
+ +
@Test
+public void shouldNavigateToPhotosPage() {
+  Navigator nav = new Navigator("http://photos.google.com/");
+  nav.goToPhotosPage();
+  assertThat(nav.getCurrentUrl()))
+      .isEqualTo("http://photos.google.com//albums"); // Oops!
+}
+
+ +

When the whole string is written out, we can see right away that we’re expecting two slashes in the URL instead of just one. If the production code made a similar mistake, this test would fail to detect a bug. Duplicating the base URL was a small price to pay for making the test more descriptive and meaningful (see the discussion of DAMP versus DRY tests later in this chapter).

+ +

If humans are bad at spotting bugs from string concatenation, we’re even worse at spotting bugs that come from more sophisticated programming constructs like loops and conditionals. The lesson is clear: in test code, stick to straight-line code over clever logic, and consider tolerating some duplication when it makes the test more descriptive and meaningful. We’ll discuss ideas around duplication and code sharing later in this chapter.

+
+ +
+

Write Clear Failure Messages

+ +

One last aspect of clarity has to do not with how a test is written, but with what an engineer sees when it fails.    In an ideal world, an engineer could diagnose a problem just from reading its failure message in a log or report without ever having to look at the test itself. A good failure message contains much the same information as the test’s name: it should clearly express the desired outcome, the actual outcome, and any relevant parameters.

+ +

Here’s an example of a bad failure message:

+ +
Test failed: account is closed
+ +

Did the test fail because the account was closed, or was the account expected to be closed and the test failed because it wasn’t? A better failure message clearly distinguishes the expected from the actual state and gives more context about the result:

+ +
Expected an account in state CLOSED, but got account:
+    <{name: "my-account", state: "OPEN"}
+ +

Good libraries can help make it easier to write useful failure messages.   Consider the assertions in An assertion using the Truth library in a Java test, the first of which  uses classical JUnit asserts, and the second of which uses Truth, an assertion library developed by Google:

+ +
+
Example 12-17. An assertion using the Truth library
+ +
Set<String> colors = ImmutableSet.of("red", "green", "blue");
+assertTrue(colors.contains("orange"));  // JUnit
+assertThat(colors).contains("orange");  // Truth
+
+ +

Because the first assertion only receives a Boolean value, it is only able to give a generic error message like "expected <true> but was <false>," which isn’t very informative in a failing test output. Because the second assertion explicitly receives the subject of the assertion, it is able to give a much more useful error message: "AssertionError: <[red, green, blue]> should have contained <orange>."

+ +

Not all  languages have  such helpers available, but it should always be possible to manually specify the important information in the failure message. For example, test assertions in Go conventionally look like A test assertion in Go.

+ +
+
Example 12-18. A test assertion in Go
+ +
result := Add(2, 3)
+if result != 5 {
+  t.Errorf("Add(2, 3) = %v, want %v", result, 5)
+}
+
+
+
+ +
+

Tests and Code Sharing: DAMP, Not DRY

+ +

One final  aspect of  writing clear tests and avoiding brittleness has to do with code sharing.   Most software attempts to achieve a principle called DRY—"Don’t Repeat Yourself." DRY states  that software is easier to maintain if every concept is canonically represented in one place and code duplication is kept to a minimum. This approach is especially valuable in making changes easier because an engineer needs to update only one piece of code rather than tracking down multiple references. The downside to such consolidation is that it can make code unclear, requiring readers to follow chains of references to understand what the code is doing.

+ +

In normal production code, that downside is usually a small price to pay for making code easier to change and work with. But this cost/benefit analysis plays out a little differently in the context of test code. Good tests are designed to be stable, and in fact you usually want them to break when the system being tested changes. So DRY doesn’t have quite as much benefit when it comes to test code. At the same time, the costs of complexity are greater for tests: production code has the benefit of a test suite to ensure that it keeps working as it becomes complex, whereas tests must stand by themselves, risking bugs if they aren’t self-evidently correct. As mentioned earlier, something has gone wrong if tests start becoming complex enough that it feels like they need their own tests to ensure that they’re working properly. 

+ +

Instead of  being completely DRY, test code should  often strive to be DAMP—that is, to promote "Descriptive And Meaningful Phrases." A little bit of duplication is OK in tests so long as that duplication makes the test simpler and clearer.  To illustrate, A test that is too DRY presents some tests that are far too DRY.

+ +
+
Example 12-19. A test that is too DRY
+ +
@Test
+public void shouldAllowMultipleUsers() {
+  List<User> users = createUsers(false, false);
+  Forum forum = createForumAndRegisterUsers(users);
+  validateForumAndUsers(forum, users);
+}
+
+@Test
+public void shouldNotAllowBannedUsers() {
+  List<User> users = createUsers(true);
+  Forum forum = createForumAndRegisterUsers(users);
+  validateForumAndUsers(forum, users);
+}
+
+// Lots more tests...
+
+private static List<User> createUsers(boolean... banned) {
+  List<User> users = new ArrayList<>();
+  for (boolean isBanned : banned) {
+    users.add(newUser()
+        .setState(isBanned ? State.BANNED : State.NORMAL)
+        .build());
+  }
+  return users;
+}
+
+private static Forum createForumAndRegisterUsers(List<User> users) {
+  Forum forum = new Forum();
+  for (User user : users) {
+    try {
+      forum.register(user);
+    } catch(BannedUserException ignored) {}
+  }
+  return forum;
+}
+
+private static void validateForumAndUsers(Forum forum, List<User> users) {
+  assertThat(forum.isReachable()).isTrue();
+  for (User user : users) {
+    assertThat(forum.hasRegisteredUser(user))
+        .isEqualTo(user.getState() == State.BANNED);
+  }
+}
+
+ +

The problems  in this code should be apparent based on the previous discussion of clarity. For one, although the test bodies are very concise, they are not complete: important details are hidden away in helper methods that the reader can’t see without having to scroll to a completely different part of the file.   Those helpers are also full of logic that makes them more difficult to verify at a glance (did you spot the bug?). The test becomes much clearer when it’s rewritten to use DAMP, as shown in Tests should be DAMP.

+ +
+
Example 12-20. Tests should be DAMP
+ +
@Test
+public void shouldAllowMultipleUsers() {
+  User user1 = newUser().setState(State.NORMAL).build();
+  User user2 = newUser().setState(State.NORMAL).build();
+
+  Forum forum = new Forum();
+  forum.register(user1);
+  forum.register(user2);
+
+  assertThat(forum.hasRegisteredUser(user1)).isTrue();
+  assertThat(forum.hasRegisteredUser(user2)).isTrue();
+}
+
+@Test
+public void shouldNotRegisterBannedUsers() {
+  User user = newUser().setState(State.BANNED).build();
+
+  Forum forum = new Forum();
+  try {
+    forum.register(user);
+  } catch(BannedUserException ignored) {}
+
+  assertThat(forum.hasRegisteredUser(user)).isFalse();
+}
+
+ +

These tests have more duplication, and the test bodies are a bit longer, but the extra verbosity is worth it. Each individual test is far more meaningful and can be understood entirely without leaving the test body. A reader of these tests can feel confident that the tests do what they claim to do and aren’t hiding any bugs.

+ +

DAMP is not a replacement for DRY; it is complementary to it.   Helper methods and test infrastructure can still help make tests clearer by making them more concise, factoring out repetitive steps whose details aren’t relevant to the particular behavior being tested. The important point is that such refactoring should be done with an eye toward making tests more descriptive and meaningful, and not solely in the name of reducing repetition. The rest of this section will explore common patterns for sharing code across tests.

+ +
+

Shared Values

+ +

Many tests are structured  by defining a set of shared  values to be used by tests and then by defining the tests that cover various cases for how these values interact. Shared values with ambiguous names illustrates what such tests look like.

+ +
+
Example 12-21. Shared values with ambiguous names
+ +
private static final Account ACCOUNT_1 = Account.newBuilder()
+    .setState(AccountState.OPEN).setBalance(50).build();
+
+private static final Account ACCOUNT_2 = Account.newBuilder()
+    .setState(AccountState.CLOSED).setBalance(0).build();
+
+private static final Item ITEM = Item.newBuilder()
+    .setName("Cheeseburger").setPrice(100).build();
+
+// Hundreds of lines of other tests...
+
+@Test
+public void canBuyItem_returnsFalseForClosedAccounts() {
+  assertThat(store.canBuyItem(ITEM, ACCOUNT_1)).isFalse();
+}
+
+@Test
+public void canBuyItem_returnsFalseWhenBalanceInsufficient() {
+  assertThat(store.canBuyItem(ITEM, ACCOUNT_2)).isFalse();
+}
+
+ +

This strategy can make tests very concise, but it causes problems as the test suite grows. For one, it can be difficult to understand why a particular value was chosen for a test. In Shared values with ambiguous names, the test names fortunately clarify which scenarios are being tested, but you still need to scroll up to the definitions to confirm that ACCOUNT_1 and ACCOUNT_2 are appropriate for those scenarios. More descriptive constant names (e.g., CLOSED_ACCOUNT and ACCOUNT_WITH_LOW_BALANCE) help a bit, but they still make it more difficult to see the exact details of the value being tested, and the ease of reusing these values can encourage engineers to do so even when the name doesn’t exactly describe what the test needs.

+ +

Engineers are usually drawn to using shared constants because constructing individual values in each test can be verbose.  A better way to accomplish this goal is to construct data using helper methods (see Shared values using helper methods) that require the test author to specify only values they care about, and setting reasonable defaults7 for all other values. This construction is trivial to do in languages that support named parameters, but languages without named parameters  can use constructs such as the Builder pattern to emulate them (often with the assistance of tools such as AutoValue):

+ +
+
Example 12-22. Shared values using helper methods
+ +
# A helper method wraps a constructor by defining arbitrary defaults for
+# each of its parameters.
+def newContact(
+    firstName="Grace", lastName="Hopper", phoneNumber="555-123-4567"):
+  return Contact(firstName, lastName, phoneNumber)
+
+# Tests call the helper, specifying values for only the parameters that they 
+# care about.
+def test_fullNameShouldCombineFirstAndLastNames(self):
+  def contact = newContact(firstName="Ada", lastName="Lovelace")
+  self.assertEqual(contact.fullName(), "Ada Lovelace")
+
+// Languages like Java that don’t support named parameters can emulate them
+// by returning a mutable "builder" object that represents the value under
+// construction.
+private static Contact.Builder newContact() {
+  return Contact.newBuilder()
+    .setFirstName("Grace")
+    .setLastName("Hopper")
+    .setPhoneNumber("555-123-4567");
+}
+
+// Tests then call methods on the builder to overwrite only the parameters
+// that they care about, then call build() to get a real value out of the
+// builder.
+@Test
+public void fullNameShouldCombineFirstAndLastNames() {
+  Contact contact = newContact()
+      .setFirstName("Ada")
+      .setLastName("Lovelace")
+      .build();
+  assertThat(contact.getFullName()).isEqualTo("Ada Lovelace");
+}
+
+ +

Using helper methods to construct these values allows each test to create the exact values it needs without having to worry about specifying irrelevant information or conflicting with other tests.

+
+ +
+

Shared Setup

+ +

A related way tha t tests shared code is via setup/initialization logic.  Many test frameworks allow engineers to define methods to execute before each test in a suite is run. Used appropriately, these methods can make tests clearer and more concise by obviating the repetition of tedious and irrelevant initialization logic. Used inappropriately, these methods can harm a test’s completeness by hiding important details in a separate initialization method.

+ +

The best use case for setup methods is to construct the object under tests and its collaborators. This is useful when the majority of tests don’t care about the specific arguments used to construct those objects and can let them stay in their default states. The same idea also applies to stubbing return values for test doubles, which is a concept that we explore in more detail in Test Doubles.

+ +

One risk in using setup methods is that  they can lead to unclear tests if those tests begin to depend on the particular values used in setup. For example, the test in Dependencies on values in setup methods seems incomplete because a reader of the test needs to go hunting to discover where the string "Donald Knuth" came from.

+ +
+
Example 12-23. Dependencies on values in setup methods
+ +
private NameService nameService;
+private UserStore userStore;
+
+@Before
+public void setUp() {
+  nameService = new NameService();
+  nameService.set("user1", "Donald Knuth");
+  userStore = new UserStore(nameService);
+}
+
+// [... hundreds of lines of tests ...]
+
+@Test
+public void shouldReturnNameFromService() {
+  UserDetails user = userStore.get("user1");
+  assertThat(user.getName()).isEqualTo("Donald Knuth");
+}
+
+ +

Tests like these that explicitly care about particular values should state those values directly, overriding the default defined in the setup method if need be. The resulting test contains slightly more repetition, as shown in Overriding values in setup methods, but the result is far more descriptive and meaningful.

+ +
+
Example 12-24. Overriding values in setup methods
+ +
private NameService nameService;
+private UserStore userStore;
+
+@Before
+public void setUp() {
+  nameService = new NameService();
+  nameService.set("user1", "Donald Knuth");
+  userStore = new UserStore(nameService);
+}
+
+@Test
+public void shouldReturnNameFromService() {
+  nameService.set("user1", "Margaret Hamilton");
+  UserDetails user = userStore.get("user1");
+  assertThat(user.getName()).isEqualTo("Margaret Hamilton");
+}
+
+
+ +
+

Shared Helpers and Validation

+ +

The last common way that code is shared across tests is via "helper methods" called from the body of the test methods.   We already discussed how helper methods can be a useful way for concisely constructing test values—this usage is warranted, but other types of helper methods can be dangerous.

+ +

One common type of helper is a method that performs a common set of assertions against a system under test.   The extreme example is a validate method called at the end of every test method, which performs a set of fixed checks against the system under test. Such a validation strategy can be a bad habit to get into because tests using this approach are less behavior driven. With such tests, it is much more difficult to determine the intent of any particular test and to infer what exact case the author had in mind when writing it. When bugs are introduced, this strategy can also make them more difficult to localize because they will frequently cause a large number of tests to start failing.

+ +

More focused validation methods can still be useful, however. The best validation helper methods assert a single conceptual fact about their inputs, in contrast to general-purpose validation methods that cover a range of conditions. Such methods can be particularly helpful when the condition that they are validating is conceptually simple but requires looping or conditional logic to implement that would reduce clarity were it included in the body of a test method. For example, the helper method in A conceptually simple test might be useful in a test covering several different cases around account access.

+ +
+
Example 12-25. A conceptually simple test
+ +
private void assertUserHasAccessToAccount(User user, Account account) {
+  for (long userId : account.getUsersWithAccess()) {
+    if (user.getId() == userId) {
+      return;
+    }
+  }
+  fail(user.getName() + " cannot access " + account.getName());
+}
+
+
+ +
+

Defining Test Infrastructure

+ +

The techniques we’ve discussed so far cover sharing code across  methods in a single test class or suite.  Sometimes, it can also be valuable to share code across multiple test suites.  We refer to this sort of code as test infrastructure. Though it is usually more valuable in integration or end-to-end tests, carefully designed test infrastructure can make unit tests much easier to write in some circumstances.

+ +

Custom test infrastructure must be approached more carefully than the code sharing that happens within a single test suite. In many ways, test infrastructure code is more similar to production code than it is to other test code given that it can have many callers that depend on it and can be difficult to change without introducing breakages. Most engineers aren’t expected to make changes to the common test infrastructure while testing their own features. Test infrastructure needs to be treated as its own separate product, and accordingly, test infrastructure must always have its own tests.

+ +

Of course, most of the test infrastructure that most engineers use comes in the form of well-known third-party libraries like JUnit. A huge number of such libraries are available, and standardizing on them within an organization should happen as early and universally as possible. For example, Google many years ago mandated Mockito as the only mocking framework that should be used in new Java tests and banned new tests from using other mocking frameworks. This edict produced some grumbling at the time from people comfortable with other frameworks, but today, it’s universally seen as a good move that made our tests easier to understand and work with.   

+
+
+ +
+

Conclusion

+ +

Unit tests are one of the most powerful tools that we as software engineers have to make sure that our systems keep working over time in the face of unanticipated changes. But with great power comes great responsibility, and careless use of unit testing can result in a system that requires much more effort to maintain and takes much more effort to change without actually improving our confidence in said system.

+ +

Unit tests at Google are far from perfect, but we’ve found tests that follow the practices outlined in this chapter to be orders of magnitude more valuable than those that don’t. We hope they’ll help you to improve the quality of your own tests!

+
+ +
+

TL;DRs

+ +
    +
  • +

    Strive for unchanging tests.

    +
  • +
  • +

    Test via public APIs.

    +
  • +
  • +

    Test state, not interactions.

    +
  • +
  • +

    Make your tests complete and concise.

    +
  • +
  • +

    Test behaviors, not methods.

    +
  • +
  • +

    Structure tests to emphasize behaviors.

    +
  • +
  • +

    Name tests after the behavior being tested.

    +
  • +
  • +

    Don’t put logic in tests.

    +
  • +
  • +

    Write clear failure messages.

    +
  • +
  • +

    Follow DAMP over DRY when sharing  code for tests.

    +
  • +
+
+

1Note that this is slightly different from a flaky test, which fails nondeterministically without any change to production code.

2This is sometimes called the "Use the front door first principle."

3These are also the same two reasons that a test can be "flaky." Either the system under test has a nondeterministic fault, or the test is flawed such that it sometimes fails when it should pass.

4See https://testing.googleblog.com/2014/04/testing-on-toilet-test-behaviors-not.html and https://dannorth.net/introducing-bdd.

5Furthermore, a feature (in the product sense of the word) can be expressed as a collection of behaviors.

6These components are sometimes referred to as "arrange," "act," and "assert."

7In many cases, it can even be useful to slightly randomize the default values returned for fields that aren’t explicitly set. This helps to ensure that two different instances won’t accidentally compare as equal, and makes it more difficult for engineers to hardcode dependencies on the defaults.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch13.html b/clones/abseil.io/resources/swe-book/html/ch13.html new file mode 100644 index 00000000..724b4f9a --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch13.html @@ -0,0 +1,757 @@ + + + + + Software Engineering at Google + + + + +
+

Test Doubles

+ + + + + +

Unit tests are a critical tool for keeping developers productive and reducing defects in code.  Although they can be easy to write for simple code, writing them becomes difficult as code becomes more complex.

+ +

For example, imagine trying to write a test for a function that sends a request to an external server and then stores the response in a database. Writing a handful of tests might be doable with some effort. But if you need to write hundreds or thousands of tests like this, your test suite will likely take hours to run, and could become flaky due to issues like random network failures or tests overwriting one another’s data.

+ +

Test doubles come in handy in such cases. A test double is an object or function that can stand in for a real implementation in a test, similar to how a stunt double can stand in for an actor in a movie.  The use of test doubles is often referred to as mocking, but we avoid that term in this chapter because, as we’ll see, that term is also used to refer to more specific aspects of test doubles.

+ +

Perhaps the most obvious type of test double is a simpler implementation of an object that behaves similarly to the real implementation, such as an in-memory database. Other types of test doubles can make it possible to validate specific details of your system, such as by making it easy to trigger a rare error condition, or ensuring a heavyweight function is called without actually executing the function’s implementation.

+ +

The previous two chapters introduced the concept of small tests and discussed why they should comprise the majority of tests in a test suite. However, production code often doesn’t fit within the constraints of small tests due to communication across multiple processes or machines. Test doubles can be much more lightweight than real implementations, allowing you to write many small tests that execute quickly and are not flaky.

+ +
+

The Impact of Test Doubles on Software Development

+ +

The use of test doubles introduces a few complications to software development that require some trade-offs to be made.  The concepts introduced here are discussed in more depth throughout this chapter:

+ +
+
Testability
+
To use test doubles, a codebase needs to be designed to be testable—it should be possible for tests to swap out real implementations with test doubles. For example, code that calls a database needs to be flexible enough to be able to use a test double in place of a real database. If the codebase isn’t designed with testing in mind and you later decide that tests are needed, it can require a major commitment to refactor the code to support the use of test doubles.
+
Applicability
+
Although proper application of test doubles can provide a powerful boost to engineering velocity, their improper use can lead to tests that are brittle, complex, and less effective. These downsides are magnified when test doubles are used improperly across a large codebase, potentially resulting in major losses in productivity for engineers. In many cases, test doubles are not suitable and engineers should prefer to use real implementations instead.
+
Fidelity
+
Fidelity refers to how closely the behavior of a test double resembles the behavior of the real implementation that it’s replacing.  If the behavior of a test double significantly differs from the real implementation, tests that use the test double likely wouldn’t provide much value—for example, imagine trying to write a test with a test double for a database that ignores any data added to the database and always returns empty results. But perfect fidelity might not be feasible; test doubles often need to be vastly simpler than the real implementation in order to be suitable for use in tests. In many situations, it is appropriate to use a test double even without perfect fidelity. Unit tests that use test doubles often need to be supplemented by larger-scope tests that exercise the real implementation.
+
+
+ +
+

Test Doubles at Google

+ +

At Google, we’ve seen countless examples of the benefits to productivity and software quality  that test doubles can bring to a codebase, as well as the negative impact they can cause when used improperly. The practices we follow at Google have evolved over time based on these experiences. Historically, we had few guidelines on how to effectively use test doubles, but best practices evolved as we saw common patterns and antipatterns arise in many teams’ codebases.

+ +

One lesson we learned the hard way is the danger  of overusing mocking frameworks, which allow you to easily create test doubles (we will discuss mocking frameworks in more detail later in this chapter). When mocking frameworks first came into use at Google, they seemed like a hammer fit for every nail—they made it very easy to write highly focused tests against isolated pieces of code without having to worry about how to construct the dependencies of that code. It wasn’t until several years and countless tests later that we began to realize the cost of such tests: though these tests were easy to write, we suffered greatly given that they required constant effort to maintain while rarely finding bugs. The pendulum at Google has now begun swinging in the other direction, with many engineers avoiding mocking frameworks in favor of writing more realistic tests.

+ +

Even though the practices discussed in this chapter are generally agreed upon at Google, the actual application of them varies widely from team to team. This variance stems from engineers having inconsistent knowledge of these practices, inertia in an existing codebase that doesn’t conform to these practices, or teams doing what is easiest for the short term without thinking about the long-term implications.

+
+ +
+

Basic Concepts

+ +

Before we dive into how to effectively use test doubles, let’s cover some of the basic concepts related to them. These build the foundation for best practices that we will discuss later in this chapter. 

+ +
+

An Example Test Double

+ +

Imagine an ecommerce site that needs to process credit card payments. At its core, it might have something like the code shown in A credit card service.

+ +
+
Example 13-1. A credit card service
+ +
class PaymentProcessor {
+  private CreditCardService creditCardService;
+  ...
+  boolean makePayment(CreditCard creditCard, Money amount) {
+    if (creditCard.isExpired()) { return false; }
+    boolean success =
+        creditCardService.chargeCreditCard(creditCard, amount);   
+    return success;
+  }
+}
+
+ +

It would be infeasible to use a real credit card service in a test (imagine all the transaction fees from running the test!), but a test double could be used in its place to simulate the behavior of the real system. The code in A trivial test double shows an extremely simple test double.

+ +
+
Example 13-2. A trivial test double
+ +
class TestDoubleCreditCardService implements CreditCardService {
+ @Override
+ public boolean chargeCreditCard(CreditCard creditCard, Money amount) {
+   return true;
+ }
+}
+
+ +

Although this test double doesn’t look very useful, using it in a test still allows us to test some of the logic in the makePayment() method. For example, in Using the test double, we can validate that the method behaves properly when the credit card is expired because the code path that the test exercises doesn’t rely on the behavior of the credit card service.

+ +
+
Example 13-3. Using the test double
+ +
@Test public void cardIsExpired_returnFalse() {
+  boolean success = paymentProcessor.makePayment(EXPIRED_CARD, AMOUNT);
+  assertThat(success).isFalse();
+}
+
+ +

The following sections in this chapter will discuss how to make use of test doubles in more complex situations than this one.

+
+ +
+

Seams

+ +

Code is said to be testable if it is written in a way that makes it possible to write unit tests for  the code.   A seam is a way to make code testable by allowing for the use of test doubles—it makes it possible to use different dependencies for the system under test rather than the dependencies used in a production environment.

+ +

Dependency injection is a common technique for introducing seams.  In short, when a class utilizes dependency injection, any classes it needs to use (i.e., the class’s dependencies) are passed to it rather than instantiated directly, making it possible for these dependencies to be substituted in tests.

+ +

Dependency injection shows an example of dependency injection. Rather than the constructor creating an instance of CreditCardService, it accepts an instance as a parameter.

+ +
+
Example 13-4. Dependency injection
+ +
class PaymentProcessor {
+  private CreditCardService creditCardService;
+
+  PaymentProcessor(CreditCardService creditCardService) {
+    this.creditCardService = creditCardService;
+  }
+  ...
+}
+
+ +

The code that calls this constructor is responsible for creating an appropriate CreditCardService instance. Whereas the production code can pass in an implementation of CreditCardService that communicates with an external server, the test can pass in a test double, as demonstrated in Passing in a test double.

+ +
+
Example 13-5. Passing in a test double
+ +
PaymentProcessor paymentProcessor =
+    new PaymentProcessor(new TestDoubleCreditCardService());
+
+ +

To reduce boilerplate associated with manually specifying constructors, automated dependency injection frameworks can be used for constructing object graphs automatically.  At Google, Guice and Dagger are automated dependency injection frameworks that are commonly used for Java code.

+ +

With dynamically typed languages such as Python or JavaScript, it is possible to dynamically replace individual functions or object methods. Dependency injection is less important in these languages because this capability makes it possible to use real implementations of dependencies in tests while only overriding functions or methods of the dependency that are unsuitable for tests.

+ +

Writing testable code requires an upfront investment.  It is especially critical early in the lifetime of a codebase because the later testability is taken into account, the more difficult it is to apply to a codebase. Code written without testing in mind typically needs to be refactored or rewritten before you can add appropriate tests.

+
+ +
+

Mocking Frameworks

+ +

A mocking framework is a  software  library that makes it easier to create test doubles within tests; it allows you to replace an object with a mock, which is a test double whose behavior is specified inline in a test. The use of mocking frameworks reduces boilerplate because you don’t need to define a new class each time you need a test double.

+ +

Mocking frameworks demonstrates the  use of Mockito, a mocking framework for Java. Mockito creates a test double for CreditCardService and instructs it to return a specific value.

+ +
+
Example 13-6. Mocking frameworks
+ +
class PaymentProcessorTest {
+  ...
+  PaymentProcessor paymentProcessor;
+
+  // Create a test double of CreditCardService with just one line of code.
+  @Mock CreditCardService mockCreditCardService;
+  @Before public void setUp() {
+    // Pass in the test double to the system under test.
+    paymentProcessor = new PaymentProcessor(mockCreditCardService);
+  }
+  @Test public void chargeCreditCardFails_returnFalse() {
+    // Give some behavior to the test double: it will return false
+    // anytime the chargeCreditCard() method is called. The usage of
+    // “any()†for the method’s arguments tells the test double to
+    // return false regardless of which arguments are passed.
+    when(mockCreditCardService.chargeCreditCard(any(), any())
+       .thenReturn(false);
+    boolean success = paymentProcessor.makePayment(CREDIT_CARD, AMOUNT);
+    assertThat(success).isFalse();
+  }  
+}
+
+ +

Mocking frameworks  exist for most  major programming languages.  At Google, we use Mockito for Java, the googlemock component of Googletest for C++, and unittest.mock for Python. 

+ +

Although mocking frameworks facilitate easier usage of test doubles, they come with some significant caveats given that their overuse will often make a codebase more difficult to maintain. We cover some of these problems later in this chapter.

+
+
+ +
+

Techniques for Using Test Doubles

+ +

There are three primary techniques for using test doubles.  This section presents a brief introduction to these techniques to give you a quick overview of what they are and how they differ. Later sections in this chapter go into more details on how to effectively apply them.

+ +

An engineer who is aware of the distinctions between these techniques is more likely to know the appropriate technique to use when faced with the need to use a test double.

+ +
+

Faking

+ +

A fake is a lightweight implementation of an API that behaves similar  to the real implementation but isn’t suitable  for production; for example, an in-memory database. A simple fake presents an example of faking.

+ +
+
Example 13-7. A simple fake
+ +
// Creating the fake is fast and easy.
+AuthorizationService fakeAuthorizationService =
+    new FakeAuthorizationService();
+AccessManager accessManager = new AccessManager(fakeAuthorizationService):
+
+// Unknown user IDs shouldn’t have access.
+assertFalse(accessManager.userHasAccess(USER_ID));
+
+// The user ID should have access after it is added to
+// the authorization service.
+fakeAuthorizationService.addAuthorizedUser(new User(USER_ID));
+assertThat(accessManager.userHasAccess(USER_ID)).isTrue();
+
+ +

Using a fake is often the ideal technique when you need to use a test double, but a fake might not exist for an object you need to use in a test, and writing one can be challenging because you need to ensure that it has similar behavior to the real implementation, now and in the future.

+
+ +
+

Stubbing

+ +

Stubbing is the process of giving behavior to a function that otherwise has no behavior on its own—you specify to the function exactly what values to return (that is, you stub the return values).  

+ +

Stubbing illustrates stubbing.  The when(...).thenReturn(...) method calls from the Mockito mocking framework specify the behavior of the lookupUser() method.

+ +
+
Example 13-8. Stubbing
+ +
// Pass in a test double that was created by a mocking framework.
+AccessManager accessManager = new AccessManager(mockAuthorizationService):
+
+// The user ID shouldn’t have access if null is returned.
+when(mockAuthorizationService.lookupUser(USER_ID)).thenReturn(null);
+assertThat(accessManager.userHasAccess(USER_ID)).isFalse();
+
+// The user ID should have access if a non-null value is returned.
+when(mockAuthorizationService.lookupUser(USER_ID)).thenReturn(USER);
+assertThat(accessManager.userHasAccess(USER_ID)).isTrue();
+
+ +

Stubbing is typically done  through mocking frameworks to reduce boilerplate that would otherwise be needed for manually creating new classes that hardcode return values.

+ +

Although stubbing can be a quick and simple technique to apply, it has limitations, which we’ll discuss later in this chapter.

+
+ +
+

Interaction Testing

+ +

Interaction testing is a way to validate how a function is called without actually calling the implementation of the function.   A test should fail if a function isn’t called the correct way—for example, if the function isn’t called at all, it’s called too many times, or it’s called with the wrong arguments.

+ +

Interaction testing presents an instance of interaction testing. The verify(...) method from the Mockito mocking framework is used to validate that lookupUser() is called as expected.

+ +
+
Example 13-9. Interaction testing
+ +
// Pass in a test double that was created by a mocking framework.
+AccessManager accessManager = new AccessManager(mockAuthorizationService);
+accessManager.userHasAccess(USER_ID);
+
+// The test will fail if accessManager.userHasAccess(USER_ID) didn’t call
+// mockAuthorizationService.lookupUser(USER_ID).
+verify(mockAuthorizationService).lookupUser(USER_ID);
+
+ +

Similar to stubbing, interaction testing is typically done through mocking frameworks.  This reduces boilerplate compared to manually creating new classes that contain code to keep track of how often a function is called and which arguments were passed in.

+ +

Interaction testing is sometimes called mocking. We avoid this terminology in this chapter because it can be confused with mocking frameworks, which can be used for stubbing as well as for interaction testing. 

+ +

As discussed later in this chapter, interaction testing is useful in certain situations but should be avoided when possible because overuse can easily result in brittle tests. 

+
+
+ +
+

Real Implementations

+ +

Although test doubles can be  invaluable testing tools, our first choice for tests is to use the  real implementations of the system under test’s dependencies; that is, the same implementations that are used in production code. Tests have higher fidelity when they execute code as it will be executed in production, and using real implementations helps accomplish this.

+ +

At Google, the preference for real implementations developed over time as we saw that overuse of mocking frameworks had a tendency to pollute tests with repetitive code that got out of sync with the real implementation and made refactoring difficult. We’ll look at this topic in more detail later in this chapter.

+ +

Preferring real implementations  in tests is known as classical testing. There is also a style of testing known as mockist testing, in which the preference is to use mocking frameworks instead of real implementations.  Even though some people in the software industry practice mockist testing (including the creators of the first mocking frameworks), at Google, we have found that this style of testing is difficult to scale. It requires engineers to follow strict guidelines when designing the system under test, and the default behavior of most engineers at Google has been to write code in a way that is more suitable for the classical testing style.

+ +
+

Prefer Realism Over Isolation

+ +

Using real implementations for dependencies makes the system under test more realistic  given that  all code in these real implementations will be executed in the test. In contrast, a test that utilizes test doubles isolates the system under test from its dependencies so that the test does not execute code in the dependencies of the system under test.

+ +

We prefer realistic tests because they give more confidence that the system under test is working properly. If unit tests rely too much on test doubles, an engineer might need to run integration tests or manually verify that their feature is working as expected in order to gain this same level of confidence. Carrying out these extra tasks can slow down development and can even allow bugs to slip through if engineers skip these tasks entirely when they are too time consuming to carry out compared to running unit tests.

+ +

Replacing all dependencies of a class with test doubles  arbitrarily isolates the system under test to the implementation that the author happens to put directly into the class and excludes implementation that happens to be in different classes. However, a good test should be independent of implementation—it should be written in terms of the API being tested rather than in terms of how the implementation is structured.

+ +

Using real implementations can cause your test to fail if there is a bug in the real implementation. This is good! You want your tests to fail in such cases because it indicates that your code won’t work properly in production.   Sometimes, a bug in a real implementation can cause a cascade of test failures because other tests that use the real implementation might fail, too. But with good developer tools, such as a Continuous Integration (CI) system, it is usually easy to track down the change that caused the failure.

+ + +
+ +
+

How to Decide When to Use a Real Implementation

+ +

A real implementation is preferred if it is fast, deterministic, and has simple dependencies.   For example, a real implementation should be used for a value object. Examples include an amount of money, a date, a geographical address, or a collection class such as a list or a map.

+ +

However, for more complex code, using a real implementation often isn’t feasible. There might not be an exact answer on when to use a real implementation or a test double given that there are trade-offs to be made, so you need to take the following considerations into account.

+ +
+

Execution time

+ +

One of the most important qualities of unit tests is that they  should be fast—you want to  be able to continually  run them during development so that you can get quick feedback on whether your code is working (and you also want them to finish quickly when run in a CI system). As a result, a test double can be very useful when the real implementation is slow.

+ +

How slow is too slow for a unit test? If a real implementation added one millisecond to the running time of each individual test case, few people would classify it as slow. But what if it added 10 milliseconds, 100 milliseconds, 1 second, and so on?

+ +

There is no exact answer here—it can depend on whether engineers feel a loss in productivity, and how many tests are using the real implementation (one second extra per test case may be reasonable if there are five test cases, but not if there are 500). For borderline situations, it is often simpler to use a real implementation until it becomes too slow to use, at which point the tests can be updated to use a test double instead.

+ +

Parellelization of tests  can also help reduce execution time. At Google, our test infrastructure makes it trivial to split up tests in a test suite to be executed across multiple servers. This increases the cost of CPU time, but it can provide a large savings in developer time. We discuss this more in Build Systems and Build Philosophy.

+ +

Another trade-off to be aware of: using a real implementation can result in increased build times given that the tests need to build the real implementation as well as all of its dependencies. Using a highly scalable build system like Bazel can help because it caches unchanged build artifacts.

+
+ +
+

Determinism

+ +

A test is deterministic if, for a given version of the  system under test, running the test always results in the same outcome; that is, the test either always passes or always fails.  In contrast, a test is nondeterministic if its outcome can change, even if the system under test remains unchanged.  

+ +

Nondeterminism in tests can lead to flakiness—tests can occasionally fail even when there are no changes to the system under test.  As discussed in Testing Overview, flakiness harms the health of a test suite if developers start to distrust the results of the test and ignore failures. If use of a real implementation rarely causes flakiness, it might not warrant a response, because there is little disruption to engineers. But if flakiness happens often, it might be time to replace a real implementation with a test double because doing so will improve the fidelity of the test.

+ +

A real implementation can be much more complex compared to a test double, which increases the likelihood that it will be nondeterministic. For example, a real implementation that utilizes multithreading might occasionally cause a test to fail if the output of the system under test differs depending on the order in which the threads are executed.

+ +

A common cause of nondeterminism is code that is not hermetic; that is, it has dependencies  on external services that are outside the control of a test.  For example, a test that tries to read the contents of a web page from an HTTP server might fail if the server is overloaded or if the web page contents change. Instead, a test double should be used to prevent the test from depending on an external server. If using a test double is not feasible, another option is to use a hermetic instance of a server, which has its life cycle controlled by the test. Hermetic instances are discussed in more detail in the next chapter.

+ +

Another example of nondeterminism is code that relies on the system clock given that the output of the system under test can differ depending on the current time. Instead of relying on the system clock, a test can use a test double that hardcodes a specific time.

+
+ +
+

Dependency construction

+ +

When using a real  implementation, you need to construct all of its dependencies.  For example, an object needs its entire dependency tree to be constructed: all objects that it depends on, all objects that these dependent objects depend on, and so on. A test double often has no dependencies, so constructing a test double can be much simpler compared to constructing a real implementation.

+ +

As an extreme example, imagine trying to create the object in the code snippet that follows in a test. It would be time consuming to determine how to construct each individual object. Tests will also require constant maintenance because they need to be updated when the signature of these objects’ constructors is modified:

+ +
Foo foo = new Foo(new A(new B(new C()), new D()), new E(), ..., new Z());
+ +

It can be tempting to instead use a test double because constructing one can be trivial. For example, this is all it takes to construct a test double when using the Mockito mocking framework:

+ +
@Mock Foo mockFoo;
+ +

Although creating this test double is much simpler, there are significant benefits to using the real implementation, as discussed earlier in this section. There are also often significant downsides to overusing test doubles in this way, which we look at later in this chapter. So, a trade-off needs to be made when considering whether to use a real implementation or a test double.

+ +

Rather than manually constructing the object in tests, the ideal solution is to use the same object construction code that is used in the production code, such as a factory method or automated dependency injection. To support the use case for tests, the object construction code needs to be flexible enough to be able to use test doubles rather than hardcoding the  implementations  that will be used  for production. 

+
+
+
+ +
+

Faking

+ +

If using a real implementation is not feasible within a test, the best option is often to use a fake in its place.   A fake is preferred over other test double techniques because it behaves similarly to the real implementation: the system under test shouldn’t even be able to tell whether it is interacting with a real implementation or a fake. A fake file system illustrates a fake file system.

+ +
+
Example 13-11. A fake file system
+ +
// This fake implements the FileSystem interface. This interface is also
+// used by the real implementation.
+public class FakeFileSystem implements FileSystem {
+  // Stores a map of file name to file contents. The files are stored in
+  // memory instead of on disk since tests shouldn’t need to do disk I/O.
+  private Map<String, String> files = new HashMap<>();
+  @Override
+  public void writeFile(String fileName, String contents) {
+    // Add the file name and contents to the map.
+    files.add(fileName, contents);
+  }
+  @Override
+  public String readFile(String fileName) {
+    String contents = files.get(fileName);
+    // The real implementation will throw this exception if the
+    // file isn’t found, so the fake must throw it too.
+    if (contents == null) { throw new FileNotFoundException(fileName); }
+    return contents;
+  }
+}
+
+ +
+

Why Are Fakes Important?

+ +

Fakes can be a powerful tool for testing: they  execute quickly and allow you to effectively test your code without the drawbacks of using real implementations.

+ +

A single  fake has the power to radically improve the testing experience of an API. If you scale that to a large number of fakes for all sorts of APIs, fakes can provide an enormous boost to engineering velocity across a software organization.

+ +

At the other end of the spectrum, in a software organization where fakes are rare, velocity will be slower because engineers can end up struggling with using real implementations that lead to slow and flaky tests. Or engineers might resort to other test double techniques such as stubbing or interaction testing, which, as we’ll examine later in this chapter, can result in tests that are unclear, brittle, and less effective.

+
+ +
+

When Should Fakes Be Written?

+ +

A fake requires more effort and more domain experience to create because it needs to behave similarly to the real implementation.  A fake also requires maintenance: whenever the behavior of the real implementation changes, the fake must also be updated to match this behavior. Because of this, the team that owns the real implementation should write and maintain a fake.

+ +

If a team is considering writing a fake, a trade-off needs to be made on whether the productivity improvements that will result from the use of the fake outweigh the costs of writing and maintaining it. If there are only a handful of users, it might not be worth their time, whereas if there are hundreds of users, it can result in an obvious productivity improvement.

+ +

To reduce the number of fakes that need to be maintained, a fake should typically be created only at the root of the code that isn’t feasible for use in tests. For example, if a database can’t be used in tests, a fake should exist for the database API itself rather than for each class that calls the database API.

+ +

Maintaining a fake can be burdensome if its implementation needs to be duplicated across programming languages, such as for a service that has client libraries that allow the service to be invoked from different languages. One solution for this case is to create a single fake service implementation and have tests configure the client libraries to send requests to this fake service. This approach is more heavyweight compared to having the fake written entirely in memory because it requires the test to communicate across processes. However, it can be a reasonable trade-off to make, as long as the tests can still execute quickly.

+
+ +
+

The Fidelity of Fakes

+ +

Perhaps the most important concept surrounding  the creation of fakes is fidelity; in other words, how  closely the behavior of a fake matches the behavior of the real implementation. If the behavior of a fake doesn’t match the behavior of the real implementation, a test using that fake is not useful—a test might pass when the fake is used, but this same code path might not work properly in the real implementation.

+ +

Perfect fidelity is not always feasible. After all, the fake was necessary because the real implementation wasn’t suitable in one way or another. For example, a fake database would usually not have fidelity to a real database in terms of hard drive storage because the fake would store everything in memory.

+ +

Primarily, however, a fake should maintain fidelity to the API contracts of the real implementation. For any given input to an API, a fake should return the same output and perform the same state changes of its corresponding real implementation. For example, for a real implementation of database.save(itemId), if an item is successfully saved when its ID does not yet exist but an error is produced when the ID already exists, the fake must conform to this same behavior.

+ +

One way to think about this is that the fake must have perfect fidelity to the real implementation, but only from the perspective of the test. For example, a fake for a hashing API doesn’t need to guarantee that the hash value for a given input is exactly the same as the hash value that is generated by the real implementation—tests likely don’t care about the specific hash value, only that the hash value is unique for a given input. If the contract of the hashing API doesn’t make guarantees of what specific hash values will be returned, the fake is still conforming to the contract even if it doesn’t have perfect fidelity to the real implementation.

+ +

Other examples where perfect fidelity typically might not be useful for fakes include latency and resource consumption. However, a fake cannot be used if you need to explicitly test for these constraints (e.g., a performance test that verifies the latency of a function call), so you would need to resort to other mechanisms, such as by using a real implementation instead of a fake.

+ +

A fake might not need to have 100% of the functionality of its corresponding real implementation, especially if such behavior is not needed by most tests (e.g., error handling code for rare edge cases). It is best to have the fake fail fast in this case; for example, raise an error if an unsupported code path is executed. This failure communicates to the engineer that the fake is not appropriate in this situation.

+
+ +
+

Fakes Should Be Tested

+ +

A fake must have its own tests to ensure that it conforms to the API of its corresponding real implementation.   A fake without tests might initially provide realistic behavior, but without tests, this behavior can diverge over time as the real implementation evolves.

+ +

One approach to writing tests for fakes involves writing tests against the API’s public  interface and running those tests against both the real implementation and the fake (these are known as contract tests). The tests that run against the real implementation will likely be slower, but their downside is minimized because they need to be run only by the owners of the fake.

+
+ +
+

What to Do If a Fake Is Not Available

+ +

If a fake is not available, first ask the owners of the API to create one.  The owners might not be familiar with the concept of fakes, or they might not realize the benefit they provide to users of an API.

+ +

If the owners of an API are unwilling or unable to create a fake, you might be able to write your own. One way to do this is to wrap all calls to the API in a single class and then create a fake version of the class that doesn’t talk to the API. Doing this can also be much simpler than creating a fake for the entire API because often you’ll need to use only a subset of the API’s behavior anyway. At Google, some teams have even contributed their fake to the owners of the API, which has allowed other teams to benefit from the fake.

+ +

Finally, you could decide to settle on using a real implementation (and deal with the trade-offs of real implementations that are mentioned earlier in this chapter), or resort to other test double techniques (and deal with the trade-offs that we will mention later in this chapter).

+ +

In some cases, you can think of a fake as an optimization: if tests are too slow using a real implementation, you can create a fake to make them run faster. But if the speedup from a fake doesn’t outweigh the work it would take to create and maintain the fake, it would be better  to stick with  using the real implementation.

+
+
+ +
+

Stubbing

+ +

As discussed earlier in this chapter, stubbing  is a way  for a test to hardcode behavior for a function that otherwise has no behavior on its own. It is often a quick and easy way to replace a real implementation in a test. For example, the code in Using stubbing to simulate responses uses stubbing to simulate the response from a credit card server.

+ +
+
Example 13-12. Using stubbing to simulate responses
+ +
@Test public void getTransactionCount() {
+  transactionCounter = new TransactionCounter(mockCreditCardServer);
+  // Use stubbing to return three transactions.
+  when(mockCreditCardServer.getTransactions()).thenReturn(
+      newList(TRANSACTION_1, TRANSACTION_2, TRANSACTION_3));
+  assertThat(transactionCounter.getTransactionCount()).isEqualTo(3);
+}
+
+ +
+

The Dangers of Overusing Stubbing

+ +

Because stubbing is so easy to apply in tests, it can be tempting to use this technique anytime it’s not trivial to use a real implementation.  However, overuse of stubbing can result in major losses in productivity for engineers who need to maintain these tests.

+ +
+

Tests become unclear

+ +

Stubbing involves writing extra code to define the behavior of the functions being stubbed.  Having this extra code detracts from the intent of the test, and this code can be difficult to understand if you’re not familiar with the implementation of the system under test.

+ +

A key sign that stubbing isn’t appropriate for a test is if you find yourself mentally stepping through the system under test in order to understand why certain functions in the test are stubbed.

+
+ +
+

Tests become brittle

+ +

Stubbing leaks  implementation details of your code into your test.  When implementation details in your production code change, you’ll need to update your tests to reflect these changes. Ideally, a good test should need to change only if user-facing behavior of an API changes; it should remain unaffected by changes to the API’s implementation.

+
+ +
+

Tests become less effective

+ +

With stubbing, there is no way to  ensure the function being stubbed behaves like the real implementation, such as in a statement like that shown in the following snippet that hardcodes part of the contract of the add() method (“If 1 and 2 are passed in, 3 will be returnedâ€):

+ +
when(stubCalculator.add(1, 2)).thenReturn(3);
+ +

Stubbing is a poor choice if the system under test depends on the real implementation’s contract because you will be forced to duplicate the details of the contract, and there is no way to guarantee that the contract is correct (i.e., that the stubbed function has fidelity to the real implementation).

+ +

Additionally, with stubbing there is no way to store state, which can make it difficult to test certain aspects of your code. For example, if you call database.save(item) on either a real implementation or a fake, you might be able to retrieve the item by calling database.get(item.id()) given that both of these calls are accessing internal state, but with stubbing, there is no way to do this.

+
+ +
+

An example of overusing stubbing

+ +

Overuse of stubbing illustrates a test that  overuses stubbing.

+ +
+
Example 13-13. Overuse of stubbing
+ +
@Test public void creditCardIsCharged() {
+  // Pass in test doubles that were created by a mocking framework.
+  paymentProcessor =
+      new PaymentProcessor(mockCreditCardServer, mockTransactionProcessor);
+  // Set up stubbing for these test doubles.
+  when(mockCreditCardServer.isServerAvailable()).thenReturn(true);
+  when(mockTransactionProcessor.beginTransaction()).thenReturn(transaction);
+  when(mockCreditCardServer.initTransaction(transaction)).thenReturn(true);
+  when(mockCreditCardServer.pay(transaction, creditCard, 500))
+      .thenReturn(false);
+  when(mockTransactionProcessor.endTransaction()).thenReturn(true);
+  // Call the system under test.
+  paymentProcessor.processPayment(creditCard, Money.dollars(500));
+  // There is no way to tell if the pay() method actually carried out the
+  // transaction, so the only thing the test can do is verify that the
+  // pay() method was called.
+  verify(mockCreditCardServer).pay(transaction, creditCard, 500);
+}
+
+ +

Refactoring a test to avoid stubbing rewrites the same test but avoids using stubbing. Notice how the test is shorter and that implementation details (such as how the transaction processor is used) are not exposed in the test.  No special setup is needed because the credit card server knows how to behave.

+ +
+
Example 13-14. Refactoring a test to avoid stubbing
+ +
@Test public void creditCardIsCharged() {
+  paymentProcessor = 
+      new PaymentProcessor(creditCardServer, transactionProcessor);
+  // Call the system under test.
+  paymentProcessor.processPayment(creditCard, Money.dollars(500));
+  // Query the credit card server state to see if the payment went through.
+  assertThat(creditCardServer.getMostRecentCharge(creditCard))
+      .isEqualTo(500);
+}
+
+ +

We obviously don’t want such a test to talk to an external credit card server, so a fake credit card server would be more suitable. If a fake isn’t available, another option is to use a real implementation that talks to a hermetic credit card server, although this will increase the execution time of the tests. (We explore hermetic servers in the next chapter.)

+
+
+ +
+

When Is Stubbing Appropriate?

+ +

Rather than a catch-all replacement for a real implementation, stubbing is appropriate  when you need a function to return a specific value to get the system under test into a certain state, such as Using stubbing to simulate responses that requires the system under test to return a non-empty list of transactions. Because a function’s behavior is defined inline in the test, stubbing can simulate a wide variety of return values or errors that might not be possible to trigger from a real implementation or a fake.

+ +

To ensure its purpose is clear, each stubbed function should have a direct relationship with the test’s assertions.  As a result, a test typically should stub out a small number of functions because stubbing out many functions can lead to tests that are less clear. A test that requires many functions to be stubbed can be a sign that stubbing is being overused, or that the system under test is too complex and should be refactored.

+ +

Note that even when stubbing is appropriate, real implementations or fakes are still preferred because they don’t expose implementation details and they give you more guarantees about the correctness of the code compared to stubbing. But stubbing can be a reasonable technique to use, as long as its usage is constrained so that tests don’t become overly complex.  

+
+
+ +
+

Interaction Testing

+ +

As discussed earlier in this chapter, interaction testing is a way to validate how a function  is called without  actually calling the implementation of the function.

+ +

Mocking frameworks make it easy to perform interaction testing. However, to keep tests useful, readable, and resilient to change, it’s important to perform interaction testing only when necessary.

+ +
+

Prefer State Testing Over Interaction Testing

+ +

In contrast to interaction  testing, it is preferred  to test code through state testing.

+ +

With state testing, you call the system under test and validate that either the correct value was returned or that some other state in the system under test was properly changed. State testing presents an example of state testing.

+ +
+
Example 13-15. State testing
+ +
@Test public void sortNumbers() {
+  NumberSorter numberSorter = new NumberSorter(quicksort, bubbleSort);
+  // Call the system under test.
+  List sortedList = numberSorter.sortNumbers(newList(3, 1, 2));
+  // Validate that the returned list is sorted. It doesn’t matter which
+  // sorting algorithm is used, as long as the right result was returned.
+  assertThat(sortedList).isEqualTo(newList(1, 2, 3));
+}
+
+ +

Interaction testing illustrates a similar test scenario but instead uses interaction testing. Note how it’s impossible for this test to determine that the numbers are actually sorted, because the test doubles don’t know how to sort the numbers—all it can tell you is that the system under test tried to sort the numbers.

+ +
+
Example 13-16. Interaction testing
+ +
@Test public void sortNumbers_quicksortIsUsed() {
+  // Pass in test doubles that were created by a mocking framework.
+  NumberSorter numberSorter =
+      new NumberSorter(mockQuicksort, mockBubbleSort);
+
+  // Call the system under test.
+  numberSorter.sortNumbers(newList(3, 1, 2));
+
+  // Validate that numberSorter.sortNumbers() used quicksort. The test
+  // will fail if mockQuicksort.sort() is never called (e.g., if
+  // mockBubbleSort is used) or if it’s called with the wrong arguments.
+  verify(mockQuicksort).sort(newList(3, 1, 2));
+}
+
+ +

At Google, we’ve found that emphasizing state testing is more scalable; it reduces test brittleness, making it easier to change and maintain code over time.

+ +

The primary  issue with interaction testing is that it can’t tell you that the system under test is working properly; it can only validate that certain functions are called as expected. It requires you to make an assumption about the behavior of the code; for example, “If database.save(item) is called, we assume the item will be saved to the database.†State testing is preferred because it actually validates this assumption (such as by saving an item to a database and then querying the database to validate that the item exists).

+ +

Another downside of interaction testing is that it utilizes implementation details of the system under test—to validate that a function was called, you are exposing to the test that the system under test calls this function. Similar to stubbing, this extra code makes tests brittle because it leaks implementation details of your production code into tests. Some people at Google jokingly refer to tests that overuse interaction testing as change-detector tests because they fail in response to any change to the production code, even if the behavior of the system under test remains unchanged.

+
+ +
+

When Is Interaction Testing Appropriate?

+ +

There are some  cases for which interaction testing is warranted:

+ +
    +
  • +

    You cannot perform state testing because you are unable to use a real implementation or a fake (e.g., if the real implementation is too slow and no fake exists). As a fallback, you can perform interaction testing to validate that certain functions are called. Although not ideal, this does provide some basic level of confidence that the system under test is working as expected.

    +
  • +
  • +

    Differences in the number or order of calls to a function would cause undesired behavior. Interaction testing is useful because it could be difficult to validate this behavior with state testing. For example, if you expect a caching feature to reduce the number of calls to a database, you can verify that the database object is not accessed more times than expected. Using Mockito, the code might look similar to this:

    + +
    verify(databaseReader, atMostOnce()).selectRecords();
    +
  • +
+ +

Interaction testing is not a complete replacement for state testing. If you are not able to perform state testing in a unit test, strongly consider supplementing your test suite with larger-scoped tests that do perform state testing. For instance, if you have a unit test that validates usage of a database through interaction testing, consider adding an integration test that can perform state testing against a real database. Larger-scope testing is an important strategy for risk mitigation, and we discuss it in the next chapter.

+
+ +
+

Best Practices for Interaction Testing

+ +

When performing  interaction testing, following these practices can reduce some of the impact of the aforementioned downsides.

+ +
+

Prefer to perform interaction testing only for state-changing functions

+ +

When a system under  test calls a function on a dependency, that  call falls into one of two categories:

+ +
+
State-changing
+
Functions that have side effects on the world outside the system under test. Examples: sendEmail(), saveRecord(), logAccess().
+
Non-state-changing
+
Functions that don’t  have side effects; they return information about the world outside the system under test and don’t modify anything. Examples: getUser(), findResults(), readFile().
+
+ +

In general, you should perform interaction testing only for functions that are state-changing. Performing interaction testing for non-state-changing functions is usually redundant given that the system under test will use the return value of the function to do other work that you can assert. The interaction itself is not an important detail for correctness, because it has no side effects.

+ +

Performing interaction testing for non-state-changing functions makes your test brittle because you’ll need to update the test anytime the pattern of interactions changes. It also makes the test less readable given that the additional assertions make it more difficult to determine which assertions are important for ensuring correctness of the code. By contrast, state-changing interactions represent something useful that your code is doing to change state somewhere else.

+ +

State-changing and non-state-changing interactions demonstrates interaction testing on both state-changing and non-state-changing functions.

+ +
+
Example 13-17. State-changing and non-state-changing interactions
+ +
@Test public void grantUserPermission() {
+  UserAuthorizer userAuthorizer =
+      new UserAuthorizer(mockUserService, mockPermissionDatabase);
+  when(mockPermissionService.getPermission(FAKE_USER)).thenReturn(EMPTY);
+  
+  // Call the system under test.
+  userAuthorizer.grantPermission(USER_ACCESS);
+  
+  // addPermission() is state-changing, so it is reasonable to perform
+  // interaction testing to validate that it was called.
+  verify(mockPermissionDatabase).addPermission(FAKE_USER, USER_ACCESS);
+  
+  // getPermission() is non-state-changing, so this line of code isn’t
+  // needed. One clue that interaction testing may not be needed:
+  // getPermission() was already stubbed earlier in this test.
+  verify(mockPermissionDatabase).getPermission(FAKE_USER);
+}
+
+
+ +
+

Avoid overspecification

+ +

In Unit Testing, we discuss why it is useful to test behaviors rather than methods. This means that a test method should focus  on verifying one behavior of a method or class rather than trying  to verify multiple behaviors in a single test.

+ +

When performing interaction testing, we should aim to apply the same principle by avoiding overspecifying which functions and arguments are validated. This leads to tests that are clearer and more concise. It also leads to tests that are resilient to changes made to behaviors that are outside the scope of each test, so fewer tests will fail if a change is made to a way a function is called.

+ +

Overspecified interaction tests illustrates interaction testing with overspecification. The intention of the test is to validate that the user’s name is included in the greeting prompt, but the test will fail if unrelated behavior is changed.

+ +
+
Example 13-18. Overspecified interaction tests
+ +
@Test public void displayGreeting_renderUserName() {
+  when(mockUserService.getUserName()).thenReturn("Fake User");
+  userGreeter.displayGreeting(); // Call the system under test.
+  
+  // The test will fail if any of the arguments to setText() are changed.
+  verify(userPrompt).setText("Fake User", "Good morning!", "Version 2.1");
+  
+  // The test will fail if setIcon() is not called, even though this
+  // behavior is incidental to the test since it is not related to
+  // validating the user name.
+  verify(userPrompt).setIcon(IMAGE_SUNSHINE);
+}
+
+ +

Well-specified interaction tests illustrates interaction testing with more care in specifying relevant arguments and functions. The behaviors being tested are split into separate tests, and each test validates the minimum amount necessary for ensuring  the behavior it is testing is correct.

+ +
+
Example 13-19. Well-specified interaction tests
+ +
@Test public void displayGreeting_renderUserName() {
+  when(mockUserService.getUserName()).thenReturn("Fake User");
+  userGreeter.displayGreeting(); // Call the system under test.
+  verify(userPrompter).setText(eq("Fake User"), any(), any());
+}
+@Test public void displayGreeting_timeIsMorning_useMorningSettings() {
+  setTimeOfDay(TIME_MORNING);
+  userGreeter.displayGreeting(); // Call the system under test.
+  verify(userPrompt).setText(any(), eq("Good morning!"), any());
+  verify(userPrompt).setIcon(IMAGE_SUNSHINE);
+}
+
+
+
+
+ +
+

Conclusion

+ +

We’ve  learned that  test doubles are crucial to engineering velocity because they can help comprehensively test your code and ensure that your tests run fast. On the other hand, misusing them can be a major drain on productivity because they can lead to tests that are unclear, brittle, and less effective. This is why it’s important for engineers to understand the best practices for how to effectively apply test doubles.

+ +

There is often no exact answer regarding whether to use a real implementation or a test double, or which test double technique to use. An engineer might need to make some trade-offs when deciding the proper approach for their use case.

+ +

Although test doubles are great for working around dependencies that are difficult to use in tests, if you want to maximize confidence in your code, at some point you still want to exercise these dependencies in tests. The next chapter will cover larger-scope testing, for which these dependencies are used regardless of their suitability for unit tests; for example, even if they are slow or nondeterministic.

+
+ +
+

TL;DRs

+ +
    +
  • +

    A real implementation should be preferred over a test double.

    +
  • +
  • +

    A fake is often the ideal solution if a real implementation can’t be used in a test.

    +
  • +
  • +

    Overuse of stubbing leads to tests that are unclear and brittle.

    +
  • +
  • +

    Interaction testing should be avoided when possible: it leads to tests that are brittle because it exposes implementation  details of the system under test.

    +
  • +
+
+
+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch14.html b/clones/abseil.io/resources/swe-book/html/ch14.html new file mode 100644 index 00000000..e2767e81 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch14.html @@ -0,0 +1,838 @@ + + + + + Software Engineering at Google + + + + +
+

Larger Testing

+ + + + + +

In previous chapters, we have recounted how a testing culture was established at Google and how small unit tests became a fundamental part of the developer workflow.  But what about other kinds of tests? It turns out that Google does indeed use many larger tests, and these comprise a significant part of the risk mitigation strategy necessary for healthy software engineering. But these tests present additional challenges to ensure that they are valuable assets and not resource sinks. In this chapter, we’ll discuss what we mean by “larger tests,†when we execute them, and best practices for keeping them effective. 

+ +
+

What Are Larger Tests?

+ +

As mentioned previously, Google has specific notions of test size.  Small tests are restricted to one thread, one process, one machine. Larger tests do not have the same restrictions.  But Google also has notions of test scope. A unit test necessarily is of smaller scope than an integration test.  And the largest-scoped tests (sometimes called end-to-end or system tests) typically involve several real dependencies and fewer test doubles. 

+ +

Larger tests are many things that small tests are not. They are not bound by the same constraints; thus, they can exhibit the  following characteristics:

+ +
    +
  • +

    They may be slow. Our large tests have a default timeout of 15 minutes or 1 hour, but we also have tests that run for multiple hours or even days.

    +
  • +
  • +

    They may be nonhermetic. Large tests may share resources with other tests and traffic.

    +
  • +
  • +

    They may be nondeterministic. If a large test is nonhermetic, it is almost impossible to guarantee determinism: other tests or user state may interfere with it.

    +
  • +
+ +

So why have larger tests? Reflect back on your coding process. How do you confirm that the programs you write actually work?   You might be writing and running unit tests as you go, but do you find yourself running the actual binary and trying it out yourself? And when you share this code with others, how do they test it? By running your unit tests, or by trying it out themselves?

+ +

Also, how do you know that your code continues to work during upgrades? Suppose that you have a site that uses the Google Maps API and there’s a new API version. Your unit tests likely won’t help you to know whether there are any compatibility issues. You’d probably run it and try it out to see whether anything broke.

+ +

Unit tests can give you confidence about individual functions, objects, and modules, but large tests provide more confidence that the overall system works as intended. And having actual automated tests scales in ways that manual testing does not.

+ +
+

Fidelity

+ +

The primary  reason larger tests exist  is to address fidelity. Fidelity is the property by which a test is reflective of the real behavior  of the system under test (SUT).

+ +

One way of envisioning fidelity is in terms of the environment. As Figure 14-1 illustrates, unit tests bundle a test and a small portion of code together as a runnable unit, which ensures the code is tested but is very different from how production code runs. Production itself is, naturally, the environment of highest fidelity in testing. There is also a spectrum of interim options. A key for larger tests is to find the proper fit, because increasing fidelity also comes with increasing costs and (in the case of production) increasing risk of failure.

+ +
Scale of increasing fidelity +
Figure 14-1. Scale of increasing fidelity
+
+ +

Tests can also be measured in terms of how faithful the test content is to reality. Many handcrafted, large tests are dismissed by engineers if the test data itself looks unrealistic. Test data copied from production is much more faithful to reality (having been captured that way), but a big challenge is how to create realistic test traffic before launching the new code.  This is particularly a problem in artificial intelligence (AI), for which the "seed" data often suffers from intrinsic bias. And, because most data for unit tests is handcrafted, it covers a narrow range of cases and tends to conform to the biases of the author. The uncovered scenarios missed by the data represent a fidelity gap in the tests.

+
+ +
+

Common Gaps in Unit Tests

+ +

Larger tests might also be necessary where smaller tests fail.   The subsections that follow present some particular areas where unit tests do not provide good risk mitigation coverage.

+ +
+

Unfaithful doubles

+ +

A single unit test typically covers one class or module.   Test doubles (as discussed in Test Doubles) are frequently used to eliminate heavyweight or hard-to-test dependencies. But when those dependencies are replaced, it becomes possible that the replacement and the doubled thing do not agree.

+ +

Almost all unit tests at Google are written by the same engineer who is writing the unit under test. When those unit tests need doubles and when the doubles used are mocks, it is the engineer writing the unit test defining the mock and its intended behavior. But that engineer usually did not write the thing being mocked and can be misinformed about its actual behavior. The relationship between the unit under test and a given peer is a behavioral contract, and if the engineer is mistaken about the actual behavior, the understanding of the contract is invalid.

+ +

Moreover, mocks become stale.  If this mock-based unit test is not visible to the author of the real implementation and the real implementation changes, there is no signal that the test (and the code being tested) should be updated to keep up with the changes.

+ +

Note that, as mentioned in Test Doubles, if teams provide fakes for their own services, this concern is mostly alleviated.

+
+ +
+

Configuration issues

+ +

Unit tests cover code within a given binary.   But that binary is typically not completely self-sufficient in terms of how it is executed. Usually a binary has some kind of deployment configuration or starter script. Additionally, real end-user-serving production instances have their own configuration files or configuration databases.

+ +

If there are issues with these files or the compatibility between the state defined by these stores and the binary in question, these can lead to major user issues. Unit tests alone cannot verify this compatibility.1 Incidentally, this is a good reason to ensure that your configuration is in version control as well as your code, because then, changes to configuration can be identified as the source of bugs as opposed to introducing random external flakiness and can be built in to large tests.

+ +

At Google, configuration changes are the number one reason for our major outages. This is an area in which we have underperformed and has led to some of our most embarrassing bugs. For example, there was a global Google outage back in 2013 due to a bad network configuration push that was never tested. Configurations tend to be written in configuration languages, not production code languages. They also often have faster production rollout cycles than binaries, and they can be more difficult to test. All of these lead to a higher likelihood of failure. But at least in this case (and others), configuration was version controlled, and we could quickly identify the culprit and mitigate the issue.

+
+ +
+

Issues that arise under load

+ +

At Google, unit tests are intended to be small  and fast because they need to fit into our standard test execution infrastructure and also be run many times as part of a frictionless developer workflow. But performance, load, and stress testing often require sending large volumes of traffic to a given binary. These volumes become difficult to test in the model of a typical unit test. And our large volumes are big, often thousands or millions of queries per second (in the case of ads, real-time bidding)!

+
+ +
+

Unanticipated behaviors, inputs, and side effects

+ +

Unit tests are limited by the imagination of the engineer writing them.  That is, they can only test for anticipated behaviors and inputs.  However, issues that users find with a product are mostly unanticipated (otherwise it would be unlikely that they would make it to end users as issues). This fact suggests that different test techniques are needed to test for unanticipated behaviors.

+ +

Hyrum’s Law is an important consideration here: even if we could test 100% for conformance to a strict, specified contract, the effective user contract applies to all visible behaviors, not just a stated contract.  It is unlikely that unit tests alone test for all visible behaviors that are not specified in the public API.

+
+ +
+

Emergent behaviors and the "vacuum effect"

+ +

Unit tests are limited to the scope that they cover (especially with the widespread use of test doubles), so if behavior changes  in areas outside of this scope, it cannot be detected. And because unit tests are designed to be fast and reliable, they deliberately eliminate the chaos of real dependencies, network, and data.  A unit test is like a problem in theoretical physics: ensconced in a vacuum, neatly hidden from the mess of the real world, which is great for speed and reliability but misses certain  defect  categories.

+
+
+ +
+

Why Not Have Larger Tests?

+ +

In earlier chapters, we discussed many of the properties of a developer-friendly test. In particular,  it needs to be as follows:

+ +
+
Reliable
+
It must not be flaky and it must provide a useful pass/fail signal.
+
Fast
+
It needs to be fast enough to not interrupt the developer workflow.
+
Scalable
+
Google needs to be able to run all such useful affected tests efficiently for presubmits and for post-submits.
+
+ +

Good unit tests exhibit all of these properties.  Larger tests often violate all of these constraints. For example, larger tests are often flakier because they use more infrastructure than does a small unit test. They are also often much slower, both to set up as well as to run. And they have trouble scaling because of the resource and time requirements, but often also because they are not isolated—these tests can collide with one another.

+ +

Additionally, larger tests present two other challenges. First, there is a challenge of ownership. A unit test is clearly owned by the engineer (and team) who owns the unit. A larger test spans multiple units and thus can span multiple owners. This presents a long-term ownership challenge: who is responsible for maintaining the test and who is responsible for diagnosing issues when the test breaks? Without clear ownership, a test rots.

+ +

The second challenge for larger  tests is one of standardization (or the lack thereof). Unlike unit tests, larger tests suffer a lack of standardization in terms of the infrastructure and process by which they are written, run, and debugged. The approach to larger tests is a product of a system’s architectural decisions, thus introducing variance in the type of tests required. For example, the way we build and run A-B diff regression tests in Google Ads is completely different from the way such tests are built and run in Search backends, which is different again from Drive. They use different platforms, different languages, different infrastructures, different libraries, and competing testing frameworks.

+ +

This lack of standardization has a significant impact. Because larger tests have so many ways of being run, they often are skipped  during large-scale changes. (See Large-Scale Changes.) The infrastructure does not have a standard way to run those tests, and asking the people executing LSCs to know the local particulars for testing on every team doesn’t scale. Because larger tests differ in implementation from team to team, tests that actually test the integration between those teams require unifying incompatible infrastructures. And because of this lack of standardization, we cannot teach a single approach to Nooglers (new Googlers) or even more experienced engineers, which both perpetuates the situation and also leads to a lack of understanding about the motivations of such tests.

+
+
+ +
+

Larger Tests at Google

+ +

When we discussed  the history of testing at Google earlier (see Testing Overview), we mentioned how Google Web Server (GWS) mandated automated tests in 2003 and how this was a watershed moment. However, we actually had automated tests in use before this point, but a common practice was using automated large and enormous tests. For example, AdWords created an end-to-end test back in 2001 to validate product scenarios. Similarly, in 2002, Search wrote a similar "regression test" for its indexing code, and AdSense (which had not even publicly launched yet) created its variation on the AdWords test.

+ +

Other "larger" testing patterns also existed circa 2002.  The Google search frontend relied heavily on manual QA—manual versions of end-to-end test scenarios. And Gmail got its version of a "local demo" environment—a script to bring up an end-to-end Gmail environment locally with some generated test users and mail data for local manual testing.

+ +

When C/J Build (our first continuous build framework) launched, it did not distinguish between unit tests and other tests, but there were two critical developments that led to a split. First, Google focused on unit tests because we wanted to encourage the testing pyramid and to ensure the vast majority of written tests were unit tests. Second, when TAP replaced C/J Build as our formal continuous build system, it was only able to do so for tests that met TAP’s eligibility requirements: hermetic tests buildable at a single change that could run on our build/test cluster within a maximum time limit. Although most unit tests satisfied this requirement, larger tests mostly did not. However, this did not stop the need for other kinds of tests, and they have continued to fill the coverage gaps. C/J Build even stuck around for years specifically to handle these kinds of tests until newer systems replaced it.

+ +
+

Larger Tests and Time

+ +

Throughout this book, we have looked at the influence  of time on software engineering, because  Google has built software running for more than 20 years. How are larger tests influenced by the time dimension? We know that certain activities make more sense the longer the expected lifespan of code, and testing of various forms is an activity that makes sense at all levels, but the test types that are appropriate change over the expected lifetime of code.

+ +

As we pointed  out before, unit tests begin to make sense for software with an expected lifespan from hours on up.  At the minutes level (for small scripts), manual testing is most common, and the SUT usually runs locally, but the local demo likely is production, especially for one-off scripts, demos, or experiments. At longer lifespans, manual testing continues to exist, but the SUTs usually diverge because the production instance is often cloud hosted instead of locally hosted.

+ +

The remaining larger tests all provide value for longer-lived software, but the main concern becomes the maintainability of such tests as time increases.

+ +

Incidentally, this time impact might be one reason for the development  of the "ice cream cone" testing antipattern, as mentioned in the Testing Overview and shown again in Figure 14-2.

+ +
The ice cream cone testing antipattern +
Figure 14-2. The ice cream cone testing antipattern
+
+ +

When development starts with manual testing (when engineers think that code is meant to last only for minutes), those manual tests accumulate and dominate the initial overall testing portfolio. For example, it’s pretty typical to hack on a script or an app and test it out by running it, and then to continue to add features to it but continue to test it out by running it manually. This prototype eventually becomes functional and is shared with others, but no automated tests actually exist for it.

+ +

Even worse, if the code is difficult to unit test (because of the way it was implemented in the first place), the only automated tests that can be written are end-to-end ones, and we have inadvertently created "legacy code" within days.

+ +

It is critical for longer-term health to move toward the test pyramid within the first few days of development by building out unit tests, and then to top it off after that point by introducing automated integration tests and moving away from manual end-to-end tests. We succeeded by making unit tests a requirement for submission, but covering the gap between unit tests and manual tests is necessary for long-term health.

+
+ +
+

Larger Tests at Google Scale

+ +

It would seem that larger tests should be more necessary and more appropriate at larger scales of software, but even though  this is so, the complexity of authoring, running, maintaining, and debugging these tests increases with the growth in scale, even more so than with unit tests.

+ +

In a system composed of microservices or separate servers, the pattern of interconnections looks like a graph: let the number of nodes in that graph be our N. Every time a new node is added to this graph, there is a multiplicative effect on the number of distinct execution paths through it.

+ +

Figure 14-3 depicts an imagined SUT: this  system consists of a social network with users, a social graph, a stream of posts, and some ads mixed in. The ads are created by advertisers and served in the context of the social stream.  This SUT alone consists of two groups of users, two UIs, three databases, an indexing pipeline, and six servers. There are 14 edges enumerated in the graph. Testing all of the end-to-end possibilities is already difficult. Imagine if we add more services, pipelines, and databases to this mix: photos and images, machine learning photo analysis, and so on?

+ +
Example of a fairly small SUT: a social network with advertising +
Figure 14-3. Example of a fairly small SUT: a social network with advertising
+
+ +

The rate of distinct scenarios to test in an end-to-end way can grow exponentially or combinatorially depending on the structure of the system under test, and that growth does not scale. Therefore, as the system grows, we must find alternative larger testing strategies to keep things manageable.

+ +

However, the value of such tests also increases because of the decisions that were necessary to achieve this scale. This is an impact of fidelity: as we move toward larger-N layers of software, if the service doubles are lower fidelity (1-epsilon), the chance of bugs when putting it all together is exponential in N. Looking at this example SUT again, if we replace the user server and ad server with doubles and those doubles are low fidelity (e.g., 10% accurate), the likelihood of a bug is 99% (1 – (0.1 ∗ 0.1)). And that’s just with two low-fidelity doubles.

+ +

Therefore, it becomes critical to implement larger tests in ways that work well at this scale but maintain reasonably high fidelity.

+ + +
+
+ +
+

Structure of a Large Test

+ +

Although large tests  are not bound by small  test constraints and could conceivably consist of anything, most large tests exhibit common patterns. Large tests usually consist of a workflow with the following phases:

+ +
    +
  • +

    Obtain a system under test

    +
  • +
  • +

    Seed necessary test data

    +
  • +
  • +

    Perform actions using the system under test

    +
  • +
  • +

    Verify behaviors

    +
  • +
+ +
+

The System Under Test

+ +

One key  component of large tests is the  aforementioned SUT (see Figure 14-5). A typical unit test focuses its attention on one class or module. Moreover, the test code runs in the same process (or Java Virtual Machine [JVM], in the Java case) as the code being tested. For larger tests, the SUT is often very different; one or more separate processes with test code often (but not always) in its own process.

+ +
An example system under test (SUT) +
Figure 14-5. An example system under test (SUT)
+
+ +

At Google, we use many different forms of SUTs, and the scope of the SUT is one of the primary drivers of the scope of the large test itself (the larger the SUT, the larger the test). Each SUT form can be judged based on two primary factors:

+ +
+
Hermeticity
+
This is the SUT’s isolation from usages and interactions from  other components than the test in question. An SUT with high hermeticity will have the least exposure to sources of concurrency and infrastructure flakiness.
+
Fidelity
+
+

The SUT’s accuracy in reflecting the production system being tested.  An SUT with high fidelity will consist of binaries that resemble the production versions (rely on similar configurations, use similar infrastructures, and have a similar overall topology).

+
+
+ +

Often these two factors are in direct conflict.

+ +

Following are some examples of SUTs:

+ +
+
Single-process SUT
+
The entire system  under test is  packaged into a single binary (even if in production these are multiple separate binaries). Additionally, the test code can be packaged into the same binary as the SUT. Such a test-SUT combination can be a "small" test if everything is single-threaded, but it is the least faithful to the production topology and configuration.
+
Single-machine SUT
+
The system under test consists of one or more separate binaries (same as production) and the test is its own binary.  But everything runs on one machine. This is used for "medium" tests. Ideally, we use the production launch configuration of each binary when running those binaries locally for increased fidelity.
+
Multimachine SUT
+
The system under test is distributed  across multiple machines (much like a production cloud deployment). This is even higher fidelity than the single-machine SUT, but its use makes tests "large" size and the combination is susceptible to increased network and machine flakiness.
+
Shared environments (staging and production)
+
Instead of  running a standalone SUT, the test just uses a shared environment. This has the lowest cost because these shared environments usually already exist, but the test might conflict with other simultaneous uses and one must wait for the code to be pushed to those environments. Production also increases the risk of end-user impact.
+
Hybrids
+
Some SUTs represent a mix: it might be  possible to run some of the SUT but have it interact with a shared environment. Usually the thing being tested is explicitly run but its backends are shared. For a company as expansive as Google, it is practically impossible to run multiple copies of all of Google’s interconnected services, so some hybridization is required.
+
+ +
+

The benefits of hermetic SUTs

+ +

The SUT in a large test can be a major source of both unreliability and long turnaround time.  For example, an in-production test uses the actual production system deployment. As mentioned earlier, this is popular because there is no extra overhead cost for the environment, but production tests cannot be run until the code reaches that environment, which means those tests cannot themselves block the release of the code to that environment—the SUT is too late, essentially.

+ +

The most common first alternative is to create a giant shared staging environment and to run tests there. This is usually done as part of some release promotion process, but it again limits test execution to only when the code is available. As an alternative, some teams will allow engineers to "reserve" time in the staging environment and to use that time window to deploy pending code and to run tests, but this does not scale with a growing number of engineers or a growing number of services, because the environment, its number of users, and the likelihood of user conflicts all quickly grow.

+ +

The next step is to support cloud-isolated or machine-hermetic SUTs. Such an environment improves the situation by avoiding the conflicts and reservation requirements for code release.

+ + +
+ +
+

Reducing the size of your SUT at problem boundaries

+ +

There  are particularly painful testing boundaries that might be worth avoiding.  Tests that involve both frontends and backends become painful because user interface (UI) tests are notoriously unreliable and costly:

+ +
    +
  • +

    UIs often change in look-and-feel ways that make UI tests brittle but do not actually impact the underlying behavior.

    +
  • +
  • +

    UIs often have asynchronous behaviors that are difficult to test.

    +
  • +
+ +

Although it is useful to have end-to-end tests of a UI of a service  all the way to its backend, these tests have a multiplicative maintenance cost for both the UI and the backends. Instead, if the backend provides a public API, it is often easier to split the tests into connected tests at the UI/API boundary and to use the public  API to drive the end-to-end tests. This is true whether the UI is a browser, command-line interface (CLI), desktop app, or mobile app.

+ +

Another special boundary is for third-party dependencies. Third-party systems might not have a public shared environment for testing, and in some cases, there is a cost with sending traffic to a third party. Therefore, it is not recommended to have automated tests use a real third-party API, and that dependency is an important seam at which to split tests.

+ +

To address this issue of size, we have made this SUT smaller by replacing its databases with in-memory databases and removing one of the servers outside the scope of the SUT that we actually care about, as shown in Figure 14-6. This SUT is more likely to fit on a single machine.

+ +
A reduced-size SUT +
Figure 14-6. A reduced-size SUT
+
+ +

The key is to identify trade-offs between fidelity and cost/reliability, and to identify reasonable boundaries. If we can run a handful of binaries and a test and pack it all into the same machines that do our regular compiles, links, and unit test executions, we have the easiest and most stable "integration" tests for our engineers.

+
+ +
+

Record/replay proxies

+ +

In the previous chapter, we discussed test doubles and approaches that can be used to decouple the class under test from its difficult-to-test dependencies.   We can also double entire servers and processes by using a mock, stub, or fake server or process with the equivalent API. However, there is no guarantee that the test double used actually conforms to the contract of the real thing that it is replacing.

+ +

One way of dealing with an SUT’s dependent but subsidiary services is to use a test double, but how does one know that the double reflects the dependency’s actual behavior? A growing approach outside of Google is to use a framework for consumer-driven contract tests.  These are tests that define a contract for both the client and the provider of the service, and this contract can drive automated tests. That is, a client defines a mock of the service saying that, for these input arguments, I get a particular output. Then, the real service uses this input/output pair in a real test to ensure that it produces that output given those inputs. Two public tools for consumer-driven contract testing are Pact Contract Testing and Spring Cloud Contracts. Google’s heavy dependency on protocol buffers means that we don’t use these internally.  

+ +

At Google, we do something a little bit different. Our most popular approach (for which there is a public API) is to use a larger test to generate a smaller one by recording the traffic to those external services when running the larger test and replaying it when running smaller tests. The larger, or "Record Mode" test runs continuously on post-submit, but its primary purpose is to generate these traffic logs (it must pass, however, for the logs to be generated). The smaller, or "Replay Mode" test is used during development and presubmit testing.

+ +

One of the interesting aspects of how record/replay works is that, because of nondeterminism, requests must be matched via a matcher to determine which response to replay. This makes them very similar to stubs and mocks in that argument matching is used to determine the resulting behavior.

+ +

What happens for new tests or tests where the client behavior changes significantly? In these cases, a request might no longer match what is in the recorded traffic file, so the test cannot pass in Replay mode. In that circumstance, the engineer must run the test in Record mode to generate new traffic, so it is important to make running Record tests easy, fast, and stable.  

+
+
+ +
+

Test Data

+ +

A test needs data,  and a large test needs two  different kinds of data:

+ +
+
Seeded data
+
Data preinitialized into the system under test reflecting the state of the SUT at the inception of the test 
+
Test traffic
+
Data sent to the system under test  by the test itself during its execution
+
+ +

Because of  the notion of the separate and larger SUT, the work to seed the SUT state is often orders of magnitude more complex than the setup work done in a unit test. For example:

+ +
+
Domain data
+
Some databases contain data prepopulated into tables and used as configuration for the environment. Actual service binaries using such a database may fail on startup if domain data is not provided.
+
Realistic baseline
+
For an SUT to be perceived as realistic, it might require a realistic set of base data at startup, both in terms of quality and quantity. For example, large tests of a social network likely need a realistic social graph as the base state for tests: enough test users with realistic profiles as well as enough interconnections between those users must exist for the testing to be accepted.
+
Seeding APIs
+
The APIs by which data is seeded may be complex. It might be possible to directly write to a datastore, but doing so might bypass triggers and checks performed by the actual binaries that perform the writes.
+
+ +

Data can be generated in different ways, such as the following:

+ +
+
Handcrafted data
+
Like for smaller tests, we can create test data for larger tests by hand. But it might require more work to set up data for multiple services in a large SUT, and we might need to create a lot of data for larger tests.
+
Copied data
+
We can copy data, typically from production. For example, we might test a map of Earth by starting with a copy of our production map data to provide a baseline and then test our changes to it.
+
Sampled data
+
Copying data can provide too much data to reasonably work with. Sampling data can reduce the volume, thus reducing test time and making it easier to reason about. "Smart sampling" consists of techniques to copy the minimum data necessary to achieve maximum coverage.
+
+
+ +
+

Verification

+ +

After an SUT is running and traffic is sent to it, we must still verify the behavior. There are  a few different  ways to do this:

+ +
+
Manual
+

Much like when you try out your binary locally, manual verification uses humans to interact with an SUT to determine whether it functions correctly. This verification can consist of testing for regressions by performing actions as defined on a consistent test plan or it can be exploratory, working a way through different interaction paths to identify possible new failures.

+

Note that manual regression testing does not scale sublinearly: the larger a system grows and the more journeys through it there are, the more human time is needed to manually test.

+
Assertions
+
+

Much  like with unit tests, these are explicit checks about the intended behavior of the system. For example, for an integration test of Google search of xyzzy, an assertion might be as follows:

+ +
assertThat(response.Contains("Colossal Cave"))
+
+
A/B comparison (differential)
+
Instead of defining explicit assertions, A/B testing involves running two copies of the SUT, sending the same data, and comparing the output.   The intended behavior is not explicitly defined: a human must manually go through the differences to ensure any changes are intended. 
+
+
+
+ +
+

Types of Larger Tests

+ +

We can now combine these different approaches to the SUT, data, and assertions to create different kinds of large tests.  Each test then has different properties as to which risks it mitigates; how much toil is required to write, maintain, and debug it; and how much it costs in terms of resources to run.

+ +

What follows is a list of different kinds of large tests that we use at Google, how they are composed, what purpose they serve, and what their limitations are:

+ +
    +
  • +

    Functional testing of one or more binaries

    +
  • +
  • +

    Browser and device testing

    +
  • +
  • +

    Performance, load, and stress testing

    +
  • +
  • +

    Deployment configuration testing

    +
  • +
  • +

    Exploratory testing

    +
  • +
  • +

    A/B diff (regression) testing

    +
  • +
  • +

    User acceptance testing (UAT)

    +
  • +
  • +

    Probers and canary analysis

    +
  • +
  • +

    Disaster recovery and chaos engineering

    +
  • +
  • +

    User evaluation

    +
  • +
+ +

Given such a wide number of combinations and thus a wide range of tests, how do we manage what to do and when? Part of designing software is drafting the test plan, and a key part of the test plan is a strategic outline of what types of testing are needed and how much of each. This test strategy identifies the primary risk vectors and the necessary testing approaches to mitigate those risk vectors.

+ +

At Google, we have a specialized engineering role of "Test Engineer," and one of the things we look for in a good test engineer is the ability to outline a test strategy for our products.

+ +
+

Functional Testing of One or More Interacting Binaries

+ +

Tests of this  type have the  following  characteristics:

+ +
    +
  • +

    SUT: single-machine hermetic  or cloud-deployed isolated

    +
  • +
  • +

    Data: handcrafted

    +
  • +
  • +

    Verification: assertions

    +
  • +
+ +

As we have seen so far, unit tests are not capable of testing a complex system with true fidelity, simply because they are packaged in a different way than the real code is packaged. Many functional testing scenarios interact with a given binary differently than with classes inside that binary, and these functional tests require separate SUTs and thus are canonical, larger tests.

+ +

Testing the interactions of multiple binaries is, unsurprisingly, even more complicated than testing a single binary. A common use case is within microservices environments when services are deployed as many separate binaries. In this case, a functional test can cover the real interactions between the binaries by bringing up an SUT composed of all the relevant binaries and by interacting with it through a published API.

+
+ +
+

Browser and Device Testing

+ +

Testing web UIs  and mobile applications is a special  case of functional testing of one or more interacting binaries.  It is possible to unit test the underlying code, but for the end users, the public API is the application itself. Having tests that interact with the application as a third party through its frontend provides an extra layer of coverage.

+
+ +
+

Performance, Load, and Stress testing

+ +

Tests of this type have the  following characteristics:

+ +
    +
  • +

    SUT: cloud-deployed isolated

    +
  • +
  • +

    Data: handcrafted or multiplexed from production

    +
  • +
  • +

    Verification: diff (performance metrics)

    +
  • +
+ +

Although it is  possible to  test a small unit in terms  of performance, load, and stress, often such tests require sending simultaneous traffic to an external API. That definition implies that such tests are multithreaded tests that usually test at the scope of a binary under test. However, these tests are critical for ensuring that there is no degradation in performance between versions and that the system can handle expected spikes in traffic.

+ +

As the scale of the load test grows, the scope of the input data also grows, and it eventually becomes difficult to generate the scale of load required to trigger bugs under load. Load and stress handling are "highly emergent" properties of a system; that is, these complex behaviors belong to the overall system but not the individual members. Therefore, it is important to make these tests look as close to production as possible. Each SUT requires resources akin to what production requires, and it becomes difficult to mitigate noise from the production topology.

+ +

One area of research for eliminating noise in performance tests is in modifying the deployment topology—how the various binaries are distributed across a network of machines. The machine running a binary can affect the performance characteristics; thus, if in a performance diff test, the base version runs on a fast machine (or one with a fast network) and the new version on a slow one, it can appear like a performance regression. This characteristic implies that the optimal deployment is to run both versions on the same machine. If a single machine cannot fit both versions of the binary, an alternative is to calibrate by performing multiple runs and removing peaks and valleys.

+
+ +
+

Deployment Configuration Testing

+ +

Tests of this  type have the  following characteristics:

+ +
    +
  • +

    SUT: single-machine hermetic or cloud-deployed isolated

    +
  • +
  • +

    Data: none

    +
  • +
  • +

    Verification: assertions (doesn’t crash)

    +
  • +
+ +

Many times, it is not the code that is the source of defects but instead configuration: data files, databases, option definitions, and so on. Larger tests can test the integration of the SUT with its configuration files because these configuration files are read during the launch of the given binary.

+ +

Such a test is really a smoke test of the SUT without needing much in the way of additional data or verification. If the SUT starts successfully, the test passes. If not, the test fails.

+
+ +
+

Exploratory Testing

+ +

Tests of this type  have the following  characteristics:

+ +
    +
  • +

    SUT: production or shared staging

    +
  • +
  • +

    Data: production or a known test universe

    +
  • +
  • +

    Verification: manual

    +
  • +
+ +

Exploratory testing2 is a form of manual testing that focuses not on looking for behavioral regressions by repeating known test flows, but on looking for questionable behavior by trying out new user scenarios. Trained users/testers interact with a product through its public APIs, looking for new paths through the system and for which behavior deviates from either expected or intuitive behavior, or if there are security vulnerabilities.

+ +

Exploratory testing is useful for both new and launched systems to uncover unanticipated behaviors and side effects. By having testers follow different reachable paths through the system, we can increase the system coverage and, when these testers identify bugs, capture new automated functional tests. In a sense, this is a bit like a manual "fuzz testing" version of functional integration testing.

+ +
+

Limitations

+ +

Manual testing does not scale sublinearly; that is, it requires human time to perform the manual tests. Any defects found by exploratory tests should be replicated with an automated test that can run much more frequently.

+
+ +
+

Bug bashes

+ +

One common approach we use for manual  exploratory testing is the bug bash. A team of engineers and related personnel (managers, product managers, test engineers, anyone with familiarity with the product) schedules a "meeting," but at this session, everyone involved manually tests the product. There can be some published guidelines as to particular focus areas for the bug bash and/or starting points for using the system, but the goal is to provide enough interaction variety to document questionable product behaviors and outright bugs.

+
+
+ +
+

A/B Diff Regression Testing

+ +

Tests of  these type have  the following  characteristics:

+ +
    +
  • +

    SUT: two cloud-deployed isolated environments

    +
  • +
  • +

    Data: usually multiplexed from production or sampled

    +
  • +
  • +

    Verification: A/B diff comparison

    +
  • +
+ +

Unit tests cover expected behavior paths for a small section of code. But it is impossible to predict many of the possible failure modes for a given publicly facing product. Additionally, as Hyrum’s Law states, the actual public API is not the declared one but all user-visible aspects of a product. Given those two properties, it is no surprise that A/B diff tests are possibly the most common form of larger testing at Google. This approach conceptually dates back to 1998. At Google, we have been running tests based on this model since 2001 for most of our products, starting with Ads, Search, and Maps.

+ +

A/B diff tests operate by sending traffic to a public API and comparing the responses between old and new versions (especially during migrations). Any deviations in behavior must be reconciled as either anticipated or unanticipated (regressions). In this case, the SUT is composed of two sets of real binaries: one running at the candidate version and the other running at the base version. A third binary sends traffic and compares the results.

+ +

There are other variants. We use A-A testing (comparing a system to itself) to identify nondeterministic behavior, noise, and flakiness, and to help remove those from A-B diffs. We also occasionally use A-B-C testing, comparing the last production version, the baseline build, and a pending change, to make it easy at one glance to see not only the impact of an immediate change, but also the accumulated impacts of what would be the next-to-release version.

+ +

A/B diff tests are a cheap but automatable way to detect unanticipated side effects for any launched system.

+ +
+

Limitations

+ +

Diff testing does introduce a few  challenges to solve:

+ +
+
Approval
+
Someone must understand the results enough to know whether any differences are expected. Unlike a typical test, it is not clear whether diffs are a good or bad thing (or whether the baseline version is actually even valid), and so there is often a manual step in the process.
+
Noise
+
For a diff test, anything that introduces unanticipated noise into the results leads to more manual investigation of the results. It becomes necessary to remediate noise, and this is a large source of complexity in building a good diff test.
+
Coverage
+
Generating enough useful traffic for a diff test can be a challenging problem. The test data must cover enough scenarios to identify corner-case differences, but it is difficult to manually curate such data.
+
Setup
+
Configuring and maintaining one SUT is fairly challenging. Creating two at a time can double the complexity, especially if these share interdependencies.
+
+
+
+ +
+

UAT

+ +

Tests of this type have the  following  characteristics:

+ +
    +
  • +

    SUT: machine-hermetic or cloud-deployed isolated

    +
  • +
  • +

    Data: handcrafted

    +
  • +
  • +

    Verification: assertions

    +
  • +
+ +

A key aspect of unit tests is that they are written by the developer writing the code under test. But that makes it quite likely that misunderstandings about the intended behavior of a product are reflected not only in the code, but also the unit tests. Such unit tests verify that code is "Working as implemented" instead of "Working as intended."

+ +

For cases in which there is either a specific end customer or a customer proxy (a customer committee or even a product manager), UATs are automated tests that exercise the product through public APIs to ensure the overall behavior for specific user journeys is as intended. Multiple public frameworks exist (e.g., Cucumber and RSpec) to make such tests writable/readable in a user-friendly language, often in the context of "runnable specifications."

+ +

Google does not actually do a lot of automated UAT and does not use specification languages very much. Many of Google’s products historically have been created by the software engineers themselves. There has been little need for runnable specification languages because those defining the intended product behavior are often fluent in the actual coding languages themselves.

+
+ +
+

Probers and Canary Analysis

+ +

Tests of this type have the  following characteristics:

+ +
    +
  • +

    SUT: production

    +
  • +
  • +

    Data: production

    +
  • +
  • +

    Verification: assertions and A/B diff (of metrics)

    +
  • +
+ +

Probers and canary analysis are ways to ensure  that the production environment itself is healthy.  In these respects, they are a form of production monitoring, but they are structurally very similar to other large tests.

+ +

Probers are functional tests that run encoded assertions against the production environment. Usually these tests perform well-known and deterministic read-only actions so that the assertions hold even though the production data changes over time. For example, a prober might perform a Google search at www.google.com and verify that a result is returned, but not actually verify the contents of the result. In that respect, they are "smoke tests" of the production system, but they provide early detection of major issues.

+ +

Canary analysis is similar, except that it focuses on when a release is being pushed to the production environment. If the release is staged over time, we can run both prober assertions targeting the upgraded (canary) services as well as compare health metrics of both the canary and baseline parts of production and make sure that they are not out of line.

+ +

Probers should be used in any live system. If the production rollout process includes a phase in which the binary is deployed to a limited subset of the production machines (a canary phase), canary analysis should be used during that procedure.

+ +
+

Limitations

+ +

Any issues caught at this point in time (in production) are already affecting end users.

+ +

If a prober performs a mutable (write) action, it will modify the state of production. This could lead to one of three outcomes: nondeterminism and failure of the assertions, failure of the ability to write in the future, or user-visible side effects.

+
+
+ +
+

Disaster Recovery and Chaos Engineering

+ +

Tests of this type have the  following characteristics:

+ +
    +
  • +

    SUT: production

    +
  • +
  • +

    Data: production and user-crafted (fault injection)

    +
  • +
  • +

    Verification: manual and A/B diff (metrics)

    +
  • +
+ +

These test how well your systems will react to unexpected changes or failures.

+ +

For years, Google has run  an annual war game called DiRT (Disaster Recovery Testing) during which faults are injected into our infrastructure at a nearly planetary scale. We simulate everything from datacenter fires to malicious attacks. In one memorable case, we simulated an earthquake that completely isolated our headquarters in Mountain View, California, from the rest of the company. Doing so exposed not only technical shortcomings but also revealed the challenge of running a company when all the key decision makers were unreachable.3

+ +

The impacts of DiRT tests require a lot of coordination across the company; by contrast, chaos engineering is more of a “continuous testing†for your technical infrastructure.  Made popular by Netflix, chaos engineering involves writing programs that continuously introduce a background level of faults into your systems and seeing what happens. Some of the faults can be quite large, but in most cases, chaos testing tools are designed to restore functionality before things get out of hand. The goal of chaos engineering is to help teams break assumptions of stability and reliability and help them grapple with the challenges of building resiliency in. Today, teams at Google perform thousands of chaos tests each week using our own home-grown system called Catzilla.

+ +

These kinds of fault and negative tests make sense for live production systems that have enough theoretical fault tolerance to support them and for which the costs and risks of the tests themselves are affordable.

+ +
+

Limitations

+ +

Any issues caught at this point in time (in production) are already affecting end users.

+ +

DiRT is quite expensive to run, and therefore we run a coordinated exercise on an infrequent scale. When we create this level of outage, we actually cause pain and negatively impact employee performance.

+ +

As with a prober, if a DiRT test performs a mutable (write) action, it will modify the state of production. This could lead to either nondeterminism and failure of the assertions, failure of the ability to write in the future, or user-visible side effects.

+
+
+ +
+

User Evaluation

+ +

Tests of this  type have the  following characteristics:

+ +
    +
  • +

    SUT: production

    +
  • +
  • +

    Data: production

    +
  • +
  • +

    Verification: manual and A/B diffs (of metrics)

    +
  • +
+ +

Production-based testing makes it possible to collect a lot of data about user behavior. We have a few different ways to collect metrics about the popularity of and issues with upcoming features, which provides us with an alternative to UAT:

+ +
+
Dogfooding
+
It’s possible using limited rollouts and experiments to make features in production available to a subset of users. We do this with our own staff sometimes (eat our own dogfood), and they give us valuable feedback in the real deployment environment.
+
Experimentation
+

A new behavior is made available as an experiment to a subset of users without their knowing. Then, the experiment group is compared to the control group at an aggregate level in terms of some desired metric. For example, in YouTube, we had a limited experiment changing the way video upvotes worked (eliminating the downvote), and only a portion of the user base saw this change.

+

This is a massively important approach for Google. One of the first stories a Noogler hears upon joining the company is about the time Google launched an experiment changing the background shading color for AdWords ads in Google Search and noticed a significant increase in ad clicks for users in the experimental group versus the control group.

+
Rater evaluation
+
Human raters are presented with results for a given operation and choose which one is "better" and why. This feedback is then used to determine whether a given change is positive, neutral, or negative. For example, Google has historically used rater evaluation for search queries (we have published the guidelines we give our raters). In some cases, the feedback from this ratings data can help determine launch go/no-go for algorithm changes. Rater evaluation is critical for nondeterministic systems like machine learning systems for which there is no clear correct answer, only a notion of better or worse. 
+
+
+
+ +
+

Large Tests and the Developer Workflow

+ +

We’ve talked about what  large tests are, why to have  them, when to have them, and how much to have, but we have not said much about the who. Who writes the tests? Who runs the tests and investigates the failures? Who owns the tests? And how do we make this tolerable?

+ +

Although standard unit test infrastructure might not apply, it is still critical to integrate larger tests into the developer workflow. One way of doing this is to ensure that automated mechanisms for presubmit and post-submit execution exist, even if these are different mechanisms than the unit test ones. At Google, many of these large tests do not belong in TAP. They are nonhermetic, too flaky, and/or too resource intensive. But we still need to keep them from breaking or else they provide no signal and become too difficult to triage. What we do, then, is to have a separate post-submit continuous build for these. We also encourage running these tests presubmit, because that provides feedback directly to the author.

+ +

A/B diff tests that require manual blessing of diffs can also be incorporated into such a workflow.  For presubmit, it can be a code-review requirement to approve any diffs in the UI before approving the change. One such test we have files release-blocking bugs automatically if code is submitted with unresolved diffs.

+ +

In some cases, tests are so large or painful that presubmit execution adds too much developer friction. These tests still run post-submit and are also run as part of the release process. The drawback to not running these presubmit is that the taint makes it into the monorepo and we need to identify the culprit change to roll it back. But we need to make the trade-off between developer pain and the incurred change latency and the reliability of the continuous build.

+ +
+

Authoring Large Tests

+ +

Although the  structure of large tests is fairly standard, there  is still a challenge with creating such a test, especially  if it is the first time someone on the team has done so.

+ +

The best way to make it possible to write such tests is to have clear libraries, documentation, and examples. Unit tests are easy to write because of native language support (JUnit was once esoteric but is now mainstream).  We reuse these assertion libraries for functional integration tests, but we also have created over time libraries for interacting with SUTs, for running A/B diffs, for seeding test data, and for orchestrating test workflows. 

+ +

Larger tests are more expensive to maintain, in both resources and human time, but not all large tests are created equal. One reason that A/B diff tests are popular is that they have less human cost in maintaining the verification step. Similarly, production SUTs have less maintenance cost than isolated hermetic SUTs.  And because all of this authored infrastructure and code must be maintained, the cost savings can compound.

+ +

However, this cost must be looked at holistically. If the cost of manually reconciling diffs or of supporting and safeguarding production testing outweighs the savings, it becomes ineffective.

+
+ +
+

Running Large Tests

+ +

We mentioned above how our larger tests don’t fit in TAP and so we have alternate continuous builds and presubmits for them.    One of the initial challenges for our engineers is how to even run nonstandard tests and how to iterate on them.

+ +

As much as possible, we have tried to make our larger tests run in ways familiar for our engineers. Our presubmit infrastructure puts a common API in front of both running these tests and running TAP tests, and our code review infrastructure shows both sets of results. But many large tests are bespoke and thus need specific documentation for how to run them on demand. This can be a source of frustration for unfamiliar engineers.

+ +
+

Speeding up tests

+ +

Engineers  don’t wait for slow tests.    The slower a test is, the less frequently an engineer will run it, and the longer the wait after a failure until it is passing again.

+ +

The best way to speed up a test is often to reduce its scope or to split a large test into two smaller tests that can run in parallel. But there are some other tricks that you can do to speed up larger tests.

+ +

Some naive tests will use time-based sleeps to wait for nondeterministic action to occur, and this is quite common in larger tests. However, these tests do not have thread limitations, and real production users want to wait as little as possible, so it is best for tests to react the way real production users would. Approaches include the following:

+ +
    +
  • +

    Polling for a state transition repeatedly over a time window for an event to complete with a frequency closer to microseconds. You can combine this with a timeout value in case a test fails to reach a stable state.

    +
  • +
  • +

    Implementing an event handler.

    +
  • +
  • +

    Subscribing to a notification system for an event completion.

    +
  • +
+ +

Note that tests that rely on sleeps and timeouts will all start failing when the fleet running those tests becomes overloaded, which spirals because those tests need to be rerun more often, increasing the load further.

+ +
+
Lower internal system timeouts and delays
+
+

A production system is usually configured assuming a distributed deployment topology, but an SUT might be deployed on a single machine (or at least a cluster of colocated machines). If there are hardcoded timeouts or (especially) sleep statements in the production code to account for production system delay, these should be made tunable and reduced when running tests.

+
+
Optimize test build time
+
+

One downside of our monorepo is that all of the dependencies for a large test are built and provided as inputs, but this might not be necessary for some larger tests. If the SUT is composed of a core part that is truly the focus of the test and some other necessary peer binary dependencies, it might be possible to use prebuilt versions of those other binaries at a known good version. Our build system (based on the monorepo) does not support this model easily, but the approach is actually more reflective of production in which different services release at different versions.

+
+
+
+ +
+

Driving out flakiness

+ +

Flakiness is bad enough  for unit tests, but for larger tests, it can make them unusable.  A team should view eliminating flakiness of such tests as a high priority. But how can flakiness be removed from such tests?

+ +

Minimizing flakiness starts with reducing the scope of the test—a hermetic SUT will not be at risk of the kinds of multiuser and real-world flakiness of production or a shared staging environment, and a single-machine hermetic SUT will not have the network and deployment flakiness issues of a distributed SUT. But you can mitigate other flakiness issues through test design and implementation and other techniques. In some cases, you will need to balance these with test speed.

+ +

Just as making tests reactive or event driven can speed them up, it can also remove flakiness. Timed sleeps require timeout maintenance, and these timeouts can be embedded in the test code. Increasing internal system timeouts can reduce flakiness, whereas reducing internal timeouts can lead to flakiness if the system behaves in a nondeterministic way. The key here is to identify a trade-off that defines both a tolerable system behavior for end users (e.g., our maximum allowable timeout is n seconds) but handles flaky test execution behaviors well.

+ +

A bigger problem with internal system timeouts is that exceeding them can lead to difficult errors to triage. A production system will often try to limit end-user exposure to catastrophic failure by handling possible internal system issues gracefully. For example, if Google cannot serve an ad in a given time limit, we don’t return a 500, we just don’t serve an ad. But this looks to a test runner as if the ad-serving code might be broken when there is just a flaky timeout issue. It’s important to make the failure mode obvious in this case and to make it easy to tune such internal timeouts for test scenarios.

+
+ +
+

Making tests understandable

+ +

A specific case for  which it can be difficult  to integrate  tests into the developer workflow is when those tests produce results that are unintelligible to the engineer running the tests. Even unit tests can produce some confusion—if my change breaks your test, it can be difficult to understand why if I am generally unfamiliar with your code—but for larger tests, such confusion can be insurmountable. Tests that are assertive must provide a clear pass/fail signal and must provide meaningful error output to help triage the source of failure. Tests that require human investigation, like A/B diff tests, require special handling to be meaningful or else risk being skipped during presubmit.

+ +

How does this work in practice? A good  large test that fails should do the following:

+ +
+
Have a message that clearly identifies what the failure is
+
The worst-case scenario is to have an error that just says "Assertion failed" and a stack trace. A good error anticipates the test runner’s unfamiliarity with the code and provides a message that gives context: "In test_ReturnsOneFullPageOfSearchResultsForAPopularQuery, expected 10 search results but got 1." For a performance or A/B diff test that fails, there should be a clear explanation in the output of what is being measured and why the behavior is considered suspect.
+
Minimize the effort necessary to identify the root cause of the discrepancy
+
A stack trace is not useful for larger tests because the call chain can span multiple process boundaries. Instead, it’s necessary to produce a trace across the call chain or to invest in automation that can narrow down the culprit. The test should produce some kind of artifact to this effect. For example, Dapper is a framework used by Google to associate a single request ID with all the requests in an RPC call chain, and all of the associated logs for that request can be correlated by that ID to facilitate tracing.
+
Provide support and contact information.
+
It should be easy for the test runner to get help by making the owners and supporters of the test easy to contact.  
+
+
+
+ +
+

Owning Large Tests

+ +

Larger tests must have  documented  owners—engineers who can adequately review changes to the test and who can be counted on to provide support in the case of test failures. Without proper ownership, a test can fall victim to the following:

+ +
    +
  • +

    It becomes more difficult for contributors to modify and update the test

    +
  • +
  • +

    It takes longer to resolve test failures

    +
  • +
+ +

And the test rots.

+ +

Integration tests of components within a particular project should be owned by the project lead. Feature-focused tests (tests that cover a particular business feature across a set of services) should be owned by a "feature owner"; in some cases, this owner might be a software engineer responsible for the feature implementation end to end; in other cases it might be a product manager or a "test engineer" who owns the description of the business scenario. Whoever owns the test must be empowered to ensure its overall health and must have both the ability to support its maintenance and the incentives to do so.

+ +

It is possible to build automation around test owners if this information is recorded in a structured way. Some approaches that we use include the following:

+ +
+
Regular code ownership
+
In many cases, a larger test is a standalone code artifact that lives in a particular location in our codebase. In that case, we can use the OWNERS (Code Review) information already present in the monorepo to hint to automation that the owner(s) of a particular test are the owners of the test code.
+
Per-test annotations
+
In some cases, multiple test methods  can be added to a single test class or module, and each of these test methods can have a different feature owner. We use per-language structured annotations to document the test owner in each of these cases so that if a particular test method fails, we can identify the owner to contact.  
+
+
+
+ +
+

Conclusion

+ +

A comprehensive test suite requires larger tests, both to ensure that tests match the fidelity of the system under test and to address issues that unit tests cannot adequately cover. Because such tests are necessarily more complex and slower to run, care must be taken to ensure such larger tests are properly owned, well maintained, and run when necessary (such as before deployments to production). Overall, such larger tests must still be made as small as possible (while still retaining fidelity) to avoid developer friction. A comprehensive test strategy that identifies the risks of a system, and the larger tests that address them, is necessary for most software projects.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Larger tests cover things unit tests cannot.

    +
  • +
  • +

    Large tests are composed of a System Under Test, Data, Action, and Verification.

    +
  • +
  • +

    A good design includes a test strategy that identifies risks and larger tests that mitigate them.

    +
  • +
  • +

    Extra effort must be made with larger tests to keep them from creating friction in the developer workflow. 

    +
  • +
+
+

1See Continuous Delivery and Compute as a Service for more information.

2James A. Whittaker, Exploratory Software Testing: Tips, Tricks, Tours, and Techniques to Guide Test Design (New York: Addison-Wesley Professional, 2009).

3During this test, almost no one could get anything done, so many people gave up on work and went to one of our many cafes, and in doing so, we ended up creating a DDoS attack on our cafe teams!

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch15.html b/clones/abseil.io/resources/swe-book/html/ch15.html new file mode 100644 index 00000000..9990c758 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch15.html @@ -0,0 +1,237 @@ + + + + + Software Engineering at Google + + + + +
+

Deprecation

+ + + + + +
+

I love deadlines. I like the whooshing sound they make as they fly by.

+ +

Douglas Adams

+
+ +

All systems age.  Even though software is a digital asset and the physical bits themselves don’t degrade, new technologies, libraries, techniques, languages, and other environmental changes over time render existing systems obsolete. Old systems require continued maintenance, esoteric expertise, and generally more work as they diverge from the surrounding ecosystem. It’s often better to invest effort in turning off obsolete systems, rather than letting them lumber along indefinitely alongside the systems that replace them. But the number of obsolete systems still running suggests that, in practice, doing so is not trivial. We refer to the process of orderly migration away from and eventual removal of obsolete systems as deprecation.

+ +

Deprecation is yet another topic that more accurately  belongs to the discipline of software engineering than programming because it requires thinking about how to manage a system over time. For long-running software ecosystems, planning for and executing deprecation correctly reduces resource costs and improves velocity by removing the redundancy and complexity that builds up in a system over time. On the other hand, poorly deprecated systems may cost more than leaving them alone. While deprecating systems requires additional effort, it’s possible to plan for deprecation during the design of the system so that it’s easier to eventually decommission and remove it. Deprecations can affect systems ranging from individual function calls to entire software stacks. For concreteness, much of what follows focuses on code-level deprecations.

+ +

Unlike with most of the other topics we have discussed in this book, Google is still learning how best to deprecate and remove software systems. This chapter describes the lessons we’ve learned as we’ve deprecated large and heavily used internal systems. Sometimes, it works as expected, and sometimes it doesn’t, but the general problem of removing obsolete systems remains a difficult and evolving concern in the industry.

+ +

This chapter primarily deals with deprecating technical systems, not end-user products. The distinction is somewhat arbitrary given that an external-facing API is just another sort of product, and an internal API may have consumers that consider themselves end users. Although many of the principles apply to turning down a public product, we concern ourselves here with the technical and policy aspects of deprecating and removing obsolete systems where the system owner has visibility into its use.

+ +
+

Why Deprecate?

+ +

Our discussion of deprecation  begins from the fundamental premise that code is a liability, not an asset. After all, if code were an asset, why should we even bother spending time trying to turn down and remove obsolete systems? Code has costs, some of which are borne in the process of creating a system, but many other costs are borne as a system is maintained across its lifetime. These ongoing costs, such as the operational resources required to keep a system running or the effort to continually update its codebase as surrounding ecosystems evolve, mean that it’s worth evaluating the trade-offs between keeping an aging system running or working to turn it down.

+ +

The age of a system alone doesn’t justify its deprecation. A system could be finely crafted over several years to be the epitome of software form and function. Some software systems, such as the LaTeX typesetting system, have been improved over the course of decades, and even though changes still happen, they are few and far between. Just because something is old, it does not follow that it is obsolete.

+ +

Deprecation is best suited for systems that are demonstrably obsolete and a replacement exists that provides comparable functionality. The new system might use resources more efficiently, have better security properties, be built in a more sustainable fashion, or just fix bugs. Having two systems to accomplish the same thing might not seem like a pressing problem, but over time, the costs of maintaining them both can grow substantially. Users may need to use the new system, but still have dependencies that use the obsolete one.

+ +

The two systems might need to interface with each other, requiring complicated transformation code. As both systems evolve, they may come to depend on each other, making eventual removal of either more difficult. In the long run, we’ve discovered that having multiple systems performing the same function also impedes the evolution of the newer system because it is still expected to maintain compatibility with the old one. Spending the effort to remove the old system can pay off as the replacement system can now evolve more quickly.

+ + + +

Even though deprecation is useful, we’ve learned at Google that organizations have a limit on the amount of deprecation work that is reasonable to undergo simultaneously, from the aspect of the teams doing the deprecation as well as the customers of those teams. For example, although everybody appreciates having freshly paved roads, if the public works department decided to close down every road for paving simultaneously, nobody would go anywhere. By focusing their efforts, paving crews can get specific jobs done faster while also allowing other traffic to make progress. Likewise, it’s important to choose deprecation projects with care and then commit to following through on finishing them.

+
+ +
+

Why Is Deprecation So Hard?

+ +

We’ve mentioned Hyrum’s Law  elsewhere in this book, but it’s worth repeating its applicability here: the more users of a system, the higher  the probability that users are using it in unexpected and unforeseen ways, and the harder it will be to deprecate and remove such a system. Their usage just “happens to work†instead of being “guaranteed to work.†In this context, removing a system can be thought of as the ultimate change: we aren’t just changing behavior, we are removing that behavior completely! This kind of radical alteration will shake loose a number of unexpected dependents.

+ +

To further complicate matters, deprecation usually isn’t an option until a newer system is available that provides the same (or better!) functionality. The new system might be better, but it is also different: after all, if it were exactly the same as the obsolete system, it wouldn’t provide any benefit to users who migrate to it (though it might benefit the team operating it). This functional difference means a one-to-one match between the old system and the new system is rare, and every use of the old system must be evaluated in the context of the new one.

+ +

Another surprising reluctance to deprecate is emotional attachment to old systems, particularly those that the deprecator had a hand in helping to create. An example of this change aversion happens when systematically removing old code at Google: we’ve occasionally encountered resistance of the form “I like this code!†It can be difficult to convince engineers to tear down something they’ve spent years building. This is an understandable response, but ultimately self-defeating: if a system is obsolete, it has a net cost on the organization and should be removed. One of the ways we’ve addressed concerns about keeping old code within Google is by ensuring that the source code repository isn’t just searchable at trunk, but also historically. Even code that has been removed can be found again (see Code Search).

+ + + +

Finally, funding and executing deprecation efforts can be difficult politically; staffing a team and spending time removing obsolete systems costs real money, whereas the costs of doing nothing and letting the system lumber along unattended are not readily observable. It can be difficult to convince the relevant stakeholders that deprecation efforts are worthwhile, particularly if they negatively impact new feature development. Research techniques, such as those described in Measuring Engineering Productivity, can provide concrete evidence that a deprecation is worthwhile.

+ +

Given the difficulty in deprecating and removing obsolete software systems, it is often easier for users to evolve a system in situ, rather than completely replacing it. Incrementality doesn’t avoid the deprecation process altogether, but it does break it down into smaller, more manageable chunks that can yield incremental benefits. Within Google, we’ve observed that migrating to entirely new systems is extremely expensive, and the costs are frequently underestimated. Incremental deprecation efforts accomplished by in-place refactoring can keep existing systems running while making it easier to deliver value to users. 

+ +
+

Deprecation During Design

+ +

Like many engineering activities, deprecation of a software system can be planned as those systems are first built.   Choices of programming language, software architecture, team composition, and even company policy and culture all impact how easy it will be to eventually remove a system after it has reached the end of its useful life.

+ +

The concept of designing systems so that they can eventually be deprecated might be radical in software engineering, but it is common in other engineering disciplines. Consider the example of a nuclear power plant, which is an extremely complex piece of engineering. As part of the design of a nuclear power station, its eventual decommissioning after a lifetime of productive service must be taken into account, even going so far as to allocate funds for this purpose.1 Many of the design choices in building a nuclear power plant are affected when engineers know that it will eventually need to be decommissioned.

+ +

Unfortunately, software systems are rarely so thoughtfully designed. Many software engineers are attracted to the task of building and launching new systems, not maintaining existing ones. The corporate culture of many companies, including Google, emphasizes building and shipping new products quickly, which often provides a disincentive for designing with deprecation in mind from the beginning. And in spite of the popular notion of software engineers as data-driven automata, it can be psychologically difficult to plan for the eventual demise of the creations we are working so hard to build.

+ +

So, what kinds of considerations should we think about when designing systems that we can more easily deprecate in the future? Here are a couple of the questions we encourage engineering teams at Google to ask:

+ +
    +
  • +

    How easy will it be for my consumers to migrate from my product to a potential replacement?

    +
  • +
  • +

    How can I replace parts of my system incrementally?

    +
  • +
+ +

Many of these questions relate to how a system provides and consumes dependencies. For a more thorough discussion of how we manage these dependencies, see Version Control and Branch Management.

+ +

Finally, we should point out that the decision as to whether to support a project long term is made when an organization first decides to build the project. After a software system exists, the only remaining options are support it, carefully deprecate it, or let it stop functioning when some external event causes it to break. These are all valid options, and the trade-offs between them will be organization specific. A new startup with a single project will unceremoniously kill it when the company goes bankrupt, but a large company will need to think more closely about the impact across its portfolio and reputation as they consider removing old projects. As mentioned earlier, Google is still learning how best to make these trade-offs with our own internal and external products.

+ +

In short, don’t start projects that your organization isn’t committed to support for the expected lifespan of the organization. Even if the organization chooses to deprecate and remove the project, there will still be costs, but they can be mitigated through planning and investments in tools and policy.

+
+
+ +
+

Types of Deprecation

+ +

Deprecation isn’t a  single kind of process, but a continuum of them, ranging from “we’ll turn this off someday, we hope†to “this system is going away tomorrow, customers better be ready for that.†Broadly speaking, we divide this continuum into two separate areas: advisory and compulsory.

+ +
+

Advisory Deprecation

+ +

Advisory deprecations are those that don’t  have a deadline  and aren’t high priority for the organization (and for which the company isn’t willing to dedicate resources). These could also be labeled aspirational deprecations: the team knows the system has been replaced, and although they hope clients will eventually migrate to the new system, they don’t have imminent plans to either provide support to help move clients or delete the old system. This kind of deprecation often lacks enforcement: we hope that clients move, but can’t force them to. As our friends in SRE will readily tell you: “Hope is not a strategy.â€

+ +

Advisory deprecations are a good tool for advertising the existence of a new system and encouraging early adopting users to start trying it out. Such a new system should not be considered in a beta period: it should be ready for production uses and loads and should be prepared to support new users indefinitely. Of course, any new system is going to experience growing pains, but after the old system has been deprecated in any way, the new system will become a critical piece of the organization’s infrastructure.

+ +

One scenario we’ve seen at Google in which advisory deprecations have strong benefits is when the new system offers compelling benefits to its users. In these cases, simply notifying users of this new system and providing them self-service tools to migrate to it often encourages adoption. However, the benefits cannot be simply incremental: they must be transformative. Users will be hesitant to migrate on their own for marginal benefits, and even new systems with vast improvements will not gain full adoption using only advisory deprecation efforts.

+ +

Advisory deprecation allows system authors to nudge users in the desired direction, but they should not be counted on to do the majority of migration work. It is often tempting to simply put a deprecation warning on an old system and walk away without any further effort. Our experience at Google has been that this can lead to (slightly) fewer new uses of an obsolete system, but it rarely leads to teams actively migrating away from it. Existing uses of the old system exert a sort of conceptual (or technical) pull toward it: comparatively many uses of the old system will tend to pick up a large share of new uses, no matter how much we say, “Please use the new system.†The old system will continue to require maintenance and other resources unless its users are more actively encouraged to migrate.

+
+ +
+

Compulsory Deprecation

+ +

This active encouragement comes in the form of compulsory deprecation.   This kind of deprecation usually comes with a deadline for removal of the obsolete system: if users continue to depend on it beyond that date, they will find their own systems no longer work.

+ +

Counterintuitively, the best way for compulsory deprecation efforts to scale is by localizing the expertise of migrating  users to within a single team of experts—usually the team responsible for removing the old system entirely. This team has incentives to help others migrate from the obsolete system and can develop experience and tools that can then be used across the organization. Many of these migrations can be effected using the same tools discussed in Large-Scale Changes.

+ +

For compulsory deprecation to actually work, its schedule needs to have an enforcement mechanism. This does not imply that the schedule can’t change, but empower the team running the deprecation process to break noncompliant users after they have been sufficiently warned through efforts to migrate them. Without this power, it becomes easy for customer teams to ignore deprecation work in favor of features or other more pressing work.

+ +

At the same time, compulsory deprecations without staffing to do the work can come across to customer teams as mean spirited, which usually impedes completing the deprecation. Customers simply see such deprecation work as an unfunded mandate, requiring them to push aside their own priorities to do work just to keep their services running. This feels much like the “running to stay in place†phenomenon and creates friction between infrastructure maintainers and their customers. It’s for this reason that we strongly advocate that compulsory deprecations are actively staffed by a specialized team through completion.

+ +

It’s also worth noting that even with the force of policy behind them, compulsory deprecations can still face political hurdles. Imagine trying to enforce a compulsory deprecation effort when the last remaining user of the old system is a critical piece of infrastructure your entire organization depends on. How willing would you be to break that infrastructure—and, transitively, everybody that depends on it—just for the sake of making an arbitrary deadline? It is hard to believe the deprecation is really compulsory if that team can veto its progress.

+ +

Google’s monolithic repository and dependency graph gives us tremendous insight into how systems are used across our ecosystem. Even so, some teams might not even know they have a dependency on an obsolete system, and it can be difficult to discover these dependencies analytically. It’s also possible to find them dynamically through tests of increasing frequency and duration during which the old system is turned off temporarily. These intentional changes provide a mechanism for discovering unintended dependencies by seeing what breaks, thus alerting teams to a need to prepare for the upcoming deadline. Within Google, we occasionally change the name of implementation-only symbols to see which users are depending on them unaware.

+ +

Frequently at Google, when a system is slated for deprecation and removal, the team will announce planned outages of increasing duration in the months and weeks prior to the turndown. Similar to Google’s Disaster Recovery Testing (DiRT) exercises, these events often discover unknown dependencies between running systems.  This incremental approach allows those dependent teams to discover and then plan for the system’s eventual removal, or even work with the deprecating team to adjust their timeline. (The same principles also apply for static code dependencies, but the semantic information provided by static analysis tools is often sufficient to detect all the dependencies of the obsolete system.)

+
+ +
+

Deprecation Warnings

+ +

For both advisory and compulsory deprecations, it is often useful to have a programmatic way  of marking systems as deprecated so that users are warned about their use and encouraged to move away. It’s often tempting to just mark something as deprecated and hope its uses eventually disappear, but remember: “hope is not a strategy.†Deprecation warnings can help prevent new uses, but rarely lead to migration of existing systems.

+ +

What usually happens in practice is that these warnings accumulate over time. If they are used in a transitive context (for example, library A depends on library B, which depends on library C, and C issues a warning, which shows up when A is built), these warnings can soon overwhelm users of a system to the point where they ignore them altogether.  In health care, this phenomenon is known as “alert fatigue.â€

+ +

Any deprecation warning issued to a user needs to have two properties: actionability and relevance. A warning is actionable if the user can use the warning to actually perform some relevant action, not just in theory, but in practical terms, given the expertise in that problem area that we expect for an average engineer. For example, a tool might warn that a call to a given function should be replaced with a call to its updated counterpart, or an email might outline the steps required to move data from an old system to a new one. In each case, the warning provided the next steps that an engineer can perform to no longer depend on the deprecated system.2

+ +

A warning can be actionable, but still be annoying. To be useful, a deprecation warning should also be relevant. A warning is relevant if it surfaces at a time when a user actually performs the indicated action. Warning about the use of a deprecated function is best done while the engineer is writing code that uses that function, not after it has been checked into the repository for several weeks. Likewise, an email for data migration is best sent several months before the old system is removed rather than as an afterthought a weekend before the removal occurs.

+ +

It’s important to resist the urge to put deprecation warnings on everything possible. Warnings themselves are not bad, but naive tooling often produces a quantity of warning messages that can overwhelm the unsuspecting engineer. Within Google, we are very liberal with marking old functions as deprecated but leverage tooling such as ErrorProne or clang-tidy to ensure that warnings are surfaced in targeted ways. As discussed in Static Analysis, we limit these warnings to newly changed lines as a way to warn people about new uses of the deprecated symbol. Much more intrusive warnings, such as for deprecated targets in the dependency graph, are added only for compulsory deprecations, and the team is actively moving users away. In either case, tooling plays an important role in surfacing the appropriate information to the appropriate people at the proper time, allowing more warnings to be added without fatiguing the user. 

+
+
+ +
+

Managing the Deprecation Process

+ +

Although they can feel like different kinds of projects  because we’re deconstructing a system rather than building it, deprecation projects are similar to other software engineering projects in the way they are managed and run. We won’t spend too much effort going over similarities between those management efforts, but it’s worth pointing out the ways in which they differ.

+ +
+

Process Owners

+ +

We’ve learned at Google that  without explicit  owners, a deprecation process is unlikely to make meaningful progress, no matter how many warnings and alerts a system might generate. Having explicit project owners who are tasked with managing and running the deprecation process might seem like a poor use of resources, but the alternatives are even worse: don’t ever deprecate anything, or delegate deprecation efforts to the users of the system. The second case becomes simply an advisory deprecation, which will never organically finish, and the first is a commitment to maintain every old system ad infinitum. Centralizing deprecation efforts helps better assure that expertise actually reduces costs by making them more transparent.

+ +

Abandoned projects often present a problem when establishing ownership and aligning incentives. Every organization of reasonable size has projects that are still actively used but that nobody clearly owns or maintains, and Google is no exception. Projects sometimes enter this state because they are deprecated: the original owners have moved on to a successor project, leaving the obsolete one chugging along in the basement, still a dependency of a critical project, and hoping it just fades away eventually.

+ +

Such projects are unlikely to fade away on their own. In spite of our best hopes, we’ve found that these projects still require deprecation experts to remove them and prevent their failure at inopportune times. These teams should have removal as their primary goal, not just a side project of some other work. In the case of competing priorities, deprecation work will almost always be perceived as having a lower priority and rarely receive the attention it needs. These sorts of important-not-urgent cleanup tasks are a great use of 20% time and provide engineers exposure to other parts of the codebase.

+
+ +
+

Milestones

+ +

When building  a new system, project milestones  are generally pretty clear: “Launch the frobnazzer features by next quarter.†Following incremental development practices, teams build and deliver functionality incrementally to users, who get a win whenever they take advantage of a new feature. The end goal might be to launch the entire system, but incremental milestones help give the team a sense of progress and ensure they don’t need to wait until the end of the process to generate value for the organization.

+ +

In contrast, it can often feel that the only milestone of a deprecation process is removing the obsolete system entirely. The team can feel they haven’t made any progress until they’ve turned out the lights and gone home. Although this might be the most meaningful step for the team, if it has done its job correctly, it’s often the least noticed by anyone external to the team, because by that point, the obsolete system no longer has any users. Deprecation project managers should resist the temptation to make this the only measurable milestone, particularly given that it might not even happen in all deprecation projects.

+ +

Similar to building a new system, managing a team working on deprecation should involve concrete incremental milestones, which are measurable and deliver value to users. The metrics used to evaluate the progress of the deprecation will be different, but it is still good for morale to celebrate incremental achievements in the deprecation process. We have found it useful to recognize appropriate incremental milestones, such as deleting a key subcomponent, just as we’d recognize accomplishments in building a new product.

+
+ +
+

Deprecation Tooling

+ +

Much of the tooling used  to manage the deprecation process is discussed in depth elsewhere in this book, such as the large-scale change (LSC) process (Large-Scale Changes) or our code review tools (Critique: Google’s Code Review Tool). Rather than talk about the specifics of the tools, we’ll briefly outline how those tools are useful when managing the deprecation of an obsolete system. These tools can be categorized as discovery, migration, and backsliding prevention tooling.

+ +
+

Discovery

+ +

During the  early stages of a deprecation process, and in fact during the entire process, it is useful to know how and by whom an obsolete system is being used. Much of the initial work of deprecation is determining who is using the old system—and in which unanticipated ways. Depending on the kinds of use, this process may require revisiting the deprecation decision once new information is learned. We also use these tools throughout the deprecation process to understand how the effort is progressing.

+ +

Within Google, we use tools like Code Search (see Code Search) and Kythe (see Continuous Integration) to statically determine which customers use a given library, and often to sample existing usage to see what sorts of behaviors customers are unexpectedly depending on. Because runtime dependencies generally require some static library or thin client use, this technique yields much of the information needed to start and run a deprecation process. Logging and runtime sampling in production help discover issues with dynamic dependencies.

+ +

Finally, we treat our global test suite as an oracle to determine whether all references to an old symbol have been removed. As discussed in Testing Overview, tests are a mechanism of preventing unwanted behavioral changes to a system as the ecosystem evolves. Deprecation is a large part of that evolution, and customers are responsible for having sufficient testing to ensure that the removal of an obsolete system will not harm them.

+
+ +
+

Migration

+ +

Much of the work of  doing deprecation efforts at Google is achieved by using the same set of code generation and review tooling we mentioned earlier. The LSC process and tooling are particularly useful in managing the large effort of actually updating the codebase to refer to new libraries or runtime services.

+
+ +
+

Preventing backsliding

+ +

Finally, an often overlooked piece of  deprecation infrastructure is tooling for preventing the addition of new uses of the very thing being actively removed. Even for advisory deprecations, it is useful to warn users to shy away from a deprecated system in favor of a new one when they are writing new code. Without backsliding prevention, deprecation can become a game of whack-a-mole in which users constantly add new uses of a system with which they are familiar (or find examples of elsewhere in the codebase), and the deprecation team constantly migrates these new uses. This process is both counterproductive and demoralizing.

+ +

To prevent deprecation backsliding on a micro level, we use the Tricorder static analysis framework  to notify users that they are adding calls into a deprecated system and give them feedback on the appropriate replacement.  Owners of deprecated systems can add compiler annotations to deprecated symbols (such as the @deprecated Java annotation), and Tricorder surfaces new uses of these symbols at review time. These annotations give control over messaging to the teams that own the deprecated system, while at the same time automatically alerting the change author. In limited cases, the tooling also suggests a push-button fix to migrate to the suggested replacement.

+ +

On a macro level,  we use visibility whitelists in our build system to ensure that new dependencies  are not introduced to the deprecated system. Automated tooling periodically examines these whitelists and prunes them as dependent systems are migrated away from  the obsolete system. 

+
+
+
+ +
+

Conclusion

+ +

Deprecation can feel like the dirty work of cleaning up the street after the circus parade has just passed through town, yet these efforts improve the overall software ecosystem by reducing maintenance overhead and cognitive burden of engineers. Scalably maintaining complex software systems over time is more than just building and running software: we must also be able to remove systems that are obsolete or otherwise unused.

+ +

A complete deprecation process involves successfully managing social and technical challenges through policy and tooling. Deprecating in an organized and well-managed fashion is often overlooked as a source of benefit to an organization, but is essential for its long-term sustainability.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Software systems have continuing maintenance costs that should be weighed against the costs of removing them.

    +
  • +
  • +

    Removing things is often more difficult than building them to begin with because existing users are often using the system beyond its original design.

    +
  • +
  • +

    Evolving a system in place is usually cheaper than replacing it with a new one, when turndown costs are included.

    +
  • +
  • +

    It is difficult to honestly evaluate the costs involved in deciding whether to deprecate: aside from the direct maintenance costs involved in keeping the old system around, there are ecosystem costs involved in having multiple similar systems to choose between and that might need to interoperate. The old system might implicitly be a drag on feature development for the new. These ecosystem costs are diffuse and difficult to measure. Deprecation and removal costs are often similarly diffuse. 

    +
  • +
+
+

1"Design and Construction of Nuclear Power Plants to Facilitate Decommissioning," Technical Reports Series No. 382, IAEA, Vienna (1997).

2See https://abseil.io/docs/cpp/tools/api-upgrades for an example.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch16.html b/clones/abseil.io/resources/swe-book/html/ch16.html new file mode 100644 index 00000000..e7ceffa9 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch16.html @@ -0,0 +1,348 @@ + + + + + Software Engineering at Google + + + + +
+

Version Control and Branch Management

+ + + + + +

Perhaps no software engineering tool is quite as universally adopted throughout the industry as version control.  One can hardly imagine any software organization larger than a few people that doesn’t rely on a formal Version Control System (VCS) to manage its source code and coordinate activities between engineers.  

+ +

In this chapter, we’re going to look at why the use of version control has become such an unambiguous norm in software engineering, and we describe the various possible approaches to version control and branch management, including how we do it at scale across all of Google. We’ll also examine the pros and cons of various approaches; although we believe everyone should use version control, some version control policies  and processes might  work better for your organization (or in general) than others. In particular, we find “trunk-based development†as popularized by DevOps1 (one repository, no dev branches) to be a particularly scalable policy approach, and we’ll provide some suggestions as to why that is.

+ +
+

What Is Version Control?

+ +
Note
+

This section might be a little basic for many readers: use of version control is, after all, fairly ubiquitous. If you want to skip ahead, we suggest jumping to the section Source of Truth.

+
+ +

A VCS is a system  that tracks revisions (versions) of files over time. A VCS maintains some metadata about the set of files being managed, and collectively a copy of the files and metadata is called a repository2 (repo for short).  A VCS helps coordinate the activities of teams by allowing multiple developers to work on the same set of files simultaneously. Early VCSs did this by granting one person at a time the right to edit a file—that style of locking is enough to establish sequencing (an agreed-upon “which is newer,†an important feature of VCS). More advanced systems ensure that changes to a collection of files submitted at once are treated as a single unit (atomicity when a logical change touches multiple files).  Systems like CVS (a popular VCS from the 90s) that didn’t have this atomicity for a commit were subject to corruption and lost changes.  Ensuring atomicity removes the chance of previous  changes being overwritten unintentionally, but requires tracking which version was last synced to—at commit time, the commit is rejected if any file in the commit has been modified at head since the last time the local developer synced. Especially in such a change-tracking VCS, a developer’s working copy of the managed files will therefore need metadata of its own. Depending on the design of the VCS, this copy of the repository can be a repository itself, or might contain a reduced amount of metadata—such a reduced copy is usually a “client†or “workspace.â€

+ +

This seems like a lot of complexity: why is a VCS necessary? What is it about this sort of tool that has allowed it to become one of the few nearly universal tools for software development and software engineering?

+ +

Imagine for a moment working without a VCS. For a (very) small group of distributed developers working on a project of limited scope without any understanding of version control, the simplest and lowest-infrastructure solution is to just pass copies of the project back and forth. This works best when edits are nonsimultaneous (people are working in different time zones, or at least with different working hours). If there’s any chance for people to not know which version is the most current, we immediately have an annoying problem: tracking which version is the most up to date. Anyone who has attempted to collaborate in a non-networked environment will likely recall the horrors of copying back-and-forth files named Presentation v5 - final - redlines - Josh’s version v2. And as we shall see, when there isn’t a single agreed-upon source of truth, collaboration becomes high friction and error prone.

+ +

Introducing shared storage requires slightly more infrastructure (getting access to shared storage), but provides an easy and obvious solution. Coordinating work in a shared drive might suffice for a while with a small enough number of people but still requires out-of-band collaboration to avoid overwriting one another’s work. Further, working directly in that shared storage means that any development task that doesn’t keep the build working continuously will begin to impede everyone on the team—if I’m making a change to some part of this system at the same time that you kick off a build, your build won’t work. Obviously, this doesn’t scale well.

+ +

In practice, lack  of file locking and lack of  merge tracking will inevitably lead to collisions and work being overwritten. Such a system is very likely to introduce out-of-band coordination to decide who is working on any given file. If that file-locking is encoded in software, we’ve begun reinventing an early-generation version control like RCS (among others).  After you realize that granting write permissions a file at a time is too coarse grained and you begin wanting line-level tracking—we’re definitely reinventing version control. It seems nearly inevitable that we’ll want some structured mechanism to govern these collaborations. Because we seem to just be reinventing the wheel in this hypothetical, we might as well use an off-the-shelf tool.

+ +
+

Why Is Version Control Important?

+ +

While version control is practically  ubiquitous now, this was not always the case.  The very first VCSs date back to the 1970s (SCCS) and 1980s (RCS)—many years later than the first references to software engineering as a distinct discipline. Teams participated in “the multiperson development of multiversion software†before the industry had any formal notion of version control. Version control evolved as a response to the novel challenges of digital collaboration. It took decades of evolution and dissemination for reliable, consistent use of version control to evolve into the norm that it is today.3 So how did it become so important, and, given that it seems like a self-evident solution, why might anyone resist the idea of VCS?

+ +

Recall that  software engineering is programming integrated over time; we’re drawing a distinction (in dimensionality) between the instantaneous production of source code and the act of maintaining that product over time. That basic distinction goes a long way to explaining the importance of, and hesitation toward, VCS: at the most fundamental level, version control is the engineer’s primary tool for managing the interplay between raw source and time.  We can conceptualize VCS as a way to extend a standard filesystem.  A filesystem is a mapping from filename to contents. A VCS extends that to provide a mapping from (filename, time) to contents, along with the metadata necessary to track last sync points and audit history. Version control makes the consideration of time an explicit part of the operation: unnecessary in a programming task, critical in a software engineering task.  In most cases, a VCS also allows for an extra input to that mapping (a branch name) to allow for parallel mappings; thus:

+ +
VCS(filename, time, branch) => file contents
+ +

In the default usage, that branch input will have a commonly understood default: we call that “head,†“default,†or “trunk†to denote main branch.

+ +

The (minor) remaining hesitation toward consistent use of version control comes almost directly from conflating programming and software engineering—we teach programming, we train programmers, we interview for jobs based on programming problems and techniques. It’s perfectly reasonable for a new hire, even at a place like Google, to have little or no experience with code that is worked on by more than one person or for more than a couple weeks. Given that experience and understanding of the problem, version control seems like an alien solution. Version control is solving a problem that our new hire hasn’t necessarily experienced: an “undo,†not for a single file but for an entire project, adding a lot of complexity for sometimes nonobvious benefits.

+ +

In some software groups, the same result plays out when management views the job of the techies as “software development†(sit down and write code) rather than “software engineering†(produce code, keep it working and useful for some extended period). With a mental model of programming as the primary task and little understanding of the interplay between code and the passage of time, it’s easy to see something described as “go back to a previous version to undo a mistake†as a weird, high-overhead luxury.

+ +

In addition to allowing separate storage and reference to versions over time, version control helps us bridge the gap between single-developer and multideveloper processes. In practical terms, this is why version control is so critical to software engineering, because it allows us to scale up teams and organizations, even though we use it only infrequently as an “undo†button. Development is inherently a branch-and-merge process, both when coordinating between multiple developers or a single developer at different points in time.  A VCS removes the question of “which is more recent?†Use of modern version control automates error-prone operations like tracking which set of changes have been applied. Version control is how we coordinate between multiple developers and/or multiple points in time.

+ +

Because VCS has become so thoroughly embedded in the process of software engineering, even legal and regulatory practices have caught up. VCS allows a formal record of every change to every line of code, which is increasingly necessary for satisfying audit requirements. When mixing between in-house development and appropriate use of third-party sources, VCS helps track provenance and origination for every line of code.

+ +

In addition to the technical and regulatory aspects of tracking source over time and handling sync/branch/merge operations, version control triggers some nontechnical changes in behavior. The ritual of committing to version control and producing a commit log is a trigger for a moment of reflection: what have you accomplished since your last commit? Is the source in a state that you’re happy with? The moment of introspection associated with committing, writing up a summary, and marking a task complete might have value on its own for many people. The start of the commit process is a perfect time to run through a checklist, run static analyses (see Static Analysis), check test coverage, run tests and dynamic analysis, and so on.

+ +

Like any process, version control comes with some overhead: someone must configure and manage your version control system, and individual developers must use it. But make no mistake about it: these can almost always be pretty cheap. Anecdotally, most experienced software engineers will instinctively use version control for any project that lasts more than a day or two, even for a single-developer project. The consistency of that result argues that the trade-off in terms of value (including risk reduction) versus overhead must be a pretty easy one. But we’ve promised to acknowledge that context matters and to encourage engineering leaders to think for themselves. It is always worth considering alternatives, even on something as fundamental as version control.

+ +

In truth, it’s difficult to envision any task that can be considered modern software engineering that doesn’t immediately adopt a VCS. Given that you understand the value and need for version control, you are likely now asking what type of version control you need. 

+
+ +
+

Centralized VCS Versus Distributed VCS

+ +

At the most simplistic level, all modern VCSs are equivalent  to one another: so long as your system has a notion of atomically committing changes to a batch of files, everything else is just UI. You could build the same general semantics (not workflow) of any modern VCS out of another one and a pile of simple shell scripts. Thus, arguing about which VCS is “better†is primarily a matter of user experience—the core functionality is the same, the differences come in user experience, naming, edge-case features, and performance. Choosing a VCS is like choosing a filesystem format: when choosing among a modern-enough format, the differences are fairly minor, and the more important question by far is the content you fill that system with and the way you use it. However, major architectural differences in VCSs can make configuration, policy, and scaling decisions easier or more difficult, so it’s important to be aware of the big architectural differences, chiefly the decision between centralized or decentralized.

+ +
+

Centralized VCS

+ +

In centralized VCS implementations, the model is one of a single central repository (likely stored on some shared compute resource for your organization).  Although a developer can have files checked out and accessible on their local workstation, operations that interact on the version control status of those files need to be communicated to the central server (adding files, syncing, updating existing files, etc.). Any code that is committed by a developer is committed into that central repository. The first VCS implementations were all centralized VCSs.

+ +

Going back to the 1970s and early 1980s, we see that the earliest of these VCSs, such as RCS, focused on locking and preventing multiple simultaneous edits.  You could copy the contents  of a repository, but if you wanted to edit a file, you might need to acquire a lock, enforced by the VCS, to ensure that only you are making edits.  When you’ve completed an edit, you release the lock. The model worked fine when any given change was a quick thing, or if there was rarely more than one person that wanted the lock for a file at any given time. Small edits like tweaking config files worked OK, as did working on a small team that either kept disjointed working hours or that rarely worked on overlapping files for extended periods. This sort of simplistic locking has inherent problems with scale: it can work fine for a few people, but has the potential to fall apart with larger groups if any of those locks become contended.4

+ +

As a response to this scaling problem, the VCSs that were popular through the 90s and early 2000s operated at a higher level. These more modern centralized VCSs avoid the exclusive locking but track which changes you’ve synced, requiring your edit to be based on the most-current version of every file in your commit.  CVS wrapped and refined RCS by (mostly) operating on batches of files at a time and allowing multiple developers to check out a file at the same time: so long as your base version contained all of the changes in the repository, you’re allowed to commit.  Subversion advanced further by  providing true atomicity for commits, version tracking, and better tracking for unusual operations (renames, use of symbolic links, etc.). The centralized repository/checked-out client model continues today within Subversion as well as most commercial VCSs.

+
+ +
+

Distributed VCS

+ +

Starting in the mid-2000s, many popular VCSs followed the Distributed Version Control System (DVCS) paradigm, seen  in systems like Git and Mercurial. The primary conceptual difference between DVCS and more traditional centralized VCS (Subversion, CVS) is the question: “Where can you commit?†or perhaps, “Which copies of these files count as a repository?â€

+ +

A DVCS world does not enforce the constraint of a central repository: if you have a copy (clone, fork) of the repository, you have a repository that you can commit to as well as all of the metadata necessary to query for information about things like revision history. A standard workflow is to clone some existing repository, make some edits, commit them locally, and then push some set of commits to another repository, which may or may not be the original source of the clone. Any notion of centrality is purely conceptual, a matter of policy, not fundamental to the technology or the underlying protocols. 

+ +

The DVCS model allows for better offline operation and collaboration without inherently declaring one particular repository to be the source of truth. One repository isn’t necessary “ahead†or “behind†because changes aren’t inherently projected into a linear timeline. However, considering common usage, both the centralized and DVCS models are largely interchangeable: whereas a centralized VCS provides a clearly defined central repository through technology, most DVCS ecosystems define a central repository for a project as a matter of policy.  That is, most DVCS projects are built around one conceptual source of truth (a particular repository on GitHub, for instance). DVCS models tend to assume a more distributed use case and have found particularly strong adoption in the open source world.

+ +

Generally speaking, the dominant source control  system today  is Git, which implements DVCS.5 When in doubt, use that—there’s some value in doing what everyone else does. If your use cases are expected to be unusual, gather some data and evaluate the trade-offs.

+ +

Google has a complex relationship with DVCS: our main repository is based on a (massive) custom in-house centralized VCS. There are periodic attempts to integrate more standard external options and to match the workflow that our engineers (especially Nooglers) have come to expect from external development. Unfortunately, those attempts to move toward more common tools like Git have been stymied by the sheer size of the codebase and userbase, to say nothing of Hyrum’s Law effects tying us to a particular VCS and interface for that VCS.6 This is perhaps not surprising: most existing tools don’t scale well with 50,000 engineers and tens of millions of commits.7 The DVCS model, which often (but not always) includes transmission of history and metadata, requires a lot of data to spin up a repository to work out of.

+ +

In our workflow, centrality and in-the-cloud storage for the codebase seem to be critical to scaling. The DVCS model is built around the idea of downloading the entire codebase and having access to it locally. In practice, over time and as your organization scales up, any given developer is going to operate on a relatively smaller percentage of the files in a repository, and a small fraction of the versions of those files. As we grow (in file count and engineer count), that transmission becomes almost entirely waste. The only need for locality for most files occurs when building, but distributed (and reproducible) build systems seem to scale better for that task as well (see Build Systems and Build Philosophy). 

+
+
+ +
+

Source of Truth

+ +

Centralized VCSs (Subversion, CVS, Perforce, etc.) bake  the source-of-truth notion into the very design of the system: whatever is most recently committed at trunk is the current version.   When a developer goes to check out the project, by default that trunk version is what they will be presented with. Your changes are “done†when they have been recommitted on top of that version.

+ +

However, unlike centralized VCS, there is no inherent notion of which copy of the distributed  repository is the single source of truth in DVCS systems. In theory, it’s possible to pass around commit tags and PRs with no centralization or coordination, allowing disparate branches of development to propagate unchecked, and thus risking a conceptual return to the world of Presentation v5 - final - redlines - Josh’s version v2. Because of this, DVCS requires more explicit policy and norms than a centralized VCS does.

+ +

Well-managed projects using DVCS declare one specific branch in one specific repository to be the source of truth and thus avoid the more chaotic possibilities. We see this in practice with the spread of hosted DVCS solutions like GitHub or GitLab—users can clone and fork the repository for a project, but there is still a single primary repository: things are “done†when they are in the trunk branch on that repository.

+ +

It isn’t an accident that centralization and Source of Truth has crept back into the usage even in a DVCS world. To help illustrate just how important this Source of Truth idea is, let’s imagine what happens when we don’t have a clear source of truth.

+ +
+

Scenario: no clear source of truth

+ +

Imagine that your team adheres to the DVCS philosophy enough to avoid defining a specific branch+repository as the ultimate source of truth.  

+ +

In some respects, this is reminiscent of the Presentation v5 - final - redlines - Josh’s version v2 model—after you pull from a teammate’s repository, it isn’t necessarily clear which changes are present and which are not. In some respects, it’s better than that because the DVCS model tracks the merging of individual patches at a much finer granularity than those ad hoc naming schemes, but there’s a difference between the DVCS knowing which changes are incorporated and every engineer being sure they have all the past/relevant changes represented.

+ +

Consider what it takes to ensure that a release build includes all of the features that have been developed by each developer for the past few weeks. What (noncentralized, scalable) mechanisms are there to do that? Can we design policies that are fundamentally better than having everyone sign off? Are there any that require only sublinear human effort as the team scales up? Is that going to continue working as the number of developers on the team scales up? As far as we can see: probably not. Without a central Source of Truth, someone is going to keep a list of which features are potentially ready to be included in the next release. Eventually that bookkeeping is reproducing the model of having a centralized Source of Truth.

+ +

Further imagine: when a new developer joins the team, where do they get a fresh, known-good copy of the code?

+ +

DVCS enables a lot of great workflows and interesting usage models. But if you’re concerned with finding a system that requires sublinear human effort to manage as the team grows, it’s pretty important to have one repository (and one branch) actually defined to be the ultimate source of truth.

+ +

There is some relativity in that Source of Truth. That is, for a given project, that Source of Truth might be different for a different organization. This caveat is important: it’s reasonable for engineers at Google or Red Hat to have different Sources of Truth for  Linux Kernel patches, still different than Linus (the Linux Kernel maintainer) himself would. DVCS works fine when organizations and their Sources of Truth are hierarchical (and invisible to those outside the organization)—that is perhaps the most practically useful effect of the DVCS model. A Red Hat engineer can commit to the local Source of Truth repository, and changes can be pushed from there upstream periodically, while Linus has a completely different notion of what is the Source of Truth. So long as there is no choice or uncertainty as to where a change should be pushed, we can avoid a large class of chaotic scaling problems in the DVCS model.

+ +

In all of this thinking, we’re assigning special significance to the trunk branch. But of course, “trunk†in your VCS is only the technology default, and an organization can choose different policies on top of that. Perhaps the default branch has been abandoned and all work actually happens on some custom development branch—other than needing to provide a branch name in more operations, there’s nothing inherently broken in that approach; it’s just nonstandard. There’s an (oft-unspoken) truth when discussing version control: the technology is only one part of it for any given organization; there is almost always an equal amount of policy and usage convention on top of that.

+ +

No topic in version control has more policy and convention than the discussion of how to use and manage branches. We look at branch management in more detail in the next section.  

+
+
+ +
+

Version Control Versus Dependency Management

+ +

There’s a lot of conceptual similarity between discussions of version control policies and dependency management (see Dependency Management).   The differences are primarily in two forms: VCS policies are largely about how you manage your own code, and are usually much finer grained. Dependency management is more challenging because we primarily focus on projects managed and controlled by other organizations, at a higher granularity, and these situations mean that you don’t have perfect control. We’ll discuss a lot more of these high-level issues later  in the book. 

+
+
+ +
+

Branch Management

+ +

Being able to track different revisions in version control opens up a variety of different approaches for how to  manage those different versions.  Collectively, these different approaches fall under the term branch management, in contrast to a single “trunk.â€

+ +
+

Work in Progress Is Akin to a Branch

+ +

Any discussion that an organization has about branch management policies ought to at least acknowledge  that every piece of work-in-progress in the organization is equivalent to a branch. This is more explicitly the case with a DVCS in which developers are more likely to make numerous local staging commits before pushing back to the upstream Source of Truth.    This is still true of centralized VCSs: uncommitted local changes aren’t conceptually different than committed changes on a branch, other than potentially being more difficult to find and diff against. Some centralized systems even make this explicit.  For example, when using Perforce, every change is given two revision numbers: one indicating the implicit branch point where the change was created, and one indicating where it was recommitted, as illustrated in Figure 16-1. Perforce users can query to see who has outstanding changes to a given file, inspect the pending changes in other users' uncommitted changes, and more.

+ +
Two revision numbers in Perforce +
Figure 16-1. Two revision numbers in Perforce
+
+ +

This “uncommitted work is akin to a branch†idea is particularly relevant when thinking about refactoring tasks.  Imagine a developer being told, “Go rename Widget to OldWidget.†Depending on an organization’s branch management policies and understanding, what counts as a branch, and which branches matter, this could have several interpretations:

+ +
    +
  • +

    Rename Widget on the trunk branch in the Source of Truth repository

    +
  • +
  • +

    Rename Widget on all branches in the Source of Truth repository

    +
  • +
  • +

    Rename Widget on all branches in the Source of Truth repository, and find all devs with outstanding changes to files that reference Widget

    +
  • +
+ +

If we were to speculate, attempting to support that “rename this everywhere, even in outstanding changes†use case is part of why commercial centralized VCSs tend to track things like “which engineers have this file open for editing?†(We don’t think this is a scalable way to perform a refactoring task, but we understand the point of view.)

+
+ +
+

Dev Branches

+ +

In the age before  consistent unit testing (see Testing Overview), when the  introduction of any given change had a high risk of regressing functionality elsewhere in the system, it made sense to treat trunk specially. “We don’t commit to trunk,†your Tech Lead might say, “until new changes have gone through a full round of testing. Our team uses feature-specific development branches instead.â€

+ +

A development branch (usually “dev branchâ€) is a halfway point between “this is done but not committed†and “this is what new work is based on.†The problem that these are  attempting to solve (instability of the product) is a legitimate one—but one that we have found to be solved far better with more extensive use of tests, Continuous Integration (CI) (see Continuous Integration), and quality enforcement practices like thorough code review. 

+ +

We believe that a version control policy that makes extensive use of dev branches as a means toward product stability is inherently misguided. The same set of commits are going to be merged to trunk eventually.  Small merges are easier than big ones. Merges done by the engineer who authored those changes are easier than batching unrelated changes and merging later (which will happen eventually if a team is sharing a dev branch).  If presubmit testing on the merge reveals any new problems, the same argument applies: it’s easier to determine whose changes are responsible for a regression if there is only one engineer involved. Merging a large dev branch implies that more changes are happening in that test run, making failures more difficult to isolate. Triaging and root-causing the problem is difficult; fixing it is even worse.

+ +

Beyond the lack of expertise and inherent problems in merging a single branch, there are significant scaling risks when relying on dev branches. This is a very common productivity drain for a software organization. When there are multiple branches being developed in isolation for long periods, coordinating merge operations becomes significantly more expensive (and possibly riskier) than they would be with trunk-based development.

+ +
+

How did we become addicted to dev branches?

+ +

It’s easy to see how organizations fall into this trap: they see, “Merging this long-lived development branch reduced stability†and conclude, “Branch merges are risky.†Rather than solve that with “Better testing†and “Don’t use branch-based development strategies,†they focus on slowing down and coordinating the symptom: the branch merges.  Teams begin developing new branches based on other in-flight branches. Teams working on a long-lived dev branch might or might not regularly have that branch synched with the main development branch. As the organization scales up, the number of development branches grows as well, and the more effort is placed on coordinating that branch merge strategy. Increasing effort is thrown at coordination of branch merges—a task that inherently doesn’t scale. Some unlucky engineer becomes the Build Master/Merge Coordinator/Content Management Engineer, focused on acting as the single point coordinator to merge all the disparate branches in the organization. Regularly scheduled meetings attempt to ensure that the organization has “worked out the merge strategy for the week.â€8 The teams that aren’t chosen to merge often need to re-sync and retest after each of these large merges.

+ +

All of that effort in merging and retesting is pure overhead. The alternative requires a different  paradigm: trunk-based development, rely heavily on testing and CI, keep the build green, and disable incomplete/untested features at runtime. Everyone is responsible to sync to trunk and commit; no “merge strategy†meetings, no large/expensive merges. And, no heated discussions about which version of a library should be used—there can be only one. There must be a single Source of Truth. In the end, there will be a single revision used for a release: narrowing down to a single source of truth is just the “shift left†approach for identifying what is and is not being included.  

+
+
+ +
+

Release Branches

+ +

If the period  between  releases (or the release lifetime) for a product is longer than a few hours, it may be sensible to create a release branch that represents the exact code that went into the release build for your product. If any critical flaws are discovered between the actual release of that product into the wild and the next release cycle, fixes can be cherry-picked (a minimal, targeted merge) from trunk to your release branch.

+ +

By comparison to dev branches, release branches are generally benign: it isn’t the technology of branches that is troublesome, it’s the usage. The primary difference between a dev branch and a release branch is the expected end state: a dev branch is expected to merge back to trunk, and could even be further branched by another team. A release branch is expected to be abandoned eventually.

+ +

In the highest-functioning technical organizations that Google’s DevOps Research and Assessment (DORA) organization has identified, release branches are practically nonexistent.  Organizations that have achieved Continuous Deployment (CD)—the ability to release from  trunk many times a day—likely tend to skip release branches: it’s much easier to simply add the fix and redeploy. Thus, cherry-picks and branches seem like unnecessary overhead. Obviously, this is more applicable to organizations that deploy digitally (such as web services and apps) than those that push any form of tangible release to customers; it is generally valuable to know exactly what has been pushed to customers.

+ +

That same DORA research also suggests a strong positive correlation between “trunk-based development,†“no long-lived dev branches,†and good technical outcomes.  The underlying idea in both of those ideas seems clear: branches are a drag on productivity. In many cases we think complex branch and merge strategies are a perceived safety crutch—an attempt to keep trunk stable. As we see throughout this book, there are other ways to achieve that  outcome. 

+
+
+ +
+

Version Control at Google

+ +

At Google, the vast majority of our source is managed in a single repository (monorepo) shared among roughly 50,000 engineers.  Almost all projects that are owned by Google live there, except large open source projects like Chromium and Android. This includes public-facing products like Search, Gmail, our advertising products, our Google Cloud Platform offerings, as well as the internal infrastructure necessary to support and develop all of those products.

+ +

We rely on an in-house-developed centralized VCS called Piper, built to run as a distributed microservice in our production environment.   This has allowed us to use Google-standard storage, communication, and Compute as a Service technology to provide a globally available VCS storing more than 80 TB of content and metadata. The Piper monorepo is then simultaneously edited and committed to by many thousands of engineers every day. Between humans and semiautomated processes that make use of version control (or improve things checked into VCS), we’ll regularly handle 60,000 to 70,000 commits to the repository per work day. Binary artifacts are fairly common because the full repository isn’t transmitted and thus the normal costs of binary artifacts don’t really apply. Because of the focus on Google-scale from the earliest conception, operations in this VCS ecosystem are still cheap at human scale: it takes perhaps 15 seconds total to create a new client at trunk, add a file, and commit an (unreviewed) change to Piper. This low-latency interaction and well-understood/well-designed scaling simplifies a lot of the developer experience.

+ +

By virtue of Piper being an in-house product, we have the ability to customize it and enforce whatever source control policies we choose.  For instance, we have a notion of granular ownership in the monorepo: at every level of the file hierarchy, we can find OWNERS files that list the usernames of engineers that are allowed to approve commits within that subtree of the repository (in addition to the OWNERS that are listed at higher levels in the tree). In an environment with many repositories, this might have been achieved by having separate repositories with filesystem permissions enforcement controlling commit access or via a Git “commit hook†(action triggered at commit time) to do a separate permissions check. By controlling the VCS, we can make the concept of ownership and approval more explicit and enforced by the VCS during an attempted commit operation. The model is also flexible: ownership is just a text file, not tied to a physical separation of repositories, so it is trivial to update as the result of a team transfer or organization restructuring.

+ +
+

One Version

+ +

The incredible scaling powers of Piper alone wouldn’t allow the sort of collaboration that we rely upon.   As we said earlier: version control is also about policy. In addition to our VCS, one key feature of Google’s version control policy is what we’ve come to refer to as "One Version." This  extends the "Single Source of Truth" concept we looked at earlier—ensuring that a developer knows which branch and repository is their source of truth—to something like “For every dependency in our repository, there must be only one version of that dependency to choose.â€9 For third-party packages, this means that there can be only a single version of that package checked into our repository, in the steady state.10 For internal packages, this means no forking without repackaging/renaming: it must be technologically safe to mix both the original and the fork into the same project with no special effort. This is a powerful feature for our ecosystem: there are very few packages with restrictions like “If you include this package (A), you cannot include other package (B).â€

+ +

This notion of having a single copy on a single branch in a single repository as our Source of Truth is intuitive but also has some subtle depth in application. Let’s investigate a scenario in which we have a monorepo (and thus arguably have fulfilled the letter of the law on Single Source of Truth), but have allowed forks of our libraries to propagate on trunk.

+
+ +
+

Scenario: Multiple Available Versions

+ +

Imagine the following scenario: some team discovers a bug in common infrastructure  code (in our case, Abseil or Guava or the like). Rather than fix it in place, the team decides to fork that infrastructure and tweak it to work around the bug—without renaming the library or the symbols. It informs other teams near them, “Hey, we have an improved version of Abseil checked in over here: check it out.†A few other teams build libraries that themselves rely on this new fork.

+ +

As we’ll see in Dependency Management, we’re now in a dangerous situation. If any project in the codebase comes to depend on both the original and the forked versions of Abseil simultaneously, in the best case, the build fails. In the worst case, we’ll be subjected to difficult-to-understand runtime bugs stemming from linking in two mismatched versions of the same library. The “fork†has effectively added a coloring/partitioning property to the codebase: the transitive dependency set for any given target must include exactly one copy of this library. Any link added from the “original flavor†partition of the codebase to the “new fork†partition will likely break things. This means that in the end that something as simple as “adding a new dependency†becomes an operation that might require running all tests for the entire codebase, to ensure that we haven’t violated one of these partitioning requirements. That’s expensive, unfortunate, and doesn’t scale well.

+ +

In some cases, we might be able to hack things together in a way to allow a resulting executable to function correctly.   Java, for instance, has a relatively standard practice called shading, which tweaks the names of the internal dependencies of a library to hide those dependencies from the rest of the application. When dealing with functions, this is technically sound, even if it is theoretically a bit of a hack. When dealing with types that can be passed from one package to another, shading solutions work neither in theory nor in practice. As far as we know, any technological trickery that allows multiple isolated versions of a library to function in the same binary share this limitation: that approach will work for functions, but there is no good (efficient) solution to shading types—multiple versions for any library that provides a vocabulary type (or any higher-level construct) will fail. Shading and related approaches are patching over the underlying issue: multiple versions of the same dependency are needed. (We’ll discuss how to minimize that in general in Dependency Management.)

+ +

Any policy system that allows for multiple versions in the same codebase is allowing for the possibility of these costly incompatibilities. It’s possible that you’ll get away with it for a while (we certainly have a number of small violations of this policy), but in general, any multiple-version situation has a very real possibility of leading to big problems.

+
+ +
+

The “One-Version†Rule

+ +

With that example in mind, on top of the Single Source of Truth model, we can hopefully  understand the depth  of this seemingly simple rule for source control and branch management:

+ +
+

Developers must never have a choice of “What version of this component should I depend upon?â€

+
+ +

Colloquially, this becomes something like a “One-Version Rule.†In practice, “One-Version†is not hard and fast,11 but phrasing this around limiting the versions that can be chosen when adding a new dependency conveys a very powerful understanding.

+ +

For an individual developer, lack of choice can seem like an arbitrary impediment. Yet we see again and again that for an organization, it’s a critical component in efficient scaling.  Consistency has a profound importance at all levels in an organization. From one perspective, this is a direct side effect of discussions about consistency and ensuring the ability to leverage consistent “choke points.â€

+
+ +
+

(Nearly) No Long-Lived Branches

+ +

There are several deeper  ideas and policies  implicit in our One-Version Rule; foremost among them: development branches should be minimal, or at best be very short lived.  This follows from a lot of published work over the past 20 years, from Agile processes to DORA research results on trunk-based development and even Phoenix Project12 lessons on “reducing work-in-progress.†When we include the idea of pending work as akin to a dev branch, this further reinforces that work should be done in small increments against trunk, committed regularly. 

+ +

As a counterexample: in a development community that depends heavily on long-lived development branches, it isn’t difficult to imagine opportunity for choice creeping back in.

+ +

Imagine this scenario: some infrastructure team is working on a new Widget, better than the old one. Excitement grows. Other newly started projects ask, “Can we depend on your new Widget?†Obviously, this can be handled if you’ve invested in codebase visibility policies, but the deep problem happens when the new Widget is “allowed†but only exists in a parallel branch. Remember: new development must not have a choice when adding a dependency. That new Widget should be committed to trunk, disabled from the runtime until it’s ready, and hidden from other developers by visibility if possible—or the two Widget options should be designed such that they can coexist, linked into the same programs.

+ +

Interestingly, there is already evidence of this being important in the industry. In Accelerate  and the most recent State of DevOps reports, DORA points out that there is a predictive relationship between trunk-based development and high-performing software organizations.  Google is not the only organization to have discovered this—nor did we necessarily have expected outcomes in mind when these policies evolved—it just seemed like nothing else worked. DORA’s result certainly matches our experience.

+ +

Our policies  and tools for large-scale changes (LSCs; see Large-Scale Changes) put additional weight on the importance of trunk-based development: broad/shallow changes that are applied across the codebase are already a massive (often tedious) undertaking when modifying everything checked in to the trunk branch. Having an unbounded number of additional dev branches that might need to be refactored at the same time would be an awfully large tax on executing those types of changes, finding an ever-expanding set of hidden branches. In a DVCS model, it might not even be possible to identify all of those branches.

+ +

Of course, our experience is not universal. You might find yourself in unusual situations that require longer-lived dev branches in parallel to (and regularly merged with) trunk.

+ +

Those scenarios should be rare, and should be understood to be expensive. Across the roughly 1,000 teams that work in the Google monorepo, there are only a couple that have such a dev branch.13 Usually these exist for a very specific (and very unusual) reason. Most of those reasons boil down to some variation of “We have an unusual requirement for compatibility over time.†Oftentimes this is a matter of ensuring compatibility for data at rest across versions: readers and writers of some file format need to agree on that format over time even if the reader or writer implementations are modified. Other times, long-lived dev branches might come from promising API compatibility over time—when One Version isn’t enough and we need to promise that an older version of a microservice client still works with a newer server (or vice versa). That can be a very challenging requirement, something that you should not promise lightly for an actively evolving API, and something you should treat carefully to ensure that period of time doesn’t accidentally begin to grow. Dependency across time in any form is far more costly and complicated than code that is time invariant. Internally, Google production services make relatively few promises of that form.14 We also benefit greatly from a cap on potential version skew imposed by our “build horizonâ€: every job in production needs to be rebuilt and redeployed every six months, maximum. (Usually it is far more frequent than that.)

+ +

We’re sure there are other situations that might necessitate long-lived dev branches. Just make sure to keep them rare. If you adopt other tools and practices discussed in this book, many will tend to exert pressure against long-lived dev branches. Automation and tooling that works great at trunk and fails (or takes more effort) for a dev branch can help encourage developers to stay current.

+
+ +
+

What About Release Branches?

+ +

Many Google  teams use release branches, with limited cherry picks.  If you’re going to put out a monthly release and continue working toward the next release, it’s perfectly reasonable to make a release branch. Similarly, if you’re going to ship devices to customers, it’s valuable to know exactly what version is out “in the field.†Use caution and reason, keep cherry picks to a minimum, and don’t plan to remerge with trunk. Our various teams have all sorts of policies about release branches given that relatively few teams have arrived at the sort of rapid release cadence promised by CD (see Continuous Delivery) that obviates the need or desire for a release branch. Generally speaking, release branches don’t cause any widespread cost in our experience. Or, at least, no noticeable cost above and beyond the additional inherent cost to the VCS. 

+
+
+ +
+

Monorepos

+ +

In 2016, we published a (highly cited, much discussed) paper  on  Google’s monorepo approach.15 The monorepo approach has some inherent benefits, and chief among them is  that adhering to One Version is trivial: it’s usually more difficult to violate One Version than it would be to do the right thing. There’s no process of deciding which versions of anything are official, or discovering which repositories are important. Building tools to understand the state of the build (see Continuous Integration) doesn’t also require discovering where important repositories exist. Consistency helps scale up the impact of introducing new tools and optimizations. By and large, engineers can see what everyone else is doing and use that to inform their own choices in code and system design. These are all very good things.

+ +

Given all of that and our belief in the merits of the One-Version Rule, it is reasonable to ask whether a monorepo is the One True Way. By comparison, the open source community seems to work just fine with a “manyrepo†approach built on a seemingly infinite number of noncoordinating and nonsynchronized project repositories.

+ +

In short: no, we don’t think the monorepo approach as we’ve described it is the perfect answer for everyone. Continuing the parallel between filesystem format and VCS, it’s easy to imagine deciding between using 10 drives to provide one very large logical filesystem or 10 smaller filesystems accessed separately. In a filesystem world, there are pros and cons to both. Technical issues when evaluating filesystem choice would range from outage resilience, size constraints, performance characteristics, and so on. Usability issues would likely focus more on the ability to reference files across filesystem boundaries, add symlinks, and synchronize files.

+ +

A very similar set of issues governs whether to prefer a monorepo or a collection of finer-grained repositories.  The specific decisions of how to store your source code (or store your files, for that matter) are easily debatable, and in some cases, the particulars of your organization and your workflow are going to matter more than others. These are decisions you’ll need to make yourself.

+ +

What is important is not whether we focus on monorepo; it’s to adhere to the One-Version principle to the greatest extent possible: developers must not have a choice when adding a dependency onto some library that is already in use in the organization. Choice violations of the One-Version Rule lead to merge strategy discussions, diamond dependencies, lost work, and wasted effort.

+ +

Software engineering tools including both VCS and build systems are increasingly providing mechanisms  to smartly blend between fine-grained repositories and monorepos to provide an experience akin to the monorepo—an agreed-upon ordering of commits and understanding of the dependency graph.  Git submodules, Bazel with external dependencies, and CMake subprojects all allow modern developers to synthesize something weakly approximating monorepo behavior without the costs and downsides of a monorepo.16 For instance, fine-grained repositories are easier to deal with in terms of scale (Git often has performance issues after a few million commits and tends to be slow to clone when repositories include large binary artifacts) and storage (VCS metadata can add up, especially if you have binary artifacts in your version control system). Fine-grained repositories in a federated/virtual-monorepo (VMR)–style repository can make it easier to isolate experimental or top-secret projects while still holding to One Version and allowing access to common utilities.  

+ +

To put it another way: if every project in your organization has the same secrecy, legal, privacy, and security requirements,17 a true monorepo is a fine way to go. Otherwise, aim for the functionality of a monorepo, but allow yourself the flexibility of implementing that experience in a different fashion. If you can manage with disjoint repositories and adhere to One Version or your workload is all disconnected enough to allow truly separate repositories, great. Otherwise, synthesizing something like a VMR in some fashion may represent the best of both worlds.

+ +

After all, your choice of filesystem format really doesn’t matter as much as what you write to it.

+
+ +
+

Future of Version Control

+ +

Google isn’t the only organization to publicly discuss the benefits of a monorepo approach.  Microsoft, Facebook, Netflix, and Uber have also publicly mentioned their reliance on the approach.  DORA has published about it extensively. It’s vaguely possible that all of these successful, long-lived companies are misguided, or at least that their situations are sufficiently different as to be inapplicable to the average smaller organization. Although it’s possible, we think it is unlikely.

+ +

Most arguments against monorepos focus on the  technical limitations of having a single large repository. If cloning a repository from upstream is quick and cheap, developers are more likely to keep changes small and isolated (and to avoid making mistakes with committing to the wrong work-in-progress branch). If cloning a repository (or doing some other common VCS operation) takes hours of wasted developer time, you can easily see why an organization would shy away from reliance on such a large repository/operation. We luckily avoided this pitfall by focusing on providing a VCS that scales massively.

+ +

Looking at the past  few years of major improvements to Git, there’s clearly a lot of work being done to support larger repositories: shallow clones, sparse branches, better optimization, and more. We expect this to continue and the importance of “but we need to keep the repository small†to diminish.

+ +

The other major argument against monorepos is that it doesn’t match how development happens in the Open Source Software (OSS) world.  Although true, many of the practices in the OSS world come (rightly) from prioritizing freedom, lack of coordination, and lack of computing resources. Separate projects in the OSS world are effectively separate organizations that happen to be able to see one another’s code. Within the boundaries of an organization, we can make more assumptions: we can assume the availability of compute resources, we can assume coordination, and we can assume that there is some amount of centralized authority.

+ +

A less common but perhaps more legitimate concern with the monorepo approach is that as your organization scales up, it is less and less likely that every piece of code is subject to exactly the same legal, compliance, regulatory, secrecy, and privacy requirements. One native advantage of a manyrepo approach is that separate repositories are obviously capable of having different sets of authorized developers, visibility, permissions, and so on. Stitching that feature into a monorepo can be done but implies some ongoing carrying costs in terms of customization and maintenance.

+ +

At the same time, the industry seems to be inventing lightweight interrepository linkage over and over again. Sometimes, this is in the VCS (Git submodules) or the build system. So long as a collection of repositories have a consistent understanding of “what is trunk,†“which change happened first,†and mechanisms to describe dependencies, we can easily imagine stitching together a disparate collection of physical repositories into one larger VMR.  Even though Piper has done very well for us, investing in a highly scaling VMR and tools to manage it and relying on off-the-shelf customization for per-repository policy requirements could have been a better investment.

+ +

As soon as someone builds a sufficiently large nugget of compatible and interdependent projects in the OSS community and publishes a VMR view of those packages, we suspect that OSS developer practices will begin to change. We see glimpses of this in the tools that could synthesize a virtual monorepo as well as in the work done by (for instance) large Linux distributions discovering and publishing mutually compatible revisions of thousands of packages. With unit tests, CI, and automatic version bumping for new submissions to one of those revisions, enabling a package owner to update trunk for their package (in nonbreaking fashion, of course), we think that model will catch on in the open source world. It is just a matter of efficiency, after all: a (virtual) monorepo approach with a One-Version Rule cuts down the complexity of software development by a whole (difficult) dimension: time.

+ +

We expect  version control and dependency management to evolve in this direction in the next 10 to 20 years: VCSs will focus on allowing larger repositories with better performance scaling, but also removing the need for larger repositories by providing better mechanisms to stitch them together across project and organizational boundaries. Someone, perhaps the existing package management groups or Linux distributors, will catalyze a de facto standard virtual monorepo. Depending on the utilities in that monorepo will provide easy access to a compatible set of dependencies as one unit. We’ll more generally recognize that version numbers are timestamps, and that allowing version skew adds a dimensionality complexity (time) that costs a lot—and that we can learn to avoid. It starts with something logically like a monorepo.

+
+ +
+

Conclusion

+ +

Version control systems are a natural extension of the collaboration challenges and opportunities provided by technology, especially shared compute resources and computer networks. They have historically evolved in lockstep with the norms of software engineering as we understand them at the time.

+ +

Early systems provided simplistic file-granularity locking. As typical software engineering projects and teams grew larger, the scaling problems with that approach became apparent, and our understanding of version control changed to match those challenges. Then, as development increasingly moved toward an OSS model with distributed contributors, VCSs became more decentralized. We expect a shift in VCS technology that assumes constant network availability, focusing more on storage and build in the cloud to avoid transmitting unnecessary files and artifacts. This is increasingly critical for large, long-lived software engineering projects, even if it means a change in approach compared to simple single-dev/single-machine programming projects. This shift to cloud will make concrete what has emerged with DVCS approaches: even if we allow distributed development, something must still be centrally recognized as the Source of Truth.

+ +

The current DVCS decentralization is a sensible reaction of the technology to the needs of the industry (especially the open source community). However, DVCS configuration needs to be tightly controlled and coupled with branch management policies that make sense for your organization. It also can often introduce unexpected scaling problems: perfect fidelity offline operation requires a lot more local data. Failure to rein in the potential complexity of a branching free-for-all can lead to a potentially unbounded amount of overhead between developers and deployment of that code. However, complex technology doesn’t need to be used in a complex fashion: as we see in monorepo and trunk-based development models, keeping branch policies simple generally leads to better engineering outcomes.

+ +

Choice leads to costs here. We highly endorse the One-Version Rule presented here: developers within an organization must not have a choice where to commit, or which version of an existing component to depend upon. There are few policies we’re aware of that can have such an impact on the organization: although it might be annoying for individual developers, in the aggregate, the end result is far better.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Use version control for any software development project larger than "toy project with only one developer that will never be updated."

    +
  • +
  • +

    There’s an inherent scaling problem when there are choices in “which version of this should I depend upon?â€

    +
  • +
  • +

    One-Version Rules are surprisingly important for organizational efficiency. Removing choices in where to commit or what to depend upon can result in significant simplification.

    +
  • +
  • +

    In some languages, you might be able to spend some effort to dodge this with technical approaches like shading, separate compilation, linker hiding, and so on. The work to get those approaches working is entirely lost labor—your software engineers aren’t producing anything, they’re just working around technical debts.

    +
  • +
  • +

    Previous research (DORA/State of DevOps/Accelerate) has shown that trunk-based development is a predictive factor in high-performing development organizations. Long-lived dev branches are not a good default plan.

    +
  • +
  • +

    Use whatever version control system makes sense for you. If your organization wants to prioritize separate repositories for separate projects, it’s still probably wise for interrepository dependencies to be unpinned/“at headâ€/“trunk based.†There are an increasing number of VCS and build system facilities that allow you to have both small, fine-grained repositories as well as a consistent “virtual†head/trunk notion for the whole organization.

    +
  • +
+
+

1The DevOps Research Association, which was acquired by Google between the first draft of this chapter and publication, has published extensively on this in the annual “State of DevOps Report†and the book Accelerate. As near as we can tell, it popularized the terminology trunk-based development.

2Although the formal idea of what is and is not a repository changes a bit depending on your choice of VCS, and the terminology will vary.

3Indeed, I’ve given several public talks that use “adoption of version control†as the canonical example of how the norms of software engineering can and do evolve over time. In my experience, in the 1990s, version control was pretty well understood as a best practice but not universally followed. In the early 2000s, it was still common to encounter professional groups that didn’t use it. Today, the use of tools like Git seems ubiquitous even among college students working on personal projects. Some of this rise in adoption is likely due to better user experience in the tools (nobody wants to go back to RCS), but the role of experience and changing norms is significant.

4Anecdote: To illustrate this, I looked for information on what pending/unsubmitted edits Googlers had outstanding for a semipopular file in my most recent project. At the time of this writing, 27 changes are pending, 12 from people on my team, 5 from people on related teams, and 10 from engineers I’ve never met. This is basically working as expected. Technical systems or policies that require out-of-band coordination certainly don’t scale to 24/7 software engineering in distributed locations.

5Stack Overflow Developer Survey Results, 2018.

6Monotonically increasing version numbers, rather than commit hashes, are particularly troublesome. Many systems and scripts have grown up in the Google developer ecosystem that assume that the numeric ordering of commits is the same as the temporal order—undoing those hidden dependencies is difficult.

7For that matter, as of the publication of the Monorepo paper, the repository itself had something like 86 TB of data and metadata, ignoring release branches. Fitting that onto a developer workstation directly would be…challenging.

8Recent informal Twitter polling suggests about 25% of software engineers have been subjected to “regularly scheduled†merge strategy meetings.

9For example, during an upgrade operation, there might be two versions checked in, but if a developer is adding a new dependency on an existing package, there should be no choice in which version to depend upon.

10That said, we fail at this in many cases because external packages sometimes have pinned copies of their own dependencies bundled in their source release. You can read more on how all of this goes wrong in Dependency Management.

11For instance, if there are external/third-party libraries that are periodically updated, it might be infeasible to update that library and update all use of it in a single atomic change. As such, it is often necessary to add a new version of that library, prevent new users from adding dependencies on the old one, and incrementally switch usage from old to new.

12Kevin Behr, Gene Kim, and George Spafford, The Phoenix Project (Portland: IT Revolution Press, 2018).

13It’s difficult to get a precise count, but the number of such teams is almost certainly fewer than 10.

14Cloud interfaces are a different story.

15Rachel Potvin and Josh Levenberg, "Why Google stores billions of lines of code in a single repository," Communications of the ACM, 59 No. 7 (2016): 78-87.

16We don’t think we’ve seen anything do this particularly smoothly, but the interrepository dependencies/virtual monorepo idea is clearly in the air.

17Or you have the willingness and capability to customize your VCS—and maintain that customization for the lifetime of your codebase/organization. Then again, maybe don’t plan on that as an option; that is a lot of overhead.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch17.html b/clones/abseil.io/resources/swe-book/html/ch17.html new file mode 100644 index 00000000..4fe8ee19 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch17.html @@ -0,0 +1,354 @@ + + + + + Software Engineering at Google + + + + + + + + diff --git a/clones/abseil.io/resources/swe-book/html/ch18.html b/clones/abseil.io/resources/swe-book/html/ch18.html new file mode 100644 index 00000000..60ba2618 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch18.html @@ -0,0 +1,589 @@ + + + + + Software Engineering at Google + + + + +
+

Build Systems and Build Philosophy

+ + + + + +

If you ask Google engineers what they  like most about working at Google (besides the free food and cool products), you might hear something surprising: engineers love the build system.1 Google has spent a tremendous amount of engineering effort over its lifetime in creating its own build system from the ground up, with the goal of ensuring that our engineers are able to quickly and reliably build code.   The effort has been so successful that Blaze, the main component of the build system, has been reimplemented several different times by ex-Googlers who have left the company.2 In 2015, Google finally open sourced an implementation of Blaze named Bazel.

+ +
+

Purpose of a Build System

+ +

Fundamentally, all build systems have a straightforward purpose: they transform the source code  written by engineers into executable binaries that can be read by machines. A good build system will generally try to optimize for two important properties:

+ +
+
Fast
+
A developer should be able to type a single command to run the build and get back the resulting binary, often in as little as a few seconds. 
+
Correct
+
Every time any developer runs a  build on any machine, they should get the same result (assuming that the source files and other inputs are the same).
+
+ +

Many older build systems attempt to make trade-offs between speed and correctness by taking shortcuts that can lead to inconsistent builds.  Bazel’s main objective is to avoid having to choose between speed and correctness, providing a build system structured to ensure that it’s always possible to build code efficiently and consistently.

+ +

Build systems aren’t just for humans; they also allow machines to create builds automatically, whether for testing or for releases to production.  In fact, the large majority of builds at Google are triggered automatically rather than directly by engineers. Nearly all of our development tools tie into the build system in some way, giving huge amounts of value to everyone working on our codebase. Here’s a small sample of workflows that take advantage of our automated build system:

+ +
    +
  • +

    Code is automatically built, tested, and pushed to production without any human intervention. Different teams do this at different rates: some teams push weekly, others daily, and others as fast as the system can create and validate new builds. (see Continuous Delivery).

    +
  • +
  • +

    Developer changes are automatically tested when they’re sent for code review (see Critique: Google’s Code Review Tool) so that both the author and reviewer can immediately see any build or test issues caused by the change.

    +
  • +
  • +

    Changes are tested again immediately before merging them into the trunk, making it much more difficult to submit breaking changes.

    +
  • +
  • +

    Authors of low-level libraries are able to test their changes across the entire codebase, ensuring that their changes are safe across millions of tests and binaries.

    +
  • +
  • +

    Engineers are  able to create large-scale changes (LSCs) that touch tens of thousands of source files at a time (e.g., renaming a common symbol) while still being able to safely submit and test those changes. We discuss LSCs in greater detail in Large-Scale Changes.

    +
  • +
+ +

All of this is possible only because of Google’s investment in its build system. Although Google might be unique in its scale, any organization of any size can realize similar benefits by making proper use of a modern build system. This chapter describes what Google considers to be a "modern build system" and how to use such systems.

+
+ +
+

What Happens Without a Build System?

+ +

Build systems allow your development to scale.  As we’ll illustrate in the next section, we run into problems of scaling without a proper build environment.

+ +
+

But All I Need Is a Compiler!

+ +

The need for a build  system might not be immediately obvious.  After all, most of us probably didn’t use a build system when we were first learning to code—we probably started by invoking tools like gcc or javac directly from the command line, or the equivalent in an integrated development environment (IDE).  As long as all of our source code is in the same directory, a command like this works fine:

+ +
javac *.java
+ +

This instructs the Java compiler to take every Java source file in the current directory and turn it into a binary class file. In the simplest case, this is all that we need.

+ +

However, things become more complicated quickly as soon as our code expands. javac is smart enough to look in subdirectories of our current directory to find code that we import. But it has no way of finding code stored in other parts of the filesystem (perhaps a library shared by several of our projects). It also obviously only knows how to build Java code. Large systems often involve different pieces written in a variety of programming languages with webs of dependencies among those pieces, meaning no compiler for a single language can possibly build the entire system.

+ +

As soon as we end up having to deal with code from multiple languages or multiple compilation units, building code is no longer a one-step process. We now need to think about what our code depends on and build those pieces in the proper order, possibly using a different set of tools for each piece. If we change any of the dependencies, we need to repeat this process to avoid depending on stale binaries. For a codebase of even moderate size, this process quickly becomes tedious and error-prone.

+ +

The compiler also doesn’t know anything about how to handle external dependencies, such as third-party JAR files in Java.   Often the best we can do without a build system is to download the dependency from the internet, stick it in a lib folder on the hard drive, and configure the compiler to read libraries from that directory.  Over time, it’s easy to forget what libraries we put in there, where they came from, and whether they’re still in use. And good luck keeping them up to date as the library maintainers release new versions.

+
+ +
+

Shell Scripts to the Rescue?

+ +

Suppose that your  hobby project starts  out simple enough that you can build it using just a compiler, but you begin running into some of the problems described previously. Maybe you still don’t think you need a real build system and can automate away the tedious parts using some simple shell scripts that take care of building things in the correct order. This helps out for a while, but pretty soon you start running into even more problems:

+ +
    +
  • +

    It becomes tedious. As your system grows more complex, you begin spending almost as much time working on your build scripts as on real code. Debugging shell scripts is painful, with more and more hacks being layered on top of one another.

    +
  • +
  • +

    It’s slow. To make sure you weren’t accidentally relying on stale libraries, you have your build script build every dependency in order every time you run it. You think about adding some logic to detect which parts need to be rebuilt, but that sounds awfully complex and error prone for a script. Or you think about specifying which parts need to be rebuilt each time, but then you’re back to square one.

    +
  • +
  • +

    Good news: it’s time for a release! Better go figure out all the arguments you need to pass to the jar command to make your final build. And remember how to upload it and push it out to the central repository. And build and push the documentation updates, and send out a notification to users. Hmm, maybe this calls for another script...

    +
  • +
  • +

    Disaster! Your hard drive crashes, and now you need to recreate your entire system. You were smart enough to keep all of your source files in version control, but what about those libraries you downloaded? Can you find them all again and make sure they were the same version as when you first downloaded them? Your scripts probably depended on particular tools being installed in particular places—can you restore that same environment so that the scripts work again? What about all those environment variables you set a long time ago to get the compiler working just right and then forgot about?

    +
  • +
  • +

    Despite the problems, your project is successful enough that you’re able to begin hiring more engineers. Now you realize that it doesn’t take a disaster for the previous problems to arise—you need to go through the same painful bootstrapping process every time a new developer joins your team. And despite your best efforts, there are still small differences in each person’s system. Frequently, what works on one person’s machine doesn’t work on another’s, and each time it takes a few hours of debugging tool paths or library versions to figure out where the difference is.

    +
  • +
  • +

    You decide that you need to automate your build system. In theory, this is as simple as getting a new computer and setting it up to run your build script every night using cron. You still need to go through the painful setup process, but now you don’t have the benefit of a human brain being able to detect and resolve minor problems. Now, every morning when you get in, you see that last night’s build failed because yesterday a developer made a change that worked on their system but didn’t work on the automated build system. Each time it’s a simple fix, but it happens so often that you end up spending a lot of time each day discovering and applying these simple fixes.

    +
  • +
  • +

    Builds become slower and slower as the project grows. One day, while waiting for a build to complete, you gaze mournfully at the idle desktop of your coworker, who is on vacation, and wish there were a way to take advantage of all that wasted computational power.

    +
  • +
+ +

You’ve run into a classic problem of scale. For a single developer working on at most a couple hundred lines of code for at most a week or two (which might have been the entire experience thus far of a junior developer who just graduated university), a compiler is all you need. Scripts can maybe take you a little bit farther. But as soon as you need to coordinate across multiple developers and their machines, even a perfect build script isn’t enough because it becomes very difficult to account for the minor differences in those machines. At this point, this simple approach breaks down and it’s time to invest in a real build system. 

+
+
+ +
+

Modern Build Systems

+ +

Fortunately, all of the problems we started running into have already been solved many times over by existing general-purpose build systems.  Fundamentally, they aren’t that different from the aforementioned script-based DIY approach we were working on: they run the same compilers under the hood, and you need to understand those underlying tools to be able to know what the build system is really doing. But these existing systems have gone through many years of development, making them far more robust and flexible than the scripts you might try hacking together yourself.

+ +
+

It’s All About Dependencies

+ +

In looking  through  the previously described problems, one theme repeats over and over: managing your own code is fairly straightforward, but managing its dependencies is much more difficult (and Dependency Management is devoted to covering this problem in detail). There are all sorts of dependencies: sometimes there’s a dependency on a task (e.g., "push the documentation before I mark a release as complete"), and sometimes there’s a dependency on an artifact (e.g., "I need to have the latest version of the computer vision library to build my code"). Sometimes, you have internal dependencies on another part of your codebase, and sometimes you have external dependencies on code or data owned by another team (either in your organization or a third party). But in any case, the idea of "I need that before I can have this" is something that recurs repeatedly in the design of build systems, and managing dependencies is perhaps the most fundamental job of a build system.

+
+ +
+

Task-Based Build Systems

+ +

The shell scripts we started developing in the  previous  section were an example of a primitive task-based build system. In a task-based build system, the fundamental unit of work is the task. Each task is a script of some sort that can execute any sort of logic, and tasks specify other tasks as dependencies that must run before them. Most major build systems in use today, such as Ant, Maven, Gradle, Grunt, and Rake, are task based.     

+ +

Instead of shell scripts, most modern build systems require engineers to create buildfiles that describe how to perform the build.  Take this example from the Ant manual:

+ +
+
<project name="MyProject" default="dist" basedir=".">
+  <description>
+    simple example build file
+  </description>
+  <!-- set global properties for this build -->
+  <property name="src" location="src"/>
+  <property name="build" location="build"/>
+  <property name="dist" location="dist"/>
+
+  <target name="init">
+    <!-- Create the time stamp -->
+    <tstamp/>
+    <!-- Create the build directory structure used by compile -->
+    <mkdir dir="${build}"/>
+  </target>
+
+  <target name="compile" depends="init"
+        description="compile the source">
+    <!-- Compile the Java code from ${src} into ${build} -->
+    <javac srcdir="${src}" destdir="${build}"/>
+  </target>
+
+  <target name="dist" depends="compile"
+        description="generate the distribution">
+    <!-- Create the distribution directory -->
+    <mkdir dir="${dist}/lib"/>
+
+    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
+    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
+  </target>
+
+  <target name="clean"
+        description="clean up">
+    <!-- Delete the ${build} and ${dist} directory trees -->
+    <delete dir="${build}"/>
+    <delete dir="${dist}"/>
+  </target>
+</project>
+
+ +

The buildfile is written in XML and defines some simple metadata about the build along with a list of tasks (the <target> tags in the XML3). Each task executes a list of possible commands defined by Ant, which here include creating and deleting directories, running javac, and creating a JAR file.  This set of commands can be extended by user-provided plug-ins to cover any sort of logic. Each task can also define the tasks it depends on via the depends attribute. These dependencies form an acyclic graph (see Figure 18-1).

+ +
An acyclic graph showing dependencies +
Figure 18-1. An acyclic graph showing dependencies
+
+ +

Users perform builds by providing tasks to Ant’s command-line tool.  For example, when a user types ant dist, Ant takes the following steps:

+ +
    +
  1. +

    Loads a file named build.xml in the current directory and parses it to create the graph structure shown in Figure 18-1.

    +
  2. +
  3. +

    Looks for the task named dist that was provided on the command line and discovers that it has a dependency on the task named compile.

    +
  4. +
  5. +

    Looks for the task named compile and discovers that it has a dependency on the task named init.

    +
  6. +
  7. +

    Looks for the task named init and discovers that it has no dependencies.

    +
  8. +
  9. +

    Executes the commands defined in the init task.

    +
  10. +
  11. +

    Executes the commands defined in the compile task given that all of that task’s dependencies have been run.

    +
  12. +
  13. +

    Executes the commands defined in the dist task given that all of that task’s dependencies have been run.

    +
  14. +
+ +

In the end, the code executed by Ant when running the dist task is equivalent to the following shell script:

+ +
+
./createTimestamp.sh
+mkdir build/
+javac src/* -d build/
+mkdir -p dist/lib/
+jar cf dist/lib/MyProject-$(date --iso-8601).jar build/*
+
+ +

When the syntax is stripped away, the buildfile and the build script actually aren’t too different.  But we’ve already gained a lot by doing this. We can create new buildfiles in other directories and link them together. We can easily add new tasks that depend on existing tasks in arbitrary and complex ways. We need only pass the name of a single task to the ant command-line tool, and it will take care of determining everything that needs to be run.

+ +

Ant is a very old piece of software, originally released in 2000—not what many people would consider a "modern" build system today!   Other tools like Maven and Gradle have improved on Ant in the intervening years and essentially  replaced it by adding features like automatic management of external dependencies and a cleaner syntax without any XML. But the nature of these newer systems remains the same: they  allow engineers to write build scripts in a principled and modular way as tasks and provide tools for executing those tasks and managing dependencies among them.

+ +
+

The dark side of task-based build systems

+ +

Because these tools  essentially let engineers define any script as a task, they are extremely powerful, allowing you to do pretty much anything you can imagine with them. But that power comes with drawbacks, and task-based build systems can become difficult to work with as their build scripts grow more complex. The problem with such systems is that they actually end up giving too much power to engineers and not enough power to the system. Because the system has no idea what the scripts are doing, performance suffers, as it must be very conservative in how it schedules and executes build steps. And there’s no way for the system to confirm that each script is doing what it should, so scripts tend to grow in complexity and end up being another thing that needs debugging.

+ +
+

Difficulty of parallelizing build steps

+ +

Modern development  workstations are typically  quite powerful, with multiple cores that should theoretically be capable of executing several build steps in parallel. But task-based systems are often unable to parallelize task execution even when it seems like they should be able to. Suppose that task A depends on tasks B and C. Because tasks B and C have no dependency on each other, is it safe to run them at the same time so that the system can more quickly get to task A? Maybe, if they don’t touch any of the same resources. But maybe not—perhaps both use the same file to track their statuses and running them at the same time will cause a conflict. There’s no way in general for the system to know, so either it has to risk these conflicts (leading to rare but very difficult-to-debug build problems), or it has to restrict the entire build to running on a single thread in a single process. This can be a huge waste of a powerful developer machine, and it completely rules out the possibility of distributing the build across multiple machines.

+
+ +
+

Difficulty performing incremental builds

+ +

A good build system will allow  engineers to perform reliable incremental builds such that a small change doesn’t require the entire codebase to be rebuilt from scratch.  This is especially important if the build system is slow and unable to parallelize build steps for the aforementioned reasons. But unfortunately, task-based build systems struggle here, too. Because tasks can do anything, there’s no way in general to check whether they’ve already been done. Many tasks simply take a set of source files and run a compiler to create a set of binaries; thus, they don’t need to be rerun if the underlying source files haven’t changed. But without additional information, the system can’t say this for sure—maybe the task downloads a file that could have changed, or maybe it writes a timestamp that could be different on each run. To guarantee correctness, the system typically must rerun every task during each build.

+ +

Some build systems try to enable incremental builds by letting engineers specify the conditions under which a task needs to be rerun. Sometimes this is feasible, but often it’s a much trickier problem than it appears. For example, in languages like C++ that allow files to be included directly by other files, it’s impossible to determine the entire set of files that must be watched for changes without parsing the input sources. Engineers will often end up taking shortcuts, and these shortcuts can lead to rare and frustrating problems where a task result is reused even when it shouldn’t be. When this happens frequently, engineers get into the habit of running clean before every build to get a fresh state, completely defeating the purpose of having an incremental build in the first place. Figuring out when a task needs to be rerun is surprisingly subtle, and is a job better handled by machines than humans.

+
+ +
+

Difficulty maintaining and debugging scripts

+ +

Finally, the build scripts imposed by task-based build systems are often just difficult to work with.   Though they often receive less scrutiny, build scripts are code just like the system being built, and are easy places for bugs to hide. Here are some examples of bugs that are very common when working with a task-based build system:

+ +
    +
  • +

    Task A depends on task B to produce a particular file as output. The owner of task B doesn’t realize that other tasks rely on it, so they change it to produce output in a different location. This can’t be detected until someone tries to run task A and finds that it fails.

    +
  • +
  • +

    Task A depends on task B, which depends on task C, which is producing a particular file as output that’s needed by task A. The owner of task B decides that it doesn’t need to depend on task C any more, which causes task A to fail even though task B doesn’t care about task C at all!

    +
  • +
  • +

    The developer of a new task accidentally makes an assumption about the machine running the task, such as the location of a tool or the value of particular environment variables. The task works on their machine, but fails whenever another developer tries it.

    +
  • +
  • +

    A task contains a nondeterministic component, such as downloading a file from the internet or adding a timestamp to a build. Now, people will get potentially different results each time they run the build, meaning that engineers won’t always be able to reproduce and fix one another’s failures or failures that occur on an automated build system.

    +
  • +
  • +

    Tasks with multiple dependencies can create race conditions. If task A depends on both task B and task C, and task B and C both modify the same file, task A will get a different result depending on which one of tasks B and C finishes first.

    +
  • +
+ +

There’s no general-purpose way to solve these performance, correctness, or maintainability problems within the task-based framework laid out here. So long as engineers can write arbitrary code that runs during the build, the system can’t have enough information to always be able to run builds quickly and correctly. To solve the problem, we need to take some power out of the hands of engineers and put it back in the hands of the system and reconceptualize the role of the system not as running tasks, but as producing artifacts. This is the approach that Google takes with Blaze and Bazel, and it will be described in the next section.  

+
+
+
+ +
+

Artifact-Based Build Systems

+ +

To design a better build system, we need to take a step back.   The problem with the earlier systems is that they gave too much power to individual engineers by letting them define their own tasks. Maybe instead of letting engineers define tasks, we can have a small number of tasks defined by the system that engineers can configure in a limited way. We could probably deduce the name of the most important task from the name of this chapter: a build system’s primary task should be to build code. Engineers would still need to tell the system what to build, but the how of doing the build would be left to the system.

+ +

This is exactly the approach taken by Blaze and the other artifact-based build systems descended from it (which include Bazel, Pants, and Buck).     Like with task-based build systems, we still have buildfiles, but the contents of those buildfiles are very different.  Rather than being an imperative set of commands in a Turing-complete scripting language describing how to produce an output, buildfiles in Blaze are a declarative manifest describing a set of artifacts to build, their dependencies, and a limited set of options that affect how they’re built. When engineers run blaze on the command line, they specify a set of targets to build (the "what"), and Blaze is responsible for configuring, running, and scheduling the compilation steps (the "how"). Because the build system now has full control over what tools are being run when, it can make much stronger guarantees that allow it to be far more efficient while still guaranteeing correctness.

+ +
+

A functional perspective

+ +

It’s easy to make an analogy between artifact-based build systems and functional programming.  Traditional imperative  programming  languages (e.g., Java, C, and Python) specify lists of statements to be executed one after another, in the same way that task-based build systems let programmers define a series of steps to execute. Functional programming  languages (e.g., Haskell and ML), in contrast, are structured more like a series of mathematical equations. In functional languages, the programmer describes a computation to perform, but leaves the details of when and exactly how that computation is executed to the compiler. This maps to the idea of declaring a manifest in an artifact-based build system and letting the system figure out how to execute the build.

+ +

Many problems cannot be easily expressed using functional programming, but the ones that do benefit greatly from it: the language is often able to trivially parallelize such programs and make strong guarantees about their correctness that would be impossible in an imperative language. The easiest problems to express using functional programming are the ones that simply involve transforming one piece of data into another using a series of rules or functions. And that’s exactly what a build system is: the whole system is effectively a mathematical function that takes source files (and tools like the compiler) as inputs and produces binaries as outputs. So, it’s not surprising that it works well to base a build system around the tenets of functional programming.

+ +
+

Getting concrete with Bazel

+ +

Bazel is the open source version of Google’s internal build tool, Blaze, and is a good example of an artifact-based build system.   Here’s what  a buildfile (normally named BUILD) looks like in Bazel:

+ +
+
java_binary(
+  name = "MyBinary",
+  srcs = ["MyBinary.java"],
+  deps = [
+    ":mylib",
+  ],
+)
+
+java_library(
+    name = "mylib",
+    srcs = ["MyLibrary.java", "MyHelper.java"],
+    visibility = ["//java/com/example/myproduct:__subpackages__"],
+    deps = [
+        "//java/com/example/common",
+        "//java/com/example/myproduct/otherlib",
+        "@com_google_common_guava_guava//jar",
+    ],
+)
+
+ +

In Bazel, BUILD files define targets—the two types of targets here are java_binary and java_library. Every target corresponds to an artifact that can be created by the system: binary targets produce binaries that can be executed directly, and library targets produce libraries that can be used by binaries or other libraries. Every target has a name (which defines how it is referenced on the command line and by other targets), srcs (which define the source files that must be compiled to create the artifact for the target), and deps (which define other targets that must be built before this target and linked into it). Dependencies can either be within the same package (e.g., MyBinary’s dependency on ":mylib"), on a different package in the same source hierarchy (e.g., mylib’s dependency on "//java/com/example/common"), or on a third-party artifact outside of the source hierarchy (e.g., mylib’s dependency on "@com_google_common_guava_guava//jar"). Each source hierarchy is called a workspace and is identified by the presence of a special WORKSPACE file at the root.

+ +

Like with Ant, users perform builds using Bazel’s command-line tool.  To build the MyBinary target, a user would run bazel build :MyBinary. Upon entering that command for the first time in a clean repository, Bazel would do the following:

+ +
    +
  1. +

    Parse every BUILD file in the workspace to create a graph of dependencies among artifacts.

    +
  2. +
  3. +

    Use the graph to determine the transitive dependencies of MyBinary; that is, every target that MyBinary depends on and every target that those targets depend on, recursively.

    +
  4. +
  5. +

    Build (or download for external dependencies) each of those dependencies, in order. Bazel starts by building each target that has no other dependencies and keeps track of which dependencies still need to be built for each target. As soon as all of a target’s dependencies are built, Bazel starts building that target. This process continues until every one of MyBinary’s transitive dependencies have been built.

    +
  6. +
  7. +

    Build MyBinary to produce a final executable binary that links in all of the dependencies that were built in step 3.

    +
  8. +
+ +

Fundamentally, it might not seem like what’s happening here is that much different than what happened when using a task-based build system. Indeed, the end result is the same binary, and the process for producing it involved analyzing a bunch of steps to find dependencies among them, and then running those steps in order. But there are critical differences.  The first one appears in step 3: because Bazel knows that each target will only produce a Java library, it knows that all it has to do is run the Java compiler rather than an arbitrary user-defined script, so it knows that it’s safe to run these steps in parallel.  This can produce an order of magnitude performance improvement over building targets one at a time on a multicore machine, and is only possible because the artifact-based approach leaves the build system in charge of its own execution strategy so that it can make stronger guarantees about parallelism.

+ +

The benefits extend beyond parallelism, though. The next thing that this approach gives us becomes apparent when the developer types bazel build :MyBinary a second time without making any changes: Bazel will exit in less than a second with a message saying that the target is up to date.  This is possible due to the functional programming paradigm we talked about earlier—Bazel knows that each target is the result only of running a Java compiler, and it knows that the output from the Java compiler depends only on its inputs, so as long as the inputs haven’t changed, the output can be reused. And this analysis works at every level; if MyBinary.java changes, Bazel knows to rebuild MyBinary but reuse mylib. If a source file for //java/com/example/common changes, Bazel knows to rebuild that library, mylib, and MyBinary, but reuse //java/com/example/myproduct/otherlib. Because Bazel knows about the properties of the tools it runs at every step, it’s able to rebuild only the minimum set of artifacts each time while guaranteeing that it won’t produce stale builds.

+ +

Reframing the build process in terms of artifacts rather than tasks is subtle but powerful. By reducing the flexibility exposed to the programmer, the build system can know more about what is being done at every step of the build. It can use this knowledge to make the build far more efficient by parallelizing build processes and reusing their outputs. But this is really just the first step, and these building blocks of parallelism and reuse will form the basis for a distributed and highly scalable build system that will be discussed later.

+
+
+ +
+

Other nifty Bazel tricks

+ +

Artifact-based build systems fundamentally solve the problems with parallelism and reuse that are inherent in task-based build systems.  But there are still a few problems that came up earlier that we haven’t addressed. Bazel has clever ways of solving each of these, and we should discuss them before moving on.

+ +
+

Tools as dependencies

+ +

One problem we ran into  earlier was that builds depended on the tools installed on our machine, and reproducing builds across systems could be difficult due to different tool versions or locations. The problem becomes even more difficult when your project uses languages that require different tools based on which platform they’re being built on or compiled for (e.g., Windows versus Linux), and each of those platforms requires a slightly different set of tools to do the same job.

+ +

Bazel solves the first part of this problem by treating tools as dependencies to each target.  Every java_library in the workspace implicitly depends on a Java compiler, which defaults to a well-known compiler but can be configured globally at the workspace level. Whenever Blaze builds a java_library, it checks to make sure that the specified compiler is available at a known location and downloads it if not. Just like any other dependency, if the Java compiler changes, every artifact that was dependent upon it will need to be rebuilt. Every type of target defined in Bazel uses this same strategy of declaring the tools it needs to run, ensuring that Bazel is able to bootstrap them no matter what exists on the system where it runs.

+ +

Bazel solves the second part of  the problem, platform independence, by using toolchains. Rather than having targets depend directly on their tools, they actually depend on types of toolchains.  A toolchain contains a set of tools and other properties defining how a type of target is built on a particular platform. The workspace can define the particular toolchain to use for a toolchain type based on the host and target platform. For more details, see the Bazel manual.

+
+ +
+

Extending the build system

+ +

Bazel comes with targets for several popular programming languages out of the box, but engineers will always  want to do more—part of the benefit of task-based systems is their flexibility in supporting any kind of build process, and it would be better not to give that up in an artifact-based build system.  Fortunately, Bazel allows its supported target types to be extended by adding custom rules.

+ +

To define a rule in Bazel, the rule author declares the inputs that the rule requires (in the form of attributes passed in the BUILD file) and the fixed set of outputs that the rule produces. The author also defines the actions that will be generated by that rule. Each action declares its inputs and outputs, runs a particular executable or writes a particular string to a file, and can be connected to other actions via its inputs and outputs. This means that actions are the lowest-level composable unit in the build system—an action can do whatever it wants so long as it uses only its declared inputs and outputs, and Bazel will take care of scheduling actions and caching their results as appropriate.

+ +

The system isn’t foolproof given that there’s no way to stop an action developer from doing something like introducing a nondeterministic process as part of their action. But this doesn’t happen very often in practice, and pushing the possibilities for abuse all the way down to the action level greatly decreases opportunities for errors. Rules supporting many common languages and tools are widely available online, and most projects will never need to define their own rules. Even for those that do, rule definitions only need to be defined in one central place in the repository, meaning most engineers will be able to use those rules without ever having to worry about their implementation.

+
+ +
+

Isolating the environment

+ +

Actions sound like they might run  into the same problems as tasks in other systems—isn’t it still possible to write actions that both write to the same file and end up conflicting with one another?  Actually, Bazel makes these conflicts impossible by using sandboxing. On supported systems, every action is isolated from every other action via a filesystem sandbox. Effectively, each action can see only a restricted view of the filesystem that includes the inputs it has declared and any outputs it has produced. This is enforced by systems such as LXC on Linux, the same technology behind Docker. This means that it’s impossible for actions to conflict with one another because they are unable to read any files they don’t declare, and any files that they write but don’t declare will be thrown away when the action finishes. Bazel also uses sandboxes to restrict actions from communicating via the network.

+
+ +
+

Making external dependencies deterministic

+ +

There’s still one problem remaining: build systems often  need to download dependencies (whether tools or libraries) from external sources rather than directly building them.  This can be seen in the example via the @com_google_common_guava_guava//jar dependency, which downloads a JAR file from Maven.

+ +

Depending on files outside of the current workspace is risky. Those files could change at any time, potentially requiring the build system to constantly check whether they’re fresh.  If a remote file changes without a corresponding change in the workspace source code, it can also lead to unreproducible builds—a build might work one day and fail the next for no obvious reason due to an unnoticed dependency change.  Finally, an external dependency can introduce a huge security risk when it is owned by a third party:4 if an attacker is able to infiltrate that third-party server, they can replace the dependency file with something of their own design, potentially giving them full control over your build environment and its output.

+ +

The fundamental problem is that we want the build system to be aware of these files without having to check them into source control. Updating a dependency should be a conscious choice, but that choice should be made once in a central place rather than managed by individual engineers or automatically by the system. This is because even with a "Live at Head" model, we still want builds to be deterministic, which implies that if you check out a commit from last week, you should see your dependencies as they were then rather than as they are now.

+ +

Bazel and some other build systems address this problem by requiring a workspace-wide manifest file that lists a cryptographic hash for every external  dependency in the workspace.5 The hash is a concise way to uniquely represent the file without checking the entire file into source control. Whenever a new external dependency is referenced from a workspace, that dependency’s hash is added to the manifest, either manually or automatically. When Bazel runs a build, it checks the actual hash of its cached dependency against the expected hash defined in the manifest and redownloads the file only if the hash differs.

+ +

If the artifact we download has a different hash than the one declared in the manifest, the build will fail unless the hash in the manifest is updated. This can be done automatically, but that change must be approved and checked into source control before the build will accept the new dependency. This means that there’s always a record of when a dependency was updated, and an external dependency can’t change without a corresponding change in the workspace source. It also means that, when checking out an older version of the source code, the build is guaranteed to use the same dependencies that it was using at the point when that version was checked in (or else it will fail if those dependencies are no longer available).

+ +

Of course, it can still be a problem if a remote server becomes unavailable or starts serving corrupt data—this can cause all of your builds to begin failing if you don’t have another copy of that dependency available. To avoid this problem, we recommend that, for any nontrivial project, you mirror all of its dependencies onto servers or services that you trust and control. Otherwise you will always be at the mercy of a third party for your build system’s availability, even if the checked-in hashes guarantee its security.   

+
+
+
+ +
+

Distributed Builds

+ +

Google’s codebase is enormous—with more than two  billion lines of code, chains of dependencies can become very deep.  Even simple binaries at Google often depend on tens of thousands of build targets. At this scale, it’s simply impossible to complete a build in a reasonable amount of time on a single machine: no build system can get around the fundamental laws of physics imposed on a machine’s hardware. The only way to make this work is with a build system that supports distributed builds wherein the units of work being done by the system are spread across an arbitrary and scalable number of machines. Assuming we’ve broken the system’s work into small enough units (more on this later), this would allow us to complete any build of any size as quickly as we’re willing to pay for. This scalability is the holy grail we’ve been working toward by defining an artifact-based build system.

+ +
+

Remote caching

+ +

The simplest type  of distributed build is one  that only leverages remote caching, which is shown in Figure 18-2.

+ +
A distributed build showing remote caching +
Figure 18-2. A distributed build showing remote caching
+
+ +

Every system that performs builds, including both developer workstations and continuous integration systems, shares a reference to a common remote cache service. This service might be a fast and local short-term storage system like Redis or a cloud service like Google Cloud Storage. Whenever a user needs to build an artifact, whether directly or as a dependency, the system first checks with the remote cache to see if that artifact already exists there. If so, it can download the artifact instead of building it. If not, the system builds the artifact itself and uploads the result back to the cache. This means that low-level dependencies that don’t change very often can be built once and shared across users rather than having to be rebuilt by each user. At Google, many artifacts are served from a cache rather than built from scratch, vastly reducing the cost of running our build system.

+ +

For a remote caching system to work, the build system must guarantee that builds are completely reproducible. That is, for any build target, it must be possible to determine the set of inputs to that target such that the same set of inputs will produce exactly the same output on any machine. This is the only way to ensure that the results of downloading an artifact are the same as the results of building it oneself.  Fortunately, Bazel provides this guarantee and so supports remote caching. Note that this requires that each artifact in the cache be keyed on both its target and a hash of its inputs—that way, different engineers could make different modifications to the same target at the same time, and the remote cache would store all of the resulting artifacts and serve them appropriately without conflict.

+ +

Of course, for there to be any benefit from a remote cache, downloading an artifact needs to be faster than building it. This is not always the case, especially if the cache server is far from the machine doing the build. Google’s network and build system is carefully tuned to be able to quickly share build results. When configuring remote caching in your organization, take care to consider network latencies and perform experiments to ensure that the cache is actually improving performance.

+
+ +
+

Remote execution

+ +

Remote caching isn’t a true distributed build.  If the cache is lost or if you make a low-level change  that requires everything to be rebuilt, you still need to perform the entire build locally on your machine. The true goal is to support remote execution, in which the actual work of doing the build can be spread across any number of workers. Figure 18-3 depicts a remote execution system.

+ +
A remote execution system +
Figure 18-3. A remote execution system
+
+ +

The build tool running on each user’s machine (where users are either human engineers or automated build systems) sends requests to a central build master. The build master breaks the requests into their component actions and schedules the execution of those actions over a scalable pool of workers. Each worker performs the actions asked of it with the inputs specified by the user and writes out the resulting artifacts. These artifacts are shared across the other machines executing actions that require them until the final output can be produced and sent to the user.

+ +

The trickiest part of implementing such a system is managing the communication between the workers, the master, and the user’s local machine. Workers might depend on intermediate artifacts produced by other workers, and the final output needs to be sent back to the user’s local machine. To do this, we can build on top of the distributed cache described previously by having each worker write its results to and read its dependencies from the cache. The master blocks workers from proceeding until everything they depend on has finished, in which case they’ll be able to read their inputs from the cache. The final product is also cached, allowing the local machine to download it. Note that we also need a separate means of exporting the local changes in the user’s source tree so that workers can apply those changes before building.

+ +

For this to work, all of the parts of the artifact-based build systems described earlier need to come together. Build environments must be completely self-describing so that we can spin up workers without human intervention. Build processes themselves must be completely self-contained because each step might be executed on a different machine. Outputs must be completely deterministic so that each worker can trust the results it receives from other workers. Such guarantees are extremely difficult for a task-based system to provide, which makes it nigh-impossible to build a reliable remote execution system on top of one.

+ +
+

Distributed builds at Google

+ +

Since 2008, Google has been using a distributed  build system that employs both remote caching and remote execution, which is illustrated in Figure 18-4.

+ +
Google’s distributed build system +
Figure 18-4. Google’s distributed build system
+
+ +

Google’s remote cache is called ObjFS.  It consists of a backend that stores build outputs in Bigtables distributed throughout our fleet of production machines and a frontend FUSE daemon named objfsd that runs on each developer’s machine. The FUSE daemon allows engineers to browse build outputs as if they were normal files stored on the workstation, but with the file content downloaded on-demand only for the few files that are directly requested by the user. Serving file contents on-demand greatly reduces both network and disk usage, and the system is able to build twice as fast compared to when we stored all build output on the developer’s local disk.

+ +

Google’s remote execution system is called Forge.   A Forge client in Blaze called the Distributor sends requests for each action to a job running in our datacenters called the Scheduler. The Scheduler maintains a cache of action results, allowing it to return a response immediately if the action has already been created by any other user of the system. If not, it places the action into a queue. A large pool of Executor jobs continually read actions from this queue, execute them, and store the results directly in the ObjFS Bigtables. These results are available to the executors for future actions, or to be downloaded by the end user via objfsd.

+ +

The end result is a system that scales to efficiently support all builds performed at Google. And the scale of Google’s builds is truly massive: Google runs millions of builds executing millions of test cases and producing petabytes of build outputs from billions of lines of source code every day. Not only does such a system let our engineers build complex codebases quickly, it also allows us to implement a huge number of automated tools and systems that rely on our build. We put many years of effort into developing this system, but nowadays open source tools are readily available such that any organization can implement a similar system. Though it can take time and energy to deploy such a build system, the end result can be truly magical for engineers and is often well worth the effort.  

+
+
+
+ +
+

Time, Scale, Trade-Offs

+ +

Build systems are all about making code easier to work with at scale and over time. And like everything in  software engineering, there are trade-offs in choosing which sort of build system to use. The DIY approach using shell scripts or direct invocations of tools works only for the smallest projects that don’t need to deal with code changing over a long period of time, or for languages like Go that have a built-in build system.

+ +

Choosing a task-based build system  instead of relying on DIY scripts greatly improves your project’s ability to scale, allowing you to automate complex builds and more easily reproduce those builds across machines. The trade-off is that you need to actually start putting some thought into how your build is structured and deal with the overhead of writing build files (though automated tools can often help with this). This trade-off tends to be worth it for most projects, but for particularly trivial projects (e.g., those contained in a single source file), the overhead might not buy you much.

+ +

Task-based build systems begin to run into some fundamental problems as the project scales further, and these issues can be remedied by using an artifact-based build system instead.  Such build systems unlock a whole new level of scale because huge builds can now be distributed across many machines, and thousands of engineers can be more certain that their builds are consistent and reproducible. As with so many other topics in this book, the trade-off here is a lack of flexibility: artifact-based systems don’t let you write generic tasks in a real programming language, but require you to work within the constraints of the system. This is usually not a problem for projects that are designed to work with artifact-based systems from the start, but migration from an existing task-based system can be difficult and is not always worth it if the build isn’t already showing problems in terms of speed or correctness.

+ +

Changes to a project’s build system can be expensive, and that cost increases as the project becomes larger. This is why Google believes that almost every new project benefits from incorporating an artifact-based build system like Bazel right from the start. Within Google, essentially all code from tiny experimental projects up to Google Search is built using Blaze. 

+
+
+ +
+

Dealing with Modules and Dependencies

+ +

Projects that use  artifact-based build systems like Bazel are broken into a set of modules, with  modules expressing dependencies on one another via BUILD files. Proper organization of these modules and dependencies can have a huge effect on both the performance of the build system and how much work it takes to maintain.

+ +
+

Using Fine-Grained Modules and the 1:1:1 Rule

+ +

The first question that comes up when structuring an artifact-based build is deciding how much functionality  an individual module  should encompass. In Bazel, a "module" is represented by a target specifying a buildable unit like a java_library or a go_binary. At one extreme, the entire project could be contained in a single module by putting one BUILD file at the root and recursively globbing together all of that project’s source files. At the other extreme, nearly every source file could be made into its own module, effectively requiring each file to list in a BUILD file every other file it depends on.

+ +

Most projects fall somewhere between these extremes, and the choice involves a trade-off between performance and maintainability. Using a single module for the entire project might mean that you never need to touch the BUILD file except when adding an external dependency, but it means that the build system will always need to build the entire project all at once. This means that it won’t be able to parallelize or distribute parts of the build, nor will it be able to cache parts that it’s already built. One-module-per-file is the opposite: the build system has the maximum flexibility in caching and scheduling steps of the build, but engineers need to expend more effort maintaining lists of dependencies whenever they change which files reference which.

+ +

Though the exact granularity varies by language (and often even within language), Google tends to favor significantly smaller modules than one might typically write in a task-based build system. A typical production binary at Google will likely depend on tens of thousands of targets, and even a moderate-sized team can own several hundred targets within its codebase.  For languages like Java that have a strong built-in notion of packaging, each directory usually contains a single package, target, and BUILD file (Pants, another build system based on Blaze, calls this the 1:1:1 rule). Languages with weaker packaging conventions will frequently define multiple targets per BUILD file.

+ +

The benefits of smaller build targets really begin to show at scale because they lead to faster distributed builds and a less frequent need to rebuild targets. The advantages become even more compelling after testing enters the picture, as finer-grained targets mean that the build system can be much smarter about running only a limited subset of tests that could be affected by any given change. Because Google believes in the systemic benefits of using smaller targets, we’ve made some strides in mitigating the downside by investing in tooling to automatically manage BUILD files to avoid burdening developers. Many of these tools are now open source.

+
+ +
+

Minimizing Module Visibility

+ +

Bazel and other build systems allow each target to specify a visibility: a property that specifies which other targets may depend on it.    Targets can be public, in which case they can be referenced by any other target in the workspace; private, in which case they can be referenced only from within the same BUILD file; or visible to only an explicitly defined list of other targets. A visibility is essentially the opposite of a dependency: if target A wants to depend on target B, target B must make itself visible to target A.

+ +

Just like in most programming languages, it is usually best to minimize visibility as much as possible. Generally, teams at Google will make targets public only if those targets represent widely used libraries available to any team at Google. Teams that require others to coordinate with them before using their code will maintain a whitelist of customer targets as their target’s visibility. Each team’s internal implementation targets will be restricted to only directories owned by the team, and most BUILD files will have only one target that isn’t private.

+
+ +
+

Managing Dependencies

+ +

Modules need to be able to  refer to one another.  The downside of breaking a codebase into fine-grained modules is that you need to manage  the dependencies among those modules (though tools can help automate this). Expressing these dependencies usually ends up being the bulk of the content in a BUILD file.

+ +
+

Internal dependencies

+ +

In a large project broken  into fine-grained modules, most dependencies are likely to be internal; that is, on another target defined and built in the same source repository. Internal dependencies differ from external dependencies in that they are built from source rather than downloaded as a prebuilt artifact while running the build. This also means that there’s no notion of "version" for internal dependencies—a target and all of its internal dependencies are always built at the same commit/revision in the repository.

+ +

One issue that should be handled carefully with regard to internal dependencies is how to  treat transitive dependencies (Figure 18-5). Suppose target A depends on target B, which depends on a common library target C. Should target A be able to use classes defined in target C?

+ +
Transitive dependencies +
Figure 18-5. Transitive dependencies
+
+ +

As far as the underlying tools are concerned, there’s no problem with this; both B and C will be linked into target A when it is built, so any symbols defined in C are known to A. Blaze allowed this for many years, but as Google grew, we began to see problems. Suppose that B was refactored such that it no longer needed to depend on C. If B’s dependency on C was then removed, A and any other target that used C via a dependency on B would break. Effectively, a target’s dependencies became part of its public contract and could never be safely changed. This meant that dependencies accumulated over time and builds at Google started to slow down. 

+ +

Google eventually solved this issue by introducing a "strict transitive dependency mode" in Blaze. In this mode, Blaze detects whether a target tries to reference a symbol without depending on it directly and, if so, fails with an error and a shell command that can be used to automatically insert the dependency. Rolling this change out across Google’s entire codebase and refactoring every one of our millions of build targets to explicitly list their dependencies was a multiyear effort, but it was well worth it. Our builds are now much faster given that targets have fewer unnecessary dependencies,6 and engineers are empowered to remove dependencies they don’t need without worrying about breaking targets that depend on them.

+ +

As usual, enforcing strict transitive dependencies involved a trade-off. It made build files more verbose, as frequently used libraries now need to be listed explicitly in many places rather than pulled in incidentally, and engineers needed to spend more effort adding dependencies to BUILD files. We’ve since developed tools that reduce this toil by automatically detecting many missing dependencies and adding them to a BUILD files without any developer intervention. But even without such tools, we’ve found the trade-off to be well worth it as the codebase scales: explicitly adding a dependency to BUILD file is a one-time cost, but dealing with implicit transitive dependencies can cause ongoing problems as long as the build target exists. Bazel enforces strict transitive dependencies on Java code by default.

+
+ +
+

External dependencies

+ +

If a dependency  isn’t internal, it must be external. External dependencies are those on artifacts that are built and stored outside of the build system. The dependency is imported directly from an artifact repository (typically accessed over the internet) and used as-is rather than being built from source. One of the biggest differences between external and internal dependencies is that external dependencies have versions, and those versions exist independently of the project’s source code.

+ +
+

Automatic versus manual dependency management

+ +

Build systems can allow the versions of external dependencies to be managed either manually or automatically.  When managed manually, the buildfile explicitly lists the version it wants to download from  the artifact repository, often using a semantic version string such as "1.1.4". When managed automatically, the source file specifies a range of acceptable versions, and the build system always downloads the latest one.  For example, Gradle allows a dependency version to be declared as "1.+" to specify that any minor or patch version of a dependency is acceptable so long as the major version is 1.

+ +

Automatically managed dependencies can be convenient for small projects, but they’re usually a recipe for disaster on projects of nontrivial size or that are being worked on by more than one engineer. The problem with automatically managed dependencies is that you have no control over when the version is updated. There’s no way to guarantee that external parties won’t make breaking updates (even when they claim to use semantic versioning), so a build that worked one day might be broken the next with no easy way to detect what changed or to roll it back to a working state. Even if the build doesn’t break, there can be subtle behavior or performance changes that are impossible to track down.

+ +

In contrast, because manually managed dependencies require a change in source control, they can be easily discovered and rolled back, and it’s possible to check out an older version of the repository to build with older dependencies.  Bazel requires that versions of all dependencies be specified manually. At even moderate scales, the overhead of manual version management is well worth it for the stability it provides.

+
+ +
+

The One-Version Rule

+ +

Different versions of a library are usually represented by different artifacts, so in theory there’s no reason that different   versions of the same external dependency couldn’t both be declared in the build system under different names. That way, each target could choose which version of the dependency it wanted to use. Google has found this to cause a lot of problems in practice, so we enforce a strict One-Version Rule for all third-party dependencies in our internal codebase.

+ +

The biggest problem with allowing multiple versions is the diamond dependency issue.  Suppose that target A depends on target B and on v1 of an external library. If target B is later refactored to add a dependency on v2 of the same external library, target A will break because it now depends implicitly on two different versions of the same library. Effectively, it’s never safe to add a new dependency from a target to any third-party library with multiple versions, because any of that target’s users could already be depending on a different version. Following the One-Version Rule makes this conflict impossible—if a target adds a dependency on a third-party library, any existing dependencies will already be on that same version, so they can happily coexist.

+ +

We’ll examine this further in the context of a large monorepo in Dependency Management.

+
+ +
+

Transitive external dependencies

+ +

Dealing with the transitive dependencies of an external dependency can be particularly difficult.   Many artifact repositories such as Maven Central allow artifacts to specify dependencies on particular versions of other artifacts in the repository. Build tools like Maven or Gradle will often recursively download each transitive dependency by default, meaning that adding a single dependency in your project could potentially cause dozens of artifacts to be downloaded in total.

+ +

This is very convenient: when adding a dependency on a new library, it would be a big pain to have to track down each of that library’s transitive dependencies and add them all manually. But there’s also a huge downside: because different libraries can depend on different versions of the same third-party library, this strategy necessarily violates the One-Version Rule and leads to the diamond dependency problem. If your target depends on two external libraries that use different versions of the same dependency, there’s no telling which one you’ll get. This also means that updating an external dependency could cause seemingly unrelated failures throughout the codebase if the new version begins pulling in conflicting versions of some of its dependencies.

+ +

For this reason, Bazel does not automatically download transitive dependencies. And, unfortunately, there’s no silver bullet—Bazel’s alternative is to require a global file that lists every single one of the repository’s external dependencies and an explicit version used for that dependency throughout the repository. Fortunately, Bazel provides tools that are able to automatically generate such a file containing the transitive dependencies of a set of Maven artifacts. This tool can be run once to generate the initial WORKSPACE file for a project, and that file can then be manually updated to adjust the versions of each dependency.

+ +

Yet again, the choice here is one between convenience and scalability. Small projects might prefer not having to worry about managing transitive dependencies themselves and might be able to get away with using automatic transitive dependencies. This strategy becomes less and less appealing as the organization and codebase grows, and conflicts and unexpected results become more and more frequent. At larger scales, the cost of manually managing dependencies is much less than the cost of dealing with issues caused by automatic dependency management.

+
+ +
+

Caching build results using external dependencies

+ +

External dependencies are  most often provided by third parties that release stable versions of libraries, perhaps without providing source code.  Some organizations might also choose to make some of their own code available as artifacts, allowing other pieces of code to depend on them as third-party rather than internal dependencies. This can theoretically speed up builds if artifacts are slow to build but quick to download.

+ +

However, this also introduces a lot of overhead and complexity: someone needs to be responsible for building each of those artifacts and uploading them to the artifact repository, and clients need to ensure that they stay up to date with the latest version. Debugging also becomes much more difficult because different parts of the system will have been built from different points in the repository, and there is no longer a consistent view of the source tree.

+ +

A better way to solve the problem of artifacts taking a long time to build is to use a build system that supports remote caching, as described earlier. Such a build system will save the resulting artifacts from every build to a location that is shared across engineers, so if a developer depends on an artifact that was recently built by someone else, the build system will automatically download it instead of building it. This provides all of the performance benefits of depending directly on artifacts while still ensuring that builds are as consistent as if they were always built from the same source. This is the strategy used internally by Google, and Bazel can be configured to use a remote cache.

+
+ +
+

Security and reliability of external dependencies

+ +

Depending on artifacts from third-party  sources is inherently risky.  There’s an availability risk  if the third-party source (e.g., an artifact repository) goes down, because your entire build might grind to a halt if it’s unable to download an external dependency. There’s also a security risk: if the third-party system is compromised by an attacker, the attacker could replace the referenced artifact with one of their own design, allowing them to inject arbitrary code into your build.

+ +

Both problems can be mitigated by mirroring any artifacts you depend on onto servers you control and blocking your build system from accessing third-party artifact repositories like Maven Central. The trade-off is that these mirrors take effort and resources to maintain, so the choice of whether to use them often depends on the scale of the project. The security issue can also be completely prevented with little overhead by requiring the hash of each third-party artifact to be specified in the source repository, causing the build to fail if the artifact is tampered with.

+ +

Another alternative that completely sidesteps the issue is to vendor your project’s dependencies.  When a project vendors its dependencies, it checks them into source control alongside the project’s source code, either as source or as binaries. This effectively means that all of the project’s external dependencies are converted to internal dependencies. Google uses this approach internally, checking every third-party library referenced throughout Google into a third_party directory at the root of Google’s source tree. However, this works at Google only because Google’s source control system is custom built to handle an extremely large monorepo, so vendoring might not be an option for other organizations.     

+
+
+
+
+ +
+

Conclusion

+ +

A build system is one of the most important parts of an engineering organization. Each developer will interact with it potentially dozens or hundreds of times per day, and in many situations, it can be the rate-limiting step in determining their productivity. This means that it’s worth investing time and thought into getting things right.

+ +

As discussed in this chapter, one of the more surprising lessons that Google has learned is that limiting engineers’ power and flexibility can improve their productivity. We were able to develop a build system that meets our needs not by giving engineers free reign in defining how builds are performed, but by developing a highly structured framework that limits individual choice and leaves most interesting decisions in the hands of automated tools. And despite what you might think, engineers don’t resent this: Googlers love that this system mostly works on its own and lets them focus on the interesting parts of writing their applications instead of grappling with build logic. Being able to trust the build is powerful—incremental builds just work, and there is almost never a need to clear build caches or run a “clean†step.

+ +

We took this insight and used it to create a whole new type of artifact-based build system, contrasting with traditional task-based build systems. This reframing of the build as centering around artifacts instead of tasks is what allows our builds to scale to an organization the size of Google. At the extreme end, it allows for a distributed build system that is able to leverage the resources of an entire compute cluster to accelerate engineers’ productivity. Though your organization might not be large enough to benefit from such an investment, we believe that artifact-based build systems scale down as well as they scale up: even for small projects, build systems like Bazel can bring significant benefits in terms of speed and correctness.

+ +

The remainder of this chapter explored how to manage dependencies in an artifact-based world. We came to the conclusion that fine-grained modules scale better than coarse-grained modules. We also discussed the difficulties of managing dependency versions, describing the One-Version Rule and the observation that all dependencies should be versioned manually and explicitly. Such practices avoid common pitfalls like the diamond dependency issue and allow a codebase to achieve Google’s scale of billions of lines of code in a single repository with a unified build system.

+
+ +
+

TL;DRs

+ +
    +
  • +

    A fully featured build system is necessary to keep developers productive as an organization scales.

    +
  • +
  • +

    Power and flexibility come at a cost. Restricting the build system appropriately makes it easier on developers.

    +
  • +
  • +

    Build systems organized around artifacts tend to scale better and be more reliable than build systems organized around tasks.

    +
  • +
  • +

    When defining artifacts and dependencies, it’s better to aim for fine-grained modules. Fine-grained modules are better able to take advantage of parallelism and incremental builds.

    +
  • +
  • +

    External dependencies should be versioned explicitly under source control. Relying on "latest" versions is a recipe  for disaster and unreproducible builds.

    +
  • +
+
+

1In an internal survey, 83% of Googlers reported being satisfied with the build system, making it the fourth most satisfying tool of the 19 surveyed. The average tool had a satisfaction rating of 69%.

2See https://buck.build/ and https://www.pantsbuild.org/index.html.

3Ant uses the word "target" to represent what we call a "task" in this chapter, and it uses the word "task" to refer to what we call "commands."

4Such "software supply chain" attacks are becoming more common.

5Go recently added preliminary support for modules using the exact same system.

6Of course, actually removing these dependencies was a whole separate process. But requiring each target to explicitly declare what it used was a critical first step. See Large-Scale Changes for more information about how Google makes large-scale changes like this.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch19.html b/clones/abseil.io/resources/swe-book/html/ch19.html new file mode 100644 index 00000000..f7a7ad89 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch19.html @@ -0,0 +1,387 @@ + + + + + Software Engineering at Google + + + + +
+

Critique: Google’s Code Review Tool

+ + + + + +

As you saw in Code Review, code review is a vital part of software development, particularly when working at scale.  The main goal of code review is to improve the readability and maintainability of the code base, and this is supported fundamentally by the review process. However, having a well-defined code review process is only one part of the code review story. Tooling that supports that process also plays an important part in its success.

+ +

In this chapter, we’ll look at what makes successful code review tooling via Google’s well-loved in-house system, Critique. Critique has explicit support for the primary motivations of code review, providing reviewers and authors with a view of the review and ability to comment on the change. Critique also has support for gatekeeping what code is checked into the codebase, discussed in the section on "scoring" changes. Code review information from Critique also can be useful when doing code archaeology, following some technical decisions that are explained in code review interactions (e.g., when inline comments are lacking). Although Critique is not the only code review tool used at Google, it is the most popular one by a large margin.

+ +
+

Code Review Tooling Principles

+ +

We mentioned above that Critique provides functionality to support the goals of code review (we look at this functionality in more detail later in this chapter), but why is it so successful?  Critique has been shaped by Google’s development culture, which includes code review as a core part of the workflow. This cultural influence translates into a set of guiding principles that Critique was designed to emphasize:

+ +
+
Simplicity
+
Critique’s user interface (UI) is based around making it easy to do code review without a lot of unnecessary choices, and with a smooth interface. The UI loads fast, navigation is easy and hotkey supported, and there are clear visual markers for the overall state of whether a change has been reviewed.
+
Foundation of trust
+
Code review is not for slowing others down; instead, it is for empowering others. Trusting colleagues as much as possible makes it work.  This might mean, for example, trusting authors to make changes and not requiring an additional review phase to double check that minor comments are actually addressed. Trust also plays out by making changes openly accessible (for viewing and reviewing) across Google.
+
Generic communication
+
Communication problems are rarely solved through tooling. Critique prioritizes generic ways for users to comment on the code changes, instead of complicated protocols. Critique encourages users to spell out what they want in their comments or even suggests some edits instead of making the data model and process more complex. Communication can go wrong even with the best code review tool because the users are humans.
+
Workflow integration
+
Critique has a number of integration points with other core software development tools. Developers can easily navigate to view the code under review in our code search and browsing tool, edit code in our web-based code editing tool, or view test results associated with a code change.
+
+ +

Across these guiding principles, simplicity has probably had the most impact on the tool. There were many interesting features we considered adding, but we decided not to make the model more complicated to support a small set of users.

+ +

Simplicity also has an interesting tension with workflow integration. We considered but ultimately decided against creating a “Code Central†tool with code editing, reviewing, and searching in one tool. Although Critique has many touchpoints with other tools, we consciously decided to keep code review as the primary focus. Features are linked from Critique but implemented in different subsystems.

+
+ +
+

Code Review Flow

+ +

Code reviews can be executed at many stages  of software  development, as illustrated in Figure 19-1. Critique reviews typically take place before a change can be committed to the codebase, also  known as precommit reviews. Although Code Review contains a brief description of the code review flow, here we expand it to describe key aspects of Critique that help at each stage. We’ll look at each stage in more detail in the following sections.

+ +
The code-review flow +
Figure 19-1. The code review flow
+
+ +

Typical review steps go as follows:

+ +
    +
  1. +

    Create a change. A user authors a change to the codebase in their workspace. This author then uploads a snapshot (showing a patch at a particular point in time) to Critique, which triggers the run of automatic code analyzers (see Static Analysis).

    +
  2. +
  3. +

    Request review. After the author is satisfied with the diff of the change and the result of the analyzers shown in Critique, they mail the change to one or more reviewers.

    +
  4. +
  5. +

    Comment. Reviewers open the change in Critique and draft comments on the diff. Comments are by default marked as unresolved, meaning they are crucial for the author to address. Additionally, reviewers can add resolved comments that are optional or informational. Results from automatic code analyzers, if present, are also visible to reviewers. Once a reviewer has drafted a set of comments, they need to publish them in order for the author to see them; this has the advantage of allowing a reviewer to provide a complete thought on a change atomically, after having reviewed the entire change. Anyone can comment on changes, providing a “drive-by review†as they see it necessary.

    +
  6. +
  7. +

    Modify change and reply to comments. The author modifies the change, uploads new snapshots based on the feedback, and replies back to the reviewers. The author addresses (at least) all unresolved comments, either by changing the code or just replying to the comment and changing the comment type to be resolved. The author and reviewers can look at diffs between any pairs of snapshots to see what changed. Steps 3 and 4 might be repeated multiple times.

    +
  8. +
  9. +

    Change approval. When the reviewers are happy with the latest state of the change, they approve the change and mark it as “looks good to me†(LGTM).  They can optionally include comments to address. After a change is deemed good for submission, it is clearly marked green in the UI to show this state.

    +
  10. +
  11. +

    Commit a change. Provided the change is approved (which we’ll discuss shortly), the author can trigger the commit process of the change. If automatic analyzers and other precommit hooks (called “presubmitsâ€) don’t find any problems, the change is committed to the codebase.

    +
  12. +
+ +

Even after the review process is started, the entire system provides significant flexibility to deviate from the regular review flow. For example, reviewers can un-assign themselves from the change or explicitly assign it to someone else, and the author can postpone the review altogether. In emergency cases, the author can forcefully commit their change and have it reviewed after commit.

+ +
+

Notifications

+ +

As a change moves through the stages outlined earlier, Critique publishes event notifications that might be used by other supporting tools.  This notification model allows Critique to focus on being a primary code review tool instead of a general purpose tool, while still being integrated into the developer workflow. Notifications enable a separation of concerns such that Critique can just emit events and other systems build off of those events.

+ +

For example, users can install a Chrome extension that consumes these event notifications. When a change needs the user’s attention—for example, because it is their turn to review the change or some presubmit fails—the extension displays a Chrome notification with a button to go directly to the change or silence the notification. We have found that some developers really like immediate notification of change updates, but others choose not to use this extension because they find it is too disruptive to their flow.

+ +

Critique also manages emails related to a change; important Critique events trigger email notifications. In addition to being displayed in the Critique UI, some analyzer findings are configured to also send the results out by email. Critique also processes email replies and translates them to comments, supporting users who prefer an email-based flow. Note that for many users, emails are not a key feature of code review; they use Critique’s dashboard view (discussed later) to manage reviews.

+
+
+ +
+

Stage 1: Create a Change

+ +

A code review tool should provide support at all stages of the review process and should not be the bottleneck for committing changes.   In the prereview step, making it easier for change authors to polish a change before sending it out for review helps reduce the time taken by the reviewers to inspect the change. Critique displays change diffs with knobs to ignore whitespace changes and highlight move-only changes. Critique also surfaces the results from builds, tests, and static analyzers, including style checks (as discussed in Code Review).

+ +

Showing an author the diff of a change gives them the opportunity to wear a different hat: that of a code reviewer. Critique lets a change author see the diff of their changes as their reviewer will, and also see the automatic analysis results. Critique also supports making lightweight modifications to the change from within the review tool and suggests appropriate reviewers. When sending out the request, the author can also include preliminary comments on the change, providing the opportunity to ask reviewers directly about any open questions. Giving authors the chance to see a change just as their reviewers do prevents misunderstanding.

+ +

To provide further context for the reviewers, the author can also link the change to a specific bug. Critique uses an autocomplete service to show relevant bugs, prioritizing bugs that are assigned to the author.

+ +
+

Diffing

+ +

The core of the code review process is understanding the code change itself.  Larger changes are typically more difficult to understand than smaller ones.  Optimizing the diff of a change is thus a core requirement for a good code review tool.

+ +

In Critique, this principle translates onto multiple layers (see Figure 19-2). The diffing component, starting from an optimized longest common subsequence algorithm, is enhanced with the following:

+ +
    +
  • +

    Syntax highlighting

    +
  • +
  • +

    Cross-references (powered by Kythe; see Code Search)

    +
  • +
  • +

    Intraline diffing that shows the difference on character-level  factoring in the word boundaries (Figure 19-2)

    +
  • +
  • +

    An option to ignore whitespace differences to a varying degree

    +
  • +
  • +

    Move detection, in which  chunks of code that are moved from one place to another are marked as being moved (as opposed to being marked as removed here and added there, as a naive diff algorithm would)

    +
  • +
+ +
Intraline diffing showing character-level differences +
Figure 19-2. Intraline diffing showing character-level differences
+
+ +

Users can also view the diff in various different modes, such as overlay and side by side. When developing Critique, we decided that it was important to have side-by-side diffs to make the review process easier. Side-by-side diffs take a lot of space: to make them a reality, we had to simplify the diff view structure, so there is no border, no padding—just the diff and line numbers. We also had to play around with a variety of fonts and sizes until we had a diff view that accommodates even for Java’s 100-character line limit for the typical screen-width resolution when Critique launched (1,440 pixels).

+ +

Critique further supports a variety of custom tools that provide diffs of artifacts produced by a change, such as a screenshot diff of the UI modified by a change or configuration files generated by a change.

+ +

To make the process of navigating diffs smooth, we were careful not to waste space and spent significant effort ensuring that diffs load quickly, even for images and large files and/or changes. We also provide keyboard shortcuts to quickly navigate through files while visiting only modified sections.

+ +

When users drill down to the file level, Critique provides a UI widget with a compact display of the chain of snapshot versions of a file; users can drag and drop to select which versions to compare. This widget automatically collapses similar snapshots, drawing focus to important snapshots. It helps the user understand the evolution of a file within a change; for example, which snapshots have test coverage, have already been reviewed, or have comments. To address concerns of scale, Critique prefetches everything, so loading different snapshots is very quick.

+
+ +
+

Analysis Results

+ +

Uploading a snapshot of the change  triggers code analyzers (see Static Analysis). Critique displays  the analysis results on  the change page, summarized by analyzer status chips shown below the change description, as depicted in Figure 19-3, and detailed in the Analysis tab, as illustrated in Figure 19-4.

+ +

Analyzers can mark specific findings to highlight in red for increased visibility. Analyzers that are still in progress are represented by yellow chips, and gray chips are displayed otherwise. For the sake of simplicity, Critique offers no other options to mark or highlight findings—actionability is a binary option. If an analyzer produces some results (“findingsâ€), clicking the chip opens up the findings. Like comments, findings can be displayed inside the diff but styled differently to make them easily distinguishable. Sometimes, the findings also include fix suggestions, which the author can preview and choose to apply from Critique.

+ +
Change summary and diff view +
Figure 19-3. Change summary and diff view
+
+ +
Analysis results +
Figure 19-4. Analysis results
+
+ +

For example, suppose that a linter finds a style violation of extra spaces at the end of the line. The change page will display a chip for that linter. From the chip, the author can quickly go to the diff showing the offending code to understand the style violation with two clicks. Most linter violations also include fix suggestions. With a click, the author can preview the fix suggestion (for example, remove the extra spaces), and with another click, apply the fix on the change.

+
+ +
+

Tight Tool Integration

+ +

Google has tools built on top of Piper, its  monolithic source code  repository (see Version Control and Branch Management), such as the following:

+ +
    +
  • +

    Cider, an online IDE for editing source code stored in the cloud

    +
  • +
  • +

    Code Search, a tool for searching code in the codebase

    +
  • +
  • +

    Tricorder, a tool for displaying static analysis results (mentioned earlier)

    +
  • +
  • +

    Rapid, a release tool that packages and deploys binaries containing a series of changes

    +
  • +
  • +

    Zapfhahn, a test coverage calculation tool

    +
  • +
+ +

Additionally, there are services that provide context on change metadata (for example, about users involved in a change or linked bugs). Critique is a natural melting pot for a quick one-click/hover access or even embedded UI support to these systems, although we need to be careful not to sacrifice simplicity. For example, from a change page in Critique, the author needs to click only once to start editing the change further in Cider.  There is support to navigate between cross-references using Kythe or view the mainline state of the code in Code Search (see Code Search). Critique links out to the release tool so that users can see whether a submitted change is in a specific release. For these tools, Critique favors links rather than embedding so as not to distract from the core review experience. One exception here is test coverage: the information of whether a line of code is covered by a test is shown by different background colors on the line gutter in the file’s diff view (not all projects use this coverage tool).

+ +

Note that  tight integration between Critique and a developer’s workspace is possible because of the fact that workspaces are stored in a FUSE-based filesystem, accessible beyond a particular developer’s computer. The Source of Truth is hosted in the cloud and accessible to all of these tools.  

+
+
+ +
+

Stage 2: Request Review

+ +

After the author is happy with the state of the change, they  can send it for review, as depicted in Figure 19-5. This requires the author to pick the reviewers. Within a small team, finding a reviewer might seem simple, but even there it is useful to distribute reviews evenly across team members and consider situations like who is on vacation. To address this, teams can provide an email alias for incoming code reviews. The alias is used by a tool called GwsQ (named after the initial team that used this technique: Google Web Server) that assigns specific reviewers based on the configuration linked to the alias. For example, a change author can assign a review to some-team-list-alias, and GwsQ will pick a specific member of some-team-list-alias to perform the review.

+ +
Requesting reviewers +
Figure 19-5. Requesting reviewers
+
+ +

Given the size of Google’s codebase and the number of people modifying it, it can be difficult to find out who is best qualified to review a change outside your own project. Finding reviewers is a problem to consider when reaching a certain scale. Critique must deal with scale. Critique offers the functionality to propose sets of reviewers that are sufficient to approve the change. The reviewer selection utility takes into account the following factors:

+ +
    +
  • +

    Who owns the code that is being changed (see the next section)

    +
  • +
  • +

    Who is most familiar with the code (i.e., who recently changed it)

    +
  • +
  • +

    Who is available for review (i.e., not out of office and preferably in the same time zone)

    +
  • +
  • +

    The GwsQ team alias setup

    +
  • +
+ +

Assigning a reviewer to a change triggers a review request. This request runs “presubmits†or precommit hooks applicable to the change; teams can configure the presubmits related to their projects in many ways. The most common hooks include the following:

+ +
    +
  • +

    Automatically adding email lists to changes to raise awareness and transparency

    +
  • +
  • +

    Running automated test suites for the project

    +
  • +
  • +

    Enforcing project-specific invariants on both code (to enforce local code style restrictions) and change descriptions (to allow generation of release notes or other forms of tracking)

    +
  • +
+ +

As running tests is resource intensive, at Google they are part of presubmits (run when requesting review and when committing changes) rather than for every snapshot like Tricorder checks. Critique surfaces the result of running the hooks in a similar way to how analyzer results are displayed, with an extra distinction to highlight the fact that a failed result blocks the change from being sent for review or committed. Critique notifies the author via email if presubmits fail. 

+
+ +
+

Stages 3 and 4: Understanding and Commenting on a Change

+ +

After the review process starts, the author and the reviewers work in tandem to reach the goal of committing changes of high quality. 

+ +
+

Commenting

+ +

Making  comments is the second  most common action that users make in Critique after viewing changes (Figure 19-6). Commenting in Critique is free for all. Anyone—not only the change author and the assigned reviewers—can comment on a change.

+ +

Critique also offers the ability to track review progress via per-person state. Reviewers have checkboxes to mark individual files at the latest snapshot as reviewed, helping the reviewer keep track of what they have already looked at. When the author modifies a file, the “reviewed†checkbox for that file is cleared for all reviewers because the latest snapshot has been updated.

+ +
Commenting on the diff view +
Figure 19-6. Commenting on the diff view
+
+ +

When a reviewer sees a relevant analyzer finding, they can click a "Please fix" button to create an unresolved comment asking the author to address the finding. Reviewers can also suggest a fix to a change by inline editing the latest version of the file. Critique transforms this suggestion into a comment with a fix attached that can be applied by the author.

+ +

Critique does not dictate what comments users should create, but for some common comments, Critique provides quick shortcuts. The change author can click the "Done" button on the comment panel to indicate when a reviewer’s comment has been addressed, or the "Ack" button to acknowledge that the comment has been read, typically used for informational or optional comments. Both have the effect of resolving the comment thread if it is unresolved. These shortcuts simplify the workflow and reduce the time needed to respond to review comments.

+ +

As mentioned earlier, comments are drafted as-you-go, but then “published†atomically, as shown in Figure 19-7. This allows authors and reviewers to ensure that they are happy with their comments before sending them out.

+ +
Preparing comments to the author +
Figure 19-7. Preparing comments to the author
+
+
+ +
+

Understanding the State of a Change

+ +

Critique provides  a number of mechanisms to make it clear where in the comment-and-iterate phase a change is currently located. These include a feature for determining who needs to take action next, and a dashboard view of review/author status for all of the changes with which a particular developer is involved.

+ +
+

"Whose turn" feature

+ +

One important factor in accelerating the review process is understanding when it’s your turn to act, especially when there are multiple reviewers assigned to a change. This might be the case if the author wants to have their change reviewed by a software engineer and the user-experience person responsible for the feature, or the SRE carrying the pager for the service. Critique helps define who is expected to look at the change next by managing an attention set for each change.

+ +

The attention set comprises the set of people on which a change is currently blocked. When a reviewer or author is in the attention set, they are expected to respond in a timely manner. Critique tries to be smart about updating the attention set when a user publishes their comments, but users can also manage the attention set themselves. Its usefulness increases even more when there are more reviewers in the change. The attention set is surfaced in Critique by rendering the relevant usernames in bold.

+ +

After we implemented this feature, our users had a difficult time imagining the previous state. The prevailing opinion is: how did we get along without this? The alternative before we implemented this feature was chatting between reviewers and authors to understand who was dealing with a change. This feature also emphasizes the turn-based nature of code review; it is always at least one person’s turn to take action.

+
+ +
+

Dashboard and search system

+ +

Critique’s landing page is the user’s dashboard  page, as depicted in Figure 19-8. The dashboard page is divided into user-customizable sections, each of them containing a list of change summaries.

+ +
Dashboard view +
Figure 19-8. Dashboard view
+
+ +

The dashboard page is powered by  a search system called Changelist Search. Changelist Search indexes the latest state of all available changes (both pre- and post-submit) across all users at Google and allows its users to look up relevant changes by regular expression–based queries. Each dashboard section is defined by a query to Changelist Search. We have spent time ensuring Changelist Search is fast enough for interactive use; everything is indexed quickly so that authors and reviewers are not slowed down, despite the fact that we have an extremely large number of concurrent changes happening simultaneously at Google.

+ +

To optimize the user experience (UX), Critique’s default dashboard setting is to have the first section display the changes that need a user’s attention, although this is customizable. There is also a search bar for making custom queries over all changes and browsing the results. As a reviewer, you mostly just need the attention set. As an author, you mostly just need to take a look at what is still waiting for review to see if you need to ping any changes. Although we have shied away from customizability in some other parts of the Critique UI, we found that users like to set up their dashboards differently without detracting from the fundamental experience, similar to  the way  everyone organizes their emails differently.1

+
+
+
+ +
+

Stage 5: Change Approvals (Scoring a Change)

+ +

Showing whether a reviewer  thinks a change  is good boils down to providing concerns and suggestions via comments. There also needs to be some mechanism for providing a high-level “OK†on a change. At Google, the scoring for a change is divided into three parts:

+ +
    +
  • +

    LGTM ("looks good to me")

    +
  • +
  • +

    Approval

    +
  • +
  • +

    The number of unresolved comments

    +
  • +
+ +

An LGTM stamp  from a reviewer means that "I have reviewed this change, believe that it meets our standards, and I think it is okay to commit it after addressing unresolved comments." An Approval stamp  from a reviewer means that "as a gatekeeper, I allow this change to be committed to the codebase." A reviewer can mark comments as unresolved, meaning that the author will need to act upon them. When the change has at least one LGTM, sufficient approvals and no unresolved comments, the author can then commit the change. Note that every change requires an LGTM regardless of approval status, ensuring that at least two pairs of eyes viewed the change. This simple scoring rule allows Critique to inform the author when a change is ready to commit (shown prominently as a green page header).

+ +

We made a conscious decision in the process of building Critique to simplify this rating scheme. Initially, Critique had a “Needs More Work†rating and also a “LGTM++â€. The model we have moved to is to make LGTM/Approval always positive. If a change definitely needs a second review, primary reviewers can add comments but without LGTM/Approval. After a change transitions into a mostly-good state, reviewers will typically trust authors to take care of small edits—the tooling does not require repeated LGTMs regardless of change size.

+ +

This rating scheme has also had a positive influence on code review culture. Reviewers cannot just thumbs-down a change with no useful feedback; all negative feedback from reviewers must be tied to something specific to be fixed (for example, an unresolved comment). The phrasing “unresolved comment†was also chosen to sound relatively nice.

+ +

Critique includes  a scoring panel, next to the analysis chips, with the following information:

+ +
    +
  • +

    Who has LGTM’ed the change

    +
  • +
  • +

    What approvals are still required and why

    +
  • +
  • +

    How many unresolved comments are still open

    +
  • +
+ +

Presenting the scoring information this way helps the author quickly understand what they still need to do to get the change committed.

+ +

LGTM and Approval are hard requirements and can be granted only by reviewers. Reviewers can also revoke their LGTM and Approval at any time before the change is committed. Unresolved comments are soft requirements; the author can mark a comment “resolved†as they reply. This distinction promotes and relies on trust and communication between the author and the reviewers. For example, a reviewer can LGTM the change accompanied with unresolved comments without later on checking precisely whether the comments are truly addressed, highlighting the trust the reviewer places on the author. This trust is particularly important for saving time when there is a significant difference in time zones between the author and the reviewer. Exhibiting trust is also a good way to build trust and strengthen teams.

+
+ +
+

Stage 6: Commiting a Change

+ +

Last but not least, Critique has a button for committing the change after the review to avoid context-switching to a command-line interface.  

+ +
+

After Commit: Tracking History

+ +

In addition to the core use of Critique as a tool for reviewing source code changes before they are committed to the repository, Critique is also used as a tool for change archaeology.   For most files, developers can view a list of the past history of changes that modified a particular file in the Code Search system (see Code Search), or navigate directly to a change. Anyone at Google can browse the history of a change to generally viewable files, including the comments on and evolution of the change. This enables future auditing and is used to understand more details about why changes were made or how bugs were introduced. Developers can also use this feature to learn how changes were engineered, and code review data in aggregate is used to produce trainings.

+ +

Critique also supports the ability to comment after a change is committed; for example, when a problem is discovered later or additional context might be useful for someone investigating the change at another time. Critique also supports the ability to roll back changes and see whether a particular change has already been rolled back.

+ + +
+
+ +
+

Conclusion

+ +

There are a number of implicit trade-offs when using a code review tool. Critique builds in a number of features and integrates with other tools to make the review process more seamless for its users. Time spent in code reviews is time not spent coding, so any optimization of the review process can be a productivity gain for the company. Having only two people in most cases (author and reviewer) agree on the change before it can be committed keeps velocity high. Google greatly values the educational aspects of code review, even though they are more difficult to quantify.

+ +

To minimize the time it takes for a change to be reviewed, the code review process should flow seamlessly, informing users succinctly of the changes that need their attention and identifying potential issues before human reviewers come in (issues are caught by analyzers and Continuous Integration). When possible, quick analysis results are presented before the longer-running analyses can finish.

+ +

There are several ways in which Critique needs to support questions of scale. The Critique tool must scale to the large quantity of review requests produced without suffering a degradation in performance. Because Critique is on the critical path to getting changes committed, it must load efficiently and be usable for special situations such as unusually large changes.2 The interface must support managing user activities (such as finding relevant changes) over the large codebase and help reviewers and authors navigate the codebase. For example, Critique helps with finding appropriate reviewers for a change without having to figure out the ownership/maintainer landscape (a feature that is particularly important for large-scale changes such as API migrations that can affect many files).

+ +

Critique favors an opinionated process and a simple interface to improve the general review workflow. However, Critique does allow some customizability: custom analyzers and presubmits provide specific context on changes, and some team-specific policies (such as requiring LGTM from multiple reviewers) can be enforced.

+ +

Trust and communication are core to the code review process. A tool can enhance the experience, but can’t replace them. Tight integration with other tools has also been a key factor in Critique’s success.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Trust and communication are core to the code review process. A tool can enhance the experience, but it can’t replace them.

    +
  • +
  • +

    Tight integration with other tools is key to great code review experience.

    +
  • +
  • +

    Small workflow optimizations, like the addition of an explicit “attention set,†can increase clarity and reduce friction substantially. 

    +
  • +
+
+

1Centralized “global†reviewers for large-scale changes (LSCs) are particularly prone to customizing this dashboard to avoid flooding it during an LSC (see Large-Scale Changes).

2Although most changes are small (fewer than 100 lines), Critique is sometimes used to review large refactoring changes that can touch hundreds or thousands of files, especially for LSCs that must be executed atomically (see Large-Scale Changes).

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch20.html b/clones/abseil.io/resources/swe-book/html/ch20.html new file mode 100644 index 00000000..4d1bb158 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch20.html @@ -0,0 +1,213 @@ + + + + + Software Engineering at Google + + + + +
+

Static Analysis

+ + + + + +

Static analysis refers to programs analyzing  source code to find potential issues such as bugs, antipatterns, and other issues that can be diagnosed without executing the program. The “static†part specifically refers to analyzing the source code instead of a running program (referred to as “dynamic†analysis). Static analysis can find bugs in programs early, before they are checked in as production code. For example, static analysis can identify constant expressions that overflow, tests that are never run, or invalid format strings in logging statements that would crash when executed.1 However, static analysis is useful for more than just finding bugs. Through static analysis at Google, we codify best practices, help keep code current to modern API versions, and prevent or reduce technical debt.  Examples of these analyses include verifying that naming conventions are upheld, flagging the use of deprecated APIs, or pointing out simpler but equivalent expressions that make code easier to read.  Static analysis is also an integral tool in the API deprecation process, where it can prevent backsliding during migration of the codebase to a new API (see Large-Scale Changes). We have also found evidence that static analysis checks can educate developers and actually prevent antipatterns from entering the codebase.2

+ +

In this chapter, we’ll look at what makes effective static analysis, some of the lessons we at Google have learned about making static analysis work, and how we implemented these best practices in our static analysis tooling and processes.3

+ +
+

Characteristics of Effective Static Analysis

+ +

Although there have been decades of static analysis  research focused on developing new analysis techniques and specific analyses, a focus on approaches for improving scalability and usability of static analysis tools has been a relatively recent development.

+ +
+

Scalability

+ +

Because modern  software has become  larger, analysis tools must explicitly address scaling in order to produce results in a timely manner, without slowing down the software development process. Static analysis tools at Google must scale to the size of Google’s multibillion-line codebase. To do this, analysis tools are shardable and incremental. Instead of analyzing entire large projects, we focus analyses on files affected by a pending code change, and typically show analysis results only for edited files or lines. Scaling also has benefits: because our codebase is so large, there is a lot of low-hanging fruit in terms of bugs to find. In addition to making sure analysis tools can run on a large codebase, we also must scale up the number and variety of analyses available. Analysis contributions are solicited from throughout the company. Another component to static analysis scalability is ensuring the process is scalable. To do this, Google static analysis infrastructure avoids bottlenecking analysis results by showing them directly to relevant engineers.

+
+ +
+

Usability

+ +

When thinking about  analysis usability, it is important  to consider the cost-benefit trade-off for static analysis tool users. This “cost†could either be in terms of developer time or code quality. Fixing a static analysis warning could introduce a bug. For code that is not being frequently modified, why “fix†code that is running fine in production? For example, fixing a dead code warning by adding a call to the previously dead code could result in untested (possibly buggy) code suddenly running. There is unclear benefit and potentially high cost. For this reason, we generally focus on newly introduced warnings; existing issues in otherwise working code are typically only worth highlighting (and fixing) if they are particularly important (security issues, significant bug fixes, etc.). Focusing on newly introduced warnings (or warnings on modified lines) also means that the developers viewing the warnings have the most relevant context on them.

+ +

Also, developer time is valuable! Time spent triaging analysis reports or fixing highlighted issues is weighed against the benefit provided by a particular analysis. If the analysis author can save time (e.g., by providing a fix that can be automatically applied to the code in question), the cost in the trade-off goes down. Anything that can be fixed automatically should be fixed automatically. We also try to show developers reports about issues that actually have a negative impact on code quality so that they do not waste time slogging through irrelevant results.

+ +

To further reduce the cost of reviewing static analysis results, we focus on smooth developer workflow integration. A further strength of homogenizing everything in one workflow is that a dedicated tools team can update tools along with workflow and code, allowing analysis tools to evolve with the source code in tandem.

+ +

We believe these choices and trade-offs that we have made in making static analyses scalable and usable arise organically from our focus on three core principles, which we formulate as lessons in the next section. 

+
+
+ +
+

Key Lessons in Making Static Analysis Work

+ +

There are three key lessons that we have learned at Google about what makes static analysis tools work well.  Let’s take a look at them in the following subsections.

+ +
+

Focus on Developer Happiness

+ +

We mentioned some of the ways in which we try to save developer time and reduce the cost of interacting  with the  aforementioned static analysis tools; we also keep track of how well analysis tools are performing. If you don’t measure this, you can’t fix problems. We only deploy analysis tools with low false-positive rates (more on that in a minute).  We also actively solicit and act on feedback from developers consuming static analysis results, in real time. Nurturing this feedback loop between static analysis tool users and tool developers creates a virtuous cycle that has built up user trust and improved our tools. User trust is extremely important for the success of static analysis tools.

+ +

For static  analysis, a “false negative†is when a piece of code contains an issue that the analysis tool was designed to find, but the tool misses it. A “false positive†occurs when a tool incorrectly flags code as having the issue.  Research about static analysis tools traditionally focused on reducing false negatives; in practice, low false-positive rates are often critical for developers to actually want to use a tool—who wants to wade through hundreds of false reports in search of a few true ones?4

+ +

Furthermore, perception is a key aspect of the false-positive rate. If a static analysis tool is producing warnings that are technically correct but misinterpreted by users as false positives (e.g., due to confusing messages), users will react the same as if those warnings were in fact false positives. Similarly, warnings that are technically correct but unimportant in the grand scheme of things provoke the same reaction. We call the user-perceived false-positive rate the “effective false positive†rate. An issue is an “effective false positive†if developers did not take some positive action after seeing the issue. This means that if an analysis incorrectly reports an issue, yet the developer happily makes the fix anyway to improve code readability or maintainability, that is not an effective false positive. For example, we have a Java analysis that flags cases in which a developer calls the contains method on a hash table (which is equivalent to containsValue) when they actually meant to call containsKey—even if the developer correctly meant to check for the value, calling containsValue instead is clearer. Similarly, if an analysis reports an actual fault, yet the developer did not understand the fault and therefore took no action, that is an effective false positive.

+
+ +
+

Make Static Analysis a Part of the Core Developer Workflow

+ +

At Google, we integrate  static analysis into the core  workflow via integration with code review tooling. Essentially all code committed at Google is reviewed before being committed; because developers are already in a change mindset when they send code for review, improvements suggested by static analysis tools can be made without too much disruption. There are other benefits to code review integration. Developers typically context switch after sending code for review, and are blocked on reviewers—there is time for analyses to run, even if they take several minutes to do so. There is also peer pressure from reviewers to address static analysis warnings. Furthermore, static analysis can save reviewer time by highlighting common issues automatically; static analysis tools help the code review process (and the reviewers) scale. Code review is a sweet spot for analysis results.5

+
+ +
+

Empower Users to Contribute

+ +

There are many domain experts at Google whose knowledge could improve code produced.  Static analysis is an opportunity to leverage expertise and apply it at scale by having domain experts write new analysis tools or individual checks within a tool. For example, experts who know the context for a particular kind of configuration file can write an analyzer that checks properties of those files. In addition to domain experts, analyses are contributed by developers who discover a bug and would like to prevent the same kind of bug from reappearing anywhere else in the codebase. We focus on building a static analysis ecosystem that is easy to plug into instead of integrating a small set of existing tools. We have focused on developing simple APIs that can be used by engineers throughout Google—not just analysis or language experts—to create analyses; for example, Refaster6 enables writing an analyzer by specifying pre- and post-code snippets demonstrating what transformations are expected by that analyzer. 

+
+
+ +
+

Tricorder: Google’s Static Analysis Platform

+ +

Tricorder, our static analysis  platform, is a core part  of static analysis at Google.7 Tricorder came out of several failed attempts to integrate static analysis with the developer workflow at Google;8 the key difference between Tricorder and previous attempts was our relentless focus on having Tricorder deliver only valuable results to its users. Tricorder is integrated with the main code review tool at Google, Critique.  Tricorder warnings show up on Critique’s diff viewer as gray comment boxes, as demonstrated in Figure 20-1.

+ +
Critique’s diff viewing, showing a static analysis warning from Tricorder in gray +
Figure 20-1. Critique’s diff viewing, showing a static analysis warning from Tricorder in gray
+
+ +

To scale, Tricorder uses a microservices architecture. The Tricorder system sends analyze requests to analysis servers along with metadata about a code change. These servers can use that metadata to read the versions of the source code files in the change via a FUSE-based filesystem and can access cached build inputs and outputs. The analysis server then starts running each individual analyzer and writes the output to a storage layer; the most recent results for each category are then displayed in Critique. Because analyses sometimes take a few minutes to run, analysis servers also post status updates to let change authors and reviewers know that analyzers are running and post a completed status when they have finished. Tricorder analyzes more than 50,000 code review changes per day and is often running several analyses per second.

+ +

Developers throughout Google write Tricorder analyses (called “analyzersâ€) or contribute individual “checks†to existing analyses.  There are four criteria for new Tricorder checks:

+ +
+
Be understandable
+
Be easy for any engineer to understand the output.
+
Be actionable and easy to fix
+
The fix might require more time, thought, or effort than a compiler check, and the result should include guidance as to how the issue might indeed be fixed.
+
Produce less than 10% effective false positives
+
Developers should feel the check is pointing out an actual issue at least 90% of the time.
+
Have the potential for significant impact on code quality
+
The issues might not affect correctness, but developers should take them seriously and deliberately choose to fix them.
+
+ +

Tricorder analyzers report results for more than 30 languages and support a variety of analysis types. Tricorder includes more than 100 analyzers, with most being contributed from outside the Tricorder team. Seven of these analyzers are themselves plug-in systems that have hundreds of additional checks, again contributed from developers across Google. The overall effective false-positive rate is just below 5%.

+ +
+

Integrated Tools

+ +

There are many  different  types of static analysis tools integrated with Tricorder.

+ +

Error Prone and clang-tidy extend the compiler  to identify AST antipatterns for Java and C++, respectively.  These antipatterns could represent real bugs. For example, consider the following code snippet hashing a field f of type long:

+ +
result = 31 * result + (int) (f ^ (f >>> 32));
+
+ +

Now consider the case in which the type of f is int. The code will still compile, but the right shift by 32 is a no-op so that f is XORed with itself and no longer affects the value produced. We fixed 31 occurrences of this bug in Google’s codebase while enabling the check as a compiler error in Error Prone. There are many more such examples. AST antipatterns can also result in code readability improvements, such as removing a redundant call to .get() on a smart pointer.

+ +

Other analyzers showcase relationships between disparate files in a corpus. The Deleted Artifact Analyzer warns if a source file is deleted that is referenced by other non-code places in the codebase (such as inside checked-in documentation). IfThisThenThat allows developers to specify that portions of two different files must be changed in tandem (and warns if they are not). Chrome’s Finch analyzer runs on configuration files for A/B experiments in Chrome, highlighting common problems including not having the right approvals to launch an experiment or crosstalk with other currently running experiments that affect the same population. The Finch analyzer makes Remote Procedure Calls (RPCs) to other services in order to provide this information.

+ +

In addition to the source code itself, some analyzers run on other artifacts produced by that source code; many projects have enabled a binary size checker that warns when changes significantly affect a binary size.

+ +

Almost all analyzers are intraprocedural, meaning that the analysis results are based on code within a procedure (function). Compositional or incremental interprocedural analysis techniques are technically feasible but would require additional infrastructure investment (e.g., analyzing and storing method summaries as analyzers run).

+
+ +
+

Integrated Feedback Channels

+ +

As mentioned earlier, establishing  a feedback  loop between  analysis consumers and analysis writers is critical to track and maintain developer happiness. With Tricorder, we display the option to click a “Not useful†button on an analysis result; this click provides the option to file a bug directly against the analyzer writer about why the result is not useful with information about analysis result prepopulated. Code reviewers can also ask change authors to address analysis results by clicking a “Please fix†button. The Tricorder team tracks analyzers with high “Not useful†click rates, particularly relative to how often reviewers ask to fix analysis results, and will disable analyzers if they don’t work to address problems and improve the “not useful†rate. Establishing and tuning this feedback loop took a lot of work, but has paid dividends many times over in improved analysis results and a better user experience (UX)—before we established clear feedback channels, many developers would just ignore analysis results they did not understand.

+ +

And sometimes the fix is pretty simple—such as updating the text of the message an analyzer outputs! For example, we once rolled out an Error Prone check that flagged when too many arguments were being passed to a printf-like function in Guava that accepted only %s (and no other printf specifiers). The Error Prone team received weekly "Not useful" bug reports claiming the analysis was incorrect because the number of format specifiers matched the number of arguments—all due to users trying to pass specifiers other than %s. After the team changed the diagnostic text to state directly that the function accepts only the %s placeholder, the influx of bug reports stopped. Improving the message produced by an analysis provides an explanation of what is wrong, why, and how to fix it exactly at the point where that is most relevant and can make the difference for developers learning something when they read the message.

+
+ +
+

Suggested Fixes

+ +

Tricorder  checks also,  when possible, provide fixes, as  shown in Figure 20-2.

+ +
View of an example static analysis fix in Critique +
Figure 20-2. View of an example static analysis fix in Critique
+
+ +

Automated fixes serve as an additional documentation source when the message is unclear and, as mentioned earlier, reduce the cost to addressing static analysis issues. Fixes can be applied directly from within Critique, or over an entire code change via a command-line tool. Although not all analyzers provide fixes, many do. We take the approach that style issues in particular should be fixed automatically; for example, by formatters that automatically reformat source code files. Google has style guides for each language that specify formatting issues; pointing out formatting errors is not a good use of a human reviewer’s time. Reviewers click “Please Fix†thousands of times per day, and authors apply the automated fixes approximately 3,000 times per day. And Tricorder analyzers received “Not useful†clicks 250 times per day.

+
+ +
+

Per-Project Customization

+ +

After we had  built up a foundation of user  trust by showing only high-confidence analysis results, we added the ability to run additional “optional†analyzers to specific projects in addition to the on-by-default ones.  The Proto Best Practices analyzer is an example of an optional analyzer. This analyzer highlights potentially breaking data format changes to protocol buffers—Google’s language-independent data serialization format.  These changes are only breaking when serialized data is stored somewhere (e.g., in server logs); protocol buffers for projects that do not have stored serialized data do not need to enable the check. We have also added the ability to customize existing analyzers, although typically this customization is limited, and many checks are applied by default uniformly across the codebase.

+ +

Some analyzers have even started as optional, improved based on user feedback, built up a large userbase, and then graduated into on-by-default status as soon as we could capitalize on the user trust we had built up. For example, we have an analyzer that suggests Java code readability improvements that typically do not actually change code behavior. Tricorder users initially worried about this analysis being too “noisy,†but eventually wanted more analysis results available.

+ +

The key insight to making  this customization successful was to focus on project-level customization, not user-level customization. Project-level customization ensures that all team members have a consistent view of analysis results for their project and prevents situations in which one developer is trying to fix an issue while another developer introduces it.

+ +

Early on in the development of Tricorder, a set of relatively straightforward style checkers (“lintersâ€) displayed results in Critique, and Critique provided user settings to choose the confidence level of results to display and suppress results from specific analyses. We removed all of this user customizability from Critique and immediately started getting complaints from users about annoying analysis results.  Instead of reenabling customizability, we asked users why they were annoyed and found all kinds of bugs and false positives with the linters. For example, the C++ linter also ran on Objective-C files but produced incorrect, useless results. We fixed the linting infrastructure so that this would no longer happen. The HTML linter had an extremely high false-positive rate with very little useful signal and was typically suppressed from view by developers writing HTML. Because the linter was so rarely helpful, we just disabled this linter. In short, user customization resulted in hidden bugs and suppressing feedback.

+
+ +
+

Presubmits

+ +

In addition to code review, there are also  other workflow  integration points for static analysis at Google.  Because developers can choose to ignore static analysis warnings displayed in code review, Google additionally has the ability to add an analysis that blocks committing a pending code change, which we call a presubmit check. Presubmit checks include very simple customizable built-in checks on the contents or metadata of a change, such as ensuring that the commit message does not say “DO NOT SUBMIT†or that test files are always included with corresponding code files. Teams can also specify a suite of tests that must pass or verify that there are no Tricorder issues for a particular category. Presubmits also check that code is well formatted. Presubmit checks are typically run when a developer mails out a change for review and again during the commit process, but they can be triggered on an ad hoc basis in between those points. See Continuous Integration for more details on presubmits at Google.

+ +

Some teams have written their own custom presubmits. These are additional checks on top of the base presubmit set that add the ability to enforce higher best-practice standards than the company as a whole and add project-specific analysis. This enables new projects to have stricter best-practice guidelines than projects with large amounts of legacy code (for example). Team-specific presubmits can make the large-scale change (LSC) process (see Large-Scale Changes) more difficult, so some are skipped for changes with “CLEANUP=†in the change description.

+
+ +
+

Compiler Integration

+ +

Although blocking commits with static analysis is great, it is even better to notify developers of problems even earlier in the workflow.   When possible, we try to push static analysis into the compiler.  Breaking the build is a warning that is not possible to ignore, but is infeasible in many cases. However, some analyses are highly mechanical and have no effective false positives. An example is Error Prone “ERROR†checks. These checks are all enabled in Google’s Java compiler, preventing instances of the error from ever being introduced again into our codebase. Compiler checks need to be fast so that they don’t slow down the build. In addition, we enforce these three criteria (similar criteria exist for the C++ compiler):

+ +
    +
  • +

    Actionable and easy to fix (whenever possible, the error should include a suggested fix that can be applied mechanically)

    +
  • +
  • +

    Produce no effective false positives (the analysis should never stop the build for correct code)

    +
  • +
  • +

    Report issues affecting only correctness rather than style or best practices

    +
  • +
+ +

To enable a new check, we first need to clean up all instances of that problem in the codebase so that we don’t break the build for existing projects just because the compiler has evolved. This also implies that the value in deploying a new compiler-based check must be high enough to warrant fixing all existing instances of it. Google has infrastructure in place for running various compilers (such as clang and javac) over the entire codebase in parallel via a cluster—as a MapReduce operation. When compilers are run in this MapReduce fashion, the static analysis checks run must produce fixes in order to automate the cleanup. After a pending code change is prepared and tested that applies the fixes across the entire codebase, we commit that change and remove all existing instances of the problem. We then turn the check on in the compiler so that no new instances of the problem can be committed without breaking the build. Build breakages are caught after commit by our Continuous Integration (CI) system, or before commit by presubmit checks (see the earlier discussion).

+ +

We also aim to never issue compiler warnings. We have found repeatedly that developers ignore compiler warnings. We either enable a compiler check as an error (and break the build) or don’t show it in compiler output. Because the same compiler flags are used throughout the codebase, this decision is made globally. Checks that can’t be made to break the build are either suppressed or shown in code review (e.g., through Tricorder). Although not every language at Google has this policy, the most frequently used ones do. Both of the Java and C++ compilers have been configured to avoid displaying compiler warnings. The Go compiler takes this to extreme; some things that other languages would consider warnings (such as unused variables or package imports) are errors in Go.

+
+ +
+

Analysis While Editing and Browsing Code

+ +

Another potential integration point for static analysis is  in an integrated development environment (IDE).   However, IDE analyses require quick analysis times (typically less than 1 second and ideally less than 100 ms), and so some tools are not suitable to integrate here. In addition, there is the problem of making sure the same analysis runs identically in multiple IDEs. We also note that IDEs can rise and fall in popularity (we don’t mandate a single IDE); hence IDE integration tends to be messier than plugging into the review process. Code review also has specific benefits for displaying analysis results. Analyses can take into account the entire context of the change; some analyses can be inaccurate on partial code (such as a dead code analysis when a function is implemented before adding callsites). Showing analysis results in code review also means that code authors have to convince reviewers as well if they want to ignore analysis results. That said, IDE integration for suitable analyses is another great place to display static analysis results.

+ +

Although we mostly focus on showing newly introduced static analysis warnings, or warnings on edited code, for some analyses, developers actually do want the ability to view analysis results over the entire codebase during code browsing. An example of this are some security analyses. Specific security teams at Google want to see a holistic view of all instances of a problem. Developers also like viewing analysis results over the codebase when planning a cleanup. In other words, there are times when showing results when code browsing is the right choice.  

+
+
+ +
+

Conclusion

+ +

Static analysis can be a great tool to improve a codebase, find bugs early, and allow more expensive processes (such as human review and testing) to focus on issues that are not mechanically verifiable. By improving the scalability and usability of our static analysis infrastructure, we have made static analysis an effective component of software development at Google.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Focus on developer happiness. We have invested considerable effort in building feedback channels between analysis users and analysis writers in our tools, and aggressively tune analyses to reduce the number of false positives.

    +
  • +
  • +

    Make static analysis part of the core developer workflow. The main integration point for static analysis at Google is through code review, where analysis tools provide fixes and involve reviewers. However, we also integrate analyses at additional points (via compiler checks, gating code commits, in IDEs, and when browsing code).

    +
  • +
  • +

    Empower users to contribute. We can scale the work we do building and maintaining analysis tools and platforms by leveraging the expertise of domain experts. Developers are continuously adding new analyses and checks that make their lives easier and our codebase better. 

    +
  • +
+
+

1See http://errorprone.info/bugpatterns.

2Caitlin Sadowski et al. Tricorder: Building a Program Analysis Ecosystem, International Conference on Software Engineering (ICSE), May 2015.

3A good academic reference for static analysis theory is: Flemming Nielson et al. Principles of Program Analysis (Germany: Springer, 2004).

4Note that there are some specific analyses for which reviewers might be willing to tolerate a much higher false-positive rate: one example is security analyses that identify critical problems.

5See later in this chapter for more information on additional integration points when editing and browsing code.

6Louis Wasserman, “Scalable, Example-Based Refactorings with Refaster.†Workshop on Refactoring Tools, 2013.

7Caitlin Sadowski, Jeffrey van Gogh, Ciera Jaspan, Emma Söderberg, and Collin Winter, Tricorder: Building a Program Analysis Ecosystem, International Conference on Software Engineering (ICSE), May 2015.

8Caitlin Sadowski, Edward Aftandilian, Alex Eagle, Liam Miller-Cushon, and Ciera Jaspan, “Lessons from Building Static Analysis Tools at Googleâ€, Communications of the ACM, 61 No. 4 (April 2018): 58–66, https://cacm.acm.org/magazines/2018/4/226371-lessons-from-building-static-analysis-tools-at-google/fulltext.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch21.html b/clones/abseil.io/resources/swe-book/html/ch21.html new file mode 100644 index 00000000..e7055dd6 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch21.html @@ -0,0 +1,471 @@ + + + + + Software Engineering at Google + + + + +
+

Dependency Management

+ + + + + +

Dependency management—the management  of networks of libraries, packages, and dependencies that we don’t control—is one of the least understood and most challenging problems in software engineering. Dependency management focuses on questions like: how do we update between versions of external dependencies? How do we describe versions, for that matter? What types of changes are allowed or expected in our dependencies? How do we decide when it is wise to depend on code produced by other organizations?

+ +

For comparison, the most closely related topic here is source control. Both areas describe how we work with source code. Source control covers the easier part: where do we check things in?  How do we get things into the build? After we accept the value of trunk-based development, most of the day-to-day source control questions for an organization are fairly mundane: “I’ve got a new thing, what directory do I add it to?â€

+ +

Dependency management adds additional complexity in both time and scale. In a trunk-based source control problem, it’s fairly clear when you make a change that you need to run the tests and not break existing code. That’s predicated on the idea that you’re working in a shared codebase, have visibility into how things are being used, and can trigger the build and run the tests. Dependency management focuses on the problems that arise when changes are being made outside of your organization, without full access or visibility. Because your upstream dependencies can’t coordinate with your private code, they are more likely to break your build and cause your tests to fail. How do we manage that? Should we not take external dependencies? Should we ask for greater consistency between releases of external dependencies? When do we update to a new version?

+ +

Scale makes all of these questions more complex, with the realization that we aren’t really talking about single dependency imports, and in the general case that we’re depending on an entire network of external dependencies. When we begin dealing with a network, it is easy to construct scenarios in which your organization’s use of two dependencies becomes unsatisfiable at some point in time. Generally, this happens because one dependency stops working without some requirement,1 whereas the other is incompatible with the same requirement. Simple solutions about how to manage a single outside dependency usually fail to account for the realities of managing a large network. We’ll spend much of this chapter discussing various forms of these conflicting requirement problems.

+ +

Source control and dependency management  are related issues separated by the question: “Does our organization control the development/update/management of this subproject?†For example, if every team in your company has separate repositories, goals, and development practices, the interaction and management of code produced by those teams is going to have more to do with dependency management than source control. On the other hand, a large organization with a (virtual?) single repository (monorepo) can scale up significantly farther with source control policies—this is Google’s approach. Separate open source projects certainly count as separate organizations: interdependencies between unknown and not-necessarily-collaborating projects are a dependency management problem. Perhaps our strongest single piece of advice on this topic is this: All else being equal, prefer source control problems over dependency-management problems. If you have the option to redefine “organization†more broadly (your entire company rather than just one team), that’s very often a good trade-off. Source control problems are a lot easier to think about and a lot cheaper to deal with than dependency-management ones.

+ +

As the Open Source Software (OSS) model continues  to grow and expand into new domains, and the dependency graph for many popular projects continues to expand over time, dependency management is perhaps becoming the most important problem in software engineering policy. We are no longer disconnected islands built on one or two layers outside an API. Modern software is built on towering pillars of dependencies; but just because we can build those pillars doesn’t mean we’ve yet figured out how to keep them standing and stable over time.

+ +

In this chapter, we’ll look at the particular challenges of dependency management, explore solutions (common and novel) and their limitations, and look at the realities of working with dependencies, including how we’ve handled things in Google. It is important to preface all of this with an admission: we’ve invested a lot of thought into this problem and have extensive experience with refactoring and maintenance issues that show the practical shortcomings with existing approaches. We don’t have firsthand evidence of solutions that work well across organizations at scale. To some extent, this chapter is a summary of what we know does not work (or at least might not work at larger scales) and where we think there is the potential for better outcomes. We definitely cannot claim to have all the answers here; if we could, we wouldn’t be calling this one of the most important problems in software engineering.

+ +
+

Why Is Dependency Management So Difficult?

+ +

Even defining the dependency-management problem presents some unusual challenges.  Many half-baked solutions in this space focus on a too-narrow problem formulation: “How do we import a package that our locally developed code can depend upon?†This is a necessary-but-not-sufficient formulation. The trick isn’t just finding a way to manage one dependency—the trick is how to manage a network of dependencies and their changes over time. Some subset of this network is directly necessary for your first-party code, some of it is only pulled in by transitive dependencies. Over a long enough period, all of the nodes in that dependency network will have new versions, and some of those updates will be important.2 How do we manage the resulting cascade of upgrades for the rest of the dependency network? Or, specifically, how do we make it easy to find mutually compatible versions of all of our dependencies given that we do not control those dependencies? How do we analyze our dependency network? How do we manage that network, especially in the face of an ever-growing graph of dependencies?

+ +
+

Conflicting Requirements and Diamond Dependencies

+ +

The central problem in dependency  management highlights the importance of thinking in terms of dependency networks, not individual dependencies. Much of the difficulty stems from one problem: what happens when two nodes in the dependency network have conflicting requirements, and your organization depends on them both? This can arise for many reasons, ranging from platform considerations (operating system [OS], language version, compiler version, etc.) to the much more mundane issue of version incompatibility. The canonical example of version incompatibility as an unsatisfiable version  requirement is the diamond dependency problem. Although we don’t generally include things like “what version of the compiler†are you using in a dependency graph, most of these conflicting requirements problems are isomorphic to “add a (hidden) node to the dependency graph representing this requirement.†As such, we’ll primarily discuss conflicting requirements in terms of diamond dependencies, but keep in mind that libbase might actually be absolutely any piece of software involved in the construction of two or more nodes in your dependency network.

+ +

The diamond dependency problem, and  other forms of conflicting requirements, require at least three layers of dependency, as demonstrated in Figure 21-1.

+ +
The diamond dependency problem +
Figure 21-1. The diamond dependency problem
+
+ +

In this simplified model, libbase is used by both liba and libb, and liba and libb are both used by a higher-level component libuser. If libbase ever introduces an incompatible change, there is a chance that liba and libb, as products of separate organizations, don’t update simultaneously. If liba depends on the new libbase version and libb depends on the old version, there’s no general way for libuser (aka your code) to put everything together. This diamond can form at any scale: in the entire network of your dependencies, if there is ever a low-level node that is required to be in two incompatible versions at the same time (by virtue of there being two paths from some higher level node to those two versions), there will be a problem.

+ +

Different programming languages tolerate the diamond dependency problem to different degrees. For some languages, it is possible to embed multiple (isolated) versions of a dependency within a build: a call into libbase from liba might call a different version of the same API as a call into libbase from libb. For example, Java provides fairly well-established mechanisms to rename the symbols provided by such a dependency.3 Meanwhile, C++ has nearly zero tolerance for diamond dependencies in a normal build, and they are very likely to trigger arbitrary bugs and undefined behavior (UB) as a result of a clear violation of C++’s One Definition Rule. You can at best use a similar idea as Java’s shading to hide some symbols in a dynamic-link library (DLL) or in cases in which you’re building and linking separately. However, in all programming languages that we’re aware of, these workarounds are partial solutions at best: embedding multiple versions can be made to work by tweaking the names of functions, but if there are types that are passed around between dependencies, all bets are off. For example, there is simply no way for a map defined in libbase v1 to be passed through some libraries to an API provided by libbase v2 in a semantically consistent fashion. Language-specific hacks to hide or rename entities in separately compiled libraries can provide some cushion for diamond dependency problems, but are not a solution in the general case. 

+ +

If you encounter a conflicting requirement problem, the only easy answer is to skip forward or backward in versions for those dependencies to find something compatible. When that isn’t possible, we must resort to locally patching the dependencies in question, which is particularly challenging because the cause of the incompatibility in both provider and consumer is probably not known to the engineer that first discovers the incompatibility. This is inherent: liba developers are still working in a compatible fashion with libbase v1, and libb devs have already upgraded to v2. Only a dev who is pulling in both of those projects has the chance to discover the issue, and it’s certainly not guaranteed that they are familiar enough with libbase and liba to work through the upgrade. The easier answer is to downgrade libbase and libb, although that is not an option if the upgrade was originally forced because of security issues.

+ +

Systems of policy and technology for dependency management largely boil down to the question, “How do we avoid conflicting requirements while still allowing change among noncoordinating groups?†If you have a solution for the general form of the diamond dependency problem that allows for the reality of continuously changing requirements (both dependencies and platform requirements) at all levels of the network, you’ve described the interesting part of a  dependency-management solution. 

+
+
+ +
+

Importing Dependencies

+ +

In programming terms, it’s clearly better to reuse some existing infrastructure rather than build it yourself.  This is obvious, and part of the fundamental march of technology: if every novice had to reimplement their own JSON parser and regular expression engine, we’d never get anywhere. Reuse is healthy, especially compared to the cost of redeveloping quality software from scratch. So long as you aren’t downloading trojaned software, if your external dependency satisfies the requirements for your programming task, you should use it.

+ +
+

Compatibility Promises

+ +

When we start  considering time, the situation gains some complicated trade-offs. Just because you get to avoid a development cost doesn’t mean importing a dependency is the correct choice. In a software engineering organization that is aware of time and change, we need to also be mindful of its ongoing maintenance costs. Even if we import a dependency with no intent of upgrading it, discovered security vulnerabilities, changing platforms, and evolving dependency networks can conspire to force that upgrade, regardless of our intent. When that day comes, how expensive is it going to be? Some dependencies are more explicit than others about the expected maintenance cost for merely using that dependency: how much compatibility is assumed? How much evolution is assumed? How are changes handled? For how long are releases supported?

+ +

We suggest that a dependency provider should be clearer about the answers to these questions. Consider the example set by large infrastructure projects with millions of users and their compatibility promises.

+ +
+

C++

+ +

For the C++ standard library, the model is one of nearly indefinite backward compatibility.  Binaries built against an older version of the standard library are expected to build and link with the newer standard: the standard provides not only API compatibility, but ongoing backward compatibility  for the binary artifacts, known as ABI compatibility. The extent to which this has been upheld varies from platform to platform. For users of gcc on Linux, it’s likely that most code works fine over a range of roughly a decade. The standard doesn’t explicitly call out its commitment to ABI compatibility—there are no public-facing policy documents on that point. However, the standard does publish Standing Document 8 (SD-8), which calls out a small set of types of change that the standard library can make between versions, defining implicitly what type of changes to be prepared for. Java is similar: source is compatible between language versions, and JAR files from older releases will readily work with newer versions.

+
+ +
+

Go

+ +

Not all languages prioritize the same amount of compatibility.  The Go programming language explicitly promises source compatibility between most releases, but no binary compatibility. You cannot build a library in Go with one version of the language and link that library into a Go program built with a different version of the language.

+
+ +
+

Abseil

+ +

Google’s Abseil  project is much like Go, with an important caveat about time. We are unwilling to commit to compatibility indefinitely: Abseil lies at the foundation of most of our most computationally heavy services internally, which we believe are likely to be in use for many years to come. This means we’re careful to reserve the right to make changes, especially in implementation details and ABI, in order to allow better performance. We have experienced far too many instances of an API turning out to be confusing and error prone after the fact; publishing such known faults to tens of thousands of developers for the indefinite future feels wrong. Internally, we already have roughly 250 million lines of C++ code that depend on this library—we aren’t going to make API changes lightly, but it must be possible. To that end, Abseil explicitly does not promise ABI compatibility, but does promise a slightly limited form of API compatibility: we won’t make a breaking API change without also providing an automated refactoring tool that will transform code from the old API to the new transparently. We feel that shifts the risk of unexpected costs significantly in favor of users: no matter what version a dependency was written against, a user of that dependency and Abseil should be able to use the most current version. The highest cost should be “run this tool,†and presumably send the resulting patch for review in the mid-level dependency (liba or libb, continuing our example from earlier). In practice, the project is new enough that we haven’t had to make any significant API breaking changes. We can’t say how well this will work for the ecosystem as a whole, but in theory, it seems like a good balance for stability versus ease of upgrade.

+
+ +
+

Boost

+ +

By comparison, the Boost C++ library makes no  promises  of compatibility between versions. Most code doesn’t change, of course, but “many of the Boost libraries are actively maintained and improved, so backward compatibility with prior version isn’t always possible.†Users are advised to upgrade only at a period in their project life cycle in which some change will not cause problems. The goal for Boost is fundamentally different than the standard library or Abseil: Boost is an experimental proving ground. A particular release from the Boost stream is probably perfectly stable and appropriate for use in many projects, but Boost’s project goals do not prioritize compatibility between versions—other long-lived projects might experience some friction keeping up to date. The Boost developers are every bit as expert as the developers for the standard library4—none of this is about technical expertise: this is purely a matter of what a project does or does not promise and prioritize.

+ +

Looking at the libraries in this discussion, it’s important to recognize that these compatibility issues are software engineering issues, not programming issues. You can download something like Boost with no compatibility promise and embed it deeply in the most critical, long-lived systems in your organization; it will work just fine. All of the concerns here are about how those dependencies will change over time, keeping up with updates, and the difficulty of getting developers to worry about maintenance instead of just getting features working. Within Google, there is a constant stream of guidance directed to our engineers to help them consider this difference between “I got it to work†and “this is working in a supported fashion.†That’s unsurprising: it’s basic application of Hyrum’s Law, after all.

+ +

Put more broadly: it is important to realize that dependency management has a wholly different nature in a programming task versus a software engineering task. If you’re in a problem space for which maintenance over time is relevant, dependency management is difficult. If you’re purely developing a solution for today with no need to ever update anything, it is perfectly reasonable to grab as many readily available dependencies as you like with no thought of how to use them responsibly or plan for upgrades. Getting your program to work today by violating everything in SD-8 and also relying on binary compatibility from Boost and Abseil works fine…so long as you never upgrade the standard library, Boost, or Abseil, and neither does anything that depends on you. 

+
+
+ +
+

Considerations When Importing

+ +

Importing a dependency  for use in a programming project is nearly free: assuming that you’ve taken the time to ensure that it does what you need and isn’t secretly a security hole, it is almost always cheaper to reuse than to reimplement functionality. Even if that dependency has taken the step of clarifying what compatibility promise it will make, so long as we aren’t ever upgrading, anything you build on top of that snapshot of your dependency is fine, no matter how many rules you violate in consuming that API. But when we move from programming to software engineering, those dependencies become subtly more expensive, and there are a host of hidden costs and questions that need to be answered. Hopefully, you consider these costs before importing, and, hopefully, you know when you’re working on a programming project versus working on a software engineering project.

+ +

When engineers at Google try to import dependencies, we encourage them to ask this (incomplete) list of questions first:

+ +
    +
  • +

    Does the project have tests that you can run?

    +
  • +
  • +

    Do those tests pass?

    +
  • +
  • +

    Who is providing that dependency? Even among “No warranty implied†OSS projects, there is a significant range of experience and skill set—it’s a very different thing to depend on compatibility from the C++ standard library or Java’s Guava library than it is to select a random project from GitHub or npm. Reputation isn’t everything, but it is worth investigating.

    +
  • +
  • +

    What sort of compatibility is the project aspiring to?

    +
  • +
  • +

    Does the project detail what sort of usage is expected to be supported?

    +
  • +
  • +

    How popular is the project?

    +
  • +
  • +

    How long will we be depending on this project?

    +
  • +
  • +

    How often does the project make breaking changes?

    +
  • +
+ +

Add to this a short selection of internally focused questions:

+ +
    +
  • +

    How complicated would it be to implement that functionality within Google?

    +
  • +
  • +

    What incentives will we have to keep this dependency up to date?

    +
  • +
  • +

    Who will perform an upgrade?

    +
  • +
  • +

    How difficult do we expect it to be to perform an upgrade?

    +
  • +
+ +

Our own Russ Cox has written about this more extensively. We can’t give a perfect formula for deciding when it’s cheaper in the long term to import versus reimplement; we fail at this ourselves, more often than not.

+
+ +
+

How Google Handles Importing Dependencies

+ +

In short: we could do better. 

+ +

The overwhelming majority of dependencies in any given Google project are internally developed. This means that the vast majority of our internal dependency-management story isn’t really dependency management, it’s just source control—by design. As we have mentioned, it is a far easier thing to manage and control the complexities and risks involved in adding dependencies when the providers and consumers are part of the same organization and have proper visibility and Continuous Integration (CI; see Continuous Integration) available. Most problems in dependency management stop being problems when you can see exactly how your code is being used and know exactly the impact of any given change. Source control (when you control the projects in question) is far easier than dependency management (when you don’t).

+ +

That ease of use begins failing when it comes to our handling of external projects. For projects that we are importing from the OSS ecosystem or commercial partners, those dependencies are  added into a separate directory of our monorepo, labeled third_party. Let’s examine how a new OSS project is added to third_party.

+ +

Alice, a software engineer at Google, is working on a project and realizes that there is an open source solution available. She would really like to have this project completed and demo’ed soon, to get it out of the way before going on vacation. The choice then is whether to reimplement that functionality from scratch or download the OSS package and get it added to third_party. It’s very likely that Alice decides that the faster development solution makes sense: she downloads the package and follows a few steps in our third_party policies. This is a fairly simple checklist: make sure it builds with our build system, make sure there isn’t an existing version of that package, and make sure at least two engineers are signed up as OWNERS to maintain the package in the event that any maintenance is necessary. Alice gets her teammate Bob to say, “Yes, I’ll help.†Neither of them need to have any experience maintaining a third_party package, and they have conveniently avoided the need to understand anything about the implementation of this package. At most, they have gained a little experience with its interface as part of using it to solve the prevacation demo problem.

+ +

From this point on, the package is usually available to other Google teams to use in their own projects. The act of adding additional dependencies is completely transparent to Alice and Bob: they might be completely unaware that the package they downloaded and promised to maintain has become popular. Subtly, even if they are monitoring for new direct usage of their package, they might not necessarily notice growth in the transitive usage of their package. If they use it for a demo, while Charlie adds a dependency from within the guts of our Search infrastructure, the package will have suddenly moved from fairly innocuous to being in the critical infrastructure for important Google systems. However, we don’t have any particular signals surfaced to Charlie when he is considering whether to add this dependency.

+ +

Now, it’s possible that this scenario is perfectly fine. Perhaps that dependency is well written, has no security bugs, and isn’t depended upon by other OSS projects. It might be possible for it to go quite a few years without being updated. It’s not necessarily wise for that to happen: changes externally might have optimized it or added important new functionality, or cleaned up security holes before CVEs5 were discovered. The longer that the package exists, the more dependencies (direct and indirect) are likely to accrue. The more that the package remains stable, the more that we are likely to accrete Hyrum’s Law reliance on the particulars of the version that is checked into third_party.

+ +

One day, Alice and Bob are informed that an upgrade is critical. It could be the disclosure of a security vulnerability in the package itself or in an OSS project that depends upon it that forces an upgrade. Bob has transitioned to management and hasn’t touched the codebase in a while. Alice has moved to another team since the demo and hasn’t used this package again. Nobody changed the OWNERS file. Thousands of projects depend on this indirectly—we can’t just delete it without breaking the build for Search and a dozen other big teams. Nobody has any experience with the implementation details of this package. Alice isn’t necessarily on a team that has a lot of experience undoing Hyrum’s Law subtleties that have accrued over time.

+ +

All of which is to say: Alice and the other users of this package are in for a costly and difficult upgrade, with the security team exerting pressure to get this resolved immediately. Nobody in this scenario has practice in performing the upgrade, and the upgrade is extra difficult because it is covering many smaller releases covering the entire period between initial introduction of the package into third_party and the security disclosure.

+ +

Our third_party policies don’t work for these unfortunately common scenarios. We roughly understand that we need a higher bar for ownership, we need to make it easier (and more rewarding) to update regularly and more difficult for third_party packages to be orphaned and important at the same time. The difficulty is that it is difficult for codebase maintainers and third_party leads to say, “No, you can’t use this thing that solves your development problem perfectly because we don’t have resources to update everyone with new versions constantly.†Projects that are popular and have no compatibility promise (like Boost) are particularly risky: our developers might be very familiar with using that dependency to solve programming problems outside of Google, but allowing it to become ingrained into the fabric of our codebase is a big risk. Our codebase has an expected lifespan of decades at this point: upstream projects that are not explicitly prioritizing stability are a risk.  

+
+
+ +
+

Dependency Management, In Theory

+ +

Having looked at the ways that dependency management is difficult  and how it can go wrong, let’s discuss more specifically the problems we’re trying to solve and how we might go about solving them. Throughout this chapter, we call back to the formulation, “How do we manage code that comes from outside our organization (or that we don’t perfectly control): how do we update it, how do we manage the things it depends upon over time?†We need to be clear that any good solution here avoids conflicting requirements of any form, including diamond dependency version conflicts, even in a dynamic ecosystem in which new dependencies or other requirements might be added (at any point in the network). We also need to be aware of the impact of time: all software has bugs, some of those will be security critical, and some fraction of our dependencies will therefore be critical to update over a long enough period of time.

+ +

A stable dependency-management scheme must therefore be flexible with time and scale: we can’t assume indefinite stability of any particular node in the dependency graph, nor can we assume that no new dependencies are added (either in code we control or in code we depend upon). If a solution to dependency management prevents conflicting requirement problems among your dependencies, it’s a good solution. If it does so without assuming stability in dependency version or dependency fan-out, coordination or visibility between organizations, or significant compute resources, it’s a great solution.

+ +

When proposing solutions to dependency management, there are four common options that we know of that exhibit at least some of the appropriate properties: nothing ever changes, semantic versioning, bundle everything that you need (coordinating not per project, but per distribution), or Live at Head.

+ +
+

Nothing Changes (aka The Static Dependency Model)

+ +

The simplest way to ensure stable  dependencies is to never change them: no API changes, no behavioral changes, nothing.  Bug fixes are allowed only if no user code could be broken. This prioritizes compatibility and stability over all else. Clearly, such a scheme is not ideal due to the assumption of indefinite stability. If, somehow, we get to a world in which security issues and bug fixes are a nonissue and dependencies aren’t changing, the Nothing Changes model is very appealing: if we start with satisfiable constraints, we’ll be able to maintain that property indefinitely.

+ +

Although not sustainable in the long term, practically speaking, this is where every organization starts: up until you’ve demonstrated that the expected lifespan of your project is long enough that change becomes necessary, it’s really easy to live in a world where we assume that nothing changes. It’s also important to note: this is probably the right model for most new organizations. It is comparatively rare to know that you’re starting a project that is going to live for decades and have a need to be able to update dependencies smoothly. It’s much more reasonable to hope that stability is a real option and pretend that dependencies are perfectly stable for the first few years of a project.

+ +

The downside to this model is that, over a long enough time period, it is false, and there isn’t a clear indication of exactly how long you can pretend that it is legitimate. We don’t have long-term early warning systems for security bugs or other critical issues that might force you to upgrade a dependency—and because of chains of dependencies, a single upgrade can in theory become a forced update to your entire dependency network.

+ +

In this model, version selection is simple: there are no decisions to be made, because there are no versions.

+
+ +
+

Semantic Versioning

+ +

The de  facto  standard for “how do we manage a network of dependencies today?†is semantic versioning (SemVer).6 SemVer is the nearly ubiquitous practice of representing a version number for some dependency (especially libraries) using three decimal-separated integers, such as 2.4.72 or 1.1.4. In the most common convention, the three component numbers represent major, minor, and patch versions, with the implication that a changed major number indicates a change to an existing API that can break existing usage, a changed minor number indicates purely added functionality that should not break existing usage, and a changed patch version is reserved for non-API-impacting implementation details and bug fixes that are viewed as particularly low risk.

+ +

With the SemVer separation of major/minor/patch versions, the assumption is that a version requirement can generally be expressed as “anything newer than,†barring API-incompatible changes (major version changes). Commonly, we’ll see “Requires libbase ≥ 1.5,†that requirement would be compatible with any libbase in 1.5, including 1.5.1, and anything in 1.6 onward, but not libbase 1.4.9 (missing the API introduced in 1.5) or 2.x (some APIs in libbase were changed incompatibly). Major version changes are a significant incompatibility: because an existing piece of functionality has changed (or been removed), there are potential incompatibilities for all dependents. Version requirements exist (explicitly or implicitly) whenever one dependency uses another: we might see “liba requires libbase ≥ 1.5†and “libb requires libbase ≥ 1.4.7.â€

+ +

If we formalize these requirements, we can conceptualize a dependency network as a collection of software components (nodes) and the requirements between them (edges). Edge labels in this network change as a function of the version of the source node, either as dependencies are added (or removed) or as the SemVer requirement is updated because of a change in the source node (requiring a newly added feature in a dependency, for instance). Because this whole network is changing asynchronously over time, the process of finding a mutually compatible set of dependencies that satisfy all the transitive requirements of your application can be challenging.7 Version-satisfiability solvers for SemVer are very much akin to SAT-solvers in logic and algorithms research: given a set of constraints (version requirements on dependency edges), can we find a set of versions for the nodes in question that satisfies all constraints? Most package management ecosystems are built on top of these sorts of graphs, governed by their SemVer SAT-solvers.

+ +

SemVer and its SAT-solvers aren’t in any way promising that there exists a solution to a given set of dependency constraints. Situations in which dependency constraints cannot be satisfied are created constantly, as we’ve already seen: if a lower-level component (libbase) makes a major-number bump, and some (but not all) of the libraries that depend on it (libb but not liba) have upgraded, we will encounter the diamond dependency issue.

+ +

SemVer solutions to dependency management are usually SAT-solver based. Version selection is a matter of running some algorithm to find an assignment of versions for dependencies in the network that satisfies all of the version-requirement constraints. When no such satisfying assignment of versions exists, we colloquially call it “dependency hell.â€

+ +

We’ll look at some of the limitations of SemVer in more detail later in this chapter.

+
+ +
+

Bundled Distribution Models

+ +

As an industry, we’ve  seen the application  of a powerful model of managing dependencies for decades now: an organization gathers up a collection of dependencies, finds a mutually compatible set of those, and releases the collection as a single unit. This is what happens, for instance, with Linux distributions—there’s no guarantee that the various pieces that are included in a distro are cut from the same point in time. In fact, it’s somewhat more likely that the lower-level dependencies are somewhat older than the higher-level ones, just to account for the time it takes to integrate them.

+ +

This “draw a bigger box around it all and release that collection†model introduces entirely new actors: the distributors. Although the maintainers of all of the individual dependencies may have little or no knowledge of the other dependencies, these higher-level distributors are involved in the process of finding, patching, and testing a mutually compatible set of versions to include. Distributors are the engineers responsible for proposing a set of versions to bundle together, testing those to find bugs in that dependency tree, and resolving any issues.

+ +

For an outside user, this works great, so long as you can properly rely on only one of these bundled distributions. This is effectively the same as changing a dependency network into a single aggregated dependency and giving that a version number. Rather than saying, “I depend on these 72 libraries at these versions,†this is, “I depend on Red Hat version N,†or, “I depend on the pieces in the NPM graph at time T.â€

+ +

In the bundled distribution approach, version selection is handled by dedicated distributors.

+
+ +
+

Live at Head

+ +

The model that some of us at Google8 have been pushing for is theoretically sound, but places new and costly burdens on participants in a dependency network.  It’s wholly unlike the models that exist in OSS ecosystems today, and it is not clear how to get from here to there as an industry. Within the boundaries of an organization like Google, it is costly but effective, and we feel that it places most of the costs and incentives into the correct places.  We call this model “Live at Head.†It is viewable as the dependency-management extension of trunk-based development: where trunk-based development talks about source control policies, we’re extending that model to apply to upstream dependencies as well. 

+ +

Live at Head presupposes that we can unpin dependencies, drop SemVer, and rely on dependency providers to test changes against the entire ecosystem before committing. Live at Head is an explicit attempt to take time and choice out of the issue of dependency management: always depend on the current version of everything, and never change anything in a way in which it would be difficult for your dependents to adapt.  A change that (unintentionally) alters API or behavior will in general be caught by CI on downstream dependencies, and thus should not be committed. For cases in which such a change must happen (i.e., for security reasons), such a break should be made only after either the downstream dependencies are updated or an automated tool is provided to perform the update in place. (This tooling is essential for closed-source downstream consumers: the goal is to allow any user the ability to update use of a changing API without expert knowledge of the use or the API. That property significantly mitigates the “mostly bystanders†costs of breaking changes.) This philosophical shift in responsibility in the open source ecosystem is difficult to motivate initially: putting the burden on an API provider to test against and change all of its downstream customers is a significant revision to the responsibilities of an API provider.

+ +

Changes in a Live at Head model are not reduced to a SemVer “I think this is safe or not.†Instead, tests and CI systems are used to test against visible dependents to determine experimentally how safe a change is. So, for a change that alters only efficiency or implementation details, all of the visible affected tests might likely pass, which demonstrates that there are no obvious ways for that change to impact users—it’s safe to commit. A change that modifies more obviously observable parts of an API (syntactically or semantically) will often yield hundreds or even thousands of test failures. It’s then up to the author of that proposed change to determine whether the work involved to resolve those failures is worth the resulting value of committing the change. Done well, that author will work with all of their dependents to resolve the test failures ahead of time (i.e., unwinding brittle assumptions in the tests) and might potentially create a tool to perform as much of the necessary refactoring as possible.

+ +

The incentive structures and technological assumptions here are materially different than other scenarios: we assume that there exist unit tests and CI, we assume that API providers will be bound by whether downstream dependencies will be broken, and we assume that API consumers are keeping their tests passing and relying on their dependency in supported ways. This works significantly better in an open source ecosystem (in which fixes can be distributed ahead of time) than it does in the face of hidden/closed-source dependencies. API providers are incentivized when making changes to do so in a way that can be smoothly migrated to. API consumers are incentivized to keep their tests working so as not to be labeled as a low-signal test and potentially skipped, reducing the protection provided by that test.

+ +

In the Live at Head approach, version selection is handled by asking “What is the most recent stable version of everything?†If providers have made changes responsibly, it will all work together smoothly. 

+
+
+ +
+

The Limitations of SemVer

+ +

The Live at Head approach may build on recognized practices for version control (trunk-based development) but is largely unproven at scale.   SemVer is the de facto standard for dependency management today, but as we’ve suggested, it is not without its limitations. Because it is such a popular approach, it is worth looking at it in more detail and highlighting what we believe to be its potential pitfalls. 

+ +

There’s a lot to unpack in the SemVer definition of what a dotted-triple version number really means. Is this a promise? Or is the version number chosen for a release an estimate? That is, when the maintainers of libbase cut a new release and choose whether this is a major, minor, or patch release, what are they saying? Is it provable that an upgrade from 1.1.4 to 1.2.0 is safe and easy, because there were only API additions and bug fixes? Of course not. There’s a host of things that ill-behaved users of libbase could have done that could cause build breaks or behavioral changes in the face of a “simple†API addition.9 Fundamentally, you can’t prove anything about compatibility when only considering the source API; you have to know with which things you are asking about compatibility.

+ +

However, this idea of “estimating†compatibility begins to weaken when we talk about networks of dependencies and SAT-solvers applied to those networks. The fundamental problem in this formulation is the difference between node values in traditional SAT and version values in a SemVer dependency graph. A node in a three-SAT graph is either True or False. A version value (1.1.14) in a dependency graph is provided by the maintainer as an estimate of how compatible the new version is, given code that used the previous version. We’re building all of our version-satisfaction logic on top of a shaky foundation, treating estimates and self-attestation as absolute. As we’ll see, even if that works OK in limited cases, in the aggregate, it doesn’t necessarily have enough fidelity to underpin a healthy ecosystem.

+ +

If we acknowledge that SemVer is a lossy estimate and represents only a subset of the possible scope of changes, we can begin to see it as a blunt instrument. In theory, it works fine as a shorthand. In practice, especially when we build SAT-solvers on top of it, SemVer can (and does) fail us by both overconstraining and underprotecting us.

+ +
+

SemVer Might Overconstrain

+ +

Consider what happens when libbase is recognized to be more than a single monolith: there are almost always independent interfaces within a library.  Even if there are only two functions, we can see situations in which SemVer overconstrains us.  Imagine that libbase is indeed composed of only two functions, Foo and Bar. Our mid-level dependencies liba and libb use only Foo. If the maintainer of libbase makes a breaking change to Bar, it is incumbent on them to bump the major version of libbase in a SemVer world. liba and libb are known to depend on libbase 1.x—SemVer dependency solvers won’t accept a 2.x version of that dependency. However, in reality these libraries would work together perfectly: only Bar changed, and that was unused. The compression inherent in “I made a breaking change; I must bump the major version number†is lossy when it doesn’t apply at the granularity of an individual atomic API unit. Although some dependencies might be fine grained enough for that to be accurate,10 that is not the norm for a SemVer ecosystem.

+ +

If SemVer overconstrains, either because of an unnecessarily severe version bump or insufficiently fine-grained application of SemVer numbers, automated package managers and SAT-solvers will report that your dependencies cannot be updated or installed, even if everything would work together flawlessly by ignoring the SemVer checks. Anyone who has ever been exposed to dependency hell during an upgrade might find this particularly infuriating: some large fraction of that effort was a complete waste of time.

+
+ +
+

SemVer Might Overpromise

+ +

On the flip side, the application of SemVer makes the  explicit assumption  that an API provider’s estimate of compatibility can be fully predictive and that changes fall into three buckets: breaking (by modification or removal), strictly additive, or non-API-impacting. If SemVer is a perfectly faithful representation of the risk of a change by classifying syntactic and semantic changes, how do we characterize a change that adds a one-millisecond delay to a time-sensitive API? Or, more plausibly: how do we characterize a change that alters the format of our logging output? Or that alters the order that we import external dependencies? Or that alters the order that results are returned in an “unordered†stream? Is it reasonable to assume that those changes are “safe†merely because those aren’t part of the syntax or contract of the API in question? What if the documentation said “This may change in the futureâ€? Or the API was named “ForInternalUseByLibBaseOnlyDoNotTouchThisIReallyMeanIt?â€11

+ +

The idea that SemVer patch versions, which in theory are only changing implementation details, are “safe†changes absolutely runs afoul of Google’s experience with Hyrum’s Law—“With a sufficient number of users, every observable behavior of your system will be depended upon by someone.†Changing the order that dependencies are imported, or changing the output order for an “unordered†producer will, at scale, invariably break assumptions that some consumer was (perhaps incorrectly) relying upon. The very term “breaking change†is misleading: there are changes that are theoretically breaking but safe in practice (removing an unused API). There are also changes that are theoretically safe but break client code in practice (any of our earlier Hyrum’s Law examples). We can see this in any SemVer/dependency-management system for which the version-number requirement system allows for restrictions on the patch number: if you can say liba requires libbase >1.1.14 rather than liba requires libbase 1.1, that’s clearly an admission that there are observable differences in patch versions.

+ +

A change in isolation isn’t breaking or nonbreaking—that statement can be evaluated only in the context of how it is being used. There is no absolute truth in the notion of “This is a breaking changeâ€; a change can been seen to be breaking for only a (known or unknown) set of existing users and use cases. The reality of how we evaluate a change inherently relies upon information that isn’t present in the SemVer formulation of dependency management: how are downstream users consuming this dependency?

+ +

Because of this, a SemVer constraint solver might report that your dependencies work together when they don’t, either because a bump was applied incorrectly or because something in your dependency network had a Hyrum’s Law dependence on something that wasn’t considered part of the observable API surface. In these cases, you might have either build errors or runtime bugs, with no theoretical upper bound on their severity.

+
+ +
+

Motivations

+ +

There is a further argument that SemVer doesn’t always incentivize the creation of stable code.   For a maintainer of an arbitrary dependency, there is variable systemic incentive to not make breaking changes and bump major versions. Some projects care deeply about compatibility and will go to great lengths to avoid a major-version bump. Others are more aggressive, even intentionally bumping major versions on a fixed schedule. The trouble is that most users of any given dependency are indirect users—they wouldn’t have any significant reasons to be aware of an upcoming change. Even most direct users don’t subscribe to mailing lists or other release notifications.

+ +

All of which combines to suggest that no matter how many users will be inconvenienced by adoption of an incompatible change to a popular API, the maintainers bear a tiny fraction of the cost of the resulting version bump. For maintainers who are also users, there can also be an incentive toward breaking: it’s always easier to design a better interface in the absence of legacy constraints. This is part of why we think projects should publish clear statements of intent with respect to compatibility, usage, and breaking changes. Even if those are best-effort, nonbinding, or ignored by many users, it still gives us a starting point to reason about whether a breaking change/major version bump is “worth it,†without bringing in these conflicting incentive structures.

+ +

Go and Clojure both handle this nicely: in their standard package management ecosystems, the equivalent of a major-version bump is expected to be a fully new package.   This has a certain sense of justice to it: if you’re willing to break backward compatibility for your package, why do we pretend this is the same set of APIs? Repackaging and renaming everything seems like a reasonable amount of work to expect from a provider in exchange for them taking the nuclear option and throwing away backward compatibility.

+ +

Finally, there’s the human fallibility of the process. In general, SemVer version bumps should be applied to semantic changes just as much as syntactic ones; changing the behavior of an API matters just as much as changing its structure. Although it’s plausible that tooling could be developed to evaluate whether any particular release involves syntactic changes to a set of public APIs, discerning whether there are meaningful and intentional semantic changes is computationally infeasible.12 Practically speaking, even the potential tools for identifying syntactic changes are limited. In almost all cases, it is up to the human judgement of the API provider whether to bump major, minor, or patch versions for any given change. If you’re relying on only a handful of professionally maintained dependencies, your expected exposure to this form of SemVer clerical error is probably low.13 If you have a network of thousands of dependencies underneath your product, you should be prepared for some amount of chaos simply from human error.

+
+ +
+

Minimum Version Selection

+ +

In 2018, as part of an essay series on building a package management system for the Go programming  language, Google’s own Russ Cox described an interesting variation  on SemVer dependency  management: Minimum Version Selection (MVS). When updating the version for some node in the dependency network, it is possible that its dependencies need to be updated to newer versions to satisfy an updated SemVer requirement—this can then trigger further changes transitively. In most constraint-satisfaction/version-selection formulations, the newest possible versions of those downstream dependencies are chosen: after all, you’ll need to update to those new versions eventually, right?

+ +

MVS makes the opposite choice: when liba’s specification requires libbase ≥1.7, we’ll try libbase 1.7 directly, even if a 1.8 is available. This “produces high-fidelity builds in which the dependencies a user builds are as close as possible to the ones the author developed against.â€14 There is a critically important truth revealed in this point: when liba says it requires libbase ≥1.7, that almost certainly means that the developer of liba had libbase 1.7 installed. Assuming that the maintainer performed even basic testing before publishing,15 we have at least anecdotal evidence of interoperability testing for that version of liba and version 1.7 of libbase. It’s not CI or proof that everything has been unit tested together, but it’s something.

+ +

Absent accurate input constraints derived from 100% accurate prediction of the future, it’s best to make the smallest jump forward possible. Just as it’s usually safer to commit an hour of work to your project instead of dumping a year of work all at once, smaller steps forward in your dependency updates are safer. MVS just walks forward each affected dependency only as far as is required and says, "OK, I’ve walked forward far enough to get what you asked for (and not farther). Why don’t you run some tests and see if things are good?"

+ +

Inherent in the idea of MVS is the admission that a newer version might introduce an incompatibility in practice, even if the version numbers in theory say otherwise. This is recognizing the core concern with SemVer, using MVS or not: there is some loss of fidelity in this compression of software changes into version numbers. MVS gives some additional practical fidelity, trying to produce selected versions closest to those that have presumably been tested together. This might be enough of a boost to make a larger set of dependency networks function properly. Unfortunately, we haven’t found a good way to empirically verify that idea. The jury is still out on whether MVS makes SemVer “good enough†without fixing the basic theoretical and incentive problems with the approach, but we still believe it represents a manifest improvement in the application of SemVer constraints as they are used today.

+
+ +
+

So, Does SemVer Work?

+ +

SemVer works well enough in limited scales.  It’s deeply important, however, to recognize what it is actually saying and what it cannot.  SemVer will work fine provided that:

+ +
    +
  • +

    Your dependency providers are accurate and responsible (to avoid human error in SemVer bumps)

    +
  • +
  • +

    Your dependencies are fine grained (to avoid falsely overconstraining when unused/unrelated APIs in your dependencies are updated, and the associated risk of unsatisfiable SemVer requirements)

    +
  • +
  • +

    All usage of all APIs is within the expected usage (to avoid being broken in surprising fashion by an assumed-compatible change, either directly or in code you depend upon transitively)

    +
  • +
+ +

When you have only a few carefully chosen and well-maintained dependencies in your dependency graph, SemVer can be a perfectly suitable solution.

+ +

However, our experience at Google suggests that it is unlikely that you can have any of those three properties at scale and keep them working constantly over time. Scale tends to be the thing that shows the weaknesses in SemVer. As your dependency network scales up, both in the size of each dependency and the number of dependencies (as well as any monorepo effects from having multiple projects depending on the same network of external dependencies), the compounded fidelity loss in SemVer will begin to dominate. These failures manifest as both false positives (practically incompatible versions that theoretically should have worked) and false negatives (compatible versions disallowed by SAT-solvers and resulting dependency hell).  

+
+
+ +
+

Dependency Management with Infinite Resources

+ +

Here’s a useful thought experiment when considering  dependency-management solutions: what would dependency management look like if we all had access to infinite compute resources? That is, what’s the best we could hope for, if we aren’t resource constrained but are limited only by visibility and weak coordination among organizations? As we see it currently, the industry relies on SemVer for three reasons:

+ +
    +
  • +

    It requires only local information (an API provider doesn’t need to know the particulars of downstream users)

    +
  • +
  • +

    It doesn’t assume the availability of tests (not ubiquitous in the industry yet, but definitely moving that way in the next decade), compute resources to run the tests, or CI systems to monitor the test results

    +
  • +
  • +

    It’s the existing practice

    +
  • +
+ +

The “requirement†of local information isn’t really necessary, specifically because dependency networks tend to form in only two environments:

+ +
    +
  • +

    Within a single organization

    +
  • +
  • +

    Within the OSS ecosystem, where source is visible even if the projects are not necessarily collaborating

    +
  • +
+ +

In either of those cases, significant information about downstream usage is available, even if it isn’t being readily exposed or acted upon today. That is, part of SemVer’s effective dominance is that we’re choosing to ignore information that is theoretically available to us. If we had access to more compute resources and that dependency information was surfaced readily, the community would probably find a use for it.

+ +

Although an OSS package can have innumerable closed-source dependents, the common case is that popular OSS packages are popular both publicly and privately. Dependency networks don’t (can’t) aggressively mix public and private dependencies: generally, there is a public subset and a separate private subgraph.16

+ +

Next, we must remember the intent of SemVer: “In my estimation, this change will be easy (or not) to adopt.†Is there a better way of conveying that information? Yes, in the form of practical experience demonstrating that the change is easy to adopt. How do we get such experience? If most (or at least a representative sample) of our dependencies are publicly visible, we run the tests for those dependencies with every proposed change. With a sufficiently large number of such tests, we have at least a statistical argument that the change is safe in the practical Hyrum’s-Law sense. The tests still pass, the change is good—it doesn’t matter whether this is API impacting, bug fixing, or anything in between; there’s no need to classify or estimate.

+ +

Imagine, then, that the OSS ecosystem moved to a world in which changes were accompanied with evidence of whether they are safe. If we pull compute costs out of the equation, the truth17 of “how safe is this†comes from running affected tests in downstream dependencies.

+ +

Even without formal CI applied to the entire OSS ecosystem, we can of course use such a dependency graph and other secondary signals to do a more targeted presubmit analysis. Prioritize tests in dependencies that are heavily used. Prioritize tests in dependencies that are well maintained. Prioritize tests in dependencies that have a history of providing good signal and high-quality test results. Beyond just prioritizing tests based on the projects that are likely to give us the most information about experimental change quality, we might be able to use information from the change authors to help estimate risk and select an appropriate testing strategy. Running “all affected†tests is theoretically necessary if the goal is “nothing that anyone relies upon is changed in a breaking fashion.†If we consider the goal to be more in line with “risk mitigation,†a statistical argument becomes a more appealing (and cost-effective) approach.

+ +

In Unit Testing, we identified four varieties of change, ranging from pure refactorings to modification of existing functionality. Given a CI-based model for dependency updating, we can begin to map those varieties of change onto a SemVer-like model for which the author of a change estimates the risk and applies an appropriate level of testing. For example, a pure refactoring change that modifies only internal APIs might be assumed to be low risk and justify running tests only in our own project and perhaps a sampling of important direct dependents. On the other hand, a change that removes a deprecated interface or changes observable behaviors might require as much testing as we can afford.

+ +

What changes would we need to the OSS ecosystem to apply such a model? Unfortunately, quite a few:

+ +
    +
  • +

    All dependencies must provide unit tests. Although we are moving inexorably toward a world in which unit testing is both well accepted and ubiquitous, we are not there yet.

    +
  • +
  • +

    The dependency network for the majority of the OSS ecosystem is understood. It is unclear that any mechanism is currently available to perform graph algorithms on that network—the information is public and available, but not actually generally indexed or usable. Many package-management systems/dependency-management ecosystems allow you to see the dependencies of a project, but not the reverse edges, the dependents.

    +
  • +
  • +

    The availability of compute resources for executing CI is still very limited. Most developers don’t have access to build-and-test compute clusters.

    +
  • +
  • +

    Dependencies are often expressed in a pinned fashion. As a maintainer of libbase, we can’t experimentally run a change through the tests for liba and libb if those dependencies are explicitly depending on a specific pinned version of libbase.

    +
  • +
  • +

    We might want to explicitly include history and reputation in CI calculations. A proposed change that breaks a project that has a longstanding history of tests continuing to pass gives us a different form of evidence than a breakage in a project that was only added recently and has a history of breaking for unrelated reasons.

    +
  • +
+ +

Inherent in this is a scale question: against which versions of each dependency in the network do you test presubmit changes? If we test against the full combination of all historical versions, we’re going to burn a truly staggering amount of compute resources, even by Google standards. The most obvious simplification to this version-selection strategy would seem to be “test the current stable version†(trunk-based development is the goal, after all). And thus, the model of dependency management given infinite resources is effectively that of the Live at Head model. The outstanding question is whether that model can apply effectively with a more practical resource availability and whether API providers are willing to take greater responsibility for testing the practical safety of their changes. Recognizing where our existing low-cost facilities are an oversimplification of the difficult-to-compute truth that we are looking for is still a useful exercise.

+ +
+

Exporting Dependencies

+ +

So far, we’ve only talked about taking on dependencies; that is, depending on software that other people have written.  It’s also worth thinking about how we build software that can be used as a dependency. This goes beyond just the mechanics of packaging software and uploading it to a repository: we need to think about the benefits, costs, and risks of providing software, for both us and our potential dependents.

+ +

There are two major ways that an innocuous and hopefully charitable act like “open sourcing a library†can become a possible loss for an organization. First, it can eventually become a drag on the reputation of your organization if implemented poorly or not maintained properly. As the Apache community saying goes, we ought to prioritize “community over code.†If you provide great code but are a poor community member, that can still be harmful to your organization and the broader community. Second, a well-intentioned release can become a tax on engineering efficiency if you can’t keep things in sync. Given time, all forks will become expensive.

+ +
+

Example: open sourcing gflags

+ +

For reputation loss, consider the case of something like Google’s experience circa 2006 open sourcing our C++ command-line flag libraries.   Surely giving back to the open source community is a purely good act that won’t come back to haunt us, right? Sadly, no. A host of reasons conspired to make this good act into something that certainly hurt our reputation and possibly damaged the OSS community as well:

+ +
    +
  • +

    At the time, we didn’t have the ability to execute large-scale refactorings, so everything that used that library internally had to remain exactly the same—we couldn’t move the code to a new location in the codebase.

    +
  • +
  • +

    We segregated our repository into “code developed in-house†(which can be copied freely if it needs to be forked, so long as it is renamed properly) and “code that may have legal/licensing concerns†(which can have more nuanced usage requirements).

    +
  • +
  • +

    If an OSS project accepts code from outside developers, that’s generally a legal issue—the project originator doesn’t own that contribution, they only have rights to it.

    +
  • +
+ +

As a result, the gflags project was doomed to be either a “throw over the wall†release or a disconnected fork. Patches contributed to the project couldn’t be reincorporated into the original source inside of Google, and we couldn’t move the project within our monorepo because we hadn’t yet mastered that form of refactoring, nor could we make everything internally depend on the OSS version.

+ +

Further, like most organizations, our priorities have shifted and changed over time. Around the time of the original release of that flags library, we were interested in products outside of our traditional space (web applications, search), including things like Google Earth, which had a much more traditional distribution mechanism: precompiled binaries for a variety of platforms. In the late 2000s, it was unusual but not unheard of for a library in our monorepo, especially something low-level like flags, to be used on a variety of platforms. As time went on and Google grew, our focus narrowed to the point that it was extremely rare for any libraries to be built with anything other than our in-house configured toolchain, then deployed to our production fleet. The “portability†concerns for properly supporting an OSS project like flags were nearly impossible to maintain: our internal tools simply didn’t have support for those platforms, and our average developer didn’t have to interact with external tools. It was a constant battle to try to maintain portability.

+ +

As the original authors and OSS supporters moved on to new companies or new teams, it eventually became clear that nobody internally was really supporting our OSS flags project—nobody could tie that support back to the priorities for any particular team. Given that it was no specific team’s job, and nobody could say why it was important, it isn’t surprising that we basically let that project rot externally.18 The internal and external versions diverged slowly over time, and eventually some external developers took the external version and forked it, giving it some proper attention.

+ +

Other than the initial “Oh look, Google contributed something to the open source world,†no part of that made us look good, and yet every little piece of it made sense given the priorities of our engineering organization. Those of us who have been close to it have learned, “Don’t release things without a plan (and a mandate) to support it for the long term.†Whether the whole of Google engineering has learned that or not remains to be seen. It’s a big organization.

+ +

Above and beyond the nebulous “We look bad,†there are also parts of this story that illustrate how we can be subject to technical problems stemming from poorly released/poorly maintained external dependencies. Although the flags library was shared but ignored, there were still some Google-backed open source projects, or projects that needed to be shareable outside of our monorepo ecosystem. Unsurprisingly, the authors of those other projects were able to identify19 the common API subset between the internal and external forks of that library. Because that common subset stayed fairly stable between the two versions for a long period, it silently became “the way to do this†for the rare teams that had unusual portability requirements between roughly 2008 and 2017. Their code could build in both internal and external ecosystems, switching out forked versions of the flags library depending on environment.

+ +

Then, for unrelated reasons, C++ library teams began tweaking observable-but-not-documented pieces of the internal flag implementation. At that point, everyone who was depending on the stability and equivalence of an unsupported external fork started screaming that their builds and releases were suddenly broken. An optimization opportunity worth some thousands of aggregate CPUs across Google’s fleet was significantly delayed, not because it was difficult to update the API that 250 million lines of code depended upon, but because a tiny handful of projects were relying on unpromised and unexpected things. Once again, Hyrum’s Law affects software changes, in this case even for forked APIs maintained by separate organizations.

+ + + +

With enough users, any "observable" of your system will come to be depended upon by somebody. At Google, we constrain all of our internal users within the boundaries of our technical stack and ensure visibility into their usage with the monorepo and code indexing systems, so it is far easier to ensure that useful change remains possible. When we shift from source control to dependency management and lose visibility into how code is used or are subject to competing priorities from outside groups (especially ones that are paying you), it becomes much more difficult to make pure engineering trade-offs. Releasing APIs of any sort exposes you to the possibility of competing priorities and unforeseen constraints by outsiders. This isn’t to say that you shouldn’t release APIs; it serves only to provide the reminder: external users of an API cost a lot more to maintain than internal ones.

+ +

Sharing code with the outside world, either as an open source release or as a closed-source library release, is not a simple matter of charity (in the OSS case) or business opportunity (in the closed-source case). Dependent users that you cannot monitor, in different organizations, with different priorities, will eventually exert some form of Hyrum’s Law inertia on that code. Especially if you are working with long timescales, it is impossible to accurately predict the set of necessary or useful changes that could become valuable. When evaluating whether to release something, be aware of the long-term risks: externally shared dependencies are often much more expensive to modify over time.  

+
+
+
+ +
+

Conclusion

+ +

Dependency management is inherently challenging—we’re looking for solutions to management of complex API surfaces and webs of dependencies, where the maintainers of those dependencies generally have little or no assumption of coordination. The de facto standard for managing a network of dependencies is semantic versioning, or SemVer, which provides a lossy summary of the perceived risk in adopting any particular change. SemVer presupposes that we can a priori predict the severity of a change, in the absence of knowledge of how the API in question is being consumed: Hyrum’s Law informs us otherwise. However, SemVer works well enough at small scale, and even better when we include the MVS approach. As the size of the dependency network grows, Hyrum’s Law issues and fidelity loss in SemVer make managing the selection of new versions increasingly difficult.

+ +

It is possible, however, that we move toward a world in which maintainer-provided estimates of compatibility (SemVer version numbers) are dropped in favor of experience-driven evidence: running the tests of affected downstream packages. If API providers take greater responsibility for testing against their users and clearly advertise what types of changes are expected, we have the possibility of higher-fidelity dependency networks at even larger scale.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Prefer source control problems to dependency management problems: if you can get more code from your organization to have better transparency and coordination, those are important simplifications.

    +
  • +
  • +

    Adding a dependency isn’t free for a software engineering project, and the complexity in establishing an “ongoing†trust relationship is challenging. Importing dependencies into your organization needs to be done carefully, with an understanding of the ongoing support costs.

    +
  • +
  • +

    A dependency is a contract: there is a give and take, and both providers and consumers have some rights and responsibilities in that contract. Providers should be clear about what they are trying to promise over time.

    +
  • +
  • +

    SemVer is a lossy-compression shorthand estimate for “How risky does a human think this change is?†SemVer with a SAT-solver in a package manager takes those estimates and escalates them to function as absolutes. This can result in either overconstraint (dependency hell) or underconstraint (versions that should work together that don’t).

    +
  • +
  • +

    By comparison, testing and CI provide actual evidence of whether a new set of versions work together.

    +
  • +
  • +

    Minimum-version update strategies in SemVer/package management are higher fidelity. This still relies on humans being able to assess incremental version risk accurately, but distinctly improves the chance that the link between API provider and consumer has been tested by an expert.

    +
  • +
  • +

    Unit testing, CI, and (cheap) compute resources have the potential to change our understanding and approach to dependency management. That phase-change requires a fundamental change in how the industry considers the problem of dependency management, and the responsibilities of providers and consumers both.

    +
  • +
  • +

    Providing a dependency isn’t free: “throw it over the wall and forget†can cost you reputation and become a challenge for compatibility. Supporting it with stability can limit your choices and pessimize internal usage. Supporting without stability can cost goodwill or expose you to risk of important external groups depending on something via Hyrum’s Law and messing up your “no stability†plan. 

    +
  • +
+
+

1This could be any of language version, version of a lower-level library, hardware version, operating system, compiler flag, compiler version, and so on.

2For instance, security bugs, deprecations, being in the dependency set of a higher-level dependency that has a security bug, and so on.

3This is called shading or versioning.

4In many cases, there is significant overlap in those populations.

5Common Vulnerabilities and Exposures

6Strictly speaking, SemVer refers only to the emerging practice of applying semantics to major/minor/patch version numbers, not the application of compatible version requirements among dependencies numbered in that fashion. There are numerous minor variations on those requirements among different ecosystems, but in general, the version-number-plus-constraints system described here as SemVer is representative of the practice at large.

7In fact, it has been proven that SemVer constraints applied to a dependency network are NP-complete.

8Especially the author and others in the Google C++ community.

9For example: a poorly implemented polyfill that adds the new libbase API ahead of time, causing a conflicting definition. Or, use of language reflection APIs to depend upon the precise number of APIs provided by libbase, introducing crashes if that number changes. These shouldn’t happen and are certainly rare even if they do happen by accident—the point is that the libbase providers can’t prove compatibility.

10The Node ecosystem has noteworthy examples of dependencies that provide exactly one API.

11It’s worth noting: in our experience, naming like this doesn’t fully solve the problem of users reaching in to access private APIs. Prefer languages that have good control over public/private access to APIs of all forms.

12In a world of ubiquitous unit tests, we could identify changes that required a change in test behavior, but it would still be difficult to algorithmically separate “This is a behavioral change†from “This is a bug fix to a behavior that wasn’t intended/promised.â€

13So, when it matters in the long term, choose well-maintained dependencies.

14Russ Cox, "Minimal Version Selection," February 21, 2018, https://research.swtch.com/vgo-mvs.

15If that assumption doesn’t hold, you should really stop depending on liba.

16Because the public OSS dependency network can’t generally depend on a bunch of private nodes, graphics firmware notwithstanding.

17Or something very close to it.

18That isn’t to say it’s right or wise, just that as an organization we let some things slip through the cracks.

19Often through trial and error.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch22.html b/clones/abseil.io/resources/swe-book/html/ch22.html new file mode 100644 index 00000000..3d756cad --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch22.html @@ -0,0 +1,414 @@ + + + + + Software Engineering at Google + + + + +
+

Large-Scale Changes

+ + + + + +

Think for a moment about your own codebase.  How many files can you reliably update in a single, simultaneous commit? What are the factors that constrain that number? Have you ever tried committing a change that large? Would you be able to do it in a reasonable amount of time in an emergency? How does your largest commit size compare to the actual size of your codebase? How would you test such a change? How many people would need to review the change before it is committed? Would you be able to roll back that change if it did get committed? The answers to these questions might surprise you (both what you think the answers are and what they actually turn out to be for your organization).

+ +

At Google, we’ve long ago abandoned the idea of making sweeping changes across our codebase in these types of large atomic changes. Our observation has been that, as a codebase and the number of engineers working in it grows, the largest atomic change possible counterintuitively decreases—running all affected presubmit checks and tests becomes difficult, to say nothing of even ensuring that every file in the change is up to date before submission. As it has become more difficult to make sweeping changes to our codebase, given our general desire to be able to continually improve underlying infrastructure, we’ve had to develop new ways of reasoning about large-scale changes and how to implement them.

+ +

In this chapter, we’ll talk about the techniques, both social and technical, that enable us to keep the large Google codebase flexible and responsive to changes in underlying infrastructure. We’ll also provide some real-life examples of how and where we’ve used these approaches. Although your codebase might not look like Google’s, understanding these principles and adapting them locally will help your development organization scale while still being able to make broad changes across your codebase.

+ +
+

What Is a Large-Scale Change?

+ +

Before going much further, we should dig into what qualifies as a large-scale change (LSC).  In our experience, an LSC is any set of changes that are logically related but cannot practically be submitted as a single atomic unit.  This might be because it touches so many files that the underlying tooling can’t commit them all at once, or it might be because the change is so large that it would always have merge conflicts. In many cases, an LSC is dictated by your repository topology: if your organization uses a collection of distributed or federated repositories,1 making atomic changes across them might not even be technically possible.2 We’ll look at potential barriers to atomic changes in more detail later in this chapter. 

+ +

LSCs at Google are almost always generated using automated tooling. Reasons for making an LSC vary, but the changes themselves generally fall into a few basic categories:

+ +
    +
  • +

    Cleaning up common antipatterns using codebase-wide analysis tooling

    +
  • +
  • +

    Replacing uses of deprecated library features

    +
  • +
  • +

    Enabling low-level infrastructure improvements, such as compiler upgrades

    +
  • +
  • +

    Moving users from an old system to a newer one3

    +
  • +
+ +

The number of engineers working on these specific tasks in a given organization might be low, but it is useful for their customers to have insight into the LSC tools and process. By their very nature, LSCs will affect a large number of customers, and the LSC tools easily scale down to teams making only a few dozen related changes.

+ +

There can be broader motivating causes behind specific LSCs. For example, a new language standard might introduce a more efficient idiom for accomplishing a given task, an internal library interface might change, or a new compiler release might require fixing existing problems that would be flagged as errors by the new release. The majority of LSCs across Google actually have near-zero functional impact: they tend to be widespread textual updates for clarity, optimization, or future compatibility. But LSCs are not theoretically limited to this behavior-preserving/refactoring class of change.

+ +

In all of these cases, on a codebase the size of Google’s, infrastructure teams might routinely need to change hundreds of thousands of individual references to the old pattern or symbol. In the largest cases so far, we’ve touched millions of references, and we expect the process to continue to scale well. Generally, we’ve found it advantageous to invest early and often in tooling to enable LSCs for the many teams doing infrastructure work. We’ve also found that efficient tooling also helps engineers performing smaller changes. The same tools that make changing thousands of files efficient also scale down to tens of files reasonably well.

+
+ +
+

Who Deals with LSCs?

+ +

As just indicated, the infrastructure teams that build and manage our systems are responsible for much of the work of performing LSCs, but the tools and resources are available across the company.  If you skipped What Is Software Engineering?, you might wonder why infrastructure teams are the ones responsible for this work. Why can’t we just introduce a new class, function, or system and dictate that everybody who uses the old one move to the updated analogue? Although this might seem easier in practice, it turns out not to scale very well for several reasons.

+ +

First, the infrastructure teams that build and manage the underlying systems are also the ones with the domain knowledge required to fix the hundreds of thousands of references to them. Teams that consume the infrastructure are unlikely to have the context for handling many of these migrations, and it is globally inefficient to expect them to each relearn expertise that infrastructure teams already have. Centralization also allows for faster recovery when faced with errors because errors generally fall into a small set of categories, and the team running the migration can have a playbook—formal or informal—for addressing them.

+ +

Consider the amount of time it takes to do the first of a series of semi-mechanical changes that you don’t understand. You probably spend some time reading about the motivation and nature of the change, find an easy example, try to follow the provided suggestions, and then try to apply that to your local code. Repeating this for every team in an organization greatly increases the overall cost of execution. By making only a few centralized teams responsible for LSCs, Google both internalizes those costs and drives them down by making it possible for the change to happen more efficiently.

+ +

Second, nobody likes unfunded mandates.4 Even though a new system might be categorically better than the one it replaces, those benefits are often diffused across an organization and thus unlikely to matter enough for individual teams to want to update on their own initiative. If the new system is important enough to migrate to, the costs of migration will be borne somewhere in the organization. Centralizing the migration and accounting for its costs is almost always faster and cheaper than depending on individual teams to organically migrate.

+ +

Additionally, having teams that own the systems requiring LSCs helps align incentives to ensure the change gets done. In our experience, organic migrations are unlikely to fully succeed, in part because engineers tend to use existing code as examples when writing new code. Having a team that has a vested interest in removing the old system responsible for the migration effort helps ensure that it actually gets done. Although funding and staffing a team to run these kinds of migrations can seem like an additional cost, it is actually just internalizing the externalities that an unfunded mandate creates, with the additional benefits of economies of scale.

+ + +
+ +
+

Barriers to Atomic Changes

+ +

Before we  discuss the process  that Google uses to actually effect LSCs, we should talk about why many kinds of changes can’t be committed atomically. In an ideal world, all logical changes could be packaged into a single atomic commit that could be tested, reviewed, and committed independent of other changes. Unfortunately, as a repository—and the number of engineers working in it—grows, that ideal becomes less feasible. It can be completely infeasible even at small scale when using a set of distributed or federated repositories.

+ +
+

Technical Limitations

+ +

To begin with, most Version Control Systems (VCSs) have operations that scale linearly with the size of a change.   Your system might be able to handle small commits (e.g., on the order of tens of files) just fine, but might not have sufficient memory or processing power to atomically commit thousands of files at once. In centralized VCSs, commits can block other writers (and in older systems, readers) from using the system as they process, meaning that large commits stall other users of the system.

+ +

In short, it might not be just “difficult†or “unwise†to make a large change atomically: it might simply be impossible with a given infrastructure. Splitting the large change into smaller, independent chunks gets around these limitations, although it makes the execution of the change more complex.5

+
+ +
+

Merge Conflicts

+ +

As the size of a change grows, the  potential for merge conflicts also increases.  Every version control system we know of requires updating and merging, potentially with manual resolution, if a newer version of a file exists in the central repository. As the number of files in a change increases, the probability of encountering a merge conflict also grows and is compounded by the number of engineers working in the repository.

+ +

If your company is small, you might be able to sneak in a change that touches every file in the repository on a weekend when nobody is doing development. Or you might have an informal system of grabbing the global repository lock by passing a virtual (or even physical!) token around your development team. At a large, global company like Google, these approaches are just not feasible: somebody is always making changes to the repository.

+ +

With few files in a change, the probability of merge conflicts shrinks, so they are more likely to be committed without problems. This property also holds for the following areas as well.

+
+ +
+

No Haunted Graveyards

+ +

The SREs who run Google’s production services have a mantra: “No Haunted Graveyards.†A haunted  graveyard in this  sense is a system that is so ancient, obtuse, or complex that no one dares enter it. Haunted graveyards are often business-critical systems that are frozen in time because any attempt to change them could cause the system to fail in incomprehensible ways, costing the business real money. They pose a real existential risk and can consume an inordinate amount of resources.

+ +

Haunted graveyards don’t just exist in production systems, however; they can be found in codebases. Many organizations have bits of software that are old and unmaintained, written by someone long off the team, and on the critical path of some important revenue-generating functionality. These systems are also frozen in time, with layers of bureaucracy built up to prevent changes that might cause instability. Nobody wants to be the network support engineer II who flipped the wrong bit!

+ +

These parts of a codebase are anathema to the LSC process because they prevent the completion of large migrations, the decommissioning of other systems upon which they rely, or the upgrade of compilers or libraries that they use. From an LSC perspective, haunted graveyards prevent all kinds of meaningful progress.

+ +

At Google, we’ve found the counter to this to be good, ol’-fashioned testing. When software is thoroughly tested, we can make arbitrary changes to it and know with confidence whether those changes are breaking, no matter the age or complexity of the system. Writing those tests takes a lot of effort, but it allows a codebase like Google’s to evolve over long periods of time, consigning the notion of haunted software graveyards to a graveyard of its own.

+
+ +
+

Heterogeneity

+ +

LSCs really work only when the bulk of the effort for them can be done by computers, not humans.  As good as humans can be with ambiguity, computers rely upon consistent environments to apply the proper code transformations to the correct places. If your organization has many different VCSs, Continuous Integration (CI) systems, project-specific tooling, or formatting guidelines, it is difficult to make sweeping changes across your entire codebase. Simplifying the environment to add more consistency will help both the humans who need to move around in it and the robots making automated transformations.

+ +

For example, many projects at Google have presubmit tests configured to run before changes are made to their codebase. Those checks can be very complex, ranging from checking new dependencies against a whitelist, to running tests, to ensuring that the change has an associated bug. Many of these checks are relevant for teams writing new features, but for LSCs, they just add additional irrelevant complexity.

+ +

We’ve decided to embrace some of this complexity, such as running presubmit tests, by making it standard across our codebase. For other inconsistencies, we advise teams to omit their special checks when parts of LSCs touch their project code. Most teams are happy to help given the benefit these kinds of changes are to their projects.

+ +
Note
+

Many of the benefits of consistency for humans mentioned in Style Guides and Rules also apply to automated tooling.

+
+
+ +
+

Testing

+ +

Every change should be tested (a process we’ll talk about more in just a moment), but the  larger  the change, the more difficult it is to actually test it appropriately. Google’s CI system will run not only the tests immediately impacted by a change, but also any tests that transitively depend on the changed files.6 This means a change gets broad coverage, but we’ve also observed that the farther away in the dependency graph a test is from the impacted files, the more unlikely a failure is to have been caused by the change itself.

+ +

Small, independent changes are easier to validate, because each of them affects a smaller set of tests, but also because test failures are easier to diagnose and fix. Finding the root cause of a test failure in a change of 25 files is pretty straightforward; finding 1 in a 10,000-file change is like the proverbial needle in a haystack.

+ +

The trade-off in this decision is that smaller changes will cause the same tests to be run multiple times, particularly tests that depend on large parts of the codebase. Because engineer time spent tracking down test failures is much more expensive than the compute time required to run these extra tests, we’ve made the conscious decision that this is a trade-off we’re willing to make. That same trade-off might not hold for all organizations, but it is worth examining what the proper balance is for yours.  

+ + +
+ +
+

Code Review

+ +

Finally, as we mentioned in Code Review, all changes need to be reviewed before submission, and this policy applies even for LSCs.   Reviewing large commits can be tedious, onerous, and even error prone, particularly if the changes are generated by hand (a process you want to avoid, as we’ll discuss shortly). In just a moment, we’ll look at how tooling can often help in this space, but for some classes of changes, we still want humans to explicitly verify they are correct. Breaking an LSC into separate shards makes this much easier.

+ + +
+
+ +
+

LSC Infrastructure

+ +

Google has invested in a  significant amount of infrastructure to make LSCs possible. This infrastructure includes tooling for change creation, change management, change review, and testing. However, perhaps the most important support for LSCs has been the evolution of cultural norms around large-scale changes and the oversight given to them. Although the sets of technical and social tools might differ for your organization, the general principles should be the same.

+ +
+

Policies and Culture

+ +

As we’ve described in Version Control and Branch Management, Google stores the bulk  of its source code in a single monolithic repository (monorepo), and every engineer has visibility into almost all of this code. This high degree of openness means that any engineer can edit any file and send those edits for review to those who can approve them. However, each of those edits has costs, both to generate as well as review. 10

+ +

Historically, these costs have been somewhat symmetric, which limited the scope of changes a single engineer or team could generate. As Google’s LSC tooling improved, it became easier to generate a large number of changes very cheaply, and it became equally easy for a single engineer to impose a burden on a large number of reviewers across the company. Even though we want to encourage widespread improvements to our codebase, we want to make sure there is some oversight and thoughtfulness behind them, rather than indiscriminate tweaking.11

+ +

The end result is a lightweight approval process for teams and individuals seeking to make LSCs across Google. This process is overseen by a group of experienced engineers who are familiar with the nuances of various languages, as well as invited domain experts for the particular change in question. The goal of this process is not to prohibit LSCs, but to help change authors produce the best possible changes, which make the best use of Google’s technical and human capital. Occasionally, this group might suggest that a cleanup just isn’t worth it: for example, cleaning up a common typo without any way of preventing recurrence.

+ +

Related to these policies was a shift in cultural norms surrounding LSCs.  Although it is important for code owners to have a sense of responsibility for their software, they also needed to learn that LSCs were an important part of Google’s effort to scale our software engineering practices. Just as product teams are the most familiar with their own software, library infrastructure teams know the nuances of the infrastructure, and getting product teams to trust that domain expertise is an important step toward social acceptance of LSCs. As a result of this culture shift, local product teams have grown to trust LSC authors to make changes relevant to those authors’ domains.

+ +

Occasionally, local owners question the purpose of a specific commit being made as part of a broader LSC, and change authors respond to these comments just as they would other review comments. Socially, it’s important that code owners understand the changes happening to their software, but they also have come to realize that they don’t hold a veto over the broader LSC. Over time, we’ve found that a good FAQ and a solid historic track record of improvements have generated widespread endorsement of LSCs throughout Google.

+
+ +
+

Codebase Insight

+ +

To do LSCs, we’ve found it invaluable  to be able to do  large-scale analysis of our codebase, both on a textual level using traditional tools, as well as on a semantic level.  For example, Google’s use of the semantic indexing tool Kythe provides a complete map of the links between parts of our codebase, allowing us to ask questions such as “Where are the callers of this function?†or “Which classes derive from this one?†Kythe and similar tools also provide programmatic access to their data so that they can be incorporated into refactoring tools. (For further examples, see Chapters Code Search and Static Analysis.)

+ +

We also use compiler-based indices to run abstract syntax tree-based analysis and transformations over our codebase. Tools such as ClangMR, JavacFlume, or Refaster, which can perform transformations in a highly parallelizable way, depend on these insights as part of their function. For smaller changes, authors can use specialized, custom tools, perl or sed, regular expression matching, or even a simple shell script.

+ +

Whatever tool your organization uses for change creation, it’s important that its human effort scale sublinearly with the codebase; in other words, it should take roughly the same amount of human time to generate the collection of all required changes, no matter the size of the repository. The change creation tooling should also be comprehensive across the codebase, so that an author can be assured that their change covers all of the cases they’re trying to fix.

+ +

As with other areas in this book, an early investment in tooling usually pays off in the short to medium term. As a rule of thumb, we’ve long held that if a change requires more than 500 edits, it’s usually more efficient for an engineer to learn and execute our change-generation tools rather than manually execute that edit. For experienced “code janitors,†that number is often much smaller.

+
+ +
+

Change Management

+ +

Arguably the most  important piece of large-scale change  infrastructure is the set of tooling that shards a master change into smaller pieces and manages the process of testing, mailing, reviewing, and committing them independently.  At Google, this tool is called Rosie, and we discuss its use more completely in a few moments when we examine our LSC process. In many respects, Rosie is not just a tool, but an entire platform for making LSCs at Google scale. It provides the ability to split the large sets of comprehensive changes produced by tooling into smaller shards, which can be tested, reviewed, and submitted independently.

+
+ +
+

Testing

+ +

Testing is another important piece  of large-scale-change–enabling infrastructure.  As discussed in Testing Overview, tests are one of the important ways that we validate our software will behave as expected. This is particularly important when applying changes that are not authored by humans. A robust testing culture and infrastructure means that other tooling can be confident that these changes don’t have unintended effects.

+ +

Google’s testing strategy for LSCs differs slightly from that of normal changes while still using the same underlying CI infrastructure. Testing LSCs means not just ensuring the large master change doesn’t cause failures, but that each shard can be submitted safely and independently. Because each shard can contain arbitrary files, we don’t use the standard project-based presubmit tests. Instead, we run each shard over the transitive closure of every test it might affect, which we discussed earlier.

+
+ +
+

Language Support

+ +

LSCs at Google are typically done on a per-language basis, and some languages support them much more easily than others.   We’ve found that language features such as type aliasing and forwarding functions are invaluable for allowing existing users to continue to function while we introduce new systems and migrate users to them non-atomically. For languages that lack these features, it is often difficult to migrate systems incrementally.12

+ +

We’ve also found that statically typed languages are much easier to perform large automated changes in than dynamically typed languages. Compiler-based tools along with strong static analysis provide a significant amount of information that we can use to build tools to affect LSCs and reject invalid transformations before they even get to the testing phase. The unfortunate result of this is that languages like Python, Ruby, and JavaScript that are dynamically typed are extra difficult for maintainers. Language choice is, in many respects, intimately tied to the question of code lifespan: languages that tend to be viewed as more focused on developer productivity tend to be more difficult to maintain. Although this isn’t an intrinsic design requirement, it is where the current state of the art happens to be.

+ +

Finally, it’s worth pointing out that automatic language formatters are a crucial part of the LSC infrastructure. Because we work toward optimizing our code for readability, we want to make sure that any changes produced by automated tooling are intelligible to both immediate reviewers and future readers of the code. All of the LSC-generation tools run the automated formatter appropriate to the language being changed as a separate pass so that the change-specific tooling does not need to concern itself with formatting specifics. Applying automated formatting, such as google-java-format or clang-format, to our codebase means that automatically produced changes will “fit in†with code written by a human, reducing future development friction. Without automated formatting, large-scale automated changes would never have become the accepted status quo at Google.

+
+ + +
+ +
+

The LSC Process

+ +

With these pieces of infrastructure in place, we can now talk about the process for actually making an LSC.  This roughly breaks down into four phases (with very nebulous boundaries between them):

+ +
    +
  1. +

    Authorization

    +
  2. +
  3. +

    Change creation

    +
  4. +
  5. +

    Shard management

    +
  6. +
  7. +

    Cleanup

    +
  8. +
+ +

Typically, these steps happen after a new system, class, or function has been written, but it’s important to keep them in mind during the design of the new system. At Google, we aim to design successor systems with a migration path from older systems in mind, so that system maintainers can move their users to the new system automatically.

+ +
+

Authorization

+ +

We ask potential authors to fill out a brief document explaining the reason for a proposed change, its estimated impact across  the codebase (i.e., how many smaller shards the large change would generate), and answers to any questions potential reviewers might have.  This process also forces authors to think about how they will describe the change to an engineer unfamiliar with it in the form of an FAQ and proposed change description. Authors also get “domain review†from the owners of the API being refactored.

+ +

This proposal is then forwarded to an email list with about a dozen people who have oversight over the entire process. After discussion, the committee gives feedback on how to move forward. For example, one of the most common changes made by the committee is to direct all of the code reviews for an LSC to go to a single "global approver." Many first-time LSC authors tend to assume that local project owners should review everything, but for most mechanical LSCs, it’s cheaper to have a single expert understand the nature of the change and build automation around reviewing it properly.

+ +

After the change is approved, the author can move forward in getting their change submitted. Historically, the committee has been very liberal with their approval,13 and often gives approval not just for a specific change, but also for a broad set of related changes. Committee members can, at their discretion, fast-track obvious changes without the need for full deliberation.

+ +

The intent of this process is to provide oversight and an escalation path, without being too onerous for the LSC authors. The committee is also empowered as the escalation body for concerns or conflicts about an LSC: local owners who disagree with the change can appeal to this group who can then arbitrate any conflicts. In practice, this has rarely been needed.

+
+ +
+

Change Creation

+ +

After getting the required approval, an LSC author will begin to produce the actual code edits.   Sometimes, these can be generated comprehensively into a single large global change that will be subsequently sharded into many smaller independent pieces. Usually, the size of the change is too large to fit in a single global change, due to technical limitations of the underlying version control system.

+ +

The change generation process should be as automated as possible so that the parent change can be updated as users backslide into old uses14 or textual merge conflicts occur in the changed code. Occasionally, for the rare case in which technical tools aren’t able to generate the global change, we have sharded change generation across humans (see Case Study: Operation RoseHub). Although much more labor intensive than automatically generating changes, this allows global changes to happen much more quickly for time-sensitive applications.

+ +

Keep in mind that we optimize for human readability of our codebase, so whatever tool generates changes, we want the resulting changes to look as much like human-generated changes as possible. This requirement leads to the necessity of style guides and automatic formatting tools (see Style Guides and Rules).15

+
+ +
+

Sharding and Submitting

+ +

After a global change has  been generated, the author then starts  running  Rosie. Rosie takes a large change and shards it based upon project boundaries and ownership rules into changes that can be submitted atomically. It then puts each individually sharded change through an independent test-mail-submit pipeline. Rosie can be a heavy user of other pieces of Google’s developer infrastructure, so it caps the number of outstanding shards for any given LSC, runs at lower priority, and communicates with the rest of the infrastructure about how much load it is acceptable to generate on our shared testing infrastructure.

+ +

We talk more about the specific test-mail-submit process for each shard below.

+ + + +
+

Testing

+ +

Each independent shard is tested by running it through TAP, Google’s CI framework.  We run every test that depends on the files in a given change transitively, which often creates high load on our CI system.

+ +

This might sound computationally expensive, but in practice, the vast majority of shards affect fewer than one thousand tests, out of the millions across our codebase. For those that affect more, we can group them together: first running the union of all affected tests for all shards, and then for each individual shard running just the intersection of its affected tests with those that failed the first run. Most of these unions cause almost every test in the codebase to be run, so adding additional changes to that batch of shards is nearly free.

+ +

One of the drawbacks of running such a large number of tests is that independent low-probability events are almost certainties at large enough scale. Flaky and brittle tests, such as those discussed in Testing Overview, which often don’t harm the teams that write and maintain them, are particularly difficult for LSC authors. Although fairly low impact for individual teams, flaky tests can seriously affect the throughput of an LSC system. Automatic flake detection and elimination systems help with this issue, but it can be a constant effort to ensure that teams that write flaky tests are the ones that bear their costs.

+ +

In our experience with LSCs as semantic-preserving, machine-generated changes, we are now much more confident in the correctness of a single change than a test with any recent history of flakiness—so much so that recently flaky tests are now ignored when submitting via our automated tooling. In theory, this means that a single shard can cause a regression that is detected only by a flaky test going from flaky to failing. In practice, we see this so rarely that it’s easier to deal with it via human communication rather than automation.

+ +

For any LSC process, individual shards should be committable independently. This means that they don’t have any interdependence or that the sharding mechanism can group dependent changes (such as to a header file and its implementation) together. Just like any other change, large-scale change shards must also pass project-specific checks before being reviewed and committed.

+
+ +
+

Mailing reviewers

+ +

After Rosie has validated that a change is safe through testing, it mails the change to an appropriate reviewer. In a company as large as Google, with thousands of engineers, reviewer discovery itself is a challenging problem. Recall from Code Review that code in the repository is organized with OWNERS files, which list users with approval privileges for a specific subtree in the repository. Rosie uses an owners detection service that understands these OWNERS files and weights each owner based upon their expected ability to review the specific shard in question. If a particular owner proves to be unresponsive, Rosie adds additional reviewers automatically in an effort to get a change reviewed in a timely manner.

+ +

As part of the mailing process, Rosie also runs the per-project precommit tools, which might perform additional checks. For LSCs, we selectively disable certain checks such as those for nonstandard change description formatting. Although useful for individual changes on specific projects, such checks are a source of heterogeneity across the codebase and can add significant friction to the LSC process. This heterogeneity is a barrier to scaling our processes and systems, and LSC tools and authors can’t be expected to understand special policies for each team.

+ +

We also aggressively ignore presubmit check failures that preexist the change in question. When working on an individual project, it’s easy for an engineer to fix those and continue with their original work, but that technique doesn’t scale when making LSCs across Google’s codebase. Local code owners are responsible for having no preexisting failures in their codebase as part of the social contract between them and infrastructure teams.

+
+ +
+

Reviewing

+ +

As with other changes, changes generated by Rosie are expected to go through the standard code review process.  In practice, we’ve found that local owners don’t often treat LSCs with the same rigor as regular changes—they trust the engineers generating LSCs too much. Ideally these changes would be reviewed as any other, but in practice, local project owners have come to trust infrastructure teams to the point where these changes are often given only cursory review. We’ve come to only send changes to local owners for which their review is required for context, not just approval permissions. All other changes can go to a “global approverâ€: someone who has ownership rights to approve any change throughout the repository.

+ +

When using a global approver, all of the individual shards are assigned to that person, rather than to individual owners of different projects. Global approvers generally have specific knowledge of the language and/or libraries they are reviewing and work with the large-scale change author to know what kinds of changes to expect. They know what the details of the change are and what potential failure modes for it might exist and can customize their workflow accordingly.

+ +

Instead of reviewing each change individually, global reviewers use a separate set of pattern-based tooling to review each of the changes and automatically approve ones that meet their expectations. Thus, they need to manually examine only a small subset that are anomalous because of merge conflicts or tooling malfunctions, which allows the process to scale very well.

+
+ +
+

Submitting

+ +

Finally, individual changes are committed. As with the mailing step, we ensure that the change passes the various project precommit checks before actually finally being committed to the repository.

+ +

With Rosie, we are able to effectively create, test, review, and submit thousands of changes per day across all of Google’s codebase and have given teams the ability to effectively migrate their users. Technical decisions that used to be final, such as the name of a widely used symbol or the location of a popular class within a codebase, no longer need to be final.   

+
+
+ +
+

Cleanup

+ +

Different LSCs have different definitions of “done,†which can  vary  from completely removing an old system to migrating only high-value references and leaving old ones to organically disappear.16 In almost all cases, it’s important to have a system that prevents additional introductions of the symbol or system that the large-scale change worked hard to remove. At Google, we use the Tricorder framework mentioned in Chapters Critique: Google’s Code Review Tool and Static Analysis to flag at review time when an engineer introduces a new use of a deprecated object, and this  has proven an effective method to prevent backsliding. We talk more about  the entire deprecation process in Deprecation.

+
+
+ +
+

Conclusion

+ +

LSCs form an important part of Google’s software engineering ecosystem. At design time, they open up more possibilities, knowing that some design decisions don’t need to be as fixed as they once were. The LSC process also allows maintainers of core infrastructure the ability to migrate large swaths of Google’s codebase from old systems, language versions, and library idioms to new ones, keeping the codebase consistent, spatially and temporally. And all of this happens with only a few dozen engineers supporting tens of thousands of others.

+ +

No matter the size of your organization, it’s reasonable to think about how you would make these kinds of sweeping changes across your collection of source code. Whether by choice or by necessity, having this ability will allow greater flexibility as your organization scales while keeping your source code malleable over time.

+
+ +
+

TL;DRs

+ +
    +
  • +

    An LSC process makes it possible to rethink the immutability of certain technical decisions.

    +
  • +
  • +

    Traditional models of refactoring break at large scales.

    +
  • +
  • +

    Making LSCs means making a  habit of making LSCs.

    +
  • +
+
+

1For some ideas about why, see Version Control and Branch Management.

2It’s possible in this federated world to say “we’ll just commit to each repo as fast as possible to keep the duration of the build break small!" But that approach really doesn’t scale as the number of federated repositories grows.

3For a further discussion about this practice, see Deprecation.

4By “unfunded mandate,†we mean “additional requirements imposed by an external entity without balancing compensation.†Sort of like when the CEO says that everybody must wear an evening gown for “formal Fridays†but doesn’t give you a corresponding raise to pay for your formal wear.

5See https://ieeexplore.ieee.org/abstract/document/8443579.

6This probably sounds like overkill, and it likely is. We’re doing active research on the best way to determine the “right†set of tests for a given change, balancing the cost of compute time to run the tests, and the human cost of making the wrong choice.

7The largest series of LSCs ever executed removed more than one billion lines of code from the repository over the course of three days. This was largely to remove an obsolete part of the repository that had been migrated to a new home; but still, how confident do you have to be to delete one billion lines of code?

8LSCs are usually supported by tools that make finding, making, and reviewing changes relatively straight forward.

9It is possible to ask TAP for single change “isolated†run, but these are very expensive and are performed only during off-peak hours.

10There are obvious technical costs here in terms of compute and storage, but the human costs in time to review a change far outweigh the technical ones.

11For example, we do not want the resulting tools to be used as a mechanism to fight over the proper spelling of “gray†or “grey†in comments.

12In fact, Go recently introduced these kinds of language features specifically to support large-scale refactorings (see https://talks.golang.org/2016/refactor.article).

13The only kinds of changes that the committee has outright rejected have been those that are deemed dangerous, such as converting all NULL instances to nullptr, or extremely low-value, such as changing spelling from British English to American English, or vice versa. As our experience with such changes has increased and the cost of LSCs has dropped, the threshold for approval has as well.

14This happens for many reasons: copy-and-paste from existing examples, committing changes that have been in development for some time, or simply reliance on old habits.

15In actuality, this is the reasoning behind the original work on clang-format for C++.

16Sadly, the systems we most want to organically decompose are those that are the most resilient to doing so. They are the plastic six-pack rings of the code ecosystem.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch23.html b/clones/abseil.io/resources/swe-book/html/ch23.html new file mode 100644 index 00000000..d1ae5167 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch23.html @@ -0,0 +1,567 @@ + + + + + Software Engineering at Google + + + + +
+

Continuous Integration

+ + + + + +

Continuous Integration, or CI, is generally  defined as “a software development practice where members of a team integrate their work frequently [...] Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.â€1 Simply put, the fundamental goal of CI is to automatically catch problematic changes as early as possible.

+ +

In practice, what does “integrating work frequently†mean for the modern, distributed application? Today’s systems have many moving pieces beyond just the latest versioned code in the repository. In fact, with the recent trend toward microservices, the changes that break an application are less likely to live inside the project’s immediate codebase and more likely to be in loosely coupled microservices on the other side of a network call. Whereas a traditional continuous build tests changes in your binary, an extension of this might test changes to upstream microservices. The dependency is just shifted from your function call stack to an HTTP request or Remote Procedure Calls (RPC).

+ +

Even further from code dependencies, an application might periodically ingest data or update machine learning models. It might execute on evolving operating systems, runtimes, cloud hosting services, and devices. It might be a feature that sits on top of a growing platform or be the platform that must accommodate a growing feature base. All of these things should be considered dependencies, and we should aim to “continuously integrate†their changes, too. Further complicating things, these changing components are often owned by developers outside our team, organization, or company and deployed on their own schedules.

+ +

So, perhaps a better definition for CI in today’s world, particularly when developing at scale, is the following:

+ +
+

Continuous Integration (2): the continuous assembling and testing of our entire complex and rapidly evolving ecosystem.

+
+ +

It is natural to conceptualize CI in terms of testing because the two are tightly coupled, and we’ll do so throughout this chapter. In previous chapters, we’ve discussed a comprehensive range of testing, from unit to integration, to larger-scoped systems.

+ +

From a testing perspective, CI is a paradigm  to inform the following:

+ +
    +
  • +

    Which tests to run when in the development/release workflow, as code (and other) changes are continuously integrated into it

    +
  • +
  • +

    How to compose the system under test (SUT) at each point, balancing concerns like fidelity and setup cost

    +
  • +
+ +

For example, which tests do we run on presubmit, which do we save for post-submit, and which do we save even later until our staging deploy? Accordingly, how do we represent our SUT at each of these points? As you might imagine, requirements for a presubmit SUT can differ significantly from those of a staging environment under test. For example, it can be dangerous for an application built from code pending review on presubmit to talk to real production backends (think security and quota vulnerabilities), whereas this is often acceptable for a staging environment.

+ +

And why should we try to optimize this often-delicate balance of testing “the right things†at “the right times†with CI? Plenty of prior work has already established the benefits of CI to the engineering organization and the overall business alike.2 These outcomes are driven by a powerful guarantee: verifiable—and timely—proof that the application is good to progress to the next stage. We don’t need to just hope that all contributors are very careful, responsible, and thorough; we can instead guarantee the working state of our application at various points from build throughout release, thereby improving confidence and quality in our products and productivity of our teams.

+ +

In the rest of this chapter, we’ll introduce some key CI concepts, best practices and challenges, before looking at how we manage CI at Google with an introduction to our continuous build tool, TAP, and an in-depth study of one application’s CI transformation.

+ +
+

CI Concepts

+ +

First, let’s begin by looking at  some core concepts of CI.

+ +
+

Fast Feedback Loops

+ +

As discussed in Testing Overview, the cost of a bug  grows almost  exponentially the later it is caught. Figure 23-1 shows all the places a problematic code change might be caught in its lifetime.

+ +
Life of a code change +
Figure 23-1. Life of a code change
+
+ +

In general, as issues progress to the "right" in our diagram, they become costlier for the following reasons:

+ +
    +
  • +

    They must be triaged by an engineer who is likely unfamiliar with the problematic code change.

    +
  • +
  • +

    They require more work for the code change author to recollect and investigate the change.

    +
  • +
  • +

    They negatively affect others, whether engineers in their work or ultimately the end user.

    +
  • +
+ +

To minimize the cost of bugs, CI encourages us to use fast feedback loops.3 Each time we integrate a code (or other) change into a testing scenario and observe the results, we get a new feedback loop. Feedback can take many forms; following are some common ones (in order of fastest to slowest):

+ +
    +
  • +

    The edit-compile-debug loop of local development

    +
  • +
  • +

    Automated test results to a code change author on presubmit

    +
  • +
  • +

    An integration error between changes to two projects, detected after both are submitted and tested together (i.e., on post-submit)

    +
  • +
  • +

    An incompatibility between our project and an upstream microservice dependency, detected by a QA tester in our staging environment, when the upstream service deploys its latest changes

    +
  • +
  • +

    Bug reports by internal users who are opted in to a feature before external users

    +
  • +
  • +

    Bug or outage reports by external users or the press

    +
  • +
+ +

Canarying—or deploying to a small percentage  of production first—can help minimize issues that do make it to production, with a subset-of-production initial feedback loop preceding all-of-production. However, canarying can cause problems, too, particularly around compatibility between deployments when multiple versions are deployed at once. This is sometimes known as version skew, a state of a distributed system in which it contains multiple incompatible versions of code, data, and/or configuration. Like many issues we look at in this book, version skew is another example of a challenging problem that can arise when trying to develop and manage software over time.

+ +

Experiments and feature flags are extremely powerful feedback loops.  They reduce deployment risk by isolating changes within modular components that can be dynamically toggled in production.  Relying heavily on feature-flag-guarding is a common paradigm for Continuous Delivery, which we explore further in Continuous Delivery.

+ +
+

Accessible and actionable feedback

+ +

It’s also important that feedback from CI be widely accessible. In addition to our open culture around code visibility, we feel similarly about our test reporting. We have a unified test reporting system in which anyone can easily look up a build or test run, including all logs (excluding user Personally Identifiable Information [PII]), whether for an individual engineer’s local run or on an automated development or staging build.

+ +

Along with logs, our test reporting system provides a detailed history of when build or test targets began to fail, including audits of where the build was cut at each run, where it was run, and by whom. We also have a system for flake classification, which uses statistics to classify flakes at a Google-wide level, so engineers don’t need to figure this out for themselves to determine whether their change broke another project’s test (if the test is flaky: probably not).

+ +

Visibility into test history empowers engineers to share and collaborate on feedback, an essential requirement for disparate teams to diagnose and learn from integration failures between their systems. Similarly, bugs (e.g., tickets or issues) at Google are open with full comment history for all to see and learn from (with the exception, again, of customer PII).

+ +

Finally, any feedback from CI tests should not just be accessible but actionable—easy to use to find and fix problems. We’ll look at an example of improving user-unfriendly feedback in our case study later in this chapter. By improving test output readability, you automate the understanding of feedback.  

+
+
+ +
+

Automation

+ +

It’s well known that automating development-related tasks saves engineering resources in the long run.   Intuitively, because we automate processes by defining them as code, peer review when changes are checked in will reduce the probability of error. Of course, automated processes, like any other software, will have bugs; but when implemented effectively, they are still faster, easier, and more reliable than if they were attempted manually by engineers.

+ +

CI, specifically, automates the build and release processes, with a Continuous Build and Continuous Delivery. Continuous testing is applied throughout, which we’ll look at in the next section.

+ +
+

Continuous Build

+ +

The Continuous Build (CB) integrates the latest code changes at head4 and runs an automated build and test.  Because the CB runs tests as well as building code, “breaking the build†or “failing the build†includes breaking tests as well as breaking compilation.

+ +

After a change is submitted, the CB should run all relevant tests. If a change passes all tests, the CB marks it passing or “green,†as it is often displayed in user interfaces (UIs). This process effectively introduces two different versions of head in the repository: true head, or the latest change that was committed, and green head, or the latest change the CB has verified. Engineers are able to sync to either version in their local development. It’s common to sync against green head to work with a stable environment, verified by the CB, while coding a change but have a process that requires changes to be synced to true head before submission.

+
+ +
+

Continuous Delivery

+ +

The first step in Continuous Delivery (CD; discussed more fully in Continuous Delivery) is release automation, which continuously assembles the latest code and configuration from head into release candidates.  At Google, most teams cut these at green, as opposed to true, head.

+ +
+

Release candidate (RC): A cohesive, deployable unit created by an automated process,5 assembled of code, configuration, and other dependencies that have passed the continuous build.

+
+ +

Note that we include configuration in release candidates—this is extremely important, even though it can slightly vary between environments as the candidate is promoted. We’re not necessarily advocating you compile configuration into your binaries—actually, we would recommend dynamic configuration, such as experiments or feature flags, for many scenarios.6

+ +

Rather, we are saying that any static configuration you do have should be promoted as part of the release candidate so that it can undergo testing along with its corresponding code. Remember, a large percentage of production bugs are caused by “silly†configuration problems, so it’s just as important to test your configuration as it is your code (and to test it along with the same code that will use it). Version skew is often caught in this release-candidate-promotion process. This assumes, of course, that your static configuration is in version control—at Google, static configuration is in version control along with the code, and hence goes through the same code review process.

+ +

We then define CD as follows:

+ +
+

Continuous Delivery (CD): a continuous assembling of release candidates, followed by the promotion and testing of those candidates throughout a series of environments—sometimes reaching production and sometimes not.

+
+ +

The promotion and deployment process often depends on the team. We’ll show how our case study navigated this process.

+ +

For teams at Google that want continuous feedback from new changes in production (e.g., Continuous Deployment), it’s usually infeasible to continuously push entire binaries, which are often quite large, on green. For that reason, doing a selective Continuous Deployment, through experiments or feature flags, is a common strategy.7

+ +

As an RC progresses through environments, its artifacts (e.g., binaries, containers) ideally should not be recompiled or rebuilt. Using containers such as Docker helps enforce consistency of an RC between environments, from local development onward. Similarly, using orchestration tools like Kubernetes (or in our case, usually Borg), helps enforce consistency between deployments. By enforcing consistency of our release and deployment between environments, we achieve higher-fidelity earlier testing and fewer surprises in production.  

+
+
+ +
+

Continuous Testing

+ +

Let’s look at  how CB and CD fit in as we apply  Continuous Testing (CT) to a code change throughout its lifetime, as shown Figure 23-2.

+ +
Life of a code change with CB and CD +
Figure 23-2. Life of a code change with CB and CD
+
+ +

The rightward arrow shows the progression of a single code change from local development to production. Again, one of our key objectives in CI is determining what to test when in this progression. Later in this chapter, we’ll introduce the different testing phases and provide some considerations for what to test in presubmit versus post-submit, and in the RC and beyond. We’ll show that, as we shift to the right, the code change is subjected to progressively larger-scoped automated tests.

+ +
+

Why presubmit isn’t enough

+ +

With the objective to catch problematic changes as soon as possible and the ability to run automated tests on presubmit, you might  be wondering: why not just run all tests on presubmit?

+ +

The main reason is that it’s too expensive. Engineer productivity is extremely valuable, and waiting a long time to run every test during code submission can be severely disruptive. Further, by removing the constraint for presubmits to be exhaustive, a lot of efficiency gains can be made if tests pass far more frequently than they fail. For example, the tests that are run can be restricted to certain scopes, or selected based on a model that predicts their likelihood of detecting a failure.

+ +

Similarly, it’s expensive for engineers to be blocked on presubmit by failures arising from instability or flakiness that has nothing to do with their code change.

+ +

Another reason is that during the time we run presubmit tests to confirm that a change is safe, the underlying repository might have changed in a manner that is incompatible with the changes being tested. That is, it is possible for two changes that touch completely different files to cause a test to fail. We call this a mid-air collision, and though generally rare, it happens most days at our scale. CI systems for smaller repositories or projects can avoid this problem by serializing submits so that there is no difference between what is about to enter and what just did.

+
+ +
+

Presubmit versus post-submit

+ +

So, which tests should be run on presubmit?  Our general rule of thumb is: only fast, reliable ones. You can accept some loss of coverage on presubmit, but that means you need to catch any issues that slip by on post-submit, and accept some number of rollbacks. On post-submit, you can accept longer times and some instability, as long as you have proper mechanisms to deal with it.

+ +
Note
+

We’ll show how TAP and our case study handle failure management in CI at Google.

+
+ +

We don’t want to waste valuable engineer productivity by waiting too long for slow tests or for too many tests—we typically limit presubmit tests to just those for the project where the change is happening. We also run tests concurrently, so there is a resource decision to consider as well. Finally, we don’t want to run unreliable tests on presubmit, because the cost of having many engineers affected by them, debugging the same problem that is not related to their code change, is too high.

+ +

Most teams at Google run their small tests (like unit tests) on presubmit8—these are the obvious ones to run as they tend to be the fastest and most reliable. Whether and how to run larger-scoped tests on presubmit is the more interesting question, and this varies by team. For teams that do want to run them, hermetic testing is a proven approach to reducing their inherent instability. Another option is to allow large-scoped tests to be unreliable on presubmit but disable them aggressively when they start failing.

+
+ +
+

Release candidate testing

+ +

After a code change has passed the CB (this might take  multiple cycles if there were failures), it will soon encounter CD and be included in a pending release candidate.

+ +

As CD builds RCs, it will run larger tests against the entire candidate. We test a release candidate by promoting it through a series of test environments and testing it at each deployment. This can include a combination of sandboxed, temporary environments and shared test environments, like dev or staging. It’s common to include some manual QA testing of the RC in shared environments, too.

+ +

There are several reasons why it’s important to run a comprehensive, automated test suite against an RC, even if it is the same suite that CB just ran against the code on post-submit (assuming the CD cuts at green):

+ +
+
As a sanity check
+
We double check that nothing strange happened when the code was cut and recompiled in the RC.
+
For auditability
+
If an engineer wants to check an RC’s test results, they are readily available and associated with the RC, so they don’t need to dig through CB logs to find them.
+
To allow for cherry picks
+
If you apply a cherry-pick fix to an RC, your source code has now diverged from the latest cut tested by the CB.
+
For emergency pushes
+
In that case, CD can cut from true head and run the minimal set of tests necessary to feel confident about an emergency push, without waiting for the full CB to pass.
+
+
+ +
+

Production testing

+ +

Our continuous, automated testing process goes all the way to the final deployed environment: production.  We should run the same suite of tests against production (sometimes called probers) that we did against the release candidate earlier on to verify: 1) the working state of production, according to our tests, and 2) the relevance of our tests, according to production.

+ +

Continuous testing at each step of the application’s progression, each with its own trade-offs, serves as a reminder of the value in a “defense in depth†approach to catching bugs—it isn’t just one bit of technology or policy that we rely upon for quality and stability, it’s many testing approaches combined.   

+ + +
+
+ +
+

CI Challenges

+ +

We’ve discussed some of the established best  practices in CI and have introduced some of the challenges involved, such as the potential disruption to engineer productivity of unstable, slow, conflicting, or simply too many tests at presubmit. Some common additional challenges when implementing CI include the following:

+ +
    +
  • +

    Presubmit optimization, including which tests to run at presubmit time given the potential issues we’ve already described, and how to run them. 

    +
  • +
  • +

    Culprit finding and failure isolation: Which  code or  other change caused the problem, and which system did it happen in? “Integrating upstream microservices" is one approach to failure isolation in a distributed architecture, when you want to figure out whether a problem originated in your own servers or a backend. In this approach, you stage combinations of your stable servers along with upstream microservices’ new servers. (Thus, you are integrating the microservices’ latest changes into your testing.) This approach can be particularly challenging due to version skew: not only are these environments often incompatible, but you’re also likely to encounter false positives—problems that occur in a particular staged combination that wouldn’t actually be spotted in production.

    +
  • +
  • +

    Resource constraints: Tests need resources to run, and large tests can be very expensive.  In addition, the cost for the infrastructure for inserting automated testing throughout the process can be considerable.

    +
  • +
+ +

There’s also the challenge of failure management—what to do when tests fail. Although smaller problems can usually be fixed quickly, many of our teams find that it’s extremely difficult to have a consistently green test suite when large end-to-end tests are involved. They inherently become broken or flaky and are difficult to debug; there needs to be a mechanism to temporarily disable and keep track of them so that the release can go on. A common technique at Google is to use bug “hotlists†filed by an on-call or release engineer and triaged to the appropriate team. Even better is when these bugs can be automatically generated and filed—some of our larger products, like Google Web Server (GWS) and Google Assistant, do this. These hotlists should be curated to make sure any release-blocking bugs are fixed immediately. Nonrelease blockers should be fixed, too; they are less urgent, but should also be prioritized so the test suite remains useful and is not simply a growing pile of disabled, old tests. Often, the problems caught by end-to-end test failures are actually with tests rather than code.

+ +

Flaky tests pose another problem to this process.  They erode confidence similar to a broken test, but finding a change to roll back is often more difficult because the failure won’t happen all the time. Some teams rely on a tool to remove such flaky tests from presubmit temporarily while the flakiness is investigated and fixed. This keeps confidence high while allowing for more time to fix the problem.

+ +

Test instability is another significant challenge that we’ve already looked at in the context of presubmits.  One tactic for dealing with this is to allow multiple attempts of the test to run. This is a common test configuration setting that teams use. Also, within test code, retries can be introduced at various points of specificity.

+ +

Another approach that helps with test instability (and other CI challenges) is hermetic testing, which we’ll look at in the next section.

+
+ +
+

Hermetic Testing

+ +

Because talking to a live backend is unreliable, we  often use hermetic backends for larger-scoped tests.   This is particularly useful when we want to run these tests on presubmit, when stability is of utmost importance. In Testing Overview, we introduced the concept of hermetic tests:

+ +
+

Hermetic tests: tests run against a test environment (i.e., application servers and resources) that is entirely self-contained (i.e., no external dependencies like production backends).

+
+ +

Hermetic tests have two important properties: greater determinism (i.e., stability) and isolation. Hermetic servers are still prone to some sources of nondeterminism, like system time, random number generation, and race conditions. But, what goes into the test doesn’t change based on outside dependencies, so when you run a test twice with the same application and test code, you should get the same results. If a hermetic test fails, you know that it’s due to a change in your application code or tests (with a minor caveat: they can also fail due to a restructuring of your hermetic test environment, but this should not change very often). For this reason, when CI systems rerun tests hours or days later to provide additional signals, hermeticity makes test failures easier to narrow down.

+ +

The other important property, isolation, means that problems in production should not affect these tests. We generally run these tests all on the same machine as well, so we don’t have to worry about network connectivity issues. The reverse also holds: problems caused by running hermetic tests should not affect production.

+ +

Hermetic test success should not depend on the user running the test. This allows people to reproduce tests run by the CI system and allows people (e.g., library developers) to run tests owned by other teams.

+ +

One type of hermetic backend is a fake.  As discussed in Test Doubles, these can be cheaper than running a real backend, but they take work to maintain and have limited fidelity.

+ +

The cleanest option to achieve a presubmit-worthy integration test is with a fully hermetic setup—that is, starting up the entire stack sandboxed11—and Google provides out-of-the-box sandbox configurations for popular components, like databases, to make it easier.  This is more feasible for smaller applications with fewer components, but there are exceptions at Google, even one (by DisplayAds) that starts about four hundred servers from scratch on every presubmit as well as continuously on post-submit. Since the time that system was created, though, record/replay has emerged as a more popular paradigm for larger systems and tends to be cheaper than starting up a large sandboxed stack.

+ +

Record/replay (see Larger Testing) systems  record live backend responses, cache them, and replay them in a hermetic test environment. Record/replay is a powerful tool for reducing test instability, but one  downside is that it leads to brittle tests: it’s difficult to strike a balance between the following:

+ +
+
False positives
+
The test passes when it probably shouldn’t have because we are hitting the cache too much and missing problems that would surface when capturing a new response.
+
False negatives
+
The test fails when it probably shouldn’t have because we are hitting the cache too little. This requires responses to be updated, which can take a long time and lead to test failures that must be fixed, many of which might not be actual problems. This process is often submit-blocking, which is not ideal.
+
+ +

Ideally, a record/replay system should detect only problematic changes and cache-miss only when a request has changed in a meaningful way. In the event that that change causes a problem, the code change author would rerun the test with an updated response, see that the test is still failing, and thereby be alerted to the problem. In practice, knowing when a request has changed in a meaningful way can be incredibly difficult in a large and ever-changing system.

+ + + +

As we’ve seen in this section, hermetic testing can both reduce instability in larger-scoped tests and help isolate failures—addressing two of the significant CI challenges we identified in the previous section. However, hermetic backends can also be more expensive because they use more resources and are slower to set up. Many teams use combinations of hermetic and live backends in their test environments. 

+
+
+ +
+

CI at Google

+ +

Now let’s look in more detail at how CI is implemented at Google.  First, we’ll look at our global continuous build, TAP, used by the vast majority of teams at Google, and how it enables some of the practices and addresses some of the challenges that we looked at in the previous section. We’ll also look at one application, Google Takeout, and how a CI transformation helped it scale both as a platform and as a service.

+ + + +
+

CI Case Study: Google Takeout

+ +

Google Takeout started out as a data backup and download product in 2011. Its founders  pioneered the  idea of “data liberationâ€â€”that users should be able to easily take their data with them, in a usable format, wherever they go. They began by integrating Takeout with a handful of Google products themselves, producing archives of users’ photos, contact lists, and so on for download at their request. However, Takeout didn’t stay small for long, growing as both a platform and a service for a wide variety of Google products. As we’ll see, effective CI is central to keeping any large project healthy, but is especially critical when applications rapidly grow.

+ +
+

Scenario #1: Continuously broken dev deploys

+ +

Problem: As Takeout gained a reputation as a powerful Google-wide data fetching, archiving, and download tool, other teams at the company began to turn to it, requesting APIs so that their own applications could provide backup and download functionality, too, including Google Drive (folder downloads are served by Takeout) and Gmail (for ZIP file previews). All in all, Takeout grew from being the backend for just the original Google Takeout product, to providing APIs for at least 10 other Google products, offering a wide range of functionality.

+ +

The team decided to deploy each of the new APIs as a customized instance, using the same original Takeout binaries but configuring them to work a little differently. For example, the environment for Drive bulk downloads has the largest fleet, the most quota reserved for fetching files from the Drive API, and some custom authentication logic to allow non-signed-in users to download public folders.

+ +

Before long, Takeout faced “flag issues.†Flags added for one of the instances would break the others, and their deployments would break when servers could not start up due to configuration incompatibilities. Beyond feature configuration, there was security and ACL configuration, too. For example, the consumer Drive download service should not have access to keys that encrypt enterprise Gmail exports. Configuration quickly became complicated and led to nearly nightly breakages.

+ +

Some efforts were made to detangle and modularize configuration, but the bigger problem this exposed was that when a Takeout engineer wanted to make a code change, it was not practical to manually test that each server started up under each configuration. They didn’t find out about configuration failures until the next day’s deploy. There were unit tests that ran on presubmit and post-submit (by TAP), but those weren’t sufficient to catch these kinds of issues.

+ +
+

What the team did

+ +

The team created temporary, sandboxed mini-environments for each of these instances that ran on presubmit and tested that all servers were healthy on startup. Running the temporary environments on presubmit prevented 95% of broken servers from bad configuration and reduced nightly deployment failures by 50%.

+ +

Although these new sandboxed presubmit tests dramatically reduced deployment failures, they didn’t remove them entirely. In particular, Takeout’s end-to-end tests would still frequently break the deploy, and these tests were difficult to run on presubmit (because they use test accounts, which still behave like real accounts in some respects and are subject to the same security and privacy safeguards). Redesigning them to be presubmit friendly would have been too big an undertaking.

+ +

If the team couldn’t run end-to-end tests in presubmit, when could it run them? It wanted to get end-to-end test results more quickly than the next day’s dev deploy and decided every two hours was a good starting point. But the team didn’t want to do a full dev deploy this often—this would incur overhead and disrupt long-running processes that engineers were testing in dev. Making a new shared test environment for these tests also seemed like too much overhead to provision resources for, plus culprit finding (i.e., finding the deployment that led to a failure) could involve some undesirable manual work.

+ +

So, the team reused the sandboxed environments from presubmit, easily extending them to a new post-submit environment. Unlike presubmit, post-submit was compliant with security safeguards to use the test accounts (for one, because the code has been approved), so the end-to-end tests could be run there. The post-submit CI runs every two hours, grabbing the latest code and configuration from green head, creates an RC, and runs the same end-to-end test suite against it that is already run in dev.

+
+ +
+

Lesson learned

+ +

Faster feedback loops prevent problems in dev deploys:

+ +
    +
  • +

    Moving tests for different Takeout products from “after nightly deploy†to presubmit prevented 95% of broken servers from bad configuration and reduced nightly deployment failures by 50%.

    +
  • +
  • +

    Though end-to-end tests couldn’t be moved all the way to presubmit, they were still moved from “after nightly deploy†to “post-submit within two hours.†This effectively cut the “culprit set†by 12 times.

    +
  • +
+
+
+ +
+

Scenario #2: Indecipherable test logs

+ +

Problem: As Takeout incorporated more Google products, it grew into a mature platform that allowed product teams to insert plug-ins, with product-specific data-fetching code, directly into Takeout's binary. For example, the Google Photos plug-in knows how to fetch photos, album metadata, and the like. Takeout expanded from its original “handful†of products to now integrate with more than 90.

+ +

Takeout’s end-to-end tests dumped its failures to a log, and this approach didn’t scale to 90 product plug-ins. As more products integrated, more failures were introduced. Even though the team was running the tests earlier and more often with the addition of the post-submit CI, multiple failures would still pile up inside and were easy to miss. Going through these logs became a frustrating time sink, and the tests were almost always failing.

+ +
+

What the team did

+ +

The team refactored the tests into a dynamic, configuration-based suite (using a parameterized test runner) that reported results in a friendlier UI, clearly showing individual test results as green or red: no more digging through logs. They also made failures much easier to debug, most notably, by displaying failure information, with links to logs, directly in the error message. For example, if Takeout failed to fetch a file from Gmail, the test would dynamically construct a link that searched for that file’s ID in the Takeout logs and include it in the test failure message. This automated much of the debugging process for product plug-in engineers and required less of the Takeout team’s assistance in sending them logs, as demonstrated in Figure 23-3.

+ +
The team’s involvement in debugging client features +
Figure 23-3. The team’s involvement in debugging client failures
+
+
+ +
+

Lesson learned

+ +

Accessible, actionable feedback from CI reduces test failures and improves productivity. These initiatives reduced the Takeout team’s involvement in debugging client (product plug-in) test failures by 35%.

+
+
+ +
+

Scenario #3: Debugging “all of Googleâ€

+ +

Problem: An interesting side effect of the Takeout CI that the team did not anticipate was that, because it verified the output of 90-some odd end-user–facing products, in the form of an archive, they were basically testing “all of Google†and catching issues that had nothing to do with Takeout. This was a good thing—Takeout was able to help contribute to the quality of Google’s products overall. However, this introduced a problem for their CI processes: they needed better failure isolation so that they could determine which problems were in their build (which were the minority) and which lay in loosely coupled microservices behind the product APIs they called.

+ +
+

What the team did

+ +

The team’s solution was to run the exact same test suite continuously against production as it already did in its post-submit CI. This was cheap to implement and allowed the team to isolate which failures were new in its build and which were in production; for instance, the result of a microservice release somewhere else “in Google.â€

+
+ +
+

Lesson learned

+ +

Running the same test suite against prod and a post-submit CI (with newly built binaries, but the same live backends) is a cheap way to isolate failures.

+
+ +
+

Remaining challenge

+ +

Going forward, the burden of testing “all of Google†(obviously, this is an exaggeration, as most product problems are caught by their respective teams) grows as Takeout integrates with more products and as those products become more complex. Manual comparisons between this CI and prod are an expensive use of the Build Cop’s time.

+
+ +
+

Future improvement

+ +

This presents an interesting opportunity to try hermetic testing with record/replay in Takeout’s post-submit CI. In theory, this would eliminate failures from backend product APIs surfacing in Takeout’s CI, which would make the suite more stable and effective at catching failures in the last two hours of Takeout changes—which is its intended purpose.

+
+
+ +
+

Scenario #4: Keeping it green

+ +

Problem: As the platform supported more product plug-ins, which each included end-to-end tests, these tests would fail and the end-to-end test suites were nearly always broken. The failures could not all be immediately fixed. Many were due to bugs in product plug-in binaries, which the Takeout team had no control over. And some failures mattered more than others—low-priority bugs and bugs in the test code did not need to block a release, whereas higher-priority bugs did. The team could easily disable tests by commenting them out, but that would make the failures too easy to forget about.

+ +

One common source of failures: tests would break when product plug-ins were rolling out a feature. For example, a playlist-fetching feature for the YouTube plug-in might be enabled for testing in dev for a few months before being enabled in prod. The Takeout tests only knew about one result to check, so that often resulted in the test needing to be disabled in particular environments and manually curated as the feature rolled out.

+ +
+

What the team did

+ +

The team came up with a strategic way to disable failing tests by tagging them with an associated bug and filing that off to the responsible team (usually a product plug-in team). When a failing test was tagged with a bug, the team’s testing framework would suppress its failure. This allowed the test suite to stay green and still provide confidence that everything else, besides the known issues, was passing, as illustrated in Figure 23-4.

+ +
Achieving greenness through (responsible) test disablement +
Figure 23-4. Achieving greenness through (responsible) test disablement
+
+ +

For the rollout problem, the team added capability for plug-in engineers to specify the name of a feature flag, or ID of a code change, that enabled a particular feature along with the output to expect both with and without the feature. The tests were equipped to query the test environment to determine whether the given feature was enabled there and verified the expected output accordingly.

+ +

When bug tags from disabled tests began to accumulate and were not updated, the team automated their cleanup. The tests would now check whether a bug was closed by querying our bug system’s API. If a tagged-failing test actually passed and was passing for longer than a configured time limit, the test would prompt to clean up the tag (and mark the bug fixed, if it wasn’t already). There was one exception for this strategy: flaky tests. For these, the team would allow a test to be tagged as flaky, and the system wouldn’t prompt a tagged “flaky†failure for cleanup if it passed.

+ +

These changes made a mostly self-maintaining test suite, as illustrated in Figure 23-5.

+ +
Mean time to close bug, after fix submitted +
Figure 23-5. Mean time to close bug, after fix submitted
+
+
+ +
+

Lessons learned

+ +

Disabling failing tests that can’t be immediately fixed is a practical approach to keeping your suite green, which gives confidence that you’re aware of all test failures. Also, automating the test suite’s maintenance, including rollout management and updating tracking bugs for fixed tests, keeps the suite clean and prevents technical debt. In DevOps parlance, we could call the metric in Figure 23-5 MTTCU: mean time to clean up.

+
+ +
+

Future improvement

+ +

Automating the filing and tagging of bugs would be a helpful next step. This is still a manual and burdensome process. As mentioned earlier, some of our larger teams already do this.

+
+ +
+

Further challenges

+ +

The scenarios we’ve described are far from the only CI challenges faced by Takeout, and there are still more problems to solve. For example, we mentioned the difficulty of isolating failures from upstream services in CI Challenges. This is a problem that Takeout still faces with rare breakages originating with upstream services, such as when a security update in the streaming infrastructure used by Takeout’s “Drive folder downloads†API broke archive decryption when it deployed to production. The upstream services are staged and tested themselves, but there is no simple way to automatically check with CI if they are compatible with Takeout after they're launched into production. An initial solution involved creating an “upstream staging†CI environment to test production Takeout binaries against the staged versions of their upstream dependencies. However, this proved difficult to maintain, with additional compatibility issues between staging and production versions.  

+
+
+
+ +
+

But I Can’t Afford CI

+ +

You might be thinking that’s all well and good, but you have neither the time nor money to build any of this. We certainly acknowledge that Google might have more resources to implement CI than the typical startup does. Yet many of our products have grown so quickly that they didn’t have time to develop a CI system either (at least not an adequate one).

+ +

In your own products and organizations, try and think of the cost you are already paying for problems discovered and dealt with in production. These negatively affect the end user or client, of course, but they also affect the team. Frequent production fire-fighting is stressful and demoralizing. Although building out CI systems is expensive, it’s not necessarily a new cost as much as a cost shifted left to an earlier—and more preferable—stage, reducing the incidence, and thus the cost, of problems occurring too far to the right. CI leads to a more stable product and happier developer culture in which engineers feel more confident that “the system†will catch problems, and they can focus more on features and less on fixing.  

+
+
+ +
+

Conclusion

+ +

Even though we’ve described our CI processes and some of how we’ve automated them, none of this is to say that we have developed perfect CI systems. After all, a CI system itself is just software and is never complete and should be adjusted to meet the evolving demands of the application and engineers it is meant to serve. We’ve tried to illustrate this with the evolution of Takeout’s CI and the future areas of improvement we point out.

+
+ +
+

TL;DRs

+ +
    +
  • +

    A CI system decides what tests to use, and when.

    +
  • +
  • +

    CI systems become progressively more necessary as your codebase ages and grows in scale.

    +
  • +
  • +

    CI should optimize quicker, more reliable tests on presubmit and slower, less deterministic tests on post-submit.

    +
  • +
  • +

    Accessible, actionable feedback allows a CI system to become  more efficient.

    +
  • +
+
+

1https://www.martinfowler.com/articles/continuousIntegration.html

2Forsgren, Nicole, et al. (2018). Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations. IT Revolution.

3This is also sometimes called “shifting left on testing.â€

4Head is the latest versioned code in our monorepo. In other workflows, this is also referred to as master, mainline, or trunk. Correspondingly, integrating at head is also known as trunk-based development.

5At Google, release automation is managed by a separate system from TAP. We won’t focus on how release automation assembles RCs, but if you’re interested, we do refer you to Site Reliability Engineering (O'Reilly) in which our release automation technology (a system called Rapid) is discussed in detail.

6CD with experiments and feature flags is discussed further in Continuous Delivery.

7We call these “mid-air collisions†because the probability of it occurring is extremely low; however, when this does happen, the results can be quite surprising.

8Each team at Google configures a subset of its project’s tests to run on presubmit (versus post-submit). In reality, our continuous build actually optimizes some presubmit tests to be saved for post-submit, behind the scenes. We'll further discuss this later on in this chapter.

9Aiming for 100% uptime is the wrong target. Pick something like 99.9% or 99.999% as a business or product trade-off, define and monitor your actual uptime, and use that “budget†as an input to how aggressively you’re willing to push risky releases.

10We believe CI is actually critical to the software engineering ecosystem: a must-have, not a luxury. But that is not universally understood yet.

11In practice, it’s often difficult to make a completely sandboxed test environment, but the desired stability can be achieved by minimizing outside dependencies.

12Any change to Google’s codebase can be rolled back with two clicks!

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch24.html b/clones/abseil.io/resources/swe-book/html/ch24.html new file mode 100644 index 00000000..853f5e3f --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch24.html @@ -0,0 +1,199 @@ + + + + + Software Engineering at Google + + + + +
+

Continuous Delivery

+ + + + + +

Given how quickly and  unpredictably the technology landscape shifts, the competitive advantage for any product lies in its ability to quickly go to market. An organization’s velocity is a critical factor in its ability to compete with other players, maintain product and service quality, or adapt to new regulation. This velocity is bottlenecked by the time to deployment. Deployment doesn’t just happen once at initial launch. There is a saying among educators that no lesson plan survives its first contact with the student body. In much the same way, no software is perfect at first launch, and the only guarantee is that you’ll have to update it. Quickly. 

+ +

The long-term life cycle of a software product involves rapid exploration of new ideas, rapid responses to landscape shifts or user issues, and enabling developer velocity at scale. From Eric Raymond’s The Cathedral and the Bazaar to Eric Reis’ The Lean Startup, the key to any organization’s long-term success has always been in its ability to get ideas executed and into users’ hands as quickly as possible and reacting quickly to their feedback. Martin Fowler, in his book Continuous Delivery (aka CD), points out that “The biggest risk to any software effort is that you end up building something that isn’t useful. The earlier and more frequently you get working software in front of real users, the quicker you get feedback to find out how valuable it really is.â€

+ +

Work that stays in progress for a long time before delivering user value is high risk and high cost, and can even be a drain on morale. At Google, we strive to release early and often, or “launch and iterate,†to enable teams to see the impact of their work quickly and to adapt faster to a shifting market. The value of code is not realized at the time of submission but when features are available to your users. Reducing the time between “code complete†and user feedback minimizes the cost of work that is in progress.

+ +
+

You get extraordinary outcomes by realizing that the launch never lands but that it begins a learning cycle where you then fix the next most important thing, measure how it went, fix the next thing, etc.—and it is never complete.

+ +

—David Weekly, Former Google product manager

+
+ +

At Google, the practices we describe in this book allow hundreds (or in some cases thousands) of engineers to quickly troubleshoot problems, to independently work on new features without worrying about the release, and to understand the effectiveness of new features through A/B experimentation. This chapter focuses on the key levers of rapid innovation, including managing risk, enabling developer velocity at scale, and understanding the cost and value trade-off of each feature you launch.

+ +
+

Idioms of Continuous Delivery at Google

+ +

A core tenet of Continuous Delivery (CD) as well as  of Agile methodology is that over time, smaller batches of changes result in higher quality; in other words, faster is safer. This can seem deeply controversial to teams at first glance, especially if the prerequisites for setting up CD—for example, Continuous Integration (CI) and testing—are not yet in place. Because it might take a while for all teams to realize the ideal of CD, we focus on developing various aspects that deliver value independently en route to the end goal. Here are some of these:

+ +
+
Agility
+
Release frequently and in small batches
+
Automation
+
Reduce or remove repetitive overhead of frequent releases
+
Isolation
+
Strive for modular architecture to isolate changes and make troubleshooting easier
+
Reliability
+
Measure key health indicators like crashes or latency and keep improving them
+
Data-driven decision making
+
Use A/B testing on health metrics to ensure quality
+
Phased rollout
+
Roll out changes to a few users before shipping to everyone
+
+ +

At first, releasing new versions of software frequently might seem risky. As your userbase grows, you might fear the backlash from angry users if there are any bugs that you didn’t catch in testing, and you might quite simply have too much new code in your product to test exhaustively. But this is precisely where CD can help. Ideally, there are so few changes between one release and the next that troubleshooting issues is trivial. In the limit, with CD, every change goes through the QA pipeline and is automatically deployed into production. This is often not a practical reality for many teams, and so there is often work of culture change toward CD as an intermediate step, during which teams can build their readiness to deploy at any time without actually doing so, building up their confidence to release more frequently in the future.

+
+ +
+

Velocity Is a Team Sport: How to Break Up a Deployment into Manageable Pieces

+ +

When a team is small, changes  come into a codebase at a certain rate.   We’ve seen an antipattern emerge as a team grows over time or splits into subteams: a subteam branches off its code to avoid stepping on anyone’s feet, but then struggles, later, with integration and culprit finding. At Google, we prefer that teams continue to develop at head in the shared codebase and set up CI testing, automatic rollbacks, and culprit finding to identify issues quickly. This is discussed at length in Continuous Integration.

+ +

One of our codebases, YouTube, is a large, monolithic Python application. The release process is laborious, with Build Cops, release managers, and other volunteers. Almost every release has multiple cherry-picked changes and respins. There is also a 50-hour manual regression testing cycle run by a remote QA team on every release. When the operational cost of a release is this high, a cycle begins to develop in which you wait to push out your release until you’re able to test it a bit more. Meanwhile, someone wants to add just one more feature that’s almost ready, and pretty soon you have yourself a release process that’s laborious, error prone, and slow. Worst of all, the experts who did the release last time are burned out and have left the team, and now nobody even knows how to troubleshoot those strange crashes that happen when you try to release an update, leaving you panicky at the very thought of pushing that button.

+ +

If your releases are costly and sometimes risky, the instinct is to slow down your release cadence and increase your stability period. However, this only provides short-term stability gains, and over time it slows velocity and frustrates teams and users. The answer is to reduce cost, increase discipline, and make the risks more incremental, but it is critical to resist the obvious operational fixes and invest in long-term architectural changes. The obvious operational fixes to this problem lead to a few traditional approaches: reverting to a traditional planning model that leaves little room for learning or iteration, adding more governance and oversight to the development process, and implementing risk reviews or rewarding low-risk (and often low-value) features.

+ +

The investment with the best return, though, is migrating to a microservice architecture, which can empower a large product team with the ability to remain scrappy and innovative while simultaneously reducing risk. In some cases, at Google, the answer has been to rewrite an application from scratch rather than simply migrating it, establishing the desired modularity into the new architecture. Although either of these options can take months and is likely painful in the short term, the value gained in terms of operational cost and cognitive simplicity will pay off over an application’s lifespan of years.

+
+ +
+

Evaluating Changes in Isolation: Flag-Guarding Features

+ +

A key to reliable continuous  releases is to make sure engineers "flag guard" all changes. As  a product grows, there will be multiple features under various stages of development coexisting in a binary. Flag guarding can be used to control the inclusion or expression of feature code in the product on a feature-by-feature basis and can be expressed differently for release and development builds. A feature flag disabled for a build should allow build tools to strip the feature from the build if the language permits it. For instance, a stable feature that has already shipped to customers might be enabled for both development and release builds. A feature under development might be enabled only for development, protecting users from an unfinished feature. New feature code lives in the binary alongside the old codepath—both can run, but the new code is guarded by a flag. If the new code works, you can remove the old codepath and launch the feature fully in a subsequent release. If there’s a problem, the flag value can be updated independently from the binary release via a dynamic config update.

+ +

In the old world of binary releases, we had to time press releases closely with our binary rollouts. We had to have a successful rollout before a press release about new functionality or a new feature could be issued. This meant that the feature would be out in the wild before it was announced, and the risk of it being discovered ahead of time was very real.

+ +

This is where the beauty of the flag guard comes to play. If the new code has a flag, the flag can be updated to turn your feature on immediately before the press release, thus minimizing the risk of leaking a feature. Note that flag-guarded code is not a perfect safety net for truly sensitive features. Code can still be scraped and analyzed if it’s not well obfuscated, and not all features can be hidden behind flags without adding a lot of complexity. Moreover, even flag configuration changes must be rolled out with care. Turning on a flag for 100% of your users all at once is not a great idea, so a configuration service that manages safe configuration rollouts is a good investment. Nevertheless, the level of control and the ability to decouple the destiny of a particular feature from the overall product release are powerful levers for long-term sustainability of the application.

+
+ +
+

Striving for Agility: Setting Up a Release Train

+ +

Google’s Search binary is its first and oldest. Large and complicated, its codebase can be  tied back to  Google’s origin—a search through our codebase can still find code written at least as far back as 2003, often earlier. When smartphones began to take off, feature after mobile feature was shoehorned into a hairball of code written primarily for server deployment. Even though the Search experience was becoming more vibrant and interactive, deploying a viable build became more and more difficult. At one point, we were releasing the Search binary into production only once per week, and even hitting that target was rare and often based on luck.

+ +

When one of our contributing authors, Sheri Shipe, took on the project of increasing our release velocity in Search, each release cycle was taking a group of engineers days to complete. They built the binary, integrated data, and then began testing. Each bug had to be manually triaged to make sure it wouldn’t impact Search quality, the user experience (UX), and/or revenue. This process was grueling and time consuming and did not scale to the volume or rate of change. As a result, a developer could never know when their feature was going to be released into production. This made timing press releases and public launches challenging.

+ +

Releases don’t happen in a vacuum, and having reliable releases makes the dependent factors easier to synchronize. Over the course of several years, a dedicated group of engineers implemented a continuous release process, which streamlined everything about sending a Search binary into the world. We automated what we could, set deadlines for submitting features, and simplified the integration of plug-ins and data into the binary. We could now consistently release a new Search binary into production every other day.

+ +

What were the trade-offs we made to get predictability in our release cycle? They narrow down to two main ideas we baked into the system.

+ +
+

No Binary Is Perfect

+ +

The first is that no binary is perfect, especially for builds  that are incorporating the work of tens or hundreds of developers independently developing dozens of major features.  Even though it’s impossible to fix every bug, we constantly need to weigh questions such as: If a line has been moved two pixels to the left, will it affect an ad display and potential revenue? What if the shade of a box has been altered slightly? Will it make it difficult for visually impaired users to read the text? The rest of this book is arguably about minimizing the set of unintended outcomes for a release, but in the end we must admit that software is fundamentally complex. There is no perfect binary—decisions and trade-offs have to be made every time a new change is released into production. Key performance indicator metrics with clear thresholds allow features to launch even if they aren’t perfect1 and can also create clarity in otherwise contentious launch decisions.

+ +

One bug involved a rare dialect spoken on only one island in the Philippines. If a user asked a search question in this dialect, instead of an answer to their question, they would get a blank web page. We had to determine whether the cost of fixing this bug was worth delaying the release of a major new feature.

+ +

We ran from office to office trying to determine how many people actually spoke this language, if it happened every time a user searched in this language, and whether these folks even used Google on a regular basis. Every quality engineer we spoke with deferred us to a more senior person. Finally, data in hand, we put the question to Search’s senior vice president. Should we delay a critical release to fix a bug that affected only a very small Philippine island? It turns out that no matter how small your island, you should get reliable and accurate search results: we delayed the release and fixed the bug.

+
+ +
+

Meet Your Release Deadline

+ +

The second idea is that if you’re late for the release train, it will leave without you. There’s something to  be said for the adage, "deadlines are certain, life is not." At some point in the release timeline, you must put a stake in the ground and turn away developers and their new features. Generally speaking, no amount of pleading or begging will get a feature into today’s release after the deadline has passed.

+ +

There is the rare exception. The situation usually goes like this. It’s late Friday evening and six software engineers come storming into the release manager’s cube in a panic. They have a contract with the NBA and finished the feature moments ago. But it must go live before the big game tomorrow. The release must stop and we must cherry-pick the feature into the binary or we’ll be in breach of contract! A bleary-eyed release engineer shakes their head and says it will take four hours to cut and test a new binary. It’s their kid’s birthday and they still need to pick up the balloons.

+ +

A world of regular releases means that if a developer misses the release train, they’ll be able to catch the next train in a matter of hours rather than days. This limits developer panic and greatly improves  work–life balance for release engineers. 

+
+
+ +
+

Quality and User-Focus: Ship Only What Gets Used

+ +

Bloat is an unfortunate side effect of most software development life cycles, and the more successful  a product becomes, the  more bloated its code base typically becomes.   One downside of a speedy, efficient release train is that this bloat is often magnified and can manifest in challenges to the product team and even to the users. Especially if the software is delivered to the client, as in the case of mobile apps, this can mean the user’s device pays the cost in terms of space, download, and data costs, even for features they never use, whereas developers pay the cost of slower builds, complex deployments, and rare bugs. In this section, we’ll talk about how dynamic deployments allow you to ship only what is used, forcing necessary trade-offs between user value and feature cost. At Google, this often means staffing dedicated teams to improve the efficiency of the product on an ongoing basis.

+ +

Whereas some products are web-based and run on the cloud, many are client applications that use shared resources on a user’s device—a phone or tablet. This choice in itself showcases a trade-off between native apps that can be more performant and resilient to spotty connectivity, but also more difficult to update and more susceptible to platform-level issues. A common argument against frequent, continuous deployment for native apps is that users dislike frequent updates and must pay for the data cost and the disruption. There might be other limiting factors such as access to a network or a limit to the reboots required to percolate an update.

+ +

Even though there is a trade-off to be made in terms of how frequently to update a product, the goal is to have these choices be intentional. With a smooth, well-running CD process, how often a viable release is created can be separated from how often a user receives it. You might achieve the goal of being able to deploy weekly, daily, or hourly, without actually doing so, and you should intentionally choose release processes in the context of your users’ specific needs and the larger organizational goals, and determine the staffing and tooling model that will best support the long-term sustainability of your product.

+ +

Earlier in the chapter, we talked about keeping your code modular. This allows for dynamic, configurable deployments that allow better utilization of constrained resources, such as the space on a user’s device. In the absence of this practice, every user must receive code they will never use to support translations they don’t need or architectures that were meant for other kinds of devices. Dynamic deployments allow apps to maintain small sizes while only shipping code to a device that brings its users value, and A/B experiments allow for intentional trade-offs between a feature’s cost and its value to users and your business.

+ +

There is an upfront cost to setting up these processes, and identifying and removing frictions that keep the frequency of releases lower than is desirable is a painstaking process. But the long-term wins in terms of risk management, developer velocity, and enabling rapid innovation are so high that these initial costs become worthwhile.

+
+ +
+

Shifting Left: Making Data-Driven Decisions Earlier

+ +

If you’re building for all  users, you might have  clients on  smart screens, speakers, or Android and iOS phones and tablets, and your software may be flexible enough to allow users to customize their experience. Even if you’re building for only Android devices, the sheer diversity of the more than two billion Android devices can make the prospect of qualifying a release overwhelming. And with the pace of innovation, by the time someone reads this chapter, whole new categories of devices might have bloomed.

+ +

One of our release managers shared a piece of wisdom that turned the situation around when he said that the diversity of our client market was not a problem, but a fact. After we accepted that, we could switch our release qualification model in the following ways:

+ +
    +
  • +

    If comprehensive testing is practically infeasible, aim for representative testing instead. 

    +
  • +
  • +

    Staged rollouts to slowly  increasing percentages of the userbase allow for fast fixes.

    +
  • +
  • +

    Automated A/B releases allow for  statistically significant results proving a release’s quality, without tired humans needing to look at dashboards and make decisions.

    +
  • +
+ +

When it comes to developing for Android clients, Google apps use specialized testing tracks and staged rollouts to an increasing percentage of user traffic, carefully monitoring for issues in these channels. Because the Play Store offers unlimited testing tracks, we can also set up a QA team in each country in which we plan to launch, allowing for a global overnight turnaround in testing key features.

+ +

One issue we noticed when doing deployments to Android was that we could expect a statistically significant change in user metrics simply from pushing an update. This meant that even if we made no changes to our product, pushing an update could affect device and user behavior in ways that were difficult to predict. As a result, although canarying the update to a small percentage of user traffic could give us good information about crashes or stability problems, it told us very little about whether the newer version of our app was in fact better than the older one.

+ +

Dan Siroker and Pete Koomen have already discussed the value of A/B testing2 your features, but at Google, some of our larger apps also A/B test their deployments. This means sending out two versions of the product: one that is the desired update, with the baseline being a placebo (your old version just gets shipped again). As the two versions roll out simultaneously to a large enough base of similar users, you can compare one release against the other to see whether the latest version of your software is in fact an improvement over the previous one. With a large enough userbase, you should be able to get statistically significant results within days, or even hours. An automated metrics pipeline can enable the fastest possible release by pushing forward a release to more traffic as soon as there is enough data to know that the guardrail metrics will not be affected.

+ +

Obviously, this method does not apply to every app and can be a lot of overhead when you don’t have a large enough userbase. In these cases, the recommended best practice is to aim for change-neutral releases. All new features are flag guarded so that the only change being tested during a rollout is the stability of the deployment itself.

+
+ +
+

Changing Team Culture: Building Discipline into Deployment

+ +

Although “Always Be Deploying†helps address several issues affecting developer velocity, there are also certain practices that address issues of scale.    The initial team launching a product can be fewer than 10 people, each taking turns at deployment and production-monitoring responsibilities. Over time, your team might grow to hundreds of people, with subteams responsible for specific features. As this happens and the organization scales up, the number of changes in each deployment and the amount of risk in each release attempt is increasing superlinearly. Each release contains months of sweat and tears. Making the release successful becomes a high-touch and labor-intensive effort. Developers can often be caught trying to decide which is worse: abandoning a release that contains a quarter’s worth of new features and bug fixes, or pushing out a release without confidence in its quality.

+ +

At scale, increased complexity usually manifests as increased release latency. Even if you release every day, a release can take a week or longer to fully roll out safely, leaving you a week behind when trying to debug any issues. This is where “Always Be Deploying†can return a development project to effective form. Frequent release trains allow for minimal divergence from a known good position, with the recency of changes aiding in resolving issues. But how can a team ensure that the complexity inherent with a large and quickly expanding codebase doesn’t weigh down progress?

+ +

On Google Maps, we take the perspective that features are very important, but only very seldom is any feature so important that a release should be held for it. If releases are frequent, the pain a feature feels for missing a release is small in comparison to the pain all the new features in a release feel for a delay, and especially the pain users can feel if a not-quite-ready feature is rushed to be included.

+ +

One release responsibility is to protect the product from the developers.

+ +

When making trade-offs, the passion and urgency a developer feels about launching a new feature can never trump the user experience with an existing product. This means that new features must be isolated from other components via interfaces with strong contracts, separation of concerns, rigorous testing, communication early and often, and conventions for new feature acceptance.

+
+ +
+

Conclusion

+ +

Over the years and across all of our software products, we’ve found that, counterintuitively, faster is safer. The health of your product and the speed of development are not actually in opposition to each other, and products that release more frequently and in small batches have better quality outcomes. They adapt faster to bugs encountered in the wild and to unexpected market shifts. Not only that, faster is cheaper, because having a predictable, frequent release train forces you to drive down the cost of each release and makes the cost of any abandoned release very low.

+ +

Simply having the structures in place that enable continuous deployment generates the majority of the value, even if you don’t actually push those releases out to users. What do we mean? We don’t actually release a wildly different version of Search, Maps, or YouTube every day, but to be able to do so requires a robust, well-documented continuous deployment process, accurate and real-time metrics on user satisfaction and product health, and a coordinated team with clear policies on what makes it in or out and why. In practice, getting this right often also requires binaries that can be configured in production, configuration managed like code (in version control), and a toolchain that allows safety measures like dry-run verification, rollback/rollforward mechanisms, and reliable patching.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Velocity is a team sport: The optimal workflow for a large team that develops code collaboratively requires modularity of architecture and near-continuous integration.

    +
  • +
  • +

    Evaluate changes in isolation: Flag guard any features to be able to isolate problems early.

    +
  • +
  • +

    Make reality your benchmark: Use a staged rollout to address device diversity and the breadth of the userbase. Release qualification in a synthetic environment that isn’t similar to the production environment can lead to late surprises.

    +
  • +
  • +

    Ship only what gets used: Monitor the cost and value of any feature in the wild to know whether it’s still relevant and delivering sufficient user value.

    +
  • +
  • +

    Shift left: Enable faster, more data-driven decision making earlier on all changes through CI and continuous deployment.

    +
  • +
  • +

    Faster is safer: Ship early and often and in small batches to reduce the risk of each release and to minimize time to market. 

    +
  • +
+
+

1Remember the SRE “error-budget†formulation: perfection is rarely the best goal. Understand how much room for error is acceptable and how much of that budget has been spent recently and use that to adjust the trade-off between velocity and stability.

2Dan Siroker and Pete Koomen, A/B Testing: The Most Powerful Way to Turn Clicks Into Customers (Hoboken: Wiley, 2013).

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch25.html b/clones/abseil.io/resources/swe-book/html/ch25.html new file mode 100644 index 00000000..819674a0 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch25.html @@ -0,0 +1,499 @@ + + + + + Software Engineering at Google + + + + +
+

Compute as a Service

+ + + + + +
+

I don’t try to understand computers. I try to understand the programs.

+ +

Barbara Liskov

+
+ +

After doing the hard work of writing  code, you need some hardware to run it. Thus, you go to buy or rent that hardware. This, in essence, is Compute as a Service (CaaS), in which “Compute†is shorthand for the computing power needed to actually run your programs.

+ +

This chapter is about how this simple concept—just give me the hardware to run my stuff1—maps into a system that will survive and scale as your organization evolves and grows. It is somewhat long because the topic is complex, and divided into four sections:

+ +
    +
  • +

    Taming the Compute Environment covers how Google arrived at its solution for this problem and explains some of the key concepts of CaaS.

    +
  • +
  • +

    Writing Software for Managed Compute shows how a managed compute solution affects how engineers write software. We believe that the “cattle, not petsâ€/flexible scheduling model has been fundamental to Google’s success in the past 15 years and is an important tool in a software engineer’s toolbox.

    +
  • +
  • +

    CaaS Over Time and Scale goes deeper into a few lessons Google learned about how various choices about a compute architecture play out as the organization grows and evolves.

    +
  • +
  • +

    Finally, Choosing a Compute Service is dedicated primarily to those engineers who will make a decision about what compute service to use in their organization.

    +
  • +
+ +
+

Taming the Compute Environment

+ +

Google’s internal Borg system2 was a precursor for many of today’s CaaS architectures (like Kubernetes or Mesos).  To better understand how the particular aspects of such a service answer the needs of a growing and evolving organization, we’ll trace the evolution of Borg and the efforts of Google engineers to tame the compute environment.

+ +
+

Automation of Toil

+ +

Imagine  being a student at the university around the turn of the century.  If you wanted to deploy some new, beautiful code, you’d SFTP the code onto one of the machines in the university’s computer lab, SSH into the machine, compile and run the code. This is a tempting solution in its simplicity, but it runs into considerable issues over time and at scale. However, because that’s roughly what many projects begin with, multiple organizations end up with processes that are somewhat streamlined evolutions of this system, at least for some tasks—the number of machines grows (so you SFTP and SSH into many of them), but the underlying technology remains. For example, in 2002, Jeff Dean, one of Google’s most senior engineers, wrote the following about running an automated data-processing task as a part of the release process:

+ +
+

[Running the task] is a logistical, time-consuming nightmare. It currently requires getting a list of 50+ machines, starting up a process on each of these 50+ machines, and monitoring its progress on each of the 50+ machines. There is no support for automatically migrating the computation to another machine if one of the machines dies, and monitoring the progress of the jobs is done in an ad hoc manner [...] Furthermore, since processes can interfere with each other, there is a complicated, human-implemented “sign up†file to throttle the use of machines, which results in less-than-optimal scheduling, and increased contention for the scarce machine resources

+
+ +

This was an early trigger in Google’s efforts to tame the compute environment, which explains well how the naive solution becomes unmaintainable at larger scale.

+ +
+

Simple automations

+ +

There are simple things that an  organization can do to mitigate some of the pain. The process of deploying a binary onto each of the 50+ machines and starting it there can easily be automated through a shell script, and then—if this is to be a reusable solution—through a more robust piece of code in an easier-to-maintain language that will perform the deployment in parallel (especially since the “50+†is likely to grow over time).

+ +

More interestingly, the monitoring of each machine can also be automated. Initially, the person in charge of the process would like to know (and be able to intervene) if something went wrong with one of the replicas. This means exporting some monitoring metrics (like “the process is alive†and “number of documents processedâ€) from the process—by having it write to a shared storage, or call out to a monitoring service, where they can see anomalies at a glance. Current open source solutions in that space are, for instance, setting up a dashboard in a monitoring tool like Graphana or Prometheus.

+ +

If an anomaly is detected, the usual mitigation strategy is to SSH into the machine, kill the process (if it’s still alive), and start it again. This is tedious, possibly error prone (be sure you connect to the right machine, and be sure to kill the right process), and could be automated:

+ +
    +
  • +

    Instead of manually monitoring for failures, one can use an agent on the machine that detects anomalies (like “the process did not report it’s alive for the past five minutes†or “the process did not process any documents over the past 10 minutesâ€), and kills the process if an anomaly is detected.

    +
  • +
  • +

    Instead of logging in to the machine to start the process again after death, it might be enough to wrap the whole execution in a “while true; do run && break; done†shell script.

    +
  • +
+ +

The cloud world equivalent is setting an autohealing policy (to kill and re-create a VM or container after it fails a health check).

+ +

These relatively simple improvements address a part of Jeff Dean’s problem described earlier, but not all of it; human-implemented throttling, and moving to a new machine, require more involved solutions.

+
+ +
+

Automated scheduling

+ +

The natural next step is to automate machine assignment.   This requires the first real “service†that will eventually grow into “Compute as a Service.†That is, to automate scheduling, we need a central service that knows the complete list of machines available to it and can—on demand—pick a number of unoccupied machines and automatically deploy your binary to those machines. This eliminates the need for a hand-maintained “sign-up†file, instead delegating the maintenance of the list of machines to computers. This system is strongly reminiscent of earlier time-sharing architectures.

+ +

A natural extension of this idea is to combine this scheduling with reaction to machine failure. By scanning machine logs for expressions that signal bad health (e.g., mass disk read errors), we can identify machines that are broken, signal (to humans) the need to repair such machines, and avoid scheduling any work onto those machines in the meantime. Extending the elimination of toil further, automation can try some fixes first before involving a human, like rebooting the machine, with the hope that whatever was wrong goes away, or running an automated disk scan.

+ +

One last complaint from Jeff’s quote is the need for a human to migrate the computation to another machine if the machine it’s running on breaks. The solution here is simple: because we already have scheduling automation and the capability to detect that a machine is broken, we can simply have the scheduler allocate a new machine and restart the work on this new machine, abandoning the old one. The signal to do this might come from the machine introspection daemon or from monitoring of the individual process.

+ +

All of these improvements systematically deal with the growing scale of the organization. When the fleet was a single machine, SFTP and SSH were perfect solutions, but at the scale of hundreds or thousands of machines, automation needs to take over. The quote we started from came from a 2002 design document for the “Global WorkQueue,†an early CaaS internal solution for some workloads at Google.  

+
+
+ +
+

Containerization and Multitenancy

+ +

So far, we implicitly assumed a one-to-one mapping between machines and the programs running on them.   This is highly inefficient in terms of computing resource (RAM, CPU) consumption, in many ways:

+ +
    +
  • +

    It’s very likely to have many more different types of jobs (with different resource requirements) than types of machines (with different resource availability), so many jobs will need to use the same machine type (which will need to be provisioned for the largest of them).

    +
  • +
  • +

    Machines take a long time to deploy, whereas program resource needs grow over time. If obtaining new, larger machines takes your organization months, you need to also make them large enough to accommodate expected growth of resource needs over the time needed to provision new ones, which leads to waste, as new machines are not utilized to their full capacity.3

    +
  • +
  • +

    Even when the new machines arrive, you still have the old ones (and it’s likely wasteful to throw them away), and so you must manage a heterogeneous fleet that does not adapt itself to your needs.

    +
  • +
+ +

The natural solution is to specify, for each program, its resource requirements (in terms of CPU, RAM, disk space), and then ask the scheduler to bin-pack replicas of the program onto the available pool of machines.

+ +
+

My neighbor’s dog barks in my RAM

+ +

The aforementioned solution works perfectly if everybody plays nicely. However, if I specify in my configuration that each replica of my data-processing pipeline will consume one CPU and 200 MB of RAM, and then—due to a bug, or organic growth—it starts consuming more, the machines it gets scheduled onto will run out of resources. In the CPU case, this will cause neighboring serving jobs to experience latency blips; in the RAM case, it will either cause out-of-memory kills by the kernel or horrible latency due to disk swap.4

+ +

Two programs on the same computer can interact badly in other ways as well. Many programs will want their dependencies installed on a machine, in some specific version—and these might collide with the version requirements of some other program. A program might expect certain system-wide resources (think about /tmp) to be available for its own exclusive use. Security is an issue—a program might be handling sensitive data and needs to be sure that other programs on the same machine cannot access it. 

+ +

Thus, a multitenant compute service must provide a degree of isolation, a guarantee of some sort that a process will be able to safely proceed without being disturbed by the other tenants of the machine.

+ +

A classical solution to isolation is the use of virtual machines (VMs).  These, however, come with significant overhead5 in terms of resource usage (they need the resources to run a full operating system inside) and startup time (again, they need to boot up a full operating system). This makes them a less-than-perfect solution for batch job containerization for which small resource footprints and short runtimes are expected. This led Google’s engineers designing Borg in 2003 to look to different solutions, ending up with containers—a lightweight mechanism based on cgroups (contributed by Google engineers into the Linux kernel in 2007) and chroot jails, bind mounts and/or union/overlay filesystems for filesystem isolation. Open source container implementations include Docker and LMCTFY.

+ +

Over time and with the evolution of the organization, more and more potential isolation failures are discovered. To give a specific example, in 2011, engineers working on Borg discovered that the exhaustion of the process ID space (which was set by default to 32,000 PIDs) was becoming an isolation failure, and limits on the total number of processes/threads a single replica can spawn had to be introduced. We look at this example in more detail later in this chapter.

+
+ +
+

Rightsizing and autoscaling

+ +

The Borg of 2006 scheduled work based on the  parameters provided by the engineer in the configuration, such as the number of replicas and the resource requirements.  

+ +

Looking at the problem from a distance, the idea of asking humans to determine the resource requirement numbers is somewhat flawed: these are not numbers that humans interact with daily. And so, these configuration parameters become themselves, over time, a source of inefficiency. Engineers need to spend time determining them upon initial service launch, and as your organization accumulates more and more services, the cost to determine them scales up. Moreover, as time passes, the program evolves (likely grows), but the configuration parameters do not keep up. This ends in an outage—where it turns out that over time the new releases had resource requirements that ate into the slack left for unexpected spikes or outages, and when such a spike or outage actually occurs, the slack remaining turns out to be insufficient.

+ +

The natural solution is to automate the setting of these parameters. Unfortunately, this proves surprisingly tricky to do well. As an example, Google has only recently reached a point at which more than half of the resource usage over the whole Borg fleet is determined by rightsizing automation. That said, even though it is only half of the usage, it is a larger fraction of configurations, which means that the majority of engineers do not need to concern themselves with the tedious and error-prone burden of sizing their containers. We view this as a successful application of the idea that “easy things should be easy, and complex things should be possibleâ€â€”just because some fraction of Borg workloads is too complex to be properly managed by rightsizing doesn’t mean there isn’t great value in handling the easy cases.   

+
+
+ +
+

Summary

+ +

As your organization grows and your products become more popular, you will grow in all of these axes:

+ +
    +
  • +

    Number of different applications to be managed

    +
  • +
  • +

    Number of copies of an application that needs to run

    +
  • +
  • +

    The size of the largest application

    +
  • +
+ +

To effectively manage scale, automation is needed that will enable you to address all these growth axes. You should, over time, expect the automation itself to become more involved, both to handle new types of requirements (for instance, scheduling for GPUs and TPUs is a major change in Borg that happened over the past 10 years) and increased scale. Actions that, at a smaller scale, could be manual, will need to be automated to avoid a collapse of the organization under the load.

+ +

One example—a transition that Google is still in the process of figuring out—is automating  the management of our datacenters. Ten years ago, each datacenter was a separate entity. We manually managed them. Turning a datacenter up was an involved manual process, requiring a specialized skill set, that took weeks (from the moment when all the machines are ready) and was inherently risky. However, the growth of the number of datacenters Google manages meant that we moved toward a model in which turning up a datacenter is an automated process that does not require human intervention. 

+
+
+ +
+

Writing Software for Managed Compute

+ +

The move from a world of hand- managed lists of machines to the automated scheduling and rightsizing made management of the fleet much easier for Google, but it also took profound changes to the way we write and think about software.

+ +
+

Architecting for Failure

+ +

Imagine an engineer is to process a batch of one million documents and validate their correctness.  If processing a single  document  takes one second, the entire job would take one machine roughly 12 days—which is probably too long. So, we shard the work across 200 machines, which reduces the runtime to a much more manageable 100 minutes.

+ +

As discussed in Automated scheduling, in the  Borg world, the scheduler can unilaterally kill one of the 200 workers and move it to a different machine.6 The “move it to a different machine†part implies that a new instance of your worker can be stamped out automatically, without the need for a human to SSH into the machine and tune some environment variables or install packages.

+ +

The move from “the engineer has to manually monitor each of the 100 tasks and attend to them if broken†to “if something goes wrong with one of the tasks, the system is architected so that the load is picked up by others, while the automated scheduler kills it and reinstantiates it on a new machine†has been described many years later through the analogy of  “pets versus cattle.â€7

+ +

If your server is a pet, when it’s broken, a human comes to look at it (usually in a panic), understand what went wrong, and hopefully nurse it back to health. It’s difficult to replace. If your servers are cattle, you name them replica001 to replica100, and if one fails, automation will remove it and provision a new one in its place. The distinguishing characteristic of “cattle†is that it’s easy to stamp out a new instance of the job in question—it doesn’t require manual setup and can be done fully automatically. This allows for the self-healing property described earlier—in the case of a failure, automation can take over and replace the unhealthy job with a new, healthy one without human intervention.  Note that although the original metaphor spoke of servers (VMs), the same applies to containers: if you can stamp out a new version of the container from an image without human intervention, your automation will be able to autoheal your service when required.

+ +

If your servers are pets, your maintenance burden will grow linearly, or even superlinearly, with the size of your fleet, and that’s a burden that no organization should accept lightly. On the other hand, if your servers are cattle, your system will be able to return to a stable state after a failure, and you will not need to spend your weekend nursing a pet server or container back to health.

+ +

Having your VMs or containers be cattle is not enough to guarantee that your system will behave well in the face of failure, though. With 200 machines, one of the replicas being killed by Borg is quite likely to happen, possibly more than once, and each time it extends the overall duration by 50 minutes (or however much processing time was lost). To deal with this gracefully, the architecture of the processing needs to be different: instead of statically assigning the work, we instead divide the entire set of one million documents into, say, 1,000 chunks of 1,000 documents each. Whenever a worker is finished with a particular chunk, it reports the results, and picks up another. This means that we lose at most one chunk of work on a worker failure, in the case when the worker dies after finishing the chunk, but before reporting it. This, fortunately, fits very well with the data-processing architecture that was Google’s standard at that time: work isn’t assigned equally to the set of workers at the start of the computation; it’s dynamically assigned during the overall processing in order to account for workers that fail.

+ +

Similarly, for systems serving user traffic, you would ideally want a container being rescheduled not resulting in errors being served to your users. The Borg scheduler, when it plans to reschedule a container for maintenance reasons, signals its intent to the container to give it notice ahead of time. The container can react to this by refusing new requests while still having the time to finish the requests it has ongoing. This, in turn, requires the load-balancer system to understand the “I cannot accept new requests†response (and redirect traffic to other replicas).

+ +

To summarize: treating your containers or servers as cattle means that your service can get back to a healthy state automatically, but additional effort is needed to make sure that it can function smoothly while experiencing a moderate rate of failures.

+
+ +
+

Batch Versus Serving

+ +

The Global WorkQueue (which we described in the first section of this chapter) addressed the  problem of what  Google engineers call “batch jobsâ€â€”programs that are expected to complete some specific task (like data processing) and that run to completion. Canonical examples of batch jobs would be logs analysis or machine learning model learning. Batch jobs stood in contrast to “serving jobsâ€â€”programs that are expected to run indefinitely and serve incoming requests, the canonical example being the job that served actual user search queries from the prebuilt index.

+ +

These two types of jobs have (typically) different characteristics,8 in particular:

+ +
    +
  • +

    Batch jobs are primarily interested in throughput of processing. Serving jobs care about latency of serving a single request.

    +
  • +
  • +

    Batch jobs are short lived (minutes, or at most hours). Serving jobs are typically long lived (by default only restarted with new releases).

    +
  • +
  • +

    Because they’re long lived, serving jobs are more likely to have longer startup times.

    +
  • +
+ +

So far, most of our examples were about batch jobs. As we have seen, to adapt a batch job to survive failures, we need to make sure that work is spread into small chunks and assigned dynamically to workers. The canonical framework for doing this at Google was MapReduce,9 later replaced by Flume.10

+ +

Serving jobs are, in many ways, more naturally suited to failure resistance than batch jobs.  Their work is naturally chunked into small pieces (individual user requests) that are assigned dynamically to workers—the strategy of handling a large stream of requests through load balancing across a cluster of servers has been used since the early days of serving internet traffic.

+ +

However, there are also multiple serving applications that do not naturally fit that pattern. The canonical example would be any server that you intuitively describe as a “leader†of a particular system. Such a server will typically maintain the state of the system (in memory or on its local filesystem), and if the machine it is running on goes down, a newly created instance will typically be unable to re-create the system’s state. Another example is when you have large amounts of data to serve—more than fits on one machine—and so you decide to shard the data among, for instance, 100 servers, each holding 1% of the data, and handling requests for that part of the data. This is similar to statically assigning work to batch job workers; if one of the servers goes down, you (temporarily) lose the ability to serve a part of your data. A final example is if your server is known to other parts of your system by its hostname. In that case, regardless of how your server is structured, if this specific host loses network connectivity, other parts of your system will be unable to contact it.11

+
+ +
+

Managing State

+ +

One common theme in the previous description focused on state as a source of issues when trying to treat jobs like cattle.12 Whenever you replace one of your cattle jobs, you lose all the in-process state (as well as everything that was on local storage, if the job is moved to a different machine). This means that the in-process state should be treated as transient, whereas “real storage†needs to occur elsewhere.

+ +

The simplest way of dealing with this is extracting all storage to an external storage system. This means that anything that should survive past the scope of serving a single request (in the serving job case) or processing one chunk of data (in the batch case) needs to be stored off machine, in durable, persistent storage. If all your local state is immutable, making your application failure resistant should be relatively painless.

+ +

Unfortunately, most applications are not that simple. One natural question that might come to mind is, “How are these durable, persistent storage solutions implemented—are they cattle?†The answer should be “yes.†Persistent state can be managed by cattle through state replication. On a different level, RAID arrays are an analogous concept; we treat disks as transient (accept the fact one of them can be gone) while still maintaining state. In the servers world, this might be realized through multiple replicas holding a single piece of data and synchronizing to make sure every piece of data is replicated a sufficient number of times (usually 3 to 5). Note that setting this up correctly is difficult (some way of consensus handling is needed to deal with writes), and so Google developed a number of specialized storage solutions13 that were enablers for most applications adopting a model where all state is transient.

+ +

Other types of local storage that cattle can use covers “re-creatable†data that is held locally to improve serving latency. Caching is the most obvious example here: a cache is nothing more than transient local storage that holds state in a transient location, but banks on the state not going away all the time, which allows for better performance characteristics on average. A key lesson for Google production infrastructure has been to provision the cache to meet your latency goals, but provision the core application for the total load. This has allowed us to avoid outages when the cache layer was lost because the noncached path was provisioned to handle the total load (although with higher latency). However, there is a clear trade-off here: how much to spend on the redundancy to mitigate the risk of an outage when cache capacity is lost.

+ +

In a similar vein to caching, data might be pulled in from external storage to local in the warm-up of an application, in order to improve request serving latency.

+ +

One more case of using local storage—this time in case of data that’s written more than read—is batching writes. This is a common strategy for monitoring data (think, for instance, about gathering CPU utilization statistics from the fleet for the purposes of guiding the autoscaling system), but it can be used anywhere where it is acceptable for a fraction of data to perish, either because we do not need 100% data coverage (this is the monitoring case), or because the data that perishes can be re-created (this is the case of a batch job that processes data in chunks, and writes some output for each chunk). Note that in many cases, even if a particular calculation has to take a long time, it can be split into smaller time windows by periodic checkpointing of state to persistent storage.

+
+ +
+

Connecting to a Service

+ +

As mentioned earlier, if anything in the system has the name of the host on which your  program runs  hardcoded (or even provided as a configuration parameter at startup), your program replicas are not cattle. However, to connect to your application, another application does need to get your address from somewhere. Where?

+ +

The answer is to have an extra layer of indirection; that is, other applications refer to your application by some identifier that is durable across restarts of the specific “backend†instances. That identifier can be resolved by another system that the scheduler writes to when it places your application on a particular machine. Now, to avoid distributed storage lookups on the critical path of making a request to your application, clients will likely look up the address that your app can be found on, and set up a connection, at startup time, and monitor it in the background. This is generally called service discovery, and many compute offerings have built-in or modular solutions. Most such solutions also include some form of load balancing, which reduces coupling to specific backends even more.

+ +

A repercussion of this model is that you will likely need to repeat your requests in some cases, because the server you are talking to might be taken down before it manages to answer.14 Retrying requests is standard practice for network communication (e.g., mobile app to a server) because of network issues, but it might be less intuitive for things like a server communicating with its database. This makes it important to design the API of your servers in a way that handles such failures gracefully.  For mutating requests, dealing with repeated requests is tricky. The property you want to guarantee is some variant of idempotency—that the result of issuing a request twice is the same as issuing it once. One useful tool to help with idempotency is client-assigned identifiers: if you are creating something (e.g., an order to deliver a pizza to a specific address), the order is assigned some identifier by the client; and if an order with that identifier was already recorded, the server assumes it’s a repeated request and reports success (it might also validate that the parameters of the order match).

+ +

One more surprising thing that we saw happen is that sometimes the scheduler loses contact with a particular machine due to some network problem. It then decides that all of the work there is lost and reschedules it onto other machines—and then the machine comes back! Now we have two programs on two different machines, both thinking they are “replica072.†The way for them to disambiguate is to check which one of them is referred to by the address resolution system (and the other one should terminate itself or be terminated); but it also is one more case for idempotency: two replicas performing the same work and serving the same role are another potential source of request duplication.

+
+ +
+

One-Off Code

+ +

Most of the previous  discussion focused  on production-quality jobs, either those serving user traffic, or data-processing pipelines producing production data. However, the life of a software engineer also involves running one-off analyses, exploratory prototypes, custom data-processing pipelines, and more. These need compute resources.

+ +

Often, the engineer’s workstation is a satisfactory solution to the need for compute resources. If one wants to, say, automate the skimming through the 1 GB of logs that a service produced over the last day to check whether a suspicious line A always occurs before the error line B, they can just download the logs, write a short Python script, and let it run for a minute or two.

+ +

But if they want to automate the skimming through 1 TB of logs that service produced over the last year (for a similar purpose), waiting for roughly a day for the results to come in is likely not acceptable. A compute service that allows the engineer to just run the analysis on a distributed environment in several minutes (utilizing a few hundred cores) means the difference between having the analysis now and having it tomorrow. For tasks that require iteration—for example, if I will need to refine the query after seeing the results—the difference may be between having it done in a day and not having it done at all.

+ +

One concern that arises at times with this approach is that allowing engineers to just run one-off jobs on the distributed environment risks them wasting resources. This is, of course, a trade-off, but one that should be made consciously. It’s very unlikely that the cost of processing that the engineer runs is going to be more expensive than the engineer’s time spent on writing the processing code. The exact trade-off values differ depending on an organization’s compute environment and how much it pays its engineers, but it’s unlikely that a thousand core hours costs anything close to a day of engineering work. Compute resources, in that respect, are similar to markers, which we discussed in the opening of the book; there is a small savings opportunity for the company in instituting a process to acquire more compute resources, but this process is likely to cost much more in lost engineering opportunity and time than it saves.

+ +

That said, compute resources differ from markers in that it’s easy to take way too many by accident. Although it’s unlikely someone will carry off a thousand markers, it’s totally possible someone will accidentally write a program that occupies a thousand machines without noticing.15 The natural solution to this is instituting quotas for resource usage by individual engineers. An alternative used by Google is to observe that because we’re running low-priority batch workloads effectively for free (see the section on multitenancy later on), we can provide engineers with almost unlimited quota for low-priority batch, which is good enough for most one-off engineering tasks. 

+
+
+ +
+

CaaS Over Time and Scale

+ +

We talked above how CaaS evolved  at Google and the basic parts needed to make it happen—how the simple mission of “just give me resources to run my stuff†translates to an actual architecture like Borg. Several aspects of how a CaaS architecture affects the life of software across time and scale deserve a closer look.

+ +
+

Containers as an Abstraction

+ +

Containers, as we described them earlier, were shown primarily as an isolation mechanism, a  way  to enable multitenancy, while minimizing the interference between different tasks sharing a single machine. That was the initial motivation, at least in Google. But containers turned out to also serve a very important role in abstracting away the compute environment.

+ +

A container provides an abstraction boundary between the deployed software and the actual machine it’s running on. This means that as—over time—the machine changes, it is only the container software (presumably managed by a single team) that has to be adapted, whereas the application software (managed by each individual team, as the organization grows) can remain unchanged.

+ +

Let’s discuss two examples of how a containerized abstraction allows an organization to manage change.

+ +

A filesystem abstraction provides a  way to incorporate software that was not written in the company without the need to manage custom machine configurations. This might be open source software an organization runs in its datacenter, or acquisitions that it wants to onboard onto its CaaS. Without a filesystem abstraction, onboarding a binary that expects a different filesystem layout (e.g., expecting a helper binary at /bin/foo/bar) would require either modifying the base layout of all machines in the fleet, or fragmenting the fleet, or modifying the software (which might be difficult, or even impossible due to licence considerations).

+ +

Even though these solutions might be feasible if importing an external piece of software is something that happens once in a lifetime, it is not a sustainable solution if importing software becomes a common (or even only-somewhat-rare) practice.

+ +

A filesystem abstraction of some sort also helps with dependency management because it allows the software to predeclare and prepackage the dependencies (e.g., specific versions of libraries) that the software needs to run. Depending on the software installed on the machine presents a leaky abstraction that forces everybody to use the same version of precompiled libraries and makes upgrading any component very difficult, if not impossible.

+ +

A container also provides a simple way to manage named resources on the machine. The canonical example is network ports; other named resources include specialized targets; for example, GPUs and other accelerators. 

+ +

Google initially did not include network ports as a part of the container abstraction, and so binaries had to search for unused ports themselves.  As a result, the PickUnusedPortOrDie function has more than 20,000 usages in the Google C++ codebase. Docker, which was built after Linux namespaces were introduced, uses namespaces to provide containers with a virtual-private NIC, which means that applications can listen on any port they want.  The Docker networking stack then maps a port on the machine to the in-container port. Kubernetes, which was originally built on top of Docker, goes one step further and requires the network implementation to treat containers (“pods†in Kubernetes parlance) as “real†IP addresses, available from the host network. Now every app can listen on any port they want without fear of conflicts.

+ +

These improvements are particularly important when dealing with software not designed to run on the particular compute stack. Although many popular open source programs have configuration parameters for which port to use, there is no consistency between them for how to configure this.

+ +
+

Containers and implicit dependencies

+ +

As with any abstraction, Hyrum’s Law of implicit dependencies applies to the container abstraction.   It probably applies even more than usual, both because of the huge number of users (at Google, all production software and much else will run on Borg) and because the users do not feel that they are using an API when using things like the filesystem (and are even less likely to think whether this API is stable, versioned, etc.).

+ +

To illustrate, let’s return to the example of process ID space exhaustion that Borg experienced in 2011. You might wonder why the process IDs are exhaustible. Are they not simply integer IDs that can be assigned from the 32-bit or 64-bit space? In Linux, they are in practice assigned in the range [0,..., PID_MAX - 1], where PID_MAX defaults to 32,000. PID_MAX, however, can be raised through a simple configuration change (to a considerably higher limit). Problem solved?

+ +

Well, no. By Hyrum’s Law, the fact that the PIDs that processes running on Borg got were limited to the 0...32,000 range became an implicit API guarantee that people started depending on; for instance, log storage processes depended on the fact that the PID can be stored in five digits, and broke for six-digit PIDs, because record names exceeded the maximum allowed length. Dealing with the problem became a lengthy, two-phase project. First, a temporary upper bound on the number of PIDs a single container can use (so that a single thread-leaking job cannot render the whole machine unusable). Second, splitting the PID space for threads and processes. (Because it turned out very few users depended on the 32,000 guarantee for the PIDs assigned to threads, as opposed to processes. So, we could increase the limit for threads and keep it at 32,000 for processes.) Phase three would be to introduce PID namespaces to Borg, giving each container its own complete PID space. Predictably (Hyrum’s Law again), a multitude of systems ended up assuming that the triple {hostname, timestamp, pid} uniquely identifies a process, which would break if PID namespaces were introduced. The effort to identify all these places and fix them (and backport any relevant data) is still ongoing eight years later.

+ +

The point here is not that you should run your containers in PID namespaces. Although it’s a good idea, it’s not the interesting lesson here. When Borg’s containers were built, PID namespaces did not exist; and even if they did, it’s unreasonable to expect engineers designing Borg in 2003 to recognize the value of introducing them. Even now there are certainly resources on a machine that are not sufficiently isolated, which will probably cause problems one day. This underlines the challenges of designing a container system that will prove maintainable over time and thus the value of using a container system developed and used by a broader community, where these types of issues have already occurred for others and the lessons learned have been incorporated.  

+
+
+ +
+

One Service to Rule Them All

+ +

As discussed earlier, the original WorkQueue design was targeted  at only some batch jobs, which ended up all sharing a pool of machines managed by the WorkQueue, and a different architecture was used for serving jobs, with each particular serving job running in its own, dedicated pool of machines. The open source equivalent would be running a separate Kubernetes cluster for each type of workload (plus one pool for all the batch jobs). 

+ +

In 2003, the Borg project was started, aiming (and eventually succeeding at) building a compute service that assimilates these disparate pools into one large pool. Borg’s pool covered both serving and batch jobs and became the only pool in any datacenter (the equivalent would be running a single large Kubernetes cluster for all workloads in each geographical location). There are two significant efficiency gains here worth discussing.

+ +

The first one is that serving machines became cattle (the way the Borg design doc put it: “Machines are anonymous: programs don’t care which machine they run on as long as it has the right characteristicsâ€). If every team managing a serving job must manage their own pool of machines (their own cluster), the same organizational overhead of maintaining and administering that pool is applied to every one of these teams. As time passes, the management practices of these pools will diverge over time, making company-wide changes (like moving to a new server architecture, or switching datacenters) more and more complex. A unified management infrastructure—that is, a common compute service for all the workloads in the organization—allows Google to avoid this linear scaling factor; there aren’t n different management practices for the physical machines in the fleet, there’s just Borg.16

+ +

The second one is more subtle and might not be applicable to every organization, but it was very relevant to Google. The distinct needs of batch and serving jobs turn out to be complementary. Serving jobs usually need to be overprovisioned because they need to have capacity to serve user traffic without significant latency decreases, even in the case of a usage spike or partial infrastructure outage. This means that a machine running only serving jobs will be underutilized. It’s tempting to try to take advantage of that slack by overcommitting the machine, but that defeats the purpose of the slack in the first place, because if the spike/outage does happen, the resources we need will not be available.

+ +

However, this reasoning applies only to serving jobs! If we have a number of serving jobs on a machine and these jobs are requesting RAM and CPU that sum up to the total size of the machine, no more serving jobs can be put in there, even if real utilization of resources is only 30% of capacity. But we can (and, in Borg, will) put batch jobs in the spare 70%, with the policy that if any of the serving jobs need the memory or CPU, we will reclaim it from the batch jobs (by freezing them in the case of CPU or killing in the case of RAM). Because the batch jobs are interested in throughput (measured in aggregate across hundreds of workers, not for individual tasks) and their individual replicas are cattle anyway, they will be more than happy to soak up this spare capacity of serving jobs.

+ +

Depending on the shape of the workloads in a given pool of machines, this means that either all of the batch workload is effectively running on free resources (because we are paying for them in the slack of serving jobs anyway) or all the serving workload is effectively paying for only what they use, not for the slack capacity they need for failure resistance (because the batch jobs are running in that slack). In Google’s case, most of the time, it turns out we run batch effectively for free.

+ +
+

Multitenancy for serving jobs

+ +

Earlier, we discussed a number of requirements that a compute service must satisfy to be suitable for running serving jobs.   As previously discussed, there are multiple advantages to having the serving jobs be managed by a common compute solution, but this also comes with challenges. One particular requirement worth repeating is a discovery service, discussed in Connecting to a Service. There are a number of other requirements that are new when we want to extend the scope of a managed compute solution to serving tasks, for example:

+ +
    +
  • +

    Rescheduling of jobs needs to be throttled: although it’s probably acceptable to kill and restart 50% of a batch job’s replicas (because it will cause only a temporary blip in processing, and what we really care about is throughput), it’s unlikely to be acceptable to kill and restart 50% of a serving job’s replicas (because the remaining jobs are likely too few to be able to serve user traffic while waiting for the restarted jobs to come back up again).

    +
  • +
  • +

    A batch job can usually be killed without warning. What we lose is some of the already performed processing, which can be redone. When a serving job is killed without warning, we likely risk some user-facing traffic returning errors or (at best) having increased latency; it is preferable to give several seconds of warning ahead of time so that the job can finish serving requests it has in flight and not accept new ones.

    +
  • +
+ +

For the aforementioned efficiency reasons, Borg covers both batch and serving jobs, but multiple compute offerings split the two concepts—typically, a shared pool of machines for batch jobs, and dedicated, stable pools of machines for serving jobs. Regardless of whether the same compute architecture is used for both types of jobs, however, both groups benefit from being treated like cattle.

+
+
+ +
+

Submitted Configuration

+ +

The Borg scheduler receives the configuration of  a replicated service or batch job to run in the cell as the contents of a Remote Procedure Call (RPC). It’s possible for the operator of the service to manage it by using a command-line interface (CLI) that sends those RPCs, and have the parameters to the CLI stored in shared documentation, or in their head.

+ +

Depending on documentation and tribal knowledge over code submitted to a repository is rarely a good idea in general because both documentation and tribal knowledge have a tendency to deteriorate over time (see Knowledge Sharing). However, the next natural step in the evolution—wrapping the execution of the CLI in a locally developed script—is still inferior to using a dedicated configuration language to specify the configuration of your service.

+ +

Over time, the runtime presence of a logical service will typically grow beyond a single set of replicated containers in one datacenter across many axes:

+ +
    +
  • +

    It will spread its presence across multiple datacenters (both for user affinity and failure resistance).

    +
  • +
  • +

    It will fork into having staging and development environments in addition to the production environment/configuration.

    +
  • +
  • +

    It will accrue additional replicated containers of different types in the form of attached services, like a memcached accompanying the service.

    +
  • +
+ +

Management of the service is much simplified if this complex setup can be expressed in a standardized configuration language that allows easy expression of standard operations (like “update my service to the new version of the binary, but taking down no more than 5% of capacity at any given timeâ€).

+ +

A standardized configuration language provides standard configuration that other teams can easily include in their service definition. As usual, we emphasize the value of such standard configuration over time and scale. If every team writes a different snippet of custom code to stand up their memcached service, it becomes very difficult to perform organization-wide tasks like swapping out to a new memcache implementation (e.g., for performance or licencing reasons) or to push a security update to all the memcache deployments. Also note that such a standardized configuration language is a requirement for automation in deployment (see Continuous Delivery). 

+
+
+ +
+

Choosing a Compute Service

+ +

It’s unlikely any organization will go down the path that Google went, building its own compute architecture from scratch.  These days, modern compute offerings are available both in the open source world (like Kubernetes or Mesos, or, at a different level of abstraction, OpenWhisk or Knative), or as public cloud managed offerings (again, at different levels of complexity, from things like Google Cloud Platform’s Managed Instance Groups or Amazon Web Services Elastic Compute Cloud [Amazon EC2] autoscaling; to managed containers similar to Borg, like Microsoft Azure Kubernetes Service [AKS] or Google Kubernetes Engine [GKE]; to a serverless offering like AWS Lambda or Google’s Cloud Functions).

+ +

However, most organizations will choose a compute service, just as Google did internally. Note that a compute infrastructure has a high lock-in factor. One reason for that is because code will be written in a way that takes advantage of all the properties of the system (Hyrum’s Law); thus, for instance, if you choose a VM-based offering, teams will tweak their particular VM images; and if you choose a specific container-based solution, teams will call out to the APIs of the cluster manager. If your architecture allows code to treat VMs (or containers) as pets, teams will do so, and then a move to a solution that depends on them being treated like cattle (or even different forms of pets) will be difficult.

+ +

To show how even the smallest details of a compute solution can end up locked in, consider how Borg runs the command that the user provided in the configuration. In most cases, the command will be the execution of a binary (possibly followed by a number of arguments). However, for convenience, the authors of Borg also included the possibility of passing in a shell script; for example, while true; do ./my_binary; done.17 However, whereas a binary execution can be done through a simple fork-and-exec (which is what Borg does), the shell script needs to be run by a shell like Bash. So, Borg actually executed /usr/bin/bash -c $USER_COMMAND, which works in the case of a simple binary execution as well.

+ +

At some point, the Borg team realized that at Google’s scale, the resources—mostly memory—consumed by this Bash wrapper are non-negligible, and decided to move over to using a more lightweight shell: ash. So, the team made a change to the process runner code to run /usr/bin/ash -c $USER_COMMAND instead.

+ +

You would think that this is not a risky change; after all, we control the environment, we know that both of these binaries exist, and so there should be no way this doesn’t work. In reality, the way this didn’t work is that the Borg engineers were not the first to notice the extra memory overhead of running Bash. Some teams were creative in their desire to limit memory usage and replaced (in their custom filesystem overlay) the Bash command with a custom-written piece of “execute the second argument†code. These teams, of course, were very aware of their memory usage, and so when the Borg team changed the process runner to use ash (which was not overwritten by the custom code), their memory usage increased (because it started including ash usage instead of the custom code usage), and this caused alerts, rolling back the change, and a certain amount of unhappiness.

+ +

Another reason that a compute service choice is difficult to change over time is that any compute service choice will eventually become surrounded by a large ecosystem of helper services—tools for logging, monitoring, debugging, alerting, visualization, on-the-fly analysis, configuration languages and meta-languages, user interfaces, and more. These tools would need to be rewritten as a part of a compute service change, and even understanding and enumerating those tools is likely to be a challenge for a medium or large organization.

+ +

Thus, the choice of a compute architecture is important. As with most software engineering choices, this one involves trade-offs. Let’s discuss a few.

+ +
+

Centralization Versus Customization

+ +

From the point of view of management  overhead of the  compute stack (and also from the point of view of resource efficiency), the best an organization can do is adopt a single CaaS solution to manage its entire fleet of machines and use only the tools available there for everybody. This ensures that as the organization grows, the cost of managing the fleet remains manageable. This path is basically what Google has done with Borg.

+ +
+

Need for customization

+ +

However, a growing organization will have increasingly diverse needs. For instance, when Google launched the Google Compute Engine (the “VM as a Service†public cloud offering) in 2012, the VMs, just as most everything else at Google, were managed by Borg. This means that each VM was running in a separate container controlled by Borg. However, the “cattle†approach to task management did not suit Cloud’s workloads, because each particular container was actually a VM that some particular user was running, and Cloud’s users did not, typically, treat the VMs as cattle.18

+ +

Reconciling this difference required considerable work on both sides. The Cloud organization made sure to support live migration of VMs; that is, the ability to take a VM running on one machine, spin up a copy of that VM on another machine, bring the copy to be a perfect image, and finally redirect all traffic to the copy, without causing a noticeable period when service is unavailable.19 Borg, on the other hand, had to be adapted to avoid at-will killing of containers containing VMs (to provide the time to migrate the VM’s contents to the new machine), and also, given that the whole migration process is more expensive, Borg’s scheduling algorithms were adapted to optimize for decreasing the risk of rescheduling being needed.20 Of course, these modifications were rolled out only for the machines running the cloud workloads, leading to a (small, but still noticeable) bifurcation of Google’s internal compute offering.

+ +

A different example—but one that also leads to a bifurcation—comes from Search. Around 2011, one of the replicated containers serving  Google Search web traffic had a giant index built up on local disks, storing the less-often-accessed part of the Google index of the web (the more common queries were served by in-memory caches from other containers). Building up this index on a particular machine required the capacity of multiple hard drives and took several hours to fill in the data. However, at the time, Borg assumed that if any of the disks that a particular container had data on had gone bad, the container will be unable to continue, and needs to be rescheduled to a different machine. This combination (along with the relatively high failure rate of spinning disks, compared to other hardware) caused severe availability problems; containers were taken down all the time and then took forever to start up again. To address this, Borg had to add the capability for a container to deal with disk failure by itself, opting out of Borg’s default treatment; while the Search team had to adapt the process to continue operation with partial data loss.

+ +

Multiple other bifurcations, covering areas like filesystem shape, filesystem access, memory control, allocation and access, CPU/memory locality, special hardware, special scheduling constraints, and more, caused the API surface of Borg to become large and unwieldy, and the intersection of behaviors became difficult to predict, and even more difficult to test. Nobody really knew whether the expected thing happened if a container requested both the special Cloud treatment for eviction and the custom Search treatment for disk failure (and in many cases, it was not even obvious what “expected†means).

+ +

After 2012, the Borg team devoted significant time to cleaning up the API of Borg. It discovered some of the functionalities Borg offered were no longer used at all.21 The more concerning group of functionalities were those that were used by multiple containers, but it was unclear whether intentionally—the process of copying the configuration files between projects led to proliferation of usage of features that were originally intended for power users only. Whitelisting was introduced for certain features to limit their spread and clearly mark them as poweruser–only. However, the cleanup is still ongoing, and some changes (like using labels for identifying groups of containers) are still not fully done.22

+ +

As usual with trade-offs, although there are ways to invest effort and get some of the benefits of customization while not suffering the worst downsides (like the aforementioned whitelisting for power functionality), in the end there are hard choices to be made. These choices usually take the form of multiple small questions: do we accept expanding the explicit (or worse, implicit) API surface to accommodate a particular user of our infrastructure, or do we significantly inconvenience that user, but maintain higher coherence?  

+
+
+ +
+

Level of Abstraction: Serverless

+ +

The description of taming the compute environment by Google can easily be read as a tale of  increasing and  improving abstraction—the more advanced versions of Borg took care of more management responsibilities and isolated the container more from the underlying environment. It’s easy to get the impression this is a simple story: more abstraction is good; less abstraction is bad.

+ +

Of course, it is not that simple. The landscape here is complex, with multiple offerings. In Taming the Compute Environment, we discussed the progression from dealing with pets running on bare-metal machines (either owned by your organization or rented from a colocation center) to managing containers as cattle. In between, as an alternative path, are VM-based offerings in which VMs can progress from being a more flexible substitute for bare metal (in Infrastructure as a Service offerings like Google Compute Engine [GCE] or Amazon EC2) to heavier substitutes for containers (with autoscaling, rightsizing, and other management tools).

+ +

In Google’s experience, the choice of managing cattle (and not pets) is the solution to managing at scale. To reiterate, if each of your teams will need just one pet machine in each of your datacenters, your management costs will rise superlinearly with your organization’s growth (because both the number of teams and the number of datacenters a team occupies are likely to grow). And after the choice to manage cattle is made, containers are a natural choice for management; they are lighter weight (implying smaller resource overheads and startup times) and configurable enough that should you need to provide specialized hardware access to a specific type of workload, you can (if you so choose) allow punching a hole through easily.

+ +

The advantage of VMs as cattle lies primarily in the ability to bring our own operating system, which matters if your workloads require a diverse set of operating systems to run. Multiple organizations will also have preexisting experience in managing VMs, and preexisting configurations and workloads based on VMs, and so might choose to use VMs instead of containers to ease migration costs.

+ +
+

What is serverless?

+ +

An even higher level of abstraction is serverless offerings.23 Assume that an organization  is serving web content and is using (or willing to adopt) a common server framework for handling the HTTP requests and serving responses. The key defining trait of a framework is the inversion of control—so, the user will only be responsible for writing an “Action†or “Handler†of some sort—a function in the chosen language that takes the request parameters and returns the response.

+ +

In the Borg world, the way you run this code is that you stand up a replicated container, each replica containing a server consisting of framework code and your functions. If traffic increases, you will handle this by scaling up (adding replicas or expanding into new datacenters). If traffic decreases, you will scale down. Note that a minimal presence (Google usually assumes at least three replicas in each datacenter a server is running in) is required.

+ +

However, if multiple different teams are using the same framework, a different approach is possible: instead of just making the machines multitenant, we can also make the framework servers themselves multitenant.   In this approach, we end up running a larger number of framework servers, dynamically load/unload the action code on different servers as needed, and dynamically direct requests to those servers that have the relevant action code loaded. Individual teams no longer run servers, hence “serverless.â€

+ +

Most discussions of serverless frameworks compare them to the “VMs as pets†model. In this context, the serverless concept is a true revolution, as it brings in all of the benefits of cattle management—autoscaling, lower overhead, lack of explicit provisioning of servers. However, as described earlier, the move to a shared, multitenant, cattle-based model should already be a goal for an organization planning to scale; and so the natural comparison point for serverless architectures should be “persistent containers†architecture like Borg, Kubernetes, or Mesosphere.

+
+ +
+

Pros and cons

+ +

First note that a serverless architecture requires your code to be truly stateless; it’s unlikely we will be able to run  your users’ VMs or implement Spanner inside the serverless architecture. All the ways of managing local state (except not using it) that we talked about earlier do not apply. In the containerized world, you might spend a few seconds or minutes at startup setting up connections to other services, populating caches from cold storage, and so on, and you expect that in the typical case you will be given a grace period before termination. In a serverless model, there is no local state that is really persisted across requests; everything that you want to use, you should set up in request-scope.

+ +

In practice, most organizations have needs that cannot be served by truly stateless workloads. This can either lead to depending on specific solutions (either home grown or third party) for specific problems (like a managed database solution, which is a frequent companion to a public cloud serverless offering) or to having two solutions: a container-based one and a serverless one.  It’s worth mentioning that many or most serverless frameworks are built on top of other compute layers: AppEngine runs on Borg, Knative runs on Kubernetes, Lambda runs on Amazon EC2. 

+ +

The managed serverless model is attractive for adaptable scaling of the resource cost, especially at the low-traffic end. In, say, Kubernetes, your replicated container cannot scale down to zero containers (because the assumption is that spinning up both a container and a node is too slow to be done at request serving time). This means that there is a minimum cost of just having an application available in the persistent cluster model. On the other hand, a serverless application can easily scale down to zero; and so the cost of just owning it scales with the traffic.

+ +

At the very high-traffic end, you will necessarily be limited by the underlying infrastructure, regardless of the compute solution. If your application needs to use 100,000 cores to serve its traffic, there needs to be 100,000 physical cores available in whatever physical equipment is backing the infrastructure you are using. At the somewhat lower end, where your application does have enough traffic to keep multiple servers busy but not enough to present problems to the infrastructure provider, both the persistent container solution and the serverless solution can scale to handle it, although the scaling of the serverless solution will be more reactive and more granular than that of the persistent container one.

+ +

Finally, adopting a serverless solution implies a certain loss of control over your environment. On some level, this is a good thing: having control means having to exercise it, and that means management overhead. But, of course, this also means that if you need some extra functionality that’s not available in the framework you use, it will become a problem for you.

+ +

To take one specific instance of that, the Google Code Jam team (running a programming contest for thousands of participants, with a frontend running on Google AppEngine) had a custom-made script to hit the contest webpage with an artificial traffic spike several minutes before the contest start, in order to warm up enough instances of the app to serve the actual traffic that happened when the contest started. This worked, but it’s the sort of hand-tweaking (and also hacking) that one would hope to get away from by choosing a serverless solution.

+
+ +
+

The trade-off

+ +

Google’s choice in this trade-off was not to invest heavily into serverless solutions. Google’s persistent containers  solution, Borg, is advanced enough to offer most of the serverless benefits (like autoscaling, various frameworks for different types of applications, deployment tools, unified logging and monitoring tools, and more). The one thing missing is the more aggressive scaling (in particular, the ability to scale down to zero), but the vast majority of Google’s resource footprint comes from high-traffic services, and so it’s comparably cheap to overprovision the small services. At the same time, Google runs multiple applications that would not work in the “truly stateless†world, from GCE, through home-grown database systems like BigQuery or Spanner, to servers that take a long time to populate the cache, like the aforementioned long-tail search serving jobs. Thus, the benefits of having one common unified architecture for all of these things outweigh the potential gains for having a separate serverless stack for a part of a part of the workloads.

+ +

However, Google’s choice is not necessarily the correct choice for every organization: other organizations have successfully built out on mixed container/serverless architectures, or on purely serverless architectures utilizing third-party solutions for storage.

+ +

The main pull of serverless, however, comes not in the case of a large organization making the choice, but in the case of a smaller organization or team; in that case, the comparison is inherently unfair. The serverless model, though being more restrictive, allows the infrastructure vendor to pick up a much larger share of the overall management overhead and thus decrease the management overhead for the users. Running the code of one team on a shared serverless architecture, like AWS Lambda or Google’s Cloud Run, is significantly simpler (and cheaper) than setting up a cluster to run the code on a managed container service like GKE or AKS if the cluster is not being shared among many teams. If your team wants to reap the benefits of a managed compute offering but your larger organization is unwilling or unable to move to a persistent containers-based solution, a serverless offering by one of the public cloud providers is likely to be attractive to you because the cost (in resources and management) of a shared cluster amortizes well only if the cluster is truly shared (between multiple teams in the organization).

+ +

Note, however, that as your organization grows and adoption of managed technologies spreads, you are likely to outgrow the constraints of a purely serverless solution. This makes solutions where a break-out path exists (like from KNative to Kubernetes) attractive given that they provide a natural path to a unified compute architecture like Google’s, should your  organization  decide to go down that path.

+
+
+ +
+

Public Versus Private

+ +

Back when Google was starting, the CaaS offerings were primarily homegrown; if you wanted one, you built it.   Your only choice in the public-versus-private space was between owning the machines and renting them, but all the management of your fleet was up to you. 

+ +

In the age of public cloud, there are cheaper options, but there are also more choices, and an organization will have to make them.

+ +

An organization using a public cloud is effectively outsourcing (a part of) the management overhead to a public cloud provider. For many organizations, this is an attractive proposition—they can focus on providing value in their specific area of expertise and do not need to grow significant infrastructure expertise. Although the cloud providers (of course) charge more than the bare cost of the metal to recoup the management expenses, they have the expertise already built up, and they are sharing it across multiple customers.

+ +

Additionally, a public cloud is a way to scale the infrastructure more easily. As the level of abstraction grows—from colocations, through buying VM time, up to managed containers and serverless offerings—the ease of scaling up increases—from having to sign a rental agreement for colocation space, through the need to run a CLI to get a few more VMs, up to autoscaling tools for which your resource footprint changes automatically with the traffic you receive. Especially for young organizations or products, predicting resource requirements is challenging, and so the advantages of not having to provision resources up front are significant.

+ +

One significant concern when choosing a cloud provider is the fear of lock-in—the provider might suddenly increase their prices or maybe just fail, leaving an organization in a very difficult position. One of the first serverless offering providers, Zimki, a Platform as a Service environment for running JavaScript, shut down in 2007 with three months’ notice.

+ +

A partial mitigation for this is to use public cloud solutions that run using an open source architecture (like Kubernetes). This is intended to make sure that a migration path exists, even if the particular infrastructure provider becomes unacceptable for some reason. Although this mitigates a significant part of the risk, it is not a perfect strategy. Because of Hyrum’s Law, it’s difficult to guarantee no parts that are specific to a given provider will be used.

+ +

Two extensions of that strategy are possible. One is to use a lower-level public cloud solution (like Amazon EC2) and run a higher-level open source solution (like OpenWhisk or KNative) on top of it. This tries to ensure that if you want to migrate out, you can take whatever tweaks you did to the higher-level solution, tooling you built on top of it, and implicit dependencies you have along with you. The other is to run multicloud; that is, to use managed services based on the same open source solutions from two or more different cloud providers (say, GKE and AKS for Kubernetes). This provides an even easier path for migration out of one of them, and also makes it more difficult to depend on specific implementation details available in one one of them.

+ +

One more related strategy—less for managing lock-in, and more for managing migration—is to run in a hybrid cloud; that is, have a part of your overall workload on your private infrastructure, and part of it run on a public cloud provider. One of the ways this can be used is to use the public cloud as a way to deal with overflow. An organization can run most of its typical workload on a private cloud, but in case of resource shortage, scale some of the workloads out to a public cloud. Again, to make this work effectively, the same open source compute infrastructure solution needs to be used in both spaces.

+ +

Both multicloud and hybrid cloud strategies require the multiple environments to be connected well, through direct network connectivity between machines in different environments and common APIs that are available in both. 

+
+
+ +
+

Conclusion

+ +

Over the course of building, refining, and running its compute infrastructure, Google learned the value of a well-designed, common compute infrastructure. Having a single infrastructure for the entire organization (e.g., one or a small number of shared Kubernetes clusters per region) provides significant efficiency gains in management and resource costs and allows the development of shared tooling on top of that infrastructure. In the building of such an architecture, containers are a key tool to allow sharing a physical (or virtual) machine between different tasks (leading to resource efficiency) as well as to provide an abstraction layer between the application and the operating system that provides resilience over time.

+ +

Utilizing a container-based architecture well requires designing applications to use the “cattle†model: engineering your application to consist of nodes that can be easily and automatically replaced allows scaling to thousands of instances. Writing software to be compatible with that model requires different thought patterns; for example, treating all local storage (including disk) as ephemeral and avoiding hardcoding hostnames.

+ +

That said, although Google has, overall, been both satisfied and successful with its choice of architecture, other organizations will choose from a wide range of compute services—from the “pets†model of hand-managed VMs or machines, through “cattle†replicated containers, to the abstract “serverless†model, all available in managed and open source flavors; your choice is a complex trade-off of many factors.

+
+ +
+

TL;DRs

+ +
    +
  • +

    Scale requires a common infrastructure for running workloads in production.

    +
  • +
  • +

    A compute solution can provide a standardized, stable abstraction and environment for software.

    +
  • +
  • +

    Software needs to be adapted to a distributed, managed compute environment.

    +
  • +
  • +

    The compute solution for an organization should be chosen thoughtfully to provide appropriate levels of abstraction. 

    +
  • +
+
+

1Disclaimer: for some applications, the “hardware to run it†is the hardware of your customers (think, for example, of a shrink-wrapped game you bought a decade ago). This presents very different challenges that we do not cover in this chapter.

2Abhishek Verma, Luis Pedrosa, Madhukar R Korupolu, David Oppenheimer, Eric Tune, and John Wilkes, “Large-scale cluster management at Google with Borg,†EuroSys, Article No.: 18 (April 2015): 1–17.

3Note that this and the next point apply less if your organization is renting machines from a public cloud provider.

4Google has chosen, long ago, that the latency degradation due to disk swap is so horrible that an out-of-memory kill and a migration to a different machine is universally preferable—so in Google’s case, it’s always an out-of-memory kill.

5Although a considerable amount of research is going into decreasing this overhead, it will never be as low as a process running natively.

6The scheduler does not do this arbitrarily, but for concrete reasons (like the need to update the kernel, or a disk going bad on the machine, or a reshuffle to make the overall distribution of workloads in the datacenter bin-packed better). However, the point of having a compute service is that as a software author, I should neither know nor care why regarding the reasons this might happen.

7The “pets versus cattle†metaphor is attributed to Bill Baker by Randy Bias and it’s become extremely popular as a way to describe the “replicated software unit†concept. As an analogy, it can also be used to describe concepts other than servers; for example, see Large-Scale Changes.

8Like all categorizations, this one isn’t perfect; there are types of programs that don’t fit neatly into any of the categories, or that possess characteristics typical of both serving and batch jobs. However, like most useful categorizations, it still captures a distinction present in many real-life cases.

9See Jeffrey Dean and Sanjay Ghemawat, “MapReduce: Simplified Data Processing on Large Clusters,†6th Symposium on Operating System Design and Implementation (OSDI), 2004.

10Craig Chambers, Ashish Raniwala, Frances Perry, Stephen Adams, Robert Henry, Robert Bradshaw, and Nathan Weizenbaum, “Flumeâ€Java: Easy, Efficient Data-Parallel Pipelines,†ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), 2010.

11See also Atul Adya et al. “Auto-sharding for datacenter applications,†OSDI, 2019; and Atul Adya, Daniel Myers, Henry Qin, and Robert Grandl, “Fast key-value stores: An idea whose time has come and gone,†HotOS XVII, 2019.

12Note that, besides  distributed  state, there are other requirements to setting up an effective “servers as cattle†solution, like discovery and load-balancing systems (so that your application, which moves around the datacenter, can be accessed effectively). Because this book is less about building a full CaaS infrastructure and more about how such an infrastructure relates to the art of software engineering, we won’t go into more detail here.

13See, for example, Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung, “The Google File System,†Proceedings of the 19th ACM Symposium on Operating Systems, 2003; Fay Chang et al., “Bigtable: A Distributed Storage System for Structured Data,†7th USENIX Symposium on Operating Systems Design and Implementation (OSDI); or James C. Corbett et al., “Spanner: Google’s Globally Distributed Database,†OSDI, 2012.

14Note that retries need to be implemented correctly—with backoff, graceful degradation and tools to avoid cascading failures like jitter. Thus, this should likely be a part of Remote Procedure Call library, instead of implemented by hand by each developer. See, for example, Chapter 22: Addressing Cascading Failures in the SRE book.

15This has happened multiple times at Google; for instance, because of someone leaving load-testing infrastructure occupying a thousand Google Compute Engine VMs running when they went on vacation, or because a new employee was debugging a master binary on their workstation without realizing it was spawning 8,000 full-machine workers in the background.

16As in any complex system, there are exceptions. Not all machines owned by Google are Borg-managed, and not every datacenter is covered by a single Borg cell. But the majority of engineers work in an environment in which they don’t touch non-Borg machines, or nonstandard cells.

17This particular command is actively harmful under Borg because it prevents Borg’s mechanisms for dealing with failure from kicking in. However, more complex wrappers that echo parts of the environment to logging, for example, are still in use to help debug startup problems.

18My mail server is not interchangeable with your graphics rendering job, even if both of those tasks are running in the same form of VM.

19This is not the only motivation for making user VMs possible to live migrate; it also offers considerable user-facing benefits because it means the host operating system can be patched and the host hardware updated without disrupting the VM. The alternative (used by other major cloud vendors) is to deliver “maintenance event notices,†which mean the VM can be, for example, rebooted or stopped and later started up by the cloud provider.

20This is particularly relevant given that not all customer VMs are opted into live migration; for some workloads even the short period of degraded performance during the migration is unacceptable. These customers will receive maintenance event notices, and Borg will avoid evicting the containers with those VMs unless strictly necessary.

21A good reminder that monitoring and tracking the usage of your features is valuable over time.

22This means that Kubernetes, which benefited from the experience of cleaning up Borg but was not hampered by a broad existing userbase to begin with, was significantly more modern in quite a few aspects (like its treatment of labels) from the beginning. That said, Kubernetes suffers some of the same issues now that it has broad adoption across a variety of types of applications.

23FaaS (Function as a Service) and PaaS (Platform as a Service) are related terms to serverless. There are differences between the three terms, but there are more similarities, and the boundaries are somewhat blurred.

+ + + diff --git a/clones/abseil.io/resources/swe-book/html/ch26.html b/clones/abseil.io/resources/swe-book/html/ch26.html new file mode 100644 index 00000000..44a43582 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/ch26.html @@ -0,0 +1,33 @@ + + + + + Software Engineering at Google + + + + +
+ +

Afterword

+ +

Software engineering at Google has been an extraordinary experiment in how to develop and maintain a large and evolving codebase.  I’ve seen engineering teams break ground on this front during my time here, moving Google forward both as a company that touches billions of users and as a leader in the tech industry. This wouldn’t have been possible without the principles outlined in this book, so I’m very excited to see these pages come to life.

+ +

If the past 50 years (or the preceding pages here) have proven anything, it’s that software engineering is far from stagnant. In an environment in which technology is steadily changing, the software engineering function holds a particularly important role within a given organization. Today, software engineering principles aren’t simply about how to effectively run an organization; they’re about how to be a more responsible company for users and the world at large.

+ +

Solutions to common software engineering problems are not always hidden in plain sight—most require a certain level of resolute agility to identify solutions that will work for current-day problems and also withstand inevitable changes to technical systems. This agility is a common quality of the software engineering teams I’ve had the privilege to work with and learn from since joining Google back in 2008.

+ +

The idea of sustainability is also central to software engineering. Over a codebase’s expected lifespan, we must be able to react and adapt to changes, be that in product direction, technology platforms, underlying libraries, operating systems, and more. Today, we rely on the principles outlined in this book to achieve crucial flexibility in changing pieces of our software ecosystem.

+ +

We certainly can’t prove that the ways we’ve found to attain sustainability will work for every organization, but I think it’s important to share these key learnings. Software engineering is a new discipline, so very few organizations have had the chance to achieve both sustainability and scale. By providing this overview of what we’ve seen, as well as the bumps along the way, our hope is to demonstrate the value and feasibility of long-term planning for code health. The passage of time and the importance of change cannot be ignored.

+ +

This book outlines some of our key guiding principles as they relate to software engineering. At a high level, it also illuminates the influence of technology on society. As software engineers, it’s our responsibility to ensure that our code is designed with inclusion, equity, and accessibility for everyone. Building for the sole purpose of innovation is no longer acceptable; technology that helps only a set of users isn’t innovative at all.

+ +

Our responsibility at Google has always been to provide developers, internally and externally, with a well-lit path. With the rise of new technologies like artificial intelligence, quantum computing, and ambient computing, there’s still plenty for us to learn as a company. I’m particularly excited to see where the industry takes software engineering in the coming years, and I’m confident that this book will help shape that path. 

+ +

—Asim Husain
Vice President of Engineering, Google

+ +
+ + + diff --git a/clones/abseil.io/resources/swe-book/html/foreword.html b/clones/abseil.io/resources/swe-book/html/foreword.html new file mode 100644 index 00000000..4024ce21 --- /dev/null +++ b/clones/abseil.io/resources/swe-book/html/foreword.html @@ -0,0 +1,23 @@ + + + + + Software Engineering at Google + + + + +
+

Foreword

+ +

I have always been endlessly fascinated with the details of how Google does things. I have grilled my Googler friends for information about the way things really work inside of the company. How do they manage such a massive, monolithic code repository without falling over? How do tens of thousands of engineers successfully collaborate on thousands of projects? How do they maintain the quality of their systems?

+

Working with former Googlers has only increased my curiosity. If you’ve ever worked with a former Google engineer (or "Xoogler," as they’re sometimes called), you’ve no doubt heard the phrase "at Google we…" Coming out of Google into other companies seems to be a shocking experience, at least from the engineering side of things. As far as this outsider can tell, the systems and processes for writing code at Google must be among the best in the world, given both the scale of the company and how often people sing their praises.

+

In Software Engineering at Google, a set of Googlers (and some Xooglers) gives us a lengthy blueprint for many of the practices, tools, and even cultural elements that underlie software engineering at Google. It’s easy to overfocus on the amazing tools that Google has built to support writing code, and this book provides a lot of details about those tools. But it also goes beyond simply describing the tooling to give us the philosophy and processes that the teams at Google follow. These can be adapted to fit a variety of circumstances, whether or not you have the scale and tooling. To my delight, there are several chapters that go deep on various aspects of automated testing, a topic that continues to meet with too much resistance in our industry.

+

The great thing about tech is that there is never only one way to do something. Instead, there is a series of trade-offs we all must make depending on the circumstances of our team and situation. What can we cheaply take from open source? What can our team build? What makes sense to support for our scale? When I was grilling my Googler friends, I wanted to hear about the world at the extreme end of scale: resource rich, in both talent and money, with high demands on the software being built. This anecdotal information gave me ideas on some options that I might not otherwise have considered.

+

With this book, we've written down those options for everyone to read. Of course, Google is a unique company, and it would be foolish to assume that the right way to run your software engineering organization is to precisely copy their formula. Applied practically, this book will give you ideas on how things could be done, and a lot of information that you can use to bolster your arguments for adopting best practices like testing, knowledge sharing, and building collaborative teams.

+

You may never need to build Google yourself, and you may not even want to reach for the same techniques they apply in your organization. But if you aren’t familiar with the practices Google has developed, you’re missing a perspective on software engineering that comes from tens of thousands of engineers working collaboratively on software over the course of more than two decades. That knowledge is far too valuable to ignore.

+ +
+ + + diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_0101.png b/clones/abseil.io/resources/swe-book/html/images/seag_0101.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa3e81499e259fd691c1a78d742facebae7aded GIT binary patch literal 24730 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 XlY4^*A8WuN$_lIx-n-#oMBcvv$LOeU literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_0601.png b/clones/abseil.io/resources/swe-book/html/images/seag_0601.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c1b7eebf79206527cc6b87040db8201d9488e7 GIT binary patch literal 31849 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 WZ^iA?qcik}fm@j$Gpoh=B>g`l%3B}+ literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_0602.png b/clones/abseil.io/resources/swe-book/html/images/seag_0602.png new file mode 100644 index 0000000000000000000000000000000000000000..1e6a4d4371deffc00ea198d1b8f2a3b6f8012bbc GIT binary patch literal 63736 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�SKP-@3~Sz^c!N% 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1101.png b/clones/abseil.io/resources/swe-book/html/images/seag_1101.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0e1d5a8416fad477a6955f4327cc0e3dec248c GIT binary patch literal 757595 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

36zRYhkz?QKPBIkE;H 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

2U=0Ko?n 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

{;VXD}q@b^_*j_+HHQj;s3$PWR> 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℘Z!QPp69vv%$1%T`|7h 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

c$R{PK*z(hq@pE{J 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

veU2I2-8Y`z7b_{(Q>}!Z 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%0AM@g*lTaiU?4r!;Icqjv%l|%->~q4^opcx^&<9 z&S~fUI*puHIkMxv43?}e6-9=@i>X)5u-{J;?Y`BNkff5-(kFj-i~{G&ff++LQ+W+b< zvTe2Ll(vfddWU!_#K6v~RnEe32`9=?0c5e-YFv%`;;>>#)b$*Z9rSk?Y$D!$ zcAX5Oi_3V{$BvcnyBS3q(vIk&i`i18qXCn1f3G#mSwmbbP1Fy~ey@$Y^xy>R&#jRu zdQmU!*ZaT=B`G4Znq^`DI=o0FwlVGNEjJ%`|J52Nr=)ZgL{KWaZnw|tO-}))uC^Da z;%Kh^Lz7mVD!;{T)M0YN&JtLo1ZHkKFWoWT521H%bp<L(P3db3M$Akpsn1cy(v^M3sXgP( zenc;%_y5zA+n{g+wp;?cN&=mI{0zQ{UL7eG1RDG{Re&y*w5yefNs(MwSVdI5&zgNG zZ1fSEkAN}()BCbFUM_CGXZjDx1=Q8QKHFU|s1K*OM_xR92Z6-VI+iJc2j?q=3VFZG zhtmPJG?uyfEL(~~Tz3>K#3MIcWG1!4vcs1d5ktBUCM$s$HOTfOvatk;Uac{}RZ9<- z@tc@Ol5U=xN67=`U{csDx-z*f>GNi3U)tv86GQ?1vmuj9=)(`I^4+!Bdg_$2)IDilbGfF190W-2bzurOkr=qm#dLF#8 zGVa05qS?PghJUSXz`Fd!&kk62>$jpa-eVuhEdEr1#YouEU&@F{8i>~>sqRQmFO&j8LaY_vAsl*!3 zn`Btj$hVQm$_D_StAn;mqMD-KtK{isd!KBIJR!nbGj^EkFfPfniH-@>wA2L4O54N} zQEE0(fSCYWmaTjE0X#Qf0}i1SguE>0nszRu7IOG{1PIRv;dqBokO65{nS+IZy zq*WlXp(RmXW-z?Q@z7zGF9_ zIC2-*-SkA2W9*|jQjko$X|qE*iM`YsJQvHjpJXHGgams`36Ss-?G{;OAWkIx;Hic~ zh{D155+fs6QeQ^z#|P5YE^cN`^gPaXv#Pven7`tCK@$&C21iEl;p&FgpQpeH!E^ZG zRAqU2Jx9?rUgg-H+K4cYjF%Rpq~{7s+{wO<&IdL4ixRkdU&8l%`S)g1lf*!N61(cq z-^Ye~;x5XQtgD?}(c+#C^Ixr2v(8YpHFG&RdztQ2whc?JU>*HZkc$=wVYOc9%I(UI zJ?Gn-F7C3$-Z%bpJ!yUDn@SGnoE+QrJ{zfvgZFMs!>~2@PawwLy!U)56nS&uhw>Y! zXt@49aJ#KY{RZ4pcifIXzd0U3fmMa$Re^`MX#sEl_`qOG@nrF79PH0rWtr3yG+KrR zZ)@~OnOkqK(LsHx#)mG4v7bMGwvkw+<A%A26A9{t@AXUqJPO82kX!mAzEh{W^S8&Ew}QUUy>{n3#??iP+=qnDP=27c*Rp!b zau`hNzZ@el+<3WFc5CHq_a9%~4I1EoO2P6&n-L0)EVr^$1fH4_*J4?M-c=%5g~znk z?83t8j>+x`dHf+8{uPkHKilTNXZn)X9+G&JjcvR$7_y$TvkoVe1@a-RCEk;8rr;!H z+F&g*A%#9suHXbtL{yYgtnB?Cx=OB*L^RX45&lY)i`#Lyku*pgr9i`2>71z73ZhX@_`_stvzJf09hI_eV3^N@tw$mjt}28SC}gE!-Cabi#Ucs5uyX>!?0XRg>v;b zyRBZf37_@D5d#AQWo7m(opWJ`*)Q&uJgU|j7aLkg6!e=AmZ1l@!?|)Jx$c9=ls}i&$xz_Diir!lB_wawbTaQP`inL92-H%(6 zvvBF}0LJWb0B}{`lL}UI8Q8CS87agp0c~gTShPQKrFOXUda$QAo)Gd2>OPO8D#-=9 z!$*C2>Ar!d2rtoF$m5dkOk@ZtL@HfJMi&$6q>IJA>!W3F)${H#q2!c?^yG;X6@8W#qqeH_m*^BJ09S?oWV9{gh+Ic=r?D z$DeI~?Fo{Zc{nybDMP-CAYHt@$nX75*k3R#tqFTZv706CC91cy++Wc9(UZCv+@Erq zJynfV390HwE-~tI+cyCxMC4z(kFxqAt=+Aydx|#goKJrCtu7)>t<7JNtYmo!O=X9C zJ?shBXi2ojBQBw1k)L7Itt?OXaYv5p8yZx;d)-qQMHfeiW${UKLW>ZJW2%J<2q#l) z56Fs@WO6cDn1@vP*>j8dUtjjA)ARZ*So}S6xC3>N1D|{i5}uYX^{;}~qD|gN1s=C# zyCuEdxO?f&e%z1R>1i4sJnl3oS{J$9LSHEbt^LvKIQ%?35q1^`zVp?c1CKbss`vGd zeMMXID6adG)iY@h(r6#)f?6Ioe`<+U#h%2m4PF_<I(Zo->xZ=&EvLJOCFd9UM5~$BwTKt z7wbkYD6!)91rBMqbYV=0NPggct^wSL#kATV9^ zdrb3YzFDaE7+Cul@UC|3{1m;hA75Z{dFas==sZ3A0KDoSi>zA;#DGvm@%$sh^=8h^ zX2ksR1GINrG93cv@N-D61y^t2G+3H>M!`aMpg-mh#3;#b_EGfcC59 z@!NCH@dIgP_9d~-fBiaG7gXoq;PBd+sSZTD=U^5Z+IAfoua@ym4x;qB4V@Z)hi5o7 zZ+cYuWd)25pJA@gTGu5pAU3uKV2-lSS}P12Dwj?ss{&7|ZZE4~C#9MJTjSZMUv(Hy z{&~)D7|#JRN$}qm)UT6G?z{k!x>ym^c?^ijj5og-+iy;)a)NFyMuKjR64@?JBkcbh zMm1T~bu21EKEd8sDw&&i^`w7Nl#T0qZLY+G1tYur0vTSRPM*Qm!)8gL!2|UnG-f+T z^7Mn7x5DlULJ)X0tSkB~U*jR1D}+OrMJTNMTXnj2=nEi;X1r0# zF}UBiHWZ1y`3Nr}{w32?e97GcIy1_m7v;eA9gIRZzd{lsHJ(^o=1{rtMQ)V*VRr#h zUb2-o)%zDry12U)6|lCO{=>tb3UOhlxu*gG0V4rtp9Vq&RmE(q4O__5v}^@e1Oy7I z2a`pa?TJan`I89V>gHj?vHOX-*~xt2bl;Q;Y#n~>o|?OS=I{A(g2FKUkxO{Jt{4*i z+jhv>I`(9^j7vaMLjwf67SvZ)Ru%?nS93lZru@3(v@`-BRav(m`7)j<1kp1mF<|&u zFWHKq6SLeFt>Osw9Ox%o>vwRzdv_JFqr^sellG&|1Gm>j=c))k;v50R78n^EWK*g6 z`n7xTpU!KM<*26dJ_7c^f4~@uRAl=0a{!`9BZL4rp*2Vn2G~r#$|I~Qlo*!jSHvfF z6=HWnt*6BRz{GD3>(+Z&@m!)rE{4~&{j~jVXPGxHA$g`di!l{eNC`HPsTP!t#;P`K z!-53@5O%6)nOGQMkmU&zG}bUiHum%$PuLp{p73gVgk=n~5)=X*HT&7K@uiAUqqXSt)(!D1~R|g$aQCCZ2q3JWVK8FtewWO0boQ9Z7CVh3d)YG^I-wfe)O`Im#^FNgT@=hxfxi5i+3`iYIK&j*lf7T|zhQC`By z%tDXF#=;I!GyPM^!sw9B{LR1%7l7oIsIJ@Lat6dYtP2mC9B!yq`L86V>x`?|=PwR^ zOgS++dobJPew4jCF7$0F@LXp)=)`{U$Eu!@&qbw?A&Br}gXpVn{K1 z=39)d9QYWZytdoh=0)}vYHhYpcTH~k^*US!D)c1&e$NtbF!H>xg2A%9hSM~C4k=z1 zg89-8>9$7RV~TnbH&Lj$r``>^lbrJL^Q;%2DlF7oVh+^b3et`1B#JE6pf|==GlWS5 zcmj{~f~q-R0OzC6rF^eRM23e4t@WE*Yc8qLw`C^Y7X#UDlVDEp_EO^oiSs1|Y_Z*O z9$)%OlkxUXanKrdP@tzZ9w3Fe;BDU{U2654{vfC>y?-0H-z2?%Eqx^~ErZ~oP6<2_ z32K<%-kq&G3T3?csaMtUo7(v1DezW^&TGMA8r^nEva8|e<8#7$d+8i_k;EIcWAzaa z4wBE`A5mAr8EhFMj#u-ffgA27ji=Pc2Lg!{q>t)kfX0KO43pdE&ec;OJH8%T3fNe= zBYk_P>O4)O<;3yBH=*e_?wz>Q{`4F_m#!C=vRr#;;};P>kFIcey*mxTc@^ATI|!Sc zAoV6a7B}A^Hb90LFrI-r{)dFxAAKi6bGU9;7-}Y1C2kHrF17ic`7L2k9wDnBN0kQr z(Px3^28k=si96ym>|WV+I(O$u<8o1k)8!)gail@#U3za^ae>x<@ZEXG_>0v*vS-V6 zM9_Hzh_0$jms1Tr&)c?*(7p%JCas`xl4k(5A1=~*wZlTp2O$T}1j6AJFaT`?$OscA@U!>1v5BkEDBjm7i=xSR zfKX3oR|y%EK@3`^eiA#cVaOB>^ad}S7k`3%p&;i+P)*qAlfT*B;tG3qKId1}Sw&}YeTqXbH?Wg7if!?dTJiIDgo-(i+*lRfH7a+BUe{xHF?-QZ z#A%_iwY9OPCjF0(d7^O@UouPuOE->$nV%eotQ(J##ZpO5MmOwtPHssFIgq3YbMdZt z!9h1O^Qv~tL2!NDdb+u->-mRc-!>?l$}fq5tg2{P7%|eRfizb?q53zC+P!G&w4azb ztIdf&mbGIps1z&xnm0zYL*qS_e@gO?oe7wB}kG?j8v`{vnOA4RLI7DGtCJWD<2;pG=v37%A%pr>Q!%U zEeD37QelZ4ry#m>XSGM}@)M+*t>5`D7pAm>PiGNcUz+D_b&kWYKB7)9OlQf*Y5n&_ zR}met2G4!TF(VZ})jJ#{I3;*mW+64Xp9mzLFo@Yj;}TWK?#Na8`n}Yw46%3T-uu}=@>Fum^_~T9o40w* zINA&Rse@QrFg_*|)$_tUWEvhGt~a0%l6f%7GAMjhVfa@%V7)ybDeRcp_9r146Pn-B z?71F*KQh;H9n~w@Llr>c6lm>>o|?s=CBF#M>}2LNZAEG}Vm=u9aYvhJ5jRV^kXi!L za{mPUc0$|qt5Nst>!sU`#~tVP9T$ZhZ+w2gUpH~t6C2mj;ll++o$AOo{|Rl`o+pW* zCENH2{90brtsXTN6X(C;AW1W{Xu1u>Dtraa53!Fel%xa z1%j|Ws2%pA0?roy{Y{z4_14G0;{p@R+%%|2QeTadUXOw(ZfqTRy=`)f)N9*HPb9dSv_kjNE%Pp<8-jEN7Cz9MpU;v{jxR9!`|v1kOyS+*a# zqoZX?6VwK?_oeW{n6Ry)z3jUsB-^IGRehdI~;wwHZ`nTK|tXXJ!HgG8OZetWnm|fM~ zf&`n!T5VjJ7O=~VP^7|Qo$Va#+QDZ5_^O}17rT`0uPNVtb}7rCVB;^Y7>+D|Zj@Pb zEgkwg0~=rt`|(4OB})CPb_JB9;pf|O9fs|o0GbatWC%E}zgkg1F83>yNv^_tH5sOj zLgHsL!u&^#+*Nb#dk^al9UB%;4>SW?MK(kZJzPHz-mpI0y6dm7_6f81%f19QZH1)LVTFQOx8eA2#}i>@(P2YM*5$VK28rMX z>lL@kO8`p7{f+tg`gJZN@X#@Y_%|>e9}8N6`%Q3UF*nER;;JY1 zz|`1hZS{%YL;-oBb+%(>rVHSO3T%l#1Zxinm&bE%7TV|00Etbe`>A3}1EZ+#aWj4U z>CAKK<}?xVqDar$z8TxP^t3{tZ1Lv%cUQE1;@kuA`fKT`D<8AW>@@7|;fX)PSuJz1 zt?%lhUdum*kLc2K0lsaea}s5V#7h{o?7ZQB5+N_qzzp!Ug^JJ z5p?=lnszk{tRNV(6RdZhcU$RJ0cN}~4-orT>o>XlctAD=XGt%~s(A64%krqv*#f43 z*BgXfQoJ8xHd#$zYet4s`w5ccjXveto{@NE;2{j)6XQP!Si%@NdynTVxUL&fXL{}N zwq99ffxd&qgC7(W;CG24E3g5->wUa4IFHE`k4t%8b!T}kx%b%m|5=D5x={B`yk z>Hulxz|j?c&^|t+6V7_(S^KO*;K1&#r?~ofJ}0mY?r{I1TMh`X*xyze&KjdZhzGgr z(%7T(-{3&6*Ks-dPdoq*8+QKj(}=qdE{B$`hVY&51w5HH@>&Fyhksd?Yin!b=vE2< zb-m|hX#ZaI0K3(5E8_Z zW8oskqD#0oa8|wyhY{1-KMbp(126jOU0i}{7iXF*=643e&dI+uq^p!{%Q`=7peWxycd@_{zJ$ULT!=)I^BVl)vwknN3vDZkMTYD0m8v#5^i`IvJ0P7 zux970z;J)f6}L$XGpAGfY~$RnJs=b9(8q2`A^2((Vi}5;2B%GpqoGxbeKMw<3vPI( zb`Qge$s?G2rhrkwp*B(&O!)9`ceg@%k%FZokts0Y$4ed~l>6mttApb&r@G8Dk6pYU zxs@+)EsX`#e5O*<(+#Q~(0;;!MaG05dBBnsVi5TWGi*~;Jp-U+9|kLw?ym`pXM`x( z-(0HS{S+Z1k;V6tRN_0g=i)Om50Wvsz%x5iNcwlgAq}ly`_R$0G6^N$hrlk2;oL{c zPe#8?n8G;92qr5_V@JHVlGaVGQk@q(j%WH!2a+pz{WeGb@qx>gx@l~h0VS%f=92BF zBRYUEe^!!10-H}Z^HU|F;P7MYeC)7ix-k7u^_&j+u%sg?2ydr2dK+n3bMOV5^A~3$ zE={L5hmF`h|F>8=ci+LhOO^J{dlnP4w9<9q6wM6!* z;L;rXDJXY`^EWor5qFCNT4V=tTnTRpf)(8C%d6Xw$Yp4V8Brw{UOWdC;Aa3`D}G^M zgV*`D&d9#Liurnn*~aR4n|r3c6BFk8{u>31Ef>w(3@0V3r}cEt+ZH^wMKta=qBDCX zPi-~Zk+?1+MqVht-d#NtpU?dMJNum!ckUR94DM!TeFg4ZA6nd=Yo0CnkqS`A^!v{$ zQcJ9EY8t+NWBymAYv}P2fs488NpgmB+U%D+9KSMD|MeMaDd4yO6e4yO+iZMnCmmpSJ%y+45yoY>42Svpj(fQn}MpQ z0AG5HkJi!c7gGWH$+Xt%0kyLL9IWjEt10Uw-QE|fTvG7*kOBUewI**H406toZKMx2 zN1_O@%PY$xA%JPo&u|5Y)C_weLr^vCSZ;ME18MGIu@}lilXWEiCtq*WAwKIRC|=`^ zU=kZ{FUm}gF4Hzkk4D7TLGhtHQYS%{A?6>l(2jU3O+1xg%lC8l@HjDaGI{fc2dunw z!hs{R>5|PVt~K7nY`{y7RdC+!xEkoV`fPIfx#J?E!&W$B=`3LBYZp> zHLWQ@sGHWL2R3`6R+*uJ!D~@BQL6<(X>n5=?gIi`2x}Ma)AUNReel*3ds9o-% zmol9^>ry-($^0O;S(X4XgFd59x!2~U@?GK2)-!08NNo>e>lyNea@TSqnI4&D2qc)3 z#Cs!k#6yz^yFBH$6pO+%F_38|t&c91g!Pg&1bOe`#hi9NQmApbrZ2)8g3ej8%kw4A zz52{J<*DK5Ge#OTQotB++1_%NqUh{t9XOEeXp`wP_aRH%b8o?C;BkY~j39@+pSI;a z;&>H@bZZj!SD+4hccqRSAdu~DT4p_hTgE6dMew`@aDvU)Eq3`HiWqP6mvq^~UJraw=s*2acN;~7xkh_*=TLDlq z3x|UEVjtFqNWwYcO@&%o-f}j6Ag_EY75&0$WD=%NsnD$)_OIC!mL+H_M0Z_7T=|5H zm*JVtr$0V;U*>jIM|t}Cv~V|Cfv5DL%kLk}c?c$#f-J09 zL-Ps9MNVqn1+ZKz#2dju^Lp!KddMmDc4uPZ26OjaN=p0HdtQebzJ~f5wKd9RZY_YsxxKR15pmXl=hdm5FMR46lS z0KP;h%=6!+M>PiBc7oG*G`KXePBp=ViztePn(0iRgeECY(V?$b88E3?^9?YMSRhM- zgB)U}kgG6(ihw@Lsz+Q6+u!&F@ts#wx0xOl#iB4vSBull%fIuWt1b18i-&W1w>?7* zJD5umr<(=pj^ifYz)g|B&7|U-)6s;m?W&HODMRPBzv=evLkGO zArMphF?QuwP$5nQ!{)lT4qBh!mLzk;vvhDKKnej-boHo!|KvgDzdY8{WRRqJ(*&kY zmCmY+KJzAB_TRnC14wd>1LyUnZflxIjc+ z0g{|s`Q0C(;5=1a8Et=_fcyPBnntr{mEmJ?eF}f%_k&5WAQo{5bNjOVZYZJLm*m=s z5U$_}#e11Yu+2+`#8kFaF2K{=H}rC+UwZR)RnGL8)F8M>=v4wusWPo-D8XZtBiY`yD?Ixb8ZH*LmR zKY>j@TR%ggNF=wuO3Bo^fM z+son*WNsr<&s?7dhmONc>-;VWo=4U65Ms2@l55Od8FjbC98_OAS@W&PVL)9s9xXr@ zYc0`EXd^7p{$yZsFRul?%liZsG%uyKdxFt7_u8BDIXxZXj@ZK-N#As_M%yrNMIQkwO%80>qw44g$B<8jmJ73HkXeFU7@5xfY(Q#V$ z|JecW>@}fpOwK=>+%7JiC*2-OE>VFymf=CQs`7FGUiWw6;Cw2eA-aF+aYmNA7s}^M zAp2&52A56_1cUhh$JJX0wfRNwzQMf&X>kiFP)dut1qc*(iWMpDw75fo;!aC(Ef(C} zT8g{77MCE!?Y`f0e&^0Tmzn$p!%XsK@4fa~&+~cqR_g76&f4%Qt%!%&=y3*U?8xou zj;?Jh)b9jvzZR1uJFIznF-AvLqx;PiVD~e=C z4=}9ICdCj}Pp>nGXgk9k~4@;we^p8899^HX?i})F%ctU|Se$4G^?|-*X@#`S* z>;A0!e&CZ3`@q!4{xHFwZ+-ip_H@@7-HvnNj`N8h?SPDv{Q;;F2h$we zZ(7es&_Fv&SmM`R*X<)fF3(jP(iiwdcJ>Oho`Iy*e0HViy!JJ+a6xM2g8!qFe)^J= zZkE2CZV{zeCB`dfw_u!x%K>4eq?h4BCxxM#PQLrpMPY0AYvVQD{??zwpt|Y3o4xs_ zm^y$+#z61!z1iiNrbMgkn+-J-I1vU4b{w`wV~ zJRhmqa$V(!X*MwnYIb)_f|U`)+f7q^X=w;F;_-#W?~v9Kn25fuosC_TA(WtV2>v@= z%T_U|P)qj~p-E(+JOPL8=f?KTd@pBvL%4mX@8+;n<=oJL1Va+#G^epRA_9M+!eHIF z!Lp!kvp(`Lh1<_BMN_p@JLg;je={Y`lm3x6&|W^Kgyie)w;Bn2&Yh(TUW;@Bft+j3 zWqHW|4Iu1zsM7cx4qb#+?)pCev|d17WjKc=Z+VtXyN!^USJk!x08}1ve(h;#?2m&< zfH{>~(8;W9ak$3L#N<~~Gm8R1lRfhiRT`qhP)#G(Dn$%XQu#_)CkXDeqNBs2ctV+D zCQIc{!i=M|KsdCEaUhN z*>Xj7SKe~H5t&jvZnxdWszl7iq;Sq-&!G>hWC|Zgz~R^o*Alw#0V0zaIsr=1JLLG? zwMNq70tsIc;^SH%Iuj;F{91a1Y|C=}%s2BtLx{Bx zU#v_9RW${Oh)@|w!aURl(FL3yIyrty1;*}ti{|V>&5r2SQZu#7G=Hm98UKC7{Rfr~ zSz=R)eM60#t*fhj*{rns%VK$c7Wo~hQj}7o+jmV9r3pK}bD5EllzH++MJl;Wbg(gx zwPX@FfK*;P0#h0~$fQI{A8edbUHVaj>W!V}ik(Fnn`7pO4{s5wH^$ty32=!IMQFNQ zGsNg1)cBmyH-1ZTA@Q*6IxNt?oWrYX=*Q`1@^3-M`x_e*@r=$jla?8-+Z2UI8L5Z0 zs<&;^4-G5-F79H`U=vop4|rKkU3bhP`{~Rgciy8y5C7TY@TFZ!JFJ_9%C!E8K;@f&o|G}SY@V4fh0H0+;j*`+X| zP8hZ^fd?ULCw>ksrxAKL_zzM-!c52C)+w8G3iQ_$qnG?izwtWoJoCI1>D}A1sx9o^ z<+*da2FQWf{cc{*J`E}OQ-da;f=>VD(jNaFjr#OxsAPV)r$c&NQ50s?yN|vF&9z!@ zT8dqLH4tvl=cBtnc?V>#(q^5E|M*bryI9ZPx~Jl|-)l70cYf9SRM7#9+{JGa$c7bF z#2+IDpMdTeS^&@j908h#SH~S5PtJa8ckOo+DhdgIkG+q*m+9JWQdGPLCIR`au`wRI=CI`vl-O2255acUjt1%|4Xpwj^OA`WXE;nkB<8-K)S8sIiPV2 zq={uc-DHiP-*-GTJYj+kB8d+cfmy27^l#C{-^;?hysj71+8sysjxB!^6f*z)3{{qP z9eL=YyZ;giiMo~8>C(|9aL|9D|NI;kCjDJLAPki?7nOk}_+wqj?MDUk69hfwyLfs8Ju6E< zL|FDIEe<7+K|RybhpPOv$7KXStQR3u@B>NNH5_V{x zhljnX!q|v6l?uhYSvL_XZ`sPg0}w5{zDU z;Li0zM&@QWN7RWj1nYPa2L{sv=%Iip%(r6k_~v4=rZ z-?ddQGQpG3Dmc_47XZsdDNKy9rKY6V)#}U5r0xy@&5jR-d#( zn=7hWl!UE)D#kOuLAxZ$@hf6Uts|F(j(-C`I*$BX&xai! z=z5ahm)sytuTV}(v9pr7K?aJw~$l!?Z)gg}(ptnZ>S*P-(5&XskmGTbD9Jjse zHhS6u#_%J6Ueee9`wpig56B6K-Tvny`HB2Z&IdkV=v0?EDD>Old-lS#Ofrs{1>JAt!KOlW} zggc(@I>c$$u{P@}e9P)ChXHwQ*28?(g;yK1_)UKmo|}cm_J4vO!}|@gr!~SydTxHo z=>JCA|GiLvR{Wd)=H37ORvg%9BPt%NVto&P;ju>{O8`7U$NL26k=xxANBsXxrmx+x zoClZ~6H$rj8L3Q3>R-*13ciHEHbK5%vOrWW00joCJ*5h&BUFfFF6mlWTGGsm2V;l1 zw?E4vc4ak$q7(cy!6A@7e;U&zj%Lkfm5{=wYz+(2sSU3}$AE{vz|@KdqeEpr(c=(* zvH8~*h6zwkv$Jz4!7iFEg1D4nUkFh+_XRcr#knZ?e#vwrFb|@Ypkb7ecHjHxD+41i z0~s*P%9PY!1JIXv6H8_e2t|3Tk&ZwLU#$J2>+RAZ=DLsD<_mes-XHIiv}Z{PUN&Wa z2AQ#OeFMynH#cj8&HL>5@87?-u(UiE z$;wD!fLI*6ET~BUye{mVL0=-HX|2P0oQ+puA1C(|K`^cNAaEern22qWRmbYf+}3fB z7SiA(rVrHTh1uJ|=<@9mH8{IR_XHfTPlxCzDtV%=+j8uV#dvlCsX-rvcO;~=d&(vI$tR`yqf_X2ZgAg1B?dF z?M||S;h+G7ovDpB1`C+lpS2pEcW}Z!>j|C$>&f>Cj>#$9!!m`U(?_n6CLFtD4?u>Z zWt374&!{t~ZpLAWqr-X=6JCmlNRg9B=aD;S^#IP-$YxtPpV zD-dD=0GYXg&UIb7{m_4ZlkSyQ$xgZ_&}m2vI$pT(cKhISycbIL0&9h4vBST&XWm(P zQTJjd!DP=i>u%Sw!^0rD-=JZ2PoM+2cKVeu6p%96!M>ICSI>0+(@e-8WF`YVP4RIF zZ1g0sym__n%?Q!}Xf`AqJM5(cFC}KbRz8}gs_#h;rD^H8ogF1TrV$y|9s0`y1 zU=21Ezb<{MZl1}=Oijqp*wO~+Xz^tkD-dIVU;uOm%u)__1ehu>EVh$ZMbGc$o8QeNMAt$P0Wt1 zBz?$}6YILu`d6|Qz^Tl?>f@|N3c$MjlFUypfdRAUsLwX{tkLl+plSu$#I82#d;f=+ zeHWzhmsAh~N^eqcMzT%XU(MN#8SoMYiY1m2asYs?YnV7S3ZX;tg=`VnUVZ!qvkt?c_iJd{R<0 zoqiqD)|Uv=S+j)dE5ts92I|pOGvF`SRdlpb92y?k)~`SOWc9*3f7URG@7%4$ZAGg+ z-olE!55x(<+d$({R5il@uT_dY2^(GA8jyJ*ih0v_%Gl&u-OcBjF-?_DauD)rS>}7& z(NxTZ1)5ver<;I1P5S4&4e-Et&RT)ZOG%0Id|+T;f8QpdfSY?VTy8_R@w{C4lCDjB z^vt40kemDW5I~{E<_2KMz1eXrWp5NWe8a3?fxu8u70N$AI;)w|2g;5JS<{*(S59y# z8lWgJy6I^SN7Z8U)}YRr_nLmP{X#0-_IAo#o};@vQ&&8=$fYIyyK6UBxToGkENLIQsC9dRl85 zN$7LZg+&w(-uI|*4~_^%h+TW+ovMe2hkZo&Ne%n^Rhs zl$ZEbbeJUpCkUo=F@QmuoCF|T4QWc)#FDUaC@-9?hnzkSK5oL4E5Ye@gsG`UFknZV z##M!hV@Tfjx~aOf%|h3r1`~1V-Im83L!)a*D~nw`-rY>^x)r8VSw1-7?U)FyN=jjq z{MDHGfx4SnP7FW()v-aR%yqqyGmw4unnPR7gpG)-b(xTP0u zvu8G8^!dTT(cH6a_HIDC0tsC|nV9%-EaX+Ht((T8FC~|{Em60qzd1z@C(;K3shxv3 zn(O1x`y;jKpz;oZVO9qC)W#>za}XX(N~OFr7M?Fq|6xkQCU<#wi;SpX6P@ovtKGca zY{ditm;%mej%9x6@BdspIpcPGCIkb;;CMrS5D4&cd!0xT+XCtm3V*(k!VXWqm8yrF zrl6*#`KBhv)b-id+VzghXKP0_Jj>^uCCSD8av=KLYc#+*?8Vvv0#R-6@DGiO|1GK5 zRC4svh{E>$J68?Jt>3IRhlUC8^SkfA;pXOE-Ii-7@J9iiKLH7nmL84F!2Q{o?pW@H~)2M@5r}`CQnf)IhOWBw7?Ed)4k5*9q4fKA;yNriVs@vH}ENrA00snLpNy) zWPK)0&6&>iq7;9aArF9Pszux3mjG#%FT?%?pvI~DFkc5Gnr{HcT89D+Ml7;}a3sRRQ;34e13h5F zRK-Azp#;#dS6T%}&)EiH(@b(L%e4RQfJ-G%6uo&v5YhFBc12~H5*~*6&|Zh5f6&Gr z`O8zB9A6TkCrqBYMpP^7i$2gB!)lTr# z@nOJJRtT1Wt<8Uojx?y6P4W}&I3G&xN@XA`Q1;pVik6wMDfG9faUmu0hV?X;?i|5!q28@a{p7Rc9RgG$|T{;VOBeULq<^E-?`oBR7NvlMIdyhgFp? zEez=CCWZH_E0a{~MNWO0H%`bUlqfDmlPl|vfcJbd(WtIpuJksZw7(_+dGQQTDYWdyE)!}$H)4(`}?v<9$d+qc{3X#cTdu(Z|Kq4w!jV1*g-OkDsD zdxjSev|$KIRl;m}f!&I(6Mh3WsHBV;1ia@q3qYhBd8)EalmpEjH15JRLNRPL-;@;dXb21=43Tcwi9cf>=NjQ=zb-U?wgw@CfwMpmHXP zkQKQi>23wUTVcyPF{LR1+Nb9ARjpw0rIJDdzGmHe3fnza;e?f!Qt&- zwO@xnFgmQO(}E%f0H!R15HiEL%}-pW6a-7vGi5^sV9>zNHTVJVOS0+mVK&P?g7VUb zo~znM#L6Zr{A*i}9+PBlN^vpZ3UpX)7gf?An(uh>+c79bCBlJ^d!1B-J2D8g+Y8$* z(Zaj2gzoO&W%>5xSy;L$tJuxAn+Il!+ zq~hKS?W`g^_S}%<@QrB}E;9@i+3#>QxK_8fQPS4HzP#Ft72)YPXphc&q8(PVk?N%L zc;OR74qFR@W*e=gwP8{l5U+fFnpgH-Scw=ClcfqG#u2+lAR=;05%PgLwp7EIx}&8MS8sNMmw(1WNs@1anbMlOUyy^fx(bsVClDv2m4+!@`uNH_H^F&8Ufq+c ze!OpD3X`Z<6#NPe%*Ba`9ssU^eJF~s8KVLjw@fO|8G|B2zNrSxr(OnQzPXhiKiZ1k z{&&ALH8X6fw_(9(&##mzj4Y}CmTm6->EGCT-E^H>O`GR=K~qzcOp^UvZFm&Lx91=h zNg9zrrXlJg{qLbF)F~;}Xd3cy9OP5buNITQK-(|n$Q`B%$en6cPILA5dqImV|?PR(E zVMpC8vaGz^i|)*h#lils(vIyomZS_V=5O$KwFzurIHCIIei)rqwn8i z_Zc81xDS3+^?b0uQ~5JY*{VsvsNZu%wuVQqAxZ*%u`*rGR+3wai~ZJ0t3^U>O6w?) zFqgO`N-H4RzD|!DsBxA-kyJ*VWxkqUzfZ7U#Hn2rPyXH_w$ncV;@WY<6qpSp;AgKc>7 znY;ml3^|R>;l!;_z{Er;7xZ1DIyfmnlPAxmS};C4#i};aM70UG8x2uc|NXC08j;mH zD+ax?XPM z^bBQT`^AB-WWRBwySIbtn>XpLCCeh7_hyCDE6tvR_xC<|@uNe-D4m_pK>;&yxgh~F zMFVHq0!|y(=CMs?HV%mSz+q<+XOie8W5%s!+R`^!jqXN{r*mHtdsXaKMUdWUKa|-@ zpCOu#T7Jk2+@;f$Y#{Y-W&FX_GE6bHWImr@nBil+tE^^o z%~e&M2tQd%9IfF0YTBY)9E*muUmYo|4(9l%N+NKc%A z%2C4VMH;^#h)j3ZIx!3k2Ai<;zG@MMaD>c%3p-^;6&fJbLU~Rft;GV$hGWAx{n20` zY@B555NF4!m?%tZ3AOk&RJjvMALC0|MOFRZA>lBbkVnd&IWqL4=Ml9U$org#MOAZvlEb4Vf&rc+-M^sVDLr6ZG;accv2vqX(6tDNlcRAPRU;7+5wl-; zL;9osp8jpqo)%zzmnxNx6}7??DNFn)e)-7QSIstz>=yex(zJmyo5RSZu5GbbjwpXI zO}QJgW^6G=9%E%Z)VO9MyBS!r9%1`dma*Z(SR(^Y0{OFE5I#_*zI~&ixgXWn2R^1P z&uZUDN8U9yjxsVTSQ2^}Py2`u{`1+p+_-7ES_aUN!u||FUALBE4|_&8-;Gj~3s!+C zTJPrGyw$%?PwTmv^y(Fd+%-Ro3U;pxmH33vFvOY8uH&8XeeMH69*4LnAo^=qca=za zZ-pNk+E8ekc8~KTzyH7Qn?a|y#&>{pVQJ~(Kqm=09sacQ^&B4ilE=hy`?Swh%c}S0 z@WaFMAe@WnHVkG0o zjDzP(LngxEoQ91qr~H1K{B470BBc3J-N`?#)irtx>_e+1PK?>>?bZHzW`?r8 zK3n?i&SWn_Aui(K;pJrVD#?@YkSu@4Mue8;uwWkk!lVia=etEiq7@06p+f$ce~lkC zz-e-BW1F&{o_S7B>X~Uy0au$`GGB3q!x?2Oqu%a~q*5?k4jA^Gv9WXguvRSU3CI}3 z7J13bbK+_E3~M&4`R2aYsPT44qkXk-NFxPp(}z!A(b9f;dnAK~rtTc^gUnp_ukOi? z_sF3L2%8*2DXD2M9U^^s8r$LVa9g*z-16hCy?yz2^W(CVe7-Gnt4*KwFo>(ZiesB_ zN(PN3NeUVI!g*DUo3{0&LzY9bp zLHzQl0L=!}7e<~OhEtXiqmt$&_JPXI-oYy?M;ZeaYGPJ61dmB~W^k5X7p>_@`f#$M z^}Od>A4%n8eYDyF=^}YaL9|jH@o;zZz7F@{OnyjMCH{El+n(P;Nr^ZbQU~d*gCoz6 z*bWq}GUUZww<_RK*!1Y2zNtEH5JHcCe6Ij%aQ~GUiZ*uss632nvC>?x$X$aCJsd(O zil>OLw7o$ml;O%u-_FY`Q4x(qy{LT=nMs3{)tP{k!U%z*Lg-OtUh+V=xkJa=7#=?^ zqnPVr1|V2jK?X-fSi4>_&+!3G;8#Arf-?6U?IZ(v7IInbhlE@!R2@D9*wQ$T=Z_|L zJVid#3bvGCqoox&Xf~$YgtGjKTZ0$fYSAoEUw_f)w$A8*`ROm+6ENMLaPN2k6raZ( zr#;%K^-NCYoV!eTh;i7Iq6q{J;p4uJv);WIsKRp@1*3FM5!W0b0^?6OuW(Y|SW;tG ze%sb*NXLZp{2ZA_pQ)R&x*{W{|AGrLrCHZsy?-2E-}}y-dA;HIG-K(1uF*C)MjwDi zsB1sJf|E{ju;_?<=+6RBu@!B8BB|KnbEOU{q?9slht2#`#gQ)}`{(yQPAZ~c6G{KH z-}K?k8U^sZnu}9C1=cT9aY#^8b%?_ua+>&mgNg=OTo<9^$?A5Cdpw!x`!|2qsL8rQ zbNeC-IrIF$Ez(yq#y0uRInM)V0}Y3JzqtP7ys^SI0l+3|lK}+UhceZFUlc9f7HH32uz9uogr{7B~B^j44yGD_Y4hUQD&kS5K8a#Wq_4VRHAj50C|GyPW4&n*pB_RPP2S7D^YBgPQ&0s@C zOjjeH9X= z+GxKB?Tq=7g58%Br?|aYoq3y{6Y&;pCx|Od8pNbxu!;wvPat|lL`;=K2`XY>iQ|}S z5=N7oCJu1R^x>6;xfxEu^*`)u1cafe!m%kj;f$#CUs6G!>@O6=UYDQ(R$M2)XI;Xv zR)`4$3J5kmP+x-Nhp<`Hi2Ej@yM_WRN^yZxwNUKzX7zevb>&0L{Y8b}j>^-$iu)B^ zY85L4B^OPV8-)X!+dK8bqB*^wi%Y&<*l?Q`#Bq@>1tYO1FPrXxQBZu^6W`xvGZ?@{ zU7IKkM#q*7E49L$aYfDB<08W(CBjA#VQD@+rQV3|aN4WsI6vq(rMq8n&RTUKB8J%+ zbA|kV@Hi;De$YN{zg#!~TB3qtf`}418$#0-LV=f>ymkv)>m0(|E#6lE$;aJit-!ja zJCP5UcuP74eN5|P5jltxV+W)gjXrF-v>b0;3kIW?qJL*>Wnld}zvm7mKZ)T9&@9~SbvtLt~3`>LlcmuQ=ZCs-eh0+q#8;!-mU zV3LtK(S=R2ov*ZrG#ajZo5!$POi%^a)6yXYKY!YrxE$FoKzsAnq2J|pLc62jRT9HB z8$XoM?XS9eI011SGY7A=5@U{F51YV_>Toj~?M@rT&!RHKLLS~~RF@(FKCGC^Fua~K zCE4{i4kvH)tNK?K(rSesd=yAChlhzjXJ;>Au<$s`HRrKi&@^}f>KcR#8bh#|3~GH3 zzb-%lMdN~+1`*%TX})YJ7TXv;-nt)NdwBV*rTzWF@S5FlK}R2nCdJ}~H|b;VvALfg z&DB7jZ#}BqThZZpu!U^%yqQ<=8sN>5;;5FvP&X~;jG#}*1!ZHoWcR~zURS$`X$->W z1B0AEi^7#{_HANlcPvqQqcTBw0MZvP>z2^(YL=bU=M!=z;KZWiUO4ON&ujjyNr^{} zKeL3&p%{-VNT2mb;f9XWr^muOM<0x}I5xkZPpYMu)c@~E``S+orjSj<<{AUi;5q8S z>pr9iOFE7@j>lWUP_e4AN6hgBg99x`;XN_FYlcLv{Jm?UHvuu@g8x>`J?Y&xPt8Qq zC}HylS{zxU1sAyy_I8Uxa)a>igPDaUDTYmtExOrG4I zuAz{PY2cB?YQ?1xQeM7OXleQ3UpnJU*eHrf!qrF~2=!yb+&gq*IFk&IsuYMG{pY*E z)-0mi^~MM~vKs5y=;xI+S8Tn{Vs8WvgGMNjB9MCfZ{%9heS*j!ypbI{;>t=vJ6RD2l4Q|pyMYafy@jJ^rhWMtCPLw6cW;72mL zu{7*&(X5^~d!=tN;}pc2F&IR>7E(R*k?VP8Ot8^u^mtuye_8Q(jC`EI%WBl*N}s9h zSZu#K-kAPzd?+p;ypVQ$EG8m2Z!{E}=9a!u{Kq#)FgHC``^2ZS3*odg($aujqQnou zjP(Cjt?%1j- zS%oPNEQy`7ibR89>+Y!U1w(V4T%7)`99;o#IO(|}Eg1A1q&kJKs-z)bWlx}4OApzh z5r%RxL7i;g2ZOm*lidcQM9jXrV`j6;k#duriI`yszUzKg`kf_Vt`D5RW4{>28ZYq! zX)?DJ1>>Jm17V;YlJa9>8caPyCErkQGA}U8h%J9z;TEGVL>2py)2MdXoA6kYqUU`6 z-!(S%D-b(%iyUu74|CypzYAv??J?cq(J>7z4f8M7KSOk>^OqwdWREjQE@2Q@Zb%W7 zy71mrNPnnsQbMghkRsazNL1**v67kp^s#*iVQ5_j*(2z#vIXj)I|dD^}GMalC{{np$jS@1{FX**6zV zjqIFDYsBZZ_WAT+zZlyQ{1GJL{CB<;EvxEk2!DAO)G7HX<;p(KesRdM=G2OZMrEPd zdJ&U|nwTRY7pkg(idvtX8;-E~!EjrICM`YblzrM)ej=fR#wDrEW4qu>g`uGcvReKZ zoRZvz*Oi7UfaH`b)q|M)I###}?86R57&PGu{t$#*jtqhO(UtTp>9bj_Kq1B!OuuMN zmeXmnJ~Rss&GQDz4jsmc=H+eW5@_N#OAt`7sPZeSlfZlEI4iGhQGdLaJ$x}~jDC`X zKK3nlzFMbOaOVS%2R>RY^4h!2hez<{yra>TOQ;y})%1AFJi(1GO@PUa>wE02pH~oZ zCnIW2i{HiV%w^B(3O~p8WD-e((Z#83SHIljNojbtdDUmja8={IDbd(7tvGJ(;9yWD zhvkR{&*aCs>$#nd>#L_Oay89_cJADa8C90rj- z*A1BR0`P!+q>1FII0dAMa1*Xza#Ia{d%Jm!J`p!%uHJ6^F$04WiKdv0ST>X-E;_h6 z2}tcolg40y1JcY^>5gMJ&gV{d_*DWaym~j%7TWUHKwT*T{E06uBO`sJH?aUwkhr(k zzqdZGi}#{>32r&Lw^gG3bn1W6F;oo#DNRyh=b$E|a;#66{K$Nmt2z36y&fd=s^;}# zz3!AoR!b`j`-djMxn`5%vX^gd(i9Ks<=S@%XZTB+MJa|Cn9iz!?Bw9EFzNs@c_v6a zjG7#UtI;@}dEgtj-s1jpW0U6v4htrM^X_-sATC*F!H%=T?|50Qp1#$0YXFezVP&zw zYjoA;?lB|2{&;`d0(snVohS~FWEwgzjQqFCnw1HWD`LJUFm?0*bE%WjA)C(sb#?q- zC)>u(7YBwM)>kQC!u8ZOc<5EF^t3=GJ3dL)v;%>H0+x!EMQQzZdi;^qY!QYp0U4pWl9<7=U)VvJP{1~JIx$rOZyC=^CXp;pbC9TI)$ z%TdGNGUb4v?57h00C)!1kMsr-s3??f&d+acDIG;tvTk*TdI_iM#U6cS6FNITf9eVa zC;Mu5PxM?KFJCRZSC4SjrwH3@zdHP&8VSNJ*hvhFRSiE22LS%djva^@#QyE=_N0oa zw}*$%)$wvcN?KJO^$;nB63TOM90&!Qe2A1-2c6>pVFMltphXo$n&D5!J*Cd`jfv{hQhBYEB$Gv=f>tDXz78`D5>Q| z7p>V?DCF7Po3JQe5Y)QvTz4Gn_!aa+NGli&A>zW|h$=q1^%auCCgu{d;0pLQLV$5O z_Y*B!zsSvj8nhc|)CE&otfz^VQJS1`T}EDcwTW?uuFcNQK=XeX`FT1!AA~c<;1`us z(L*mog2P-5=xD^KGcq8?yje;;dB8JY+Ul|#k_`weEG+Ep?Nyqr{7stnIWw_4l#q_n zq>pQ-je(N9NJc}69)X!%fOxT3Uw+VBJfA2rawxf0j=;i?!%;%PP9SHS78vB(aTX`z zEPfRb9?qIdq4uLCux*{=3r*BJEqV9j)w`OGYv+M#GuDCxVtPJT(KN+HX>$l=zV&8q z^gvNSq_n8b)>+r*s8{E-pw4gP^MYn$d>7}3+leZr1XyzFQAGXeg*H{m!#(`<4of~8 z7AzsF-VZa26|GCk@6y^f_D9~^0SFNwV_={6@Q98bfeR7|WFY@y3fV3)R%8VYa+q_` z!}yH0$=G$qH&?u>+Qt`m2{8}M1sf~dG`5d-*9```d-s>MjW#U&tZlsk3s#4VeM_sy z-pt-!$79ER)@q~c&WYKOrlQKhWXn6gSaMR=(&C3Ni%*sxdDs4Tv*y1Qcj_F7c&SG8 zybfA`8-bnNjnK`v5F6xD8bQk=e8!~`P;9eZ^M^-wAX4@6jLjLdZ%BF@h$u0Zbn1(# zVHIL#EVE{$gkhdrA?aL%@NRfjaz!L;%DXXI?>o3IV&IJ*#1o0m-I@ zjS+p^aS_s{DvprfXN?K(OV6&tPKn=h8j+Sg9P_rcfsBhKudnBgnC>1*S_3upsdQPH z0xDV>9sbDnY^4$mdZ8VVnzZ_&q&m6_9RAmt9WGZ}LtMv+!q%q3aK+#ONt_#63?A7r z_j9~D4r*J577s;!>=4h24ctlNcMy5H?`^*udFZ(A8GPqW_(6X%x@1(e#n;Qpi!1fV z@8Q$h=BKq!dilx`zd+eANC7JmjG;!^%M2H>7EFzfoW*=l_%Xx&VWHW>+PSgn#Q?Fd zl?9*Uxy8!Vq@Ay?seL6mf9HdO$_Kqg3T6Bi&&H>U_WK{+Em->cKNJ%F>~$;D&J7is z;*KX#h|?*l)lq)>pKd6yz^-p#8sCyN6MmX~rs%^C%T7=?#}s3fLC#lqnr}x$=|^gb zmZW_>U!uAkkVx73BAZdTHkMe$jhrVk_hj*wPO9qu`KrDE%li)5dVaie9Ar~Pp9>kC zxqYa!%xrbr!WFhjdoc_I;cC@}t7!!h#@u{pS#Nb_2#&+(rMow}%G0_vC3FhN-#`m* z=8cR%0dbR%prRSet7~7_0S~;n7_sNVMH#IE^vE|qYq7(Lxx9NbN&=|w*n-yrok4wy zV(7gipkeH>c$hkuGfp~d3gQp>femLy((h=98CWR*Oc6%S1tQnyqKBgGvwpN|;=xko znU1ZWyjAn?sr~$z+?>C>IqLPV&wF(%t$=j#y_RsaqB@8P3)^5Ehw;zU&nYjm2oc9c zJ~`C;zTT>q4l48Qr9XSMLPA2c|3Xw&ecldw5ndh_CMUNsB)fLy<0j)j2g?;7`0fq( zgHdqsTZkeP*g*<%MP(?ZMopI+0O5U+?x~xdnnuK9vuqZKTWz>9DB8ks!BAz z@S>TPp``0Y0Ny7Yin*MZwRF!!Inm)r@+5O=)`@&ydXhLsooyKqq*4m$o8*ba?a3vv z?VfXc_59UKtuOg_psl@89CUno8Z8JH#3`TEs=EKkJJ%A`B#)qN?l}5$K~|;uM{_%Ow2E zv|-Fjr`;*cvG7zAV(ICr;%+!k{x^8EB1)g&r$b@qcvn&W!BnW028qU=`a5vT7u6r{ zb8}NQ>+pynR$a22E9+g$%LbQkU*lzMtvJ6)fXB^ih6@hjsiJYe`e;(-kX=p0HD@R5KV)Jcg)NL6V*p-K_YvJ@OJS>b;j%UUw?)zGl$&j z1qh>}jJxJ7XlGcsKUQo#)FdvxL*~{WJgn4=iZ{7l{Q8;Me!8u1baUAta3K2ht5@YJ zCie39Yd6Iwg6C30btyt@AN(qYBG*Kl1MpvvONDgRFyeP@>B1@tq6>SO9Rc{?%CUpNw0>IJ z;;7ii8U1erStsOsy=HK{?^8kE|^FJnHX_?U@F#yn6MWr`!&qs{6CeFM~ zLN^J6D16Sx@NTUJ%;DTO(4U^bl9!DghWHbv%w(BYhNnH~$Hb}@Keu_aua5%`2q&eN zYq-?n-~p-DIxyc=q#XZbfVeC}#UTVPdjY$@M1_N3KV~IjsEI(e_B5t0BbE&3UpPIv ztrwegEWvvof46t9byaq}H{-7I1$}~9STI=__=TgA$9<_crmyEI z1EUy|@!+DqH52_US%4GZC~{Gy;=ir^_CxEx9-wGBo6x?ZZ56GEownJ@TZd1eDiTn9 z1i1LM3SgE5O4kt*R8VbiuPTc{B>_yE=%7(}r96uXH=7~%>M!*TIHG#@;+9?{W$IP9 zJh5D5X>Hv%Vi4pk_Hij7S$I?Cs>^p*hCX+s7Dxd^HBXtp>+IIW23ow~1%Vmw%D#W= z#&2~uUXYHqu`{)UzEmoUNdEb=UonM-yJY74W++ck(t1Cz7{6TE{`FEsg(*4)Y2)w)B@DsvRgj%peOvx!M zDBRN0z+YVQxX@|&RdD1iR|VjmL~z=mN`;iS@YM&tO$Po7oahWvx{`3~scg2coF1vc z0(GbVxG{N_mUdvB>uNAuKvL6K|DHJKfKcoXa5xaXB6M zKFFWh?9XNYoB#x9cZf96NlAwU9RoO1Pz7n9y%z!(&z+I7o1ghCd4D`w8)h?= zAa~MSaJ+ndO&p$w;I!l3s{h}?q$QmwhpIMK-ax8K)R`O~&h;*3b4YD_OpsA?j8wyx zMS7kJf1ve~*eAorH6n(st{+WTF*tR2`=tlByK5(p%Pr^ghrdQfW_m1iUtoh5nd;vJ z@@k1@DQT%|{{x#Uaz@BCs8Q*wX{m)PQ7yh#m*g;cHx!GZx#pyCH_lb$yiG!s{e>uD zw7T`s((|~D8E)pbvg0|9yub?b)4h~@F;LACVdrZaof2MTow}Kr_&YBzF%bx)C8VRJ zjT#w|DNJk*_skUB35%m<6o$AI$-*MOjg6&$flBjW31kh!pyv+bR(h<*1kFD&fSw{6 z28@@4Qxe9vn}GJW!nbuiqn%JGY!~bOphZ~N3~%Lzx=1Dd3>>7&{jw*DI{Bq_U!(qL z11HgE_iy4SXf0%qIF7GIodRscvN*XRqD$fnZT?HOuXZveB{kn`$c8M{*-(G;ma$G?chB_O*8t+Xi=E;+PGp}kS-~19WC{&jr5LN;c6AMs< zJf_Raeit@MG>0?_6bj|x&Q_Kle}2pa+TD;KASW384I2&%OU~9{4q&p9hOt`nyi8Lh zLxf<%cd4;<02V;Lg1oN}OR#YxTeoQJJcjU2yjvc(r7NL{T?sB(q;$nBI+;nt=BbrX zMlI(bmVi=h7`YF}B)O@ieA2+A>S~b;d_4N&2ZMl7T&^TQi(}QVJXu*_HIQ|$tL)DuWA5Bfo zA6c&;Hrl9VOcA&RQ9JQ3HK#8!ya_L#5uO_oCYO*}T3Sj^nzcd9Qi|m93Q!GVowTX# zaMzON#a6nSxC$cQ9{Dk%NcMfuXT~U5WGbj_Z|Ae$0j?VRR|Bo9$cD*Ru_In81_$O_ zdw=cP{@pRH-flMt1RLFzb<{cUC9vPdS7NAkvS2G#kqo2+##6jB%~qUsKb)xZ^7S?< z5>2cAI8%_3aa35ba(~FppSdtlPh)4k22y5S@HlYLc=mRsQNX%j)%Rj}ax!$Xh9pJX z6VLLB(6~K&E}Mx91zm#VIsNI|?gE3lqW@2&mloawwu+#rQN&iYN9|NY&8m^2txGHV!>*Pu#$<^p%rawps=G)L**Fr;BnmkD;Cl7Bxm4C5?L?Ce z4G*W7+NgS=8gU@qGO;YRJR3phMliWSsuf8@*p9CjO~*-1yVE0b);lfS-Uc~m;mz%N z#?+t5!R%x5DWa)z!xqoYgUG|!kdT6fg@sXT(OkU{e}UnjOCoG|>`F?)NOpy243SD3 zkSKOWKfT_+dBC+6_>29xjoTTd)2ZA@el5&jaZw*C; zytW{&YM{E`Bpett7sk#{^YmYDnDZ)JU1yd|zGA&y512$16ItesWZD$jZJZw8!Y^=~ zfKwA_G;^PXy&m@eC!#5PVydIrdX}xX*X&V|DPJh~L?YFl6-6n?!v3rm)LNzU;yJA+ zz+DNfv-g5XS=`x(c7CuC=&}JsdH@i-y~>~M*O};&!=VHf8cQJ%G&mY;Lg^5!TKMv_ zQPGj4Ls=-&gNvao!k<2|!X8s?XZj7``R-Wli(Nw%o1p zaaOk?0=|wf6$ex4@-hDV;PFQRORZn|7`5MgUyHlB0cEm4eJCl#tc!#tUe@@BgfQXu|GfD0T2lG-1R6G@Pm&<@@(SFAVvhjNc zNWMyJ3~v)sRTc07`Hb0&dg0+VzH1GfR^OIQrnkv4o5$G|0W}^Ti?7ti`ewhL)oTX$ z`n_PUd??{q8;EN_>DmSIF;Fx%IFM3Duqr-}d_p)v2l-|1U-j7O#5Xu(`LmJ!aG0LB zL{3W;uCvR&07%QzdO@6)JNLJ1@$zJ9adA;z($^8hUKL{2w@UU|nVJL0i^c}|`j4FR zKbSgaXtRF{;T?Pfxze@KS5ykOB5k^!zmUyUr7~fTjUThp_80` zBbqsPIflAQ{v*MiG;s3ZXEwcm&mfPFu0S$$sl9)2iLWhMnJztl z%hk6weV8^HB&W=n3+HHXy^sI^1RTgW$!=TL8sh@Hp#DE%6d|{Z@hDw=k}ztc7sNwk zcJJy$Zv*8SK!}0O8{H+2oW2XgsfWy4w1n zMk`?0y6Rq8+qzA^8}p5K>0A%Em3_ogHeV`+&chL&yd{!Lg{ zRK1l5jQDfsP(Yca5y~ZmfGO;@C9}2Y&;sFK?#K>O;BLEan!wznE{#XoY8z&@kO;t#)yY9%OP|WjCm1=kk8qn5e*4i zH6-9!3>43cp;_oZnZY!EiAO?l30%synUdrfj6z(W5NoiCDi3~(9#0FS6WX4wu_4rX9??u#iz*Zd?@Oae+?8_}gMqD@J?$*%6wqAv! zed#T0!>RmR9FVs&0)|dj1@Dkk{GfqneHM?Mkjn7%HU!Fxfv1JWsEoXmkflbtJ_s5w zwb>3?S=lsQ#^r0=j_9R+(>{QjaYVU}@;oe=u@hL+E?f$~+#aVB#_nPE)c%pvw3rtxPl#(9x z^=r@<72;?UX3iVNJjN4cA<`jMV7c|8R3p0j_-oj=z;@j0IX!;+3R#bp3tA)J>lMvX zW9~cxCo)Djp`a}q@WA*Qd&5=6r(NsoG*6(1cz2ho;&^L+{Yo$W@ zZTAQT<@Y;4BkV2Xi?mE=nMzD~fiQK$HIq7-T~f9Lf(P+Rf=}=_T=#j~2Cxj7N`MML zA_quW&&|yA%~=&WhCuQKj!p*42Ft*tp55K--KO3q@(`o*)j_U{W@l0Ql49FBpLpd^ z0(OE^XGVjs!T^~fBNUVYGl0#7=@p$zE%8(U>OjjDPz z08RNwpNXDCC<1}dN|$0lIA8NO`~5twfvTn^r}NqO{b}%>8okytr!z9^SVboS`XXL2 z2#mi&Gq3T*S1M5s0FOf2QO)3iFmJw$a3srC)eb%ZDLW64_eg`!B+xnuq0QbV+#gk1 zoL9cBIu{YqF1h}=q%cLj3z!bP4^4<<6#1${_<^6TtMkoGzQZJCHLUFHDv0 z$(LzN&@L{%J?xS22G`?iY|n!n|vF{+HLT)$(Vc^3Or{5=tS)BG+w>V zMgS~#$e`iPZ^s{J52~wck$#O$J&TeNh^n%$h7SxxC|9E98nB>t@Gg->&e`puk3ka! zAj?k^zFhu}!b+F7UJU&mdgtQp>01>L;Owc-{821?<&D!_ZnC#xHdAl`}qGTA0NK__c8GKC=UxBj8$6nLt$`63Uw=6r;mw64Gzhj%O+#G((iwq^R0yx$)8d{4xUbs zPTnG3dNyo*@P_wrWiy3oKqhxsTU(4#bGsnf{v}fRclu0naLGCQeO3ydB#v0Q{-$%Z zYEr{^jQw}_<)aVVSIbKq%N^l9`%}Ag#e{kWB2cR#AKkFfP*<#VG%(8)7X)Ol3)5Rm z5KB&3$cT@46@G&NCZ>Qnd+6SSU*@Vn&NP7hhFQ~?BT)`~;h8otTWffmBUqrnR4>&a zvD)Pqx+|Y3L~&wZT_deJgHK2j=AcbbGt_weo$C)VuXFm$fVL{n=UbZI7UaO~M~N{R z(?TJVmM~=%fE3yoK*&ZVrlSRoG<;Bz8A-xYwXdK;-TrODT-cE&N$}X`HEpc~vE4gu ziLqB;(3AK6wB$NtU~mVf#5Ag-UC`XwTikY*?r5Hn*^F9b`-jFcex1fyyu(j+O!v;y zUT;~5j1WK)SI-Cl?MV- z2q@BJrQiar!|OQS{yXcqzL`#$(;q~vL3x}U_-bNGZCxbaFq+KXNe|NmQs$&JUhgwA z>j5Mm5hN_z6=z{j5%yf*u4`7Dvfxy8dOlDs4Of)Yc>aS+?)2D2VE+5zacp+kUCQ_2 z)uQ)%#>Q4&H|~Rl+~Jq-P1hj7?3I~YIXTmP5t^KDt0JO#yE3!i^ zReVlP8+7Syg(!^T14g#_1{}7o<-DwK#@ftp%(Thn>>6B|b{BD-n3Az5w|gnE6Yia6 zLmED0xSiyVl%WYp2_WCAgFaTwHpo8#Awo-jX)oc^s+1yQ?BCv?GlN{c?FnDtyMDAV zFr4DWD<*|7z1CHGBwX!*W=TpN%*$iJ*v_`~`N~Pk*4MREx*YzVJbgK{on?D4@A3Jf zZHSnR6bM9{7k`Y&PD;<`_{!VefVz~0aZ-u6+|EZwO(Q$n$kl}#aEJ0(rvm9OBjPBM z`Y7EAnEA}ClWg~zt83DFy$k>6zigkGzs^%#kK|wc%LwQ)6Vw4Xf1pcr@AY-jk;mzF zGFIaxlUzD2jl}fa)RiAF7B-Z(@r6Q?BY({v{62lJ7V5M=w40oKmC_A7s(J@dX{l7k zamNj~rA;4I35ijK9D5F_r0v&Jqw{3_IptFLgEyo*QV?SA9U=&qA{Cr?YAEd>W&}Mu zqj_VTh17TsrQ~%UwGtAOK36$rFGFm#;(J!mHizbn+e(FZ7&kGI(sS_;{i&r(Ps(RS zvn=`iUgMHegaO|)#OSk2Y_(E&``~H0$r%w*#qRHN35rRG3`s~#ioW0}j?pP1CK4zB z+3R$7h{R*7+WE}e3o207&Q+N1P*-1Rh9%lS;v_6ER+%h zOG0jX>y^%G%OCKTe6=9(n97Zl$19jjuOFMP7Y7F$3i3Du&I!DB!rS)LS<`&8Dd#^V zIcqFgDK4*mQ|12q>+&&I?C);fS=`Xtt-!WY6!khKUSX32qeJNe(Eo}=XxJ4ML0jAL zp`X@4&JS0z4lZXlw>WRN&-pn0TiUt4T1X!2=sUK*0a5L)?z&X$or=k^Tr(Rn&#Yv! zOd44t;I~U@NGKa%-;I_X{f=VYA40K&dHUJALw+5+cd| zgaa>_ZVrP|RRUfj0UbQ87X*g2#;>Nz-yXCxt}hxyY=oZ&FEE9#;VlS^4p^vCER3WXUZ@$_EJRD`&x*aGJy3C|EC(H)jv4Cg5n!h zt4@GAcU$N5siaI1b=az1d-%l3<@!uE~{#%&71*wmjb5?EV?|I~mQRH}m(jGT28 zQeZ85(^T#Y?T|~wKyP6=4JQx5{+nKz3i8Y3zL?RG&hfU0;qB1o74!Z>RVzg=(UpxR z-pP_jKt!)(g(b{JI13mt5wxF6{}V=Hl8{8R7CkZLQ z;3~EzTQ3y*Tv9D~Zu70E*^6cX06-qjP`-qDHSQ)Qo5gtY+;^^kyW@J+`~Jr>oEI{r z^zKC*KCF{2tHHgws{YAos@Cs*nT$ITSSxwNNHzZDPmhD7tmaz2*(vq?fj zm2lrQ`QFQ(hLQpUsmD^ksnq+T61>)FV?Tyt%N3OLfOG?c(_mx2mj5X=0_`dRRxE*Z zlNy&`BGyzOYZ{C!cwxn3&>IyghF{ zxBE+~VHdqp$I~^Dw?owqp)h(pHas}O)x_i#1imNfskdsNWuAe%^56gce%Ie1bSVn9 zoz^@p4hl~f%X+*5muFuJmwj3LyYcol7o4xZX>preVlt}K9`j!GZf4Z&Puo^Oj}d`1 zie|}(2AWxm<{`7%l;=I89PcO+&1gB$(~}xv6`)5Ut%P`bq2o5ZKNJ}WQ{c_}#bE+) zv$&r=5=nL-Q6`8gV~@R?MU9oDE!HCtU2lf!YB0@lhVl*j=Flo?g~r6FBm1_QrO>+*M1bRpaV!g@5(wau+QH-mMHSox1%xpIAkbOnW3 zwqNN#nP88M3ckjh=9^lwGjb&INY*t4L=FT-0wySw8icm`=espwbvzHOygI`S z{g*rbNsP4nF)#4oZy)x%UqnufqoV)hk!tzq{PIpB2Px2NrTAEp4$M>i<@r@2w>p*KW|ZMu7Fv4A^BD%s-h)fNLbnITsX{6q2ve|I!eD@ESk&l0nAfx6ccF zLVW!2rR;qgRyj{gRa4jx1nZs9jSPvYDdGKeI;dhzEGjv_xCR^!RdY8KXPxJZ1ujK0 z6%`r^vIFVG)>b#+39rrl-#!6vSbeQzQ$+1 zEA1a8^FG_SMe37s0k18cS=p@cI>|WtwvOphXwZloj>Lrj=Zlmecu#V5-v)QB%Q~L` zOKq%;b4(l)U2y^ji!1+EXVF*^+dNBxUZU)zu-G5Y#YatPS@BmsVuh%#D|ntyfp~t#WrsQn4!MSX@;J(xEw# zZiW-l)nf(dlF2D?PAfJF9vq(vIH#=RC!G@Sc5@SybzpxLbGx7Bo`|0=&80Gi4Q9Bq zUj?Qre12@qw^r?yarTDfdrV7>gJWw}jDAs=a1j3>9>x9pBNP)Okl-MF80^UCm5rHN zQYk92GV&4Tgxh$#;+}!lszE9-yE?s&y`oruH8$_#FzrOXii#;Fvle9*qta&u9ne)F zKvKj?QPH~H6JAZ<#>`54dY)kys;h6YP#XZ~6!p6#@Ox5=X;B8h_Tn>xB21}8lG&rW zjSA3@smkeL^kn@tH4xb9CjyopnQZkf+hshda7rDfm5c5VyFc1Dc8>p+9_qir_DxOc zF0US&3-;pP&fvuqxnv<*rbug_-dpM0d^ZOMGSxmhcr%{BeioA#J-TojD>?7CTe`7N zd&RdcnG0!9VudQK@hK|bdP-yfpD4Bcu0dx;pRLkNQN}l@u?~niMQ4tX(mxFeY*WV2 z-MeRa5268W*eZ^fkubdb__{kE1AuQ`)c4Ww!5n zvkFR@Y8s^8^V<8k{q4byAxXP5CxHgfXPR$=x8)h)L1WTQX^ucn%lYcw-ri;1UMHtJ zirPJAc3Oo=U7Ky8<)(^}av*h#0EXDWqe^>Qu>N{Ir;@MgWZ6Ve|BgZL)7r|)%KFO9 zCgKskJBl;?!Q=yq2SbTwTtM>X&cVipt7~oXR-dnUwm=jtUTC4Y_3YrF7&VbQWd%B_ z5L(-l%Os&A7K!>vPB_@ zzE8L=!J=+7s0RC&-FhW07h1RICw*qn?{;?IZR}R)GY)}u4CKf2$8bah#mdS)V_Nv% z>AB0keQYH$Ac6=@p$Dj-Fp9_>8NAN)flle(r!)%PI}nxWk#~m3==1L-MJA6-3sQTz z&Eahk>844OBk7d~JCGD^O4T9+ULHT}0|`V6+1}9h3a|jC2!FVqmN*~~aKqw9AEjM| z_a`sERm<}A{}NKM&uWm8&1fz-nRuvo#8-i_5zC5GDq5*dt|BoQ%^JeAeUj&nZgP#w zLQBcY%F4-UCC|7D=MF|SF`BY4E36N>W;f%%JXhqGN)@H&<3L+MMke@E4}V7_e*eNn3Dr{L zam!&>h(k%+(QMmor}4k3_uPcR{umH}&(O@|kka?>{`-3ix=)`Ucm(Y01?;P}zQQnK z>#wk11O_$90HHhWk`8n3uWH=I%L-8YJE45Wx+ouU@y}|~SpqWk3r%iL)|31+z*mFS z){E%emh;Y7j|V%~qk642Md2xg+AncL4;tXcJ>}d4WtZ=v*~5=hdgpC1uS?m!uqSkC z8QvKWGbg4T8ZPql56d0?p) zFHiBLMUp8>xeX20P$}o7LZ4oQr3ChdFX_Db=2laWb>Vhwz3v{xcEm1s+rL@x-(EO3 zPqpxBPFKTxWNUMX^pWcm+~}sWB|;eT=bt?Q5R`Zsy!Z(U%PNR_?b0mO=-9dY;FNA_ zB04Rn#mmLY&PR|=(9D2ljCem|lFMPe$FTnI5_iz5d#Z`o-mkTbxeX}nT z8OcnR`DxxqJv>m_G76W(kipbuz#w8?x&R<8Ch z{1^|&>x~NK5pRDFZ^77E3IH3^O?rYVw}~FK@ldaZg~(C$P{(VMjhVhmX+9Bdb>IB` zu%hXe2AcaPQE^~gkkIFJZD)Q8mndjp#;9antvEs8e`Kc*lS#0@?rb6R>nQdyV~MR?@FNo@u?|lla{a5D_Yh1_6}wE@C8u;PnxrjAP{vGZ3$jocEu5N zMs{4>MTbB3;jM-{2xJFz1%?yXG$G9c&p}>47o)sxh+pu115dcD@`(ZpoVW%(6d)q+l~X{f`}VnDd7N< z)Se3dHb5>0c>dk<@i--Wc8i7C6JCz!is>VTLkUPVlog+VI?fMWhmt!G4Qx^219@PgNlV1=0c`Fb%wA%G$U$*}I z^r66Ooy(8fwz_ZSP-dZh#YzKH5`V8lh|6X#-m4A2nZK^Mj=t$T%x`X#@ORob3Ap*1 z7H;hM`zM$DVWsia09WF!X3Nndn>iWJ6zaK>0(-NOidlDmDPhD>DX(S3M^-5nRFd@) zwfYk#=Kw!_Qd~o(=JR3G7ywQNQSMA_wYzoqE?nN)`8p!;@&7$E!9FjSoH{#^cs<=O zEU!{^m+^k}JVPx8FFoBau`z$(cOeGT-6%s|@A1Ud;5*zJTpc-`fuqG!xA+I|u>tF+ z$DX7tZZW{mxQI#(m0g*XC(DTu003cf4Wn?12+Si-#2{O!LfWxMfJcX>`V@q4XS;(}? zt<-6+4n8{WDi*uyV!Wpn+)N5H3_0ptNY!5RAs#l)$`t1z2csr;vrAaef}iKj!P0}; z39Eo*ku#68mXi+^L+dW!ay|;$bf)qlB35I9w35Nwv*!x5^;a3wjLq1KXSv?`*okm8 zvL3rvDo5}9PxP&-Dik0sMP=d?r2~}{36aqEGA@ca=SzV0*d$2*uuuLL(Y-L-#ZOK( zl75RL5tboDL77z?sX`6e#76BmJR^a;aPs;wD)hQ8+F!1XWyhQzod6I5)D$UFyJ5jF zINW4ZSA!u|C7*4Pxs-TM^Eo*vGT;+wt*@-L{#5d-rhm@PZhPf0g9~hpSp3b>d)VEO zXT%{g0$GZ8=>_a7$i16wYd0(ecO-w=3Q7KAw@CC*`Hl^z)1mA$Bm=bG_qnCveZt?^ zO78*^IxD~SplzP5jFojwirb4gQ&y%^=(mp~P<+1BL0jhA!t#r^WZwgpF&hc@`g-32 zD(uQN`t~}M{R)Xz7KyYS>|kY>)_hV^Q&txHwpCAJu)U+BpG{3 zyql2cqcFz~r&Xx0sjY4H5*jAD!b(-Ei5p_I-kpw5a0RSLTu%o4J@emp$-Sc1r(XzY zwfWsWIr-s^ag*;m&x55WV%hPU!)R+7C`^@83Czj6id5SQVQbO7yWmoA;F*Vzu#Zb zxFdTpK=>@8-oxDMwM%c?i{x+WeO~7AjMHA0>*=yAY`=cuA8%7CbU#vH@cj#fZIEZ zVY}1U)7RD4w~$wHw7}wKf8|NxdKs^L$fGX|tTkXeOh+NDLrNET5(WA7Yi_)@CZceh zGcpOLoyO5lG>`oFQQ{qo{+VzfNt?m-F@O}b+t`lwR;56r@d{Z7#hnF!Zb|KeL=}%0utod zq{eQ#@OpdWz@=P_ddZQ$BR?-@!cH(s&2eUsVZriC^h5D|m>22L z6NSjbzXv9+-i&kNoUG>fFS@=p830dg3|K#BOYRn7z2*Nu`z8U*jAmntB{H(t=hTpb zDA8;^n;aYhB|%7B6T!&IiCHH@BbdY+k^-YGX2@Hg#5sw3Ep?M{JYVTOTV|PuFja0?GvjVvgFdI+tDB zmP%~gbBET;y_@yc%k{tup5jAP{Rq?uUtzy;-x>Cu9i$~8A?kDj`P#JL@2|6^Eu$Mx$%8*dw*~LB)h-b_azcF z_MM_FkR%$mI5Ye6sd)Av8kdntqZqkh55EU}@Y?yeSK&`ht~-*zW9ROrk1qUzTq1W^ z$=eyymF>+`c}fryx%xxm$_Run7xbQ zl$D;5mz9h_F`oKhaTiV|QEoc;+7(k)>lg#1rNLTN{*L7Ow2Rg$sD1MeaWlyQ2XW`> z$af{7TfwHWhg^m&5!O*Kc#O&8`@=)t1xqgM-z+ZF^#aXIY^SdtvgEn&|K+PiA@z15 zGBVNS+q|CgscK4%lCAZVsv5%-4XczsK?4i5gec711qp@j^cH$jCOfU)Z4> zWcfT@TbA+1OKyYwr!NYHD&y;~wLy>dZT8tPtPJ*Rmfq0cOx>K^T)4FUi~iILAxL4x z`ET@0EMJX=yxy1Lemwu(_kQ8y$S!4{qOq|COvQpHm>F_#qPIV|-&MVNViXX@Z*QNb z7!NOh)6(E}a+H0x$G2q=P+(s(v)Fnw9&06c^P4Mk>$1A<&8TpwA~J)0o%^A;n_o4DXgMrj?xbtC@QIn@|)=qBDq{_#Q zIj;SxnKdU77k^iG_ru@M8;jk=#aoX1TYWv9Ja3wb39J{^PKTQ)1Oa@T+0)g((;v=f zCpj%xyTTaPS)+w0d4oSiss2ibcR`_<%6Pj{&!1@ACH;^(H-a%#{!QEx5l;$p|1y;D z)$p6!#5avGO6}GuN9|XlWne(&63lAETWAF<*dL4=XFe9MtJ_;_mCuM-2km$?Akq4J zU0q{i>tgMrBpmBE9&x1N00To7tvkOx+0@zD>2P;JS?nNo!VWd}fbl^w=1E=6HFw-G z8)Az_k(`CxU>S7gFGcknbb1vPUEP5fmHlk2ffkQ|q+3au8T`>2?ds4}u{zHo z=hRBZ;-DuU5`0r3Krt^c`6o`wIgIp|mjfe|#XTvAzvv!21je9mGPQr=y^Wu2bRgI7 zLN&sjv0l~dW1wVGf|7-%4|0vga1*pv*Q|WZ9Y703;i)TuUI{Y*B#9yl&rOYLG+wSU z%t`+-adP!`cXAfac+~Jp=XL6Xkc=O~$H&i%>CnZtMCtDtgD@C5hFDM=ba@4VpGne z+6HS3Q@5@SYWhxf|}c>t2@>KH`ZrMtFAO45&@5at`ftc zk(mP06#-qj1E=iVyDvoceGg0k)Lf@HuRcxHveVbfmd$$6f4kOm zZ7!r+4>D+PhOGQYuMU~7H<@p?=X$I(4O^Y(^(&1?iNGn{*v#?XUdY)48Mw-*y^CD) z{PvaOwcbrMaU=Q7pVn)Mo1?|+nN8Pas5iEr;*ArUtc|qvIf^069FOD{1j+p=LceJJ z081K?npt9@Ai^K}7Bg!z5-~lnT5zNN--@v}CU{YChI^G9BgL3D>Z4LVAA|DV$or5y z4W1`DUE&#Tw+OECt+Qs|zB@VkyfVVCLA&$mXe+vglx4u7gGO3KL4IXL{g zaJ*U5(Udz0_`7(M>%PB>hsU~UMoD(X6N^7-Av}PlnwwkU1OFCWrFPHWWSp%^cBduz7Tv$s9*x4dZD$g%Xjf$5WB%h5rPvYRb9c1X?dXB(IER zY0iHfC|a2r0JSuw=#J%!n(ZkG@yVW|mF6o@bSHQE57)7Lu;AecUTW`qHTxXC8c z%lzg%GCb^?r~ySHYv(lP7G5_AvRawPf9aBKyMaJky#6@DALIx|pqr#kPVhZEr+NQ_Vh%0F-C0;l zQpOc%_X%gmWZBuF2TkR&q1f;4Wh5E&$5Fzh)eSb!imY%mO*+p`=n6U=y7qj#4Y2I@HPPhcWM|9|KE~0M(FsX1cM5Vu zvIG{w!I(95GIglMIjgVW!V5tYOLqG?@vaEORTUi>(e`#n{)Uh_&ntBy0%Ph7Tudl! z`A(Df_JsWTihS1i;7|?2vz4vZ%Z}E+Lw1f2VvDBA7k&5YX{&aA7t*($&t@%x@zu}5 z!{r{%DtWZx);zFtm)F;u0f)KQ*Nc}SH!}nq0@thLJ|AKied}6lu8vQ#P_j3tXU6AX zWZ3MK(X3(ragYoougZEaXmE2{YX26lzuup!#b$Ed9`Nc{161JnG%f1lNOTj88 z1XdiwI#1>bJ^917Fad+299kOv?%TNNfAgF~h|W$EPUg4%jsKq^^$Al!-g_AFz7~DL zWU}Xaw#$%!ofLK62lGj#do0K8f9ju&P-n@U<=E_BH?M?WZV$`&on41mwoK2|R~2ue zd@{~LqUr#-9b zh@f856m^oA#x5Vd@VQ4t_q1Z^NZO^Cg6?M>8rQ>UfW8upin(jM6~^TD+-qqE;fBkl zy$}6qH>2|Zt_1uJ(?DVCwc}0h&GAB=u>drNAhOooo!_|G`34(eASOW6T(DArw#oIq z*v!5o4L)CQ9nb7VZ8=bm#=h6*>k{G;@nqx<&6j(w{_f{Tf1+sx#5F{6Vh~Bg&MG5* z)66lF{%b+8?1aj^KjV@+8*-v~A()a(xhSShXSKVjiyUvl{4(A8c!2f9sCD{qa)sB8 z;<5Z+An8k^B;7;uuXGS$f9zNipB|x!0*j~b0Z>X4Jw`QPgu@TiAT%z`Kp9xmZ_{;R zGC#&lg>92ssf->{z=g#{?XVvI=k8 zQYKem56kvDq@a4`P?TQ8DuO#dTN;hS{v#lzh@nUy@yaC>5E3sq^fUweah${D;)}s? z^?{^Enqprtn6e6#3>ey(`*)Qq*Y7kVI*otL;PhY_E75vBNIkYYx6j1PJhYaqD5hD$ zk+1|1OjWJyu#&)GNN-@!E{o~n?v^#rX?Axr;FW)Pte}2n|`42TE9K6Yj z4}k|lcd!YHNYX|lHU&`y0^L}{y8WsLJyL^lZt)06r*3HW{>jhS*pqgXrEHz*(q3_i zFk4QTRY79mOXR2Wsh`*D0n4;7t0LUR>x$-+-ThYSSYO=x;ea)lR?n5lqD*m+&$;V) z2@g-hJ7FCCy%Wk9aCmk-1Y#3^Gn~a^zq<@O8hKvR`frv^8I9T=&EFAdiD=RC2EFBa zi~f$SVN$`Cpp#s!ckiHGmZI6~ja_iMon+ z{Rdh;xt4uF+j4T2^jfoYR5^{`5L@qDlbW8?bTE(OB7SCkbCgymAzov1 z|L|0LUj}zP=5w}p)q0&3AfAnk35|(=78TVS?>iO`Z!0gyA5=H@6?ay2G>cYzh2*J9 zAXI^}l&FeE7WWAeTbjM)6pc!thNY*^*4uQA0C(R=?EU=`$hq+tZlbHMqB*Q&*HKoK z;~kZ;zugh!uS#-)P7j{Yy5AtH3zx-Crgw4>(y2G+1}#f z!s2lM5ia-Ujjqsp@C$?=9)Tl3{JGP)}X*DA8>SFjb)#FWrL-IN?Ix!G}O3bs~hq`1*0C za=E!VIpuf5rKP0-+d{Rn=xmQ8I)D!9Sneo$Hjm3a-?1|CJOr!H00)%c_qxW*A!$&$ z9P8M6HB=T(Oiqid&ph@C+5I9h72XlO-4V@Tm$8m68GinptKg8Y+gAAVW=cf!zETNk zOcZ@`XL|lmdtv5yE9BTqoIgi&ne`t zC<1y;8OeTD^$ZAou8sBDptZ=c@B)E7o8}o6^fh{=Hf?E(4JTa2my^;U(nKQX{PXbD z(S(&TUFklE$97sDT4;!3zC0H2|EH5H@B8k~#YAAUuHeT($ zt{CRRVNd_q_?}w_oDN_A(QCQD)`8OG|Akli`P*Z#}8gP_b zW;lO-Y$Y$LZ+vib zG)9oSBact^FslMw&Sp8%G*{(3heDZ#X+^@zdwrjdM4?(BGQ*newfaAx!P`1tqa5N=rJ ze8%|i`2N-Iq78>|hrO#*PR!jrZXepoDZ`9?ELLZNHphQ$>-4>R^UYFCn$gyWu2ZM< zEvYjHU+)W(Gj?1Gtt^}+-vN0rmIj$DbJI!!SSbWJ&6tm3%TO%VS)9W^=Zm=Ul0?Nb zVXsU{f=C#Jd?@i@5H$>1joGj6V_W&JBd*qVOm;UUDnKTwDI4671zIL7hA8ueSW{Zj(c>2|M`TT6)qz}ecib&_17^Int) z8J+PImlTfStu#>Qs8M`b3R+s6M+Bz46^+dK1*&|=pL4E^)zn;H%+7Y3G?!yG?a`JN z6=`YptUM-jAyyg~LMdW$7*vb0(&8y^yQT<|HIZwo7PTO%IP);N3PYQ` zxw^XQD!5VI(^JSF&!<>yOY*J0=4u`s=dER|i%W<@H?9|mZ+2SGt!|EUujL&Uy~u%P zmu769-f_8MtNThfm4#MbCwxPe!AeoVslKzAXVPuK*48X48WW4sh9+~DILxLOV&>3L z%V*TR#3DK)4zSNATH}(MZ4Is~bctr+B+TEF1{&&6mYgsQjRGC1x1F6GD*@Cd^A$p4 zS@*g2uffT3BO_|;rO(;f^^Wn)=tIZWvm@!c#X0%IZE0!E08771TkSK)>%Rh6 z-}Tea57Yh=z3V`B`OK&BY!7R;FL$`9DSNe3?bvj3de(9^SiQ0`+PA!n^&58=MRCS9 zxm%spNH=biXfD$Eo+dN5Ui;qH_NQ4dtH-KAEo)eZSlauQl>!gP z=Eh>$0q}|n_@esL1dLmp>$#7TSIk6wE;frQj9Y4pX^V=AqPt*`p3D>|t;ix4N;7+0 z{)?Jg6l1ju8DJKJ_`9Mj3nU~#fKL@!wKkbDpbma~VzQXyD>=p&#d8Ma<0=Uru_5ID z7J|N+Ug#%~x@gkY3FKka1C`atCxk12p%A6b%1x-8cSJAN3V4u6LKhTBm&eK%kM9r{$ZOyqwar2&Akl(=SDfY+7C@B#l(aZ z?}-Xl*T(Xw=u#sP)#XMr%7`aHsdFdtZkw~RK@`eenGFy@sMv=?SJ50&iP}kBN*HDP zc?$l7dRG+Roc`kc{QNOCUTFn`@$g{w-Th+hbGaaqQB@XORtDDn;5rxVt4>b%?nEn2 z)M}XLlW^v*`i>5(3Qq8KKlgC*b#`@^q95#5AtX`!9E;aB^rxFFLLI3-5D_u@Dc$Yq zBcc~Nfe0W}d8aceLr7YLN(E)#J}zmTY5|7L<$!9CX4*uw&1|ih7=bN)$rnrU|H0E& zheZ``Umu1L2^o+M3F(j&kPt*f7M}xQ#u5sySux;!~O34 z{WH(-%rNK7d(P~4@3q$6EA{lsOPaEfpx*KBQ2%D|?&j{&XG%1smq@ZC=;#zQJna(% z*XCgP_7)t3q<=o{2*NxsCZ}$|3gR@?&eKLEAWHl!&(3Elf3NOjw0ZaQ!2w|#R;T1+ z{--fQs)3{Pv(4o(+GK)4&!#=Q1!iW&lbK`*^}NnT$q06tEwn4Pl&|l`uZ~!|3O8Zo z5^LZDRX5&MG4)X~Id(ZDA%>I`o}eIkakE>K&9+NzBdzT){*zkq@{8o#x;hJwiJcYG z@Ccix@$s2*UITOpniMv^1^atBWO9C~Lx1>-S*JbmwX=?}UKk1F^Aw_DgXAizAh7~FvTQXbLg_?2`j#069Mf~_(!X-Rl?HZfMe6b|dKFCUe{ zM(Q9z(beeb=YVXu?5M`M3tJ>wGj9`sj>q%=A6&7>2cd+;YTfh;HQo4-F-J@sNm8k0 z#8~8-Y4(x;zcf69AlW!~c+ikY}MnWDGkrUv%F@ zQP(eYKKEE7HeZqKSBU6W2v6fqh#pk6GW^80aU%1J1kpD+wD|gLF5SuF=?ILMGZLTR zJ^M;rZhFt+Z13{;gnU?@U>YqnW=R;dO6uwfviq?*evL2HkQN@jQC_0TeU5D6t|8)B z`Itpg{fKQYtTt6(6E9!R7(4J^Qi&FN%u_~r1G9c(!z5qFHPy*q(v_peNAUrkN`!w^ zAJJ3gBjd3xP;cl9Mm2N9tD2;~aT+fRY_`|0*K8GfbcNZ8-i{m3m^r$8P80qZv*gxo zh|eB;9VJ%xyTK~p+e}416iaS$%A&x0(#>yA*ml%5UF>4p-OJd>>X#ZjH>b`^=S#KP z;iTl`SokPa#L*hJEZdhaK^45J)VR_}Y5*!F92qO66&G8b@YM6ulouJk3e^ZK?1q+)%ca*k4fF}{Zh8i=BQ9_rdec*$F5*|c z5JZfJE!_*Sev~JR#(fQ_3PZ%CA9A8WH6Xtwae!8%JRKTJ3KX$Uh&B2gSD<0hW7R|{ zI?U27)>I@sBc36Y;lnSn`hfDjA%QY27#jwJ-?CK-;#)DP75dIN>6PzB?Tyjwn-i3U z(BT$q(H(^fUAE=-?3fC$IeXEzY=rzt-ov*P#sw9l@cyzDcjmn8wJWVH_xfi6*sUsT zYm=@>Ugb(ST^H~~K&?5%5B#BwGX@y~$h-qP_l0o@0 zyv`VSSKWp5!wu-?3PJM%NdV1MaBN-Hh?xfne=+qoh=NNSSHUEBLhC6&Gr*k?y5fLT zV`oQJ*0BdbBbSy9f46`9-Zt~IN^cGt9GMF&;Ocv?=i?$sGMn(jGcBCGvQEYq-H)11 zgl3(3Y=-%V+g2x7Xmv$=YpA~^*ELKAN6vn{Q9;I=d`CIU`s;JL4DT-TE2nzy9!I8nL{7U6FSZPQWD;|*xQpEA zpVf8D9q8kJ#%VHX((BJ_%4b~#`uDBWM8=0w6jXpHtNujEjuQPjDMM}J6Lf!LUoRI#PloR9{5GP#=UxM{}$`G4DIWJPS2b5mje`B6Y{}TMY`8B1e}(-IkBHi9dSC0lBj?y~b&gUk zCWIBTrRDmMnU|NfiG{aiMEMDIhjYAA*^X1Y5ShK?EUT}q2?aQc&4%)=hJwf1AC8vBd1 zDN9!|Avy+Q1@6$`PD(CaA-q<-qNfRXtsn(FBEt2Rqj%c2DjpsvWx+)e=hYe($Rrt^ zGpQBZ!XJd=ojEK|sOnq%ftWglzqQG?4e!SDai=bJ<+dW1rT~^7s-g*l)nK@~HMUuC z43xkNO0fO4^XQ^^?O=s2v}J`M1BGM1%^0_4iTy_Q-M2+miWMOBM*;?;B4Jr+Qh88BF{sWDXfT5#5aqG6DTX=A+Od({6`8h)f|K|*T@Lz(23KlC)`S|^zTpO) z3?-8E(ewnO3GHlWB>Xf;&Gz1==o~X= z=LAkBIy6b#KstOvZQRt=%`%qQpS7-Q+in%b4W(`i+m2rc(zW%Im8TFVF2-I9;agZ~ zKmKVTsr553a;7KAqRFAi=+JL?xiL9C9DOn@mj9k|jHIPzs%(6q^#WbJ#a$2ofuML2 z*^GCG^O){jVbMoQe3H*8w!d%FzSfDS%Gyrs1}hSLXhm3dx0seMrb4iwbt1~FBo zSZSC|c-PIlZ!Z+%?1nwFqVBiVs!+}zQZh0Y78db=TF(oIJT)-T-{n3yNez|Bvfuod z2Sb(`cSK5M?)$h4|91=CPer3oh~_&Zi-rqV@6qC*g#!?bvm@~<5ls4QqL#CI|GgZ0 zyMx7x(MzpQzbz`dguaa>f17#^0hZrL9OEXCv72GyunlhFk%yNMbwaFAIsrAmYa_=Yx*gYj^_eNSF5 zuhpA(&9X3c)_hU8b}?g1<_Gzh zPNmo{?RNNW$1{Q*CN$DyQowI?IKg!R~ueXiz4PkR_1&pwG zf(Y?SFb#-_f+fi%ivh{+?}*wp%pAPz+)UaSwCB}x-}J&|p`9j<;)?xA3=lpDU+7Dg zFrc&L2PQL6j8`qtdZb2=ZS{I&VPV0c`a3@*Xck~;72c)!Z91R9HBSYWAY~ffRc`CL z=u-Q}w9AM=j<+U+g3#PM;OZf5RiBKLs4@D!p@zI^2`_qq3UL>Z^O zFHQ3!@=}aZ>&)HCHKPN(Tx(8CtT;V z%WdUr>;t%B#lwz{#zl9tN?8Yg;|3VC0}UkSnQ_aJlK^1WFRC8Q+Q{peMY^3*{9{x- z*lw?z0!ocu$3sd=3Yurl?%mAp(NIuy>1*oh-k|0#QLgn{x*n(77p)T4tzR3CkwxAo z`Bgq`cV|9#NN%qUo2r>pAEWI#BBk%b2O-Lyi@83RxrmBMA)mF)%}wxw zr*>S>e3SA=HbH6RA=o-(hj1l$c|QM|K>WB&;;Iammz(Z=8FjlJr8Bm3;(mXWx&0s^ z&!d4fu}`3_)vXg0qi_rB)!z-L@=;h`Rl^DDZlB;T+H^vD_At>7!SlbUL4$*ghr_S| z8EG~E6T31IuLj2U023jJMO=NVodL(u8Ow`rxxmdOO(a!?Rkk~;B~!!$7)^AQf0`Ju zA(NHlwKSiezS^w>I`8U|IH#g9Pvw-gS-p~R z{cK^8{_l^5YrEnr3z_f8`X35-&tDoo@5ZJ=^(7oOEUdp*=y>n{sCR~z6YwRD4OW;A z^GIckWXKg4<5PWxX*ge1mIi?4kS3d z7oGe@xoF?u-~xE%n4~iDzaPZd4?G;*I^mx7x%-qc5-}39kZDzMx!xKjb};g#P{PT= z#O?g=!fOwgJ#p{Vi4z%qzMRyYn35>*({X;5G#dfISVo#(@5v=o3e>P=I^HfZ?i3W5 z$P7e=leRAY2_q}xd;`S`&k*Z~gF}3?z6;2g_r))f_yd6-b%i3cY^x#wP`lN^RC=xW zAx^jB!9Jt=WKIxjDTH$v#x7}q?jKCQmp-}M=BF)2xkxfKa=p!#SGkJ6L$dLb56aJg zUJBI?LVkPuSF6-SlTOE8r@1biks&Mt<<#j+;sO5+Xt5jk3irWL&ncuKJng}FomxB9 zkI-G+b$f^tdnz(1u_Kpc&1K?7)X{&6O~wa*BX^Wg3(|QqQgn*u(2T85QhCkwy7TsZ z`NmMP{-!~=p1wXV#K*=9Hw|iX2FT>KkukG$P%6^Oh1=nWOB`QjIN2or4&Mj9X94WqVxLb>=-M>5+%Gg#~L*sht=3{{;qo`h@sMDC1$% zBQpeQuz&=^Zx3b)1Q*cfJDZhbVRhK!HWUT8ttKsTAUOQiOzWR%q5~ho9}3}eV__H! zu89K%9>T2tl5B*~E=rT`a;{6gjQD)DJPn1V--F{HVS!tZXvI8l2;sjp*dhk{9>yP; z_j?~Wrc2x|mwcV|Zspi(;0UW#{pW~-CR=X8v9$CUagdfoBai6Oznrd*dU>5dWhYi@ zKBj}za0qQqx;Tn@dH$YlrDxB5qpi31y4zvCr+7YBJ<;mjLW1n9^s~uv9J{@8KvfQ;v~h$@jNtRmh3U$(!fomk_^)a>Mil$3n%`bumxHa%T2Msu6rLF-tKxyz zK1Du$Qx9_v#xvF8FNU+@y_PH#67rOQHjG6i8)`V|DkJc*3zu-{Yvn}EsT&3t|X(xOb6o?QWMNV}Om^%xaC+n~K?_a2FX z0fM607YZTIR^_HPjX~ZEwojERTrk*IZ=1m6Z`%Z z*?OZoev}aV`t?(YP?-ibT6?L|D+?DBZ-hr-oasz<3gD~8fbEHt=7u?2jq}m@0<9+H zC5iZteGPo4yV|tmGhTP($Kx1wo#{T;Q8Q&hw;_2AB}V(Lj?(k!TLAa$Of8fa)#Oj1 zfpk$1BU8%(Kd-8pgP}d2VML-(;@#@wvy*aD=)M%O;Vx}fJVR-8S0C^1pP< zF1~kO*_Q67+Y@As=YN#N4%)zulQY{JpABK9TMf2~R7#7gsg6h*Z9P5j<(RiYK|yBb z=K5EYW2+b)EiFlpHQ4+VmmxSL&J(-!5P0qQ0V?4ZS)_rSK z$fIlm3WuNAo{0#+ba#7GeY(8xg|@$R zJ151qCiG)cYO2@GmcD+TTJZYeO3&lRkIA0tXz1xR?1ISFkdrK1&&pxS-1TZmNXRwl z4hBY{^A1pUcz4q{@Zi(+x&6RVA?0!szd2a!ob5~ry?F5uxH{XLD>Ek`6hG?a?=w4^ zL=@@j=zLF3*3!~qPk{X~A_RihyI9f{Vwb^FI25x(ysHIm8|yuU0I{3nVes(hCA3$( z$V=DV!K}AO9X&lgFgCW8VP#Nl{i51#?j_&`E>}Ute^!E$U*dYdb#xN^E?s9gb{C=l z!$Ev_CF!%HtJ~6p!SnknO^rVDDT>yx>=DT)d0z;wW-OCs5UJRhJG>iTbFNQioUKWlqVPO22PHRHRXh*HM-gU*oPh;VH`}Oofoa*@@hJHVVs7|V2Sv%)7 zZ`gvSMbYW@*nl8`$l6pFwgRLabzwcnapQ zrcclN=9>6puQCJ_3q~#+oboiRD<%oR^?E)={e+TI>$hjMu3bcUWW!?GS2B(fJ)vLk zyI*C}1x{DFj`e|1*Y5R1k@!K|fw_`J@$0xH5}(zf7AB>Nz4La9oqlo} zFYj9iUQV_S8cIsYYQjhYJWovg1r^J|rF;GG#`bKzxx3NjH4--;(IcZhaN@cJA?T4_Q=B_&Nw(L6X=giWc+eP8{=(Z z{aeqp@`cbB93@Dur?}-%-W1iR3XDc9ri}YH~dJ0f;@nCdM~RsPK^j$@#PzGY{V@S`G%<{?;UO3>Bu-1B5_(ox z(%g(ZJw46LR=;|0eD&Uc;Im&?yL;Kj^3om*WHh2K1qB5bDE*UPA5vd9ntl3Itye_* z!eRNo-Vz_kAKPlYs%->|tq5MQiO78RAktNhJ>fBn()9uDT?zcx*w)R=+|A6?-0dls zHyR))C^&o8aE2-<_+5DQ)#u`?#6_IMr=vchbP1nZ(Da)?Yycsc(s&-$D9p!qc>h)~ z%THVLI*d!dPD;N>nwXeCae0F2-qn2(2Y&F}d)Q6?-nCM-jyg=Y!E@s5=DvUgGq!PW z-{5ayIS$m|xh{9b0sHfx3B1o+X`dy)c3iF;)32uQ&&i=051_rCe?aT8%{%5y7117b z-5E9QbvAQ0>#+wy8!P%(75Z1(<`Vf8-iskD1r}gLrdRYOxX;Wn-)@}%EFEzJTL!Ls2Rt`GU-RQ!iF%L_ zcCVkcs@MfL84#0NXbChcyQm)U+BNq%HRnixCFeBWT{WgFcY^W$0K9lK!^6XO@mv1` zn{Nr|$?E0VFl6ZuJRZdNvjIX{_#*JY6+ zobhY8pxIGge%#%PqB>xvu7 zYwF_5DgCQUYV_C=(C5(6{Pr#yrnbtRleZ^bBiaqJCO#`-86NQzsu50Q8Mqzoe=Ng# z3=uBsikEes+;9pCDs{=HNhBIjH6$;0V%c;a5?^ci^SYk|5dk+J^2KVqucz~^5@;!z@)I!Wc|;_dz1VgS7Cad z!-`cpj(yHj-Tb-AH$Hn8ch7nU8do079X^)0D2f;a@18GDyp{*=uBjTq4R-eS)OEf0 zR^o0zx&C^$cJ2;*`uVKBY99aQT>1Lk)o0B0!q0VXP2wyj>U!mRMZSU7MCA3dlnN)Q zJQ(_pg^2BofoQ4UX;j!7M8d4$CA@wltl4V4qz?&$FB!r(C|FZ+i;6}%!(63{Mw_0bOo`B6$lh##8lF$oJR2LDQX3nzv@k-sEt;rBB-EI<9cL}-sl z&!R0EIUS3ELnb~C|0ll>oI!v!iVjkhi6XAuL6eY;7YcBu3&$Y|?@U}X(P8y9q?azuz!Ui6hjp*p1SYbIog z+20?0O%mw4jd!==9;dy%z1!2(M`8NcixRMp)M9S?jn`lAV&f>eJtlg7uy$vq9L>3> zomE!V+jx3jN8O!A-7PEMF6Vl0=FVR9gPPD@eo#T}F_0?iy8buwtnu#V_3PJ-2ULw{ zz@Gb9?Mn~~yIu!jt+x`FgJ1@&f4icu6uW#MX=y$8n}r$ZQq9o5D|*Vose7gpf3&vNqvTF;Su zy_3ta#`9{Le@(xpe+JsLPVj1rB^ zig)kPo-IX;72aJ)+^s#3IRDR=Z@frptS&DHMNz{(?$-w$dkt5+1U~1j;FfS-9su(~ zK1V_l*9!!9;849qiJGwgQhVoLKYM;6!DKK@gFWO7h=#$;AP@|C6^5tUQU(J@xQ2hX zDx<_NOtNMr^PCbNHb-(``U)23Z4dM`TvGsm{q9G)SH}q;FHcMq$T+XIRjieq_B~Vt zWt)$}czPsj^HU4QjJadieL|jqTBI#9PV2FHcc2v8ma}NYXi`}&iKDSsMM=rvZsppl zi*TA1Gb-=`c~NFQI!5X7Xxowc5v+N7`*;CCfCgc-cQrlv7ZS&j&*4okz42R09ftg; zQlYjRlSM65L=~dB9N3-H^ID>$bWaEPz{ypjuP@KWiIyR`63uI0l+so&W1J->5bDjg zFaEY&i;C_rzSLhc)=0WpN-I7wfRVn7@1t$aUjm^Su@4_eb(4}h9iHH2QZpe(MY=>r z4)^o*4?_2DcR!2-{Q^E-O#fLKNhleNnN&dvs;Nrp3Om;b3YHkVV3EV)`gW2z@Dj+T zPCzjCHtxt=`|H?yy0g7mM}xWBvHD%-FOT$>g!>1xs(_}Ry@q^MyBW~5#?EUCbn5E% z03_LRwNMSW_;V~6qgEq-{v>P_NjS7Bj?G>#N9?~8{Vrbtvn6 zmw3GlqjvxkJ<5i{8*@=c82aRUQ}n_$!)lR#7AQ*Y@L1B%&=w}XVA9I~EbDgUv5>{l zJ^_&6v2J9WKk=1Nj$Q@ZOlG%=l#utcsT3f?5CYF=X-H(QVqgMZzmNc=tsPnwdd1C- za_Atdc)+3n;*Fr(JA@YlGam#RxbO8f#yOFVNtI1dkYCe(TeicI27l5_L>USGw_uq_ zPbp(htbqIwXPKArdyG!1*ju(U&u3a)xIT%1I(uHc6kyB=$c9jzM1*}^J=+x(7OFy* zB*uBAf%C)Sw^qJj3Rz0u=y{vQE6h|E0z&jTbKmdrhFE5b7}XmE#1Mc21D9@sjAccM zT6&Va)gVx9D8_=1@l>}+?O9DEpC!(B4#|Rw#Nd#mqyXZ`wac`mWg91_fXl z`SFsUrT9vCDLFrX9JhZV-)udbX(GuMjU8@qmHE6)ok0{Pi>681Gw#-HWtlWi5?Ebw zP;#J3rdcKWL;WE1&APK63R4BS*!=m*uKr^6!4vOu1c+Ld*6v-T?R`4QeR=ha`k<-;1emIKaz0b&b_z*9r0TV7$t1uCr4%ma+ZY(b~YA zeFqI#zZFA&sON)eF{e-KXOL02PuWJb?QT-%E>gKx`8w|DhI_;z>gDD7<)u4y$0uAY z{;x3PSi@R5YFUUSG!^%)Lw&|>MXTt*ZP8&m_V2=JBbzYr*1wtGBUK}ilE!LWu z-R92^9JQmf-bQ)vI;Quqee3G#(yet_d6dVZoc28>rH3V3jU61*8>dQqgIfio_^;k! zr}MQmVL&`1VK%Ul5lx55o+rk#?-@mhl@f!dTwE%P^e4= z1_@O_&_U4PuuSTQa0EWxp(NCZ86zxl8~}*;o?_EW`Uh}EZ1p`C;{2zLFh<5k6+R7o z-o#ct#PpzPvNu}+qQM)-$Y=6%fWr^XPzYV@5_*F-`27hHkj({qufkpl@$FzA(YCE? zfU~DCzAL%F(~cPTC6maonaNLw_5Fs+&B-`rZ$+Xa!LPYzJL}&gzbffA81CjE z3Pl+cS`%$wx*u0g*-}wZ=xS(emrw1e^WQCPI?tWefLpiY*siW+@~1S99p^EP{9%C# z^~V%hajY9?lHZ-gx$Bl9r%tzbJ@OS5BB({2<{zgMwUf`C=?c*y$_1rDIdm2DT}?NI zhyIe*EdEey`(7MD5e`|xhO$B>pT<5#BW9rEA>@g9&P)Oi$B&BdNnqVX*;%i1z9CLL z`biMasuIlgB~r1p+o6&B4@A2sR&tF7A22~NRr*$^Gtv1Q$YDSNiT%-%G%|ST*#F=F zj9PC2l&ub)m;S>pDI(T+fe@QfQkT~Eg=?SSopp~x2m|54KeHtVo~}^L6SI~G@>OOj z4#3-{70co~o7Asf&la}a1Ql~gEClLJUnc-buBYIz`zeYp2%s(B%ZltSbu$FL*)MRH z9zR}zPmp7rb|YccYL9=9+q&wG9eGLgz$NLC#E_7Pu5lRp%{ODSP9!tVID8i4vo$7p zWp6vB;%EkuZ?>Y9^(HI*8|Zn%TFrKiAlaAW5cb{~{Sejx^-&Ri5q_CmFiIwkV#x`^ zUcjtFo`3r}$21g0$FSY=@sL6?MD_+t1P!mZh0@nsod-a}@#{1ZCQIi)(WZa+1c6N;X@YJ}~F$mZ=|_-1t<}Af)&6q8k$c%sCW= z_P)o$FVgJ7yGj|AwID!gn?f)g76_^2q-%7>!;VBNY=5jQM)+p%zW4>H6=~If)`IEo zn|ZZhj+EllO^$w}v9$IIyX21|R8>jbEzLZf5Y)w$m6Xs2Xz1$dYHJT`T{WchL+f*Vr-X{+>;RTUv;!%Do!f zLT~G;DFU&5$wX7B;3>OCudS#5$J;=N=@Q}#CCUE2$|uH7LUbafk=c8)Jep4<_#eDS zLUBsNaLFc7@98=H0Z3&=h3V_Ud`TSoVvS#T5#jW|)bmN+Jbd_Sh$+#RtxY#&Iic2M zC1WeTWpdW*>XE+3%=SNNSFh*0&ZC{go>4;@qC7h67m@OEoWA%fUdCRghI-lde;)TK z)sJnAz|w?7cQbUW-5N^D|5;TECaQ}eAOm?toIibUN_*gCJVT73!iq#6*osYlgsV)p zC3mWH%WNtsmq9VGfgnzeB}`ilyevjoOGu}Tf4j#%MTOrhd9Iyy2RNTZ^q($~{uMhGP% zaB+`bk8Jj%iwwI36yKpSzW)-3}9Y&L3|KgVetSQOCx+ zjRq(M;@rbS1!SYgY-Cfh|LZ;!EBQ;5Ui&lk5T}jEP zg+TYp5BMWOsuVfs&CBP+tc-+I@}JV90gTQF9_(lh9?epdkmq!AdE^r&Y;h-E1gh-x z5&h-;e5t0IMqD=T=0B%vkPlLep(-?p9wtUs6oPE&b=t1!@H zg1%3^c>rZ=Jd|BtW;PW`e@_gFb}*HmO^KR8m};vL_20TE@Nm6(bM_vf5BNw#U);e66@9EQtg=mu$7J#gVdZAsaRQ7PZp zM*ulrI}tXqlpIs3z=hyN#Jw_XYyqr9#lQwKFt1C_Nr0`~D~Qh*zT6jrWaSsr5Pk&8 z@kP^nv6j(y-FF`*@WlHGgA8LCi#%qw9Q1ps+rPcbRjOZoUi7ICp$8gp{5h)wncDsP zf>qn@yr=QHr!D~pedg#JG<%?QsCU~Zl}>%ga%+G#t91x)3)E>Cq-J7Z6q-&`r9DuTziPV_)_s$tud`>Ik<^uH4GI|sS| zr)&q^m52M}B#yIJ0|6#%N<`=u6uxvJkEIDQypzkxNJ(Q^y92MRWy_rFGX!*=ou`dz zv9hoRfC#&wKq(8Wljsb%>a}0}Kd_Dj4J+l>dnOHDBLAMKA+?gy((>Z-BiCF#2w~PPxr^X<0$+ri`e#aYr?T*U8}@N9(?AaLB(H%^Akl;6jp-hE)5djF-Kky)kN+ z&1da-Egx!1b6c1w1{t5vk#AX4Yi`EEkpR`UnIMwu3LkYy&UqN(BGfm;iH$4uN`w7( zA?1_2i12W0>wje2+%8k%rIOgzs0ytN4jQzU;=VYs%QwWursx6HHpq~yN9?(J`fTsj zkSc#QVOmoH!|E0&wy1BuI=KE)tW2HJn3ByG%$JhArnp{v7|ggBm=Zi%u35J8?hpVY zzLkNcYYoh^`PT+^XRACM9DZq`^nQOVoUquLtjN`2+nugPfMW95N%ExR-zSOM%;q^X zW1yl*+~@Y1L+=2VZZ_D z(us9AHh=hufz3oSa74X?yV0g;BFC@&(0`DK5Mh*E_oC$+9uPhV-cTqrez{@cNPtd1 zr=`!ccP((%o<3F^4OHrhGz4 zODiN(WLLl_2Y*%@ENeoj36p$1e&&%Oqbdm!)6ciA`*b>wd z9dH+~|DYT(Zq!H`h{UTEn`auiqlMVMH|Q}{rH?xa&nB0=Q0eA$T$4GxmC9hsxuNYY{oSB^ed2)8Q#I5>MTmP^$ONjbr%IEw#Zs2>2 zNlQ}?AA)OTOkAJQqqT;@5ib}I0=1Ic>gGtN~dW;M}l3p&;xXTKqTZHW^^+-z%>wK;W zOvvn4dz0>=w@+U%0qU2Y=QDfWXG249@*vCPRa4OaLL1^o-LU78cGk;30KN_q+b3A4 z6ZPdU6@opbs4L!{Ql;E?oTMNpeD~Jp`0bwOnrJJ}wf^0fkD`J?-6Bbm+uhZiK1%(r z)#sd`LaWdId%l*M&KOu)fGo6a)fDaR{+B9vU}dE~E3s|E#p*p&2r?1I#>V$xpGa!| zJ-1=!Ri=R$7MP*zBBjZwXn=i@lD<$WO6H))U;uw5h68EhQDTRk_tHBM{(A!Kg0c3V z_o?2goC4FhmzRT4FAqDP3e7mZYxs(qS&3`y)l58b7aur!^hE4@0mSEY_uRi$oHpK$ z-PM4$a``&!sw!O=8~hcYydb*qcZYs%{s0;Cu$ z@mW7h30FDpCL;>jzJ`J))HfuPRZ(6(9rokq%OhRaWlCe~+}zY+ohMIX6zXkTO?Z<8 zl-wh;t~37HI&UK6l)Dy;KpIO+|M&0To}XBc1E4duxieP8xPHL(Col9VJ(0JJv^0;2F zNP~0Mp@%DNP5g2_tNj}YJ?um|@_^s$#NTX6EeL zm@G0?>}2|IGj)4@VNhAx+PSy8whKDl1q{@R+xo z#MhSK3=cebr2sN^?tiNcrFTVtH63wG?2zz14c)TBxlrQnmDfVL`cJ3^^E5TJ zs?W;OYwq%n6nlJMrI%DMIt8?SPYVC0icK7fh8FCg6s!r;#0g{WioZT(4ZBazj`l%d zOwVJdLVFtv*q*8axyKnWZ2Se8gI{7+7ywRSOX3%cN63HoBMrdFAdJ^4RKKCP;_$-f z^WK&AB4&qu3(s`TmsXzMz25ZOjr7~52QT-v8&9#`n|RIpTLbkrt`&mqf^ z9N>%o;E`v2&&KGtst3oH4e8oQ_q4APoda*kgS72HA>zgS9C+d;nx`I(XC9xjPhEyb z|HoQH`m+4RlziQmj8ZoNpqiP)aJdd=NnhqHXHKTTKXk(f6Z|YGTL^d!_9%~h2W}WL zW^k}85A2T6;UpEEDb&Xfv9z>Y*`63i8X4Z*qOWZJ)Gv6G_w0OkT%*tA;BXPSf(+z0 zA4rvObg{5-GjY=Z0t|%()wDPhf*?UjI)_=nFSiMw@IKzF%Yiti!`)PSXWz%^4XYEA|V5gg7av|Qd%EFamh$) z*3-AP4bBc$o<>IH6NN>ETpS;2(u~W~sA;=`v-GrBzYMT%moIWYuNgxV95U=xgpe2P ze6hloMzbCg*epjbRg8`WeVMAr*u;jUKrB}-yML$#V~z8aG39enK*Icw0F{!y@BT@w zt}r?V=7$i%DNvG`6;Nyvrl-lWicWjp)cemw<5}Y_e$iVtm%Rx`@M_WuyJe{4nb=?d zTT)&|3|BR*ziFzgtTFl)zm*6>4tVd*O5A|V7zkMR-M)Tswv%6fg0d6;bZ7#Cwf^&$ zTSa?LB0eV{e4IftPusS7r8DNKR4~YIv6=3MW);UwcaFtIikI(sx^t* zZtgVC(|T5uaygSFolK5^AATXZ2nyH zc>Vgl{6+|FUPXbFEiKvtCA)R z{^qEaq9fg(y)S4@TQ=|AI!GGkKyncG<)Ph-vUa*TV^E#x22MxG3u%9`UJYy>^%uX? zQOq-iLuTc0O4>ZUi1;uhM25;_MRt7$rPzik!5OGp)^Jyo!Y7}8`DH-bk{N}z`*u&3 zK0clkspvc%HY{+Y^Wg<7g>%EiJ~2K&AyexQH&)WZr(!SgeQu#IRU& z-CdMzxp{R9#-!cvD7UfNS!a@FG~ixt67@tp+2>l~w&U*GmC^M*8$9}9pbzA0mpfyw z@n1o&54rCg^w!3#D(-(O9Fv;jDBHH}PQsctRJBl3wj*skWXJN*#YaS`>oxoX(E+O0e4cc~Q@6;0VY z1GPjoOOc|7a}7tSd%fmG>iIU{6eHCAUpg8ZP$>l^rG~#tyn`?U$Q@?*=Aadd{-@A}$k*DX9ATH~81OS7KxNUG%8c3gU9h|yif>dosbY_2;H3Nm#VKGwXAR^jemQ(Jttc0Xou9=K22tIb8;fb zuo2kekjJf9$edI`3F@#BPrv^1sJwRYAU85y__RFIIc)%~Ew})Rhfc@JM&4|a7xFZ< zEhPAd3qNP1tO;B21fU@))9l+OnHchoJR~OO)iF9pdeQUF8~TETA#iL_%bAxlsICx( z1sJ}{(9qJOprE+D9rGMZE&6Sqr8hUOkq(XuRbvM{cej(GZgx8KEgflhvl_}fCi}~i8^lJ~c!17UzFt|nk6?y|NIpHhz4S&E4QSf{ef{WC7O>tmG z_u#=ENh^B#FysALO6j1cnQD^1Sv~{c1l1vbN?4I&Pc^6f)=5N1!>I;&qFwFE8);6AAY`!? zs-URIxfZO4>5Xy*PpC0NgDZG@=>k8q(viJi&I+=je1yfomqSa!$Rry1nf3CbBN6+O zGQx(lp9Hf5H#PU=uoSiw@YFiD|0iuq=?kCYE<o`~Y?}&;7~Ik+f;Gb#6M^*z9i~(XJn->FhAVu>Jgj z7((oLXhDGVLhbDGvb5%gyRjlW*x9GX@n>^i#on44(Mrt%-uJeKmJI?g1s&!oKXjJt zp8FvPF!iq~PfD+A-q@R}C$a7Q>B4;bNsKQGBc@|IRxoGqr#W*Ctn)5PpL}k#_Q84M zlM$iJ+p>h(dQ{QCPMblzb_k$|`T%p&-e`hIN_n>WsmwgjwBEd-0W_PP_F#NfA zRrp$v-sG*J8C+VFPe=7xVPXH-=+~>lpmqqlX8v%&papMhWUAxU>8`yPMUY`)8xm)Zp>`r(p|$mWY0il4hA_LVY{y%fw;hYR zwXD1UkFB@xiu#Yfy@zxNC8bfiyHj95Vh90|4r%G`MnDi4k!~dhL>PMLk{B8!hX$n? z0ci>4`Fx+acirE5{()J`h4Y?s&ffdAi#IIGXIv!TGU*P@nTiufOTE|1C4NZKJ|JRG zm+;r-d0;G`j#j>OY%v8D^HEO5V}R!^LRa32M85hy|2*fp2Du7TjD4PQ=e!dFNk@?K z60FKGh$=^6l9AhUL2fqNU-olORDEonPW0QCO;?TEHrWNGTO!s^4{m<;LW_0-+8YYK zw01QzAVX9sj6qG&csSS%!$DXMF5KD_oZmYw%fGwH)PGJF;=tM`19`4Z+eltNqU4JQ z=YRrlM+iir%ve)rp_6C0gm^Ztb}@X66)D@vfW)|5?ff!?t-j$~b6)>_X4) zu0@|-e}DJ%da2|rYscy~4y`#E@|%|g5JD*LK4 z;2beTVTTo;6BTt^$lLRp?AEW|+nk$e#-t(5*x55VuJZAq7a?p@23F26>6fSkq|tfQ z;1c6nR4y}`sXF;{%bgCK2dXlnOa&_<*jRX?B4E(e@$~DP9l0rmZP}=tA##mLA1o>D z8Bs?a^w++I8QD+;^;Ba_qb`?mz20=%*Jy04p(UpKY+*V*aQd?0zdt;BuTO$9=#F2(&R#N&KF!9O1euG?6eoTAQMS(l#?G*UMlrPJ!0<8R4ohVk{ z+Rx4JWW{8ix7NELS^;URDwQVzYoQgKQ7|5RXw$NO5El>OdXOQ)Vp|d=JwvN_M1AJ= zTG8|W!=C_OULb%iMwjHTNY(M#l;9n7zB7Bfz6d}CHiAsg!K=K_VY zA$P-rRMdj_h2D69sg(oK7;1}2t3&^KKFw*BRvle%7TPE}m70pMr(cyi6#a^2RG-C+ zFUwrv&EUz%PiW<$KM`EN6+hBWii<;uCeO0GvrcuM3aZ2nF49kfu;rX&I5y4`cZ#{F z>6OeJ<@N(o*vqs&+s*z=Ez=qgN?zuf zgt(|4SCCcE#y7UPc?UbNw=!gCnSqoneKV5ME1$}R1(xRC{IWWulohGdiA_MNADtfb zhCAvt^T!)iG7yNVns16Is&MylG^E1(ksJv)r*-wvSB8;;hl=pfpPtMzcrek?q5Mh6 zX~J%ye9-C?y&hCEG{}12187b86#TPdI3WS*2L?S2`&DNl8?frRnT$)rsZlx8dUQkI zbrsT8KIi7irc7$EIk|(YuwVuWLmzfqUpCdaxty z#hBcx^M%swWE@$=8z3ziq=+kE18 zqw(|QS50f(7mDB&V!M3`CQ!<DQCnSJ$h)A60@pFbz2wUFlT8~9+s>f-xSic~-2OW2%{nbcH; zvVNC2Y2||)0l%bMx=ndWlG7)}ZC?{X+-W_}&uqvd69|YwLh9TMXfl0lLZS^Yu6JtV z-;SnC53K)5K4CH$-r}Lfw?vp%zj|MY?N%(67{l~hHJa-vMVoOLu|1mgDU49Yg*cZP z52TjK@0sbKC&*FkjLftT_VYt7yNOHAe}(`2t{W6|GQD*06+_)y+t?wrZfy0CK_J-1 z&94HT_;>_b$5i?@z7!$cgvMyhuUf7+2XK7F!-W=eov$*1k@H^UQ7MQ1yDPD0iHVh5 z1(2exKt^-(aWQyKU0e!r9&r!VTg8Hb=uNE`I+Smj4hIS`(lB~XjeL8AWdP!phr{CD zkY}sJ)=jwNfg#|=f(HgUb*--MU79MI=z0PXD-&A6Neij<ut!q zq(rgh{Ns-re6*^ht@~_D6sexO|i_+uFz2*trsg+$T78EpBPcn0_VLy$#30Dtj~QqeMo8=fTm^5x4QgHQU-fq^t+ zn^OJ^?*Jr~1WKrZl%<)u9XPzFvMr`^uKUhtuitjobRG?T)T9=COlX~}TW9RcAgE1& zzK9`(%Jfoj;VvTH-#CNq`TL#bo9y&N2yJTP8YMJR{Y2g`nu5r&)5#&1^3XENQ|g^!L=P-s^Jj{V38_A6yTPRq|b= zY$Vckn1>loipmb=Z0g7?Q{_QlD3gka#!ch4)upI|^{6C)gTf7JDY#@#Qv{o;XDIWd zlIQv-n}z|1>&>gXGiD>?pDquC_6(o)%SoS%)cLQ-3@ZJX z_-$XNIibC>;}=CJ$cj_|k7aarP(%J&c(Jr&ZuRLt&d~LvyzRzR2YF&%(9mIaNTQ7;#?NXeNH;xOAiiTee87f&no8;25rRUxYPG^xGR zz{SEC5#QUb6RP?@J~&DVTQ#Zf#DTs*3|tvHz@a zep~hLyVKsg>&+K(GU5^)S7k2mu#EytlP`7>UX~vq;&>Ae{dr+O#k7qK4G|hyS%PUA zSBGmKpLcG@2El8M!G@Uv!PQp$ak8i@i{D-+cR9#`?WLhFoG}vVPK7k|2t%Gq7mUfu zMDZ7MgiLj_UX5DkQU5{;WwvRW{cvz+(9eFK!4C>J5S{Tcyx989mdqFfQkf`y9R@#Y z!GaILjMFCVmL%yN|8iX}kJi|+aMsn}#6In4R(4JYN57J&>Jm9g7^{*oAIzkZno8i; zYB%O~{g3>Wg6BF=fRzKE(;U%D9MzmF`iS{p-hJG2)ZjQ_Y1twq+rB&W5M5L4XSAZ~ zgBS;9m<(b+S+{*~gA80P%RwroQSV-(#zrcnP41GMKJ6!m5KV(;g5jQF_e*)OiKDgs!0^sRCI^MzdSEyk zD6osO^mU97vBl)5n>Yh{Rk+>O+eQRTlqFzE{MOUg_1w)PWO+D^Gb<~L1kk&tv$`lj z#ayZSJK@Darv*p}*rtBPxvj#bEs$ygvh1Kpz~}c8EG#b%IJE+rml)G%C#g*`vDDFi zsbZJrFQAJGL(i&*SbmiSh9f#jzqP6cKzwo)8D5j(D{(rre;?6)3?c@RM-4Y&4l^Wh znMw_=37go7#voiQE_~838=I&-t_-IF$x3ikrg6OXJ5A;!@h}sR;t?HDB=&%zwm=Ni zG)OB60^WYTW`y;+88%3c6Qvjx&!fB+Yp&?bm&|Z3#(ra974kp}sRh;6Kk*F@alF6r2kI{*{CazmiJXRh|ZP&)&Z}XPS zMH26LRMveUHtSvIgiYS|PNOw;qGSOxBJ3phk3mfEUm>v|>`2V5wc8MX<~tPX@@P@s zfUh9{ zTS|#dfX8a=;sV#-3%aM;cI+BKPw2ShQd6;ZO`(%I@NE+vwR3_h;fR7L}O$#MImF`Z=SmgVuHqmGXD z3&M3ts;=MLf@-U@8`O74WRPjAp#oeUP_EPl%x z5FU3Gp^&Mj481&eBG_5#y9LzbyX{z;DU6@lHgtQ)4^87DySj5Ef6Ku!Xk<8VZqycK z^!1S=N^(9iM3~n~y7(tv;ciP8<_2cK)8x>(rUyeG`lBW3C`9e^^iow=H%kh4ecKTR zgpavK^PSwL>Qx*#V#4uoK%jYj%8O|+eAVrienT(;gpQ+vl5i{CXx{MOjmN(oSk{^z z;}iVI7ZEozOdA{jaH5`q6CzU_oM_@;21y&Y;Rr+7h#wvKS!fF%e$bl|K|ynYj1g;^ zCo;ZY3@d@mE(M@R3EmfmU7FaA70QR4KA}?Kqe^ULUOH@Ehs6Vd9Z;>$uFmAyv-|7G z0GR@4D=rAA)oD$ebYhH+%|)t0W8+`H5nW*MxY{%0H?}>c9xRJ{2etJP6|FAUjXJ(5 z0AAtuab~jPy*Z);@HQ9=ia$}Z_<3&$MW+WutBVvlw9l|u|AKdwtV_Y1j^Ik zjfWUx6Y+s!4PI9ilpfl-1%-8*3S{<@Vx@{{PvfTi6-t5SnQVmmK8j4~&v(KJ(t95W zcS`t2mNg%N?LERYsnoR}>GXSpq$kBm%s8y+a|owT(qj!RN(I78gbHfRm~xENGxR!p*@W%^Mc z%)DrMvcK0r->UAo{KM^QV3V*kgpeJN2lu-vZv|zt zzV}^M&y>jwVStU+E`BmXi3?#!o5($!pBen{mY$*IXv3RVW5&12oPqvpzJ)PF(S;w1 zN32&PD=#c9D%u&EiA8P@u3IJYGWAV;Qc{6x$jKc$&PMH*KLa^+3Ce2jEsY)FcUu~~ z`4x2uJs|=K$Q11C1#+R!q$3wJJ$sZ&JcD{8!YB?WEma(fXhk?5MUUho$A9=V01)Ya z@4=y*k<6nu-%zijedqU$e*y?0z0dQsCYxNts)Jsm7X$w~f!~3a&bbxiR$l>*m*fjy z1=mlC^DIy6Lj?E{u43~~BTg#}+k<|8kFt<;Y-qVX-~5nH^exe&m4GWv5re^87`E?K z6nXcU^31c&egBpdo8cFkj-@!v24k~f=JQ>4Z(ap6yfW0G8~~WkC9Jk{MY+ch^n*tD zajgOAzH{c#DG~Hu3AmddT?QwsrVX_eDj3l71U(~3mg!f{ApD#(BPP-2qQ#rYnr3Nf z@`U7VNpp8gW77$e^TXq}J%VxLH%p76lZUdkjwjQxFG6o-HaA&4f;Z{g^w8wV+DQQ+ zQ}Ec>x$W(O_Di9&0nJ1%PaFT8l>yG&aYNuH5AkyFcK%}M0#L3GFf$FZ)e6DNg0N5W zega^ZtSofi;SJ>kULnPEM#RfWFQOusDy+;ghJgf$n0U4Y!djbKo2v}tnQ$miq_}BN z7be(i35R>B^Qc_m7HH&a|FG_T>*kdjx+Qo&ebK>+wv4#^)vD7@1Tsl|cD3S!+u`eF zS?*wGcYgM%y~eWUJ}=_zCA{{}Si|JA-#tc=z%j@f0T{KG4=(|cWMtdB)AIhmd>vr( z0;Ic|sW(9C1h5Yxmk*thKvuMIeiD$e7Z!|>rmvv?Wh;Q_2#&IHU-K%kvH!bJyWd%; zvjt(3g?2}RQA-hx?LW)^U3{Vr~H z82mN{Y8>Y)ne^p~qE)I{HZeBlG6DkLJln}ISUT@^aM;@+=QOy9D*<25O3o`Nr4?GV zURvBJNxHfNmUmel2p4xr{5tf~)!Q{$8~jZx=v**0a+iX^$bo>#C};ys#-OjU-Ga@| z^kqyBiWO-OiqwZoh{#BY%G1N0npbK0vpCe$t^kmB<_=MQaCKIhNsUX#dwqy*`(`V= z4{b?rsMe{Ekm=ey4Q_W-k;PciqjpZ9fV3Z#FvA0idM$i*(V#^wItDd9Dwyb@H7{#iv?MOvl#P~MDwRP|_(1F-! zJ)g(8QjxbPxs9QISo>dYAttH+{X38UM<*(EBjoEw``GIwiFqX~SY?doj8+YT-`*=A zu;n0R#i>d@@Mv+AdQvw1=*d@y@%g)Lc(5(&Xg$R5&t9@*WID8BF=xN;!K1=wet=(4 zuCq=|UjJERfKmBeqee5j%Bst=y3@PWP~iFD!}$ceuarc{C3R?hR?e4YanlD~m=?=i zI~gHJ?EG((s*hh-A3r4s&UPLa5gNL3rEEJ)^4_}cpygTAm>4ZKH>2HwFCB*H>@b)S zNl*$7o4i;_ueY>I)4K9q()g)4nz%%CiEIZJX?-sLyoc2WJA(O#!2kPCNFc}gbMMVX zVY^jhT~qMC=~xJjfPi4k0KkS7kufu~Z~?w0hAzILSC)EVdquW=eaN>DY91!eL5)ut z)Ci~ENaz&G(NgtIoz&?IFCatED--gLg8X}Y*!%4AjDC4v%>ilWdW0^$+B=k!RWsMe z5leqrvq#%P`hECsoML_VvIa5D^b&^2IhjhygZ~=U&?hItMYAto6zJ-^xr*gppiZZG zgz{xWel*`NdyqVQ_(?vbOc#9ocV+ie&`u5#iJU3dp*Xo&GA+?lxL6qmcv5K>!6kt0 zya%ZFq;+sdngSVLYQT8c-Pq`R`3o2YfHxsCD+|bM6zQtZoC9EkzP`Rs_jkJqd*}Nv zC!d9!-dz)+&3%%0@vg#m)ByYk|K=gpZt*~y|7jnho9RZ_5HC|6Z*XhtRG=8ZF}Ni*xU z=v`<*WGYs&kX9?lXPWn8=cu!~=K@T{tfknrNi)NyJqz}pWifx>NQsDQ>AT_(Wk zg-VJa>gg}_tQ@qPdFSUdmWTf-I;ZI)V`wZ5B$8L6xZgG5R|dbU=vbBh8ebG&8Z3J{e0Jd{OwUITxX3Q?e!(`ub?1-EyZ@m<*Ic z36X{=+4j(|RKDE*B2+~a$ETsa#u~#jnfUy5La*OS>F(#1G3)F3|M3P)DAN2{?FR@f zALGe-L`qUDH%y@MT*Pm6d^U45%X2T_?&SjP$#MUJm)r#exYv)H<`u3J?u8|gXZAIJ zs`nX13#3M-1Ks@Wt^euUh9NrZ?%wQiQLx%$FfPE7Woc||PW$zt5fA-nWdXnoetdb9 zf0l?G+V~l~3G6!#OIkWf+lI+hdeQ<|lFO?X7pkrLGjX~JOyF2ueI7S)QRaG#^fZAo zFkdn;yw;CKQ}47FRO9G=O%Ge=+|a2(?;%-YRA^lr88^5clYbEn}t-wqYOUEIG_6j}Op-d|n<}`-4KS zdo45SabEX4z2CP59**-p`% zg5AOhI9l(wj629;;8grF@sQ7tA+?R?p^m8Wh_j5)$WUu5ZX>W5$78682(_Svsf9&C z+L-a9=#5dUHU$mx?JwT;;Oyi3>A$9q8PHgOw_APuApTG6Z5J0@OqC+%;^GyvO6GpY zn*a;R(fSp{W(80_1VrnBKa(=tpmGkkrz3c*o|sI2a^683t&fLClO}v7`BO@_cWZ0`cu!LO^gdg8_7*R@y1z+NLRB9(E{_8hSl+F_ zq+pa2OG`InW3XCdpd={O0I*>O$hhH0fi!YKwUp$z^;pcM>C@m8CSnscp6!+b9W!qB zj9FFQB3&jXDOjK4SW+ah;=GO3**E6thun+<1 zN1LQHVp82mcEzZk>^IsPgkxN|?lP*N+Si~VB7-uI?$wPv+Yra0vPaQp{d(;7WoZKg zqcfsuU4nf=V8Vaje}7+E;sMc=BoE(y010K88#6am&qmmFk9BNIj{KEN;XPmnF|)f) z(F%6py&iH4j>7r_6&T&|nkplYaec(%@FML*3Ca#10!q_h0?IaIaqr?Vw=CSH%9T zJEZPP`+3p5@R?7rLzR9;S$oq@>?~}L{skLxfmdJQHp6GfQvvlHgwz zwp@%+*nCnDCMc6muwEt{_m@oJY3RNbY?IK&pGI%16&1-vn!T6;=ffJ3F#FQ=>VItO zqPk!r9l?56#%-xW&QdME9kcygcT(I~$alAze3_HkVTu=j1V~;HS#M~h9f++;%gP{a zt3~9lk+zd^Cu2TVVL~)dJ~^v-tsDyI==^!K=D7tf4GGo2jA}-Y&j6IqtHE(xBR)d&^FWQq9_Eu^6Vw3`4KY9;rdk;il!__O)V0{KBDf{>WHypC<~2NnC*d zlW28S711DXRvZ-ml~hEd!Lp{gtI2zRWnZUL*i^s=PONWSDO#qUm&|8kZq;4eGNd0n zFbxDwK5m$Z%w? zL~^Y*U~(-vxN{l9CnzWl6P1?E;Y85cngehNNsUy158F1gA7j1X-i-D7>c|3cy~p=n z{q=9}Y-xFuMEmq9U}ZuWmZLG(g*C_%^N3)F9f05lbdr`TR+QGy@4Vs#g{`s&;T3W+ z8byEJ&X~I%xCW*bWX2qF4hd`o)V;minpt_t)fg&aq2(W)m*=t%^N(m9E#k8PIaWjD=rY&N)UW{0? zYgas1+bxNd4=$v-Ya*IgLIp}GpLfTw4~Hb4D!z7LQdHr_ijO3B$@z$?_7F>&!^q46KbW1V5OHf|W{UnUx&$U;mjY}({KmCWJg>2xuw> zqggNYUN=74Dy3JcX)NvI1rtVL@d*jLozl(Iq@B^*Ez-=#rF%1~!8LO2bFsc(eB)K$#{v#1>>qK~rNi#_ ztLo~C^Dj@gKSujp-i3B<4J`gqML(slyhcu?K6UQVS|+d4*KctzZ3hm|I;tkXtV+>< z^&r;T)Y$UhLCJ@lFZ-TNKEWN7e-bg6x_L`o&rlMIJQ1siGya#Nve7nmdAYTwNANOz z`qQjDyh%nxi|r;w|H|QWuT;CGev@2#(_+?)R7hk=6|=I+7z+srWL9Q0mS=tbmGJ*L zwogRvw!`wU>Qj3CEGWVG&F!L0*fVznM5BqC*h6GJ9BzE*zs^5$S>IWny>BNPsK@uX zFLEg+3Eu+Z5Cyr*yyglCwy|=;200A0UPV;mM(?|*Zw3}C61?cV!l?O?dD>=(OBs1) zbr2E9v}t+HlnksywPd@kH`Og*3DIOF(DqEZd>J8WrZ3G*C4w-C@6g`|u1c5-cS#2- z2oHzY5{JeL2H7B09b;WYDg(=NXvm>MHgN+Wjr0e1Hqqi-MJi zKTT#HM@>fm!56=nx;N2VZUAG!E9Y0+o}F`)ko=kBF9e{F?yJy$o}-*b+mGC=_<O(n`7?U%wl-{h(k#>;jecVjy7d`UVYsI`}Cpcet(a9X^8^ zaEt|}0>|x!zCKo!+Ll^#zE`S)WmQOECBn9EHBV*<3TA9*QI#-4jCs22 z80Q>E8>`1Pxa5-L>x*Zu2QO$wBbQ@SIDMttVMoI7Lm4yj;LN5C?A2xEVfTbETcx;j~VN zO16HxZ)EV-ooffaOsp7ucUGOdQ(eJ{q$x;HiRuu<9{yO~=U{B#XSdx8AC#n?G}b=^ z;eN-gG2?TVwJF8>XTuPx99cHw?6>5U2}d*L=g{<#-zdxlPLL>b{#&W0Be4v(Q%g6C) z@SakQ7$yDUmu8@~z&af^g7yGjy3P%)KYhP~yi#W|ehRLaLGj(wn3wARoHm`)il5-cH{oSkU zzF+?ERJ!B1TGlFBBzaR^h8*`WJEt%=hwe#rp>zO>;BGj90DhMoygR-99JetuNdnNS zeFoLODreN15}MdIV|+`3!OjCP-pNVze|>QC)rS_ocp_DEB$xI2k3OQ|3pcevk(FgRTIKTXW&F zkhVqV2SCs*yw&)U@hP4JU9xGbVa2OL>3>?YiSce!>|b?3(U2k`S@FaqAUpIVkKxc) z76_p`Wf#4$u9KqQBeT|Kb1Yk3)cw)A%9C z>=%kCdciIMwn+mzb-=b!ub=h%%ZHKq+5<8z?=linrKezRQBf>Sp6aslWRTQgL5PBe z8oRv9UYi+_frO21Bl(3{O&n67V0L*tFxS*`MYg7(bYdGFVW#@==2pa%a?hFn>14dz zg8(yK-p{06yV4LQ+DR{3*Y-K*S&T_0+=&I(u+o0g2f=QeG^I-Lwv`l55hO&0<9;3Y zY<=sD{$XKFFv^VTNhrM4CWM5L#akiVetB2o({2HG?eJ$N7Eu-mo!&lq=k5`4)+-8@@QKzbTxQIqs%;6jV4i3EXC8-}8 ztasZEyNfHE^h96y_?aR$wvd+ zfNd(0IC9Lc3QO%-1XVZt|D4!U`sFJ{?IcI_^EkSWWpz@VR}Y_SG#3E7zfM3{Sm)

#o1TKR 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1104.png b/clones/abseil.io/resources/swe-book/html/images/seag_1104.png new file mode 100644 index 0000000000000000000000000000000000000000..a63dcfd6427cbde57874d3c13e5b393bf173f883 GIT binary patch literal 21740 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 F{{i{i&UOF* literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1105.png b/clones/abseil.io/resources/swe-book/html/images/seag_1105.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b4b593e76f0c7f46ed490cbeaa5f87ede86a2d GIT binary patch literal 90648 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

DkVDVh%)X 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

YGv*wAr+TwH=X?IVeo!@{e?R?da44R!Tj71+i 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 CikPJU literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1401.png b/clones/abseil.io/resources/swe-book/html/images/seag_1401.png new file mode 100644 index 0000000000000000000000000000000000000000..10c0bdd6842efd3c11c94f6cea92b23c3640fb96 GIT binary patch literal 12768 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 E16

Hq)$ literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1402.png b/clones/abseil.io/resources/swe-book/html/images/seag_1402.png new file mode 100644 index 0000000000000000000000000000000000000000..c999241c731c53cdca238615a1a232da9b24097a GIT binary patch literal 58458 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 z%0AU~^;(jA>9f&kIZ+}S;_-!#&mOoJihTDCSk@G(2c9BS#~?nb#)Uq*jQ{cld6!g& zzl7^6K^|NBo62aWO#ka?GR&4dO4^ry#0LG;!W33zZybnDESyj-mEGRuJ8z^P1Zp-g z&XA`yR`EG#GyXhXhzFRV6%J6B36Pb2G4N7<_7`MdN+!r6_lSS2YEu#Xe0rbP5vP*= zZ02O$Po~jsezF6_3&{^8VxS560c~3yY4!E>5f{pRp1pRktCun4?#|<)Y$i<+dqMnl zQ(krQ#FLBPquDe0+2*lg7b+reY7czGiV6!sEMS4|Q2UCVogIh-n1~x;(1zxhJa$nqf$~K9#RO-mrTu4(xqK0@C)2(Dhz8IxGww zU;cx7(@S634BB0>ocNj%>`Z)pvFroSW=<>P)?21JnDmKs4b zi4_#!dcWW`BZ=>0JMzgC)0mHHDst z6Br`Q#b!XQ6AGQ(T=EYcMLn<6ZLeJZ^Aqhl%%9?^D7Z1j)^RPXo|sD zT^0xsJbKP2YWx~Bi4iL*;Rc8GQkNWDMd`DawD(J4GsLUn>|Gttb%Trt@n+=R@y<4|KFfa5|1H$?Bs z0A2wJMw%WgP7F@+3++AsaxV%`zWfIQXS%inj}-N;R+ zqztg-Qk{23yV9XEHe4d|70HLKQLJhp2AC>i zDb5g2;@V=G`%fx|h}rN9u84o`mno)Kw~>peJpXD31{G#z0;a*?lUrof_|VJS2s|Ng z-MYocS1tWk5t^LQANUJU(aJbDlx1^1vNGMxLo+Pi{de$kA^M}SV$yDL%4}MLCp)!N z>Bde;quus_wB52U{@7~;{%t!-$zD6(b6s_B)%|N0*5RbL$ZkV8JzuJG5rOCo`UHDT zH&H$G1F8|Uf`JMYXLMwAEPPj!rm5bQ=S{y4fOZv z?S2>8K#hTB)mr`W!e5M+q1wl0Vyxf;)ksNCQA;?z??-gbtKvyn;yn;v`Tc3ZI2_|j z#rtw5je~8;9ok!Vl(UU?t4TiR_cOh}?*L^4AAg4&@0RDKeDU0%wRU=s4(~Cm8mKKe z7UD1}0-$mSXvENkkPci#!u)+8n(%R;#;~_{Ob_(=XuMVG`HSu@lqbcAZNpnkxjfq+ z+`oQw&YtttAO_&kY=2*Yrc!)QM0%oruFzfw5AVz+6^B^AhXb6%}&u+KFBXo7lF5C-3QbS;(Lh{`NXvsNo?oYBF^{b`3 zz4_6X;a1NVhWePj6J>X5Ha42k5O$Lb_IS%9m(-MK$)UvmV`lz1Anln@u!lYs6~!RS)Qd50mtsp;qFD0HcL?jJi3j#SVG zQtD*a<#g|47OuBE z5DnBkolhq+-f`!h!WsAfO@tgt?zIF!^3}ZzR9SF#Oc!%jNaO{_#%Us;8-LnvVf*uV z!Qrer3~4ps&P;9FGV7|VZ#emI(WYte%~ST_aP05)TldeQnhtHBMB(1aG~i-LM|W2N zC$NOX-G=M5Z;7Xtu?cXes^|aPcK)*YwBg(5=AnIA$>NtsC)vGI=UI7qanaG)1qFZ` zEU`d7!UC%U+$*5>;SAP(FqKe}19kdm1D;YekD$%e*kl_k0OCq0jsPz(!)=88+Nar< zG|ZmctT*l9J_X}RsG{Uugk|=u{P{ozaA&~X=B6SYq`vOLe+Qre?!c&;0an-V6;Jwg5pRbT&VxbwV8vU2Xo@%~_{&cWc;9_}kxCe3H^z6GV`Q#SHHT4r{ z&;yPukQFc43hF%+&jJV=5L_>bFMW;xXB|lh2ZRT{A|>0uog$S9eSe@q28zPADZoe0 z!C?o0YJk?0<>7TI({C>I0b7im&_ssUyMKrI7P zg6Beg9XlDStr)G@%Mrb$H^P*eK{$zrBqb%4ku(ylNHRLyl8-YmG6I(}!f6VwhmS#% z88W_)wEhKBP_H%wZxcy9d-e?Qxc3neuUxlZf?j{nPPku#&>VuchVBzcAT%`-fb!o^ z-@x184n@~=ue1Z_cPC5%hvNcb^ffQMOq~XY32##lAHVio+p4CQ@Pkf)0Wc!a#xjB% z8kCZfl7g-4)AFyY#~f4uj@|3sH~bg8OW8y%LEH<+!7eS{KN`V+fH1M`6+~+=sCWHg zFc(c{PalP_ov{DsW@r-!6dOnwlBEM35Fbh)d`_>fHiKhpWcvIFr*=_Jfw=IsSCIYu zzd$=Y0YwSB1=wy4l}~|>d+2UzZLY}iK;0Re00L=?W7At7Jsg=0K^O49lFw%s03cDD zcDaVlN*ZKhX!t%pezD&5@K#t!#jx((nRcPI!hECL-QmarkrX%TSMNMII&hS13V7T_ zM_k!;pE_%xd~Th^^fsAyJ2RMW;o__&=YYIAMabS1YTQ{fX^OtvFT%s$$He4tW)k4t zS5wghyyqGEsfh!3Ni`kp9j8<03*8>^ILvGg4Up&OdzBbz{YqsxuN-)Yo?}w?+abeX2)ym z8{x?TNnVj=kZ?l+JJ+8I;RUo@zJ^^5O`!_^AwSJ7z7C}C$$NN~f~4j>wY1MPVjRc2 z2R?=#8T#fr19@X`1n4}9wrSp{6g-;7@eiS4JV8Jwt3=6fCEsW@U?(XeDWiaB+ zj3naqE<}VCdhfh;_8&Qa+u%zsuW{_Lhj6l=d1$yBLP% zzH3`dY3@LeVjGh9nc{vYlPKGGM~B%+$rqbV?*`yX|DUGbJCN%B4Ie*5c3IiNaYA;; z4B5wy$_^C@*<_E9y@ilOR#_n{JA{l9lD+rdWc}{b^Z9+h-{-&Qd5-sZy$>{* zq@*A1?LYfhWnJeK_9h+fq3FO$0@{a~u-Dd{9}+Ba<3P|@vExAiJa9ktT6K8p?dQm6 zP_$T{)ekXK31y8a=EiF3>R^*ZfH*z{I`Mzuq~WLj)64J)Xy?_~5zj#6XaRO!0WSfM=q&0uTL zP3nb(z?mHS_Wyu>4Kq!!B*^x!v+gW+a~y7`QprLgDar%LP8XiXurW9&UtbbM-(!SI z>?wOZ5<1{e01G2WLd1dUP8Q6CG8~|9lr#e2>EyM+M(Jm`?qugFl5`p{P^7YoiWSJ9 z5caFP`WE`MaHU-aspoOs7OAPJnyJFjGa6+Cf8!A*}{MP z`V`|Xp$DG?6Y7Cl4NkKg5QxZ(EpEepiy366gQ=Oo17!%%L1PNS00IdZCaHg70dS41 zbw7ZP@+c#y0uSKp{DhgejPSrr0T)T=q&V)(yWs^QO;5Tama1TeZS-+?w-TU&#kj2Vrv(K2Uj3U4*nDct~evi}jh z?dY?KdPc-o)*|zTc>uWE-{)k2xBu_ozX2RZ(ZSGHB@0<_3G-Njh05NFV0c)<_T;)VvtIK~w-*+9nO658nWOOOB6Q@8(9qF5N}>x0!fW}$)9FL;Tk)mwDa z0c?;5Kbp3Kzyz3A@E^1r_XdV*`8LC)14!KvAVp9CD=1jlAK^0}3JM89s|F}CQHp|j zAbtlFN*)%8Z{Cc4i=>Cog*nk&2!N#o<8>filr+;Zzk>R<5!YD`1QfS@2HQ2*;S z{elApUd#3Dp6A7NPSJLmU1#UYhMa$f1ztXo;pQf&v3_X&kV0luLEp6$SAn!XCvUgX zsHH`l=odCY>!7uMLxXwzgq^RCu5HS0kNRS}I%ytlb-U~p`hKfc1&UeDcfy|)ifnd{ zXI?nGM)i%dC++xbDT%w!yZ5Ml^>XZSdb{wNE4u=hfN1sXg2~n6FRbEg{qKw zAWx248h_YySz3I1>52A;f8f>a@P(l#>A=V|^j9#KkSrtPIEW#@2Mck8-(J{Ev|KQ~ zlCciHsDAKG;CSz|;O?=Fg;F7Pn%kE(}-qnR zKZXJW8bqR@ec}zD!`ZT&3wyy>7-tE%Y0HJYaP%XYt7#)E1ru*>T`T87KV|ND1eMj0 zZNa05;@zQ+ZF#i%r=;O{Yy);RlVSr__z}LSg=_!X(B(@1S$y(aaE-581_p%S5z^p& z_SF?GjMM3;dIb>y4Q62z!`z4f^P?M|-E5+AoI78FQ+BE>?W0_9f59!u9g6yEmFgi{g-@PuJP)Oh2O z0?MJ&aDzPiB7kiZN53aE@FXn3xZkL#B(cQY+5O*=KfnWW67?d66ql$^Yg z^sK;)5dn1|5q2C3lfI(Ih|Ns92;Wu$IFG9htf#YXBPx!$`=GLbT)6-ma6DSGd zGpf2{Wf&uh=Rzi9`-q;8b@6T$Vaq zd>@UCP+q^Ci8sO?xyQr^%?rY*RbjQ9!)j^QjA>hs692tLl4ucuJToss__4orn}#}3 z%mO=uhmJ{i+wE0SiegxDto~^paW$p>R>i_;fIXK8q0CoUvHqjqphgQ}+P9zfq+XJ} zoCm+L@Y6o@Bf9FfDFaVJj*WSeNHC!$rWF7KlGDhKH(_-&im+?iOxWPQ(U(W!W3CdU z#>N^w>0)PdlreO@Tr9L_yOcAj^Cl3^DLJq#l_~E~lgUHhS}hJrXvH9+TbwYQ7&zZm zxiIeG$v#SG%ZfI;4MU7^PW$L4~+ zJmX-o36rS(B*fl(PEUUH_C(D7JPpcg4;NG?X%Zot3L(oGa^J%Gy9JXGdci*j-4#qa z6zL)#G6WA6?LT2;Vu}lN4UHdWu+-Dnk~>ot5U<{GtoHi;>UtcFABsCK9Dh0)w6yi` zqn>acYbz0Dn{Xj+Zx^v6>Z1(9k>QUb{D@D`*&E>Hc6vXQz`sA(-Q5*)nn(C$TZ}H26SwJjDq`#VsK_OU2VPvb8(RN}-u(xq*#9a+bhF znOg#oX~Bic7JA|f+TF}|^T=k?`-4Vjmj|p-6mC#`0#O&{eHeZ%W_Flq=MPYYgMA8? zU*D3Me&RjB+mFa-FP9s@{API%yTQwsFA<+IYrmA0-L-Nee+gg7^11OU00gvr$az`H%fB!D;O8l1do?SED@|n1}GrH$zlUUgk zb$a{aPkF`6OnbLar*fZk@Bcx3O)vA9`9@OO2kjxWz)oAQO_ntJBrBY_dC^%s_ij~F za5t#Eo)I_m6F)9D2w?j4sATgzi$f)UK$}v*O9@*#M}-bYnwOkE^uz(9uKN~23w1Gn z!?u?RX8Hw^)vUt56QfDteC=P8L-Lh9`O0iuM;o6*gt{CeDpd}mJ2ejMYS z@3u2#3Flge;9xf{YOw}g>gnj}61{Ui_2O?c;^(j7FCS~aeU>laS2$nw$!=9ZG@56| zNweO5@?>GV)C%!h((^ew^DaI);yUy*5=GLsE!1QQsn>)f$(=SY5NsWYu7KYfREUBo zvZ3qBjf`-_9Rs6R#mTRdV`a{`y=;fShtXv^;Vny3O1n1Jof4*}UcB`H<*Vq&=(4&+ z!CvFKAqDt-dqfEHI_gDkW6sbsPz^n=1_T32<}$!yvv}~mpTfobf#olZzVz}}Q-ZZW zyc&M8gY-3>ifo|_M1EH_br-R0f9KL91 zV7{{Ff!SYDQ1+>tJG$65!l_NBck%~DRpiq&7T#)glyY~>9Js|WY?P98mJ+`7Z{WPm zPpD6-OnTTv75>swHRI0a8vBak;X+*gWSpbep(Hj!X=eno<%0O^y7-mXn=rGM79IbEkZ2+P~aim%I1j9$S2exhMm46E@`$xopN zhKBUpLu@HIN37xumwfz^HjW8TOwXE=!uOKZ*rLM~tMd6%yOEY`;~K7_3=kS)UqD+F zcbJiH2=bpW_L}nJ3u`l{Ggfcfw^)R}e6zUCV@8vcF_pXOo7rjctg`c&xan)110^_z`0=OIPjB%*?8Jc6;hYj(b0 zR*O+$4?_GYQ8cUqLF*|(^akay)h>AEuJ%9 zw&!N>2d>$R#E;;Hz8i$eB&ncI6sCCcD$th3qAXe$B`|Lr(`6(#)bQ5(O_M>%? zw>%j7{x~~NGk{)#noD zSl`nrGA)N^jIpMnkr)^LGPd7<)wO*IhD&E}kkss`Xww&JgqiQ*6>TePE_c&5jv?!e zVLvS^Ev<5eC2^!bIc@_T4WfT>(7dYQ@NZxxlv)o8y4W;FB-=OHtTbPUbuOx)rT9M9 zFq!pJq(t}zH)n#1k5|IO*ASD~9k2+j4wtW#v|Uxz(D-}MQ+T>j$Ic*!bJthv#K>;r zujj4VThgvm8qYN$2!`%z&Ell~hqB~|r{xCG(kIH~!Lk|lmwmU=WD(2_iyhWsnK(;k z8IiQuKPoTu5-6OJy^v_FV;idQFT)AfuAM6+t@~_H_}9>Hq;=cwrD+h~Jp$3QD2~mb zF+OQEBF9%M*UnStc@|=rzL1{SlAc^A7rDd)iX=wpou{O<@I7p~J^E@ALz%?$x=L!> z%c{&Ffuo}$Mktw}ELD64l_pl@&1Y9mXt%48FDm7)?!th}Q?~}>tsiER!1&cAx2I)r zgiT1@tGw1uRuU0vVjs%VRl!JIe{5{!H2vcKmHY?1gP?teeI9~(eC)=hOzjV!N7j%J zC1p0%Cs**l>ibK})eAH|UM69`>~#ZQkNQH8Z^?9#UYIbll!Wmel)rIN zTY*sWG*Im0vNr6}xx6>Em~I%&SBgmYRQ=>8Jum9LKhiDn9J>*uCJ?~L*lyoVyB?Ma z3NU&)x?1y5J#MO=sZFlHE8BQQw_S0+pb7o#<>Gs5`W51`WvK)>DZ~8I#LhyeLsc^f zFZ`82s`sr|tI9LJXCZrazJxE^;xC;&tOtf&p;Zw#?F6U|4Qifk@W};_DjA17`?Ig# zrzJB(V{WdX4xs8Oy8?f!fq~fpe!Q_B5v2q0T)yHzevw|;Qu;5=NbdF8OZ)RLr z&?6jG4|)h&ux!T9CFhF)FU*JT5QzB_)S9w*z20eFQeB1a=FB`wYS=zBs~Ilb)o5gcqC;VxZNb~e8SQgI_6#}Z9=H#l^T zAYjq4Rx4ca51Favz0r|YGP35MJ{xBy?iP5iM(GxaJ?A9KfaIc9XNx~}Jgid6A4uu8 zu#~0H6N%;wuVz zf0rG#8CV5bSxp45e}2C+<^S2ND&}s5#VNQr0!Y}RDX2)=u~iU`bD-kc`<@Bgw|B{T zo9Oz^{kxOrTP|96SdtIF>*SYLSL@4~pafuDkYCwM3}bMQ$EQ@#FVu(T3!3om6E^+7<=YjHrl82Z;B8=`q$yCN@C>NJidrfvL zUyzHB113Jhed6cS@#~u*%P6y@jdi~94@4tG)^TwySLN}^AAUI$_fYNJ&Ht6#uK`q`{Q!GP6R?!<||FRywZuNL;zYbaJnEv$o=e!tET(-k_T zRcAu#^pT1JxV&jDB1=F8J2>1x)M}N_Lz{(+wOb~FL*R4$)L7MeB})AHQhsMr{TDAK zMpXe@0YL#ZRh6Ba@p2MHHMFw|s@7aLOnJ(xv&(rRygNT-RSVPfcou6B;S|1hWi%Pq5Q7>%VqL){)|2lK4y! z5%jRCYXLU3nz5cxaeYoY$-N$9x2cz1U0p;I=bs!p_hVe&7AG5-RF;3Pdg{e1>Cqq3 z1;AiLMDKgW2#^kihcB;G1Q}9dnZj7of7gxtQFmk#)Nf9#obw|(i7)=c5Ws)^{r!^? z@-d{2WxOSoPa>IngRFDzaUR(XJrlOGUSoOY9su#vLfbZvbET50a{Gbp%MpW^e|j_yL-1C#87`1QKIionP~1w#_=gTEeg%TL~V2wW2r`+WMu!tBtHRL|=% zo!v&*o0}f}_`E4}vcGQ_zM(b*CGQoIB58koG&Umcot;4P;aPmQg;TLlqhuD2rm@cl z=HTY3`cn&jHV;odPp?Ogc#>fy?Q*}p4f`8OjS4h!cNUv(5L0m4{hA=tPjs<^upuzO;z#+LHa{)Y>FoXyE2%YhKoUGs8M4C|mU$?fuaj??@?1P^I#uT`Woz{Aw#1fO znBx1X!1PyH%&GC9JMm+xL9GODG(x;)yM#aVD!6vV;qf2*2=sSe2>xv^-}>d}Ta5E% zv9pbg^KfvQtduR`Aq}7tHaeV$-SsiU{DJ!YVe3ww`|)kj&8-*fKRw(Tft^}PP_XRX zyW3WVq%9Zff19B4&yJKL6j`q~+&-hcXUWWw@V!yRE`F`BT3T#qUK(%Ao9KOg%AXCP47}ql&Du zatEk+>m3=2N6LIx)4!pu)pq;Fdu86V`uqDsD=-xpC^u#Tul8^)&IFzO`|re2FYeBM z$QrOZY9&4SO3fF)!ARax`JQ6+;%)BT`E{I`i?Ped=^xh7p81N+A!a3Elk<4U%4{2bB=_B#B4!Krt-u>C0pApK*V7H6_a3} zHJ{!*#hj!TcQwF$-qAJakEVYz>a(h?WqTdNgi`;?UQ0Y%(yF~En!Yq3qV30UTQn3-#l~36Z=#GRM;fZTaly`CXy&U=So#79s?Z29@9{i*Wcv+3VA-R@A+8F($Y){ zWT6%S*Ko+zeiuTBrfHab7TiABuWaxJofDR6GVT*v$(@bMmwZPLs{ul2U?D|WHGvjE zA@3e%lYj~kdBr)FC3=TM9Ib*4NHy@UlDjO4gIG-zaq`(y{m>mME+l9y>Rj~@l6HFG zzWO1VP*0z$MQhF7VsjpSi4QD^H9|%j`@jYD9FZ15;f_&Bf znIr`*JoXU94{&FI@@~K|jjWtV<%uKSBeft%AiM6@3Nc~t(+FWL9KT<`v=MF#5B5{z zbF(U1FQW^Ii`0}vnZxy9kp^dm$V&snpoKRym%z-p$JUo($Z9I?13v}jM;klJo%g|c!Y zrE`381OBKm<_xp1fdpU!2YiOzy~5bx#Jov({t&~iVyr0UUSdFS0--nuReI^+si9$N z8g;g?k_Ui(eZ9S~J3x5H1<}?tg;c8+?tSb`l-S!Y+1R?3!#(Qi>v@aUO}VbPg`+Y6 z97<|9nS*}Bf=VKHrQ4z-?rySV4M859IOO>5toa{`3op3N6ekGVs-1b5<{PQ9kF_~l z;qN2Wm2lTuDIOhN3~@&Kh%NAWiO8PHgJmx;M{JsxJXy>EAuahB&K4hPvfIl_AmtKP ziIyFAn~8*#UbC)p9^$=Fv@0~BNjcaG_iJYl@sopB48M;$X zi16xF*wSc8isHUeXHenct)bBa7|+{RfxXvJ!kgti_jV_p#a+bH+OU=JvFu`J)zYO- z?R<|%z>mR7n4hmF2+f+pf*8IRV2I(3VP!F3X#uX+aC?~fgpS#M|S1q8;{JT2GwgMSq`(}K#yVRLK`q$N4AIAJV zkB_P-1tv9kPu;2?ja@|iT-m#Rz2xASUfJxC8ud~60X_z?5#CvlP_A~LupaqFi@Es! zK(WS;VJZ9j`^=san@#H8$f>(nqbMfniX{iSUnbb=S%15SD=Jh0PEVHd_Sm#wMxzLl zd550~2QL%fCJ3z6EgL zHS=4Qr!WwFyOr8)A&}f}Rj!gf9R%P4{NX93tDs(DcV{Q767ai+PXO)$NWdlk4hQkY z0Jp2^{FNaqFTA2!t~#a!E|K<2s2yED1% zM~jmT2d>8x+arep-^85W{Gdj>aB^PR|E0K1+CcEz#92HIPT4l@ z%fJ3Sejw@ZMwLA&Uuu}Mk>kiuJmatu$=tp3JWS+C=c5w0)$S!{PD;W9dyW_V2HV0$ z{FUfz?a(gKxi@&lc^2V_;rj8TS+X@HQ9Iv8AP@vy@2YIEn(^6g9SkTzd6Bi0`ChaajaX zav=L@R3aPVR@uBmwI$rLwJ&<<+pWJ;>&N=RCr7+UcB~0x(*j!Sm2okQ*h!~@Cq&gFEEW znH)U?q(Y$JvMe{KcOqT?OjK=TTW)~6{>*gV-MJn1r-p*s%1##Lj8SUh^27AV)cq27&8f(+$>&l$yuzZm*t zqDs@-q4;{(bp9*!{$n&VePGZ)?Vn-Sd$Yr1=fr1yp>V?%4j!I_4zu8BukDPr8Ri;J zFWZzuY3L$t&1T18GUt%}e#3c)fPnhP8?iF@;8?rS%)PhoeBn40ufo-2^K|us*7gQkgVHal+xJ-o#>hpZ=^n+PNo0AdB$f^vf-eNLY98F#WM{P#+cM*3P85L}(sFc+{B zMQlS~MjtmGjdx73rhEOg$FV)dhFN(A{gyOg zI{!A|q!djjlek~`xk5@Z|L0>$XP&a;k$HMIL!TY}`^HZB&9S308s=jGpJ9f{wgA_~ z0L?fD2LqV3)VS9cxI(Ix-xjo&a!b3%nLUO)B3m24OZHGUg%KXv!w4t|h8{aiK8I6b zrOUoN52iPkavBohMxV0F%S)CPt7^}00$;F*r(|Yf0a7wyABWE+OPz3-`&4{{^g6q^ zh(>%?D$^K_R*7Z3o`F=!m0aR9NFrm1AurFc{|!N=`*PR4?kw2xyjEv--k%R0Z^&Va zlQVDIlK9J0$Sh?V@h(WaGhPaAr({*oGNQv(@6*X2n3%%hqGh-gd>G`W=_WZ$q;qOP{V+tk3nfT&|=Dpme!-ceL_3d6q}!qP?rqnc{m`1zJ+z&7Bdnrr}ODA zFdy2>!`S~~{WF{R;$&i}QGTSI6z@0_JeJAb(`7RS z_wvp;I_RnMK3ZzIQxBhf4rh*!P}VA|k<^6ejRt#C{&lzgC1>&IdhBL?q*UOs1{aWM zKd*F_n$-oG2ztq+KnIvidA18x3jWp$NiQ8m8N8z7GxH{Ia--nufjuz?Wf(LLNh$`a zorh%-SV;609%ri9Dw+B1&#rl&de@S7b@CJL%13X@jb8(cz|DCVj6(|N0BR*~HUC*AtX=ym=q;M3h;}FDZL`a!pDq zDho5SHxj-X&qpqOu-QrliG_hq@dZCzBC2;BNQaA%W})RUuoEJHK;2ewvd$wBJ*?z?YSqOMT^v%NU)^BNEJS;@}~iA&c*PY+`u8 z2%3iU#nn|*O&~QD70A)=KC&i75kqbn@@jWu;v7^xxPIn|D)17aK=Fd^1q7|9*-6H6 z!&Eo~M8I<+Z-i6v#C4c4iTL;|+P6Q~z^C9%vUUe*s0+?oO{Vi@GZu6Kh<=#KcUDZ! zQ&y=dPI+fMH_ne2ONt?Hl`Usw_LpbL3m1vqg1{WZWm9E!odRRH=eB-3JJ~pZfCCsirHI zI2Srg*KZQ(Cz7-ohx;S_d#lsl^C^C7dC82mx!uV(2o4)-L%v<>hY3hJ5jFOQjz3VX^7WbBRImWY;7+c={>MDW&HDPG^3T8KC?*!rFIME5ENd#zU4FO z*ypQi6CR@}bw0gy-52ZsK@U(7=vBTiOb|?ScPiE=Vw;$r@Z5RH%#s17sDQAHJRj)x z)e>PoHvZ6E9SLF)1Qg#wnfmnA4(HhZE8B;O-4@}syx&~!v!d8&pxZN$08&7@-A~9@ z_vJ|#ev=M@rrMeVZv+QVBr=~ArG`#)Z7z1^%foK>C6XZz1C_{y#&0|$d|n52{S_xI zVWn0{oqNI3CsR|wOu*aW5J-UhU_u||^7P2AdSQn2Fgf4MHqKlh_`o|H?J@}}<^su8 zefo*l+K$rf@yrEisXO;7G@3_3AhjaS?OVEaF|gz1Yc)1l`r023(^j0ti&Q>EEB^Ii zVSqECP{)b30X9if{>`>4)rvsO;ySYa^<0Q;e0|G(+Z$?nXTC)a=Kn_9bgFB-m8x-B zu&v4-!Y4mKQz^|!wynD+PQ5#VrFn0)4RN@*K1zs-2b0h%>clalM_D5qo|X+AMuh|F7pPsQF1cNz z$32cLlF#=S`ZW_WZX_4pI{ns=D=OqYEiq(=g*xG*w_$@P|6oC*XhbO!CXs$;c3}ak z9!=^Uv#q=f`zsn>Zqyf#eYs$3qr+Yh+MEfOg5^l#g=mNk3V%x`B@mI-v<1@!Wmpa?v3l2%%6xj2W0{h}cnQy> z2ohJIFWp?~PmpBnhgZoNN;`+c`Resbo;MQ-ZuhO%-j#jab#tZ2q@ic+UNCd0pU?{R zk(Ow-wldNVi1qW^c2A$);Y{$SIBL+l9wtB+DX-he^Os$3gnIL@!kGg+o^YyI+GBlT zKE7x^7dTc%2m{*#CdqLWA-<~_Td#?IP~jk+2CH*4oh}l*f`8Ba1X4?kGf&QMG{mB&KSKkN2(MadiXQJZR@pC%(tY9GHfD{FtMe&YM6BTuD~w`|bDk zqdU5vv@=zcv_9OkDmUoS3~L;}2kfyOO1;lNR9r?Nwx$SJ-}>O?8$@h0I8*9pl4P%! zZJr_r0O<84IuMR+*a=kxSseOGZt1{Ek#QYc0&T*IuyMWPH3^B-dtYT^aAdF_IA6{r zGOd}pN8!`QJb=rX?SEUp>ytGIq6m`m{|WuWi&n;VF|^OHm*0S zw!MJh*89W^hX6S}sXTesV5{G0>(kq&WwUp!{hzTl)p#{E<6hC~dEhz*Ey{2ZfQXJr zh$HP9QzBD&D?Xo{EJ&x{wAPtbQX(aY)uV++ruJ+54g}Y zK`?xTFJ*K4KnIa%E+>`2f$clcP+5MC7V4{UwVTc_)@PT>T*uwnJ3|4^%aT*AhSHa^jpca3hb`t5;+lWXGaSlu4Q~dMur*=$>R-s zhQA)kF{tq3xU(a!ax~Mv`G-v8-jIGE2mqM{NE$K=II)}SY7S1})oQ@;Nn4xz#S|%u zFf@;sP`)T5qiHOZ>{$Z&+?Pcgo}7F6%!gkQwLCtdi@`|+hqvNa_qmOwiLDmY9 zR%uyTvm}+jJUi^OL+1T;k<8cbXL&g^26A5S_l|xRof>s<@>+nM;+IM?8tA@sYg{tu z;m_0vmUSqP1Qj1P0`z?NE4MK!l#T_Hn3Ssz8S!N@lSAgm@H4~5Q+kEE?K(;e(2tpb zGN)kI<_*iS%;4m3camNHL(SSc z5~GqhN(viTwzflRS{xJY?1Ry-LKTowkJWo0zdg7t?Ct)n-MfLXkE2Du|EUlN>IwTu z@ySo+HK=iKNWL(E9_D9ctP1X$#j0$hG~h(QS5V?uG)N~C00{9|9laDlyC%z{z_gg z`mz0Y8uqB}0iN`O+`*ORq!VOPXQ2+4uVkoB{@#30SXFL4&5${LSmx^Un)V-;8rAPS zraGV~o{C<3E1_i!COZ zV`)%4=*cCw*v;>AnNp!w$VP}xGO zFY6jX$?~2@{(x2Gh!*wZODQ@3$t-nV=?2&CfJQ80%ol-)su{L>$WRqAIcJZEr&QJD zaYBhfSegd40nnX3W6bb)Z;j&XTcY`-`nr`d5UrSjR+nX!O6C!niJ0<0T>K%A6CfIRW01Ygic!&1JZ3zu&JVk$Sl?%%=- z!5X=$TC#vb#vP-Y=aTn$XNH^>l5I8+IT^@y9*||C64A=a$r#tKdv>NEyY%1qX;cR- zD7nvUWP5KEd>zaP((gu)1 zV81v{s14@kY~ZD#VPG%}uP9yM;(;%3gu#GE`t8{5qVf9w634} zy)5UeY0_Z1a=E()yb-94-B^f!v!ICsU|37OgMPUm=I0E%M%62We8?;)nu{;(hD)GdvrsQl9Hx@DyMy_tl)izXhWtC2wBb`wLqX zh~L&E?c3Y#f)qI^=|0wN85tQU4-|z*dyRv6wAUsl)6}5f#`PQQx+3*S$ z5OaEZ+CC-de|Hu3s554Zzv=Z$?>x4!^BZqcxM+A^j{3?-r5&_~iurQ^bFEa+K1oB= z2%^d#0-iDha8nLk4Ls*lSO=I}xAE z+lu<0G`RS>R%eqVFsG#SX5)p}3b+g*Br>5C@ExFq{U`AJb4}U;@Gx!F7;K9baF)pb z{cke?T7B;lP^bVG{r3F#_iZ|ednW@fN6`u@(#?>fo`cRf=8%Pt&+g|t88}1v49nh1 zxXq6^rMj--{1aC{q4RGc#ypTT6iLRSE%!Wf$_pbI09^w<>}X`-Y#%Hdk}z|Q1oPrW z(CZJ}kL$hWRE|Moq zx*U{{v1_NoXT`!yCVGRy3dpq}AI#^}(QW8J_%)fLRlc6D0{te?@I4v!1B#Owrt`_) z8xUanp6(5Tc;;71Aae=!S)hE3DD*F978H!H<>lp7)RHHiz(~MFvp@rki;Ii+nXk(S z`zIy>RmJd#UXY0W`fp-MY}DSxq*;moMkfm%0SZ6<3G;)P(GgqcSce`*wi5EsbrJB7 NvVw+uk*ulz{|7lruMz+N literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1403.png b/clones/abseil.io/resources/swe-book/html/images/seag_1403.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a75d7f2f0df37ef156f967673803f2667638e0 GIT binary patch literal 63015 zcmbqb2Rzm7+gCjeErk?vjItBQ9_NtN$##sSjKr~54moxkNvAj{vq%w_t}<0&Xk9wYy^g%B@ug@WR+w3W^|=W}YRlBN!JCr!*8F5ylR z>>S}~3JR1A!O_Ij2ItIj31?wtk7gUsFJ@!0GDEZJiKq#vIm+WKtY#ZxJ!q4Q7`Po=D9&xrov&oV-WI3m%$s+II zgkupoDavPx6c%R@lQ@YK6&4T@J;5R~QwZcz)zbB$=xp z?Akg0de|QSQ=}kVeu9Z3JSgz{gKBF3{82l*Ur*zmwQzs(_O}b;b=(|r{8~7?gNu_X z4jwQ!xL=%ZgWkuV1fQ+1k3`ot;da9i0Atk>4KpM;3K7E&l$UO>sE$ zJ6in4rGk~+KY#uQm+%hyTM8etrE@SZ1b@<_=DFCP2NForwjG-_hQJ%$1|0yc3QrbsYx> z+f8Rt`coM!g2E>SSh)18?9Cip@!Y??f>SVY#-Z5+1q21aYxt0&I!HlDK|x6o2|fWa zNdbW$kE%JCS(&^2-J>F6l0t%f0^)x@3XW@L;%xHoJglZBso-GhLUs)$1vDG*anj7n zOwtS~W^O8h6Xp{)H4)|$G80DfnFyPj^9c)zASFz3qQa(v<{Nau`%3nBXA^r<+~)gM z@V>bTQpjAyOn^@UiA3^ANC=zoNr;(=^WlWxn@g9(ghWJ4H{aL7*_&CBy;XMU*lN$?C))8G#+PSVT^>ZkK!i>VOuMBe&eSfuk!!4AQ%YtZUed&rZ1`w4ya|Yg%o@c0zsQB` zkYtBCEhcsvi4+qS5EB#-6$ew75SCXE6&4g%6jziJ6&K!o*VPgS%RwGS@(GCW2?*;T zg(U@%l0xL4Hv+_uE$|NJ&aPmOvKHX@o0j!^w365UwWO&f=pF}^1V0;@vme_2N$S5% z|GyVdeh|0G!{5ZiA3^TlkV*vM6G5c7gvjQSPystS;H}72$upN;_aG@P?`C5ETYmYOXw*Q%a47iS zU+Cj(Z5>?y_vdo9a5Vbu<9{$DGFgA2<0oy}t|rc=mKY}o7stP)?nf;A{WtXZ!jEjp@?#~Ijiojc|Iep>s8oQQfHz*Q_KR-XV+o%(u8uN(`tH+T`&6OBIxzf29g3EcO?&1SS3jSsUs@3IS0_@lB5Yzf^5#*QoH3)0}MOp&?f+C~{+1Leu9zg-9mo_Z#|3wij z_*aTH`TQXw@-Ac<{X+o5{HXhX29Av{e~U_+&u^6IziM^z55GP1gZAG-7skoN4R2~< z`{SVUmw2^tVA$aGKZ{pjO#cvjFj}(ue-YbXn|_(4`@Y-{d1>PL5uzuv?4_W{{^ig|IMm`V*g@Q;s0h;0p!0} z^;cN`59BH)`Y#q0{4Yoaq5X3UK>int3jQk>*bHR<0r!v@{yCunEI+UejO2f?>JRS! z`vCP1Z<1@Xf2hO$ulNSYGC9=!g0$h6U!XXg)zNHD0D12x3Ug9WbP$ykWOWE%N1}ET zXv;dU@}p;Nc5J=bA^*TgZd~oVBAf2P?bw5|2euz1@hB#KO8W9G_4;*M*%vcxr%x%K z@|$7UHOXjDY|_G;n{Uuk=+QYazwoVZ?ux?|bJvcDmd=N3TQ)#>3XA~u5BTXZ?@8mL zl^U_mg6UeRLibtgmULXQlvPu*zRit~X{P1kH$LXOj$hkh^6|0kF($K5PnA@{PPV_c zX&!COwt7jRUD!T3Ik|`K#6zl!%vGU$`ImcccV>n0UC7eh`Nq3wX^3}BFmd4PYnu%7 zniq!oS2Q*6Q=XdtW5@Q!1gz=Em$c&bHL20V#I459R38Z%Oub>fO~pJG6R6mBP-6KT zSA>{D|LGp#!~8}^Q3S`Oz4T^o=6)Ym6h?Qv%$I4NZp>aTl<@v0_1RXT^NFbkm0S6N z$(c7|k}@)14%Da2zX@$$Vqgn*9n(#9;cPx_TeV+9*h()`JtARu;H#kHw^Qr3Czj{O_3Q&1 z{wRswwa?>A)Y8gyU2eU&td`cNcm6a&=9N!{^FAcEw9YXIST)|}r!qFcAHT+eVy^O8 zvRM%0yikMw_{lu;;i~rN!Kypi-(y%^S-Eveo_Vh=T6`5j^lhc4p^;harD0WnBxI2_ zP+kxzftOyL`P}I_U2|h6mAIJwR049k_#3s-(<6NOvt@CAkSRI9a|t>aVk9 zPm+9=g7XvzNV+kJPOt9=G5eI6M0`(Hl8T=?EhiY}&*kC=Ec*#0)3%(;J+GUMRDwCw zh6chh3JQ0bq~p6u)7mPdPa` z6??C)E!PyaXeaqd${%7YIAVOXXrU=jJ5h|Q=8X>FSu)kHC`WR2Ub{Y^t`TkkL?H3)pzGgeDPjEl*t7djUow>zYz!-BhXTf=> z$=`{savl-acJ}Pc^JUw&5SIob9EvV$Uy=6MwP%kMVS;6VifoKz)i~c96zADz{qAmj z16|25a%DIe5z56LYn@5=k_8`nVxTT&ApKi2!eyW~YH-jpST9j4e)pq~lRtS-9uQhe zx2Rj2nC$1w*VNsWS{}({QOJg63s-MVL2)$}d3mJl^&Z6vIwZP25_3R2Kk#ecfb{b^ zW=$i!SE6HI9Owwtpfa3Txhw6W!!+~239n!5jXu0nW;TIWFXgF5j1d(ggx^@&X`U>8 zvW=3YC7cH}FJ64i6{*)5qljiLK=g>N^(*>ovAM>drlLuq<-M}L=5_Mm+91}Ucr{B& z?8LcOS2O%JZAkK|QZPrXney2LId*uLch1mqdQvvkL#K4IbH}aQ{#THu@AsZO=skd? zLZCi`@P>J#UTDQDM=EYw^C!j#Q9G@#^*8&56OZ5Qd=@4^WaC@%yYk?eg?ec4loauN zv3H@8#ZejWNE-jmUGwDhP12PMpEVpP8BQB{J}vnm!IzTrnFEztj8f*kieOIslL>y} zP<@6acKS6v5VEL+Y~++X zag3v&Fock$yQJ>~a>sqk4fQBq-5 zw~7f3iQ3OqmyQVwlPI4NNNe&<=OAXqmh@nYY9NeWzkXfe(cSQAO1o(@kEwt84&o9I3K75a_FnoaN4ubsvSO6y zgRD~ov9rttU#_gNGP#4mhqtX69=Zr=#z1(bB(B3_9PQ=akdCVo50n0m4L)mU*=lpD zD+oFCnMs@PY=O8(yOHVau1PLbst*+&;4<^@j+$i*fzQVN`9~7B-P9xIkD7w+_Z)uE( zhnCkry;ShGM0yxo-ab=rWL_6t6JI)yexaLmc4;PIZFL!c(yJowbe%q*hJD-PgH8R* zZc_vjIpE8D}5otxF6l_LFM&?Md?hI-S^Vt42QeoXjfR!L`n1Ah-k89I+_7b10Te zP|sa7;?q?`boqz6O%^N+QhFgxr%0m1IOhR=6{ScLj$LKEy7X+Y@lar zcMn43;u{Lk(eik4UG5A!QCW>DdHsVwvhh;9zrRoUJ_eJxV_a*;MHB0DbZZM1`=};j z#S){-EG7x>Zg&SaGVdS?fI@k z=G9zxE-lQklQ}CV@%apP#wjQ?`#kh|3>Ddoj#pdUGxew!8pNgU0R9bI+`oE2+NyDf z+HGh5k30dys({0dbY^_akIN8GBws$-5zrC~R;j#RwKswHRdSbTdJNSgag8mC22uM2A@oi@|rGdA*{AvI7X+#WE^|QvbVmJtw|xiPANmOMqx~HU{CcvT(UJ zp5Kksz}hNv)5e=NY*k{C2-@*8dOWzEXxxxMS}>k9E{iDRs5}rnm4`;)kPjZ09V2@} zoEb{bI<yfSeqf=I( zfMgLklNkkK`K&*SBPyRcvunlmJI?R{w>HP#j&hW;bk9k5D|wDuJeSC=!O}!b+PmUL zA1wzq50BV&3+ah?I@SQR+_XjZJKr6C4b43 z`K>ieTFwysgnXBenQ?!u78m$G@*Un=kW}7v0Fs@JdGt*ek!HfqI+U?gr2wlTa zLJb&lcc6!Em8g#Dnmv*|nRyNM;@q%z>}bQw3t_b{h#n2!-rkt)$9{gUF`xi$%Uvql zUneeN-`Rd?hl~Vs#n)IZr>iPgcGehQ*6r8>dkDI}$4{GEMz0!(O4{)4B2I~UFLdq1 z?s{U<6*DTMLUy}?h3|DcrV@s3FdJQib?g4%Wu8yiwsZfWa;%)3+=ra;U_|`Nx0h}o zOTHdwTTIG*9q-gvQsk5uwPNORwz&+{w_ZU=iB_^Xw(NE%a6fEunuy@r{X{jMVdfjy z>0w`fX{-Cbacdq5)=O8kPf<{d>?xbimnOM<;#`KCVh>14&+jIOOcTG5IN=Aq5MiC8yCR5lXjT0Wb8E+}WWej19duWB&kDTNJ6 zaVW7mBAdk<>-3oC=VHjqUwnH#_JC0gs?$euxafR^*Ef%vl}U|KH=Pb^K7~ic3*7-T zdf;heoy9Sb;L&GvK=Tr}yt}de8n^`J>WNT{{!w1?+C8GY)4ox?cLCb){intP(g)fsE!lwG~mNN#})B7><*IT%Vhexnf=f9kLiID0wnUag61 z@RD9^&DBFGXY6-?;88aD!B-V3p-Mmcx;^|x)a#< zj?)au>|^r}G5RV`Zerp&B>ALm#fjG9YZu~g@*5YahBeNkhv1L|hlu%51vpLcva(*A z9*9BUyk*0xFuaO-Hv1h@q4@RUZm;eS9KMAmQojUItQBZEw@E zl_ikU2wk@hpES(to#|(ibUwiTF|jjgN8XJORXOOSU3vT=!|BXDjWi`V8X7(o$|wTq zFtMCDXqNi{tA+`7B-S-BX5kiwa>qV~UN>U6uvL&x^h>Ci0#cb789gSx$@4G&MEJCz-Wn2UKPB-2u_}<~12HRng4D6HB)-{yoII zcOymZzOF9MM|~-5!cM)`+P4${` z#Vl&aNbb?UqrGfPAg!E2Df=SgX$cAn?{+eKe$yQP=!2>}{T?4stl-!5ynyYda&5@# zFW14d+(>d2LF~n=a~CjTbrE9YrE8tlAv+kZzD}#o96(p1e5et9&g7ggi+*vj)IRph z^33-eF$)hc5YkgU=EtHRB(TcgUYKqPLa=-Ib|1p7N%v#p29oK-sMV%+NEDwzry7n5 z4Ba#x+E-SLD?zqwZ&+F5%o6Dg6Q_`{>R5Tk=K6dQ*@4=*1JUO~)Z)U%zRPnNp5R&* zif*m-PFZu4oAxZ|m+(eaofA{!K{gfDz-g+4%(y^UV-9^ zHXH3Rmz-X4CyFyrkRr*<`M%4S({t0TGy{qJBXh}ggZ4yfS9u$i!{=A@H5WZ?I_0MK z#L*zw?_n|y_$_rFtsyuF%}t-;yKy^$1b0ZsE8C=coAz zE++SeQg(YeIj~XB(XS#X<^HsW+(uB?AjMoz)`mCIG#s4bV{vqTj?deXS*i**LPUXEEBi*MUY z(kP9a8Nu#u$*_o#a!q;N@dR8w@})(c*3o7QsFs{$UQ+dZButI1zJG z*i~sZ`&Ev14Tm~`v|v`F-Z%L$^<&@QqcYcbyuO0EB3~>Z8HQr9=$3=WL^1 zUsae!p+aM#cKQ2TjKuUaS+*@u)!U`H4yw4-QKEQ4z&}!SWL73_$kYuVo8a;Qi-p69 zMQtRq6L5vsRQXld?RUY1*7#2CzwuB5e?LyQscFdN38tcx>FIg#G{4}oovwC1djkB$ zqQC)*(`m|kEKwON3E=u2`8FY`8pP&QwDMP-&(G9CEHs$dPMk=Fik41Fj6jOQol7y0 zn0|Dhj3MYh)qbu{h8oGJ2zL;NT6lJ+_cFkGLv{dFa;)jRB3Nz1p|X(&%zWtR^xQ}~ zduC4s({!*E2P_>t*4il->hDgI?M@=^?|k0*%VR|2w?YR}s)I+r1jK6YNEsh*Kwj*= zX8Qa2ow>}SIAh*l8|Begc}QKA2d(@>-giF)v<*yVZe~B`-cfE3Uou@Sr`pucCZA)? zjuNp6C8W*JGzJDu8Wi?s2969kB~-Eps9o^P_>#YbG<;np(Z%awUiR&qm2kYa|_R%boMw_6Ns{r(av&Zagv#~~uv{&^*B<#&3YWoFF)u4&eeTQt>~lpa>;>!Q6uY)LtvqKdOsk5H zPQz4RRd8_dBv;AW!qkK!yNG&SG&-==DDt6)anf17daYgu&yZnZQ3a?Ruhe*;~ksQD_9T1K8K3zrWkhXA}R;cJp?#F^8RHZ)zfv=vPAJw8id-g{Qw%|2& zL9x0=U;g}9yT@bR1L#p~-02#C79siPUm10}r0f1M0OJ4 zv37dRM^%hdQc;z|Hr~|%!vh0>iZlDkg!u93+>HoWLsz~xm4K|8-x${$>&HfV*GH$l zJ+CcJ>s=`Vw>~LO3kc(&G*LN1gvkH8?f(7ykYvb;8)?Znau9(F0E6AWW5?38R|>8w z)NQKwEo>C@zDT4ZhEc`R(vpZkPrzmgXNz-Xvcn8=om{?uQd~!{GgomN2%feR3@^K< z6{$b)%+rfN0$IQ8!RGRc%r(aBXB4r{1Rxs{<&)ESa|yk@y;81Y22eHh7X$DrzmjTk zWwpg3M#SG?ec`huZ+tWyw8h z+|P4)-+PBMVm^HMKqbBK4bX<(;bR|~!`R|g!a81=Y+GE~H8tB(8muAhHq^j9TbOw1 z<L7Oj?2 z$&A#;VIHt4+Gbuqp`Q-b;ak(5qXZJpYiT5-PSRzF#45i7lUm!o;*T%zUR~<#HLJak zN3eU&E)K*rA2*-8i%~oO`iWiYmLV(ZN@vH(OV**B^J%Z9PhaY>8!I}r7=ppoM!GG{ ze4jeJbDJA&%|7B(0Vaf7n+zro*+F3CHsYUE5HZD}ntPeUj5V{ETIus#2C?1ZHF&G1 z3w)>%tol*ndN0~Rc(T}*3-Q6j8y2G%GH*!ItNUuozkN6D0kqpvNAz66p2H{iGE1Xi z&BT~gZuKsJD10Dy)dtHW*w2?iM5`8a&BpL8BaJ$eMjnktE^VMI%JCSeg9;}~_5e=w z$u`M{=#-gzkf1Y!=E3(@GkY&QSvtJ)RtT@&o#K9eExC1a*?dC3+WTb0!~Ethmk^A8 zbv$dv!54bWbFmnS%cy&&o7qnr`ev`?q=uAC_TrTRrDYZ}zdPu3!FKlL`PWO+bu!C>XxQ{2CwDOY%1pG)el-7>FfCB#%+Y{XN})SJ)r3mmI&DT zjF(7_;nLNN;*;O66<>G6WI*8c1@uNdbAKsru1S0`J!jo#b-2!WOHfb{0MojVi2_z9 zfbCC|u5p<5VjrKCg-LbQE<9J)YB{sdU5q|&3;^E6%VU6UcDzo@y?|CWqJO#S{9N@E z`OJhS=sc0TRkYB(hp~02EiTg1{trZ7CI(z$aIij3G^;(sqONpg!0Hpj$)4QNk%1D` zcf}!x8MDVzu-uDjMw48D*AjLnG*V%>S)Z@nk$F`2jHY$B>CCxkO3r)b^+zUJC?UZ& zhFNe+2o$<7ol#deDs+FHqZn?y6U@UjKiD55Q2|FIu=CMJ)pr4Oy+b6H$7L?w>h7)u zNVU7)el~$2@Inhdj!f;iyAHshaE=ap_|VehLX-!IrY7)BT;xPT$*n!9`WYN$c0Q}K zdVQ-g%;L`n?hep}S)~&UL!vxhpYT`rX*JsRj<@7o?+0QwoHPBO93?KKE)lA06g)3; z->f{0tXmvYB09|wjs`wiUv7Mi(0wxg#dq6tB(kHB!S6zE{&-PR@}B3CJ|=E!i*#VP#=Dk4VW zJycX>kLH?!OrVM>^jgl6@z5D-%Z2vmh^DeU)E}#^yJksGX`8p`Jj)2Eja?~J!`mI2 z|BxelthX+(8{K`{a`JR+f%b~7*C-w1dCv^@@o+<~jDf!K@NU98!?SZXjXnTZ^ovTIxcE3lb74U5r-r&Yn*^7d_9_*K~|APEa(Yn~JylRo~$UYO0<# zH6%qUfPsWGdl^nD|KRh@lLb(b#CLKSZzL!Ur3<*wN-@eD) zb+&K!A)bZSiP&yzS67!q!Q^|WX_?yFgb*R!eRWtkX2{Meo^21HUO&686zHk>rQ6`j zzW#YVHw)?u`faxe*oC07PVP~+D|E!EhnT*KV2kgc;_sb|y+{jTDZ5KEIIU?1uDrn@ zSXg7gCc56KqGOUP+g%4B74N0*oSdS>d-v!fh!4|9Z#iRjR9yy{iIg{FEQvdW3n2L z=K9%}Po=VR5_0?PpDaF7zIk*MtMQ6%RRV{X;4LkndOlKr>AcW%X;Xu+gvW&pO=1II zO^nt`7Y%WWB1+PQ0eR`&%M00&U(OC7a6b5qIo0cEwfCnPGv{9A2flVU$ZvDyRSXOwxvq)Up)@!V#3}dWFY95lXdVE`#dD!Vf4QIkAUI>QSx8j~Z!@#c z3N$p&#ja?^I}c-Hw>@3#6E92Au1$f40_XT|Rc;W5a0wbb-E%@hMIXZ0BAD743w;CtNXGY6q$xzEn; zPMS)}=+8Z7!+Ye}r?_6D6VlH114FZ9u+4y+bjfTtBOh_8PQM9?oO&)Q88!}^Gs0nj zn*G3$BQq^)8P464T&d+rHr~icjIQS#`m%WdEqCnnd+({qSV}@E3#xUG% z6&>E#!`mEV}YZf4@R-nqhgb(D`sy4qV9- z4!g{%`Foh}fsojC074@7aH)k(auT`(rYrNs^tExjMeYezPSjG#tUNYCiK>MQmlK)G zWeL?;G zH!D7D-`jBG%#>n41)u?)931^m_~tjeWUd4H0LM0UhbZiEUtgWySKlGC@NJvRd_EZp zL!jQoop@zg&lY@n*WSHtnN~EFPj?d2L%-F&Muf0&uQ`#+2I+6uIWe*22-Q0-s{MHa zo%!Z#(Nc3{_N2X*{NyYfvKRqeUgln&qvykQMy|fK`s7cSdAaAbeC9k<+5qGxrFKAN z4{1X6di8zQ8x@+pH4*c0vN{*+jZ$vUPhVf$8RkJUXEMSmam~u*k$ZF75FwZF_$L(~ zjM>e`TyR&LQHzlMsj8!-^l0VQ*w~@T;_jy&u%Gcm+)$u?oWUf_VOWzm)|-ue62pQ6 z{rnc7cAHEn*F4)KbQD0c@^I%qtYCiF>gsW+^%q8^&6g~nG5RBn)*sMlM~>eFHs8;3 zwbs)rzeN9=*ETesKi+)}n_XjA&&yOJ9I9)>(_L&$UO$foH;n-V8qm<{q2wS~1 z5P8*OPYh~To;Dt<;Z)N%P&)$cqNCRK_eANXh97#;*?f5Cc1PPvFgo95oIvV$DD9QU zgwkNJAeE;SH#(&wN6XUaEN|sbX+r zY5<)|IjVf5!FMFeO-sUNx~Nq{hOFB4{->;{7dp@1#y09CXuf^CZ~b|Ux0Y)$CXk_T z95D;P@FP#i)O3$E5EESWO4L!_YHK?rB-Em;4cc!7;ag9r&nl%IX6K}(JcL~TRTQ|VtGb_ZAN{w?mx?-c`fTb8fcSvz^ zC4y$7m-wi4UHB#j$2&W5Fb+`OBiUWesm8`enR{rtzRB1q=}#oIW;^f_?<`StU#~T+ z5kkaQaHiZGk0{4TgM;(6eXet&mGNgP zZMoc5h`8c3!AUCOl*L90`D!+jYC2T5ty(BL--E0v!uR+v1uP1i&q{74O;%hBu#=Wf z!24SZFD_rbdaB;~%E%X!w%hzE-b0M{v1i{p1z`9Laz6ITzdDh+6J*6*IEfh(K%j8yP=puzLYn-l8)(A113a4J#M@$3VjQ+_!1-0+!kpmc%=#X z=$QsfWToytI-(#K05*pd57N>W5QZ-=O+u&n!&gF-hfa&VgC7SC6H`=Vq;1=6pY^p> z7z?W$o&&UgxEKM&FQ4&Lf_;15Wm9}MMv3=8Ay*Bt8@kRgg?4e&e^+bYm3bAP5JAhVxRC|2?DWM&>(FO1(9+3@`T0gGq zQQfKL0lDq=;GR2(uF`uAuhKSJ&&f;{E@N2zJ7ki_r^;9g5YV}KJdo(MkJHm) zDZ69UF!=yL~u+vl&sdrK}mCIN9U!m=O^x zTGGu%=&n>8R#4$KD#)P{UfD^7Fslgat2bqc!z{;PMC{wX%%dtDhvj=VM^rBR2YQL? z<+=?RHS7cJPp06PNC|ZKx%irJOeTqvhGXG$>3Bop=eTklqu87jG0$uH%DHn7$K7;v zbZA{gHYaPQ_QJrVhj^;AUEU!n4J>-s`1>#nwR?*AGkM|*)WsK;98aD+*|voLw%WLmm8u~#QxUVQ}1p`SjmWV^0!y$dGJ zMn0B7W*JtFwcdZ>X&Y`olVq=o%;P_H?yM@B4>R`uZVZKh{-CL9xUhdd!{*4D+ijR- zg0V?i+NyxKXPWXbEA_6Xc(^hyJuLBiFxA0B{6=l5OC3bFhU!N`F_Tznm|q;T{-q%# z93I*3uzQSg-F~_Yef-pT&cuE7<1d;RRY(`A?=eYvCO3-NG^x5b1n?IP8Y8w7Xk~wl zy5-)4KX>Vc?gV|G{c6cW*){ucsgzlAGND?L$L~sgrj>T5&1@ZdK5`}j82N_1`eRz@ z0D&ZQ7lA%cQoZe0UFCiEc{B`Z)lnIaJh}1CO9Lf?6~1%zDuuDTpmOYq(w9&Jd7*ay zoNU`lbh=HRQLT--K&u{?)tg_YcOZtXra z!S&{cykRU(39y0q%xBpasW2F3L~L$)?@yqi?O)5#;pW-fEy7c>N zZh&iXR&v_ZqE1w)5YT7Gia(lMbEQ^qIFcv8!lIdZ3(mL;)}}EsKGJ0AY>cPC-?_J; zqBXAx*QLc4o@GkpyV=|mH|pbV6dSJE8Y+6hsD3wtsO`hZ$h%Mh{1S~$B~+`N$`M2J z{RE!9FkCP>t3>6YlX7PtiQda+Wzv@_+nFqm>pvzlosiph>^%@qOM6uC%3Fq^y<`*m zRwkW<3d>JbXx*~juHBS8Ick0nqwm(a-V>C)Wz%LB4*}#G5Eyu9dkD8+Rom<`3@f^t zmaP>-Q+UK*VPN%r#MZ3}HOxR^ofsYt>wxe694?$ae*8FKji*SuwFz6v$mH?Av2`2ZhY3u#<`dAIPW)D_hV3058JvFy9b2aWD+&u>rA3fZZ; zXZJpu*M*=Tmr-9E1Q{R{rWr@u?o$>T5V4hKbO5ae ztq*a&WCSw*l+7_;D&~84?oi*NqeHBXF!mI|h#1VSB16}lrR`g=dh|Ne`W|~k-OuOx z10FZNG&{WZITHdajMM&{shxKMIN;79UY>m~Rr|upX<89xRbdozVkm4fF)TsSA@!c$ z$(K4K7SV1TNMwB~c|@3wDCst32HxLyC= zd-uDEe`KJWtH&@en#94x^*FZVy6V}F;>3l{4=unWp1T$TI)kr8%8pxBbUs5@g1bO4On$m4b~D z-|N26k?>r2c{ZEzNzgkH}|7GDqcvNCBbu-M>T;@|?%yYk;5mq!EN6L_n-1LtA3aU*d-7x?L2s(hK>k@S4-}b1IKMj&t8YR z=aCHiEzA}K?gk|352}ZHi`511A8R%-TaL(#`MjU;ql|D@l zqw!~87;13+dH8|7Op*=t8V7jDBY%O)RtW7s*1HB`eD?3(A1Xo)^CU_Nif>qZ@*oBL z`$C`IYpV*f=dH%vC6gNg1x=Mh*fGpKFg%G#R=G$`?gM~zD;Vx$V`ICSqxup8}k@$s00_`{Ky>zS394^Bb0MNz9n5Jk!{xfiL5}YmfS%8YGCT8D( z#;ZYaB?MJzh?uP_rkt{tiM&C_xwr;l z8i7Pbrg>~C!DmhF^2v8frrL*i&ywJB!4^c{eyvA#ay8I)6bVcNP#f+IG_b{3!2OY? zlONy^6YmL^Pl!%&7$rza?Apo+8PkczY5O2ykyb6!)t*k(Kb!CH(D)oU_9=c3PhYD+ z0RgG~OjXpob!q0a1~)qe#hbXcG3;)^MFr@1M}@MHDfQ5_hyc{;0*@Xg^g5}q+{JQ6 zDK8H)F?kKtGVO+c)M|pO>I1hM@bG#rI+#=A>p2y@8sJof&P-}tg1q-<+l~VL_F=`}@#CS3s?qix%^X-C?xj^&SQoh6G~|FrwPz_z|_jsB#*uU4{xtPfYG z?~(KL$WsM>>M0u-MdhDm7I)}Csm

11o_vevpyTrp`182AX6%=1!DthgG_;bVtPO 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

    l#TN2UfQ{lc&X9)12!L73k<1QH`k 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 CM21rU literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1404.png b/clones/abseil.io/resources/swe-book/html/images/seag_1404.png new file mode 100644 index 0000000000000000000000000000000000000000..6f94e1f51e8d710abe6356236054c316b056abd5 GIT binary patch literal 20296 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 Hi@^T_YUj|F literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1405.png b/clones/abseil.io/resources/swe-book/html/images/seag_1405.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea56209846554483f62e998cb85bbccc65fccc6 GIT binary patch literal 42020 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

    ~U2JN+Dq<^~ky?re!8zlX}j$b2Orpuu- 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1601.png b/clones/abseil.io/resources/swe-book/html/images/seag_1601.png new file mode 100644 index 0000000000000000000000000000000000000000..482c1a0dcfaec43dacf1bb4a50404761d2f8afd6 GIT binary patch literal 37997 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 f@bCYarNkff&AIP8m;$2+0=<9pA4 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 z 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Ï@#@X3_u$c%2eD9vDhN{>ahu@6@}F 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%0DK*Xu18D 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

    DFpN^M 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

    @^Ip4mq=%w`B-I!5Q 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1702.png b/clones/abseil.io/resources/swe-book/html/images/seag_1702.png new file mode 100644 index 0000000000000000000000000000000000000000..ad639e1918536a53cca324d29417fd6f7be0714b GIT binary patch literal 616957 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≫?+8;5XO7>@Gj5Jd_;xF=ymFr7ZHad5PXTZk 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

    hg? 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�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 z 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�ol^haW6%vVS^tygs=9KN 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%0DDDB z&#Gj0QG0vS=)1wT7B~R+kT@BmmS*Y%;u1@s(3$#VypfH(9=+>k1xJ*{i)tm+0tdmM zw$fb~;#4Vc5IlA2$espD2I;Y(z)`GRY$j%@DTEHe*~KOxm$*MRHcC_!In8P@wXM%{mvC%vP?*=};v_@MNlb;c=|2F~F*AZ#Hxvf?vZ3hK@uf>&r!o zXteSx?#CTifDi$8Lq5wP*>saR#WJkal8xv=!a#!yh~62>y;XM{G( z1_+_mBb&*b3Ubt#NH{C1N7mIyqbd9#lCp#iV(h1Cfx}x$jZQ-|5IAEZ(xt+PjBII) zq+$@?jVVknTb;_j#GcuYY#5^$gMBEx^I|rO#osY~Y*cgM7-{*3YJtN+Qj0BgjOs>z zTK?WnJ6!&qIgWVhsh8htcLZjfb=J8QLy=O8fhYlBajIr9m2C?giuLR{&klkZ3^nk= zbOk3EVF;sLpb;c48|lbASF19W0*4@k3yy^>bvkxfSerRKukgjHa>$Yud7&XqG;vjs zuNj$09TiIjCj-%)w-7&lQ86782dAmpfyTydzH z!8UHjCFT%kXG-5C|Ch;>h~MiqG!j7ujtYe+L0tnTXc7p*BXdef=RVC$0tlNjw+6Dr zuXHCIkpS2+3#KTotT7SCNM^i(8WKG87gU*=K>V`BceHdS*#ZP)bmmNSlp;<_JmOl< zJqd{rM?jf8oFs@i<<)}43`f!{<;WqU33e03B1NWZ^@VXtJnCPeiC9@ksxs0re^rhR z6T6T}(6S^a%S6QuaL5TDq7!g}3{=IG!68A0&;*rW;@5CWKuoYjd*O(hQN&E_LJ`dK zc&@ah$Lxi{aVdIMaA;5Jz!3zOshFGzDxgebJsLiR@_HgUQj}#cE{U87o~UD=7+0LF zN2HLmK@8@)fRCUmYk4vjOIwAu=#Uj03LGh!Ap+@5B&Usq$|-PoCE--i4s$(Jt)nRs z&cbmLYeJRONe^q6NxPsqX+LPvD*1pLS&+anjZ23_Egz_498YZEp6Pd8zb<3-pL zrCUZXXpm|{&e6pr`zPsHCaw_pL++J00xbf&y!l|{g016vu-Oe(6)k-cy^l~Cdr zLG>$Uk?rVaYuZ^9Jk%fztY}zC>Qdm)FLMevM9vBhIasEqT}nKpB{J;K>;)+M{tA3n zuGmS=%G7CqnSbQ9e~W8L+{biYe;F^tnhyaZ;#cI4U3vi@DiU zhg~Y&l41QuLI@0l+)SU*vV;>wK=7kqv^y2s! zy5#dNF@VBH3NdXZF#5vea%ZKgsLC%W!VWm2oBtCM$ip!utD*!~3I|55Yib)Ct|i;0 zBA_wI8fOKEKf}8eII?=txD+_D^{*{%Di5reU$@!%!VT85UC|7UEmUu=`u$UP{iAI@ zBw^&)XWldO^h55s`xp&5_B zKxKO-^0GqBD>#gWC^DX9fS!Hk-l6JK#K8CRqi!=naT@nQZZk1OvjVu}9x0=BwbAZiiu z>spTzn|x;hiRDy6VGb-#$e=iHZb<`~2{Z(MNgIqpkdzGwrFX;0BnF2HLgF5gnTOg7 z8r1BKD63UDLen7F$vcV_1XX4J(4bHiO)`g!0w%ZhWz<4F@g+)vZ~Lggh+mXKNV&}h zcm>+B9oP3;t2H0YK1N( zBxCm$Zn_Xe#9$y1Q%GQMf>s(q*Z3Ce~zM65tdF%w?%rWJU`zLM~yD_E~tWu|S6; zNZNHFleacO0F>#$1e&h=sj;;TSS-v1iljN7K*R|jF{J<~$ur4;K!2g8Z;grUq8!r; z6oc|_|MqVJP=lhL|N5{08U`txSxviP!dle27f)06J((UqDIlSJz`l1BM^tMu8oC3kYiJADZR-tpiIIG z;|xchkAT3Y{z#&*hNi#`Uq~RdF&anU25tCA30S1WodBY9DR9sNMxdK5TFDQIlZ7_b z0tfl0We_%e0{n$9d_mzXnN=zUgbiU0Hk*1_Cz=?<@RS%wn`)}3B~7tvBTIPvuQ-+O zG!dBWOQIK%H)SbAGblU)pDEL|`%WilhEQ-|93(B-Ut>^+h9ll3mSkAHDF-%_flTC5 zc}CU5uZQds6N-SiW+1xDmwKYD@+D%E6DT9a&P2`{9HhYa>^wKKjh-9<+;YAN%nb)q2stDvY+O&0pA^~*v#n?8-T+Q? zEhE58s09?&0ta&a_kaI4(ZwuICzbRlvN{49ATcx%&ZED-LJ2j`aZOqiRZQHhOciK+vnc6z} z{?_@QSLbE&BFRdgmA#+OzVGWwMPo46%_3|N*U9*3?`VaHj_{;yo7;gm24;`%;WS78 zF{0L@0t9OPa+Z6H&V&e*c_hEi_1XR@m{UtXetfa)Qi95xVj{v?j>{z$-)w`T$b7Kn zQeE1{e;8u&H-&oyZbN2lWit5pKjoOBWq+wsOkINeb;(HugI(gHf!u2i8bT$3PQ|nG zAY&N*f&`j?O{|{-+>}%E>+;W*LqYYA8T2=xsRCMo_8>-I61vbG0{CMFAgD~lD?www z+T2t)2F$m3UKyS+gC1PON27cR9(ncOism2B{fIPB{Ndp{C$B{darWyW29wa&dzHc# z_u($VNyfo7-<9X)iQ206UGx=$OQBc*7UK^XTrX_7b}bZAv>-4H$i2)e0P=pM#vyH2 zG*TqYO{cSOA?%a!vOFAaK6B!km@lDgk{4R%(C9ALX02uMpDT9;sOLy{Dy2`>k zw>81maR{+E-uGjRJU6gAg1WxPG!WwiuH(+CXtstlfSgw zl<%SXBQ86z;+jN%Vm5)CGh!;~@oqr73Dx`9q_&)-`l&WAULvlMRe^CCLqEKBK3gm$ zQku+5X@QnqSW*$SnF&(dBHU>Xb&6cfk)VbS9Nd-!QlK!gCHY0Gf?C!$31ba1_4=NP z_@5l>NKyUwK%?XMepo_)Vj&FJ_ctH8d7#6|rwBsIJd_r9lKfziYEqj_F`v=D6ne;s zQpBs!w@&7(1ac{5FbZWIM3SN*k(Wd&e4nU%QQ^bGhxvJ2wh|iQF^>T$t?U&1LNCR} zH!h^cmvJ*=R4qj?Wt%&wxW;W^slhti9(z9QY|tP?GLB(IeLS^^h&z3FeL|kEi5BQ+gAMx%-foZPc@=H%9<|_<%u=$9Om|!= zob_!pvXuznK3YPNsifjNrm;{=HH^MV&Uw+mA?fF$%9|MFO&8`Wt-GSju0*N^$x67j zoX9Ar0CluT!YvJb+Gv_?Si~GWFeZzLrApf9$k}M|BD2a8BKusG!75VRuor1W&L*h` zPqaS49wD8c4-=cYf0E<#_CRoRo6oal7G16EoJK-4K!filu#@8 ze>|s&&LR?tAC2l@;j(zLR-CphY0y-Rq3MrN%b&(KVKidKm|d0mQc@(GGp_&jvfQv| z+KHQ!@QqA5pCAxMpc*`Yy!Y%;QG5*T^@Z`C}o5Rp7ZJDY~d`liK7yU%c}AIz^j|luQ)9)S{fLNmSzd_(_kP zB8<_!J@(SnM zqL{4TxgU>Aw+>e+$MhpPf+jBzWqn*`g_0Ww?UBLKu?Xq?pvd4uIC#hf5ro{vKKrT4 z#H~h$Mfx!y!|L10X%Cwam)a49>}zvuJl`tmi1kcTmNc}EgEuUAU5~9$^sO5X+&5m} zO9vTK^6Z>HA^z~lTA2*I#ID*Nj&n|N!KTFwBEKKd zHF<`m86i1yW9o>fs?d$A|ERx1i<1NhAKD!{f-Z9e~{s zHgYvD!N7MCCKO+tny;Sz>lSI$e6l9)3dAU;_rc_Z6}?Ah?fA=%5H22l6Y!?jcZoj6 z(6jCYqNV^VYwIuJ%5q3;J-^PYi1ZwHigNgQuXLr}Z%>B)_}(!&^ew%~Uj~~u`8|~~#vozVDw`>{w1i*}ft?pP<^vm%$q9i=9wf(MndP{=m zPp$AcI4Qb6goqV%C1bEC<3lpxGmMKkn-L%>`2~`^8Ebl?OLUQaRd1eoD1P)aED>|z zF8KS8SM|^$93sv7Kn`BOWF0!RpL0O2O$Iv|BxaOG-7i6t5N zXsj8pTT%wa$2pzNmCnd$lr;G?5)ud77k#d<@K@Jx(JzQHT4ssS@Ko+0=BD+6f>Vt{ za6og~;vqk0oiGzt3{+sTD0d*GBsdoPk=_p9Y|CIaMxrac!|s9czAdaS;lMEGlAx>ySw^7ppo#vqigf1n{SC?4vP) zp~JpluzCjDKyJ1vVU4vg{iZJL`&`Ch0V5PvlNdS$VqIg1!RQD{)HTQyFpQfJ-_MU> z)|%3!`Dkj40by0TZm``=N3eIHaVt|}Sr18jwDD`y^g58gZWPp zA`CASTQO^<72!{jbn&52!g=qzE$e~xkpI}ur2~D8wM~ayj5Qn;{_3y|t&xc(V?4_) zfWKdAMIbqe1VJT={lxn*tq{$lf2sE z=SzG{?5W|U{K|W)z&2UtxSa&BAg3l4KPevFCmu@lpW=FDGMW#Bs;wI$G6@$u-FUd{ zJ8(Rj{H%t7C}NxJ?y{JuiEMPpQwwrWvB`)e9!`i?X{YhIWMy#pvv?nJt{REGJlRbt zw`Fe3#`Pq$na)Kz>mmG;M$`>mc{vGA@Q{mDL zA_5&nShTPn?G{R%o~_wV4}|PrMI#{bZKxAXScmF3c-@X(5chqwmi=r0s355In^x%h zEG%=O_;lWG@grh+9{}am&OY4B9Mr<94M>A&h9^z~(*uTWlIfra%J)zj+Oe*@DOziv zFB<)q^P`au*GsPPXIKC<(sHdK*ao}$Z>I|5r+znx9@um_RE*I|b^-FGrI9nXQxOE*eTL4I4F?PU!;1>za3*ilYyQ>_)VMW^U0!Kr2A6*D`aNnZFb6Jb4w1!^ zOf7ZLp2r?b43E#z4B36Iz|L4)x1V}a6H6taF|Z1&KB^z0D@F$C5Cy$!C!+?f6{@S1 z6tPb`RcUg`-XG|mmTfl$D^?CKgR9)GWG4I9EhjZKL>r*C=kwhVqB#6J)D<|urRS?WzRf`IDbUWrAs~kmez_HY-jFYHpOxCn6 z_4BcIH6%^pR36~HEBG)wW(>{xjsqByD)3fVBO%JHySmp`-zBFjp{~f~@Ep|nBeToK zL>D!zG5=QW>E?RO-Ix=zFMRx138~z{>Q$Q&Z9wF(_@RYu$trNSDA7;qEY8b^6KPbz z+pF=NN#54Y&Mrb%SBFDwUJq^1GMLKwLGjmZ(o3(EI@bZaj#zjl($%4CWslmJ)+SEW zdFj9erLN2)!O+E*XFtS%V#iZe2?bBWz>0Oa^}4yGx;M7YLZl1UoUz-sl5Z6*eRQMf zBxxX~md&gBPnCzCNIxE*>dLPzi#|!jt}Oz%Nl)yPsgQnXTHkWu=WwevZTRp4+ zPBgmI#A}~3e~2ry+1ve9@xn#e;8e4p8aoH863!e7^?2(mRQb?+d^?1sla9f`$oY0b z^1q%C2Eu>S-LYZOcB0(>qDAvX{o>!j(X467T5S3Q*Zhl!=;FTvbe8OC#Km$sfs{Sa z#K!Q^SS$om_X+Snl8npJLr5@Mz{c>`;f*Bv{k3n_Nh!~@kqSDE#KLk|dFo7U!LJ7X zciR5H+RnUczUJ=pd{aAD|9_89l?@Avg;!_glgppt|0(DDm5ipRAy7eyn%77T)%G_; znR3>fZpfulMYq+C{S)?{|NmM^f~fG(GoY#T!p_Qnb*KOLqo=C^<>W>Q6;MEPYhqYH z=ox!ghA&Qw}NbQ)iFi-@LGS6jBUpxyy1s=JS%kS~#J{<2n(Joi?CHB1i-v{`I%-21R~?Y>>VQ`bNS2j5nZkmeQJkjUD1-6-q@y?s=$P(RQddy8xO zXWzE+-fjP}LdI=P>!x*44Cm`g-LE6y6FYXuJBaN4$jhxT>ddJRiF(pg#uNj7^SzG! z5qn&a^FKKMMF}2~S=oO&g8AzTmp?>R9PYwvf^U~gmsY--wrhGGA&;e5_LDpzuD&GB zFXnuRISCqWk%HHy6z2sbvZYd=b7Gd3*>PbVP^NGHy6VDCFRR=DT&|qFb4c}AC*WRs zc3=UJ$lU#9c#}@|p~9Z=m`KXU9(`{)SHHbRxW4^*`~3$WnIFJKAt1bG@b$VDe`6z< zoiVDvj0^DHtYLo~>0+1s>)ZQ_UjIJ>!oN|{{?>fa0H^IK7=Quz#oM1RK`$Z{Skxx3 zZ{@6*u+-)cMG*%7VjM={W;^dyW-n z{z2$O&ngpx2u$*Y+(2TTZ`Ua-w)u_y8qfPySPH#XyrJ=3zIsrszipdh@_0Sds8=%g z+UNHFb5j|ogMOyCiEo72=Q_5#g;9)?IuLnow_vO;F90nUeas+0YdR?7)8VkN z^TVcwLh=hlvUi=JNJEqcQvGFW94AfuZ4xKoJ^;W`d#UYh1j(4*$Nb*I+L=*GJ`fn1 z=VhpJ$bY@gdi0XX-z)v&ouY4&?x46vY<>$xTunpnDGyGt^#e6?#!V|OZ+`#zMpq@WqwfiG7wzq8r7F^|66nf>PnOqZ;P}4Y2A;cOU>6sy=1dmfx`|) zPrGbhQh=wssO_rV`8nB(sEhvv>g?zTL0^R*$zsVdb`-;92O;xXg7T!W9GKeTYCeBk z(xfqS@lE{&e+hyrHN@Vh1-R^>>!j4y==Kq0H>!jPFgW4~!AD1TeOwTvs5~pnBTB>{ z+5k&I0m-Ixwn0SNWLiD=fh zB+vFe7+xR+3u;T0F1(e1B?6;fV9owAMEt3gGu3gEOE-Z;eFp)X%(at<+KI-O2!6zKC$z$&Pu6o@Sp}x4 zr22XWMTiGFvxK6lyggnj@Lwi13{o-sujVFO8$$mgSrj3KyBG)#S0WB8?e;DBD#$!^ z=3-6P<+~e8U@}UCwE@8ck7RK?n=PoIL=hSUIgaPaCIIj&=pYGFWuQ+5Po+?3w+gkM zq$xAa$^Ls4sZUTh6|;uay=(h?YT{qf5;H+Tt=S#_uqUVNUKnz)o5mxvy|9EhtO&VC zEF0;4*gdKHj1vr^DFB&DI_~C#gy4lswaS+1&S0%IkN9a7x8Y5l17#gY>D6dsWa^Cf zL0SopQpJSjYG>FI8&LRr%%*C(f4N;9xCa!YzKv6Ayx=)b50WH<-J_?^7cWLAs7y^F z7e-0=D0byAq>V+MFR$5W8O>L&Vme4jEvZBXpOu621a+FERyGR>qD`;`Zz2@QpNi5i zs+*AE#%Pv`eUbE|Be-McJUlkc(*CO;zz}%?5fEL}vqYh~IY}AY>k(&o=0~t~5D((p zXqDGBZMK*r6=En%{887=yU1h6m$jfNScN;Rs{@)wt5wx0Ct9g;anAk*6R;QxXlNM$ z&Sko*QUeqk97qF1k)B*;IB*0YkQS&FNc8ZV9sx+`66scSH*^$lt(N_%)VC2((MzUd zTF<1l(qYd)oFQb}Q2;m;Uj48`v~M1xBL)oQSe~nrfqEYbz1Qs?A!mZk4Qb z_!s`SUbUPws?%w|BP>Xx$Pw~=t;Rjgn5K9<{C2`5z{?;_d0<7hUXvQs=-nV?JRm!e z>k^Wrwo+H5h;uJkn`L1VTQ(^t7>|-%N@;AA6!uu-8{=7tje1p;4L1S8StZZYDr0mf zDnCia_YQigP3Jfq1M<(S{E36Op2|tKp=Fpnj>}IFFZ?Va%z)@+ zhg$UI>~`wY_iFnK*8ff7Cpjz-1h5sNEXIofjoua9jz8b@vt3q)KzCrovzFw)`CSJQC*y>~Ro{WK!<1wXbWeu85ZCOV2gG0P z)2vhV{_-`AqQ1-*m%ksXO{pqril(^_qBC^&4@)zxE0+PLmpP>@66GpR$K1>d-k>X= zfjceM^!WCxxEewbIml8d0#8qq^ zBxZ{daImVzJq#67`Irzh3Vsa%BFgOPHcCAYOW`N0NEbq_|GJ4XfKn=R#(GEqW7%e4 zKhX^Cpat$B&zXwvrlGm{4Gqx2l;=vXt)%}Dz~;jCKqwVn&5S}1EY}9+oXG0Y0?#l% zZ;}a%QM*m;_YrN>`K3^AEO|xmg1^nc5@hx+Ycq>7jHYP%-Ya;8H;-G-vn`|UXrlpr z2Dn-0yLXBCn4`$Mq;6y*_8X@E&J>UxrE_qheXJ;Ej-_93^85L$1 z&r8;i{2^L&RUD72VAwFsxKW*k2w)tCUWg}!L6YDaeo`tmg%gHs3N}cmvl6GM{QJc` zlBr)Dl=WJn0vs6@v9?(TrI5eO(o0+C`JMK5e6H-qFX!ahW=!exy(}-e5iEoTIY)a4pFyZX-z=&uq95@ZhR_W04|ELbpWS? z7{kI~EIKQID^=u1E@>s{{^}>S$}n|DwDf|I zNHYC5)W>XF|7=z+TJ1lwc03wIkH&$K!4}ZcV6L*}`0F*UQ8nc;mGdr1qvqR6K|r*T zV7x-iQ2WLSN-?BHs9tUC;sa{s#04>8!GwW`9(0=qHj(rkMYDiZmI(c)U=s8b&++SX zX}NCT^vJ%|bQ7~NR0KSxlvUO%sBINFYy0+}qN!?>7YS7=KAb=5BhckCQ8eY`b&<)4 z8lR+J*y~r`rI&tIT=k>zt|U(KR+8_sqhi{MKO!C>Bqq!;10^6QA}q{!cHOT4|4wu? ze)BLDwQ9g#E9iP^MhdivoxiGcJP*7>Zn+?jpW}Nf0GtST&#Z(ow5;D`eH^~G?VKZc zYqgiI#=F=NZnX zn%8!lV=mk8Uy3)x>p&UMb=Gyi-ypUYz*LpfcL!{=C9KqqqnJEfu({ZU+=jRYytcK zN@R{7P3nHlLg(YZkMmB--B!6x3SL70qpIWWHqG@KjZZPS?N|O0vP%HOc6@f0@duCo zM`_P>Aa2-+oBi=5Wii7tWkd_iDXx9$mI?r2EkFakZ~^Ns-40G#5wHt-<6X~o$pNVf zwDN;n7+?Q!8qPFGR27>F-r2c^jz7<%T$Aq+1bE@;DJJFW?NvFfGlecZ^;)Xd!)<@t z4`T7JV~x$eIZ5nCS4O4Ku-uyw!y`;J-kAn62=;F#wQHT;)GdZyrWq9>peBUn4YL3+ zj`e}Fb541*`1C%hKX2(8(Gp@1<9$w@Yk;uXJ-QA3Yengj=_73-bJ9HIY+#{rg3#-o zFMu;~uy%7&2@$F5ghU>c;UnQ_F?3&Q3g9<*AIr-kiqe)*Up7P=0CF!O0uUKG0Ep`A&DxB?z-bP-Zkng%KjGWRze?iT<#b z@zN$kX#3Q#x_5%?Hl?T)gi$Iu$2K~U6c^i`VTU;8A3`3Q(B-}VnB8e`tnv;+~u zLb0G!_+E(2f^%s@<0(`HmS3g}J{x!TqL~(y4pq3Noh`NFcXhbKA$AH~i;OGoc!V%s$I&R5zp% zVF5Ul)`(0^v z@cV2CG2+gUjU;(EsAbU*jhspHtPz0_OFzm@b;IQ=wfh>yDdeV;+1{9AI1WX?s$zDCv|fSipqMv-hU0F#D7p@V3~(Z! zB*$mo60}tg^)6jbiLx7G3a)H`EDB!D=Y~p^S9Tvq(Gqf-I-LFyy;4HtiU~Y zWKQUfhC6;hbI)%P&=6Dx+^g_@##mTagrpzz=VKLv-io1M6QBCZftD^hTAVc9u&;2+ zWhl_qVC^h@HmLns zn;h}mSXx>QYXYu=!DTsosMpKhzZr72I(2PBSim|$iO^dY<*pDL1OHr2Er~Xr^L{%X zPcl{qr{!Chy6-);{(jaovL$Y8?Z64;v&U1SF9w!~7?W+ILeF3?2QmL}4xHz@-43x1 z-lCeQGIz^W z;>Y{Vt}@J&D^XFDbe`KIu3X?c1>ZL2&{6K-kI~14wF3~4_P}+5>5;fG4!+*!zA&RA z`9-8h3=sRDN^Bq?ElTIK)=?qRXwW2}B6=3d&?5+O{oE%M3ljIle)j~>U7F)7LJlU$ zQuCsY5QdBjCm6kt*l19HW};y*k11C^-E3E*47$NF8G5Sxr)MgW)U>ldP+_>%0dsYtw?m|!EY!=e)ugA2b|2@6IL z1LDSSSUrpJTCDZpw7#tk!0dEid&D*Hi>Mo43Dl(p%Z)RTDwD1I%w6pGI2;b4^s-Og zhY_|LYZp9fE>z|F7?+jqW0|Bu&e z{`-8LUXGCf9<}}QAqT$W@?NVE+hOkW@!p7uEC*ljRXk*#lS@Gp=RqeA`Pormdl;eXohE36!`0`UIvKV4Q%iV3>O`+r&v)j(nVeZ_>Hhky{MeS*l*|McY!Qe7zUY=Bqb*)?p0zZ~<*K9`QoaN_l@i~fxI z$JBeeFwxt1m7>XS4($8-i)HXRxRYAqn%KE>M+A_Jg21o|2(rW4g)iFhuusuGp|vFM zn!te%R2HeE+=|%4Xp}C8+VBlB+@_b+{yF&@d}J>rBBvD-^Jz-`-ZFIftJ`+)+nGRH zF*;KuR>gG`MVWC$M`U7SXPTaz>V|znv!|#vcpz#jK~hQj{jM9i8ikt$eYg6N5#4Tz&1;I(V>+lU-U_J_MNO4EL z#qxf=?Wr&}CTbHr;mr1)=%9z-j%j9Lr~yE6@yt4(?Z<8AD4~T-fLI?y>}IK%QOr&V zW?@)1C#~P^qo>HmH+l3eD0-Ag;1*l1`8O!50sH2a^{B$U;}@|T;>DB>z%(hrE-bzh zM^8TIT9#qvDS9!#W_F-onYBn~CZi7IRaVhzqyC?bDjWe;Si%A+--m$ekHPkbTgA!M6Yc zSr<1S*>59?@8#l1c@|+|0BEndT4Ch}CfIlsY?u-<0GKVUT-P>E1Sx3KHz>rMGny%- z)i-9c-~!GiYPFBNua~^@9p`{XC8DUFe=1~6|B47V*nTY9ucYsgIcv$kk@tTNzc!*y zM>EF4;$d-z+so%6FlC~Q=YN(5*9WW8XLT4?(@=qY~jkhX8AxRi(q}LUL2#(>y!b-6=j2Hk$_38PzXc3GB!1( z%DckN%_1zB`g&@L}4B7jCWp-*FoWVPJKB!)7ePSzXWfP-M<-=GTM)T7}A9RKa8Z1>qz#xnaBDa5S^beE%kR1%6$xcmI&zwnOY2TtHp5x0DHuROCg20by zibyy+0ZPD8K+NZWK|swm7Q@suW9UcOynr#PVwTh=Vi5+WH1c4ZZYYc8t0K9~V8V$r z`xm7kv;1M+)5CoVb#kNk0P=Ju@YHyU>? zNOZgCX{|4b6heoKl|w9c64k+}FRY#Jp<*VrE&ZG){$%8F zL6F}a-=KkjDiwKBJlUzr5k&Pt`eMGomJ*Z8Oy5<0$}KVess$Kct!})RQyVW+F~P!s zmkv!CS|n3SfWl!If;cy@ivz0l{?IVdqAsdOH_e_jeb|ldByV_5cMS(a6~dOBj+p|` z!H&~SQ{!`ICMP9EXwV|tF_{=qxr{Pvqgzm!lGh%!V=prTkgHj$G@5L8EmlJ17E?ax zOViNi%hBeq!2@thqc{ZQO+ZaXUb*Yaqhs3EM0r#C7L@RTGETxHq9Q|~1=((UEJ^Km z`FPB4mGB4{s!Q5>`-Nq!scLrV9tAF3FlqAxtJU%bx2X#P=qjXPDKdpB$L5))_@jf2 z6~*;b=if~G#dZSR7V`_VHX^o(m+vsSRhmm8==~mp_sIxwQy2a%pX!B9P-&z9w55^V zjuW{(uvW4!mLC@rM#&9KLPe3-eH1corX|&wNNX+{rD%i}I5e=O9{Z6t4HlnZLg7UZLudTX*Kktjb3tE1ADwU2lN>el$06bgC(!x__=_vXJVC}pWP04E zU+BM-uubcJvcpGMPfAO~fsOcVI2&_n+HgK7##v_(WZ-QNrkS>JfZ&?@_ z>lk)BL^2I#s4@({_Xi;Vfc`arXXI4ii7HrS*_N3Zu%^&&B?mI8qHES;fzG8B(U8?P z`WqY3Tj3q$&DaMqr6YCU1I zs2=BBjI+JsuoC+2et&em?7iUd`S1JBO_n7@7pPGegg&!S_W z|Jr^wh1Qyc?c4-mDYR%5M(?L+?lgKG?gqWe`m9WmViE|~c2+vHtSu?_*gwg_6Us9C zuhTdE`(g2)U86#k(C<>uzk3yBHH|%H7CS}Lz{}>PL?KwXU*CCwtVzLdJn!rMJc4S= z>>zqj7C6T@mhgY(BCo?F#m@s<B(Wvj+uj3yn%=B99wr*3XgSB*EoMU^zp`8k9>RujX-Y<%LP_d0}0 zEv^r{1=g&Rz)y`!+@$598EEmhN)B(ZySc!L(>Q#Q^)B1-Q8#@gLp^R*mZMmHEP{hU zQJ6GW3pZggsC^y`<|nPlJjVKpGa{@@vl&VsXKE=zkz6*_n`}iO4(3D&ccKZxaJw2i@@$j(8R=4 z23zy^FB+RO#U@6A#cCS}BO~URQE_=GY$Y9u4tYdJo*W2U(hvS?g5fCmcvO{GZGc83 zi&LUDpM=+;j{oZ&lSzKyD1&j>qJSSB0nbL8ltVe27A!E)QR6WAOq*7WQgzo~QHDso zkTooHt`y%>A-UYxBD!675(+F8#PA0on-^qKl5iu{K>tG`jXl84`p1cRQ{@V zHFW7_JYYxx$fPa*z+vX1(~*af<bk>YUIHv{m^Y1mL-XSXWQ=mf@j8_#Db>S|}z z&v965x}XowZIwC6kE`(#hbSG5+Q~9t;w#ijX>=f~CkMhShZV-3lGDVP${>tj)`kG- zED8njjdb{_F|X)W%{AYg>4)Y-aIV8HP@%nZ!`sCWt*!rYmgm#P!K`1!SXRnoZ z9EBsLKwO|U=xFFNz(}#eN%E+LFHanjP2V%#7J+x{Z&t$4wKj%|85ve33frAIBw+WP zbd!&68Q$%2n$vOyV>T$Pe6PFtzTw0}2|z}V!k5tI{_xb|l`!jkS%nK4-J$G|ko=X@ znkoak|2<8PgFiXJyiKFCC#v{{enjo|Cxx0S#SN8IKX6F(8d9yMpQIKrpsvw(T*c0E z33OR{K_vjtGYY>CaY(&mazinwBa?EhAp9Y*IupOc#+pV)S`}<9$&{}{&`ysvcHzb1 zo}}#niUId@-TTelw4l{}4JhAL`b8hnIYFizXJL4)4%VrVQ0UWq@268q7nt{9otpkV ziDS7q@T~8F1v~{5(%YEa?4iEaM#GZ236t#$6vrY0$^uMc6jlv^CYOGjQV7)C@|`dE zMbg)01bKZMim#lUo%9>H?&m$RC$8%!{7uA87Ys!j7~J1XayZ@|!)kj*@v^>}9ll4} ztmV{wjuyZ1YN$44lznsl_#^a1k})?x$kg+^Mkr*o5X=-!{#WSf5~lBEevkAIy8L8n(*crE6KK5P9#Q(X>y<6G1mck4XpxLs?~8}DL^CIzI3o%pi92^L1O{Na}p_|(eF z)^&L}Nb++NG6?>D1(Fh}Ds=jERv=HVS^pv6S==K7S=-=sm$tEm2#!eYV!$`npSIt; zVOpS<-PZV7Di~^s{k;ap+MbqvFw<(24;wVilJ|%980aE1F)!suGq+*PH!&=<6_Se~~Unk!-?HJV*0zoUMDM_ep zydW*vUJI)gg~8wb=f`WB~9l27QBEBfn>3o zXdzy-sq_#@Qq1T-n4A+qrsr9_obpUC2n9A+4MkYkr=>)BVd()M9!x$4-C#aCWhjfw zYGnY=NVzpRORwC%nfHrC7_Av|LF2T;ZMBCq4@x9(MCP{QRCBouI;%`9>iQ?Y~KvNM*6n;nN>|hUw+a`l+UhL9k z&XH{hDujbh+;kFnmm9J&-t2#L$$Qg%V8$6hY*IX+#`zP20EY_{7N0`TGDq8|bdHBP zR|aoh$#o!Y3zbaEfK{2fAF;W!?z;URk& z5_;mH2hLU;3$F+W8W%E7$_h)SJe0?10)iEv;J+<%@N%IBn=P4CNS2tPJBx;FCkL{p z4&qfyi`oHTdegoUmoUMX97`bU4YO`7I<- zd=zRlbz*@%%s9i=t>Cjz)*q5kAE?`x{~4TM3Wl0L89tu}MDmQ(e%){HFwBq7{5gJX zBPuuk0&y$WHKAh8XW2kQNUK=3e$8!ZJQc~M>z$9mQZ`2z3Yng24*Twe3 zn&8w#nx_6|d*0>l_=#N2rV_&SM>5(F@elV1jGWk;RfC#jypB&^3%>Nb{U{=ymtvo6 zodT`=n+2(z-q$C^rkle}o7^qaqPxqGv$4N9DXDw_M>JqcHJ-Gelo zxw`!OdmoP-A|7-Mev_(-585L|vF%8vRh*SY+#k(8IJsZx1yb8aH{&Q8{BBWsdgZo8 zQIP@bOhrekioLDV`&8MlPa)(rnDvY%6B4m)+sBzzdF%hU((qyV-#Yo;S0!+`B~vV( zUr-qOre*xLD(cpaej^idZtfBiIR3h;lB3LW{nIpuufEF-T7As3ZsMtOpU03hLGL@o zDwkV75qhHca|J`cP30ih=heJER`8ayOId;EEEn`$wEh82wtI(%emnTACQz()uWL8m z#Lazd;ym4erSGPe5(8d7f8osN7YEp>KT9-*sU(1+CqeNbWb8=%ClTR7nt%^p1aWug|--~ z_<7kRC$oY`QL~LoD7+KCg=?i1fspMTgI^%T|6l_fLP-L|cKjPck53R17C)A`n9e0Z zisH6C^ByFPmJ%L}yBxJqxR2gnfYl7RIP!t7-ya<58vlo-Tmgg((P2Uq)fu2$70xX# zq4vN0CnpJ`HeOX+$k%}8KHe6G-d%rfktjfyJxA`F3{J;W$dsE#od;`j(Mk^W z7|?c3f$haYnw|l-mDZ%wvQ!iik4Hp9M5>n#JYlbWED(QS{kGDJ1IxM?B3`)O9mqY5 zRpuD{fcgxd2D61Bq9%SfO6`KJV?nzT4m5vutt7OicMooTMoFn>t(qKgFbi12Q!J)j z(V|gwtc$ulx#g|&E@ZmRP=g{g$I!}|giMO{R^jYn%Qe#>G%NFP9Mbij_<o3+eirWUwcPe6>DD?Xu8pI(1k8% zQDTj+90{cjp4xP)i0X_^t)-pa)|o}Aq&PD6aazSqXj2QLNO~UJVI9#LB@W@{flAi$ z1|SW6TNDLm04H!mt+%X6S%oj7Ohg%DMCK(@zhMQbnq{aU9Eqyy(p|iR2k0lKwb91r zUM8^YhdI5w?IW$~Z~r;vU-s-5kX2#r=5()1HbdKjhog!onp{E;zBYqmLYNQd75Gj$ zZDd8*5FjaST`&8^LfNe7zR4ewPw0=_GD10>9A>1EK?|(9)N#_9353EkH3j9QfZC_U zDq_zGvtV%iJ)<|C;3mts9Q?K|Lo2D0i2_>&QJa2JI zbs8pSyg$nRAqq*-bF%H^2{*np&_1UJq8U*ln(f5KV^)yOc|sxas#MBVew#( z>m;ebSL{_I)MA+aYaGWVk&0oQL)qUNvXPfc3cleUK_mu=fj$vLchQ8I=Ap@~t-a9vxc zR-)fy#uHy@v!bfKw|Nx<mI5gq> zPqu%`Km5kyb%=hoJ1k^i5la!e+x*RH;ozk{we6j7gcLe1|BbSBCHa7c1SK^_>@rr@ z*8R+-W8ix_&~_-Vnl^X(uj%AL47qzFF~;kdd+~(`Y4(`6S(7TT&7@W(L}#!gD~RFk|S8r+zdrtN#cekM4;N_Rj1}vCOkurnRY>5S9XCEc2>`N zY5EJsmr%u9eabfEdONft#yx`2(uL_bj@&mSkW zJ(f>Tk?nB)p`==4TA53Q*y>X5Uo#w~jE@$}b&znr-p}oTmdl;jQ;B|`wq(_rlXK2w z@9m&VmUlQiT+>e8LoQJKE!b#@+uuY0)yT3d5UcrNc9KR ze2C%Qf8zqt(3qaS`F$sF))qF5BDwC39a9-juh+LF>Nhw^%_Xyi!2qj&K$q%Z(XoNZ z_GJAeSbTI19+aVu6|PoP3l|c_f90d?juu>XHko`5uWN~7kL(vloM$#nt#n+?ONSUV znih7NNplKm-LShN0s-e4RDts;BQ&EP z)Bdq2tFi9TJ6d!^BDXoF+Zo@bqa35gp@C7|@ADK2;7=?3pOXrqKt>3eh8 zenq=={R;V0!-1yr;gm-2w`KfUz5kUzHa_%!Zy|b;zmDgd_%-lx?~Q($Vpk;_1q-y7jcfOYYA!IJIAblA}u4ISlL@hPWxCju3x>x zYvRyU>irBKX|KdoO$=(>caDJ~(&h#^aaKx)8YkBr3u2SVad@BXxc{~b$1jGR=J4@& z(XvDKpNGBwlt}Ii2Au_|s5OaAJ{20j`5Q=jynZCe@&Daoi-EP#jHuKXF6CN(%uAagXNZ)y2 zANu@tLMOUL42;U5lTajJsI)5W5QIP02}`rGtlbr~(HG*44QzBK1N%TzPqklU-uw61 z>4kmwQO<+z?|&ma+w3elJAT}}-8S@mteey(-1`0rdac9D5B_&OY8>#8r5ysyjeUno z5Pp-fhA3fMFWHcoF|KDf1psUt=I_cAwJDpcGM>i?x^q4$R#WGp;R7 zvR$*dnAGf1LPXe@frDmH*+CBb!6G%ReiWlT#!X zR=^bFsJ%BZ(pdE?hc&~KgFZQT!xO;if9+@3av#ME{)&$y{>L# zEP8h>VpKk|#!SY+?(*OluIYTJ&C?h6o#5^agT@wFL7xK@M85De77Lou1Hvmz8r0A( zmpTc?89Z+F|LVBsz00;(k^Q1h9%PR$#cH$|~R2N;<2^0bX&<9;5HE=dqjWyTQU^mzI&QrK<$n zUVJn8^pd*rKaLY!8=99#O|JrG_d2j+3lT-IOLRg8E3nig5=Sc&?8dOnd0x@b=Ye=~ z`uXqSpL4K&1@QI3g8IQ5tY!Gm#WczM(_!b;#e4jr#fSnTVYuukfmJ41LjQH3b3&wm z2smi{ILkV}EJM%kKlx85EgQ;SX`hA}Ab~Ic`M7{&=0oK9AWgxKDEJ89{e#+=-Jap! z`sA}`loJwj$4)FmeWgyJOj|Vy_o@jP{hNV64dMplOUyqu-CRIL-n$e} zMqss-*wrVPd1Q!G$}bU;=9Mud#wS8n0dRoDRHDe}4JJS^!CL2kt{*Zwy z@`bmzF#+u9_!#SwunG#Qsh^LU}r0#9mERchj^ta~q3&wV<96ga$6FB1tJ6;EArR7I*J00Xs8+c&CS9rrog*8J zanwN3UQ3|G7#OZl#g;j~#}oeIns^2w6Y>Sp6^FXEm6u_bAk{90K?kJHXq$BEiW%_jFq|0J$n#Jr_D^0CsM*0M2(4BuZG?7=? zm}4kRYRY_<@1Rg+h+K!hsVfm&?o@!yWFs_$l*P4kU?K;Ege8>#m5#6ZhucbZ--1p_ zXH#yN)&6#xXO^bPzPy&P^_+56^RTYIvj)+98q{j3OLOQL=WgmmS+OQyWAf2wopVc7 zl`U0=I;V{7J3?ShNtt5wIl2Rv0OYC$ocy-Bo)cw$Pj3i_oW3*F_JZmUt?NoHmN}`% z-?;h3glBgbe;@4@>JA2bG|!NT^TF9)!d2TSCy46oSCwku`O)StGek)Z3L8aluG!`4 zr<6XkHhFAqy`yq5phW8)Fji1|+B{2U{-!id2~)lbax36=dV;O$88#uzeIxYyX3y!Q zs23zTEzV#oYGa*t9U|WuW!D+!2)gmICs^rl%jT9QTK=w<%{V~Nqm2Xh!u_B!(G(C5 zrB9A8gZKSPA)b)!&cfzP6O<58ko#&;^XbS(kY11@bXPIH*;BAh!iB!`zV>;z7?yWL@^5u?PqidJN)oJ?S6q7_ptp zS)DTT+g8zcgBx_nhP_SKB?>6h1BxWU-ahX{;p1BWMd!Zq(J&4{)&0v^N2!w%O!7_l zM~>Sm*C#N7<$X4-yy>&Q&+;n-DA)m+NN#urk+4@l`sfXP{CW}S1)hHVx`~x}TXQ(} z?*$)0qW>L17>u0(S@aT91`|vzR?Ul2P=@*rO_52SY*m=HFsN}^cB$%tk6OhE+^Y;|5Amgc2`w*wmA{&v_ciJ}MaqX$c@tl4XkyIu*M zf6cp-_~UtuT)WWdk`rIrb49KDW(YnlDpwjvC z`gfKAG_p&#VqvpNeX41ZVk{s)4}Rg8T=JnoGLmh z3Lf&)CP$Kr(m@976aHb%Do26q1QS1l1mP-#Ge8ozF*0)PMHUFZ`9NwPU&$x);vZq* zBe*m06{4Wt-zb6#1Ttshw26O?wU?<~rae@2`ymTszIIdK8I28b;!adn6M3zgg3LjP z05ERPYtg9FeFS#)XxEAKV_=Ev1-27H5q_MwfX<&&8p-X79)f4mW z63i~&-@{zhuk`luai9n~QLY7BOvh{9nq(D;PYZU7f$%ie3+?hdP zk<7LC1Y)!@*BDeDxe`25sM2nacB|w+FyOBc$-LXfFyAhv2(3RaKZVU%Dnxyof@*46 zM^K1KI2=lNYT9Ki_kDzx)#IdKLm1n~S$dyoIk@Xd9&tO*;{`-wS{5CZn8BqE)y;$1O%KaA z*$y7>-G%RWK&vmbYf!_!uNEdN&^2l zyV5jsKOSio#Govs8JQujtDpwSd0qch`C;xjVEYYZOpQK@4WgXM!$?Z1GJM`1m1j>W zHsZV?VXen_%p1T);IeWNG2}o1gu@h-e0)WA_4L|NiBJ;s(v#KEyXFEZVaSADV#dS> zAzL&fOjzL$;8NlDwEx;F{nq%%QYVv^Is-GISP; z@k_0?!?w#}oZ6zh9>x^Y@rHT$Bp3|m#tIEVG@-3#XT-z)P{MGTAfl|hY_-FG#D~&- z0q<-6ngx4YJV%6BdP_^UwHtk&4|!&U&$a^}ejUw`@oalmuydw=)&Pf>wS~I=6x0j6 zPWeBq|2sXY5LO8dzYTbA@m|YRxtpEAY1fE@-g4y7R zamZKWPnAzh1O*zW?!y?cu?r#%iN$9JoU5sU-S}XdMWu}Iw^TPu9JnF&YJ8b4ymsD* z4rO6T;`%g=F8sdq6W91^b@w<6c}MNjZ}2|pOULIu_%hj&q96{q{TkQ*I_Cq?O4)2jES{qEb#naA|Y(2vXR<24D?uImnSCxPR0|Kr?ym4kmc zyd!zWAH5L1VGJ&${4_(1Zl4Zjp3*gSwJbboB-v`w2YT zUK@^~mS=(8f^9LB$9B(t*SX*2tLawL%ii60{}5L$1!8=AA@LhD@NaIUmK&|eKA8%kyzsu5z#5jPhqVPR7Em1Q>e6`g z`2cp=f$7m}{gFNGG;`Z?8YgLtD0e-pEKBev2WgW0K;Q+LYO{O<>(W_(^2!f5?B4Wg zh1`0bScxzW<=h*vUl@|)BtKjOBLunjiH|KSMB-UQKa>-ldpz;UftY#MK_Yow?ma}D zh#*plthO(7K89&;iwyQ3B{Fcbc8FwMR8*rbXjl7DQame$;vhePXSbmdpMayOyorkx zcF*V`vh=N{gDD}0Eh>D)B)RD_j}lKMa1X zn08349{51g@+LmfV%l}sP?Rh+A`)vWsz=AIB>N7%K#UW zJ9Go^Z=Og0nhU{ocR(~OOKp_8jTJ5d!}o#SQivD(5Tgo2J4kCs3Se6i_}(S zIhB<#dYH>)g`z11bsmPF%D23cIF;e17GWt;28CLS}pZFjWW#qY;&4Z z;#gq}60^)OE%M24Xws8ye>Hd&9I)BQ2FJj7&>I>7gz?Up{7%(w3H}o?;vG#vfSX37 z2<3RbXbTgPiTKj>H`-JeSCMDAUCgTBo3w%sGUw_tPAa*?qQH;a0%PkuPwou|4qkkC z;k^_&s|9$hg-M`4h9(9UaA@Rg&gv0;1!z^d2V7von`Z&H3ErBL0+GSEvPDOKRuSos z4)gQ1Ab6D67bC`KKC5Eb?+KQK-CBDy(34h~sZh<|&f1u&(lJ8A7nHJ*_Xp%V5j^P#_Ozg=OaU43Yj7!460ikwr>6)BSRk@x0L-H;v_s7kh}_G zJSaiK^vixU!QPNMx@w75rCDr>)PB2K-V(eb`#uhGvA{QMi%m*y_(^K_enkT_WRLQE z%Fqb(B8S4ABi3Q8v7e#UQLJPfbK$VvumtU-?kG#6)mXFd^052_SF&8;wx)E)hd5dT z5_r%iFk#2i*)eI@ymtfT*YmYb^nr?9B5OPe(|e@=@xzmE!y!Rb%NosfX;O-I%u*4( zCq%`GGdAMGHniU=Lo70zEFqo+lBrhXiBqISVbN3b%s3Vp=uMET(72)mZJH|IfKWI8 z6;x}qPVne&T%7|UePok+11r312Ck8$ld}lO;;Q_d@%%n8Y-{{hxOC*QVhy6v%gdP$ zCrak6d(rc(u({J@P;Xod{cGq0PB(*cwwJI~gV<0_L#q%7Q2c5Cl*mFyT=K!%V&vQ% zvMPKoJqS%NkO3P-ZIlo4yKBFnT0ew-==vP#6z_%M^i|xI1UtreV>Wm?a=x%Me7L~* zFUhVG4WuSKIWcB$)MK=yCege11{`6~!pFqrg_O6^*ypR-y)T-z2)%ZAFNMUaVvs>3 z7B9t(aq5W7f5-E&aCmHR2rF^Jb)`+uCj#>5EiqJEHS4Z$pT!`@Ix3Ke5cfjjS$-MO zbIldrd_1NV$IEJ(w-J{}qvLQ6mQISVwNv3Bw8sZ_mMQ6c%2;1CzJr}$4sF9QmpzN# zh#T#_oj%u*iEDx1Yq+=m=0@V-`)$-I>#BM`Q=v@@FBbi0T+H+C3IGr8^Nw=hR*MHz z-XDTlbX|H%ycVBmj+r_Cs7w-Y_JE5Kyxhybjz2nmzKa+%ou`hH1TNKO7*--VG|zWV zGWxy||1^9r;R4llY{taGT=t5nu~}~OC4u(<@FYyy38D-F$ZA%9wC;kZ^)_HmST`_T z{kOrtJ0@;{&o2A%e`Av@{ubAfAg8YR&fYDpUYX10+jNRQ{>K+T3$mOqD0+Jb#)DU{ zZ@9FC0>L%U2?KNdxq4`j*q8g+g7z}O*K-Dum)#QvM)$pX0ptIcB7)9x;EZ_RAd}O5 zaI-J}8aw;$f`ubix>0@+eJcB!TEdo9Qb`+@#|+#X2b*%jEyv?D+eLo9WBoiq&RJN! z4`m{btslA~f6m{&cz2w){od9XeZKCp{x22P|DS6DlVBW6z8p%%s6R0aR#$3HSSEBHOPb|bmS0xj1^gHjl_@k|juD+2RD z#khwQ2vq&w1^~4PAfIK(t0Yyhyf!H#Xg@2=ot%Cfz%>*cCgmGv3dqDBp!(S1N}wI4 z_;|u9c!C}sVKRlDT?&wtrLmM6>>HIy5uoexo04>P9k-1q&E-6r_^y___pieR zGYpA{6_NGbmeB;00?0T6Bn8Aeq*fuSKtTRlBuXJxrxinKg0Z>i|DEU07c*`F!}VAy zo||%_n}SX&|~C8LkrDsaz@T&M1+_iN+A|`m9V{7L)EF_ z`J(>ObZBUumf6!&cZrXFgc#68iqOi^McRnvF0qWg_Me%#RyxD2B*vn_ zks2AWmrQ_zE=&KW`{&zS76_Ax#}Ds3b^9B9%Qv~`6X9{F*s8Czww9RygVcTPLnYo( z`NoW?IQ|k?8}WK^i*?D0uwLV$>3n;2dH*7}Q|I6gHtYR!f$WNkn!c*F#1$ zO8GB~kxm*EnW8$qjF>R0S_)8BlBm-0TMA9s9pIJbg~=O0>n4?S{*77na^p)6AY>a|-}CqkGK-g{-^j z^p+N}+!oLwY{E;8U)O&RA*-T%mM~csHD35ahsKUgbh8t6C#PBe6RjxwK7Q*;xDfn%lt`imoml{X0w+rvQ2`bOZJ`8g$ z#4DqHcyd3H9`q9CPcI7isv-GAzzM>zfR?NH!0WCg5EEuEkcId|VEqV0idaHwb_(;K zfEX7!dP$dtSAj{`1vCr|*qEe86^nY=we(en-ows}RSZdFRw>7BIAVl2f;jdh?c`W#JX7 zk)SlI<*0qj)`qJ)-%unwG;+T;eRpG5^AbAfBV^QXTrsJ4CJE|)ehdfU#WDL#Q4>By z9@-(=*LwMVS|vONbuUMzeSN9m+4fQYXAZJO<^NdSD7`+#Lz))xSWI}8bnOkS&v~nP z6>n564B@!f?G5_4@lxaRv!68u&+ zjLZMvyH=aZxCYn_HN`+n_b-M#fA=4eZS#nOZ5uuyGf865&yeo_4VqxCxm0u8v=HY7$qY8pQ!)}Q^!41BFf5k{75h6nn z#_r3D?VIAzR7bwSNrnyC_U(gtQ)jIyoz^06i5stbt+%t?mo;hUfv0rd_rHy|e>7R< zgT+{PDR_O*#@^PsL61vmBqqJ_BjC#O6ujeI586vZn`8+b;I~ITquKfcBJz1Z=lD{L z?e_)rBw>3I>qGrjZ{-%J#YaoJ*3hu*{Jol>2-O$l>5 z5q+{B=JQ_<&MjdK;-bG^8IseB4zZQ>6|p3g`SJ;&rV_OuVut5LAhYNp5rHUhWCokt z1v9Su;o;f$ zShdz!GcD7TH|5N*1Tnz)v@RnZmLk~oJ_(mlStmgf76~W-b-leiSyG6y2a3QGh^J;XG!e>sE)>j)`)mgcj07c?WX)ywvbq z5qQM?@e0ZX$W(ci2}T@co_V%~fB4Toa-w`Qf=`5|j+%iB(oJFW zbX1BUW{a_zLDLh$gte**FbfDXPx_v1y8IE37r*fMhb970O9;1VCm5XwD#z)s}nSE+@>}@gyIK zzn1_KRJbM$LDSh$X=Fvr=bQoFWacy9p_1Y#OiLwzNEi=~^d$A5tH8yqwW**@n0rwb zB&PGVh0I@!4132B@h2|4f} z1@C3?DTVO!DR&rGP}-wqLZ0T+YoiChPl8bKe1=rXy1=(#kT=8VtwU2w(DGhWDd&dp z6};v=uI49|ke(r8JK~J;yh~p}7yRoPME?5~?%aE;Lbzu`ezL%!Y8Y%r<_Gi3PWO`- z;4nTRf92XO9m_KHpu0iSMJ3<4hYh2J;MC!tULB0>b8N~Y_p#e86@!n_wMnbaB*%{T zG4diatxsPBbQzmF?#xbR{bx`NUDvRbg;Q8J3_pGkqIDvmCIYtZ(X@M>$R)1pv*Ag5 z044qJk0Lc;9D8rC1%VICmfv}|JJkC5E;nDT^1a5O9!31m=k%Gho3w@p!Q+genKe|A z=TZT+9o7e5t4jtKT8-)?n?go*url?bz-n*y@weXl9m)#dq_x)3$HOl7%$)?WEk~k= zrbWumaxpcBZ8O84wO^VUVB!Tsz&9jtA+It_7$dUzgF5s|)mS^#WFm{B zCpYe^QhMb;!soCf^=TPmzX)@6<_-4JzU>sz#Xzl$7iA&=Qi{N+!x0=d9$%-DQ{IhL-t;tNp!^A_k7KOy4R3 zlgNjh1#>!rh1f0j`e#@L)4nk#o`WoSRODOxhTm-eNIX|k|X>;C=n7dk`E z=~Yoo{VF)rF=hMtUIoG$RR_sreiSwmqoBiJ=ICLN4yr=Z{quyQ()BPiL*FssMbGH< z#q;hfDw4(9WhtVE&R*0Q6Ae#S2$_-mD-m7SHA3qF^-7(CMN9TpvHmv}%9el9j|DK2uu9uUD51K)jX zDUH}v{vehbv*j-}fZoMo)F9<;jF_Q6{@bmLu4jxrdNfi9VcM`|VS8?xgDgI{%#8)_ za*y4{e#T^^=n;}&%2i}dYh3*Ge>iC^cNqqZHrk9VmFf_1nkYb6bkdoh#4U;a%>K}v z?l>kObuzPDxnM(L=N|{TfzkmEyb4Ng@O-LCVL$PGH9M84Z9JGxc^wM?QI_x^Sa)dC zewQdgbvD0g4|Fu)b!0I_BB#|67fL!T4kxK}TbE4@r2S34yY|7+L|(~-GPdPgvm<|m zoHE~S`Q~gcF`Kx?d4phaOtbhH0Ne-WQzm#us~8~u0fXitc@nxgk{@2xG{JjMNx016 zT62(q!sb5HbxJ$tlUF{b8V-spvZ{Z#fFED^CelnXn11i47TDdQ6cB0xMT@|M1D}@; zWBc{rPd81)R%qF)L)AV}BnQrO8(o+u0H?}oA06wHiiw(4)thGCF8 z2*_{Ph7c-6SoUW4>i9Pz5*CIKc(VpW8{~9fWV%F;e(Om68nfl%)5YgrIyI*(yEM8vb0rjjVVPO3qn;9b{L>1vl%1)|Mh6GCInus48(NoANzJYMb0#Tk zHN4{iK{H9zAMA<~r}w)yW@)Y445=J!I=+hGs& zFCO6k%NyEemP2LV1udE+{_quEJ`TH4fJ7RnSMX+@>cYWMNbt@me1E0Sut9l2k1&HI z9XoGu%s&ryqlg3gz0i`=HR?N0XTAC5&13d|y#9%636ltw*pgJGIQDz_9L6(J2d&mP z$Bp`5{(4=>2@Y++fBllj-2HU@-GH*n_YoYp)cAhztp_mrGo--(p}Rfz{ORZ9l5TB| z$&W<77p-M2xb0cg_lszNIjX;NXwUHYNdw z;HuxR`aRyqUzCIGW1;H*yA&!CpFbh45bFE-CA*+UZ$#@S16wrB)OqnQj5(OadWKwX zvD5;|u=mHN-9_S^6Yb4VvJ92P(Md&jxmR_i?6rjdAmaRuqiad)ZL>#vh5#Fh8H7~0 zXPOEJFksvo`uGTmn!}(JQK0q5bFpf&LN#U|($Hm)$&%U8i4E_E8b~Y1>rYe8w|6`wLBt|e7z8#=y1HQXDsSx`s(xo z`JHBr$Dn2z?a=Uo9c-q;`+DA4emsdCoLT{NWs5xS0=sO6W%LxGPfAzJsvLIE`QO{UkkHbsejVshI zf;12*<0ekYzDNrzzp0FOpup!lABaor&z#hDKz4lJ9;;60Vv*pzYhu;Z{0%6&p1uF~ zZS89)g(Z>{Lx145IEkoW#SyvcgN%_FX~I}SlLx!UPBhm^Gek<|A{`@ZK*=Dfdq}7< zrAvewgG(m)Vi*2h}7l8Qe|7G?UaIms2J>6o3L%bYFOG#BAbWHUjXk80mC8yg<%eQn5W`*y6Nwv}dKm6MY^7?)e<0{D)R;hwTCMPK}D{QDb_Ck=lv_3%MABES>oII=!N02B|qd6B5GvPqVk!(_}`a(lKNcF7qWvf zYlDhhhu+)S6MgooU&S&tOt~7>v{zAo9+_}|9+uOT7aSEj1_!EsMk#>1K8clJx)8mC zr43UvN!uuBAIw$i^WED2mJnK z{3m$m>QxhnG684&Wg$g~SAo&3mbt#`Mir{{F@nR}mxBiDz znV6KH2#R9p3LxrD*Ya zq3`0-bSSe?q#3rkts!Yc^2$4brL@-!6_Hy9lFT$gn4D0NDp&KiZb71r5JhkF6bn^- zKz3+ph1umI^totc^{(P3e1%YCeXgT@QwCm9=A!r!aY)YV8idNH9VMSI76)-!m$7^k z*=c|ySyfmF03Og&FoY$I-B?*c)kH&2EFEwE{doLSu4)AT`!dg+mN!BsG`~-ZC(4MW zhaDWEk$6)rmMzQ~!kESCgmNpF&R@%mM6bWm$?&hTg`bB}u(XmAnpv!XJt@>J7XrgX zXZXN3Wk!AfCHAwf1gdqJH}-LA#zg_G3`|V5XcKfM>y%W@CZz?pYKxE|WlU7r0oN3U zmp+pA1C``&nED$?M7%X;QdVxZwjpDg5{Q-*Ce#MF4q3%h#gCjIP(Tc)l^H7<*9a;L zd17I1DMBwgpA3EMl}V)$>4{Vyi0dC+e`XYRHLwIZH-ZLd$fop)-;*Q4q8HJQzL8Ho zP1ZygwcX~+&ynaUbT*I;5?gb{2ND6~4>n8%v;E)&BshxHf<~pgXhHZCw&7?uc6%%1 zuLzjjJRxKHCR8*xf>ANNH=rt zjR)&gf912HL&hB;Qh*x&ZulG)7pYu)%O*q~f)O}D;fPVWf+OF&tpn2<_Shw22|s)Tz@jQsqW_H3elsMy_b(`Z9&BD8>C(6ryl?O#gOOXb$k?~C*N~98RXknmh^TDH z8=5}YXi`Z#il+t^BMwoa$?gN;sfs+vOb=5IX|TLCp?G|SQx@FB?C|~6$k03Q@LUlz-|kF&THHo< z_*0G+<@&Vfn*~n1{Dv8(|2)!&gEn6!-x_+_VfZFqjcL;4t-W6~sYWi5WW^NgB^>U$g ziJocSINEa#yoDH!bZqZ(Ib)L1nVjpzH7|AUVC=n%;ZCxEk?F1P-Vdi^VD?^!oy>1N zI;{xy&Zl4+z51t_$Dg=Vp)BhERD{Pk$9v72BKIds^<}yG(wI42;x?SH);|L{s>~xS zQ^BDan5;?MrEc8lIlN6^-efn}L@Hf}e*5~z@L}tcsI8yhTCb0N(jzL@?WPi3gfCv? zdx9i1Xq&?*<_pTm6EWIc1}ndey)48v46cz;C@}k-qiOLIu+=5ar^KNMzUJn{hSvX$E*l^q|z9Hg=XnFkUTUqugH=gp^E% zM5!v*^RYsHx&L*kpjSDb1RJG6E|{`0rj!;m#9%{*x|7c_sjVitjfzGo6$z9hgQnd( z2~ex&4=v2ex@W-ttzh(GjAmWPEWnC}h)(Ln5I;#&;1Csy3AOGI-jKVu>Yo-zP7Y1)gBBh#$rno@ z_|!&#F%h1NZjU_a0?_~_NT92-C~ks}`VzWV@Z07o6C@H~1>dW?Gt>;a;i;dtl96KI zx$FA{v3By~mWILFocN9qkj~Bsk=6YTG^Z#$J{j4F5i&awpBK#lYrwmi$Ejg>tRg7MG25pO+6L2?Td=?1?L6ba9+`o@ndR@ zN2Sb_^f)}5AWnq^u1zDRRy`pdhqK&UPRtO5%wx)CcZRpx7upL{2QC6UY^1^~RS*Lr z+>IConV_&22~B#gi9A90Z*ly`MIvG~yNck1bkZUAS4Fzu0iFmsP=KK^;?945C&qp8!> z(e7m};VC&~oukt(<_cCxRk^ySd~CI9)nWe*BPW0By0)G}V!x21{^w3|y%-|vZj>i~ zwdM1Ey$O56t5DB6$r^(tlZ-(CEWd)MjgfgS*NGk+dPb1INc$+J&o5`I>u0}7zUQqQ zoX0<$Cs|y~WVIm*$ErX`W1alWFX1qi)j*#m6oCi$XI`q83;io(d_uyaEo*8zkf_!G z&6Qiy@LPxYQTm4**i`%~rs!a^;e(ly_(tZlW_lcq(!4h)mC2<9kC78UQ#hR2m%xwb zY9}R4*bSlP`90JDekk7Il@5y2?qxe>hs$zYNx3-DRn1$MmeiC0Hw`*gaov@>@`VJr zNnorZ-qyYpN4JQXcVa86@n(1>xvJ!2HP)I*ol2!GeDlT2AD-QOjFyV>*1#LtQ*&wo zi4f*^N{6;hvUCHJk46}a2Bgk?l9wrr)gDK3EAJ8<8GI#;xK0Dge)P9&tmC8r33tar9hIEmf ztKbmMf-ApI?#=2qZu4(DHdr|uP64B-4zLpJa{((mcz%-P86WDp4M#%nG+ z8wDPgAd;*zK+^UfxYuds76hFhf~UHFbjcpK&VK$5L^le&Pk6obe;CGl)sh9b`=UKb z@@RK(NM9ws7vmy9n$3kx!U=&rJ)$QBE94gHEfy2O_nL&MaV}ebGfsqbcwiU#qMp z+j4Of{MlmUjfDXN9+M)A&qP-m?w9n1y2NW_^}4A~Ku>dibzEKclAatq6;$3BSq{>t ziL~qH$kV0T{lpwq85WqXO1vG-h?>&+ z0Tvq{9Xs?q7gV8eIXS?sb!Y4=OL9#qp~x5sn+p)COi_&In4s{YcmiIda;d z7Ukht=bAha!5JsNHZc0lLR`P7f3I-eGM}<6f_zX)sZgVvMRLr=0H)_^Ah*aj2_X2W z`;M{Mr~HacV}O)Pj;0yfaB7Ho`76_8@*HKV#++@DHiIeIz8X7sBi4iA1W_p5MRl7z zqo~4U(hT<}a z`2@*T2t#c6%J;FM{Y74LUQbsmdT}BTG*U-#y5!TUv(oO$r9qn-t}Zpw#FOm=Nqj~XJ#(6vNOBh`?%frQjoxI_{Y!y}T28%W11DLHxe)g6UialYA^ zP&O9uo_lJ)iMG3ya{0NhF4hHqkV~6B@(%t1@9xN5ycZmYv@TRPJO*v5**yI;i60O# z{2#W?DLk^KZQHT!bZlFliEZ0HqtzN5p9aVK# z-Pd`-ik4SjTQ7c+K|=Si-&|O|@*Sx#RQax0#N;FQ?Z1urcWqOp=hFsvZ}*vtt-yrp zrqv@g2swYiqWl9=s5labtyNs@1W0`^mHo2Z`1^0OSeOPOl{R=og>)8wns>Lr+Y6Y7 zKq#R3NP9z80OrOXWo}mG)_|j`OJ;LW1Q>SZ7`@P|GuZA18vk^H?fAZS*wLjp^dm;{ zd!4`Vq8};pupo8LOc(}@UAV%HJ4qw-ew4=r3EY5BE-2Ae+`mWLKjY-CxY1BL$PB;Y zvNQ&%2#-`(k9x!esm|;n4sB;2Xo=WVb^<907k$w^}O5fp(t3(N(O}@F$3f{}W=6G=p6#T@o=+k|9Gg>RI+L*QRHSkI9yZ zLyY0?D_vZ^*t9|}uq@$uye-x!wAV&LYM)d|TxmTgz!xK)L5t6&&;OjX#b9z%k{ka9 zo<~p>UB#>=+mTpz72j@T>sA|Tap^(?_IT!62Vq3j9$(LyAm@0|6H}PY6!k(e!CI=frsk+-u*O&2-1(@ zt)B|rVrM3wAS#1dZGY0?gOApK$OEKc2#e}-(w)oCwA&@Q=a<;W^uzCgtusevexzm) z4SU?w!jgZtofMvKg^Csc{`F3vpDZ5YQ1@l5nT}v>2tN^>1PB3Xs?C={L!%J;%4N;4 zeH?SBlQ^0~YKAVFK?#Tv;0^(_B%;2J>~XZ28zU{?{cyc<;|x+OfLqMW8z}5o!MxhZ z|DRx&3Oc7@ujH1Q0JSqqZFfwJB}DQEl976iTUjUO-58o8Pd!J5qKD8``yt_pP+?ZD zuU*+&>w<$MC-rw<7qa|DLaB^;>6cH@zhq&D6}K7u;mY4GWaUiqhG*~(XW027 zS)e)Q*k6VKA$!lZ?4)#tvf4k5npc$gKR3g0`49Fs!7Dla0o|W(zqO1WhyOFkx^~@5 zH2tT<>p0yZ1W9Lie&sRaecs%T?YMn*pbnTg3U@!A5M1j!-{u?ncU*VP_JCeBw(|dA zFUB%{jsrnoy_DD0Yl8LbGwY#!y^7aAk6zb3ADgnqXec+%?vxLier+wD&g4EC5KqE_ z42k(OAkXNo-?N*!x=VS^!{__;buo;fK8ql2oZrK&*JiKwm5UQ((Io@Hf6>MtrLyqef(7bm;n#7gKLU-h(ke`V@( zkxVT7C0&nL)N_o;V;GR(vS2Z_GRi6ycQjYT_OJlMkjr**R~xQ);HJUO>u%B}O0k1dMYz`Et9;|+HN&;G1#)(dLP8ANXWNv$ z4xsusOww1w5sv*&ReWF9yLrgKzumX!Cr4slXwmv$9D>Yktk?y+*hcmAx~Zr)W1151 zP)s6`0qfMr+dDRqjeM|udmsHqT|Iuc+^NRL_p%ovH-i%8>ym--3bvzhTXyKSeaXy4)2Go+sqyM!G8V!0Di-j5f^A|>3|B$)HpPci%auNF2M@9X1Rsh~{EN8I$ zI_sg%QxfSQ8H=alC$akP`s?$0ahqS=EDt1p)etM`0_id{bbBL2nT^<=Rg{7bRpppk zhcV5ywr`6h~ zVP3jY0-@*QZt5Owu{;b%cf5XOZuvOo7P@TR1C;jH_Iq6MJIA;K<&ONYdv81zWoQf> z2cQWo{adsUGrzZOP}0mo<~xnzSBr#ugF^{EH72~`=n@`1_kH;#1&yA4{AXy&78$_& z_jPRaNkt--77b_BDq?ln_i@b9b-P9A({S9jAZy6kE( z{%nee>om{j>OZ$>@k*Gm3CNH;Pv?yPLzb78qV2Fd$>H<$R4eNaEo@E4ipX_HzlKsV zt81RZUZvlqMkUnNAYqNZ0&0lo60=OJ8FxNau}TDtPE^>dxPIf;32$xU?JUp!%smz- z{{RKns+oc}SpnM~@W57?c8G<|V-}e%4m+emhRJcEf9MpUW_N;i1Fm)YxjK#_*X)}$Q zB5&yr>=6Bz>PDeBQBiG7O4hi}Xcr({jj0_zoMujJDwC*jRTaW z>+hGm<^Lj{=Mz{2HL{vy5GzAtRTH8vX@9T%u6?kO6{@O^49y1Tks$y-n;gE&Q|rw@ z@DAK+rYC{N*{LF*W*5Q<);?7+o0C3w^1rAfe^r5G=}e`nJiGFL$q?x1ex5#75B)&vcQgtWf`rxyObh zgI-0lrrAJCWGh|o_m$mnxgc;9AR4N0FX%6{h}$N;p^()2cfj&+V9teei2bl7JQVq{ zdC}wohYKeO>)HCvetg{kXhF(fqr&1&m}; zcs(Nu-K;|EQD1=LxrKuotc*|K%jHCY@Ky==eEQYL)D-+vB&}gM-?gD?5G>q@5}bOb z6tdSnal~hQw=<_1(VlCGg*|^J)26 zvyG=HMcNuxk7m(6e~t^9c%D@9<$1lujgdflEvNWgdpTuMDJt(ZL=GwC zO6vN37NyU17dAC4n~oWA9wgl@r6?^vYatx*2mC4R^G2EQ*m=4%B*FOnO;Fz_@X;M% z`La3yqTTO-3P>AdX`MM!x-kmWJ_vv0IFPXNUnA%ipYtpCC4gdwzd4B9haSIf4!4mC z*UF@V6tOau5eNsa&x#W?56`G0%s(lMFdn!}ddA$lAY+C& zs`H%{?GkHCzW6cMjevh^0i`z!PXKQFb#*m`k(Jl9%RKw03HgzBEfi&nIR@w0^X|HJ zU4;@xuRTbYeL3ZEZ)Br%A+e98)CbA;<(&fF`8`+}wxeWp!yh%^Il(^`@k)d2A zsP+F@RQ@rW)j+%0^gt2~(s}jw{Z@tTf~|TwM^d zLw6o$FS(STGU85>3QwrA!Ey0BY+ghWzC|&}+^!S^1Dk?dSlbd|A0odV4?KuWgl^@M zlQYOP_ye^ONg8!+W87Ar3Oy0{7Qe#qjR_cXp|oh18La@n6vnPw#AH5R&H~MSou&*+ zS#5X=>IpH*shi_H&5?h?Fn;^_s62lU<;ObiIC;k~nBe`bC@_Y(vx15jz+olMMxybk zcK<+nocwLFQavEu(EHDS>;^I-HjZ!Y`;lQ}XvRr!*r|db1k4hPNj}3q)^RHU(It&2 zL&q{pIm#7(9AH-ij$%G){vPWl=FLecm+$-Y284V8Gs2RyDm;akZ~7LskZDtv#m_@n z-w-!5)gB9{QAm?mnrssEt7d0Xpq8fJL0V8X0F;;1q7}!fPFfOPE3$%+#4t_{o41xo z9~bf;V0DKY3m5TbzCgqA^*5KWDM*pPoyEU0(NSS1`ZqI`;I_ahaN;b+V0m*+llMGtdysH@ z9YEC5e?ev5U}b(Q9Y?6CsIAataI~I=U|80zK{1(t@sZ#P?qhdiqw``XGh&2iLE{x~ z`BU~YzQ=h^MUtyw`mLRl)bboiXoppf2SV?5az5oC|CkMxK{;9Uv&0dD-1veLP8v~a zH%l^$l$36vEFF$=3`ajwIH+aGZGwN^4F~{CC7NkVqjY6FL~W-Wj!3`txl!4q@vWxJ za?J6o$+LwK2hp#>D?CUT?MVhg>I4m8Nt=f&SSlqmi$XdT)HZ69(=n(NhL_-?gl`x> zOS2$OZ228v<_r5eMl%F~C|I@?y(3E^kZrLg5x#a@ST@-FQ4HH6-)v(ZEul?S_W!tD z$*3#u3>rN}8=*XEZ^Oup0z7S_98B91!)zUSzBRQ+`I8w8wV@2;LBI-GGmD#H8V@K; z@0lRMO$oyZJftKgXI_~(#GFdM-aJd1MZXAx{=hU zDfGaX8Jnl?YJd1mxeN_cgr{z?qu*8?pi!&T)%AR#lS#&MjiXR}m=gCm*w8!4dSOAG z7|7k&gyySmEo52^(1FexqkKm4iHl&S>Yal$b798+6$T0~*sD28EOEEc;jtW0ON466qX^8si>K*c&B zkfle!guV1wN&qQHiy!AeyRRd{WClQmvbOroI}`P{!^#F`Ijb^*E_eKQPYX- zko)>4`=wRR$zI>nn)p@wzl}I<;4=+D-mlMu*|(*gwZ3-;BQuRy1NUCkf6EBofpB+MU4~sCU�FfexYHP)EIC(a*cj2TdTh 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%0D|WXKQ@Mvoqy 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

    D!N`yBFvRQ1 z`X+z`#9|xW0yPPOC31S4_Br{0enmC-YU}Kzzb0Lz<>Sg_M^R3uJ@sk&=!D*a#Wyva zG}rDtf;KOTN$iG#kG5UFCw!pTr^6c=tJgYaW$gLN{7<9@e*Xr1;CG^e;E*`mivYYD zmIuJTjw~F{%<bz&ax!LB^f_u=}>)mn@U+4s;UyhRg(~hI?_F!XjCKPU_2YFl#|HF&< zDXMQ1%aQMY@GFQa(Rk5+H};EJ3cVCFbT)Y0kjOFQaq?Ekey758x z;gHu@{_>J>>|*haTQfLtjX;0gAH^oC=};J0)YAto1ub>*ez!ARw5knUPF2lEFN$xv z`NEyX5cIo}`w+UBok>z>eWgtKi#6{h(VkoLQ+eCf{xAI9Rrb~lL3?xDeCyl!y zJ>a-3lQIOkQa;8gemum{0cwG4`*?b2m4D6z{2*r8#S!va3Lr3F_BY&pdoPYk8T#L# zj(;I3x&DwY1?)8=jQ$_k$NwOC|KdQ(Vq*QWn_^KJUU>WAKTOR3l^H1z!Ig5Dbltjx zODCg#p4~j075CRvS?>RH1z0M19joEf^(_Pq1T)&Af9%_>$*5iOG zAyqHYe^y2Z^6Vif_p9&Kb~zp>7x3fXNX%{3Ffx>TFwzC`kG_77MoAq?Vx4Gl|Ay=o!$lpxP39}A^N+8$)lr&&35=$H6!whQBSvg5 zE5!2ORe8sOISN`!*d)tfuldKlzZ>Rwe6a-W);EAB(mHo*2Dg8;wdbrf)ZccpR9#!-UyWQg z#O*+?#zPO+^!oij%eGn6cAUg5jTA_qjVrp)5&iq`5Eb1Xz~sMgFcM&7!KroTbzg71>8Q?dH@* JY7`*h{|91nw_gAN literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1703.png b/clones/abseil.io/resources/swe-book/html/images/seag_1703.png new file mode 100644 index 0000000000000000000000000000000000000000..dc11ba41ddf347b5cd096a666757a55c1d1ad6d9 GIT binary patch literal 39038 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1802.png b/clones/abseil.io/resources/swe-book/html/images/seag_1802.png new file mode 100644 index 0000000000000000000000000000000000000000..486ec21b130ba9d5549dbd768c86a6ac8b9baf57 GIT binary patch literal 15474 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1803.png b/clones/abseil.io/resources/swe-book/html/images/seag_1803.png new file mode 100644 index 0000000000000000000000000000000000000000..ac242f91e9d7056d781b23643d88bf3188a64036 GIT binary patch literal 25621 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%0D+_8d~8LONQ&?ayRc+Wki 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 M;&!O~z%NPv09P@t1poj5 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1804.png b/clones/abseil.io/resources/swe-book/html/images/seag_1804.png new file mode 100644 index 0000000000000000000000000000000000000000..c17dde7e486cad1c736410754c11216411f19fb2 GIT binary patch literal 30077 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 A+5i9m literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1805.png b/clones/abseil.io/resources/swe-book/html/images/seag_1805.png new file mode 100644 index 0000000000000000000000000000000000000000..03c72f9cfb9031723a17e7d5b6c0168e9445b166 GIT binary patch literal 11490 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1901.png b/clones/abseil.io/resources/swe-book/html/images/seag_1901.png new file mode 100644 index 0000000000000000000000000000000000000000..dfadee4e9e18550eb0b42adb72caa396840dc611 GIT binary patch literal 16462 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 INSVL=UleRM@c;k- literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1902.png b/clones/abseil.io/resources/swe-book/html/images/seag_1902.png new file mode 100644 index 0000000000000000000000000000000000000000..54a5583761f6fac9346912fe2d5358bd6efbb69b GIT binary patch literal 46606 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

    S;ADu@F+iu%N!Z0;&@Tg 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 PfCr|eshD;3w(tJ|Sz@Ed literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1903.png b/clones/abseil.io/resources/swe-book/html/images/seag_1903.png new file mode 100644 index 0000000000000000000000000000000000000000..6755bfb42fd8dea58cad0612351699c9560b79cc GIT binary patch literal 262593 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

    Q)QElyi~IX;jq9; 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ð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⪻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⋘eS-5{51wL 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

    }=ozxiZD~AM#&=&3OUJ0->u+l`s`9so54#>` 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

  1. x`lnNRT*Zuyj1yE}vca3OTS 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_2001.png b/clones/abseil.io/resources/swe-book/html/images/seag_2001.png new file mode 100644 index 0000000000000000000000000000000000000000..8de8bb92516f49c58862e5a194c5ce5e32fc4e47 GIT binary patch literal 150149 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

    wA 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 NB{_B3TInxA{}1pSW4ZtU literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_2002.png b/clones/abseil.io/resources/swe-book/html/images/seag_2002.png new file mode 100644 index 0000000000000000000000000000000000000000..72fc099cf1204d0a9278c89d0d88f92f03efc0a8 GIT binary patch literal 26913 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 I^H=`=2VVvzDF6Tf literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_2101.png b/clones/abseil.io/resources/swe-book/html/images/seag_2101.png new file mode 100644 index 0000000000000000000000000000000000000000..d080801c6539a8c3b44aea59e5228efc32c9e89a GIT binary patch literal 13245 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_2301.png b/clones/abseil.io/resources/swe-book/html/images/seag_2301.png new file mode 100644 index 0000000000000000000000000000000000000000..29d4cda22a751a44a902138eeac6ba33d6db2d14 GIT binary patch literal 27708 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 z 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 literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_2303.png b/clones/abseil.io/resources/swe-book/html/images/seag_2303.png new file mode 100644 index 0000000000000000000000000000000000000000..66c3b3652f96d8e976b53f14089e0a02b490f363 GIT binary patch literal 38301 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 Oze~!R7x3q<-u@pU!x#|& literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1908.png b/clones/abseil.io/resources/swe-book/html/images/seag_1908.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2034f91127a4ec8610d37b490ce609c12ac73a GIT binary patch literal 273634 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

  2. 1IFiKvB8ZV*|ef$=MEi+%&ZT1&RyqogH(}VFH+; z9nZP0r4%TN_iVj-6;R;#dc*xP@4kFl;$0QS8;yk=!)i>bDTKLp06<|=mj=`x?ft8)x27q5{d%L^zdFzZkAH-&&I zIlJ4`>TW@oUyNpykbr>cTR7a+z1UxXfI_UO2cf~u%=Bo0cJQl~Q|d?aHBWSf+}YR| zR;rXh`tR@BZk7bxe(E5giL!`nr|~37CPM9f{|-7YPnCq!gI>CP$N33v&XzFNXWf|hY%)sZtj;$ugcHG*;8^K1Ha^j%Boc`4VMXPtwa?xm+|h_BfDH5M&jocEb%PSL#336Sy@u5qrd2C1B{I!f-_~ zo=`>F;-1WBK?MQt6e(W&?@akf&j4&b5emnqFY6qeFDQ%_yCo=gnn^XCdZ%IT?F6Y3 z0TTHo&K2fni$yAG@&K$0AVkbPNpO|g=>p=LMjaZ@W8FIl5FUfP-Wry*tk5@7-Cc#j z{*aAR@GVz^Ac2Uq^2QL*#72gL0t2&CiaN;gqOf+0;2ha4Amps0h;-}^EPi?&jX>nc z^aviu%Bi7SA2UR;(=(iBdLprQJ5qrro?DL0{v(kQHb+l0XYP4}ruo=VWs^S0*Lb(* z#p}fQ=(Y8%z)`0|*FwT-!C{y2U1tFkG&C>h2SI9T;P7KhvnV(P*B-L6wOHQ4Sh7Cg zp`$~TxeqiA9t?)@**Ea%X%W0nj8m88|6)c3I%1C-X`%*y&{y`zj=Jd`I&R!5Z5HT% zH6)opAYwdsG0$fzo%Ksz;_?gF<6h-Zr6(|?@y32-W>StjlE2#b7ZFUQGOcOFE?8!~ zN~d4TQ;`~pO!9WYgRbBtV@|z>0mLR#t*dG(rG2V*(Hocahh}i+?51wnvep^i$>Fj` z@cZChY^K_<2IZvwdgB5Kr;vwwJ`}wfzl!rT+y+IXRUGeHb{Hd0W{p2&uq!6n>}xyq zEkmn;gLrMkc@l9ZxfKnecL6MM!%UZqOk7_C(N&Vm^>NU@jHfoe!(hjWx#C)A>p73? zZwCeKo2G@>96xu)^h94uyZOD*SGMS8*=69$nGDq3`|3a=@{08X6bIuABQ#toa{R7)4>DP<+sQnHVL%Z6tlMh^$zz;`PZF{dZh&IE|-;4kc1xV?h!9_oSwvcDCb}& z{OYOlrJv>NK-`@ptmzNh_ms0D4iR6hQP@z|?^B^GSX24pdB3;aUcH41cZEgW$1d2` z09JgD*lQ!T`HGKMVAGQ9O6^Dvtr(#j_KD=W!PyS+)XS(Fy2#E~#$1ya0S+eSaE;{W zZ?A+u#Y@%;It~@FSQ}r3EP*_aT@RVq$zay8D|z1~3_&e0skoLW`H^9c`?t+JdkvZj z`p?r^hm_6{=#1t}gw)BnX>n3f#Pzn1$>4Rrog8AtlCMTc3*s4Vb@$E) zX$D*~6ml%#*3y^3jxe;Zit0SeZl*1xOT$~`TQ{|OE6Gktv72~|iLv0BM|e=SdzK<)v_=^AhQzD7XGiCm^}UQ$R@EM``n5l8%_dJQS*+-l zFX*pXi6>y!4r~$0@}X;OGj2d)xFmCm5}T7pMnmMQ?l2=pmcsqmHq{9zYS4GZM@lcL z)3Ob$j#yM~Tr_;~y0t}9i7m(vQmFZrrbpSH*(9bU9&TQ_B=<&D>OHKvsusZ|gXA0k z)QW7+tRWz6aH%urR4NqZVSOiG+L=14)~K(_p57Z8CZdUeWI$kq*AM!7~ZS5y1 zt3!?R5Ultn&vf?Hfq%yaTwKINg3C@m4ha&`X7gTjmW-o69LIyNL)kadXYP%;5cd1K z5BcGoYiWjYIKK7jJo^p$yde~1+|7; zK61^OEW;Fx!6&gy?Zg*brX_QPC=IF2*;?&V>uX0c`)7xM>co218-(t)O)|hqk$36F zGc>PnN7PpoIVMh!hsic^a&q2O4h2*A>I`&J`Pb2e|`7Qcj#q3J5@WLWo2{Bl>dulwgZd{Q0%=g z<^!ki`RyxYHiZ{g;hg+8$Ym51(~BAU{We24x!Bx4h2H@kxsPg!RGXN|BSAqyD_Yz^ z_wFTp>Le==9S(dX^$VXUIs0X%9>A0mAFhKyyO=DV;2tlwqUp8KsR_dR!6m@|%idsM zU^t~)Jq@#o5_SXA6r2s0wPW~IRX-|BnsSTf4pOgXwE*|U5ZEv~JD|MVAx&GPUo2PI zJ|oZh;~0z{AZ~k>&IC>cfW@^v2o?MyEoZtz0goC{cbE(Dq6-_uNKpNONI3)dpQ0OY zAKbdlZ+TJq#*yV3lY!rwTmp|rOy9eA@A`2>?dv2vhR|qQO|AO{qC3_t#>RA!awOU{ zhLFVAz#u-UT}vwK<ez!~Fd46ygr1oh2w9(?Q^RDW+}Gs^5z*IH zqhl4HNl^L?a)av=x8Q=FQa))|Wn4au=KFVboPcs3K*L|buNQf>WBk!&9x@z-1Fx#8 z>fg~=r-Pwi*9#v+LbPISHOpFiK}hKCo>sxvje8=xHMO;WkH5dV&`^YQPm5H4vIky5 zHiFT=S9gA~c%Rs0-?|0XE6Z^G%G40Cp7X?^GeEllt;7c?!h=#6bR$-wyyjiZO@&xV z2vU1lp%uj}*c7(jR-F1p!7}+bAVzZs+FZ?B3Gh&3+$S`}7q5Q59}?4tdJN61qCZjy zCj-`$MybseeZgbbQgG;UIHfov6ArZe`GsXI>w)=x4<(kbw|WA0`S?piT28gALQ|A~J*(gg|6g18zmGvO^q&{Q?f%z73s>e(51y`*)13us z_B1h4@PYnoEyXM5hJ*$LuSUvhp-dGh5)TJ-Zd_`2b(wfC&2{O|V)b!QjecQ!No z_f_DQ#dfm|3ceg3Zt55&P9(N2Vt85>WWM`K@%p_G_?4D##EyKeW{=19UV*tc0!Wa^ z_W%5SEAg7(st0d9ct5);#p1aQJMyt*We+7D{QJGxaR+LFFdGT9-weTg%rE{gzwf`^ z-_uL7P4VBqSi|fS_|^Z@7tUw}O@{t`b9njxN1tL=k2eISVIHx6#{k@!t}x~3KgSP< zQDB6O7)tZ`uS=Kqiy&1S*0}wz|251{73ji?7f+Yh7kd9OFewt3x!|$CTqGz8O3L*A zxNWDekcG$oYaD|W-TVJJi@sUn=@^1lM7ez#$X~~nCC9(iSX3kSQ>50mVOZUFIH{K# zKipn2|4b-YpW0FY7sGOK@tP%bhUNO|f~aVkOoUd*C`X}tEy3dDM}KclKTP}V1V02A z0tfbL;#GgaA*rFMNk~9|Mx&t@rD`IByG#R#{sGoD5u#2b!t?B^*TjUBH zuOEsh*Utm9@>09cMQZ2?A~NUNmo$Y1b6$Dy-$0wPbEfwpSW@tsbb;s#7;Vkx>#aq3|8wnj3*MLm6*FoDh?&RGL$_l43vf@fnOJ!`@;3DBSGrMs1QF{SQ&n}Z zKwwfi>vN-PI`ykxzDo3`)=(3xora$czAS*9l5pyp4Us(&TnDK+wEmce3EDgkKhgrs zUQqp(*$^vl9e;lS7jDE8HfywWfzb6$r@HbnF*jX6>&yGT&pT)F9n41PTNH)HCGz!k zb$T5$7$;f(Je$X9hqe3hGv091W-7qcOioVTUQubIVvxut4bCSpHk*tPm55h?g_8zf z&lqUFbT}v$-an)lDF;KhmX;O(ac=y9&yL(1fwX$yn8E!&6st-)De38BkP@DI8n!(% zV`)#QL*ySC8VU$2QT7Y751m!zc~eENz&p_!hSzY*K5mKzkAboE%ug^e)Kjz z{Y3^#r&i0sh;YXfZLV@Pxb^i2vENX5YR`J1ZI$xv`;Q-A!RZKLWJUb*4fE4LW)g2m zmE4k%{RVu}hAO9IBo55lKpFkJHzvJ|m&JaT!rz)%TJOMl&2?0Wx^zFwnuj|ME)4Fneafrz*Dp^*s{f}pcHFf@G{NWw{cd*&vR0wJlNKj zm6>%x%hOe5u)iM&!@6i9xQy|4V7x%y?bAA>AvP??C@+R%8>{&@LS6^97!%3e?1x|~ zZ@{P}HeK@5r`mn4=uO?I#Yep%fu9KFT|kG6)&=dP0{kN*6EKWLp!t3u9HeXt3F<$p zp>E%9NMK5T&>C8ERft>o(WlyKma#YTLj{Lt>;(FZZYh}I*JT$J=x|kEZBNv7Bs$3{E8G6|Eo!MZ zF(HAdY9mv*P#mp_y;UT_*X-WN^HRC^7qH3XPBh~2RCS&eI8gKQ7^NyRU^CxpLEftku^#NDyEST@`M$(kCkwAW z-d9B@nr%ft&r)4o9YS3QOU)EDc%F)pTYYUoika-+uFt7Ys)+xvjDhn&WqGq;NKeZ@ z!8=4QuIKqhMK5+Wz`{_4LZH}L%pnkb1mhS^@qIJAa{vZ`WhwCG<8VaMRF5+~oec1pCbNT%kZ zw=$vzs)WEq8k6|qtLaoRd>vC**THWi5T#B!GJHxi0N4NNDW0h#@^BBVoVn!}bA^Cq zLQO*>%+@aSEdJLbU@YORe*WA!4J)d?h4wjp2 zaiC(-|A~>+$z(sBuW;*)i)8Ru9_=Y$wRD7xOZ8I0@0EV@X2DT%QW7jbq5UazZ8sI5 z;n1Dn@rIO?6i}@6x-`kJ-A#Sb-`@{w5bK@lOquo5M5B_`#OP?81WcW<;NbZe(a|R2 zK=Kw3m80oBp1cQp#bhi3Zy+Z(x271XC^pSmwI*dR$sbgi$_l!RqLR+DT)qz5Za6c& zy8Rv|1^mjlhn^5`0>kNz6hH}hjAIBNBz$Op^sE22v55(69xC+H^Ya{YQETIDj3;2C zPHof;agzaTu#21v9`7r&(-lAy&Hw7+77iDaz~Xrw=FNtX6uZ?m=;u97Q%pV!l`;u7 zqP^)F15rvg<4sE+sGF0mawz)kKttS{m>|HGO!2og(ze1kRbkA0&=T>(n*pcheheT| zI6@-CM>S$AD<&U!iTKc4PD39j<2%ZtCECc4prFb<*zLfJN$8#J9r^d<*9O7-0J2hl zl3zrfQ6y;&3?H(YS`VkZeGq1$;MDyFq(P7yn##|PV|qV=nVs;f4nrM%CLcqa-1}T> z3&EC3hq(!gFX{FIfL!aH>>WMz8J(l6k!Cl#yXaC>u?Y)#=>CS;RN%%hxEZ6@k;4XO z|C|vIISttWbt3||@a9`B;fmtPi-Xi^a-Y`Mt19()Eza%w4+zn|V#XOxi*D>?ImJC? zW!umQfArF1_v7>9J%bFA@XcmmhKSy@FHJ$jUHQ7bZDI#YnU~RsQO=FM5n))jB-)?X zWP|_u%`%^GM>_HseSTKD@gG!X4nio-&)emS(P)mxCZoeX+#|MD`XQ&Jq9@|rQVHT< zWCxorzx12{N+Syl!s6g0aeFDS#<@HuP!1zhTUXbOe>$K3XD@w?bJNnWmUX`#YhnX5 ze-RAMawZQ?ZS#D^U2FxJhGzg;G|dISUWv|$`|lHQ^c#KaB@9RrXoSKBFce|FR905v z7)0Oi$S`wnWx9$<9(}(5FhTN@lr_Hsk0pIn64|Oy7wL++dDglRZ{_#kV{ zLJC$*kc@R+xnQK`aBG-7_a))yXof+R=ExbrluU(u;r8+zraO-m!JO(cCJrUCs(@cT7b$n{Gf!T zUVL74cAjFy`1okg@d)!dVEdEg^j9dHea=w#8Z$FLt`4S_dpJZ&ir$$<8WhUpLGAwa z`*+2)s#|GIxw*Mbk-aCq0bJ7C*5=_Ur+s!;_(=GuuJ4XR&e6sOsKvG2HgfNEK#N2t z^$t>wfY_Jv*_eQvrDhyjll%T~lCS!~E)INyv|bi~rNl+;lOXSqTOeY57Y3|iye&_1 zHSAq2zyA!$08M2|V zG2=M>V*MZ)T&hXc_ttptla#xtly0Ie4#Cex75mJjUYV{`2D=YM^NJJEo;(V5?%i}A zSGOF^t}i`cn_U_jrZS9851b2S>*7l`kzGq+qfJ0E$)3Qfr#_RR+5BTSHW1wa)=zo> z$0Be>$ua%lyu-!KEhbxM`%+qhJ`>dka0@t^Iv=+iJQILgJ+o?sV{04vJ-7AqLPJAg zg-w}#xQQGZTW<)2p}Q{U`%P8+7;WWWDyhkS>C$C-83U{d=iYA|MkIC4M^u)i%K;QP z%<=jC?Z`~n`Uu=t8<`t!TLwo0TU{C9&m=kkRa; z0rN#sF~aJ^ve|7G95w3PdMV5r957p5xVyW{V63_6GtvufwdYH?-t*ltX-8FH*>G_@ z#mdPujmlHVtSP3%F^9SznfMPhDPqj^;@1Anc>lCpv*N-1#U0{!vLls>0ai={d7zGZ zyxNnrtSn@@1?a8)*X{;Rv2NMB3iTr`obgx@_qkf(2W;X8@g=*E%je4!YJc`I=M~$n8taD#wo}M)Ku=kBPgnz&RqKfh+ykKC+27WGXjw&>y6-&3B9UTXU3FO`P*Qf-9 zq?F)}tnvf|TIO?`?^BOimkSH97ue+xpO_f6Wg;)L4ZothNii&R`7$N9=DG{GRMC9H z%tmC-K$i#G+Y=aZdL=wo&&Xc6I=R7l;ZCJWo4mpKJQx%whE4Q*u-SpQm$M>DWN)C+p1!`YdiO+U;}GKBs>2Cna-`gI^72mLY=>N3+dinY356#0Fz()k z^jykfS-U1B+y+?4z-UeQ4e;(4ejUkH@q!a3^}y*C)kio3T`LG=(5&q2)b1!Xq>3@a zRal`I17{%2D8JlKWwK%%K9QsWe_N@0i#4oI^^w<_aEMcA#+fw{u7oUF8C9^q*_rUx zJ~LsE_6;bzuY5lhz1RV@{9MHt6kYiEShM0`(I>57H9|s8T&nuOI&)B;ht#;2$(WMH ziAu+5(Hw%W7}pf9Q-UEV+e7jC43#f=mP4Ch!F<&R`C$vLSMOo*HHW?hXy7uaJQ>VC zOTnaAsu53BvbWIyec>+0v35sLbVr7OW(_W0e_vlZmFEDL?#5X!8JrgeKiJsVXsq#A zA)FJt-D413LKb{_RoLQBOgz6yn=qoafF*SYI`Wo2cRyF^}65=gjwwq}y4y0@?&FP#A0`3HLS z!|#xcwYnN{_uIw>QiLfiJY4NFWa8Y256?A@=}1#++(4f~LvBui7c>T|2WTF(YuQTw zWH|-DsTY8!jjDU;gZc~~e5$z(oQ3l(<(PSp_{EDd-#ke-?Klu`rgFl9KDb;sKT(0_ zb$l&70uiGv^6&=ex9do38R?hKReVt>1#JwSxJjK&=qr+;p`oiF^Z_%gy0fxO@N2u< z{*x?|c#4OIr}Or~^Ind!)A2$Nt1f|8*f<1N$G&Il6 zUq15*v4;}cFnq~P$ZrwaA~mwEJaD7xmS?;<<5^801KTHR*P7u2=X2zw$Uv^9R||W1 zc-TGg4*LcD+`rgZ<>Esed{&ZG=m&;XNkg~%OhKZZotKir)rj8`^KEy3-@GFz5L)n& zYZ@)z(PpHckQCH-a6v(Uc}ejy_!*UG)ba8Nh`CH~j5&^>9z^Q|FgfyDlRdW~BJL-B z0ZC{vrY{2bor)DrOtM^Jbg2b``fJ*zP(n3*v>ZCHR7mPfD=Zi z2o8g*E;s(A+gz0}uFLIh)OAmd0J_|ftBUQ{r>Cin|17S&u(Yc2WW zNSz2z$9zw}qHL%HQ7!7~aNm2|Vonr-m@0W{AZF6V?b_8#WWe<(jy#7|TzjI?>?_23 zIr)RD{0FRJb`hkWt7~i7fn;_Mvv1$Xsy%rHF6nM+p}f5V<$pW={*V*9C3XWux;!V` z-%YJdgCAtmtx2-HNT>eZsRzwaH=8J;*(?y3sz#muZqcCOG8|bujZjg*x`(eb^fi(` z33k2u!g@p6AOE{5qySC(vU9wFm@OpPYBUmSz-o%WrVyWyX)^WYa>nkb@l?oocL7|g zJI~I+{#{%mnMC&M9xqEE)r2_g_PTCSIDD0&bfg4PAjjqYYbtZ~Dp!W1k_Oxw6NLAq z!b{;+TR7 zG_+Khp||+G4A}N8l+4o^Uf9^U@c!<1O7Fx!E`Dj9KPG<_mbW7=qUD3?V*v+s^|OPn z?U^c#=+cNDGZ>3zUb?X{1m`g32mNrAa0aT^?uu>fug!PFD#TZ`w+y`3m3owSqISP6 z7XprP*`h^%k=7uuw^G2B#=cuCe~_3vUZ?CGO8fVl^NO>kjYOE3M8ikj{oby5=);O#Ds@KZFES83OZJ8 z?ibZILh5~pvcV2KpfN~up<&=%v6SF`LKCQG+;B7vP>-9x=byd3l+K9h#^AG47cvSn zgND7t=%Kh0)TO1R=dYwo#-PqvLJNqbdZPMB-;l0IOxx((^?wcWR!hR&-jvwku{yke z{m|c=M)DXa=%J4vcsje(7-pfosMe~49vmE$lyI4f$3HH+hHy%mf+ogKP3&`v($^f{ z-g6!dmx|K!#Qp=(?_M~bS>V>W$G^jK4n%za9@o*!p@>NYP?Q@d9mCguTlM*u^mFS< zNgZ(?&SSQ|RygOpRh|PLA5~bUabe{Zm|fbwz?yq_2s;r_aem9=0vI|xtaq)$Z=2;( zg8I1}XUM$c18RKb(17gqbs*%QQGgKrH#urG@b7PT(z0LY=@vH-?(-( zLGk(>K>JV_lub5sKTKpxFZa z^2To~2v3*=-e9TZJTDuNL%4sS5stKdV%p^^#BWlvr@;I9Ko%UoM${`#>xk9h?7|tN zy~1!aE6;I3@>N8uCTh=?0TFdadmx_7Cfsg&_a*EV?inzGnhXcusADF27ktY3+o$wB zV2)aA3_Jm}Zxdcm@kQNmOH>oI=?#f2jp;fq=ZKM5FDI3~#x>7@FPF`lu(LW8f&)}% zsafAwH-G-LJ{kuJ3z-@tVFT^IuniTj(z{y>p|5Z z+4Jg2Y`UBDd^$xIQ_&F-MgFSk`a@7d4R{fkH!d}#)DAhkUxw;2kfB9HKrqm;34kW& zQ}}kSt*&|!-gkkSB}--68Rh`G$gi}hPZ=CljR1HmNeC&Dg8LkTWr%1Q=|ZL^Xkh+~ zRn}W|NEZ;7p`q@H5`CWp(-P%1*te%3oY0bw+0IN$Q+)*5>$P7!@U4ZRiszVWTm7F} ze(?}^o1xbYDL2%Ky|k}^LC2CJC%Nl{*MA7u{~mS+H?6GL?)-w@6CP2uu=qm4EN3Ct zeSd!lE!F{^N4PM^8vhrnz!{tqoAElhD#G24Lqb>9*3^taR>J#~*m#Kmn)L&CYOrR9~RHMT-<8Jz<091h-s5Y;y@cM*BH$*psI`7Z#--(HdOko$^AGM#ebw^y~*1rX`Pfbl$d8^U{HPFrY{q%WA*2X^fZlL=U8|tgqemGM-^u$Cv$Ff zSq3Bxb;gpA9g$J!tbPA3c*O~KOJmNJR!H?hOTK^s{r<0ZMnU79R0-&Foa$d2t+$?oe(y0p9sEZyD_b>$F}C7C0SOToea19Rehm{^X zUZQM zcK=PhO(E*zoAb)8?7hGnx~=xC$VKfDNO=|@DGuIvgKZaB`r6A|1%41#`BHK{_;eom z_;E=YI3)hn3XF%_Y)`K}^Ucpj{R=b9k=Wd$60k;4a=L>9KpCi%# z3&3a4DX}Bc>>IH)!CADw$?uy6^+G5 zy?>GMAFvrz7$28Mt++Ff((=znJ_7?a_{l6BggFlb0@8j5SesHdZim_YkMnTbqd%Xw zR{Rw(OSP+KOoA9x2Kb)c&03>x{aH01j9ovkRZPQg1Ul{m{|aPAuE+uzAb3n5`q_P$ zBi%gVASgH+(gSwY&lpU%&B2tIuEy#$OR7#S3jPw1o|1;Bn3pgAfW!5s@=2-kd!Py;kw}NEvu;b)F-0K2)r-dEd&!2-&4J&-2Z{!W3{SH zvd>WTeA?r3k1iJ#52|K7tGfFn;L1R}qiTZN%@TrhrA*&L(P&Xi2WIqUr07q)ES>RM z-ofuswde7@&iYdrCX;{3Y6bnI~dKPrl!c>n(hRlwLA6jiyE|3~z) zn+QMq3juDk|MR5hZwa28;V0ow(az-5)KnPL|MzF-mn#u|w(s$0spbFu^Wxn2|DzzO z+Jn#MKM(caM~oGq{y#z^<>LRZ|H94+bMc>@WtCF_)S_%PyZoy^8@sPHk`6+s`u_YB z)c)TW^dDk#k?Q=^hjH%Jt5=}vKuRuNW|K$8V6-e>ihK1VhQ;<(6rAGqa;}JdnRr%` zC)f8!qW}C2p1-O?5u)>exj#!?|A?u7q+k2-z1=Z#WkFRMkp;}h79hcpQhiu05qP^L z_zm*1q}PX*fs9{V<{uz=(Kr0S(meL(T@&5^KH6>}x##>Fe~~M4*M-C{Z#?kUM`}zB zbITsAZ?C4weIP-XfAajfsBqE*^-ca%5Q1|L7dH+;oThb>d;fGW!Whl>VPia;Ogzo_ z<_5iB*=xRkAV)cS{76f>PQI{JXXTCQ=Jcz*E9A(&47};ppVCJijAw(BROu^UzQEGK z?_@?G=e`d8MVUR&+8OeA;1X&3MLNrMZ)kbHEl<(ox!?^%Vc^G;QaS0QI}4&uwlf{s z-B~bStv$jT*y>q7+-Hk-`*n4^@kn5&! zj7@tf*dc&V_NY+c3wuO-;!s&o<7DL_&aTsgn-L*mHX~JEPikHEKfc#5e;>V3^wNXw zgnTsqk8%0X-LJva=>pcyh(VJwqP_iuBh#qC>)Nr>Y)k!0H2liq%O?udJ8#~pyY@v_ zkbQ1cJiI{&PV)N-K`S5K_K#fi-;RG*$h@~>Q9l`%TKM7N>8r)zO&ycHZ8wY9a^Vk$c}4i06drS^V)&7#JTS`bLE zDr_eqCG{JiT-ffj0!kKIN{Be%t?2}oCkvp;vhwoRjAU3_=sTDV%cuO^G1OI4(2BbD zwHzOT@&N?zcvAc1`1|vp z{GGVw-PC|1ookRDpU8}uDxJhVAR;FI`T0#@Vn{i#*=jGW{Y@s5eC!MiCOl$URGVtTIMt=QC^f*h$Xrv`_^#1b5ZSyqi-mzM%sE?yHDZMzEpEESxD~6xS zPx-Ve<_+ya%;pqV;Bl3C&x5ov`8LZhWrLsj;+c22mJBy>G*0T+{F7Zja5yO|<28hJ zG}ANC$bz-2=78tpdwiE3Jpwir_yF$6(;n>P?$A+snNk~=!&^#!H+W@e){(s!@uH4N z|1*r^(Md_vCs8BO*FpG%NXqj2sf0)J5NyK134bE?p|Q<34tk^lFE8OcD$@g|(!wd^ zR$lP_ zj%`^<2)nVd5iHQpxz=H7y~HZk26C!_A}6Hnscm_wu_vo2`I&->Vq3*QRoV6g`*H}q z&sq4ast(1HxI%{jPvB`N&bfGyEG|~~f%?6Li%ULID_V+%OTUah7fnCKtqv`Aecbgj zsa4fue(lX?)T*DEFhsnY^I(ELwW>4fWZ*U-OD~o-$fJMks*v#p6TcVxk zHi*D2^7F3^WOD~1DIwvKm>t2RX&|y-9l6Ezs;5VV>rWm`S|PYrff>yNGI-C_U*0pcBH?Io z4Bv9UTX_AkQNX5!&dZGC=dlb}jyC($_*=tM!8!c&(qtm7^W>EAo1a!{$G^n5nVx;X z{-CxiZFpJxW&SalW;9>l#}jf3y%|0JYKxH4OahtS-cV+kS5ni`9Pr#NqW8dUnDJx% z*Tr$svf$-50C>))+sR{gDLd7yQa*T385tSIO4`Mma6|y!4IVwm>;=;m0fIfmuaAKD zf{p!eFBr%$3-j~(^I1#-K@@CFbX*ro9f39kWe5PW!PG2T0q1!nCL&oi=tIyt*P7Jh zxhC;OQ5|nJj_aG4G~atFlZRv&0$udrnKc)a%OQLipl!Y}f9Nkgqb6rxHW}3Wm~gSf zh?EXEo3->0OAnVk+1c3vX7>`VUIkm-`sjLdmYI-3I4yubBQhTSo-xLai;D}yy6o%y z#fo|0(BP@ZAm<=m+ydZMO6%d=hJT)?tDG)&UDlMoU*RHz!TO8ni?<;KmQ~Q%>~B4D6>*9 zu%^TH%D?uAWd#)7K>z}#ErOaIyec@`^)bzebmN>uI%`E1&<&+c3F=`m6X4zyaSGfc z9zOna%l389Bvu)4`)I->H!M1|%x2|J$a5G>jgHH4i6U7v8Nb93_aB$ks)N}9A#VS3d;t8^1WX?}BM2)_FE z^XEPOtC7>5-VkU@2O)8X(APq3qWYPB`_?-QkJMAMBK$A3P6Hz&5^Y0eLivoFyu>}C zq5>%qxFpx_$K`QyQ0;)0Nb}~P)nm1gQr*(5u~GIuwd-2(4}Iih9s4(?lwt=mD7kVz zCb$^f{(wkXr@x(xud)rW^7iM%Fyy z+J57bn||B#RhT2@e)BB&uFDN=(}yo#SM_}SrGuKhlq(;PdG$ST^9(o9J62evlT)GL z&U=9tFGvQTLUq>z^YLW`B5NEJnGM|TQVz2)$r-qY*O(vU(YA<804vAB2dj~i~PHL4W2vjc% z?n^H?WKNAF@|{gt*!nbKhY_URYEci$kKRfNa)vQD%;~0JB%a6z-Zc)%c&k?4m&xGl zTsSi|>er`1*hCjFXs&A4sraVA5i} z_Ztu-25Gxqk|szXs-a!#K66ZbKK01uRMUuEFn)e($8IEJVEXe+Y>964qbsK@oV9NZz8cZWc*ce~l64x%g4$!JlQZ@r^?Fm7-~>B+061JT znuk02%zT=uuoQp1-8O>#=y4KTE>Jqhz*%e3=7Wmz04*P(7;5t$?ALdTLIGoZXyUmw zQxA=g4Hm6iCgh6VR1&Ba{gO<_Y;7`~rM@>H_)E>T^mbH|`@_*=YcppatL&Z(0wAg- z?to-={t1WUCN9+_#1im_J+eScnl(C6s&l;W)Cd9NqeY3>&Gc4M6_$4k#?_klSTeA` zKkbzjtGJR4tBuv8cb^zPvv9pI#A7ZZA`+zIL7JJdj+B!w)-kwg=5pI6Eu;E$h#_Q+ zS&A<^zuw^~Wx}WQp^JBRWb}A-PXT$}R&BF2n~R!5QMF6gFd8K}z%mF_;f?oCGiz6? z_iz)hClR=RS}V-RKHH!bp7`hZhW|G^E#oEYokPspSImBLoUwJ{<9wXAp!6Cw6S>ME zB0`-a*3=T$qAKbYi3{^rIqQi zB4S7v+U~imoJ_S++Sbxy({irxHp2H#ZmgAf8&Oj4kPA@Z4KG1?`FYUI#AYwPP2`*d zzzZ9ah~*@fM6YjeU%ukwLOXgcBq8PUOuiqZbL*@cLHw)i0Z|AeB;QM@31_k$a>EGzllXV6nc{24OB z;mV0jSiaR_kfXx~C81ouO@}E6vmS2GJT0zb*oLVG&)-YRA-#6qgWp8sG2q2c5pHhf zvp)a;<=l(AZ;PImF+7v$q@8@F_i1YOhWAg08dJaPC+ds4JqFt>XV=Rmt!O^BTTb=b zVoHfs{XO_X!&jM03)a7`<;&2`HTwGeeQwwGGJboue~%-n$%E#7o9#*GGkNd3XzE!d z74Nw11*zuSxdT!OE64s?EYdR1tfSAOIco^}d|V4eOA6Pzx)yi^?}n7V{n9iyD?ZrLm$2OT|q$*#CeG}Xk>PEI@x4>?QVRIVP*a6T- zq>5v`e3uqMq@Wc-7lQ;wuA)&j$y-@O)NOP^J&VHu+jMa4^`PYgn$6L^seQJ=)Ho#G zAq^=9SDLd}1x%g&MK&(vSF$3FN<^@vh@2R_6Z&L)3+DlD_Elb~8(sE&BK+-IrX=dL zK1OuQDt6CeT1sEXn|g5mX}Pudl#V;KTGW&?^$4}Cyjo&h#i({u!MD9d)~U-&s97J1$BdN>Ya~iIVZ=>=Mes>>o7gwij;+ zxfi71XV4Q4`dHf+8`2PDzQ9sA?|P47ow3RiRSq9V#CsG=M9`W^F^V`w7nOLFL%7^3 zbB0f54i5tc`bc#ZTd^U|oRSX79rVq~*UFd6iVMKt82ck?-2pHEh}=D)g5Eg7eL~Lh zgGE-xDIHtsdV|n_vGv8F&W9x(gBff}S2d%iFHe%$7kX;5+zO4?YE}*?(6e14q1Q^< zmmyfr(AOF9G7D`g6X|71Zb)R64SRbENl=p*KHhwE0X9r$3xaY5%o1Gx!Z$|c{(xGP zQ3%<)tMi{={{pNUO^llAL<^ET#XFE;VHsYF z8%Tr@yz&GG=7o6G{&tEfao%uMCS;CRv_vWARFDf=$>FZU1)fNE#Nh#zd)lNHzqi4N zEM003xG(N5_ob}<+CE#_ zb&6nb$Qy@jC4x**Wz*VK#6n4gqlTkYB08-p>^p_#%v`(&TQn67rC4Ik7YpV3X(qhb zOLqlRU5mtsdIvK}xw}dGKHOq7qAuqAjk6#DfF3mPfG!*K`@(XlVaa5G@s_Q5R$W}n z<=ZtOpWXWKURL3MWZs&8;6#`}H=N-t>wGY|@VrR{T$Axpo06Y~TTOIVvSNaYl3YYa zFC>NqBR^4?o92dxRTvCsid0(a-{8{lq(#wsI0}dq&xH|^SIH*5^Wvc=9sC0O67JJg zvA`cRU0yw&Hz_Q)X~ib3_ae(3`#& zrszbxb?r{4|MK}DW+bq;00djLb-caBj8UiJF%u%wg>J4f0TL6jcMws@eAsvoNyGe{ zo0O(^^edD+1avB|q+$CZH0T{67PHM0{+gGWvRL)O&ub=D^_7pX zmue8F%dtq}8*-C5Rg@s&`+Vy@h}S&}b~B+eY4FnCY7smXwNUy5+^V9*H8y8N&*M79wd!9J>Mae9~C|;MqJDkVG zs%#RiOdA=0D@Ui;LG2pIylu+{5sE)-6!q!9;cr53)YUi@)UpqoNEIwIg7f7m6pTDC zz)}epO=hYuPr|_FI#Gnn5=ZM27M6!4WeiDgJ%u$3gH#yKCl{gQlJ73Na$ajHX=YHW zJ^sC|{ggJwBH}0K609F-n!byL*Oh7*&yQ9*wQTb#Hn>qsLm&GCyEFifZs6x4kWYvx z3D5=n`RgvAP>_(2EHLS3I@@IbmWmD72>CT-^P#Z(-i=TX9&AAg-uZF?FIfkauR|wg zniQofkaCD^oh38-H&}Uq`5Rv>ZqLo&Z&4915GX8yh&JxUu)n2B*ZD$z+Tj?>l{ z;uI<+vWiq#a&M^uv#gq+F1m7hO%-BW8ptGLIz9vVf^Myg>j*e#2R!miT4O$TfPd(> zi8I+;G!p6gEII?Tm93iap3tf?UMEh2Gh(YtP2HNe5(DDBx*B!Y_eC2|{+6!x&J?)s zzOj&aw9ku*!tD41^+(STmMi&82m^cddbdMP5FVVSkWUaNJb2w z&xLn4WKz|d!^qaM9%j*8jo`_7~^!F?fg#IoNTki`wj zhBZ?++PTv(_lXW@?JJ#`{|+d|a#{y8Qs_Z~PL)7dpWkmX9dVn^5alH@_Vk#}n z4#F*dm!nt_339C)y&Y&N9gzWTcH5}*m+ovIy{=SU(WSW+6S}&(%JZ2vI%S7vw0Lia z?Fp+=?0e2jqiTn^?_%OMETW<|bV<}Oi05xk_Q>;*sA@*_SG5=T)k%J7V7RMLkH8Mo zL`(Ea1#NjQ4smJj@}OnE_)(919nA@R*<$ii zR*omfS3CCZ2nI5-WKtJH1Q9+C*#JVdP9J$p>!p-hO?NaP7XsaJC$+M9%=k(}fTX443>b_i@+SPP{$lWE);yi_^G>|tbqV4@&D*i|-PXxRqCCA3qf1r; zY6T3cg!;@*GjyHNV1f>ptqH!aIEtJh{xIJY+( z`)P%`WE1Sl_GNq_jx5eo@{3x0urODq!^|flnU*+86q#~U-G*0;dY`9ouP#jzQ6yR^ zp7u$oIe)SYT`5&dcfhJJ1!<*H&?NUE_fB#CUk*c-?D#)C_z_Xu^^OtLh?x*J^PxJw&kPrnan%|a8)NDf@ zIS|mJub5=lK2bWLCC_Xm@^Mp2;%YjqS|cqIAN9njF^MiN)t;OLjhIdorO@Il6Y%0Q zY9^4aR)YW~v~uGyD^EXSD!P#5kq4}(JorIzWHzM!R+>uw-t^0Bd_-yx07ngSFg?pcrar^p2vB3uZI0v&?h zxKB#ts}Qw{IV6MuG)ZBPm5vo}ebf9nK`?^XM#>(QW@PSWe9ZEIjF-7kJ_a|GmuE`@ z&rG9Po_7)DZ=e_Nj0{;>W%}|BJas{iAxs%Fn0>QY{1O1_e5b&Vh*h z4Z;Fs9F)$oRI;+ej z58q_Tn>nEdh0_*JL+8GTy0{xkSE(AV7&%TdMREIdrl|azxH)e(U~{9hki_^ENsTiD z4{Dit_tui(D$cirE~I_xX}UBuPx#x72VTZrS7=aKB7Ny|(G6iZ8me(^n9}3xg2F@h zXD%+T?$2GE~bLCXFYqR$~iKf7B}og+?j= zAz$n6GKzWfFy&#a>U`+cIKds#*w3(r*cyveWY9jOqm94;dnC;6{-BbZ zlDgp67}^J9^?W~T+&)`Q4A)Uc+P$))!6Lfio}?s)Eh!7x-0MQvg^JD8i((&(@+(t! z#XRFI7jj4)x+%@dL(nm=?9Js&gK_ccrHYS6e({?9OH@4^ZbBz|QCI>Ww;ccbif>vX zw)^3LmEjbtp~q|kp{c-Qp>$gx8zv66Wh+*Ek3lC~qzv1#@HBLStY#sF)0Ej!k8PK* zDNc4foSe(|3(74gn1{_P>NwSG1G3T7gmp75V_C-#cyy4D?$}ZyA3R7}W)HUMdHoE*b$e` zWm}HaK`LZpfj7xQJLAU2Z2_Mo_+<9X1=5(r|=(Y_}8|nLztnPoQ`Hk+< zES1&>3sDM2K6AF@@*ITGP8oyhFHfnBOLxLjN(yA$D1v>+K1C?;7hFF|Wn|@I!iy-U zG9j5)GgMLtpzuz=Y(msGp-0(abDrgTqj_Fs;8XYUedcuFs7` zlC;N|b$N@w8I(dcLndu(1t-EtG`&}5fKp)4xA7YpZKz3j@@hW28O1XGBn%T;k_aJ* zh(bD5r==Yd1@sW0!^#L7RGYynJQHEkg@ida8l+Yt0ZUS`UO+}Umac=iCdWtz+Rijjx z)Cpuo=|<)A_l#p=Tw|SVWp1*jP~N%8Y>>06dAf?>vE_Jo^)VMGr^thdW)+p=I1f5W z;<+mmNF(E#D-MXIRUva+EthfQ`;)~jbgP&kMeZWcgb$*)RA!?^6|&Q~ekB%Up!P&1 zCb@Hv{s?=^K_c6kz>|tr$PY6seuKDq5)oQ%F_t`MhaPx>WJwfLYA0s79Hb z+ft6C70~fm#avJqZ{oaOTo7My;Ed@??zC z80}9IvgD^|y4`pL-VVM%R2MRqh%;VHQ9Lk`JJrRrNY&C1Nm#sz#(aosrs#y}JC&a> z`MSK0X}ma^Q%|hagpXjBjDV=L<(?-4ccKH@$fcVk{i9i4%<9Pv0vRge+PT2@{2Y!y zm&&wiKX_DV~UcOyaF;hgtpl65Z zbZ*F_PAp5>eP7;vAYo@@jEk|4N2dpb9v;cZu*l(#)dPSAD z%YJ@w_rg~rgsh!5as)3%F?vXx^(vlJ>CayJQ{q2MMdk+MCZv2=rF86}_}OP1+}NPA z%HKB}Jtrk)&|F2@B5{38y+NT}4pa^RXf>3)-pOsbk4Hgnme9P!DvLuu#LDC#oo(X` zD7xO;Vx>t3&oSVSmwBJr->~;1c~jiK#2(nkBl2N@(vtA`P($V$$?#Ige{yot^1&w? zA9fa(b+09D&aa$~PCV?w1$TFx4+&CJ!3BSsszlufb;N~Q0@jb- z@oU->t4q|Xc%d5mr#cTlXJCca{(7}iJ+y0ov3ga*;tdt`7dtY`8|G5Xm!^LW=8xD} zKi^2yttRqslsfxebLcU2V36$20^tCeBC0`_B7u85{HEF2-;E=r|H;3ay|Ao%Cv`t{ ztEOzQXItto@(LK{bJFUr1atjaEmt67KhVg^_02sX>8gCRt9Tp9$iLLeRd}H zSWW9W_k)lGH6;qlWVO{0Y-ra+4GB{(o&_iMik0|`Si9pCE55}HDMxTiq?oRPX8%BU zOR{;xV;ZGi*@hUhI8j=$M0@p8(O*caQ-GgJC)-UJS24`CaSL{+F{HYI-w)u`Lz;ywn3=Xr2t|Ww$ay&gz8J_&NdHO?(2h*Wq z4W+0LvddwPwddJ~F?S}cN^3SBAUgfzOuSYjI1Y+v$ZDe>p`K{8k?P)lK=@+jxsQTs z2A_=|w^)GwgS?=+PEY;-t@+0_67~08uK7vbNiL?>8*rI1X*ZRh3k-3u3~(f;2Yt_itbOfP?E;$T8a#m)3nmgB{|yJ{;E?ryD=Q zL+nO3$Q*~BS4Kz7q)97ylXKausQBrvl3hwj)}rF+7cFv`Oh1%8l?mH{yoeZ$I; zgMtL#G&d>k&=sjnmXQ#!RiQv%2=Ys{Ii6mLEy8S8hz#EAY2fjH>V+2SI|t~;AqLA z^EyFed@sLTqGutw662@%2#t>-S;o0-^oq}Hg@lhugik_Z>qG5D1-<4pIoJr># z#et_5K$R5Zh$-hUJIr+|WOMh>4uH>5O1ut&p-OvBQmet8vVmd6MkX5-&`_7C0b8bm z$K>x(zeUxqu(hf=@-T5{mzEx(>{x?oIxHdje8WN}m5sJf0OeT9oZbJzXVdVI{tL5L z>_bPnvpys0ACY!Gp>9da3lr9RO1!-!m&M~0&bV0zO8U@bgV3Q9zPXpo9nFW zTsqj2^A{KYDU(NLd60ukwK4aJto|{LpHE#)edcXN?F^x0|Bpr#o794${Tot2L+WbE26%F(>26+FT913D`1^}u1V)TFd}$b6k{~M5NfS(Y;rsu-zGC zm4AY}Mmx`-HHS(QNG9dh?^xh?XTdu!c(KgZ{iZoj8k(6+b-xQ8zYp4%QvKp@o9`-l zgC*Ec)JK`~8qj~)=dBp-_W$NaDOznX+aMLEf}f-`#M7`0`B-ObxPK%-Q-)98?KWc+ zF~IedoMLT6D`b;gd2qO5})ndUi2-suOcFfctuy~aZuBe z%n-d3`EKJuwlI$%;m!*z9b@q0m2}+1fe)1S?Jt99=#O~huDEY*&Fxo~jTIVhJtV~E zah>uUp2mb)va3daWu0L@@@CXD`r9v-pR4iW4)C(i`Dac2f4euj9nJpMre8u^x1Ph- zQ)%~jD>}npM)?E>$f2BnvVTab&HM6fP33Ye%fM>#*YN@;_Y*a``wFhz69?(!jW3@I z%6vK5@-XN+x|xCVcF7}Y%CN!T1KV(zD|(z;8A)jR{kD3u#}0>h&CXt+_weDrw_mB* zSKC>??w-ByXXki$+xe^$47KJuYAv6&eP1j!yS>n!Ab4lt;Zl`vkpVXgWsbld2FVr0 z%f3sBYLx1qVq#;HRgLHj#O#!n8R&)hkj==;9cMQR?%h9qbNb_J>%POqhr-G&g@3QT zx&Q3`_V?rb-L47pN=v`f_;!zFe7>_EEy2s5UvwsK`Gdj)q5CJh$W4?Xyh12Fgzg`G zC~4w8UBz>}X#JjWyZNzcDrb~Du&P&Hss9$Ck;mXgnw2e^~UepxV*XVcwpo(Zv_OP33jw`i=dS1C8{k5FdL$Az+zePN1i+Y;v6S?Q~qlYc(l zeQr~LHXB#2ec@Aa;EQUthP8gvyrHCAi)MYM>?REk(Gj5g6>3Z z`sJL5+;t4u!T27-exzK-;4vOg`pLtHchgZ@%nZhObUK^fwdQUt?#g~C*rk-6+zQWB zCk$~+6^#__rM&%Tas=_KJ2EZdlSvA{5xD4YVFN~PpeC))8`PoEH@ih;Dnvid*0b97 znn}i^buA;0=|JK%P71Lw=^hw8^TUiw4@-E@yRFFxMv?xDUO zzjeSes~yUHv0?xrym6URsUm}h+}f~}W}5lZ$5`}Nhim`t&X;#~@nxZs-k}m?nIcYy zRM3$J;@TxE>b>&Ke zRBS(3YE$-JnAg(Rv|LOp>r6&cb*1)ed&o(D*u?6d+ER0z27b+VK3+q{=KC*ZPp?Tl z%_HOKDJzaIMiMrg+!F?(dk2?!pC$eWA`v6kL2Q%WzK@{fv@n&9p2oZ4rn}51=GUB} z#HK(`5hMF+DH!#--zgMt1BFN&oklSG#_b(<2_2x;?>-Zh;ZP}fUVz{9o>jXc`VuQ^ zgXmw=dt8eH=8uB8(3r$MDPFNVRIMY(8nQc`tq()FF{GM$(H(({+K4lCf10^W|ndF}~iM<%@ zCwmS8CNr$I;lP8D;V+q$AB-ebk0;boOp;6(9PcH`eFv&ujhnRC>;jgrT2>?t)XPI`7|#9BR7wb}~w1 zd9HirpY%4qmDEK)#GHR5%M7$~v_d&0Gx@^J2@N&gX&OV6ThRAol%gcOS?2S860+IN z$HTUo4YU)ha)mnb-vGIKam?eOipb5>93Yt71FhR3yVJMPuCD93#!+ytPn5(N z$KzwYvHII4J^g!a4a88Ah`BfGVaKn#B_`O&7(J(!%Vpb#N5XAE0*CS6F6uAGkbW=A znRe~XmnWxm?{xOwj{~!azWdh?pST_$I{99o7SnLe1YY~2+N8z=ySCS`KwN+no}HrL zd7~e;!d#jj$Ky~`Y>A#D__ykY=IxLg)61&H@9SQ6_FPZrIknjF8@rvtTz<#({=WN9 zzvd8LY3+BCK60f;>{iq=bPvW?r9}9Ui!KB?j4`~PR(6wCPSgcwv!#4UZLoOSSm1UI z-!2P(LSc6Vi`KKquq{f4u*!Xp2BNyI*W4G( zDYC>%5ph+KxnOKv5n1|%e-DDZq|Mf$r?fiw4DC%X@ZcVLt&($^ZetCE zRF-2JO~JRj#kl(WW%=j>$fq<3nc1d^m=F0pj)n*Mp`SB4Zg|pYLkT$aexAfgbBwmp z+HW|vTcwnemh}Hs3ebKnyerAH)#eqcw)r7}Amm_ZUENX=BpWvInXRak!gt(s3`iZW zi>A10a#bfv9|>=qgHL)*8NPjRvUvkYLJEynqBU5c2Ztqb^GxWND@ke&&)qz==PkO0pt3Tb*13p!OcS&xEe zw+O%w(j=InLRn5jvPa2U;{+lY!Wg3Pk~PpMuH`_){g}Wt$&QQFhvF$BpaUIKt0X&k zne3!P5zTY0Z@Z0N&BZ2@?R2Pv!?pKxn#CY}B7hwYd{?7y8N_GdBYy!OOai9(AIBUP zrk)CXht%vx`4*J9z%eSuKU9JVB@V#ikdW;+eT*iLxIrw{hK^xSiu9nZNJ0e#_iFXT zr-s#8@(X6m`Uj3rQA4KvMDR5#$b8LH0@qT1h?DW5rgz-Nw2DJH2lJ{;b@C(1>$ zEyV!^(yw?ui97wO$7uwH?!Xx7&qZ|W9-$;;=?O|S1o&wZ@l>&OT4 z@LrNNzB|*wt^kgSBa9KSUXG$7V+7ERp~+d$pOll!T|1;gX@j}6DY6a7%o}a@JVU}QNhI1 zX2o>me163O5;HQBH4Z0=M@UruZ%+&6H}!Lps9y-d4qH4a!P2_!o5AA{Qq`D7j18-* zUN9_eAg3I;>d&Kl>PVvRU@Eh64^_iOWL`C@rta8^ZAp9aZ7@XIzh*CqFn2k-*PUQ^q`S=OJ7Rf z8(4y0Yo3*;EqX0jATVe<>J1ANA;5U=Wt#iBX~jI(2LoxqLXr$w{G(%uHn6Osk|wW7 zYOd^V)!NcU(ag8PPmu%-aDeDRNJyjqbPPT_RisLb{b{DT{WrH3lgjd3AV~E$NqZoW zskDE~Q2>+u&_zmt2t{cypkkFuLd!P%<6n%C`wEB8DwtU@DJD2!u4ar|M%LFq8d16( zt^f@7mqZj)HuZFL?wV?1r6EtKK#)Vm$4S96@j6OqCF4WvaO8BPh8xd3hr;o@ z3|8DVrJB)Vsy%5Zh=yR>QrX$VNoI(Sw1R!{nAdaLgx)h!Qztar^l9iuXWiJZ4M+b| z83Mbp-Li<~! z%fBK5e%X%AaA@2N7xZR-x$xI_g~7hvZv@@Im*sZV-|Nk~X@Ec=wOuj$WwSQYyk^7w zLW$P~8&s0z$7@ou?tYs}>;pQSC0~EoZQY*JyNv$H{jeM~|Mt|qs@22#jFX&?+g^VZ z>s9UZc**yCb`z`g#`_qxD98TRBw^Y_ti*f$+i&dQU^VdWs724z^xEh9_TM~SuVEP> z@P_mU(n<7-f$ybsKFi;KsZ>^7N4c_(&ZhhHG02dM#lJ9)k?jM!dY`g?cajt1D~8@` z0_$7?XPmeT4oKC|U(?1tCD1f7!X_UJWK<^SANY49T~^*y@lEdU9>BetKtMsqJ5;bj z=YeAI18dkFH4RRJP8(+;6!t0r%Z~n={4@)yd?(=rDAsb9I~%oMsvBs29Ee0u@+pdH zB$hZW-Slr^1Hz$aKrCd2Mmf2_qAUpEN2xcF5L;9vx|6X(>K`aF+Vwl*bR#b5?h#9d z2z^0#(~VtBH%qV=+v&jkqI17}uzpY#%EB5HVeUVM>h~bFHV&2PoonqMhzT502{&}d zbBAgLrszy#@Uo-Rkhh{OkY-b`Kn*EN+U+K5+zEUMLa9bcBth;L%uAj7IbN#l1+==VHKT{4e}8E8_*?Lf^}FP#q7YTL9#v#H#9@CQ zGp68r!m|^F;Xj+m>PvWmJ*PqBWU%9tA<*bNEXf2PBcM2gZ;@#^hCDGbG7|1-PGES^ zkQhF5*`&pVyTXJ{nUEqBoC!{#`r z88HS9IP^}fA2H`AAf#N6@o>!*f)d9Eco#KK=TACD@Lg3uL9G~uesb&=mK)QIZT~je z2V_IW7&cSKf>5AJ!OwJD6u(o>asun6$?>Uw&_-Co5jioac zb^EWHMb83QO-)#S4>#nnKdh1V*J&dH5s!PB*2WJLtS+b>AZU*XT-swgu2=X{kkFRr z{gh8LbI^a<0m-wU7t|Mw)KIXnS_vT%LI29?+3aCqUH=22tU1A!nx&TVgy^mMgWhWN zOax}zL>{C+hih_dnk3LCf*0Hnu-)J%^sUm%U+fPxLn!G)8e#kghXOF8#)5`_py45d zy|P$yC0^x8#MWpnGq>w5nCea)TugZm`5lXfUow2?f2P?k=~mIFam4}kvn+P@6OagQM=dR;W-!VvmJYuOCs^R4FOE)~j1$_k zaNIAYNrO2jNRb?PS!jC`KU8`6IjtBShm^cQZOY|!f3)@=);X6abhwX{%Jq0REPXrt zGjlHR^8MmQ&UhVQMk?)Pu%tl17A`JrE?WDOb1x4kUKZL2 zNIX^f6o{_C2b)}7VTQ&p)wYCHG(^qa^PcAU6f$Q{&@x<__2R&X++%R({20E3Wj3H5k#>kQD#v;t<6DgCaY^}& zb5Zx>AG}9~d+FlD4yr}dTUmNxJ8Y0L$-t;h2Us>b_hpAVEG|yFJL%JjmP)t+&oGY^ zMbVZp`+57dVzy2FFcrV9zNJ~90HOp&JveJ?N+~K&u6})`a4r`@ii4jTF=aKO;5~`) z`sgGWSHGKt3eo_Lv915vqiaw!RJ=0nuh!~|_pCwMZm0~2Udf#p)CJW4tb_Si1U zVFr58mh-3@4`}dY;nIGH=#kKy;=11v(6uZyrS(=8ULXB9jRBFs3r@xy*y??1r!tb^ zTKE>YGv=N#-U@%vfW&Nm26po|cHR6|I^LD`@-}q8b~#cZ^ttUx$;oOk4cqVH&9cD& zBv0tM`I|HKc_;q)jqB|%ceA$JU2pVPKaR&J#MQ z>5IDa7j>R(-gl*l<-0afVWtDkW|#n1Q0|Ms zZ3+kB)k#-L|B2dJHbRLBQK5V87=;eT>MBFj=d><_wa& z6S~*lkUk}UBa@ndFeD<*cX0aX6k)`B^MyCc9De%&QIFBxzmH~-RRv7O>Z91x-jDa7 zgFqB-s5k>PdMGrxK{NH!MOfw@C_*y&889-*gQU?lf|>WyM$w_ddZo64Obg@-cbKA5 zIH@kkET{Fs8+mF25fNehnb3dPDuGgmAS>CEWaxLl23fE&odj|;EHVKWjEn(k96Lh< zG|tSgF<(CfA_^SYmN$kDWI(z|q`GB~pbnEg=8zI$3x^Tr{cu?Hq&{4e z(3>a69GnRxyDkzGQwJ6Nr8mohxApoy^+kFX^eD0+Okis7r+y3yejTdODbc|Kaf-Y0(wyEQ2E#Byqh*)O$S-5u%^fb&=D@-hNkgZ& zrlQa)7O^gkD~n?`SVbY_sqXM&_X(r$P^}fyWn=0DVb10kldPEDC3EOh1JqB4NK1H~ zyYZp~_ou{<{SJHdu;$Lp_HhDOatmYa-1}+8ex1Xa8(GPL;bbN@->c7Pp^8RnQwF{a zMxsZpC^1;bcqgZgoAAW9!~7XnppD_MGn+NMcHgT}@h`Obg8zOu+eS>}wVlnp=04Q* z+O`|ZEObBJrgh9Z&j8UO?Zk9&RN3wSRa$1)xTQ7)8uu@{a)2TuW!adl;-ujZM-i+B zQJ!$Yma(sYt5m_@TmPh;jo6g}$BQ1=ZEmq)OgtKDPhp0b(E43hnd~S6PFd%KN?t=z z!rQ)@9et+kKUr$|EI8Q37<&V}VxUaw23A5a1w7jp%wWvPQzEE7t)E-!rc^%%A~Y?K zYM;!)m#Gw|A#J4rRt@Wd#0FiBh$`w&G0Y-c-oEDdF-mV9oSWiQ{Q#t7lHWk?j{^s8 zt+vD83(*G(db4AO^fDxUE?7|E8N+A_o2aFA^`GzB2taJ?XZxtk4-3=7kBgEYt4zyx zJaSpt(#l+_v~J&rT)aoEE!v^F(T$Gmct#@CJF-!z8EyH4`YcRsYKEr7hKYyXx-gn+ zM8=MFg$JVIIbA6d3k?VPvf6{3p%A{9vWcDY-17Pe)rX?E(d?MV{4Yt zK?&tosit4KSdG_*d3qvugR$kM9fg!ckBYnN=B|wAbzMguOA)K6KD&Io4vWYMHI`?)7{Hnk1{d2;A_aTY{f8&YoaTZ6=<^(r=m7(6ZkNY!rEoZNosIMC%J-Hn(y+Y>WS+}Y2+jIK9FEw0` zjz>FwzP!gZsBe~6=Spb~&(ZHMFAczR5w|^^SR1|H4OX%f`?07!d|TM?d%4}lcZ*JQ z9;};@(!GyO&waUlYcn_4m_ElQ(#np%$AGtfiEYqq2WoOQH6rQ(2J^sy&db-61m<*T zKPt(7PxZ=qMmm`b$7{++hr{C31WGYr)LceUk^vgU0E1dYA1ra_0Z4Rt2f^mc<_zyt z41T5imRG(d#ly+0WN_ zN+oSrAdB1-nY7I;#HqY-iHOY?idWn3I-?3%LdPGW3^CPpzH_D(jpSMjsy-hu*gxc` zf!WflbY|f*k|3nGemfMp(>0I6UpOEv_y^K@5GqnABM=o4aDHPVFq3qwjNHh_F5Z!V zVCr{Dp8woWMT=JX2WiltkM7rma?rvAQGRm6hv-b9_+QsI(SN8#Fyu@`h+-^k>dkXJ zsQSHs>;Q`WiH&$+I24vWSanUq2!)r>HRFg{9N>;9lOGSeDQIgcmmF?%QP#c%OWLmb z#EDHRK)HX@wo;H#IHDFiN=pF&$-$ujLUSn)HFuJ(C`!7;saD3^TGCejAs)m<=q0yE z<{~4Tij9+D>ZE>lgPx8TAMnpNUL$&j89K(sNJ+lTw3j+zqU)gNy~UM-Qm(9E*v|Kw z@S~Eg%J8c=j~B+ekL_nlOfq&vcLfV4cqWUrj8qU^OY0kSmUe<`?tmGqfeABg(56lK zROGH>t1Ev-KeNWDX&0mI7Bu3v*HaqM1VD&il+;TvNkL-J8ka~bUpx%zFU~>kN9yHC{doKcoD+@x%#xOMchqEffj$){qc@ka zR8*2~O@@H&)2t2{!6)K1`S4o4ydop+ry$adgh?e}mo|k@RSf9$M^4GriH-hjUXtz3 z9kpG2RHtS1mT&sB$3H)ZjFy*hnsp9ItZOU`peNO#kcYqR2k1R4Qa#~=dtm0B0UcWV z?nMS(M55pF_xSr+%Mr6JYEj=~Wp31Ljj?FcnG1Hmx4g@IIory&2sLmzIX8!fLAJYn?YdSFK*Ezr z4w-Mo6DYRLFd_5Gge!H{yll(Cp$a8~IpNCV=P2f!@&ykiVREBiAV(CYVRD6LB>bVg zC5DZgWAulKeT$iYfgw%#VCR7zgE>k8*p$-2KHnASL*j6ZmFq7OPqy!7Xztl!QN@U= zpb=5rwT=w7?$K(P#V^6KB@kx>zzvTgrGC}WI><=Gj}B&YuD}BIFGG>QVw6Tfhbf%x z$aVyhp=s;kM}7}AT=86cPQby#(2nJZg<~b!Q3%41RTCDt9%qx6Ero5r_~N=$kpDuT z`OJcq8ehgRW^z^=xZrFX^W2IBGP|wXW@$_B=&nk?uJ6b-ESNr#sF~;9yAZ{~Qcj8Z z){M-)0!68lY1@7&886=6na5RXUdIU)=`baO(pbu9af)7ExDxKXSB!IP1GiZN+b~R) zZxuid(W5}+nlF*Vrn{x+Q=iQ7Gb+>AEEpvJ!G~&HW)I%F<%$I{Sw_az2D)FH0b~A5 z!#3dxv8Db6gB*qLgr%AMS++KW?ZSMow-ApkHK_DP(H6ug5D7vS`RhVvGK`RF5%6{> zc}9xs7_aB!O66N_(5v9BT(2dL$8LtSbxi#8A&TKDDrL>@{nhzLh&@cFxa3X%MTXc9 z;^@o?4h60K66QYEPd%PYDfGM8GgBninB%-NLJqFW#Hx^$~SSLO+sK%3Xky>fg1h$qdLA8sQDE zh4R=KwRbt0g~TD$j0b(Jb}#wsT~X0s>hsM%*4cz2ZKJr6O_7n3OGaH({SlLwVYwQN zV*kcLeo>?tCV6gj52(d>=*Jb93SkW(DGfK6H<$c`-KIW8Tr)L#HLidb`z7 zy6(7IDc~g;#pc@PZAGuKHC zfHC_)YVNc57$UJQ&jax82=1>bI}NsQnbWyl>Rowo<^4<>gi1qLoTDZHo|#nEekVdD)n0h>Vqm`jvM*0 zdYsnz@ya-gtQHDNE}k`UBg=Z$BC@Up;&mqvGDceUD&7qvc~WdE5975sL=!`By{XlO zxWFY&Gz--6$I2uO$8g6Z5YPFr8VG}VP*JtRU0(d!yhg6kSz4({#v!P9+?pm^I!()t zRv|!0yQL3>Z?dU~X29SAV#^Lpv+eri$uaf`S-XA{WA=-QG+e-qr~VILZ{kv->Tnts zT+c^NSdH)pA7KOroPARq`9vgA>t2y8(Vg(Tn^l0q+xsz4%fhTjD~v0JSKgO|8fp5uBO(nl!^-uzCRa>K6}& zL;$*yKO6)*qr~6oB`kDDkj2~tS>c-M#|i6w<5&SM_0>sFxv=TOkpBCvi1wJfQk5%5 z8vjtPh3`*P0DD7O60LWBMqO5Wt?FonroON$vR^?|C*5a5U!6lfQ1<> zzo<}RE(G70!Hwe;@$m*rmQ3%3KvG#Omb)e{>c{3SaQ;iYTfAB&B2JHw2qC*;^z|xw z2kKr8YFLzXru}M!UM+!KbcLfz6P3VF**1RGFitTp+cc3ZqfI^mS{g}mKp6u);~dwx zDJ@2R{e5s;-XE;>Gg)0bd|`&RCylEt^{U4-Rj)*>1ja*4Lv=?3pXzBlqnpnyNbK)6 zJYgE*R!`PmGIrhU*O=2F3bhm`ZBPvwp&QV3LM!pq!!Rf@kwJphQD&#A|WCmK5A2g#S7eFn`d=L z43S@Mfs;nrUGfMEGQ2Qw2>2Ux5yPDHIC>ZOUPX!gUZHiTw0D_3I?Thi z`j|X?ct9>=Y9;Dv|FM2wNO*ql!(2v)C3L~$Z;o2hZh z2qrp7VDBA?_G)=o1=rrr>2NDqoiL#e{sj?@<#F&vF~OEm{;^!Unbn}dyTLGN{+%Kv zx@M2|#xq2HM-2&GY{s#mF)3KHl!Q%hLY2CHD+Q7hjuA)9@jQUi8qrA+Pu`u^Wa*#C zz5d>lVQw$3h(X~NTVBx2uc!7svOi(CBwz@OLP4*)o3m8fWCi-yvcwl7mP~bSKgo!= z;)NY1Z61yLqFfVsEjf&k6h+UbVM77W0#|yPQ|CDqG#?!3!+w@#8d^gZnb6LO6sGb? z(omvlk2gKsz&vg|vzTyUxbH}gdw3Q(zmo4qvSCPZNYMErS8t3w`jw^vg5l)qyX))` zaaKL%j%zOM$6MV;U)>@^TdJFC8-j(e=Q}0OUm6ybtgA|d&Jf=_OD40$ea7o*a-WWB zh5F9}ybXkIOHD`PIK23{*lOz z5N81o0}@3!*^|d9DS$T_&*+2P@44Nc-t4oZ8SCv91kJ;bGJvkN1|?d`|i!Z z{xOwx<2>8V*VTg;T0hrj=JlJqnT4j5;|8DWOs2v{LFb`-Ksn!x+x0JT*JI`<^Gm~A z-#I_RwE_8CtBB|NyX=W(kf27xWaX!WQLG)kl~~`K!f~$Uf8qL{G;*xq)4{p-J|A_K zy(mP#;`QI$s7B`0*~%MNQafO9#lb@1=QD>_Q{QX8w;XaCreC%GH$gZyrL%g>4qtFV zxYE6eO*KmKZuk@Nw;R*w+vaO9U+Gp#hMwP3dZi#ZQQCRhL%%QCH^Hr%|FoLq`jhOf zX(8|MUy0UM%v#gb9eCgvdDS2G^Y1aX(Vc^lvotqwYuiAkHT5g{5{`!s!ZNPxwaM8Y z@3_9$N{eKO6SAk!DdE$$!c&IvyX6{x#R-5x-sXOF-U6ga%INd1fcuK(?42XIleWp) zHjMGgmb6NQdu-C1U4^IVk+mb48znfL$iac-^b*toyV*axldOmAo#`Qx1OcRFJHnk0NtRBbK*8m*1Y}@9e zV8v0_F7?Uf3%EQx6t_0lhs)_`)=f#!`-DKq$F$h=sLSE_&1NL**le6?qjcR}h6yn| zRmYYmJ!D~vTIg{Y@B?OiEo(08ofi>IuLo4{fZAw~2d!>;Cv#J{6wuz>ilC412I`nv zMDz$aLuvw8p0!!>)&Z1=joFpfI)*r5Pl(!2kBJ&0}t;PklYSb6>i05gOjbSG~V} z`JVp{2Ay>{DL!uGdzpdtJ1=t!qO_)kOh=M{rP>Ln&iUh-_PCI*oZm~9pw!Fbu+<;j z$@04wBM1A2g5haX|ma@BjOP zoWLxE)c^d$GG)W^P+;Bu>xKXI1H)~t1tJkKpk_PvKW_XV*CmktT_9ty|A9*X-~aPJ zUy8$;B-&poG<631G?w)6A`eVAg2F05Cd+v zR;w=auWR?6Zf7m~zJT6sq?XiEVVZ)3=1c1e?%^I`v{g2*%w>)2T`!)qVfr}qNoftf z4||noqQk37bZ1gWIkcYh&l;}midlN~aWlO%wwjTJJ92VVp2q)j+*--tq=X;Gy6CA+{n=7^scE2o&6sih zXuK+6)t?dr5t^>(?sP;~^qyo=pb1E!oQT5^w=AhE)>@cU!xTyHkO zDC@ne#Cq*3Z66~X*ptS+*SyoEo%y(NVeGZHLIEpie}cCs|8cf=qzOk|uo(@JXgr+> z>!wu$>Iq{hn38{7(8o61wg&TLb|uWG!G7_jf&Xh~(OdR+*}cWl`Ux0lgphHROymd$ zi}C7Q4?9e@l`ZbQ>!IB@>20zIaUCuX!$TW>iBztE*s;pWk(7A2KrrcB^utHn?SqX`P7?; zlna&6F~NUj47|0-khCG7QD#issMV7k#L}IrOsmSlU#j(l|;6P_7bt9^}6f0g_jB zL!Z5X2N_r6>9(IW2Xeh+y4|f|ArRBPH&cpip8MXn3B7EhUTY^$`U2{C*>i^ghZ`WS z;o|gVPHUF(ows8O7_zN9AVuCxilNpi+I2pfRm}h@gn~+Q@c6);SJ&U)?lZqPFY0@p zy7VD)XSr{M*R)^B8qi4CoORsmL$Cm9W}O-7pBg*>hH#&`$d!B|fq*9mT?dewu4Ri& zv~cyDr+|=~nGR?@eHBXY6}Vq9MgW9jGwk$3onJ)#RMi;U;;aQj?trfQx?exKlnp@R zU$$u&cNqF~4`k64lFY;_@LHt_y~M$*P~qK0xk2m{n8q0U9ef z=0V>{Ak1)vCH84;I&P-r;OY7ntn)CgBbg6g{w2+RVciKBAK(zlIdT?>?^5^|boiuw z5IxUfQDTXF`gCRYb3!y*DzMI-LM40!&-+5}>C%Z4z$qzSJg(nu1?Lbz*gFPNp_wGk zqygNAw}&C2&p<4n&DU_;8~~(k(k+%|{gg`6X|{l`_7I$;d$ngHUgLJ|`^)|(x0N1G zwB}A6`>8x2V;3B082E5%5dLw=@z_f*&34tENysC$!#kF;mQ5OHDBNTM67(=t=E?8v zn6XH+PE-%(mYoEjyG80b<8P=t4a|V(`wO7{+n|w66_bu35qGVrN0xv2+3Tc7+EY0< zB&`x~2$o~+5KnQ|WWY1F7B}-|ZFdl1CF0r7a$*9choIvzXFJbYkKO;$2v%G*BVwE| zf=9sP-0M-$_WHjUjEJq!+VjOi!Q9_5YcO1Jz6loOiHAS10m^35y0j3*z_N#LRQg!}d`C%MWu?x4%vm(dI^ZxC}Nh`*K{qDy?PT%u`EtIrStf z<+?5Y;a<}=mOd$uzvL{Oup2Bl=Q<8)}=U(fHGIvLD93|k&s`>~(u!QvO0qoXE9{j`aeVg&R z_%aK7!#Tn_WAm2T${RyMZ*?R#teVsy zB9EPT5Yu_~`KBhdN|ILCnkKagy7uilZ!qmY>lwfIdq2C{9+-8pQl0iFTRR%WhbU8X5od%%aPl*F@+`A@fsPT=Yf`L!%1n`9cW^Q<|Bb0LNR zx|g2NB+h-JA^OfsctL5{rES}32-a%TUro(+ARy%eo5a0Qxq=W-)GZ1(aRJzKYbCI? zf%v3Iz6sL&k2{IFr$E`G8b(a-3|#X))>&`e3?VEK>@6vb;XV5IsJD=P2CqjNRsKSk z)w9gNw6NyY>R^Ex%2QJD{qq3(&JOE3hY@W> zU^neukrHe~X|MZL!&H6G!w^DSnx@QSXZd#kZJSohV10p(3o_{qf{%0}H!l^VxLa@l z-~*F1E6w8XxCHdGX;h5YO;kTkr*Tf?C1R%v`f(Pc>v8VVil9&h&3Y9y8TJ{V$*xmB zAM9X8hlvT@alhuZ+L2~3{K0F0&tB&V>DC*KqW=l~(1I*-NVFb4)3)^xK;GSpmfezd zi8Ny8C_*pxABB-{?H*3;{Ja1tqx5BinxF&N>G)-hw5*V!5MKjFuz#&M%Hc#YH6#++ zwX;6=kr`^a!Q(0efJaZ##2DZIMt;$!(9cP0wk70^2SPoYh$*Z=@;f{(Zx>L4kFiOT z-vYt#opU0&z|DKbag^~F$$9TH8&*+LzVPznoJju;jSHD_u0~-hkt?A61yDZ%Na$3^ z9*H@vk|zF5aFuVD;5PVZvO&k-6Z<(1+!juB+05#kE50wUn-6``SZBEnVqf>MOOQW_ zj5Ql0@O>T~%D$bf+@=P0@CqUkR!##}VQs_0wIphoI=*h5v^S6Kqk-{n${3lZzqvFy zS5`Cl7KdJ4I8HeDRu#%ulF>dBgYZ6hBs2Hlt|KCllFZ%@{M%2bzP?3$y&4Cs_T&iq zM;NC56%Dc(Qy6Y|*eNMTFyRC|jubOpqfBjZob|kY_x%7})7Gkb6|Gg^vL6$1%lL^n zL{(TY?QbB)A`W+-a!T(@6WX8Ua3I`9NHxj-mWdoN0k|$~yCoH7kHw02z&EM?0H18p zF-d@TnP@ifFu#m3V%7V4oZ$+H)*^*XxooBgh>*XuuIm>yLv7HHDabDKHA{i?u-5MG ziI*W->LQ!+Te&LneK)0Q2B?oaHs)lYN)pu+d7vF4T&(hEWpWvw;_5LVlWz8b5%OHG zGaf-Q_FIL+qP%_TmJTy5y6GYr!vfR*MR>;Hi4z2{0x83R%UcqP06mw)e?*DHB}C70 zp-kjn!NpFbM*tF{+-{I>&6YYS2|k*%<2Yefd|T7NTRMjFxqi8xz$E2hHjSLD_&Z&b zw4~V!m)qB`7;jOXCXM2R(D0iptv6~$0xdGs#xG@&0S~i4w#G2jZpAexO zG7rAn(cFUw*$#vFU*7TpQACUJ1xPkmfKh@bd{!gz9D(DihDM%^ACQftX8(#9KyK1? z#X(BGJ zz7cWD1StP;!RHe-*9aF@+{eRQfjn4`c_7}bYi&#-IfbHp8liDOo6hM(AX12&qU9fO zZWLe5^*X5w1p`yUG;iz^{DFKPwRoF2Z$68sv)><~JqU12lCUhaX&$G;%zOZx<7_Z| zj;@w+i0&RC|8fS992d)BGtHW#^h;8NGN}q)mWm`JmFwspIm1i?1};h*9(rNwgVGfv z9~3@wp1LAL_V7E3qR(lWe`>|N{#!{rOc$uYwHO4MeXKZLrCVtITiDD!sOx2yS#Rqv z6@8|~yAO&9Z@L}OwdAz=FfT?U07_8EQTY*c;%0bZc$Zi5x2C8_~J zWjc9e>K!lldizh(={IkHDugd7?hDM^(9qIL^)k1euSv1-H)YPljJdZ{2V}VH}7h z#dWe1UGJ~wiwmc})&(Q|_`=tt;Vlh%~*Xd{L z;A9k5M^Q!Cxe_?l2VyEF>)lXI(?Oz8<`EHsvvxztYkFx^J-p^SfTPVW^~8Ub;|6aq zLU1{pVOL^-)O8&s^3B-ktl5e+YQFF)VToh8kOczd>S-OPQmb@#%#MDSteWcIUyRa0 zn*hj8oJeTYe|$q`ut)0fy$RNc^7NZV0*1SBodvE+(7Yz+`Ot$M%`NIPU?-5>~0ysjYh^tDRosGiKV&klu0VwA{6!bcu`IQr>HgMG`ex{wHJr8aS z%14Qg@zJrVgWjq&69?;hdyI3=3(M4&<%%wBy#yI)=sEC;(tDAZ~@@?n@VokEQ38BmK)w9b&fmP7YTh)h~g}?eB`fJ44$5GVj>8O zpi3OeKSAj1mt{qIs*GA&TJ__l8kYYGr>QvZ7NG4UQ*K8Rm*w3s&b6)nhx!G*pGN9N zm^8S~UYv!ozvXc+ld_Hjf^P$7XMo8f@+#cLJ4_PIW@)NLhtYazJXmn>r<5O0eKgln znEnF;nz;^IZ9_L{0+l6J`c5s+#lB{^`keJc4jsJf6g9Jds-COXsw}(_jU!q8g*0Kr zhDdK-uEG1$d{5Vogv{dy?cpYX;tXjMK!|^VwTM}bo+(a#1?!l`t4Ai6OUrlJ-NsZS zEawk-e{FMw625bA1x!iBkwGBj@qfP(fWSz$KpWVW2>nNs0&!K5CeFy8fGIMXYtTGtsv!PH zp}Nq8pZJ0qh>nKzB}HqS=tMS8@v5&q%u(d~FB12kszUl02EPMo(#+{kQFqfkgcKA~ z8);PXqAGezaq>wx3*o>Y7`e#Wy|8nrguX5ETA26-hub7IMb@FRcH0&V-D~N)IIEBZ zp!Pr@$dE1?{Vkv6knWjCmyXSJ9W{nx(%Qd3YhP72NI+lH&Sw0t=BUGC%NJfbwi@A*mb>LUH!wbw!2b5)5_sNlsJ|>Ee*F_@QLF$Ourv#Ys*)yo z(ZVZGMfnhbOXqk%kKs{!qH|4aa)?_Z&o+Vw)2Qg_tb40LBHofIV{ zV;4BQxpCyZC;Z@}HCY5%mu>PDdR)r5Z7qVa)zLm&m@=RiY*JzWBgH_&WHiOlUoD;- zoCm>UZkawT0Yk9}^8d|)9#W^YvKK)wtwB|&8nj#|{h<5Buk zC&fC}PMr5PhD$b!Pa~&)dUzTGPU_L;OtCjHdU@(WsLzY&vJFAMwagoV2Q9w%D3hJ1 z+9)h!F@T!jQNkDSX?=%1nq5l1NOwnJ1TKdLzTf%3+e|F+QZ*MQL+g)pdPDW}rPy?m%tzVQ?sZ&H38IEjOd@&7g{T#42 zXAmq=wOoIYArf}#j~q)}gX5ND_FI`M^-`Nu+4b8%% zA4hKbnX*jLgb_3?bA1r_dC_}q3!n8v(Yk?Y5eO}kwwa%blgLX?xS~Fbkh+0)Q9{#} zkgSOqR=96wuPW--8SzpVkuM}R1rhDByZ|0f;IRX`H4ti6WyI{J`x4!~IkZ$Ngp@p5j-*3I z%~J!WzDDOf%ywDtb`=rN{hiP>`%ii1s1ucmp<>ojN|T00mhoI4<8n%P$FL zuR!FU93Ggb<4vAd*2;(p`IEybjz@7uk*g_Ijvnexf$?oTj&~PeFh&=}i0%$#{D_sb zj%~4s39nL@?Iy!-J(Mdv@W09+hwsrXPYrMI>IYe`A}c^dhf%>4TjX4Us4y5;>r;SP z6F(z=fYm)9%5vD$?GINQ5QqhR^+Zv3qv)DpGF$_NT>)P(mQ+NF9@9_NCqhW@Gd)c+ zRAvHgPDuq#%dG%}-c@}=Ov@>PkLZXlI=D{0s9Zv6o6)wYf^cd$z)>ukBtFaCd(Q;R z)Ez`gN_ZlMBm8J!w6fH^2RS85oR9)a44w+P#XLI-vKnF__m#(N+?+t%K>sumz${%~ z_jb?l7K6tsDwoChh4S+iC1}#xDfOqw8^A#o{)Lw7CagsKP~UDRr73p6ULtst6cohF zo4-9=mrjdr8P(j9M?p<^UsTCzJlL3GdfPb}!xC zxYFGXOLv2mwB*uAqaa<EJR-?D#zj-3(9eB}T|4g1@|P*0u~}?SGDerQyh9>PnoE%k}%! z2i>T-`#O+;=_rTYJFbPzszRcyzyV-00(~E)m$O(}_k3O0$a_5a*OEMD=4~-F1;64KbRRIk{bRLGQ}M|mnVLT!sUmvQ?3F1s>L$y}SDNiT2nEth1mDwAn9 znsJ$liGxz?@5Zt2Hc*7v47k5qT9(mazp8$yMwb z6H&-zWJph!rF3CyWC6Gl+MCUStL{&u-S+d#=P~qkH)B_C=)0C)eerC+)0$ttzPxCW z3tL_!y8PVJi|5hu{W(vJ#N*xJ6m@q}bmk(CWG_Ss?kO^Yocn;;#~gs;#HkF{uRF^F zL2-m2mQbd|;l?ShQWjQG<}+r;dGSw4di<}B{wu6yT+Ra$B==?TWlQHU!!i7ZFxFT2ssc~=j-s2-r z&^ywfFr{j=t7Y8AoJ1hqWsxM=?}GayNH}45Yx61AhswjiCw#%MVtx5y$6X-4=6u=K zlBg_$@$djEo8z0z1+bZ)(JI?LrfKSov1589oJO_Ep&dxTh&e8P$M2PWDE7@At^X?M zK_5?t_aa%9?A5aGj{}ssz5Cmf*fN_pwj{+cMl|i~s6#1u?dse5{v8nfw-A8k-oV_~ zn!(#C_90!iEtuEdchg9lwMH3!FMTmcU*~$= z>wR?@wfZT%#Wd3Y)%#Bq7*u0;cnH2g9IyM|I}b%jg6+(##43Wof##>v;k!=tDiOe< zE1RUFNmtpFC*F${3zQoi->Bfk)>$13?OQDBruyZD60IzqA=kvB?1_#^7Bgh-`7<#$+GzJ}xBXJ(ls^gcjaP{ogjl@%3e^vX6lJhRycf?@*+l8!)8Th^IcK|f;NlOl78^kNdX4KssYCmadp^n1i3M>F5J@WHbP`7mq2WxhbQ#*+Yg_xNMA{cAVL{Cc`5boHa&64m<>N2G@3Ww_IKGj z?;>uUeR@!^e#SebZUg$eRy+jHImcU6D;@>ajC@W-z+jbO@SnOd7a*+=NocsrASUbk z$rQ6_;)?zy(rvc21cdl;-euh$wa`;hl2wL@VR<*QVGCV5%ym9^o*wK*D^%(aw3aQfwK4lN$8p(j>OTPUX~f7SAs@2k23SKDjqj5}DQLHu-qL z3n*o+0Cj@h4|MA{FVqK_hNHzW2vMx8g!6dN$1pUZT@F3rD50e2j#!$_vVmDfECK?` zRxQeRzLP>hDIa9>_{p4hhv>sBA667PrxN(`gz|o~pSSRoDN7th;yBDMUKNtcQO8ty zCAyQJ9S4yy+W4`MX)jmNV2t4!8VkCa8=7?k?~6f+vj-wh%=?FcGFGEgB*z!5y@(~n zVM9r^hE6|?0&xl^u^bAWN6GL>&d+H|rZ`bkS!2TWRch2gb$oL=tw{7!+f2ZUbImY8 zf(dIz4s-{lWAy0G+4Vgo4?3@h+;Zb|RGg9@YFuX2k6gXf^;*{w7JbBZ=xs~UAXsIY zSHNywp>%(ySi5yBSA>Qasy&=$(JL5y9;j3pa9KR$ zsVA>P{P#f^*z8PimH4VYocroQN77axV|YzGi#pfisLASayk|7a(YJwJN-3N;(fnQK z2Kn}t=ro)0M2RhIks?h`RwtjKdfR4Io)WS%(uTasBr!`s8pkQ6H$5~HURUXFQ{{VC z1AA+}xaC0^9nkP})6BM-&#PXi=6SV48CwAd7kpkV(P_t`P79!Eb=R?4CbVBEz}5$3 zKri=q4KyzqJggiOKiB$I+|5u61dx!8Zm#Ln0`$cN~_6eL|uGJ+M6{Dk+JU_U8`PvuDv6q>x&x2B8;YpdU=PFpvgyG79 z7=(_*d4AdA>5G_=8$zsfj|zcarW<)t!`~yDMbFvz{J~b>6_0nM>SYO%-YV?QpN!o+ z5W4-hX+mn(D|acAZ+V+J9xVDe<9$edP@EM1=LHe$gU*ZcOPd6$ z?K}!f^@vkb)sQrVon`4!jTeb-85bAwl3O7X|2t>iMO=O;2Vu_q88CP^9!h_TM=-{i zP4~sYWewd&xU!9)Dr*Z)dNTja6Gq|g*sa4#D{IW|MsIx+HQhMXu28WG6-D=Re98RP z>tymMh#Q1+R9vfP1)7Nc99(2Vr>ZSCVx$mKbv62!w^bB5RAG6dXcQgK{8al5%k+2H zBJ0i4i_RqQ{Xn-)m8M+DXV0iKJ$nk{tzR4Mt3UNYH~eNC!5oPmch-INI0!7}va=)4?4Tn3EzKaFiLPE})z<6z_ za4pEL-Bj-OEAP+|{5@k^YEoYk$kVo-9%T{^D3D`xv;rLmwXy1kkLNmb=G%Ybz;vw5 z2rFUiMV;ca&GZ`a+bn4Ug%Rz$$C-`7wRNOUAX3(A8PLKbP{JV6LN39Qpq-9hCu}z# zwHiH_A*=~fQU(G#tm5*H9Ic!%3`=7|E59j~>q1jh;uD~~3?O0#fO=P^MS(dnJCvl( zur8l>Kd8Cs?@QsRNlwvxic$kTZdb^$4W>@{4jM zLq`s3)8KXJ?{@{*q$7n0;$uMKyrux>hlZy|t%U(C5k?UX5>XHR;7Du9q$fPvdtq(>AH zO+-3y`WNh)tJwHc=cncg5X}g*M<0JdpD30X#lw_EsZ&FWUkNYPbO@wGA> ze>DwA$oxgs3U8tuV_Y_z-JZ*EJB}wsi8I_reZU* z#4k#tq|iCLg^*4y&_jGn&X(P0;Mta+fI0CkrgGAnjn)bLcmq1=hGJXI=>_aY_H~^% zmss@Lc|!h6f|Xs(UnltGZr96*>Br-z+zr0X|$a7NP95jS+JUaAci=d8s~5 znV4fESD*iepxEu(nk6d8$M+4&$QKVoy1r&+r+HWUuvpa&I32KmD+Ft(L5=zDU{hB)a*v~Y&Np6Z)X9Nbhl4Tp>~KkWr`bHueK+SC5Op}P7%yn zzIk&Ru%ZC&QOiXvYsV4qAZgr<+KL;K_=6k1nV>Y2aDN>+ zWwK)g^S8Woy{(A?o?9M_6wvOM)QDkh93$0)9-=LQKx_r4dXP`I5;lkS@J9PI-HiQC zQ>9XU0I&l0{{C0U>T`Owm^*o8U<{%%kP91LzlCBka_p!zAE5}7if5o=K~oJP{j28u^dd6cG@KDO>C&_-tTPLS=VV1S$pt$mr&9H6C z05pmX^#@NEZ(Q3#R-!omPLF{tD9n2-PBgYMBxB|6i z=ci$sXtUuo;hllv?vkjN6|;|JE{u@akCDU|K=hj_15yLOtNLBkXJVDK2hY%9Xal*g zkX~aL{PK?)e}kmZb2Ep`Ck7Yl?=&1a_9Dq805IWYe~HC}LNNxXC2s1P%kd;04M~oC zMTHXn7{()?SwO0DepUIhC&lsQw%HuD^{x=@ApZ6sR@OKo2h}xOg?q77aVc5F5XMvX z(ef_OR}fY?nZkGeWEJUil@^ml0qK-K2ytxoSTl#Eebk~>_Wn04vQ?8t#1R}Oo2vLbz~xGYU;9%AmujeB$vqEH99c3 zos-xzGqcZb8E@KNPGT;(h}&!WX{JRjta6zxT9!yZR{q)4o)1_lAZt#)KXIz5qrO^V zetJCOLMbr`J>alK&J5hJeqv^EoIUu;d!3hDF4XT+;tn7c*D!k46mqhizm_6aDfGAn z{sExa9{ot5bEgHHKF|VZI(f+vR$Ay`eLuR1h~&4kHPs#twxbC$)Oe_Ntx!88w z-Szol3Li|_ZSz8@QHY-Nd#R@_mK*Fc?!S_^m~oP4>W6kjM~v_1xpQtk`nXA%he7y5 ziS3i_b)rl$t&}{zGKmUvZij*=SQ9fGC+Ffe>5Ty`f$yAyjp~HN5x$x!z(Zl+H<7~+ zUFYS0;3FX@=}ak=pV)2}o%q;=LV_XbHnOy_0A6(v9deeVaAuYtRaj#NRefY^R46~l z(bcQL>ONRTO=y(jc%g2v%lL;q!@kaifj=Aiks^ElET({>}g~#oO_$yDiK6 z`sW&PPeuOF7Z!k^BaY!I-{h(#955gn`5GD+^W(hDG-|IZ_Qk#2<%0d*b>t?G)^6@X zA?lE~lg!T^dwVMY*bx7bD-n!%xMMAO9P?(S;O92tv$XjApV193T{?I!6irO?K*m4PnJ-_E(Nc%dr1BZaKvg%PK&d2P9E9@gQ{arx5 zv5RwO3i^R!qC#BPx-?qnmc;sEF@GoN&;_z4`6-G_~%(frlVT5uu2^C*AplkQqL zi596+__}nf(~V9`ePs7x;yX6(10Jt>$M)RUsIh9m)EJxNTWoTG7#Mtq6owKp>QWsb zs>u%!0Tkw@ ze{_T!!*nTnhKL^F27o~nD~NqbM@b7FW_^=wZ|nsges$7J0-kwGU!4>!YPrx(CmI5h z!gw+|TaPn=zWR*~I!^`mJVSGi*^KcpNn%aPN!P_u~Lt82`_C z`lf3=lBMs^_e{H01SC=3?xDWhuAfe#aH3UjxmV+ekkU}MDG-ldC$9Ey4$2mif~z!@ zqjaU*dho97&2DYeKmygcsswcI(p_hfb_S>Pi+#BN z($)%A1A0R*d04{j9`+`)BB;%?N^lxPh?VrmVjifzI`Kwk+w_tC6;@V!E@B2p#X^+P zl-P25!NmoMesRYbP4^MPm_xv7AoNOzTzyKHWn5e(2k zU1FO>ZD@`Lbl3pR?rjU-T4S|0lUe_h32=@#%lY=vk@G;W7D64d!Fl?x{qe_LjM?c6 z_S*<4spHnSkbvFE5;|L5!_{!Pc2*ov%JKMX%(Vbd*xy4ZxdT80`i*epmD}SDST6kGNsa*!8d!E z>rzjP9csL1)14w#033!^sbHap*_}USCwgz0neM9qNn~odWWx%=2KdShoLx(u4v~d1 zv}*Gg$$1XJ!$oL?H8gL`Md#;LHo@T%+22EJBnCHm{MFDp{=W znaCI$DiMiAtNB%Gk|Z)PtP4=c{y`{`40U1)4S`hFYa$K{BXmh2_zW^vaL%uKIt%J_lxs?dA%09Si1UFVJ;d^^AExdm|vR*Bys5VnWw_x z9519ZzqOSO1!sQwwR>i=DlhX`(3$RwlCIq84i{q{+Zlj6MB>3P<(l#_YOsE(O zH1%%G0_Rs#I3x_rD>*APB9+$V?DW0qDfUzPtapc*RUx|ZZLSj`*1sNj=|M| z;ZdL1e9fkgOW)O|Nwk`~Yp&{;OR%j%bAq${D5)uX(Bb{klDk zu%ypEvH`-o6zYxY-?lV11*<{UcH(}*Y^T>s>z!cx*h<1Ih`R-`Sf+q?h(mktchru# z-)PDN;UXX7@x=FBp3C%5zQk))DW6AGJ2$69cbW=or1EV8TOe`1O=VB2@4pg7ShMk6 zQB8}elzvtbwRm5?kCI3A7|syw?sA6sA}n1SeW?P!!G~9IVgO0gGW?JRT|aawR_{ag zmYvi>g?p}z&=7Y5nuXKMb-G0angwt6m?I?{6V@;1x|SJ$-21iW>;tJIIrEXt+o1wM zJj$xd9u$<Tg9QsdUr7@-WQXUd^cP zw5!Aje)0IT9%&u=+W}hun+^CRQqdlbyMYkIYga_3*KV9k3UZpqtN4$j4DsH;i%>BB zn&ly1%)?9Rb{v_d1UC`!gdflu;|ONmgn7rr#vvW19R*9aHGwZ$F$ZTn8eul6s2RGmumuZ25Jm0{Z-gCfH5{bpv;Y{uL;hq1$HSRhd$w9yme?P4@! zcA&*E_31XM1olhYUCWX5)~VurjJ{?MeVo&!II_lXto-`U76mME)9EUZ*gHDhmZtiw}F^dEVLgw*?iQmS5ede(;ZNQ6Jbw!nwc z;W<_Y#cc4`n!Eto~ny$IR649LN+owh&sugB-spJxR74G^Pzn|#EJsKC5 z$gV@5*#hGdD5=u?iKWfJG5_~-T!{Ol#%MDpItVEH`xf)Fm>y>>GodQ18wb~kzpewR z13Cps$2PN7V%K6-T``J#T&7==P&vX1+$>(ib|DQ3#begM-QX9D@R2(n(04FtX4;W; zq>CV$ka;xx>@-r}w4wzz^)I@n;7Tb0qy50kHN5h>*!}3$>%YER$%KLE=>r&DIoKk~ zDmWgy1He68DEy6Se{fo87<3BIw8a8rynP)X&JR}Zwi(@}eR1Zj_Sk0MW+j;(^NWLI z_&j6ZjHmpPEu(<*W1yk}E*0g?D}Dj{+_gvoeeM1)6}#Fa-Z~bsFRkSnoKE&^!1jyu znKq?*za=6|JU!JlTaOiL(E#`lc4pWB#<;r)S0W^-+M5xFvOFQqcfbS6YY^o{v8xbn zZB7!S?moXj#?u#8zDk8SZ4;x-6>w~Y`xY#p4;4s$b|lO~)OF{9To~@Hk7>wZ8e}_F;Ownx6Rz}v<8mqCzpIe8+kYGc~ql)4O;@T1N2Z)@_{)f*#l0@TV zVwEQ%u7S(jb>-ghS~r|As!*`3ek5>3+mBN45eT$g8xZ~&ZYw;*#FbaFhk(M~@{DKc zvRy^RUU&qf_5-RKt_<`cs=|V#kDcFnw6uMplBx^(-bk+0>?kXC<0tn{BD}_Aa}(7c zHcCSfMyi(^$Lhc>cPX_4t0%lv*AiOphO zD5)ydA&{2HMu#+GTnj+(1mS3?crcGN%QBOqktIcOPw7si{t5x}8Ma=fS?10JZv0^U zZKS&%E&L@@&8Gm;pEmyJUM=6MErH9f{2uziq`;y9P=|4aYYO>6uEB zB7#4%d1e@6owepoc?$$)%_;{Ci{;x?V){o^n^waWpk{_zg)y_4s6!yZ5Z4A6`8>kd zQ@^Ow$t8A4M0~pO=}0nbAW4sYI%)nM&)J55f>@`$fmGoC&VQcI>tk0r`@?rHz)CnA zgngAb`O8mB32*t@cT2M)jozf`=b8%}^TZ}G=`NNsMFZFFvQeZ^gUga0&5vRnX84Pp zHXDa8GFM5zD!&K5P;XiRSwWs$1|_RPcD|O zuW310eMaw`IT_12-YO8%TyW>nhF>fzG@qadibb|5VifW#lIl_`K>My7qA;%Age zImEGs8p3$iRk+&#!-WLMI4mW-8SJ_`Ogxc2>yt_jJCVIQMYOPo%5%xye*BC;2@|No!%auW)F=N5PXBE>swe(af^f?T6kEr~o zwRTzpnabyr|8Y8dtNREDsnslkNN@ov)|OM!X^IF2q4&x^eN3<|J&9?nf)#BGvC$s) zw$G9gYT!YPEx@4^OE^BhsfGJKI=(mdSYZ4|4w_>6+#uQWD5X*}4T=$5!rY7RbR1s{ z+5uATv2P=$^=P9n7gR~GQZ-0jgee_?TXWyp z;8GX_3L>BB?0APhYtEMfJKwvrIX@@l`QB;P^01BxfV&o#(5E<_Uj|hP`uKn=BAQT{ zqdYj-R~cJ?b2GU$K`lNV6LXpYmwTg}f6G-V*;n70k8aNP__(*g=lXM&X?oM#4BIR+ zjSP;LY1s12Jjyu%o1Z<&QB)H?m8biYs_u-^59Chte>^x;f?khK_*lQc5OliPbWO66<%y6LkDQGRHFZr2CcY1&alD@`5 zU(t4`q#HE82w(rcOcR?4wd%^&i?1!(mDNhS{k@QUY+*!9TmbH9OORG`oC3$^FkzjZ z5U^R>=y-fcSaFC?AM|0*4lvHn3$h4Ff6)hMmw_Ss{U8Gi|A=Di%gB`ZUS|6$W=R2{Wsp@s1?%u1FyQvh z63%lu?%NfWSo4aaHl!R?5^BQ4B|Hb6s>Y-DEamr93!9gkrFo;HfmPHi>5pY;ULva9 ze~-y8R%Ru-`#!68@+BS=9D=0JIQgn-r!eTq=r#pZf!@1F08r@i&U1FRr2Z0C(+?j9z*zcZGsZYeoOkCBsWYD* zD7;(@)N#j!0O{A#8Y3km%5W8#gpGz0MYQi=!V_3Q{t_v+kntL-N6!bwO%aun9z`+! z+Bo$2>x>Io+$+K>bFiwm*6M7Ui?U$(Sl(lc3ylB|lEPE5^DSaQvLXRnMZz`BIHaXC zz>rqqS`@H{NbMF!HMYKW7>ee2DWAN#@0gL8aQ2EhUPSzj@Q0bq%eD?Rfvh(M4hQrV z@|>y?s$&_3xh@sQwEaWphO3hjDsY3k7a?->h%+?QNpxEHm zEkf&FGchML-Kb&U;E%guh- z)=U#16*Q_hxVTwB^r&*`{Hb&1OkU}sz-;#L1d1cbypxy=wOlw^_{>PgZv<}H1xtQN z|D8fB`p%&MgY`p_Tk=?sn?5NE}`iD_38xx&LFHS7Hw)3K^1Q7ll1pynjPVjcmXtNJ=eB}K0jv)Htx{zRJ z(*8FFVsjHr8zldeDUS9hWACgxG%_h)uWZ2g#XD_PM!LXT+|`rEq}eO0&w&pKPp3~- zS`@?1g;JGj1n*GM;MAtujC8@gw~X6|$x=)K`yo?AN|E+l1}ExCPm><51Q}71m<}k> zQ5}y&=*zr4Y)YtL)H5Jw=2}f?P4+mN$7T2~m8Rs$PTS|E?R;uY>2+dJN}X-H@7n`G zY!1h!%t+=?We#>7F>5OqBAU3Pd9>Yh3i@&#u6t+<%QO63aTCVKwtj1(%D+-@*Td1; zTgZ$Qh(jSk08Dn#q2OW%!vej`vdjc+Ry8MjR$Nx-QP}wV8qY5} z@Lc_@q_}(4bDq+z(ba7dmm{$7%9~?<7KkrSzzcdhLnY}Z?7mPBQD3aahKtM`HX&ct z?D|);)r%>oR0&MbvX}CDBF%XFUS&$AO0&-hXBB0;VWOYdF{MG(6= zkUn5?W5fpPRA%-#;U!x+@Zq?2Mfs;LQOua9?ocSJ2}8M1jAe$T8{{T| zmBGGZ+iK$Ea9J^rjGG2RM?j0ZT^ym)AH>j?^(6XZQUh1N!$una#)WDUb?OI{m*KD) zoxsJ!SLkTHO_&P8F4=O)TGrAQxw$?mR<^oI)@xHPZ8UXdGA9FjQd6H zXr?o{btQC0)Sdq!qQJRH>O@V7g5U(-#N+bU=Mon+?Yq54a5Q5B3MT1_{>aqlhxRZ# zc2RlBHOc{(Bl+QHX4?y92>zvUoOR|WT*0$Kr0U{RMSiSG@s+|?AWQcudInLGh+`3- z{4>hWJ5suMmzyh|9A8Ms7JpA_Gp4${IJ{5YgfNcP$kyW?mJYpPu>?u&x-Zvh4I=hG zd|pV2s>vKWep@WJ`YO$rM-}HbL2{bUNu%}4Z7%;HdO@2EMqpZ!0Vic+j0>c|-BGWm zUV~*oRk{bx(Oo#)GpL_M;A-1p22$qc6*Gn8)?`ON<~hVJAto^1=FlxZ4g6%!RHY`c zE@7u+Lt3ZYYac3@c)}4o0Xv4cS(37TrTDaV_0SciT0Fjv8xp^Nd2Cu2J56DvxG-+IczEve)FSN1Wu zA84`4?KzqXgX5R6zoDl=p6y3Z%-j8N2?{t2L=P?X>ZOb|<^nr0+l&K#3{%vwXq!06(syj3mR&yS0D|Bdo zU|m}@$!ErC_l)KlG9Yg_?9^%AHMe#$6``402P5r$W_6o%R8R172QnDaF{TTob)v>f zTTkukB%$9lV&_zU{QT&wR$}06LHLtw#!1Rll9Qd_#bpt*bgscvz70uzslvedr`a}V z9o-KzPN_M3hsTiGav_}rieKDE$p)M6K7DRq*koAlv}U+gW3w2&kvw`HX}-82c~FzS z??l!hou(_D{a$Iy5vO-69nfHEAa678Mceew-`}!UGa5CN|8C-R4?MHXHaLVe9#l+c zim7}|Fo>0Ch|RHIbX{SoCJqCw=dn~)sGzIrH}!?jw6?1Fx0g5)zwB zpbRgqY;!j?US`ebaIEwt3a;CymwWQkZRu}mIPVD64I)vLsKFK5Yq^u7L^EO$VL7%; zet!rZ=ZsICwzIl9K}5MKreyt1z(^U|83 zS9MXGL{sc5nEGQr^d_T~wU34+FGIU{`V`4KYKUGz)>67LZc~TAR}gyEuIx78EdDGY z@sR@OTrvEk*4W&85)a<=VGiCBu4NbAkRu2On+(izX~7O)hT?ccy9^ZS{P*8wRrkei zhYYZ*s413HPMM=vkZgC_@u=4Dj~}Hef7Ev4-r_%<+{^upgOP#}F;}`g;rD)CtsQ~& zJ*F?CfXrYo*|@T(Y$O^hJZ`{j5Xe_pgy4zzzKy@NxY6++WC-Mck3f)trT@fj_ul^N`w)vBS*rErTZ5LsPr6-~SuZXQfO!^# z>`gs>x_nC7+twUGy|2mc0FI0wK!W8%Z6m^*AC&4S#jKVB5wPjO z1aw}|8T2j&2q5bj+thZD`n&%Zyp|61soNY;RV?%XE)dplX8Xv@t8eJ`bzPUPE4EX) z)#orU4X*pw;KRHF1;8@<`5(ACz>=HimjCq^n8L3v8t5XW71laEbgTc-*s{FeFU~5m zI5v!h@ZMc-rau;O{yOrxng_`i2`*DRPmH(2-nYS9S%qW_?~^@Z`ln$G8O%YB3#{t@8DtXH0py^A^K9J$YMZBIPl8Jc;n zX>(w6;>pz}G}9(lHDX%QCr5@~m6&*ce^2@Vd}yfX KD%UF7ME)-t81LNx literal 0 HcmV?d00001 diff --git a/clones/abseil.io/resources/swe-book/html/images/seag_1905.png b/clones/abseil.io/resources/swe-book/html/images/seag_1905.png new file mode 100644 index 0000000000000000000000000000000000000000..77b993c77ecb5004b18be752e51ce3ef20f96119 GIT binary patch literal 95522 zcmdqJcUV-}_AP27N>D*SMWrMMk&J{Qw}28PiVBK~WRX;4B#I&u1VIo)k`Yu?a*`}r z5lkRSvS1*iq&xn>x1%&~Teo{rik+MTp()~wm2 zp{{yp&6;($)~uoEr>4M9Zv7Z?$G>Pu>c?ExtP$oS|Njrq`%3uX`ZAltMy^KMTC(Pj z_QIwXj%Jp^p7tbsdd(VnB~Oy6xvixuyP2i6je`Q`cyT!=yN!hcr=g^_s5VK(@{EnT zm$RjTm(F2xFI#gN3r;0Pc6m=(T)^Ja)s)@S-p;{A)>DD=uj|Uwq%zSmJ%`-lOVE7%Lt1}Nr>*15@Z(_6_XJWC5njc6%rMb6_t{e zlxF|uA5PrO*}_Wpkm`Yd?uEZ8aGr5>CCQ42czAdSd+Zf zmvauTrk+9$E?hsapla!2?rcMHwQ+P{CtuOj%+bwNffFnJ`w{F(zb@{&yR|W3W+j0iU+o_H?_7DAvsucvi~xptcs(Zqcd)d)$RTL=Nc+1dd`kkHg@=h%ON#oc8&ci zQerYvQbOXwVt*}HTU%Dc!Nt|o!Q4_qRe=-65w@|hkR?i)N}EaS6%~@QkTerAwUQtT z5luzSgk<)biHcg9nOcgPiU0h*s-w9Z*#*eo|2rBi9L;f!f0t)YG_#bDvD_;pC2Aoh zWF;eEC1fflAt5AbDlKYeAxV@Fllj|tSdFf;4Fb~C?)R&bS7m`Knu}UkN=U%mQeqO) zLgo^GUB}E!h-f8lAtPgIA#S3o0v?zbe2jr{9J$n50*{8du$mtRH6(gAjIM#;JH{Er`N{&1kxP~CUfvtuNQ z>WWVLV%?8Z2X>Xtb~9gW>3rH^nDNHgNa(DQz}ej0`ghhvb7%(b-gjkt)&=&1n*-UY z#hAncH?O4h$d{Lnt(J|K)NX7oE+6L;w;J;vD;ky`mKjbSUQG6O2&Jc)=&q6D2;8hp zP5vX;pSs{cRAfXH=lN%S7T;%9rw{z~bMhbk>3s~G@|tR9>*xxe^$DCU+4lE$@VmJe zbD_HeBqO%aD8!rHS+A6$;63x%k#*(O+JCQ{ah^+&=v)_YV!CqM{amu7aAQOa^~X(@FALT`3j%MsjSJqzR}>*6PcR6ET^ZZj9ecMbBE| zIoWUd@AVz)Yr>f6S>-*48h5CrW?COn6e8VtHaYYv!7$@gO-+rHc+p5txl)DV{a?%8 zY;tjSyl1?pd=*y|F)6ze7Uuoq>ve?(W;-v-S<=qRjD2EBoRLp{m!=!de60TQuP@HU zmU#U*ySlQRrkf%a&M7P`e0x7(RkxRieWl*B+@xPi>SwEDAdY=3o}K8cf_+Zqqy)UT=*rr17*{8p)YKerA=&hWXAnC*&yY$nSCWYoV1`Hsu?uCU8SBEgwMeLGu9<0Bua+#Bh z%VWHI7Xw3%W!RN?Tg=C+b5{PNjh0>va8H@5z+G@!=&8n$JhG@sW3584=Y5+#%j1pE++9x~AbkIJP`I3od?{o~@OY@bgoFbG4s^_Wb%A zwbyT6!}&StH!r!R_S?f>V5Rx@68~TMQk{|(0utG*to>7AYl5_+h5Jt@UlqTg+uK&? zG|=n0@Z;NT9h<+8xWXi2u}WweiN*xcd7ajMpmvk+`zOW)NR>n?vHD;Ju7%lg|IrRf z-G!6I?s>K!ghw3n9eY;r(cz{f8JD4@g>M;8j_36&YbQvJwq*@G(7$`<&Yh)HCBG$N z%FNf6Z_h7nST#ucqi1e;w&&qoSCLE7#o^`@HfaaKE3faL^~0HeT0USPY~QV9v1HdT zZ?_5@Z8RiKkUqcWIG7@3-;r(kQV|~(*g8@l#nql|c`%Bz1~*E)_%2m@fIY6e+`n8- z%zx-*+|_}HNFedzJl3xgq{qXULt1Z(k}np;b@^ny`t?0WQnlhWV+GscJur?}(@iCR zKXr9#o3iAgDc`BN$pOvld-Ny2wxr8Z71*_3U8SH(eL_FkZgOO7tD?F3quMP+qvQV=rTwpF+SuTb4OXP%=lTQWF3pNL!s`8+%pUu3N>ND!E-5JH^RLio+_2ynqiO@;X;}o zdL>~Sx`kiyiwzCA+z6k1HrSL@d_3>$PN$#gilWZ{3qm#DQ(0L#_^mOnR_JwU1GCh= zK^AI4k@F`QqXiC=c#%&h@rI)B0_@}X@!2QB(sZ*DzwR^FFT3UI;5Wz;mo>^yn?5~R zd^F=!>Bb%6_cWqY-A6l$-ADVCbGI;uhJ+L$xKUSa-#>^_^z~|di#;qjwi36F&Q7^_ zX`+h0sj_@!!FFb(o$J7r;D`vFUn`H6orljH16FCWfT_x1ImtTab)sbS5*Gv%cflSo4!CW-EWa0Z6`Op_6;3JbO|+`_^RNJ-l- zr{~(dt9|mMu!z)0vA$9e4&@@E8(Gn}jre%o$|0#UuX~Xv8HqmYA_o6058Nc~-J~soMx@Ss`@p;SuFc11dEUN(Yb^!z zZv7cSkl7}D!U(nvq>PYu>>lYZO|Y~5@bu(8b%v=Clv#MvgIhfmCEl}R8RaWGiKNp% zzP5yI6Y9t`t+IKS8fAa@a7;!;mSa!ZA8XgUj(0D=xGs=b=({+B+?j9lj@KYn>-_~n zeHtFQ75_~?$+sm@N;nXZ9>OmgiqcS z?1&v_X3TE=Y>S54a2B8&HZIR@ zZ5C!`X*jl>&VA7hEo|Zz>c}IZTLo&104VBC_;toqGYg;i{2_x)Tf_W~1(#aHAa%%a zWBl|>k#f6^+=h1~AJ^ptw<)`pM_c#rK?uQi*3HS}4=T|wK@ zENxUZ58YP21h3SN7q2mJ-gt25h=vPpaO2wSXeYe0bf?#EabZZ>Owze2!H>&Qc3U?k zPHGq7s{|S6$f>3zImGa!0I93c>0+UT_sj@#038iY!*v1Xw6^43+BYSNyna05(><%; z*e&0G z1ncsh580j7Jej$DbWG;k()={)FppSXJ$yB9h_5_4Ic19?FK?~JmFBkY-P6O(2;8hB z%ec&sheDY}%8=M~+q+B7U5wI*=Q+4-uVNg#fA*axEK+vClT>ts&wfmzX^&0HS=rd* zlPH$1ai|1MeR>Iu+T%-8PEj{A+PPtypn4PjAW7H3N9?ALr#~**#FHkPdn@NIt)bJ+ z&g1ePV_ko=5@`M@NOL`mL|j8H(Z9c%rbmdIa6I3xL5-XR?Ck7DJMw(j(a}0yeH!@~ zW!}8@3deQ;J#nfKLzz>L4)b5VDGJ*%2~G_+_W;dZ7cg}G!mE9Ab2a0b^HC&DMn+=r z{g4O1pFKI&x}2tGD=(2#t?TF4Ig>Gh$F7CtpLz3q*BuuBm3iwBMjq-M;2X9!#W!!> z3~DL9|BQ8MWMPwLK66Wu^B6n-$66Sx$;qz!t{VNUGL5k6X?Yui@?6w+VtrA8+rLbn350DA|5y_@`>o z5LUMmgXfDJ5NL-|wc4MalxtSm9P>!;wlZZEaz}Vb$mCYyZlx%`V+?CNMmt(^xJ|!* zev|l8ZM3uCYFJp#Mc_NGCEgT@b+mNTE&D3*;fWDBRSpl~S^*|%rcxTdr|F;+S^RV_q{RI)zu@KDW3lMbZuRHNkd z$EQj=WFjtpYEDTpK>iq#;%!Wni9UE*_NGi|(&nahZowT+;GAS=RK={X1Q5v=q?F2&605R#t z3K_?y7e@=7C=^8KtbNZCzrrEsKrG=us$&Cf7}TsO-8ftH4bgRN&B zS5{UQo^50-lC0Zv2Zw;Q%%j+>+ABM3$S}Rfz)mbe zfz6^-=U&A=--hVtuXiWQBf^{alas)r%-3sDJANW-8bSbN#DfRBSL8h>ZrN`Xvu+}I zWaDXFB1v&QXtRd|NP;G1T{Dy?v&=5_Y}kL`03$2Y8hRF~#yvV~bicnmmb`UaE%tU^ zLWZIat3%|x+@EfkF?K5Qf+@{NgAa;MN^Uc*sNIVKVB$;>!-c9v{h78;slR5e|dX9aOUp6O(G+a z5h=gOg-=jWaDV8Qz=usa+*?x5ytz~TG`~H-B)}X#Ka=FI%)+@joJohN9p&PO%2LoS z3uWq)_cgC0!7QfEE^fQt%t$ zIo8q3D=(kexYw$&kkqGKp7xFt)vbm}%At$sF?OQkKG4Wu&_{U+HGtElvdHW2Z1@G+ zi#;5TsmOQ_4*&MU1O2M;{WAA`=BH4--6`pIb_h1`vn*wyG$76nMWLy0<3|kO3d%z} z`X9n1<$lYtA|`(5pOHL&$3GejL;yHxx37o$SKr=0*vW81!P_0k1PRe0ARPhF8~@;X z<~-UfKM~YrWUTb)R0QbZuc!`zpUIe}^>KU;vDKaCK6e8Hk@^}S>OoO?ukUB%F4%`W zqxpywYO`Szg^B=4X3FthYPhw@H5jYj6is4Tiu3D?iU1ZnfC{};q&c{kyv*tJE&PX0 zZ+=IS*$vn#Pf^#bv^wG)f*3#Y^h7+^Y#s2unu@K$vj zWgn_`UO4MAEdi*GM_B0a13hKOlci1r2jGk9?=nqQ9yO#Sjv;x+4 zGIlb}$L%@tf|Z^_uQ`%K1!$LP-r)`EH~j6|68wMVgNeVd`11VpFn=w4_l)Y*iYz>h zDlK7q8qiuUMT>3}=cQ7iJittJXo*0YurxsKsK+`rAU8%XQdhA@GbLSlr_YUzhjXm7 z3n~~G7)&!PYj&ENnz}9PDzZx?SE=G(`KA##Z|B$OeGYq~!kqq?*0# z3(J#rY$55zu3x6$Qb3&7ck5pem6Vn3V4T}Z4BEtEl_BmlHTkE6j-6Ix*E2WUM_Q6J zCuHs)eR4cvTkjAM^!~7I+Nl+PF!AYZL>eTLyTXdhrWX91_K0E0c^`qRyI{5JN6x)m7xe6q6+Fcq-qn9Y9mHl7gC$WA%!2 zh?~1R$NDM~oSIrRJxy?=P_08-CP$V)-_st$_(Y=9^S68ky%pEaO%L&;n^pzY)YhVU zv`RhKDhX+Qd`v}#<~@H=jz*e^!^dYwa?j|~8a&YB7`Eq45g?Hv{&#}S`v-5(pecMI zBP~4l;fIGzmr!Q;w0qYWw>>{L_8~)7@9?AEZi^Tum%;i<{+KcyzGyX7 zC|k5k#+j0@a*IWOZs9KiDzYMKcfeZsUo;-7zZ01eoqYt!6_CG)Zj0Z#2y&q!m(yo% z--gmDNMnNy(IJB&kpRLrRF^lg)TZnZw`eOlm&3PQ>@jWy(7iBNvcKjw!rkZi(-Shv zzMQEziE*8=|Jlu(|V42=V-P>mXWs`O zLLb(gC>2FfhsaUa1Dj|feIC*Gwja4KHL>-asNH0L4bLw|kTODd1K}#G!r6{oetjNO zzP{aAW59cfx`=9&Y6LRpO`ZaBVa!ZCxH&eC-(U#oCHLat$TRTCHH>6;6IQMHdC}n}jAKWdxEi^Pa=O2AXlgqwUP@$f|Ir zPkT_jxgMV^j&?ck#g@)neJV@h;h^lSuu5PN%JjpnbPk>QPqgC2@9||Xb5c+R-9OEpX)g{sJTcIH zmx5PrO&^&CaY&JI;a#Wbzp{iCQhyOR`uNNvRWuzR9v>UaOzjRwvO(GlE30S=_pV;@=rb%w~0l{b)-!U-3389tCoTI zc;nGEjcvI$2E)D;(hgmpyGx6Yl-spuH?36*@mIYMXP^61U0ogNGBJFAe}DfO2gU?m zx9K5mIWpWt35;SjxVl};4Caim;QiGTUN-D)Lv@Yf+#h`Z-93%HsKFl9$&uv5BWJb< zL`>S&C#>)F=Fa~4cic1)pnz(pt&Uz8Ht}D+em-6_!84B}U(|1d#{~^_t-RrZ*qPVt z-ZlK!HP5iTuh5%9>@Wl-OkLY+twT%Lx$`Etr$@0ethD85pPQd}~Ch^_4(?*!>QP2>Z@_9<|VBa{WTm7E9FJ))O?d@vzL zNhHVG*3_}>(Y&d*kx-jLYC^Z(6-ulI5SW;u-MU9_iK-w)FGhiLNmF-eSfFBEu1Crb@)!nj#BS}oUqGv7S%I62V=Pp<$b5DAg9$7q~cVa zq?>12HI^2~%R3jf>37Kv60SrV-#uWu$=Wxx3MdCHVhV@K`tppB@ZjLyyMo8E1y7ZZx^_gX5tTuC{HfV;qg@0*rKG(0^$;UD~s zclL*Mg^YIL=awH}k^7rHNZ@7^u2?{uFTIhH2szSX0$@o0$5=f3`$uyiC?L9W1npRPmxXXzz(+owaSUrjpnIT!)G1)Qs=nzot_{ZY7{$=njb5D9Y=1)nV zmn2U0*KFwG<>WL2ax;?rGvT0k5>;bEipP+3;N1m-3 zhJ|J|w9Pl^(DLs9xdzy%@%euFPug|mBS=8jBBy~Md+`o*h{vjo3Q4y|xn=D;B%0O0 z1PG%i!!C+;fD*6}_-R2lRf;+fRs7@WIS1!L4Ua)SQocl+q~w3fN=$Tr0L40S%NK#i zjy^qc?(6%9Ksw}DLGlHQWlHWd({z>GN7|abQl9?f_rd;~Fe4$7DL3ROZcN2|(JEs` zg{^>zxdXTw-apXiLZ|TX(0$Gm^fWZ{16P$Sn52PvH*DHeL*zF|Z3MLg@-d8ABpIaW zN+ZAls9{u=-2(rxB-N|D7_rEQ4{OL@WmDq4Q3A*Nd(trpsCW`Y9majw$Jr9YBizYZ z=5^ZyjYN@Okv>0p?5K_dcql-Ng3P>*b_?}i9F-vq{I&IooXe0_c}B@kYG6|7Iq(j5 zXlSVHr1bw}Dx)y~CQAmOkL9|8uz< z|2NOp{so!T|G$|R{`a40x}D;30{GRaF*Lb}Gnge}Vge#HkV`!M=U9-Vj3>jSRMu;* zBK{p8n?lLr_lAqi%_(JmKbAgr#<6vmuT1ofUZx)(SY5un1v%&H6>DHYgx*KgFJK8y zPEJr^V6syI1{&d2h+$Ns|G0rzmPlG-r;^8!_dy>$q({9oM=Rb1b2WSH@-7;#{#MG@ zGbZ;#QT(Pq+f2$zq}j{X(S!oKfu7V?#?lTQ*`@}Q z?*P3PF$Ic0@@vf8bIn>zMD10ZlAHefYeF7z_WqgT{a-p1nm>$t7dfqd)28ZiQ2g%q z(saeQ&1+C4lv!V?l=x;rW;LQ9RHpUom#EmQ^m(47Tk}b!+KwYT|SOvnrdCx9r#EcYICB zA+oc>8oy0)=X65C!i>xPd{Hf2UB9RJubk_9ehIYnHZNmC%1(cfOAqCbTajgf2txVNzU#=1gOcyUdwfZ6 z|8G<4GJ{jKrB|qD3oZ;yMqBHyo~mR>-}>(ydoE(~WTg{^AsCT&&_>+w%)Rihs-s8J z$;k;_bIflearPmQ72r=nsrI1cA{O!V+T|2fN~IKaVdmO%^HZMh+PK2m4oH>cO)F8< zt;}1RD8&7C1;-Z{H}5fgT4MF;=C=LvaE(ZCpRxi3)oZCvt72BTwKzk_38I5%gu)8Vow!hG&vs2gP$!gGw18zTanQ zBdqwqnK%hSmt~10EQoVK#I^=g{ircy^cidq7gNMQ-)M zisG}H=!;4#Z$+E^Tf#R!Oq&t%4jC;2ja@Y!Qb74AN6|UrcJ=|XHl*X zf*>p;nfmb`&;1NgX@B_*c?$WlSQ=btO}5h~r9_)^mTJpOMeh7T zKJ#$DocAOp>>@@a|DggY0=_`>l_Jz^|0qGxeh(ATtKh|IpKI9VMV9W)cfH-+>!ZDy2YPG5eh)D1qI1($ zm>EI8unLg_xKq&Hk6<%0656mq?%WhN4P5RB_yuft+6{#V?=R;F>1L!4jO>vuF))pg zZ~HLOG?sZeYSR#%KuzU_-!E>T^`RQVlSM0eTz3?GJ&g42{X-XwvKTRBx=q$F>^ZD1 zW~=vb^>J_8oXWG@)sLpRhUrUe!Ugljy=RDTj*>nzZ2g&Mm3@pyg!aJ9eQ~H>$x0q& z2jhf!NvcV~3ll3UcMpU^v~Uc-%`;#?>t%WVhYhcynkXZ7T4pQCzW&^Pn{9lAE=;cb z-l_YmCA>3JmiFSmRfLaI)jD&AWSAJ2E_eQ$tl3)G?5m2}n%BQMI3~BTup?a?l!~hu0Q!Io(iz zD}|oj=3O}1uWu=Ct)3)aqn2%@`R=h*L`=uU-||o*@&vP>(d*I+cfoyP-UZTD7Q-$y zzvkxVTwGk=TAw7CO@7XH)Rpw#)iTl&!mCTSROsl}BK5<0Ykjn$V}$FEJ(uim9(6ii z-tVRT_}}MKKp0^j_8eWpQz+7wYkz=lqbCqEp-MuYiin8tLujELz>Sb$llyD3h8*wQ zR8VRiY+UGw+K@gPZ}_P`d#7RkhvFR!?oKWrzcKt!TRpD&dvGa`%LS4GI24QyUBQcC zZ{(q%+ApuWIs`2P_$Pj|2nlbGNAq{rhTm+hj|U|x@z7xCRh0YTxaZc=OQf@Iqn{=7 zzJg6&-M00&5-^uqT~h-gjyW2GRR-e9GiQ)HNZMWH{;McYSo6x&lF30O3aZsKPnSoZ z5~5$3q@2wsdD>Wi3*Y$V(6SMi+VpXmut2L!t{&&;H)IwMlSV`k;Fbb>8$BY5)0oEe z%Ch%Ym%iug{MLKhmVyER*G?X%+Sxtcg^WofD@_JQ_VKewB`OTraWB( zD5NIb($jZv!9M++KgDzX-c^(l=$MHD#1aa%C0aW5$pwp-`S&>%w~!+Yjn1dy3m0!JlnW5GdOf$c zjMQZD4okgfeOspYL;P6Sr{?W9xlSfWx?WP*8zUI=aNm8ctE^p19hZ2C&_QmZuD}8Hu^!wnVXY1 zSlo|B7PRf1NCa1kw=gRvuY(x+WE{(>m4R=mIoq~8YT-M=@iTv|23KUk1u7^mKN*epK`=z`n#r_RgB*b?^#=BFHFS0yi04o zDftaj6*>ZO0{sCv5dCUgjp33N%nxk}C1RyaGJyOGZnF6^3$|@~hq*eo+yO$62-W@j zwLukQVwaM4VE_aoTJAlE?omhi^u{3D*Q2jSG@vVYWlsk00g@4AU>Pc=8#jIYR+nd+ zuNju@z^q_9*js#CX|@_IxmhA;ukp65Dw#si0b=I0uZY;nlxcIq4;D=RP+tRQE|KJmP%TQ5mkp?(Y{aD>nmQq_?or|%p@4|Q0p?uxy za^qh0o!D7CqB&BE62I2z1N}=_*u38s78W_+1&mLIUtIqNi>#)e+Q+sVipsIBq9nC| zU#l2~JQZD)b}w1W1HCI8jq$2~z(7q_YL?ngCB@gDyOY;Tdjy@N&+xZ97hdY}($7BN zE+!<$vMo58baz*VF!7NmJKzWrc|O5C7ZHO2YpJG&f#r@qHo{;x5p)CZce{0xJ=g@$ zY1oo1gboH^=NM0Oi9>|>D1;8(e*)%FV9A&|ni&Ng+p{l8pytSV&j_kzin!1E4s5*b z2JQtaIUUWOZws`9qt`xvKGRG~*8~Pe@skNARgfqxl3PRaWDg;|Zo{^Fg8;EGp4NY=ABK!~J6W@&^8?D40LL5Krs4Tmv|c`L1$py}2HL%5@bS290!IZA^B7rG zmwcxx*0it~#82fPZEkn|p|mn*j@uHik4qJJu8V)2&DL-7(oX6asz&+g561t5!`xHK zh*iZq&XeO?2?gU_<+DJJe2P~e+^AsiDETsdSKEwE+Ru5S4$xwJjHY<&BwK)aGn-}E zqY5(D2uh6c9Ey+ZZHej!z@NOVeqfd^mm88SUdBE_(%ir-EO?@jgb5POIL*iO!w;1; zo4>$gpJF^j7Rg|q3_9t#w+_d7Y18LMWj^N+4^~Zy8Wxza9(xfDUp`Ufj2(6W9A$md z2U*{yof7rf=%9@|3LU^u)`hdE`5Y7j1vj9hu|_wl{&EaFhX3$`*Sbo}gLFgaFYxtP z6fdx+I`6e5nvT71I=Mo(OZIhc>@7$;w$vW2)FXE|RBZwhnH7IP7{t!>V#F`{CE!hM z#4ckf!7%gjz7Z_`ee5GkhI2}o20-lgojXH+s2_Og`~o`9Ng0o9prAba&R9YwYeV4) zphakW2D!H@`N^|Afj|S@l7+IVItfZt;0k>|;XZ0%%um8uq`M29xVCYzIS*7b@@PVk zSj|6=XqHibl0{$iW;5bBFI_K)f$IPUWi@0bx58MwmOKkvsTSz^lp^c4=hHD{V1R%# zzRtWn+UFCFHT`6%%7QBxSXuohD)#k%2B8f;e;O=2wBw>~Re-%~o6Q)v5LriTJ*_?3 zUO94-uvL*a;(I56n?vM3fq)Hc4SYzMLU{+yybGBgV)c4%XvV-4I*AD1z=Xsm*p6!B z_Dr97XU;>17)8@GuRp>NxG6S~Opa@#KG8JIYXreRA0N7}iL|a!Vp_GHPvx;j^~+0h z4aX2X4?$G}-eHb*AbHGJx9-Xg^V{H*PZoVgnjfi#Tu_$h`&MFoV#QYM^Mk)R^uJN`$;vt)@Wv^ftM zWR_++9pS+aEsu_1YW(m=APtkCHaY;*zh^;%?Uk(2@%0>*th?pdQ zeSH>HG0hG`?wD|AXU-=oI~zTh=A3SxrzEU`ljh&(mYc43T+wTO>b_;6<;!i(IeP>{ z$r28v;lZJ!!a;PqLM00&o*u!x@M&?B06!( z$}Yf-o$HB%l-?66$V9W)6rUs2qo>TOvY3ADt)?4-jK0 zvuD}C!gA2)ptxXv3I71nc3{s530SMinV!OLg`1~x1}Ul`a_Y1Qg{L?KFn5{Ou3}oE zT0*%56Z3ldp@xAiK#VHq>T*N&#&&SqjvdDy=-tMw>8VM1H*4Z;^+aSa=4%Y|eB31P zU?Rxh&?<@r3?LLKS8-21%>v4pz*ekP#JXK`lXGggw#B)*2@W3m%za<@*3pF`hwzxW zJvE!R>n@3JMBI9Qea~+^QnA&st584Vl){VN5p_(3TO%VQF)AWv>qBqO=D!s12mcKl z+Vkr$==}3wUrgJ)%2Khj^{bovk0N(U9kE0k+O`)S1{Eg)hWA51-=*8!i7$Bs)3NPG z(~pM7)OpyOV;t0`OMR?%Fl85t=rsA)?4xN?x1;GabjI(zjABg-#xmhq9~Lj z#sc3tRvPXilJ$I#Gx=v;jM)P}JaGp|Ay;vSGoXboL@*a$^uG=9u=)vB{-BJoJjm>5 zR6g^%vi|O6`edRX_rm)SrRGFgkD2fDF4n@Qh~AS+?FX5gC&!C76RAZ)3SM3ph?_Ie z>QzU$l9daKT$@RZeAr{MQI|AM%R?P5+;>j97HBG@?;SRQfdP8r;ARC|HfVR%>pO1k zyIAb8Y90vcJBO?qs!0C98(0QqkY9v8`VtSkN+$!&IkKK2?})>55&U6+=iI#fN6 z*_bQk1^UT!M$qU5*3GQxsV()GUYGU#h^C-=Q}#q6UeQ-JK=#A)qm0q;B4647NRv!mk`qMu7CR>UI!G>{1-*h*23E zs49@1cs>D>$=}q$H*I)3?|)KR%4T39b~)-hZ6L&)!&JnAd}c?j(RoW2JR()|`dMJk z)Z14GGUDiDCGONM?+$7({bT0OpR9e9dU8z(LE3w~k*DsceR&aYf78N8dTBMqk6!HV zi?^BOB1$$YEy(t7U+o@|Um1ew*VD6Vm7L5xUD>>qC~npGd8DRS^zXp~@N5I8)}5n_ z3DtkDvGWIA;EQqv8IVqjVky%Y;{=q#WIHDl*j2zcpJ0>R zYeKB$ZhfAZ`{5MPXct0o7$=1Cr*lX5dd-X=y_pV2g`-CUPAEo8h+0jpr_My2`*KRF z&#;$_tC4Vgq>p^Mv*i}4@A;4vNDjF6ks@bH#>Nz-o&xzBVVVetSE1o7k>>z*eWOh` z9k0uoee`n}D1sr~$@1Cx+WNQz`jT$v&!eqX;|06Ut?r^BsJ@xGc?I}noq9erKp^Zu z7hU#jp`@c&fl_7tHez>~Z}I6$ip~=kD-znu0L{p3GmcPDUjvhg3A#vTMdel*a%8dw zTs)+mqWF=42uc1?)MsRV#=STsF-ygE_QO*JlzwQ%*!n%B?w^Gqgl5yG`?Bwo%yRA8 z-?ApoXH!t6HldkEwWT5FT|T1vX&G1QOUz=;6J(ERopCnFlo z{&;G+o=wJ?JMTpe0&Q4~}G1y3Ymz?L@W1An^5(v}k?$t3xVU$ht8_*2QHA8&!MJ1mzmm zo|f=lGklPSfR1w%^%&I_rm@tG(qq;_9@-bW(9r5?e3kQ6q70e3O4JELlI>@20aq$? z=w7h(I;yQcQ-cj~wkJ!_Q_Lx#z#~kjV*)qmg9*0nNFn=Hx!=cI`_`7!oQn=i0B3F5 zjb1)M_}`I2nMlAur<3XlVTNBsLSp|@wpfglvX0%j8Lsa|$6o<-mGNrQ~l#JTS?jqx7p zZ7cQmK*tdht>7KiUF?y84*=AO2Ml2SSS^=oikNxO@LSMP{veidXhi681qBtyGAanU zZw3rFH}wS^`g)oT8**;Sl23zbnNiZc=$(CsZUS}hMkq<&`)OcG+l%qH>t9G=GL7I& z*yA)<&yfA&%qE}r(1~lAdK)Jyc*h2%K1e=!9L?Dqbg~!_>McY4iNS!@+WFX5Gwzjt zK_; z^Z7AzU!Xwv#51Rrem589r#qCs%--hWRrK9CedOR$Z{^wxXUz^ick@2@pbGexx(JSa z4G9MJY!gssTn*O5Oee?kWh=JLbfGwX9 zk|b^!T59|qRLR&z|J7v=Wsm3P-rRiWD@=>;fRYLP-Zl&c%l8M$F{^1Qe&PuyO1-wO zHQPOW`#PCI>CL>v0f#>afgU(V?5APg*&|vf(KDfYI_~x2HTY9BHGpb0Nit7fV-sJ* z3K$9-2q3bf|2{7FETso?thX-R@enO+<6(Aulm&O+x_CuJV$20ZS*w z_%Hu3M94sfmj#48tPbhRWIURvg{{Q7=&#e(XU=>^hx2jUz#YOpr=+w8zqGN{1q{R> zT_vJT-^2Y0VnYx}sAMNUVfwCeb*aD-U3vO8yZ7Y}Oy7n*ArEm_p` zxnucqPz{7c`?mU_R6BzaU#I=2{>QXP7OJeZ`+4fGMnrT2dO-(Re_34bwDGrqOJWpx z-`aEdEZN&3;y7@XRr@BytQ}ty=qJ5X53RozPLP>G-*ng-SnT}=)_vKtnSQYq0h9d3 zD2yPyi+1y%8Kial(o^iNtV z=qB7xRsK73E&C&@d0@q;#J6UlK50>8Oy;}cU>3_|oo<<(zN>TbRD4Z}p|Z1sgXdNh z6x{l3Lg^iw{XMtXp$zSzb92tD6R%bT0%gfn&wVml(#HjJoLd&$H zp2M9Jof!f3vFB4B5ckVdj;dZkZ{=}_aV?WE<6|W`ztg9x`FB&#{@KvBE8|+3Xfbxl0B|Z^KyEyK}8Xa z-!1jPN*!?u@=+PaNaLLX2OwDwevlMb(gpPyx>|xssaM{vcro+!Jp3kQB?i}El-NB- zLbcQnD1!W4O2$<+qIq#tUq*_oS#3PCYm!Ox=ra`#>RbWDdn0Sp z-vCkA_3S(ru-`83Qd!jHkl|Tv8zC?}7C`!izs*tOdbm}7o<_C$Awz2%g)2~!j z^ny@`WUL?!Qmm;^9TGK4piGpssNdZAt(tsz&d{bK_hFsp3~y3qW@hz>A?H6(kW)0n zL_sOvqq}`TAf>Bohl_RdORB{lMVTdzq0g6x>lCY#<|g)hRa!ljvNW-9IFw#wWoe?n zad9|pepZTi;m5mZ5jHgif6~&Iq$+xck#cXh@rEi}x{(ueUq4NQpogSx^8%v+4htuL z&Vmk+@=g=y2C56)$Y^wIie06q_ZW8Uz*_+Rd~P#5c^M#l^C*rS<-yj0*<^XWw8KOW zL_jB+%3_sp_7^PaHjz^!cEeu+Ut1IcE*WSM(12@JQlFto0LpIuw0`6ENLjbD-t*~e zE5TRmlg~fq+Ej@oT83>Qdm2uQKE|}JDMyA(D{>k# z!2tp!oXi;n$S|#dH}F~vf+jV4#vokSg}i}5T>oPB5oyX%2t>cVxl5(3a`Md1S-)*` zI48&63}ANXFs)XWZj$V$gpG^S`p^)nw<1M99^9sh(Y#C{1`q|^f%|~On%&5?Aj~6r3qz>)DPj~{Z6Ikd#kAYHk;HN~xw)f2ITWDn@9lEyj z_30KgO>y`M#6t8q@5OuSJqA4}-^Jg4ZM02^*ZfjN(v%l0jpWvRaOj7()4G}iH$8U%Lh zOvxsX-`m!J^R!KOspoj2_W3#Iu3;h~y$;nYG#$S(sIu$6!9S9iYNh(}eZ6xIMR+v@ zumz;t=fKa*PC_k_dNA%OgskXFv)@WrF%V%L%S}Hi)Hs|f6PQBn13jIF%vm9kg@kU$UMrs{%blE2zb1{r{$h;8GGRzHAjA$Y-6919ruqS+kS26HE3eE`lg?2Y9|DSkC1Z8vuUf3}WFRA$@H{zt` zc)*t%S20P}dgAmV->)|Zyt#?#@84gon8cj@ zYZm8EGjML_cz`RiVVE#GmgMu3_Y9;KrXJ=YEiwN)Y*dZp3>e`0cP<{xzMrB_?H4=< z+`KQ8GUDp5ouTHqu!V-e_AgXZrsQWND*mQ0qCSKjz^HU$Vr6*|74ik$zB)jjGji>f zePB-U9+23*8_4Sn_Ls&t83ifoF!ROG>N}Cu4|pe<&Hp|-%Ev1t-(u%ap^qnZix$i= z-z!mXJOckePQ;!Rw zRjNEf*2a{9^r}!_#yLsk9UP?f0|g3L9nw6HGXUh{0hoYI57W>kqsx`WBp4(a+Pk-i z5|GvNsd&XnX)gWWI}|Wr!b#eESoOdGG&4?U`1&9&t+NRkCMnefixU_La0l+M+D zl%lIUuaae#$XmgAE0fnYYXOvR-=LdF)aR;EQU*$xoCcGJ;Cize)hWzOCk6iGR)qpj#u6*=Q_8!p*%m8-=zc*iP~8Bb zjxX@cD=UlRNWyRL3jggx6l$+G5a6VN#{7)uPtPSt8vp&S3XBb~52+xt$!`%c8HfS` zuf2iVJy&;-k(s#wEjcC)y<2zkukf3hn?oO~-ou@*Yr%ZC6wjQ6`g;1|0Ge5+y~7xj*K!$&7mUebE3)hY+Xl`@lkz%R0%&O`hXLJ!=-I|*<(e~S*EPXEfD%`= zDaZ%$gKy!54G)_538zXtqdWt+KI5GmTzLYxwXy&g(GN3fEOpu&=Lm54bvs^z@dbY$ z_xR8P8N{TGx_UiiLX6SI78VxZGibN$CXIJ16y5*JIdRxPr2QhfIYZh*hj+{5BIErG z&{oKiC_d!#xaid3WNX7LYB86_5rw*b=+C%vjXr_INn};DY%4$;cmu-?aZB2D-g6VTBmU> zbXYDwZ_SOv@pkrUjGQW8i&5whRSTQuAMk$~+_Ez)h1+jxFr=qZW*K?`V52;>*o}S& z9EI4)k)!9$@zx~&fz`_~I9B|8htI(&cq^`8`V1P-H=LlYZxxjXYX|GwTtZoVlMRNm ze-8+h`*veT(Mqsb$~pB1ZoTr{^3nm zG3B6IJCpKPOMK?VgJ|jL)6NE%cwLZGlGr|phlEwLkUWt&gUr7Z63rhmv917Fo$K7#s zO`iiyzm$ZG>*0LFoi+P%|NQ$+SL(gkdm3try`a}8CKi6!>T=IOPR_Vy^WhkrC~J*Y z0T{tsqCUwtAHpovU&q`lS=-p%#kWZH0cIMWo#MP9e^ z^=I_0E{S#L*6)dTTz_t5=^UVQW6$n;mI+8reyxv=ynMsuw>T<2qC#=v8{#BYI~NE2 z-ww>&cw-}ZJoMsrQ^@*I1a@ONTNCmfUf-%jSR|(75Q8*0>p`tQKrT)^Kv)dK6T}SZ zCwA+ZQAU8rlJ$!?0(Hyqny=hX%ryg4z%?)a_~rqvqlcz9XVtU4^DdMkHF1d!ZxL7) zbaHqnNzAr{Hi~c&0TNl0w}r8D;UtSVBJx{EN?wk5YL)bv4MP2Y^M{PYl}{8@`u*4u zDD!POHjA-LaP!WWbW5ZL8p0lVW%K=YceXDg?H;KDgF z(@kS({RN#ClGz|-=#tL+ zx)jw+oi*-Yr_ppy*?`pzv3WQSsAb3W$DyfW9&b#Z$k@2RvAKwU;PxS$RUdCjkGr&h zfsRwG3~up;rfAt2ScyB=#?Ed8iiMD8Mb8=pPRI(fcHY@)Tg)tCwBgVtynF=H-p)r~ z-q){99Wa>Mq3Gk8;)yEy2FI`8`BL}p3Rr7!`T$+))05tyfA5WS7Km77=-s}se*k?i zUaSDspzQ**JFh~in#CCQ$b2J;u8YU8!~!H1ST=P03Or%~snBZaEFxh=?tDYo(zr7? z1<!(=6RZ1AwDz?{p;w0$fYi74k2Hb0tPrA-HwkeDmD((d&w?? z8;eSb5fVO8c-oOU+wIifwG+o)KF|_s(dvHe35Am7J*Q98!o;l0IArf`Z^?7QZM96K zWU%QukN|+nVW8M=yrWNgjz*A#S7voS*Y|stqQQ~LK{rU$56v0BRcdXDc5+*|aj&+X zeI96ex;`?polmkowx+@Di7XwWBy;N@W1qjFxTKD6p6@i+n0dBk&jsr#SK2?XqbDyy zzQv9j#aC5T71XHYvSA2&dZ0>|+{5l27b#z2+_mdfUgj{~I{*yl;7)$GS`QPMY+~fj zJ>Nq~r^{|XzFP=Qx3|z5-aPTbwR7OL7!MC@MID%tf3;7(98{&pg9e5vZYpE7ND0B9 z*}!5*|C%upL>{ou3R?Td8-b`m-$8yKjI!_SzB^`2X^^b$AIcRUQt(}n5X%wzL@Fm# z`@B6><_(B;vt{%vz>Rw{<@||&ssKBFUC^A%ewx18?~di3iCQG`NRL+J7}22BY~&|O zDdAleR#lc-S{rL{uK28TE#YQcHHGH&8^Z=D-bSTflI{--Gm?8gsK1N)^1*U;MRnxCg(v0gFPt|BLkEye!PKA^1bAvh zs2@j)o-MxjysR+=+EJIlKjS9&Az%UQbuHeNI=z_x5>Db&f*NY_=ornL(LVMI)>kzz ze8d}hOdka}78`ghhRSgSTom<#8Vi-uc}1f5I;x8F7|$8J(>OjRi zz~%n-$AN_%7GV$=$x@{sNv~xfbh{J*z(dO!=_CJ4g^`lZSF}4>{%RbkX$Xu&3K~Lni%zeqtLpi)AtEQASzIlX`;s7G(?9zu zthz0q^A?6wm>xiXRmbYjep+B=wQtMfi&8*ioc{|MgaWNOWlLwsX${AyGzEoyZoyIt z?XkP{pO>*fWRYatTcJlDyM=@}F*nC9FFM>?sOh<*91Lghm`W5iy)d3u-JO54cGlQI z9tu#pKPc&r50h(^MycoI9SCZ;$purn^Ad620PKz-jM>>sJ>wM+9UjL-%9~WxK318` zvQx&{;+l3Aq#rMZ$P&frVG*b$pbh~d`YP=(EAZdgd+%tj`#)~HjI59mDwK#6va&}+ z$f`6%!^q4gBP%1LL`JejM%&CRKJu~3)-W?eWs?!*etfR$`u%?Q-@kL8``mxr=X}rk zUgtXH`gng{@8|3Je5|LF3GLN@T00rrk57W-R57xq`sfUWMMNy=Mo9No+`2}~3D8AH zbI23)|G5&4Sf>l6E6meGjDs}!6KH&<+C)&bYgr6w+Gpag9Qgj_Ur|_i~j)-6p{Yb1fZG>`~5Q~gDDvL z9)5hw`&ea80V)xtXXsu5(v}R9-R9f>ew3UFjRFdV144yRK}P=0e1U_(kt{lD`s)2t zC3vhZ?xHv7IMZf>r+(QPk^pt6+RK)3p+)Xh=0-XKqsI@&ne6%g9T4<+1VAOGA%7bXOfRltHM|=v&U=E~GMeeH7`U zh2AE%{raWYX0%36*xz=~ia#Ht=FCal2C*ebl#sbMDMuxmR~*R%W@s?p0$S@|X@F5g$V6LnNOWzqcJpeD z>4#OCi|At}r28NmtGKW#P#nn16JU;(FYV~QCUzOSoy~~z^HF|X$8|}B=CF*yj}v&F zQx*h-W3&uR!2U;S(}A8MqVfU199a*6~EICj`j0i;4yqYA`v4uIe|dp7xXuD z$gbbTy@!0f+Mf5MJhv4V!swGoLcpdc_hl_5RR5eSWyFU&Wu^vn+~lhFBylWtp;x*8 z2~%Q!!!(y1cqe*MW)S@YUqcp~ZVO=6)Y}+g{dYX(bJ~y~qhj%3k=dwMD7p6}k6;>( zEUCUAlI}5Wb~AhvzaK7nqw433q)V18bnx6{jv8Fm$)0VFJ5!wE&Lk3s?F5EBC_`yT z(rh4;lrFk~GwUFRo86)N)j;f!! zVVl#xq?^3dvLV(*Z@2IOh#vC7%A ztOa|SxN4#(6N$lkPgf6!h|HjJU7APNib0g$_CRyK_*`^sjCQh~N}AfjhSq(ZKwL9; zH^b+S;6J3+!5VeuB40J$%JrN9y?zK!1;y2Z)FMa(IW?*Ig7ZwiBEKM;D$> zV}Lt+oOlOK**8@_{<9^8&g!(spEd@+zZp-!5Sf0RX;I_EiQb=j=x9)DW1wn+vP_9) z_RO%6+I7n-BR^0mh{Ph`FwhP-zrp;k$D!Xdm3i#&1|-CMhR9Ll8vY@f$g&#UxnJx3 zGRE%-;^gEc@T1R94H|?MOrPWLWb38w9=*SKx4NLTzO3{rSkvb(qleu-EJ6(cXsfhA z3sm#F=qww>l6ejEvQ0hij5VvktV$C;FZ#uUgziygo^lj{o><7vIxqZ2Ukxhb^x^Y$ zC1>$<1(9S{!nJ?6s%SXJe?Za4FP2t>mc`rG&d@M{cYoRCRB2H$3eV=r()> zn_9YWP4#?E9mn?Yih+MEhBTam(FB!)-JsyeVxWBJIV`#l@{#h90()NSc+w=dem>s1 zUj8@E%q*1A2^5$yd8i>!&VDONe1C%44Pq{EW2ZIyI3;nsmN`S;avw!6 zj-y<=kHT-G=^NCl>pXv3@*v#M*~zG4hX(0j*6lLR3=X|r;99TMWC=gY*FAA?=h4?o zK0mw;3y2wGD4ptpW23t&s^q2M)(3;^SNzTlVJf1c9L+q>QCO&WzMOWg@@n#LoE0*c zB7ua9)N8;F%(vw}NPVyy*K%b| z*-cR@Np7ZSJE3sEG?4w`ykPj+$K}=h_j1Oc;K{*%)2cb4qxao>3XWVkyST}f$om2z zg?=h0i}t*Y+Fw4%C~ns+%GtI%viD+0d;+KDR3ypEW~UgZ|2+l+Q;|Vq`nZ!6i=yY; zzDV7)_=F$ERucl#BkNxi`EDIae2>ntaLZx-e4fjFwpQcs$TsxYmleK*OzcPbzYv-t4rl(>*YzNsnU}FS>yvop%Vi> zcor_H`_)ZMQHxd>%anKWtIE4&r)I4arH9#204g##XZ z2Ivv(abuvl^(-0Su|pq;@hqwWV@=`GU&Up9D2-y9g}X*t!gU;Lyvi%Ob`C?|13;JL zoPHvoaRU#3E*OR;U}x26R^n^HR>hdmF3Pz)9<~XxTIT+%&`qoU?Oo@ zz+Zuxkr1<<;24>_-7qy`j7eahXviOHYlHT3b%w#544QFi(v|$wK%h5}$Z7|gDlHDE zDZ&=cs@k7MywUqnl6xbs;n`MZ|1kduN{_mdT_a6NM-MaTtK%jf%E~zGoEe)T@Bcz& zzN#@F4iDb#@7lIJkDZi}40ik^nrdZ1#3k{Bm4&4$f13RoVlcj|12XH$Ee>I-6 zeleB~aWL#11X)u0sB@4DzR#lsqyK<&bOz*P4PR<07}`7ruCl4>s=nWn%)oyyA%UZi z{tfT37zi#B2mctv@;j{#G>mzV<1MT5j^hh0E0Ym$C$;}LC`xPM3|*sSrGblV4~TK7 z!EN4#n<@vJ0IS62i%)7hqZs4+v246Q492CY%^q|Cn(}pEvq~#O_#1HN3|@3)y+y;q z-yL583wsyW*?;&P62>=7BEN~-gXI<)^Hd-;1yJxBWN_lhbrbJ%+q&<3(nY(ZwV@uk z=1&jJK7k)+dy|ZO=J^F6*K@v1%@0R#+?Qu|w#j?^+fA-=qo0iSR~tg-QHKM0=AC0eMX}kM48WKhA**V5gMgghBT+v#9FfRuZpEt=3N_H` zuPc`ZuDt&l(q&Q4=${u@aM`ok7|OXmT(bZw@h8-D{|)QmbJ84|bHQznT82=R5=igB zIXmD>K3;*6_J2RX|9MY<$Ucns6m6dO(qyy_(Y=n*ZtmP90lgDI?fG0LsvQwEMC z2qAw8o=zAQNm=dSQa9)Sa)L?2%?Bw1_%>3~+toaCfBP9MpFocfY(hU#oOETVT=3%* zhvyDTX#YRIUpq()rge9B1CjqVJD6S*kRFkVw*T+g#qA%E&I6SMu%{@yga6c;fKh+- zAxwD=kSxK?dCAs1G38o@0Y6GP$@uOe_$^fz0^06e7z#N)ycR4h>wL;u;Bk2){eiFrEKaR2G9pz6-DVcV5C@eOciXi&1{2t`i z_@}-%rw$DbMbwikV0-kQPYnz9pIG0YIJ)gxH=f8o z@uRP9KhM%jtpE@t(~Me*Y-ve6R&?-wj_SUUN&v>6pT>mCA2*I8gMok%=|QfLzU+2O zQwDmCE|S3>;BtXpS@9 z_@@OY)5!lvT?-Cc6E_4MrXO+c@s{Q^<)4RuB#pd4i@?txG7BZq>7Qs|f_j_asMmkM zvPf^+DT7!s;4UD&=dvjnRC#GH;h~unh@M^o(s0lflgB7wc4Un~+Z+7|=xin~U-8u= zXbA4pa=Kj!p{w&7B>#MrBqddIKd@VmvGPC&%DD?mTw z|LE`Dmo9O7;oeBLE7K}A_iOtU>76H9xgze*XZlS3ATgR%?6M+uwL&3RYmC*FECC&t#}6-MCy zRmeQ`b0h92@%wEMbRf}%k_8spe!9>Dlt_}2NWJxbU7c~B3QuaP@noPDXqv!cKu(S5Lv@Rb{Wzz$L|j8^E;B! zsv~wEeeWnfejC7-J$gwfJW(F{(6s;`Lds?hT*h$@ID9a6G(pr3rXTd#3A}PE`jG^c z%VlQhJr8c-$ySU8E8-xo)A}{EIRgh|6WMV%N;L}*huh;=LXQD$-pKkmbt$1{ zd}F-ei0z#T4?vV`U|ajKtgJcCatsUrji(ZsUPzO|%LXo!Ei&&g>qKcE6&>T;xpU_q z>4Yy|Ty=(I+^0BhAeH{Pmk~PsKT?td^bMF&_>|1$1&7RWKWOz7hH1>b)4op_3sJfaTejnTJS?KrYCa2Js%}|4bn?OGm3I~f*{bA2ry6Rp-6Y@x5Tu? znIR&1(7qJxU&zU4T8|}Obw1_V8E)YB`@4Y4zI2#G#LoVOf$-x%uNh8CfJfkJ7D0uN zRQneio-I8_8_zN<5SQ@WRo&=)^WEf*5e)b|G9CiFR28zXA4m2d;gF;LD0m#OLGvwO zi@FO{A4r%}XBLg0!*gm0i}%FIhTHk!qwz8vfM`nv%zXAXF%4{rX6qGFo?}kv5;CsZKm8Zgt=gZ?}2Qwi+)Hf5mnbM+TWW`hh;Si#}fMpPLdmtio7*;G&%$ZF|LyWZG4a^Jn+nTfDp9I|} z?B5uh%G7wF&8f;yA)!_crw4I&Tvtv;6(ef`K@5TVcRxdlXl+?QD>wMT)N8-ihtN*E z!ZD4Z+TGVykTb7YNT?yEZf^>v@kLgGoZI9nh!E*MmE9@QraaBImZh11>$$AxK$cB+ zeujOe|B&xAHXPIDdlPD3j+Gr&)Yp1cMS7a z*i%U&Zp$8CV-4ZI4s{XkBwdCfj}^9;5Hyr})*2zYOzHm{!uJzhZ z!W)2eODU>87TMYNiHk&|^SzimWd=3(5WC?BW|Ken(r9N;SG%RFNK&w-xQNIrNJ~Gn zd{@hvGO>*`yrw->0ij3RMc`nBQ^iV(k&?*e(6W9RYOiygM!1pckaes6&VE6XkgQHj z$>I2TjzfFo=OdH4GeornA6wan!p3Z&eEzNxV^fD!e3BDH+K#Y3P>G0wf8ZJwxCs4E z%?}%iQV+9>fMhnEl~pRth+!dlx|V97|4RO4eO>P1Yjt?0?yw2ln(q#Oxt-ILTDOqk zyfSn7$L)c9(Qh^HXx<9OpB`YPZPtF%BHF5d{d%VJg7XFENZMDr6F}a(erL^bfMN49mH~%`yC(-SfEgIypZ_H8zNSKt(;6&_%@m z<%G9<5?sW&O(iqb(54==lG^pj=Hm9dDoOZ(*h>Ifz2|RDKdW66jhyV&3a4LA%^}aBowsu zXFvJgr(@!F>R;(Q%OZoy_m}5yvRux3vjse-->#G&I}MJU_$IxO>3*3$Kml3<(}?E& zf!Qgke1gj42c1;19aH6l{RRG;es})>;X@$Ff-5F>Lx09YlR$u>~oqSUTDj~D{sn-f6CtY5l6WNop{O62L2%0FKKQ5waa_rywD*M z@02`yg0_y;5;c{xMrg*4#zbepy1%TT?^N&=Hf95rwu*Vw8FP2lyYOA%l%($?a!V$_ zW<0%GuJ3>9BU*>eg%3wS2_7(3Wk2~d;h_vY)!bpHb|!?tTa$9%&3aovhATyi=UwTr z<(I<{+s_r*Ir+KB=fWW0wr1-L6I>E=^g8bks+ghyG^5nkltV91e}i~@!zeuCF>1}( zF;wUo=Uc;pCpe|-5;TSgJ89$xp4&k%dbh3XsucE+=tYD|xFJua>23LoCMpn0+Aa@s zzyERfiWOG4%&jr z{Va*}oslSfMq zhL20V4SLm*&R6tB^}tKsf4k67ib#qdi$Ab*B0HggNu-yFOqkykQ0L-J4yHsMP0>XhT|Z30&hICTyzoEuDo~)oz0E) zW&4Iy9luN}uQNzKyOke1s&}3wiMn$V_tD{u7|f`th7U#jN#mFYheVUE6v*J}%YPv% zNE2zB{cNmAMpZR-*y)sJm%Hzvp&C&yk>*zFl3MHXgDMSOzrP!@Ro8fm2dR1xWZ%sz zMMJ}h%_t@AIZJwjbp}Ym z70I=bjrRYuP!O%`hiH_Gb$*0)FvpIA9@fzhFSM&W@~t>jurW6L>1;ezc(7<^)n|TH z^BA;>lO)L}f{P`}J@TbTVb1JY{)p;%$8q<5#dWDN$R5F3CogOk9MRJn@<=boq3OE0 zuC$8|Z+AoNG~`}(FUthdw3?02lA=J8p!Zz=CS^K)b4|}sa%OHxh)W=WM8QQnq{qT9q zH8jXxFH*5Ui0lop#)@Q)3CV^%lGdk~?^M8GCUi`C$+vF?WldLR@!ZlB5oW@wA3gz5 z>pf$|<@#Nhzj$(U-ZeL!eB`LG>%DTqX+$6B}l?6ug

    fzfM3#s4&pGFu4iH+}>A2_xfJH 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≪^&^s4z8b&LvGnJPKP@6EmumVb~c~FSL9GbsV&H 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 z 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�u+SGa4jw%vx?S#~^Qlz1k!Fn@ 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

LA!}+ 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%0DE8Y>MN*}@z_GAUk;J%v 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



+next +up +previous
+Contents + Next: + Recursion on Nested +Up: + Programming Techniques + Previous: + A Word about +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node44.html b/clones/colinallen.dnsalias.org/lp/node44.html new file mode 100644 index 00000000..bc91c008 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node44.html @@ -0,0 +1,216 @@ + + + + Recursion on Nested Lists and Expressions + + + + + + +

+


+next +up +previous
+Contents + Next: + Recursion on Numbers +Up: + Programming Techniques + Previous: + Recursion on Simple +

+

Recursion on Nested Lists and Expressions

+

+So far we have worked only with simple lists. These are lists +for which the top-level elements are our only concern. For example, +given the list '(1 a (5 g) up), the top-level elements are: 1, a, (5 +g), and up. But often we are interested in looking deeper than just +the top-level. A nested list consists of atoms and lists; the latter +may themselves be nested. Searching, deleting, inserting, replacing +atoms in a multi-level list, or evaluating arbitrarily complex +mathematical expressions are all naturally recursive problems on +nested lists. Such recursion is slightly more complicated than +recursion on simple lists, but it again follows a common, general +structure. +

+

+
 

RULE OF THUMB 3: +

+ When recurring on a nested list, do three things: +

+ 1. check for the termination condition; +

+ 2. check if the first element of the list is an atom or a list; +

+ 3. recur with the ``first'' and the ``rest'' of the list. +

+

+
+

+

+
 

Example 3: +

+ Write a function, ``search,'' which takes a nested list and an atom, and +

+ it returns 't if it finds the atom within the nested list and returns nil +

+ otherwise. +

+

+
+

+To write this function, let's take the steps recommended by Rule of +Thumb 3: +

(1) +
We will move through the list one element at a time and if we + reach the end without finding the given atom, we will return (). + To check for termination we can use the predicate ``null.'' +
(2) +
At each step we will look at the first element of the list; if it + is an atom we will check if it equals the given atom. If they + match, we can return 't immediately, else we go on with the search + in the rest of the list. We can use the predicate ``atom'' to check + if the first element is an atom. We can use ``equal'' to test for + equality. +
(3) +
Lastly, if we discover that the first element is a list, we may + need to perform two searches: the first within the nested list + represented by the first element; the second within the ``rest'' of + the original list. If the result of either of these searches is + 't, the overall result is also true. We can use the logical + function ``or'' to get this effect. +

+

+The above translates into the following simple piece of code: +
+
          (defun search (lst elt)
+             (cond ((null lst) nil)
+                   ((atom (first lst))
+                    (if (equal (first lst) elt)
+                        't
+                        (search (rest lst) elt)))
+                   (t (or (search (first lst) elt)
+                          (search (rest lst) elt)))))
+
+
+The following notation gives an idea of the execution of ``search'': +
+
(search '(a (1 c) 2 7) 'c)
+        = (search '((1 c) 2 7) 'c)
+        = (or (search '(1 c) 'c) (search '(2 7) 'c))
+        = (or (search '(c) 'c) (search '(2 7) 'c))
+        = (or 't (search '(2 7) 'c))
+        = 't
+
+
+Note that ``or'' only needs to evaluate upto the first non-nil argument +to return true. Similarly, ``and'' only needs to evaluate upto the first +nil argument to return nil. Another interesting application of +recursion is the evaluation of mathematical or logical expressions. +

+

+
 

RULE OF THUMB 4: +

+ When evaluating an expression, do three things: +

+ 1. check for the termination condition; +

+ 2. identify operator; +

+ 3. apply operator to recursive calls on the operands. +

+

+
+

+

+
 

Example 4: +

+ Write a function, ``evaluate,'' which takes a prefix expression represented +

+ as a nested list and returns the numerical value represented by the +

+ expression. Only +, -, and * may be used as operators and each operator +

+ can have only two operands. Thus, (evaluate '(* (+ 4 6) 4)) should +

+ return 40. +

+

+
+Let us again try to identify the three elements of the previous Rule +of Thumb: +
(1) +
Note that we are no longer working with a list of elements. The + argument of ``evaluate'' represents an expression. If this argument + is a list we know that it will have three parts: an operator, the + first operand sub-expression, the second operand sub-expression. + In this case, we will need to further evaluate the operands. If + the argument is a number, we can stop. We can use the predicate + ``numberp'' to test for a numerical value. +
(2) +
We can identify the first element of the argument list as the + operator. For each operator we will need to apply a different + function. +
(3) +
For each possible operator we will recursively call evaluate on + the first and second operands. +

+

+The above translates into the following simple piece of code: +
+
        (defun evaluate (expr)
+           (cond ((numberp expr) expr)
+                 ((equal (first expr) '+)
+                  (+ (evaluate (second expr))
+                     (evaluate (third expr))))
+                 ((equal (first expr) '-)
+                  (- (evaluate (second expr))
+                     (evaluate (third expr))))
+                 (t
+                  (* (evaluate (second expr))
+                     (evaluate (third expr))))))
+
+
+Since there are only three possible operators, we can use the default +case for *. The following notation gives an idea of the execution +of ``evaluate'': +
+
(evaluate '(* (+ 6 3) (- (+ -1 2) 3)))
+        = (* (evaluate '(+ 6 3)) (evaluate '(- (+ -1 2) 3)))
+        = (* (+ (evaluate 6) (evaluate 3)) 
+             (evaluate '(- (+ -1 2) 3)))
+        = (* (+ 6 (evaluate 3)) (evaluate '(- (+ -1 2) 3)))
+        = (* (+ 6 3) (evaluate '(- (+ -1 2) 3)))
+        = (* 9 (evaluate '(- (+ -1 2) 3)))
+        = (* 9 (- (evaluate '(+ -1 2)) (evaluate 3)))
+        = (* 9 (- (+ (evaluate -1) (evaluate 2)) 
+                  (evaluate 3)))
+        = (* 9 (- (+ -1 (evaluate 2)) (evaluate 3)))
+        = (* 9 (- (+ -1 2) (evaluate 3)))
+        = (* 9 (- 1 (evaluate 3)))
+        = (* 9 (- 1 3))
+        = (* 9 -2)
+        = -18
+
+
+


+next +up +previous
+Contents + Next: + Recursion on Numbers +Up: + Programming Techniques + Previous: + Recursion on Simple +

+


+

+

+© Colin Allen & Maneesh Dhagat
+October 2006
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node45.html b/clones/colinallen.dnsalias.org/lp/node45.html new file mode 100644 index 00000000..a4a5a5a4 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node45.html @@ -0,0 +1,209 @@ + + + + Recursion on Numbers + + + + + + +

+


+next +up +previous
+Contents + Next: + Ensuring Proper Termination +Up: + Programming Techniques + Previous: + Recursion on Nested +

+

Recursion on Numbers

+

+There are some functions which recur on a list of elements, but which +return a number. The function ``length'' defined earlier is such a +function. It takes an arbitrarily long list of elements and returns a +count of its top-level elements. In the case of length, we are +building a number by additions; at each level we add a one. One can +also imagine a function which builds a number with consecutive +multiplications. In both cases one must be careful in choosing which +value to return at the terminating line. + +

+

RULE OF THUMB 5: +

+ When building a number value using +, return 0 at the +

+ terminating line. When building a number value using +

+ *, return 1 at the terminating line. +

+

+
+

+

+

Example 5: +

+ Write a function, ``sum-of-list,'' which takes a list of numbers and returns +

+ their sum. Write a similar function, ``product-of-list,'' which takes a +

+ list of numbers and returns their product. +

+

+
+Using the ideas presented in previous sections, writing these functions +should be simple. Again, we need to do three things: first we will +check for the end of the list; second we will use the first element of +the list in the addition (or multiplication); lastly the number +will be added (or multipled) to the recursive call on the ``rest'' of +the list. According to Rule of Thumb 5, we must remember that at the +terminating line we must return 0 for addition and 1 for +multiplication. +

+The following are the proposed solutions: +

+
        (defun sum-of-list (lst)
+           (cond ((null lst) 0)
+                 (t (+ (first lst) 
+                       (sum-of-list (rest lst))))))
+
+        (defun product-of-list (lst)
+           (cond ((null lst) 1)
+                 (t (* (first lst) 
+                       (product-of-list (rest lst))))))
+
+
+In the above examples, although we are building a number, we are still +recurring on a list. It is also possible to recur on a number. The +structure of recursion on numbers is very similar to that on simple lists. +
+
 

RULE OF THUMB 6: +

+ When recurring on a number, do three things: +

+ 1. check for the termination condition; +

+ 2. use the number in some form; +

+ 3. recur with a changed form of the number. +

+

+
+
+
 

Example 6: +

+ The factorial of a non-negative integer, n, is +

+ n * (n-1) * (n-2) * ... * 3 * 2 * 1. +

+ Also, the factorial of 0 is 1. Implement the factorial function +

+ in Lisp. +

+

+
+The above problem is naturally recursive. In fact, it is very often +represented mathematically as the following recurrence relation: + +

+      factorial(n) = {n * factorial(n-1) if n> 0}
+                     {1                  if n=0}
+
+ +This translates easily into the following Lisp function definition: +
+
          (defun factorial (n)
+             (cond ((= n 0) 1)
+                   (t (* n (factorial (- n 1))))))
+
+
+Let us try to identify the three element of Rule of Thumb 6: +
(1) +
We check for termination by testing if n has been reduced to 0. +
(2) +
We use the number, n, in the multiplication. +
(3) +
We do recur on a changed form of the number, i.e. on n +decremented by one. +

+

+The following notation gives an idea of the execution of ``factorial'': +
+
(factorial 4)
+        = (* 4 (factorial 3))
+        = (* 4 (* 3 (factorial 2)))
+        = (* 4 (* 3 (* 2 (factorial 1))))
+        = (* 4 (* 3 (* 2 (* 1 (factorial 0)))))
+        = (* 4 (* 3 (* 2 (* 1 1))))
+        = (* 4 (* 3 (* 2 1)))
+        = (* 4 (* 3 2))
+        = (* 4 6)
+        = 24
+
+
+
+
 

Example 7: +

+ Write a function called ``remainder,'' which takes two positive non-zero +

+ numbers, n and m, and returns the remainder when n is divided by m. +

+

+
+

+Our strategy will be to repeatedly subtract m from n till n is less +than m; at this point n will be the value of the remainder. Let us +proceed in the steps suggested by Rule of Thumb 6: +

+

(1) +
We know that we can stop when n < m. This will be our termination + condition and we will return the value of n. +
(2) +
At each level of recursion we will subtract m from n; this + represents our use of n. +
(3) +
We will recur with the value of n changed; specifically, we will + recur with n-m and m. +

+

+

+These steps translate into the following function definition: +

+
          (defun remainder (n m)
+             (cond ((< n m) n)
+                   (t (remainder (- n m) m))))
+
+
+The following notation gives an idea of the execution of ``remainder'': +
+
(remainder 30 7)
+        = (remainder 23 7)
+        = (remainder 16 7)
+        = (remainder 9 7)
+        = (remainder 2 7)
+        = 2
+
+
+

+next +up +previous
+Contents + Next: + Ensuring Proper Termination +Up: + Programming Techniques + Previous: + Recursion on Nested +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node46.html b/clones/colinallen.dnsalias.org/lp/node46.html new file mode 100644 index 00000000..8fd37093 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node46.html @@ -0,0 +1,153 @@ + + + + Ensuring Proper Termination + + + + + + +

+


+next +up +previous
+Contents + Next: + Abstraction +Up: + Programming Techniques + Previous: + Recursion on Numbers +

+

Ensuring Proper Termination

+

+ Often it happens that the Lisp programmer unknowingly +implements an infinite loop. This could happen in two different ways: +an infinite ``do'' loop, or an improper recursion. In the first case, +it may be that the programmer is using the general ``do'' construct and +has specified a test for termination that will never occur. This +problem can be avoided by using the more specific constructs ``dotimes'' or +``dolist'' (chapter 3). These constructs have a built-in test for +termination; ``dotimes'' iterates a specified number of times, and +``dolist'' iterates once for each element in a given list. Improper +recursion, however, is often more difficult to discover. +

+
 

Example 8: +

+ The following definition wrongly implements the function to determine +

+ the length of a list: +

+ (defun length (lst) +

+ (cond ((null lst) 0) +

+ (t (+ 1 (length lst))))) +

+

+
+The following notation illustrates why the above function does +not terminate: +
+
(length '(a b c))
+        = (+ 1 (length '(a b c)))
+        = (+ 1 (+ 1 (length '(a b c))))
+        = (+ 1 (+ 1 (+ 1 (length '(a b c)))))
+        = (+ 1 (+ 1 (+ 1 (+ 1 (length '(a b c))))))
+        = (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (length '(a b c)))))))
+        = ...
+        = ...
+
+
+The list is passed-in unmodified in the recursive call. Such simple +mistakes are very common, and their frequency increases with longer and +more complicated programs. Compare this definition of ``length'' with +the one given in section 4.2. +
+
 

RULE OF THUMB 7: +

+ To ensure proper termination do two things: +

+ (1) make sure that you are changing at least one argument +

+ in your recursive call; +

+ (2) make sure that your test for termination looks at the +

+ arguments that change in the recursive call. +

+

+
+ +
+
 

Example 9: + +

+ A function, ``exp,'' takes two positive, non-zero integers, x and y, and +

+ raises x to the y power. Will the following recursive definition for +

+ ``exp'' terminate properly? +

+ (defun exp (x y) +

+ (cond ((= y 0) 1) +

+ (t (* x (exp x (- y 1)))))) +

+

+
+Yes, the above definition is correct and will terminate properly +according to Rule of Thumb 7. We fulfill both requirements of the +rule: +
(1) +
We are changing at least one argument in the + recursive call, namely y, which is decremented + by one. +
(2) +
In our test for termination, (= y 0), we are + using an argument that we change in the + recursive call, namely y. +

+

+ +
NOTE: The example above again illustrates that you are allowed to redefine functions that are built into Lisp. Programmer beware!!
+ + +
+
 

RULE OF THUMB 8: +

+ Two simple cases may occur when changing an argument in a +

+ recursive call: +

+ (1) if you are using ``rest'' to change an argument which is +

+ a list, use ``null'' in the test for termination; +

+ (2) if you are decreasing an argument which is a number, +

+ compare it with 0 in the test for termination. +

+

+


+next +up +previous
+Contents + Next: + Abstraction +Up: + Programming Techniques + Previous: + Recursion on Numbers +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node47.html b/clones/colinallen.dnsalias.org/lp/node47.html new file mode 100644 index 00000000..25fd24cf --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node47.html @@ -0,0 +1,211 @@ + + + + Abstraction + + + + + + +

+


+next +up +previous
+Contents + Next: + Summary of Rules +Up: + Programming Techniques + Previous: + Ensuring Proper Termination +

+

Abstraction

+

+As a program becomes larger, it becomes increasingly difficult to +understand. When all of the details of the program are considered at +once, they may easily exceed the intellectual grasp of one person. To +increase the readability of the program, it is useful to abstract away +or ``hide'' unnecessary details. There are two areas in which +abstraction may be used: one may hide the details of the data one is +working with by using abstract data structures and associated +routines (chapter 5); or one may hide fragments of the program to +improve clarity. The latter is explored in this section. Hiding +fragments of the program increases clarity and often also results in +shorter programs. +

+
 

RULE OF THUMB 9: +

+ Use ``let'' to reduce the number of function calls. +

+

+
+
+
 

Example 10: +

+ Write a function called ``cube-list,'' which takes a list of numbers and +

+ returns the same list with each element replaced with its cube. Thus, +

+ (cube-list '(5 3 -15)) should return (125 9 -3375). +

+

+
+By now, with the techniques presented above, the reader should be able +to see that the following is a possible solution: +
+
          (defun cube-list (lst)
+             (cond ((null lst) nil)
+                   (t (cons (* (first lst) 
+                               (first lst) 
+                               (first lst))
+                            (cube-list (rest lst))))))
+
+
+But note that to compute the cube of each element we must extract it +three times from the list using ``first.'' Using Rule of Thumb 9, we +can reduce this to only one use of ``first'' for each element. This +may be done as follows: +
+
          (defun cube-list (lst)
+             (cond ((null lst) nil)
+                   (t (let ((elt (first lst)))
+                         (cons (* elt elt elt)
+                               (cube-list (rest lst)))))))
+
+
+
+
 

RULE OF THUMB 10: +

+ Encapsulate program fragments into new functions to +

+ improve clarity. +

+

+
+
+
 

Example 11: +

+ Write a function called ``cube,'' which takes a number and returns its +

+ cube. Use ``cube'' to rewrite ``cube-list.'' +

+

+
+``cube'' is defined simply as follows: +
+
          (defun cube (elt)
+             (* elt elt elt))
+
+
+Now we can use ``cube'' to rewrite ``cube-list'': +
+
          (defun cube-list (lst)
+             (cond ((null lst) nil)
+                   (t (cons (cube (first lst))
+                            (cube-list (rest lst))))))
+
+
+These last two definitions are much easier to read and understand, and +they do not waste any function calls. Furthermore, cube is a useful tool that may be used in other function definitions. +
+
 

RULE OF THUMB 11: +

+ Encapsulate repeated program fragments into new +

+ functions to reduce program size. +

+

+
+
+
 

Example 12: +

+ Suppose a list of two numbers represents a point in euclidean space. +

+ Write a function called ``get-side,'' which takes three points, a, b, and +

+ c, and a key, k. The three points represent the vertices of a triangle. +

+ The function returns a value as follows: +

+ if k = 1, returns length of side a-b; +

+ if k = 2, returns length of side b-c; +

+ if k = 3, returns length of side c-a; +

+ else, returns 0. +

+

+
+One possible solution is the following: +
+
   (defun get-side (a b c k)
+      (cond ((= k 1)
+             (sqrt (+ (exp (- (first  a) (first  b)) 2)
+                      (exp (- (second a) (second b)) 2))))
+            ((= k 2)
+             (sqrt (+ (exp (- (first  b) (first  c)) 2)
+                      (exp (- (second b) (second c)) 2))))
+            ((= k 3)
+             (sqrt (+ (exp (- (first  c) (first  a)) 2)
+                      (exp (- (second c) (second a)) 2))))
+            (t 0)))
+
+
+Note that we are performing almost the same computation in the first +three cases of the ``cond'' clause; specifically, it is to calculate +the distance between two points. +
+
 

Example 13: +

+ Write a function called ``distance,'' which takes two points (represented +

+ as two-number lists), and returns the euclidean distance between them. +

+ Use ``distance'' to rewrite ``get-side.'' +

+

+
+The function ``distance'' can be implemented simply as follows: +
+
    (defun distance (pt1 pt2)
+       (sqrt (+ (exp (- (first  pt1) (first  pt2)) 2)
+                (exp (- (second pt1) (second pt2)) 2))))
+
+
+Now we can rewrite ``get-side'' as follows: +
+
    (defun get-side (a b c k)
+       (cond ((= k 1) (distance a b))
+             ((= k 2) (distance b c))
+             ((= k 3) (distance c a))
+             (t 0)))
+
+
+Thus, using Rule of Thumb 11, we have reduced the size of the program +significantly, making it easier to understand. +

+The concept of abstraction is not unique to Lisp. It is also used in +other high-level programming languages such as C, Pascal, or FORTRAN. +

+


+next +up +previous
+Contents + Next: + Summary of Rules +Up: + Programming Techniques + Previous: + Ensuring Proper Termination +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node48.html b/clones/colinallen.dnsalias.org/lp/node48.html new file mode 100644 index 00000000..bc088488 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node48.html @@ -0,0 +1,124 @@ + + + + Summary of Rules + + + + + + +

+


+next +up +previous
+Contents + Next: + Exercises +Up: + Programming Techniques + Previous: + Abstraction +

+

Summary of Rules

+

+

1. +
When recurring on a list, do three things: +
a. +
check for the termination condition; +
b. +
use the first element of the list; +
c. +
recur with the ``rest'' of the list. +

+

+
2. +
If a function builds a list using ``cons,'' return () at + the terminating line. +
3. +
When recurring on a nested list, do three things: +
a. +
check for the termination condition; +
b. +
check if the first element of the list is an + atom or a list; +
c. +
recur with the ``first'' and the ``rest'' of the list. +

+

+
4. +
When evaluating an expression, do three things: +
a. +
check for the termination condition; +
b. +
identify operator; +
c. +
apply operator to recursive calls on the operands. +

+

+
5. +
When building a number value using +, return 0 at the + terminating line. When building a number value using + *, return 1 at the terminating line. +
6. +
When recurring on a number, do three things: +
a. +
check for the termination condition; +
b. +
use the number in some form; +
c. +
recur with a changed form of the number. +

+

+
7. +
To ensure proper termination do two things: +
a. +
make sure that you are changing at least one argument in your +recursive call; +
b. +
make sure that your test for termination looks at the arguments that +change in the recursive call. +

+

+
8. +
Two simple cases may occur when changing an argument in + a recursive call: +
a. +
if you are using ``rest'' to change an argument which is a list, +use ``null'' in the test for termination; +
b. +
if you are decreasing an argument which is a number, compare +it with 0 in the test for termination. +

+

+
9. +
Use ``let'' to reduce the number of function calls. +

+

10. +
Encapsulate program fragments into new functions to + improve clarity. +

+

11. +
Encapsulate repeated program fragments into new functions + to reduce program size. +

+



+next +up +previous
+Contents + Next: + Exercises +Up: + Programming Techniques + Previous: + Abstraction +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node49.html b/clones/colinallen.dnsalias.org/lp/node49.html new file mode 100644 index 00000000..76590d4e --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node49.html @@ -0,0 +1,88 @@ + + + + Exercises + + + + + + +

+


+next +up +previous
+Contents + Next: + Simple Data Structures +Up: + Programming Techniques + Previous: + Summary of Rules +

+

Exercises

+

+

1. +
Write a function called ``b-remove'' (for better remove), which + takes a list and an element as arguments, and returns the original + list with all occurrences of the element removed. +

+

2. +
Write a function called ``replace,'' which takes a list and two + elements as arguments, and returns the original list with all + instances of the first element replaced by the second element. +

+

3. +
Write a function which counts all of the atoms in a nested list. +

+

4. +
Write a function called ``insert,'' which takes a nested list and + two atoms as arguments, and returns the original list in which + the second atom has been inserted to the right of all occurrences of + the first atom (if the first atom occurs in the list at all). +

+

5. +
A new mathematical, binary operator $ is defined as follows: +

x $ y = x2 + y +

+where x, y are integers. Extend the definition of ``evaluate'' +presented earlier to include the operators $ and / (normal +division). +

+

6. +
The Fibonacci series is defined as follows: +
+

+fib(n) = {fib(n-1) + fib(n-2) if n> 1       }
+         {1                   if n=0 or n=1}
+
+

+ Implement a recursive function to calculate the nth fibonacci + number. +

+

7. +
Write a function called ``merge,'' which takes two number-lists + of equal length. It adds the corresponding members of each list + and then returns the product of the resulting numbers. +

+For example, (merge '(1 2 3) '(2 2 2)) should return 60, since +(1+2)*(2+2)*(3+2)=60. +

+

8. +
Will the following piece of code always terminate? Be careful to + consider all possible cases. +
+
          (defun mystery (n)
+             (cond ((= n 0) 0)
+                   (t (mystery (- n 1)))))
+
+
+

+



+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node5.html b/clones/colinallen.dnsalias.org/lp/node5.html new file mode 100644 index 00000000..b66ca62b --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node5.html @@ -0,0 +1,131 @@ + + + +Atoms + + + + + + +

+


+next +up +previous
+Contents + Next: + Lists +Up: + Basic Data Types + Previous: + Basic Data Types +

+

Atoms

+

+The first rule of evaluation is that for any atom the evaluator, known as ``eval,'' attempts to find a value for that atom. +

+For most atoms, eval will return an error unless you have previously +assigned a value to it. To assign a value to an atom use setq +(or you can use its more sophisticated cousin, setf; more on setf in +later chapters). So, for instance, to assign the value 9 to the +atom ``my-age'' type the following to the interpreter: +

+
> (setq my-age 9)       ; you assign 9 to the atom my-age
+9                      ; interpreter responds with value
+
+
+Now, you may test what you have done by giving the atom to the +interpreter. +
+
> my-age                ; you tell interpreter to eval my-age
+9                      ; it responds with the set value
+
+
+If a birthday has just passed, you can change the value of my-age as +follows: +
+
> (setq my-age 10)
+10
+> my-age
+10
+
+
+

+9, 10, 1.234 and all the other numbers are special atoms in +Lisp -- they are pre-defined to evaluate to themselves. So, you may +give any number to the interpreter, and it will respond by repeating +the number. +

+In addition to numbers, two other special atoms are predefined, t and nil (think of them as true and false respectively). The interpreter considers nil to be identical to the empty list. Typing () directly to the interpreter +will cause it to respond with nil. +

+Try the following sequence: +

+

+
> 9
+9
+> 10
+10
+> my-age
+10
+> t       
+T
+> nil
+NIL
+> ()
+NIL
+> your-age
+Error: The variable YOUR-AGE is unbound.
+Error signalled by EVAL.
+
+
+The last item illustrates what happens if you try to +evaluate an atom that has not been set to a value. (The exact error +message will vary between versions of Lisp, but all will say +something about an unbound variable). +

+Most Lisp systems throw you into a debugger mode when an error +occurs. From the debugger you can find out lots of useful things +about the state of the interpreter when the problem occurred. +Unfortunately, Lisp debuggers are not at all standardized so it is +impossible to give a description here. Even in debugger +mode, although the prompt usually is different, the Lisp interpreter +continues to evaluate Lisp expressions normally. So we will ignore +what is going on when an error occurs and assume that you can just +carry on giving expressions to the interpreter for evaluation. +

+Notice that it is an error to attempt to set a value for special +atoms: numbers, t, or nil. +

+

+
> (setq 1 2)
+Error: 1 is not a symbol.
+Error signalled by SETQ.
+> (setq t nil)
+Error: Cannot assign to the constant T.
+Error signalled by SETQ.
+
+
+

+From these error messages you can see that the interpreter distinguishes between symbols, numbers, constants. Numbers and symbols are mutually exclusive subcategories of atoms. Constants (such as t and nil) are a subcategory of symbol. Only symbols which are not constants may be assigned a value with setq. +

+


+next +up +previous
+Contents + Next: + Lists +Up: + Basic Data Types + Previous: + Basic Data Types +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node50.html b/clones/colinallen.dnsalias.org/lp/node50.html new file mode 100644 index 00000000..e44f2603 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node50.html @@ -0,0 +1,53 @@ + + + + Simple Data Structures in Lisp + + + + + + +

+


+next +up +previous
+Contents + Next: + Association Lists +Up: +Lisp Primer + Previous: + Exercises +

+

Simple Data Structures in Lisp

+

+Many applications of Lisp involve storing a variety of values associated with a symbolic name. Association lists and property lists provide two ways of doing this, unique to Lisp. Arrays, vectors and strings are also used for data storage and manipulation. Their use is similar to programming languages other than Lisp. Defstruct provides a way to create customized data structures. +

+


+ +

+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node51.html b/clones/colinallen.dnsalias.org/lp/node51.html new file mode 100644 index 00000000..71e36bf1 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node51.html @@ -0,0 +1,99 @@ + + + + Association Lists + + + + + + +

+


+next +up +previous
+Contents + Next: + Property Lists +Up: + Simple Data Structures + Previous: + Simple Data Structures +

+

Association Lists

+

+An association list is any list of the following form: +

+
((<key1>  ...<expressions> )
+ (<key2>  ...<expressions> )....)
+
+
+The keys should be atoms. Following each key, you can put any sequence of Lisp expressions. +

+Use the interpreter to enter this example of an association list: +

+

+
> (setf person1 '((first-name john)
+                 (last-name smith)
+                 (age 23)
+                 (children jane jim)))
+((FIRST-NAME JOHN) (LAST-NAME SMITH) (AGE 23) 
+ (CHILDREN JANE JIM))
+
+
+Lisp provides a function, assoc, to retrieve information easily from association lists given a retrieval key. +

+For example: +

+

+
> (assoc 'age person1)
+(AGE 23)
+
+> (assoc 'children person1)
+(CHILDREN JANE JIM)
+
+
+Notice that assoc returns the entire key-expression sublist. It does not matter to assoc what order the keys appear in the association list or how many expressions are associated with each key. +

+Setf can be used to change particular values. For example, here is a function that can be used on a birthday to update a person's age automatically. +

+

+
(defun make-older (person)
+  (setf (second (assoc 'age person))
+        (1+ (second (assoc 'age person)))))
+
+
+Have your Lisp interpreter evaluate this definition, then see that it works: +

+

+
> (make-older person1)
+24
+
+> (assoc 'age person1)
+(AGE 24)
+
+
+Assoc will return nil if the key is not found. +

+

+
> (assoc 'sex person1)
+NIL
+
+
+But it is very easy to add new key-expression sublists, again using setf. +

+

+
> (setf person1 (cons '(sex male) person1))
+((SEX MALE) (FIRST-NAME JOHN) (LAST-NAME SMITH) (AGE 24) 
+ (CHILDREN JANE JIM))
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node52.html b/clones/colinallen.dnsalias.org/lp/node52.html new file mode 100644 index 00000000..7ef8b9c0 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node52.html @@ -0,0 +1,71 @@ + + + + Property Lists + + + + + + +

+


+next +up +previous
+Contents + Next: + ArraysVectors, and +Up: + Simple Data Structures + Previous: + Association Lists +

+

Property Lists

+

+An alternative way to attach data to symbols is to use Common Lisp's property list feature. For each symbol, the Lisp interpreter maintains a list of properties which can be accessed with the function get. +

+Get expects to be given a symbol and a key. If a value has been set for that key, it is returned, otherwise get returns nil. +

+

+
> (get 'mary 'age)
+NIL
+
+> (setf (get 'mary 'age) 45)
+45
+
+> (get 'mary 'age)
+45
+
+
+As this example shows, the value to be returned by a get expression is set using setf. (This is another place where setf works but setq will not.) The way to think of setf's behavior here is that you tell it exactly what you will type and what should be returned. The example here assigns the value 45 as the value to be returned when you type (get 'mary 'age). +

+Additional properties can be added in the same way. +

+

+
> (setf (get 'mary 'job) 'banker)
+BANKER
+
+> (setf (get 'mary 'sex) 'female)
+FEMALE
+
+> (setf (get 'mary 'children) '(bonnie bob))
+(BONNIE BOB)
+
+
+If, for some reason, you need to see all the properties a symbol has, you can do so: +

+

+
> (symbol-plist 'mary)
+(SEX FEMALE JOB BANKER AGE 45 CHILDREN (BONNIE BOB))
+
+
+Get is a convenient way to manage related data, and in some ways is more flexible than assoc. For many applications, however, it is necessary to build more sophisticated data structures. Options for doing this include customized nested list structures, arrays, and use of the Common Lisp Object System (CLOS). Arrays, vectors, and strings will be introduced in the rest of this chapter. Customized list structures will not be covered here because they are highly dependent on the specific application. CLOS will not be covered here, either, as the purpose of this book is to bring you to a point where you can easily understand other presentations of advanced Lisp topics. +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node53.html b/clones/colinallen.dnsalias.org/lp/node53.html new file mode 100644 index 00000000..36d0a447 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node53.html @@ -0,0 +1,39 @@ + + + + Arrays, Vectors, and Strings + + + + + + +

+


+next +up +previous
+Contents + Next: + Arrays and Vectors +Up: + Simple Data Structures + Previous: + Property Lists +

+

Arrays, Vectors, and Strings

+

+


+ +

+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node54.html b/clones/colinallen.dnsalias.org/lp/node54.html new file mode 100644 index 00000000..5dc2af5d --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node54.html @@ -0,0 +1,99 @@ + + + + Arrays and Vectors + + + + + + +

+


+next +up +previous
+Contents + Next: + Strings +Up: + ArraysVectors, and + Previous: + ArraysVectors, and +

+

Arrays and Vectors

+

+An array is a special type of data object in Lisp. Arrays are created using the make-array function. To make an array it is necessary to specify the size and dimensions. The simplest case is an array of one dimension, also called a vector. +

+Make-array returns an array. Most often one wants to bind this array to a symbol. Here's an example: +

+

+
> (setf my-vector (make-array '(3)))
+#(NIL NIL NIL)
+
+
+In this case, the argument to make-array specified that the array should have one dimension of three elements. The array that was returned has three elements, all of them initially set to nil. (The actual printed representation of the array may vary between different Lisp implementations.) +

+These elements can be accessed and changed using aref. These examples illustrate: +

+

+
> (aref my-vector 2)
+NIL
+
+> (setf (aref my-vector 0) t)
+T
+
+> my-vector
+#(T NIL NIL)
+
+
+Indexing of arrays starts with 0. (Just like indexing of lists using nth.) Here's an example of a two-dimensional array and some assignments. +

+

+
> (setf my-array (make-array '(2 3)))
+#2A((NIL NIL NIL) (NIL NIL NIL))
+
+> (aref my-array 0 1)
+NIL
+
+> (setf (aref my-array 0 1) 'hi)
+HI
+
+> (setf (aref my-array 1 0) 'bye)
+BYE
+
+> my-array
+#2A((NIL HI NIL) (BYE NIL NIL))
+
+
+From this example you should be able to work out the indexing scheme. +

+Make array has a number of additional features we will not cover here. However, one that is particularly useful is the :initial-contents keyword. Here is an example to illustrate the use of :initial-contents. +

+

+
> (make-array '(2 3 4) :initial-contents
+             '(((a b c d) (e f g h) (i j k l))
+               ((m n o p) (q r s t) (u v w x))))
+#3A(((A B C D) (E F G H) (I J K L)) ((M N O P) (Q R S T) 
+     (U V W X)))
+
+
+Initial contents are specified with a list of elements having the required sublist structure to match the array. +

+The use of :initial-contents is entirely optional with make-array, as is the use of other keywords not introduced here. +

+Programmers like to use arrays because they give uniformly fast access to all their elements. In general, however, arrays are less flexible for representing structure than lists. Consider the structure represented in this list: +

+

+
(a (b c) (d e f (g h)))
+
+
+No array can concisely reproduce this structure, since it must have a uniform number of elements for each of its dimensions. +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node55.html b/clones/colinallen.dnsalias.org/lp/node55.html new file mode 100644 index 00000000..211163c3 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node55.html @@ -0,0 +1,69 @@ + + + + Strings + + + + + + +

+


+next +up +previous
+Contents + Next: + Defstruct +Up: + ArraysVectors, and + Previous: + Arrays and Vectors +

+

Strings

+

+A string in Lisp is represented by characters surrounded by double quotes: ". Strings are very useful for manipulating chunks of text. They are also used by Common Lisp to manage input and output. +

+Technically strings are arrays, but it is probably best (at first) to ignore this fact and treat them as a separate data type. Typing a string directly to the interpreter simply causes the interpreter to return the string: +

+

+
> "This is a string"
+"This is a string"
+
+
+Notice that the string may contain spaces, and that the distinction between upper and lowercase letters is preserved. A string is completely opaque to the interpreter and may contain punctuation marks and even new lines: +

+

+
> "This is a larger piece of text.
+It contains a few, otherwise unmanageable
+punctuation marks.  It can even have blank lines:
+
+
+
+^Like these!"
+"This is a larger piece of text.
+It contains a few, otherwise unmanageable
+punctuation marks.  It can even have blank lines:
+
+
+
+^Like these!"
+
+
+Strings can also be included as elements of lists. For example: +

+

+
> (cons "this" '(here))
+("this" HERE)
+
+
+Strings are very useful for giving nicely formatted responses to user commands. This will be explored in the next chapter. +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node56.html b/clones/colinallen.dnsalias.org/lp/node56.html new file mode 100644 index 00000000..326ad872 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node56.html @@ -0,0 +1,145 @@ + + + + Defstruct + + + + + + +

+


+next +up +previous
+Contents + Next: + Exercises. +Up: + Simple Data Structures + Previous: + Strings +

+

Defstruct

+

+Defstruct allows you to create your own data structures and automatically produces functions for accessing the data. Structures have names and ``slots.'' The slots are used for storing specific values. Defstruct creates a generic type of which particular ``instances'' can be made. Here is an example using defstruct to establish a structure type: +

+

+
> (defstruct employee
+   age
+   first-name
+   last-name
+   sex
+   children)
+EMPLOYEE
+
+
+In this example ``employee'' is the name of the structure, and ``age'', etc. are the slots. Defstruct automatically generates a function to make instances of the named structure. In this example the function is called make-employee, and in general the name of the instance constructor function is make-defstructname. +

+As with the other data types before, it is useful to associate particular instances with a symbol for easy access: +

+

+
> (setf employee1 (make-employee))
+#S(EMPLOYEE AGE NIL FIRST-NAME NIL LAST-NAME NIL SEX NIL 
+     CHILDREN NIL)
+
+
+(Different implementations of Lisp will display structures in different ways.) +

+In this case, employee1 is an instance of the type employee, and all its slots are initially given the value nil. Each slot is provided an automatic access function, by joining the structure name with the slot name: +

+

+
> (employee-age employee1)
+NIL
+
+> (employee-sex employee1)
+NIL
+
+
+Slot values can be assigned using setf: +

+

+
> (setf (employee-age employee1) 56)
+56
+
+> (employee-age employee1)
+56
+
+
+It is also possible to assign values to the slots of a particular instance at the time the instance is made, simply by preceding the slot name with a colon, and following it with the value for that slot: +

+

+
> (setf employee2 (make-employee :age 34
+                                :last-name 'farquharson
+                                :first-name 'alice
+                                :sex 'female))
+#S(EMPLOYEE AGE 34 FIRST-NAME ALICE LAST-NAME FARQUHARSON 
+      SEX FEMALE CHILDREN NIL)
+
+> (employee-first-name employee2)
+ALICE
+
+
+As this example shows, it is not necessary to give values to all the slots when the make function is called. Neither is it necessary to specify slot values in the same order they are specified in the original defstruct. +

+Defstruct also allows you to specify default values for given slots. Here is an example: +

+

+
> (defstruct trekkie
+    (sex 'male)
+    (intelligence 'high)
+    age)
+TREKKIE
+
+
+The values enclosed in parentheses with a slot name are the default values for that slot -- that is, the values that these slots will have for created instance, unless explicitly overridden. These three examples of instances illustrate the use of defaults: +

+

+
> (setf t1 (make-trekkie))
+#S(TREKKIE SEX MALE INTELLIGENCE HIGH AGE NIL)
+
+> (setf t2 (make-trekkie :age 35))
+#S(TREKKIE SEX MALE INTELLIGENCE HIGH AGE 35)
+
+> (setf t3 (make-trekkie :age 28 :sex 'female))
+#S(TREKKIE SEX FEMALE INTELLIGENCE HIGH AGE 28)
+
+
+Each instance of a structure has a type which can be tested with the predicate typep, or with the particular predicate automatically set up by defstruct. By default, the type of an instance is determined by the structure name: +

+

+
> (typep t1 'employee)
+NIL
+
+> (typep t1 'trekkie)
+T
+
+> (trekkie-p t1)
+T
+
+> (employee-p t3)
+NIL
+
+
+There are several advanced features of defstruct, including the ability to create structures which incorporate other structures. If you understand the basics laid out here, however, you will have no trouble understanding the description of these features in Steele's Common Lisp the language. +

+


+next +up +previous
+Contents + Next: + Exercises. +Up: + Simple Data Structures + Previous: + Strings +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node57.html b/clones/colinallen.dnsalias.org/lp/node57.html new file mode 100644 index 00000000..32ce69df --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node57.html @@ -0,0 +1,41 @@ + + + + Exercises. + + + + + + +

+


+next +up +previous
+Contents + Next: + Input and Output +Up: + Simple Data Structures + Previous: + Defstruct +

+

Exercises.

+

+

1. +
Design a simple data program that allows the user to enter and retrieve personnel data. Your program should store first and last names, addresses, age, marital status, and names of children. You may use any of the techniques introduced in this chapter, but your solution should not place any arbitrary limits, such as a limit on the number of children that can be associated with a person's record. Your program should allow the user to retrieve information about the person or persons whose records match a given key, for example to give the ages of everyone with the last name ``Smith.'' +

+

2. +
Write a function, num-kids, which uses the data stored by your program for the previous problem to answer the question how many children an individual has. +

+

3. +
Write functions, num-boys and num-girls that answer how many of an individual's children are boys and how many are girls, using only the information mentioned in problem 1. In other words, your functions should use the children's names to determine their sex. You must at a minimum decide how to handle storage of a list correlating names and sexes, what to do if names not in your list are encountered, and how to handle names such as ``Francis'' that may be given to either sex. +

+



+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node58.html b/clones/colinallen.dnsalias.org/lp/node58.html new file mode 100644 index 00000000..7847d47c --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node58.html @@ -0,0 +1,47 @@ + + + + Input and Output + + + + + + +

+


+next +up +previous
+Contents + Next: + Basic Printing +Up: +Lisp Primer + Previous: + Exercises. +

+

Input and Output

+

+Terminal input and output is controlled with variants of print and read. More sophisticated output is available using format. Input and output using system files is achieved using the same functions and associating a file with an input or output ``stream''. +

+


+ +

+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node59.html b/clones/colinallen.dnsalias.org/lp/node59.html new file mode 100644 index 00000000..9107a2da --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node59.html @@ -0,0 +1,148 @@ + + + + Basic Printing + + + + + + +

+


+next +up +previous
+Contents + Next: + Nicer Output Using +Up: + Input and Output + Previous: + Input and Output +

+

Basic Printing

+

+Frill-free printing in Lisp is achieved with print, prin1, princ and terpri. The simplest uses of print, prin1, and princ involve a single argument. Terpri, which produces a newline, can be called with no arguments. +

+All these are functions. In addition to causing output, they return values. With print, princ, and prin1, the value returned is always the result of evaluating the first argument. Terpri always returns nil. +

+Here are examples using print: +

+

+
> (print 'this)
+
+THIS                            ;; printed
+THIS                            ;; value returned
+
+> (print (+ 1 2))
+
+3                               ;; printed
+3                               ;; returned
+
+> (+ (print 1) (print 2))
+
+1                               ;; first print
+2                               ;; second print
+3                               ;; returns sum
+
+
+Print always precedes its output with a newline. Prin1 is just like print except that it does not do a new line before printing. +

+

+
> (+ (prin1 1) (prin1 2))
+12
+3
+
+
+Print is thus equivalent to terpri followed by prin1. This function will behave just like print when passed a single argument. +

+

+
(defun my-print (x)
+  (terpri)
+  (prin1 x))
+
+
+Princ and prin1 are the same except in the way they print strings. Princ does not print the quote marks around a string: +

+

+
> (prin1 "this string")
+"this string"         ;; printed
+"this string"         ;; returned
+
+> (princ "this string")
+this string           ;; no quotes can be more readable
+"this string"         ;; string returned
+
+
+The print family of functions is useful as a debugging tool. Since they return the values of their arguments, they can be inserted into a previously defined function to reveal what is going on. For example, suppose you have a function defined as follows: +

+

+
(defun foo (x y)
+  (if (eq x y) (list (second x) (first y))
+    (list y (rest x))))
+
+
+You try the function out and get this: +

+

+
> (foo '(a s d f) '(a s d f))
+((A S D F) (S D F))
+
+
+But you expected to get (S A) since you expected to get the list of the second of x with the first of y. +

+You would like to know why foo returned this. One way to help you see what is going on is to insert print statements into the definition. If for example you want to see what is being listed if the test is true, you can modify the definition like this: +

+

+
(defun foo (x y)
+  (if (eq x y) (list (print (second x)) (print (first y)))
+    (list y (rest x))))
+
+
+Now when you try the same call, the following happens: +

+

+
> (foo '(a s d f) '(a s d f))
+((A S D F) (S D F))
+
+
+But this is just the same as before! Neither print function got called, so you deduce that the test must have returned nil. This should help you to recall the difference between eq and equal. Now you modify the definition of foo again: +

+

+
(defun foo (x y)
+  (if (equal x y) (list (print (second x)) (print (first y)))
+    (list y (rest x))))
+
+
+And try it out: +

+

+
> (foo '(a s d f) '(a s d f))
+
+S 
+A 
+(S A)
+
+
+This time you see the effects of the prints, and what values get combined to produce the result. Thus print helps you to debug your code. +

+


+next +up +previous
+Contents + Next: + Nicer Output Using +Up: + Input and Output + Previous: + Input and Output +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node6.html b/clones/colinallen.dnsalias.org/lp/node6.html new file mode 100644 index 00000000..b6f40429 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node6.html @@ -0,0 +1,79 @@ + + + + Lists + + + + + + +

+


+next +up +previous
+Contents + Next: + Some Primitive Functions +Up: + Basic Data Types + Previous: + Atoms +

+

Lists

+

+The second rule of evaluation concerns lists. The interpreter treats +any list as containing the name of a function followed by the +arguments to the function. Schematically then, a list is read like +this: +

+

+
(name-of-function first-argument second-argument ...)
+
+
+For example, try the following: +

+

+
> (+ 2 13 45)
+60
+
+
+In this case, the interpreter applied the function + to the evaluated +arguments and return with the value 60. Since the numbers are +predefined, eval finds values for all the arguments, and everyone is +happy. You could also enter: +

+

+
> (+ my-age 1)
+11
+
+
+This works fine because my-age is evaluated and the value 10 is found +(assuming you did just what was described in the section above). +However: +

+

+
> (+ your-age 1)
+
+
+will generate an error (unbound variable your-age). +

+Also, if you attempt to use something that is not a function, you +will generate an error message. So, for example, typing +

+

+
> (foo 1 3 4)
+
+
+causes an error (undefined function foo), unless you had previously +defined foo to be a function. (More on defining functions in a later +chapter). +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node60.html b/clones/colinallen.dnsalias.org/lp/node60.html new file mode 100644 index 00000000..3fd4f7e5 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node60.html @@ -0,0 +1,124 @@ + + + + Nicer Output Using Format + + + + + + +

+


+next +up +previous
+Contents + Next: + Reading +Up: + Input and Output + Previous: + Basic Printing +

+

Nicer Output Using Format

+

+Print and its kin are useful basic printing functions, but for sophisticated and easy to read output, format is more useful. +

+The basic structure of a format call is +

+

+
	(format <destination>  <control-string>  <optional-arguments> )
+
+
+The full use of a destination will be introduced further below; for most basic uses, the destination should be specified as t or nil. The control string is a string containing characters to be printed, as well as control sequences. Every control sequence begins with a tilde: ~. The control sequences may require extra arguments to be evaluated, which must be provided as optional arguments to format. +

+With t as the specified destination, and no control sequences in the control-string, format outputs the string in a manner similar to princ, and returns nil. +

+

+
> (format t "this")
+this
+NIL
+
+
+With nil as destination and no control sequences, format simply returns the string: +

+

+
> (format nil "this")
+"this"
+
+
+Inserting ~% in the control string causes a newline to be output: +

+

+
> (format t "~%This shows ~%printing with ~%newlines.~%")
+
+This shows
+printing with
+newlines.
+
+NIL
+
+
+~s indicates that an argument is to be evaluated and the result inserted at that point. Each ~s in the control string must match up to an optional argument appearing after the control string. +

+Here is an example of a function that uses this capability: +

+

+
(defun f-to-c (ftemp)
+  (let ((ctemp (* (- ftemp 32) 5/9)))
+    (format t 
+            "~%~s degrees Fahrenheit is ~%~s degrees Celsius~%"
+            ftemp                    ;; first ~s
+            (float ctemp))           ;; second ~s
+    ctemp))                          ;; return ratio value
+
+
+(Float converts a number from integer or ratio to a floating point number, i.e. one with a decimal point.) +

+

+
> (f-to-c 82)
+
+82 degrees Fahrenheit is 
+27.777777777777777 degrees Celsius
+
+250/9
+
+
+Format simply evaluates the optional arguments in order they appear to determine the values for each ~s. There must be enough optional arguments following the control string to provide values for all the occurrences of ~s in the control string, otherwise an error will occur. If there are too many optional arguments, format evaluates them all (so side effects may occur) but no error is signalled. +

+Format will also preserve newlines entered directly in the control string. For example, f-to-c would behave just the same if defined as follows: +

+

+
(defun f-to-c (ftemp)
+  (let ((ctemp (* (- ftemp 32) 5/9)))
+    (format t "
+~s degrees Fahrenheit is
+~s degrees Celsius
+"
+              ftemp
+              (float ctemp))           ;; print floated value
+    ctemp))                            ;; return ratio value
+
+
+In addition to these two control sequences it is useful to know about ~T to produce tab spacing and ~~ to print a tilde. Some other control sequences are documented in the appendix entry for format. +

+


+next +up +previous
+Contents + Next: + Reading +Up: + Input and Output + Previous: + Basic Printing +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node61.html b/clones/colinallen.dnsalias.org/lp/node61.html new file mode 100644 index 00000000..cb6a43ef --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node61.html @@ -0,0 +1,60 @@ + + + + Reading + + + + + + +

+


+next +up +previous
+Contents + Next: + Input and Output +Up: + Input and Output + Previous: + Nicer Output Using +

+

Reading

+

+Input from the keyboard is controlled using read, read-line, and read-char. +

+Read expects to receive a well-formed Lisp expression, i.e. an atom, list or string. It will not return a value until a complete expression has been entered -- in other words all opening parentheses or quotes must be matched. +

+Here is f-to-c using read: +

+

+
(defun f-to-c ()
+  (format t "~%Please enter Fahrenheit temperature: ")
+  (let* ((ftemp (read))
+         (ctemp (* (- ftemp 32) 5/9)))
+    (format t 
+            "~%~s degrees Fahrenheit is ~s degrees Celsius~%"
+              ftemp
+              (float ctemp))           ;; print floated value
+    ctemp))                            ;; return ratio value
+
+> (f-to-c)
+
+Please enter Fahrenheit temperature: 56   ;; user enters 56
+
+56 degrees Fahrenheit is 13.333333333333333 degrees Celsius
+
+40/3
+
+
+Read-line always returns a string. Read-line will take in everything until the return key is pressed and return a string containing all the characters typed. Read-char reads and returns a single character. +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node62.html b/clones/colinallen.dnsalias.org/lp/node62.html new file mode 100644 index 00000000..7f7d8984 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node62.html @@ -0,0 +1,162 @@ + + + + Input and Output to Files + + + + + + +

+


+next +up +previous
+Contents + Next: + Converting Strings to +Up: + Input and Output + Previous: + Reading +

+

Input and Output to Files

+

+All input and output in Common Lisp is handled through a special type of object called a stream. When a stream is not specified, Common Lisp's default behavior is to send output and receive input from a stream bound to the constant *terminal-io* corresponding to the computer's keyboard and monitor. Evaluating *terminal-io* shows a printed representation of this stream: +

+

+
> *terminal-io*
+#<two-way stream 0016c7a8> 
+
+
+

+The designation ``two-way'' here specifies that it is a stream that is capable of handling both input and output. +

+In all the examples so far, printing and reading has been done without specifying a stream, hence the effects have been to interact with the keyboard and screen. However, print, format, read and the other functions mentioned in this chapter allow optional specification of a different stream for input or output. +

+In order to receive input from or send output to a file, the file must be attached to an appropriate stream. The easiest way to handle this is with the macro with-open-file. This is the general form for with-open-file: +

+

+
(with-open-file (<stream>  <filename> ) <body> )
+
+
+

+Unless specified otherwise, with-open-file assumes that the stream is an input stream, in other words, that you will be reading data from the named file. +

+Suppose you have a file called ``foo'', which looks like this: +

+

+
this is an
+example of a file
+(that has things)
+we
+might want (to read in)
+4
+5
+67
+
+
+Here's how to get the first Lisp expression from foo. +

+

+
> (with-open-file (infile "foo") (read infile))
+THIS
+
+
+A slightly more complicated operation is to make a list of all the expressions in foo. The following will work: +

+

+
+(with-open-file (infile "foo")
+   (do ((result nil (cons next result))
+	(next (read infile nil 'eof) (read infile nil 'eof)))
+       ((equal next 'eof) (reverse result))))
+
+
+(See the appendix entry for `do' if you do not know how it works.) +

+If you evaluate this code it will return the list: +

+

+
(THIS IS AN EXAMPLE OF A FILE (THAT HAS THINGS) WE MIGHT WANT
+      (TO READ IN) 4 5 67)
+
+
+At the beginning of the do, two variables are specified -- result and next. The initial value of result is nil. The intial value of next is the result of evaluating (read infile nil 'eof). The effects of the last two arguments in this read are explained below. +

+As soon as the variables are initialized, the test (equal next 'eof) is performed. If it is true then (reverse result) is evaluated and returned. If not, then all expressions in the body of the do are evaluated (in this case there are none). +

+After the body has been evaluated, all the variables are updated with the expressions indicated. In other words, result gets next cons-ed into it, and next gets updated with a new read from instream. +

+The second and third argments to read control its behavior when it reaches the end of the file. The second argument, nil in this case, indicates that reaching the end of the file should not generate an error. The third argument, in this case the symbol eof, indicates what should be returned instead of an error. This enables the do loop to determine when the end of file has been reached and return the appropriate result. Notice that choosing eof as the result to return would cause the do loop to stop if it reads the symbol eof in the middle of a file. This may or may not be desirable behavior. +

+Writing to a file is very similar to reading. +

+

+
> (with-open-file (outfile "foo" :direction :output)
+    (prin1 '(here is an example) outfile))
+(HERE IS AN EXAMPLE)
+
+
+And the file now contains one line: +
+
(HERE IS AN EXAMPLE)
+
+
+Note that it is necessary to specify the :direction as :output. With-open-file assumes that a file is being opened for input by default, so this must be explicity overridden when doing file output. Files may also be opened as :direction :io, which allows input and output. +

+Notice also that this example destroyed the previous contents of foo. This behavior can be controlled with the :if-exists option. For example: +

+

+
> (with-open-file (outfile "foo" :direction :output
+                                :if-exists :append)
+     (print '(here is a second list) outfile))
+(HERE IS A SECOND LIST)
+
+
+This will add a second line to the file foo, so that it contains +
+
(HERE IS AN EXAMPLE) 
+(HERE IS A SECOND LIST)
+
+
+With-open-file will produce an error if the file foo does not already exist, unless its behavior is controlled using the :if-does-not-exist :create or :if-does-not-exist nil options. The first of these options creates a file with the specified name, the second causes the body of the with-open-file to be ignored, and the value nil is returned. +

+Format can be used with the name of a stream as its first argument. +

+

+
> (with-open-file (outfile "foo" :direction :output)
+   (format outfile "~%This is text.~%"))
+NIL
+
+
+

+This overwrites foo so that it contains three lines -- a blank line, a line with +

+
This is text.
+
+
+and another blank line. +

+Print, prin1, princ, terpri, format, read and read-line all can be used with stream specifications to do file input and output. +

+


+next +up +previous
+Contents + Next: + Converting Strings to +Up: + Input and Output + Previous: + Reading +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node63.html b/clones/colinallen.dnsalias.org/lp/node63.html new file mode 100644 index 00000000..5b80bd45 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node63.html @@ -0,0 +1,60 @@ + + + + Converting Strings to Lists + + + + + + +

+


+next +up +previous
+Contents + Next: + Functions and Lambda Expressions, +Up: + Input and Output + Previous: + Input and Output +

+

Converting Strings to Lists

+

+Sometimes it is useful to convert text strings to lists. For example, to get substantial input, read-line is most convenient, but it returns a string. If the objective is to parse the input, it is much more convenient to have a list of words than a string. +

+Here is an example of code to convert a string to a list: +

+

+
(defun string-to-list (str)
+   (do* ((stringstream (make-string-input-stream str))
+         (result nil (cons next result))
+         (next (read stringstream nil 'eos)
+               (read stringstream nil 'eos)))
+        ((equal next 'eos) (reverse result))))
+	
+> (string-to-list "this is a string of text")
+(THIS IS A STRING OF TEXT)
+
+
+Because of its reliance on read, this function will not work with certain kinds of punctuation. For example: +

+

+
> (string-to-list "Commas cause problems, see")  
+
+Error: A comma has appeared out of a backquote.
+Error signalled by READ.
+Broken at READ.  Type :H for Help.
+
+
+If punctuation is likely to appear in input, then it is necessary to use read-char, which reads one character at a time. It is then possible to inspect each character and process it appropriately if it is problematic. Exactly how to do this will not be covered here as it makes a nice exercise to develop your understanding of Lisp input processing. +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node64.html b/clones/colinallen.dnsalias.org/lp/node64.html new file mode 100644 index 00000000..dc65a33b --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node64.html @@ -0,0 +1,101 @@ + + + + Functions, Lambda Expressions, and Macros + + + + + + +

+


+next +up +previous
+Contents + Next: + Eval +Up: +Lisp Primer + Previous: + Converting Strings to +

+

Functions, Lambda Expressions, and Macros

+

+ +[We are grateful to John H. Remmers for allowing +material from his programming +languages course to be incorporated into this +section.] + +

+ +Lisp incorporates a "functional programming" paradigm. A central +feature of this paradigm is that functions are "first class" objects +that can be referenced, operated upon, and returned by operators +referred to as functionals. By contrast, in traditional procedural +languages the first class objects are normally just passive data +objects such as numbers, characters, and strings. + +

+ +In a functional language, programming involves applying functionals in +various ways instead of manipulating variables by assignments, loops, +etc. + +

+ +Common Lisp is not a "pure" functional language, because it contains +constructs such as SETQ, LET, and DOTIMES that mimic the assignment, +local scope, and loop features found in procedural languages. However, +Lisp does contain a number of functionals and supports a functional +style of programming. + +

+ +Some of the most important and commonly used functionals are described +below, along with other elements of Lisp such as eval and +defmacro that support functional programming. + +

+


+ +

+

+

+© Colin Allen, John H. Remmers, & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node65.html b/clones/colinallen.dnsalias.org/lp/node65.html new file mode 100644 index 00000000..8fb13cb5 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node65.html @@ -0,0 +1,40 @@ + + + + Eval + + + + + + +

+


+next +up +previous
+Contents + Next: + Lambda Expressions +Up: + FunctionsLambda Expressions, + Previous: + FunctionsLambda Expressions, +

+

Eval

+ +Eval implements the second stage of the Lisp interpreter's +read-eval-print loop. Any Lisp expression can be passed to eval for +immediate evaluation. + +

+ +See appendix entry on eval for examples. + +


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node66.html b/clones/colinallen.dnsalias.org/lp/node66.html new file mode 100644 index 00000000..80310668 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node66.html @@ -0,0 +1,63 @@ + + + + Lambda Expressions + + + + + + +

+


+next +up +previous
+Contents + Next: + Funcall +Up: + FunctionsLambda Expressions, + Previous: + Eval +

+

Lambda Expressions

+ +The Lambda Expression is the heart of Lisp's notion of a function. +The term comes from Alonzo Church's ``lambda calculus'' -- a +development of mathematical logic. You can think of a lambda +expression as an anonymous function. Just like a function it has a +list of parameters and a block of code specifying operations on those +parameters. + +

+For example: +

+> (setf product '(lambda (x y) (* x y)))
+(LAMBDA (X Y) (* X Y))
+> product
+(LAMBDA (X Y) (* X Y))
+
+ +Note that in some recent versions of Common Lisp, the lambda +expression should be unquoted, or the next step will not work. +
Use (setf product (lambda (x y) (* x y))) instead. + +

+Lambda expressions can be used in conjunction with apply to mimic function calls: +

+> (apply product '(3 4))
+12
+
+ + + +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node67.html b/clones/colinallen.dnsalias.org/lp/node67.html new file mode 100644 index 00000000..30cac37c --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node67.html @@ -0,0 +1,61 @@ + + + + Funcall + + + + + + +

+


+next +up +previous
+Contents + Next: + Apply +Up: + FunctionsLambda Expressions, + Previous: + Lambda Expressions +

+

Funcall

+ +[Our thanks to John H. +Remmers for allowing his material from his programming +languages course to be incorporated into this section.] + +

+ +FUNCALL is similar to APPLY, except that the +function arguments are at the same level as the function description +instead of being in a sublist, as APPLY is typically used. + +For example: + +

+ +> (FUNCALL '+ 3 5 9)
+17 +
+
+ +In fact, the similarity is closer than this description indicates for +
(FUNCALL '+ 1 2 3)
+not only evaluates to the same result as +
(APPLY '+ '(1 2 3))
+but also to the same result as +
(APPLY '+ 1 2 3 nil)
+ + + +

+

+

+© Colin Allen, John H. Remmers, & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node68.html b/clones/colinallen.dnsalias.org/lp/node68.html new file mode 100644 index 00000000..db626831 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node68.html @@ -0,0 +1,58 @@ + + + + Apply + + + + + + +

+


+next +up +previous
+Contents + Next: + Mapcar +Up: + FunctionsLambda Expressions, + Previous: + Funcall +

+

Apply

+

+ +Apply takes its first argument and applies it as a function to the +list of items making up the last. For example: + +

+>(apply '* '(1 2 3 4))
+24
+
+ +You can imagine this being obtained by constructing the list (* 1 +2 3 4) and evaluating the resulting list, although this is not +strictly what happens since apply is a function, not a macro. Apply also allows intermediate arguments +between the first and the last (see appendix) +but the last argument is required to be a list. + +

+Apply can also be used in conjunction with lambda lists. For example: +

+>(apply '(lambda (x y) (* x y)) '(45 67))
+3015
+
+ +If this does not seem particularly useful to you, think about how it +can be used to construct complex programs on the fly. + +

+

+

+© Colin Allen & Maneesh Dhagat
+May 1999
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node69.html b/clones/colinallen.dnsalias.org/lp/node69.html new file mode 100644 index 00000000..f157288f --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node69.html @@ -0,0 +1,56 @@ + + + + Mapcar + + + + + + +

+


+next +up +previous
+Contents + Next: + Backquote and Commas +Up: + FunctionsLambda Expressions, + Previous: + Apply +

+

Mapcar

+

+[We are grateful to John H. Remmers for allowing +material from his programming +languages course to be incorporated into this +section.] + + +

The MAPCAR form is an "iterator" that applies a +function repeatedly, to each element of a list and returns a list of the results. For example: + + +

+> (mapcar 'atom '(dog (cat horse) fish))
+(t nil t) +
+ +
+> (mapcar (lambda (x) (* x x)) '(4 7 2 9))
+(16 49 4 81) +
+ + +

+

+

+© Colin Allen, John H. Remmers, & Maneesh Dhagat
+March 2007
+
+ + diff --git a/clones/colinallen.dnsalias.org/lp/node7.html b/clones/colinallen.dnsalias.org/lp/node7.html new file mode 100644 index 00000000..a9a17a0d --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node7.html @@ -0,0 +1,52 @@ + + + + Some Primitive Functions + + + + + + +

+


+next +up +previous
+Contents + Next: + Constructors: ConsList, +Up: + LISt Processing + Previous: + Lists +

+

Some Primitive Functions

+

+Functions that are built into the Lisp language are called ``primitive functions.'' There are (of course) lots of primitive functions in Lisp, including all the math functions you would expect. Here's a list of some of the more common math functions: +

++, -, *, /, exp, expt, log, sqrt, sin, cos, tan, max, min. +

+You should look at the appendix entries for these functions and play with them to learn how they work. +

+More important to the list-processing identity of Lisp are the +primitive functions that allow selection from lists and construction +of lists. The important constructor functions are cons, list, and +append. The two principal selector functions are first and rest. +

+


+ +

+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node70.html b/clones/colinallen.dnsalias.org/lp/node70.html new file mode 100644 index 00000000..3ddc4f84 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node70.html @@ -0,0 +1,46 @@ + + + + Backquote and Commas + + + + + + +

+


+next +up +previous
+Contents + Next: + Defmacro +Up: + FunctionsLambda Expressions, + Previous: + Mapcar +

+

Backquote and Commas

+

+Backquoted lists allow evaluation of items that are preceded by commas. +

+For example: +

+>`(2 ,(+ 3 4))
+(2 7)
+
+Any number of commas may appear inside a backquoted list, and at any +depth inside that context. For example: + +
+> `(4 ,(+ 1 2) '(3 ,(+ 1 2)) 5)
+(4 3 '(3 3) 5)
+
+

+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node71.html b/clones/colinallen.dnsalias.org/lp/node71.html new file mode 100644 index 00000000..43e3730e --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node71.html @@ -0,0 +1,80 @@ + + + + Defmacro + + + + + + +

+


+next +up +previous
+Contents + Next: + Appendix: Selected Lisp +Up: + FunctionsLambda Expressions, + Previous: + Backquote and Commas +

+

Defmacro

+

+ +Macro definitions are similar to function definitions, but there are +some crucial differences. A macro is a piece of code that creates +another lisp object for evaluation. This process is called ``macro +expansion''. Macro expansion happens before any arguments +are evaluated. + +

Here is an example of a macro definition: + +

+> (defmacro 2plus (x) (+ x 2))
+2PLUS
+> (2plus 3)
+5
+> (setf a (2plus 3))   ;; setf is a macro too!
+5
+
+ +

+Because expansion occurs prior to evaluation, arguments passed to a +macro will not necessarily be evaluated. This result is that macros +behave rather differently from functions. For example: + +

+> (defmacro just-first-macro (x y) x)
+JUST-FIRST-MACRO
+> (just-first-macro 3 4)
+3
+> (just-first-macro 3 (print 4))
+3                     ;; (print 4) is not evaluated
+> (defun just-first-function (x y) x)
+JUST-FIRST-FUNCTION
+> (just-first-function 3 (print 4))
+4                     ;; (print 4) is evaluated
+3
+
+ +

+Many macros are built in to Lisp. For example (in addition to +setf) cond, +if, and, and or are all macros. + +

+Macros are usually used to simplify or extend the syntax of the language. + +Because macros do not evaluate all their arguments, they can sometimes result in +more efficient code. + +


+

+

+© Colin Allen & Maneesh Dhagat
+May 1999
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node72.html b/clones/colinallen.dnsalias.org/lp/node72.html new file mode 100644 index 00000000..67be6d8d --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node72.html @@ -0,0 +1,139 @@ + + + + Appendix: Selected Lisp primitives + + + + + + +

+


+next +up +previous
+Contents + Next: + * (FUNCTION) +Up: +Lisp Primer + Previous: + Defmacro +

+

Appendix: Selected Lisp primitives

+

+Entries are described as FUNCTIONS, PREDICATES, MACROS, or SPECIAL FORMS. +

+FUNCTIONS evaluate all their arguments and return a value. +

+PREDICATES are functions that always return either t or nil. +

+MACROS and SPECIAL FORMS do not always evaluate all their arguments. +

+Currently approximately 40 Lisp primitives are documented here. Eventually just over 100 primitives will be documented. +

+We adopt the convention of using angle brackets < > to indicate where appropriate text should be inserted when using these primitives; the examples should make this clear. +

+In many of the descriptions below, the notion of list is used when either a list or a Lisp data type known as the dotted pair would be acceptable. Beginners generally need not use dotted pairs, so they are ignored for the sake of simplicity here. +

+ +

+


+ +

+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node73.html b/clones/colinallen.dnsalias.org/lp/node73.html new file mode 100644 index 00000000..7357aa7b --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node73.html @@ -0,0 +1,70 @@ + + + + * (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + + (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + Appendix: Selected Lisp +

+

* (FUNCTION)

+

+ Format: + (* <num1> <num2> ...) +

+ Required arguments: None. +

+Argument expressions must evaluate to numbers. +

+Argument expressions are evaluated and their product is computed. See +below for special cases of zero or one arguments. +

+ Examples: +

+

+
> (* 4 5 6)
+120
+
+> (* 123.5 12/3)
+494.0
+
+> (* (* 2 3) 8)
+48
+
+> (* 'a 1)
+Error: A is not of type NUMBER.
+
+
+

+ Special cases: +

+

+
> (* 3)
+3
+
+> (*)
+1
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node74.html b/clones/colinallen.dnsalias.org/lp/node74.html new file mode 100644 index 00000000..e9cc3f21 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node74.html @@ -0,0 +1,70 @@ + + + + + (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + - (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + * (FUNCTION) +

+

+ (FUNCTION)

+

+ Format: + (+ <exp1> <exp2> ...) +

+ Required arguments: None. +

+Argument expressions must evaluate to numbers. +

+Argument expressions are evaluated and their sum is computed. See +below for special cases of zero or one arguments. +

+ Examples: +

+

+
> (+ 4 5 6)
+15
+
+> (+ 123.5 12/3)
+127.5
+
+> (+ (* 2 3) 8)
+14
+
+> (+ 'a 1)
+Error: A is not of type NUMBER.
+
+
+

+ Special Cases: +

+

+
> (+ 3)
+3
+
+> (+)
+0
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node75.html b/clones/colinallen.dnsalias.org/lp/node75.html new file mode 100644 index 00000000..28861fd4 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node75.html @@ -0,0 +1,58 @@ + + + + - (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + 1+1- (FUNCTIONS) +Up: + Appendix: Selected Lisp + Previous: + + (FUNCTION) +

+

- (FUNCTION)

+

+ Format: + (- <exp1> <exp2> ...) +

+ Required arguments: 1 +

+Argument expressions must evaluate to numbers. +

+Argument expressions are evaluated and their cumulative difference is computed. +

+ Examples: +

+

+
> (- 1)
+-1
+
+> (- 1 2)
+-1
+
+> (- 1 2 3)
+-4
+
+> (- 1 2 3 4)
+-8
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node76.html b/clones/colinallen.dnsalias.org/lp/node76.html new file mode 100644 index 00000000..69622855 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node76.html @@ -0,0 +1,55 @@ + + + + 1+, 1- (FUNCTIONS) + + + + + + +

+


+next +up +previous
+Contents + Next: + = (PREDICATE) +Up: + Appendix: Selected Lisp + Previous: + - (FUNCTION) +

+

1+, 1- (FUNCTIONS)

+

+ Format: + (1+ <num> ) + (1- <num> ) +

+ Required arguments: +1 +

+ <num> : any Lisp expression that evaluates to a number. +

+ Examples: +

+

+
> (1+ 3)
+4
+
+> (1- pi)
+2.1415926535897931
+
+> (1+ (1- 3))
+3
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node77.html b/clones/colinallen.dnsalias.org/lp/node77.html new file mode 100644 index 00000000..a45e5775 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node77.html @@ -0,0 +1,70 @@ + + + + = (PREDICATE) + + + + + + +

+


+next +up +previous
+Contents + Next: + <> , <=, +Up: + Appendix: Selected Lisp + Previous: + 1+1- (FUNCTIONS) +

+

= (PREDICATE)

+

+ Format: + (= <num1> <num2> ...) +

+ Required arguments: +1 +

+ <num1> must evaluate to a number +

+ Optional arguments: +arbitrary +

+ <num2> ... must all evaluate to numbers +

+= returns T if all the arguments are numerically equal to each other; it returns NIL otherwise. +

+ Examples: +

+

+
> (= 2)
+T
+
+> (= 2 3)
+NIL
+
+> (= 2 3 4)
+NIL
+
+> (= 2 2 2 2 )
+T
+
+> (= 2 2 3 2)
+NIL
+
+> (= 2 'a)
+Error: A is not of type NUMBER.
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node78.html b/clones/colinallen.dnsalias.org/lp/node78.html new file mode 100644 index 00000000..300b9359 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node78.html @@ -0,0 +1,77 @@ + + + + <, > , <=, >= (PREDICATES) + + + + + + +

+


+next +up +previous
+Contents + Next: + and (MACRO) +Up: + Appendix: Selected Lisp + Previous: + = (PREDICATE) +

+

<, > , <=, >= (PREDICATES)

+

+ Format: + (< <num1> <num2> ... ) + (> <num1> <num2> ... ) + (<= <num1> <num2> ... ) + (>= <num1> <num2> ... ) +

+ Required arguments: +1 +

+ <num1> <num2> ... must evaluate to numbers. +

+Returns T if the sequence of arguments is ordered (<: ascending, > : descending) or partially ordered (<=: less than or equal, >=: greater than or equal). Otherwise returns nil. +

+ Examples: +

+

+
> (< 2 67)
+T
+
+> (< 67 2)
+NIL
+
+> (>  67 2)
+T
+
+> (< 3 6 9)
+T
+
+> (< 4)
+T
+
+> (< 2 2 6)
+NIL
+
+> (<= 2 2 6)
+T
+
+> (>= 2 2 6)
+NIL
+
+> (< 6/2 3.0)
+NIL
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node79.html b/clones/colinallen.dnsalias.org/lp/node79.html new file mode 100644 index 00000000..2c3efe2f --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node79.html @@ -0,0 +1,59 @@ + + + + and (MACRO) + + + + + + +

+


+next +up +previous
+Contents + Next: + append (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + <> , <=, +

+

and (MACRO)

+

+ Format: + (and <exp1> <exp2> ... <expN> ) +

+ Required arguments: +None +

+This macro evaluates its arguments in order until it reaches a nil value, in which case it returns NIL, or it returns the value of <expN> . Evaluation of intermediate expressions may produce side-effects. In the special case where and is given no arguments, it always returns T. +

+ Examples: +

+

+
> (and 3 (+ 4 5))
+9
+
+> (and nil (print 'hello))
+NIL
+
+> (and t (print 'hello) 3)
+
+HELLO 
+3
+
+> (and)
+T
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node8.html b/clones/colinallen.dnsalias.org/lp/node8.html new file mode 100644 index 00000000..d7ebcece --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node8.html @@ -0,0 +1,68 @@ + + + + Constructors: Cons, List, and Append + + + + + + +

+


+next +up +previous
+Contents + Next: + Quote +Up: + Some Primitive Functions + Previous: + Some Primitive Functions +

+

Constructors: Cons, List, and Append

+

+The primitive function ``cons'' allows you to add a member to the front of a list. Here are two examples: +

+

+
> (cons 1 nil)
+(1)
+> (cons 1 (cons 2 nil))
+(1 2)
+
+
+It is worth looking at what is going on in these examples. In the first, cons is given two arguments. The first is 1 and the second is nil, which, you will remember, is the same as (). So, cons takes the first argument and inserts it as the first element of the second. +

+To understand the second example, it is useful to anthropomorphize the interpreter. It says, ``OK, cons is a function I know and I've +got two arguments to that function, 1 and (cons 2 +nil). The first argument is an atom, but a special one, and +evaluates to 1. The second is a list, so its first element names a +function, i.e. cons, and there are two arguments to that function, 2 +and nil. 2 evaluates to 2, and nil evaluates to nil (the empty +list). So, putting 2 into the empty list we get (2). Now I know +what the second argument to the first cons is, we can go ahead and +insert the first argument, i.e. 1. Hence we get (1 2).'' +

+Now we discuss what happens when we deal with atoms that are not +special. Suppose you wanted to construct the list (a b c d) and you +try to do this by saying: +

+

+
> (cons a (b c d))
+
+
+What would happen? Well, the interpreter would say ``OK, cons I know, +and I've got two arguments to evaluate. First, eval a.'' +

+Immediately you get an error because (we are assuming) a is an +unbound variable (you haven't set it to anything). How do you fix +this problem? +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node80.html b/clones/colinallen.dnsalias.org/lp/node80.html new file mode 100644 index 00000000..3610b7cc --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node80.html @@ -0,0 +1,68 @@ + + + + append (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + apply (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + and (MACRO) +

+

append (FUNCTION)

+

+ Format: + (append <list1> <list2> ...<listN> <exp> ) +

+ Required arguments: +none +

+ Optional arguments: +zero or more Lisp expressions +

+ <list> : any Lisp expression which returns a list; except the last argument may be any Lisp expression. +

+Each of the arguments is evaluated; all except the last must return a list. If all the arguments evaluate to lists, append creates a new list which has as its elements the elements of all the argument lists. If the last argument is not a list, append returns a dotted pair object. +

+ Examples: +

+

+
>  (append '(a b) '(c d))
+(A B C D)
+
+>  (append '(1 (2 (3))) '(i (j) k))
+(1 (2 (3)) I (J) K)
+
+>  (setq tmp '(fee fi fo))
+(FEE FI FO)
+
+>  (append tmp (list 'fum))
+(FEE FI FO FUM)
+
+>  (append '(fo) 'fum)
+(FO . FUM)                           ;; this is a dotted pair
+
+>  (append 'a '(1 2))
+Error: A is not of type LIST
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node81.html b/clones/colinallen.dnsalias.org/lp/node81.html new file mode 100644 index 00000000..e3028fce --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node81.html @@ -0,0 +1,57 @@ + + + + apply (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + atom (PREDICATE) +Up: + Appendix: Selected Lisp + Previous: + append (FUNCTION) +

+

apply (FUNCTION)

+

+ Format: + (apply <func> <list> ) + (apply <func> <exp1> ... <expn> <list> ) +

+ Required arguments: +2 +

+ <func> must name a function or predicate (usually quoted); the last argument must be a list. +

+ Optional arguments: +arbitrary +

+Intermediate argument expressions must evaluate to items of the correct type to which <func> can be applied +

+ Examples: +

+

+
> (apply '+ '(1 2 3 4))
+10
+
+> (apply '+ 1 2 '(3 4))
+10
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node82.html b/clones/colinallen.dnsalias.org/lp/node82.html new file mode 100644 index 00000000..5ee23173 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node82.html @@ -0,0 +1,62 @@ + + + + atom (PREDICATE) + + + + + + +

+


+next +up +previous
+Contents + Next: + butlast (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + apply (FUNCTION) +

+

atom (PREDICATE)

+

+ Format: + (atom <exp> ) +

+ Required arguments: +1 +

+ <exp> can be any Lisp expression +

+The argument expression is evaluated. If the value returned +by this evaluation represents a Lisp atom, atom returns T, else +it returns NIL. Symbols, numbers and strings are all considered +Lisp atoms. +

+ Examples: +

+

+
>  (atom 'hello)
+T
+
+>  (atom "hello")
+T
+
+>  (atom 4.6434)
+T
+
+>  (atom '(hello "hello" 4.6434))
+NIL
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node83.html b/clones/colinallen.dnsalias.org/lp/node83.html new file mode 100644 index 00000000..331c76f9 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node83.html @@ -0,0 +1,67 @@ + + + + butlast (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + car (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + atom (PREDICATE) +

+

butlast (FUNCTION)

+

+ Format: + (butlast <list> ) + (butlast <list> <int> ) +

+ Required arguments: +1 +

+First argument must evaluate to a list +

+ Optional arguments: +1 +

+ <int> must evaluate to an integer +

+If butlast is used with a single argument then it is equivalent to (reverse (rest (reverse <list> ))). I.e. it will return the list argument with the last element removed. +

+If butlast is given an integer second argument, it is equivalent to (reverse (nthcdr <num> (reverse <list> ))). I.e. it will remove the number of elements specified from the end of the list. +

+ Examples: +

+

+
> (butlast '(a s d f))
+(A S D)
+
+> (butlast '(a s d f) 2)
+(A S)
+
+> (butlast '(a s d f) 0)
+(A S D F)
+
+> (reverse (nthcdr 2 (reverse '(a s d f))))
+(A S)
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node84.html b/clones/colinallen.dnsalias.org/lp/node84.html new file mode 100644 index 00000000..7ec12555 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node84.html @@ -0,0 +1,40 @@ + + + + car (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + caar, cadr, cdar, +Up: + Appendix: Selected Lisp + Previous: + butlast (FUNCTION) +

+

car (FUNCTION)

+

+ +car is an archaic form of the function first and the two may be used +interchangeably. (Historical note: "CAR" is an acronym for "Contents +of Address Register" which refers to the way in which linked lists +were originally implemented in Lisp.) + +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node85.html b/clones/colinallen.dnsalias.org/lp/node85.html new file mode 100644 index 00000000..64f98fe8 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node85.html @@ -0,0 +1,60 @@ + + + + caar, cadr, cdar, cddr, etc. (FUNCTIONS) + + + + + + +

+


+next +up +previous
+Contents + Next: + cdr (Function) +Up: + Appendix: Selected Lisp + Previous: + car (FUNCTION) +

+

caar, cadr, cdar, cddr, etc. (FUNCTIONS)

+

+ Format: + (c-r <list> ) +

+ Required arguments: +1 +

+Argument must evaluate to a list (or cons pair). +

+The function cxyr is a composition of the function cxr with cyr. So, for example, (cadr foo) is equivalent to (car (cdr foo)), etc. Full implementation of the ANSI Common Lisp specification provides for up to 4 letters, a or d, to appear between the c and the r. +

+ Examples: +

+

+
> (setf ds9 '(Sisko Kira Dax Odo Bashir OBrien))
+(SISKO KIRA DAX ODO BASHIR OBRIEN)
+
+> (cadr ds9)
+KIRA
+
+> (cddr ds9)
+(DAX ODO BASHIR OBRIEN)
+
+> (cddar ds9)
+
+Error: SISKO is not of type LIST.
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node86.html b/clones/colinallen.dnsalias.org/lp/node86.html new file mode 100644 index 00000000..45732da8 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node86.html @@ -0,0 +1,35 @@ + + + + cdr (Function) + + + + + + +

+


+next +up +previous
+Contents + Next: + cond (MACRO) +Up: + Appendix: Selected Lisp + Previous: + caarcadr, cdar, +

+

cdr (Function)

+

+See the entry for rest: cdr is the older name for rest. Historically its name is derived from Contents of Decrement Register. Its pronunciation rhymes with udder. + +

+


+

+

+© Colin Allen & Maneesh Dhagat
+January 2006
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node87.html b/clones/colinallen.dnsalias.org/lp/node87.html new file mode 100644 index 00000000..94926486 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node87.html @@ -0,0 +1,94 @@ + + + + cond (MACRO) + + + + + + +

+


+next +up +previous
+Contents + Next: + cons (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + cdr (Function) +

+

cond (MACRO)

+

+ Format: + (cond (<test1> <body1> ) + (<test2> <body2> ) + . + . + (<testN> <bodyN> )) +

+ Required arguments: +none +

+ Optional arguments: +zero or more (<test> <body> ) clauses +

+Here, <test> is any Lisp expression. The <body> is a sequence of zero or more Lisp expressions. +

+Each <test> expression is evaluated in turn, until one is +found whose value is non-NIL. For this clause, the sequence of + <body> expressions are evaluated and the value of the last +expression is returned as the result of cond. If no successful + <test> expression is found, cond returns NIL. If a successful + <test> expression is found, but its clause contains no <body> +expressions, the result of the <test> expression is returned as +the result of cond. +

+ Examples: +

+

+
>  (setq a '3)
+3
+>  (setq b '4)
+4
+
+>  (cond ((= a b) 'equal)
+        ((< a b) 'b-is-bigger)
+        (t 'a-is-bigger))
+B-IS-BIGGER
+
+>  (setq action 'square-both)
+SQUARE-BOTH
+
+>  (cond ((equal action 'clear-both)
+         (setq a 0) 
+         (setq b 0))
+        ((equal action 'square-both)
+         (setq a (* a a))
+         (setq b (* b b)))
+        ((equal action 'square-a)
+         (setq a (* a a)))
+        ((equal action 'square-b)
+         (setq b (* b b))))
+16
+
+>  (cond ((= a 5) 'found)
+        ((= b 5) 'found))
+NIL
+
+>  (cond ((+ a 1)))   ; strange use of cond
+10                   ; before this, a was 9 due to previous
+                     ; cond clauses
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node88.html b/clones/colinallen.dnsalias.org/lp/node88.html new file mode 100644 index 00000000..0eb7bb1e --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node88.html @@ -0,0 +1,70 @@ + + + + cons (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + defun (MACRO) +Up: + Appendix: Selected Lisp + Previous: + cond (MACRO) +

+

cons (FUNCTION)

+

+ Format: + (cons <exp1> <exp2> ) +

+ Required arguments: +2 +

+ <exp1> : any Lisp expression + <exp2> : any Lisp expression +

+Both argument expressions are evaluated. In common usage, the +second expression usually returns a list. In this case, cons creates +a new copy of the list returned by <expr2> , and makes the value +returned by <expr1> the new first element in this list. However, if + <expr2> returns an atom, cons returns the dotted pair +of the values of the two expressions. +

+ Examples: +

+

+
>  (cons 'a '(1 2 3))
+(A 1 2 3)
+
+>  (cons '(a) '(1 2 3))
+((A) 1 2 3)
+
+>  (setq a 3)
+3
+>  (cons a (list 'i 'j 'k))
+(3 I J K)
+
+>  (cons 'a a)
+(A . 3)                           ;;a dotted pair
+
+>  (cons '(1 2) 'q)
+((1 2) . Q)                       ;;another dotted pair
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node89.html b/clones/colinallen.dnsalias.org/lp/node89.html new file mode 100644 index 00000000..76f559c8 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node89.html @@ -0,0 +1,94 @@ + + + + defun (MACRO) + + + + + + +

+


+next +up +previous
+Contents + Next: + do (SPECIAL FORM) +Up: + Appendix: Selected Lisp + Previous: + cons (FUNCTION) +

+

defun (MACRO)

+

+ Format: + (defun <name> (<par1> <par2> ... <parN> ) + <body> ) +

+ Required arguments: +2 +

+ <name> : a symbol which is appropriate as the name of function; + (<par1> <par2> ...): a list of zero or more symbols which +are appropriate as parameter names +

+ Optional arguments: +1 +

+ <body> : a sequence of zero or more Lisp expressions +

+The arguments to defun are not evaluated---they are used to establish a procedure definition. The first argument is a +symbol which specifies the name of the function. This name can +later be used to execute the <body> of the function. The +parameter-list follows the name. This list specifies the number and order of +arguments in a function call. Each <par> is symbol which may appear +in the <body> . The value of each parameter, <par> , is +determined by the value of corresponding argument in the function call. +defun returns the name of the function. +

+ Examples: +

+

+
>  (defun square (x)
+     (* x x))
+SQUARE
+
+>  (square 4)
+16
+
+>  (square (+ 7 -2))
+25
+
+>  (defun equal-length (lst1 lst2)
+     (cond ((= (length lst1) (length lst2)) t)
+           (t nil)))
+EQUAL-LENGTH
+
+>  (equal-length '(a b c) '((d e) f g))
+T
+
+>  (equal-length '() (rest '(a b)))
+NIL
+
+>  (defun side-effect (x y)
+     (setq x (* x x x))
+     (+ x y))
+SIDE-EFFECT
+
+>  (side-effect 2 3)
+11
+
+>  (side-effect -4 14)
+-50
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node9.html b/clones/colinallen.dnsalias.org/lp/node9.html new file mode 100644 index 00000000..916f46c9 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node9.html @@ -0,0 +1,119 @@ + + + + Quote + + + + + + +

+


+next +up +previous
+Contents + Next: + Selectors: First and +Up: + Some Primitive Functions + Previous: + Constructors: ConsList, +

+

Quote

+

+The answer to the previous question is to use the single quote mark, ', in front of an item that you do not wish the interpreter to evaluate. It works +as follows: +

+

+
> 'a
+a
+
+
+Without the quote you would have received an error message. So now +you might try (cons 'a (b c d)), but this still won't work since the +interpreter tries to evaluate the second argument (b c d), treating b +as the name of a function. But (we are assuming) you have not +defined b to be a function, so it is an error. Once again you can +use the ' to block evaluation of the list (b c d). Thus: +

+

+
> (cons 'a '(b c d))
+(a b c d)
+
+
+Notice that you need only one quote on the second argument. The +quote blocks evaluation of the whole thing, so you don't need quotes +on the internal elements of the list. +

+Notice, also, that in using setq, the first argument -- the variable to +be set -- does not need a quote; the interpreter does not evaluate it +if it is an atom. Originally, Lisp had only the function set, whose +proper use included things like (set 'a 4) or (set 'a 'b). Lisp +programmers got tired of putting (or, more likely, forgetting to put) +the quote on the first argument, so they wrote setq to take care of +it automatically (now you understand the name, right?!) So, (setq a +4) is equivalent to (set 'a 4). +

+In fact, the ' itself is shorthand for another function. The interpreter expands 'a to the expression (quote a). So (setq a 4) is really +short for (set (quote a) 4). Shorthand commands like setq and ' are +called ``macros'' by programmers. +

+Cons always takes two arguments. (Try it with one or three and see +that you get an error message.) Usually, the second argument is a +list, but the first can be either an atom or a list. (Cons can be +used with an atom as the second argument. What gets returned is a +slightly esoteric data type called a ``dotted pair.'' The use of +dotted pairs is relatively rare and will be ignored here.) +

+The list building functions list and append both allow arbitrary +numbers of arguments. List takes all its arguments and makes a list +with them as elements. Arguments to list will typically be either +atoms or lists. For example: +

+

+
> (list 2 3 4)
+(2 3 4)
+> (list 'a '(a s d f))
+(a (a s d f))
+
+
+Make sure you understand why list works as shown in these examples. +

+Append is normally used with lists as arguments. (Only the last +argument may be an atom, resulting in a dotted pair.) When used with +lists, append has the effect of taking all the members of the lists +that are its arguments and creating a new list from those elements. +For example: +

+

+
> (append '(a b) '(c d))
+(a b c d)
+
+
+Beginning Lisp programmers (and even some experienced ones) +frequently have trouble deciding whether they should use cons or list +or append to achieve a particular effect. The best way to get around +the difficulty is to play with the different functions and see what +works. +

+


+next +up +previous
+Contents + Next: + Selectors: First and +Up: + Some Primitive Functions + Previous: + Constructors: ConsList, +

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node90.html b/clones/colinallen.dnsalias.org/lp/node90.html new file mode 100644 index 00000000..3429d02f --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node90.html @@ -0,0 +1,126 @@ + + + + do (SPECIAL FORM) + + + + + + +

+


+next +up +previous
+Contents + Next: + documentation (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + defun (MACRO) +

+

do (SPECIAL FORM)

+

+ Format: + (do ((<var1> <init1> <update1> ) + (<var2> <init2> <update2> ) + . + . + (<varN> <initN> <updateN> )) + (<test> <body1> ) + <body2> ) +

+ Required arguments: +2 +

+ ((<var> <init> <update> )...): a list of zero or more variable + clauses; <var> is a symbol appropriate as a variable + name; <init> , which is optional, is any Lisp + expression; <update> , which is optional, is any Lisp + expression. + (<test> <body1> ): <test> is any Lisp expression; + <body1> is a sequence of zero or more Lisp + expressions. +

+ Optional arguments: +arbitrary +

+ <body2> : a sequence of zero or more Lisp expressions +

+The special form do allows the programmer to specify +iteration. The first part of do is a list of variables; if <init> +is provided, the <var> 's are initialised to the result of evaluating +the corresponding <init> . If no <init> is provided, <var> is +initialised to NIL. The optional <update> expression may +specify how the variable is to be modified after every iteration. +After every iteration, <var> is set to result of evaluating + <update> . +Initialisation and updating for all variables is performed in +parallel; thus a <var> in one clause may not be used in the +<init> or <update> of another clause. +

+The second part of ``do,'' the <test> , checks for termination. The + <test> is evaluated before each pass; if it returns a non-NIL value, +the sequence of expressions in <body1> are evaluated one by one; do +returns the value of the last expression in <body1> . If <body1> +contains no expressions, do returns NIL. +

+The third part of the +do is the body of the iteration, <body2> . At each pass, the sequence +of expressions in <body2> are evaluated one by one. +If <body2> contains an expression of the form (return <expr> ), where + <expr> is any Lisp expression, do terminates immediately and returns +the result of evaluating <expr> . +

+ Examples: +

+

+
      (setq sum (+ sum (first lst))))
+25
+
+>  (do ((lst
+        '(a (b (c d)) e (f)) 
+        (rest lst))
+       (len 0 (+ 1 len)))  ; determines length of lst
+      ((null lst) len))    ; "do," here, has no body
+4
+
+>  (defun my-exp (m n)      ; raise m to power of n
+     (do ((result 1)
+          (exp    n))
+         ((= exp 0) result)
+         (setq result (* result m))
+         (setq exp    (- exp 1))))
+MY-EXP
+
+>  (my-exp 5 3)
+125
+
+>  (defun my-exp2 (m n)     ; simpler version of my-exp
+     (do ((result 1 (* result m))
+          (exp    n (- exp 1)))
+         ((= exp 0) result)))
+
+
+

+


+next +up +previous
+Contents + Next: + documentation (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + defun (MACRO) +

+


+

+

+© Colin Allen & Maneesh Dhagat
+November 1999
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node91.html b/clones/colinallen.dnsalias.org/lp/node91.html new file mode 100644 index 00000000..64398a23 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node91.html @@ -0,0 +1,72 @@ + + + + documentation (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + eql (PREDICATE) +Up: + Appendix: Selected Lisp + Previous: + do (SPECIAL FORM) +

+

documentation (FUNCTION)

+

+ Format: + (documentation <func> <type> ) +

+ Required arguments: +2 +

+ <func> must evaluate to the name of a function + <type> must be function, variable, type, structure, or setf (see below) +

+This function is useful from the command line for a quick reminder of the format and usage of certain Lisp primitives. Both arguments are usually quoted symbols. See examples below. +

+ Examples: +

+

+
> (documentation 'documentation 'function)
+"
+Args: (symbol doc-type)
+Returns the doc-string of DOC-TYPE for SYMBOL; NIL if none exists.
+Possible doc-types are:
+        FUNCTION  (special forms, macros, and functions)
+        VARIABLE  (dynamic variables, including constants)
+        TYPE      (types defined by DEFTYPE)
+        STRUCTURE (structures defined by DEFSTRUCT)
+        SETF      (SETF methods defined by DEFSETF, DEFINE-SETF-METHOD, and
+                   DEFINE-MODIFY-MACRO)
+All built-in special forms, macros, functions, and variables have their
+doc-strings."
+
+> (documentation 'cdr 'function)
+"
+Args: (list)
+Returns the cdr of LIST.  Returns NIL if LIST is NIL."
+
+> (documentation 'pi 'variable)
+"
+The floating-point number that is appropriately equal to the ratio of the
+circumference of the circle to the diameter."
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node92.html b/clones/colinallen.dnsalias.org/lp/node92.html new file mode 100644 index 00000000..6ae9d443 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node92.html @@ -0,0 +1,114 @@ + + + + eql, equal (PREDICATES) + + + + + + +

+


+next +up +previous
+Contents + Next: + eval (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + documentation (FUNCTION) +

+

eql, equal (PREDICATES)

+

+ Format: + (eql <exp1> <exp2> ) +

+ Required arguments: +2 +

+ <exp1> : any Lisp expression + <exp2> : any Lisp expression +

+Both argument expressions are evaluated. If they both return +atoms, eql returns T if they are the same. If they return lists, +eql returns T only if the lists are represented by the same object +in memory. In contrast, two values can be ``equal'' if they are +copies of one another (perhaps existing in different memory locations). +

+ Examples: +

+

+
>  (eql 'hello 'hello)
+T
+>  (eql -19 -19)
+T
+>  (eql 2 3)
+NIL
+>  (eql '(1 2 3) '(1 2 3))
+NIL
+
+>  (setq a '(1 2 3))
+(1 2 3)
+>  (setq b '(1 2 3))
+(1 2 3)
+>  (eql a b)
+NIL
+
+>  (setq c a)
+(1 2 3)
+>  (eql a c)
+T
+>  (eql b c)
+NIL
+
+
+ +

+ Format: + (equal <exp1> <exp2> ) +

+ Required arguments: +2 +

+ <exp1> : any Lisp expression + <exp2> : any Lisp expression +

+Both argument expressions are evaluated. If the values returned +are copies of one another (or even are physically the same by +occupying the same memory), equal returns T. In contrast, for two +lists to be eql they must represent the same object in memory. +

+ Examples: +

+

+
>  (equal 'hey 'hello)
+NIL
+>  (equal -81 -81)
+T
+>  (equal '(1 (2 3)) '(1 (2 3)))
+T
+
+>  (setq a '(1 2 3))
+(1 2 3)
+>  (setq b '(1 2 3))
+(1 2 3)
+>  (equal a b)
+T
+
+>  (setq c a)
+(1 2 3)
+>  (equal a c)
+T
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node93.html b/clones/colinallen.dnsalias.org/lp/node93.html new file mode 100644 index 00000000..cf5af85c --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node93.html @@ -0,0 +1,62 @@ + + + + eval (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + evenpoddp (PREDICATES) +Up: + Appendix: Selected Lisp + Previous: + eql (PREDICATE) +

+

eval (FUNCTION)

+

+ Format: + (eval <exp> ) +

+ Required arguments: +1 +

+ <exp> : any Lisp expression. +

+eval provides direct access to the Lisp expression evaluator. It causes the evaluation of whatever <exp> returns. Thus, if <exp> is an evaluable Lisp expression that returns an evaluable Lisp expression, then eval returns the value of evaluating this second expression. +

+ Examples: +

+

+
> (eval '(+ 1 2))
+3
+
+> (eval (cons '+ '(1 2)))
+3
+
+> (eval 3)
+3
+
+> (eval (+ 3 4))
+7
+
+> (eval (cons 'a '(s d f)))
+Error: The function A is undefined.
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node94.html b/clones/colinallen.dnsalias.org/lp/node94.html new file mode 100644 index 00000000..b8561869 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node94.html @@ -0,0 +1,57 @@ + + + + evenp, oddp (PREDICATES) + + + + + + +

+


+next +up +previous
+Contents + Next: + first (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + eval (FUNCTION) +

+

evenp, oddp (PREDICATES)

+

+ Format: + (evenp <num> ) + (oddp <num> ) +

+ Required arguments: +1 +

+ <num> : any Lisp expression that evaluates to an integer. +

+Returns T if the value of <num> is even (odd); NIL otherwise. +

+ Examples: +

+

+
> (oddp 3)
+T
+
+> (oddp 68)
+NIL
+
+> (evenp 4.0)
+Error: 4.0 is not of type INTEGER.
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node95.html b/clones/colinallen.dnsalias.org/lp/node95.html new file mode 100644 index 00000000..2a2dc59a --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node95.html @@ -0,0 +1,59 @@ + + + + first (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + if (SPECIAL FORM) +Up: + Appendix: Selected Lisp + Previous: + evenpoddp (PREDICATES) +

+

first (FUNCTION)

+

+ Format: + (first <exp> ) +

+ Required arguments: +1 +

+ <exp> : any Lisp expression which returns a list +

+The argument expression must evaluate to a list; first returns the first element of this list. If the list is empty, i.e. is nil, first returns nil. +

+ Examples: +

+

+
>  (first '(1 2 3))
+1
+
+>  (first '((a (b (c)) d) e (f)))
+(A (B (C)) D)
+
+>  (first ())
+NIL
+
+>  (first 'a)
+Error: A is not of type LIST
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node96.html b/clones/colinallen.dnsalias.org/lp/node96.html new file mode 100644 index 00000000..4800d6f8 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node96.html @@ -0,0 +1,66 @@ + + + + if (SPECIAL FORM) + + + + + + +

+


+next +up +previous
+Contents + Next: + length (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + first (FUNCTION) +

+

if (SPECIAL FORM)

+

+ Format: + (if <test> + <then> + <else> ) +

+ Required arguments: +2 +

+ <test> : any Lisp expression + <then> : any Lisp expression +

+ Optional arguments: +1 +

+ <else> : any Lisp expression +

+The <test> expression is evaluated; if it returns a value other than NIL, if returns the result of evaluating the <then> expression. If <test> evaluates to NIL, and no <else> expression is provided, NIL is returned. Otherwise the result of evaluating <else> is returned. +

+ Examples: +

+

+
> (if (>  4 3) 4 3)
+4
+
+> (if (< 4 3)
+     (- 4 3)
+     (- 3 4))
+-1
+
+> (if (= 4 3) t) 
+NIL
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node97.html b/clones/colinallen.dnsalias.org/lp/node97.html new file mode 100644 index 00000000..bf994cb2 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node97.html @@ -0,0 +1,59 @@ + + + + length (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + let (SPECIAL FORM) +Up: + Appendix: Selected Lisp + Previous: + if (SPECIAL FORM) +

+

length (FUNCTION)

+

+ Format: + (length <exp> ) +

+ Required arguments: +1 +

+ <exp> must evaluate to a sequence (e.g. list, array, vector, string) +

+Returns the length of the given sequence. +

+ Examples: +

+

+
> (length '(1 2 3 4 5))
+5
+
+> (length "1 2 3 4 5")
+9
+
+> (length (make-array 3))
+3
+
+> (length nil)
+0
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node98.html b/clones/colinallen.dnsalias.org/lp/node98.html new file mode 100644 index 00000000..23a9a879 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node98.html @@ -0,0 +1,77 @@ + + + + let (SPECIAL FORM) + + + + + + +

+


+next +up +previous
+Contents + Next: + list (FUNCTION) +Up: + Appendix: Selected Lisp + Previous: + length (FUNCTION) +

+

let (SPECIAL FORM)

+

+ Format: + (let ((<var1> <init1> ) + (<var2> <init2> ) + . + . + (<varN> <initN> )) + <body> ) +

+ Required arguments: +1 +

+ ((<var> <init> )...): a list of zero or more lists having the +form (<var> ) or (<var> <init> ). <var> must be a +symbol appropriate as the name of a variable. <init> may be +any Lisp expression. +

+ Optional arguments: +arbitrary +

+ <body> : any sequence of zero or more Lisp expressions. +

+The <var> 's are established as local variables for the +expressions in <body> . If a <var> is not accompanied by an +<init> expression, it is initially bound to NIL. Otherwise, <init> +is evaluated and assigned as the value of <var> . let evaluates +all the expressions in <body> and returns the value of the last, or +NIL if there are none. +

+ Examples: +

+

+
> (let ((a)
+       (b))
+   (and (not a) (not b)))
+T
+
+> (let ((a 3)
+       (b 4))
+   (setf a (+ a b))
+   (setf b (+ a b))
+   (+ a b))
+18
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/node99.html b/clones/colinallen.dnsalias.org/lp/node99.html new file mode 100644 index 00000000..1be83eab --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/node99.html @@ -0,0 +1,60 @@ + + + + list (FUNCTION) + + + + + + +

+


+next +up +previous
+Contents + Next: + listp (PREDICATE) +Up: + Appendix: Selected Lisp + Previous: + let (SPECIAL FORM) +

+

list (FUNCTION)

+

+ Format: + (list <exp1> <exp2> ...<expN> ) +

+ Required arguments: +none +

+ Optional arguments: +arbitrary +

+ <exp1> ...<expN> : any sequence of zero or more Lisp expressions. +

+All the <arg> 's are evaluated and the resulting values are +returned as elements of a list. +

+ Examples: +

+

+
> (list 'picard 'riker 'worf 'crusher)
+(PICARD RIKER WORF CRUSHER)
+
+> (list 'picard '(riker worf crusher))
+(PICARD (RIKER WORF CRUSHER))
+
+> (list 1 (+ 1 1) (+ 1 1 1) (+ 1 1 1 1))
+(1 2 3 4)
+
+
+

+


+

+

+© Colin Allen & Maneesh Dhagat
+March 2007
+
+ diff --git a/clones/colinallen.dnsalias.org/lp/previous_motif.gif b/clones/colinallen.dnsalias.org/lp/previous_motif.gif new file mode 100644 index 0000000000000000000000000000000000000000..aef90f1fc49c1505d64c1eb51d37939837ee4639 GIT binary patch literal 220 zcmV<203-iLNk%w1VLt#E0Pz3-zrVld=jU&4Z(9HWA^8LW00000EC2ui06zd200085 zjE||y?GK}zNf>~$-n{z{YJwGn=81mem9{RpmhVghaW>?7jSaj=!fA59BIefH_>4a! zU@3e`d%LL+s>2Sc#EcXATz0KftyLUNf}!86ITqyHqds`GU W((C&R94tIc92`)LoUDvo002ANj$|?b literal 0 HcmV?d00001 diff --git a/clones/colinallen.dnsalias.org/lp/previous_motif_gr.gif b/clones/colinallen.dnsalias.org/lp/previous_motif_gr.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6acaabc97df8701d71e4407fb5851111d6e3936 GIT binary patch literal 220 zcmV<203-iLNk%w1VLt#E0Pz3-zrVld=jU&4Z-Rn?A^8LW00000EC2ui06zd200085 zjE||y?GK}zNf>~$-n{z{YJwGn=81mem9{RpmhVghaW>?7jSaj=!fA59BIefH_>4a! zU@3e`d%LL+s>2Sc#EcXATz0KftyLUNf}!86ITqyHqds`GU W((C&R94tIc92`)LoUDvo0029|S!G=S literal 0 HcmV?d00001 diff --git a/clones/colinallen.dnsalias.org/lp/relinks.html b/clones/colinallen.dnsalias.org/lp/relinks.html new file mode 100644 index 00000000..48e84c37 --- /dev/null +++ b/clones/colinallen.dnsalias.org/lp/relinks.html @@ -0,0 +1,102 @@ + + +Lisp Primer + +

+next up previous
+Contents + Next: + Preface +

+

Lisp Primer

+

Colin Allen - +Maneesh Dhagat +

copyright 1996-2006

+ +


+

Mirrors and Links

+ +There are many sites mirroring or providing links to the Lisp +Primer. Some of them are listed below. If you know of a link that is +not shown below, please send email to colallen@indiana.edu +Colin Allen. + +

Mirror sites

+ +

Europe

+Bulgaria: http://si.nbu.bg/lisp/LispPrimer/
+Bulgaria: http://www.aubg.bg/home/faculty/vkaragiozov/COS470/
+Germany: http://kogs-www.informatik.uni-hamburg.de/~moeller/Lisp-Tutorial/lp.html
+Spain: http://iahost.dis.ulpgc.es/recursos.html
+UK: http://burks.bton.ac.uk/burks/language/lisp/lprimer/lp.htm
+ + +

Africa

+South Africa: http://www.cs.wits.ac.za/~david/lisptut/
+ +

Asia

+India: http://riemann.mri.ernet.in/lisp-primer/
+Macau: http://www.sftw.umac.mo/~sftw120/lp/
+Vietnam: (Intranet only) + +

North America

+ +USA: http://ringer.cs.utsa.edu/research/AI/lisp_primer/lp.html
+USA: http://www.d.umn.edu/~tcolburn/cs5541/primer/lp.html
+USA: http://www.emunix.emich.edu/~remmers/337/
+USA: http://www.mathcs.duq.edu/simon/LispPrimer
+USA: http://www.eecs.tufts.edu/~suresh/notes/lisp_primer
+USA: http://www.cs.rit.edu/~ats/plc-2001-2/reports/lisp/
+ +

Links

+ +

Europe

+Austria: http://xarch.tu-graz.ac.at/autocad/lisp/
+Belgium: http://studwww.rug.ac.be/~wtaverni/tutorlist.html
+Finland: http://zam.ton.tut.fi/bookmark.htm
+France: http://www.cnrs-gif.fr/iaf/iaf9/surf-hippo/lisp.html
+Germany: http://www.dfki.de/~becker/lispkurs/pointer.html
+Germany: http://www.folke.purespace.de/bookm_gr.htm
+Germany: http://www.informatik.fh-muenchen.de/~ifw98070/bookmarks.html
+Germany: http://www.informatik.uni-hamburg.de/WSV/teaching/LispTutoren.html
+Germany: http://wwwcip.informatik.uni-erlangen.de/~snkreutt/lisp.html
+Norway: http://www.thingvold.no/ll/Software/Programming/Lisp/
+Poland: http://ppm.mech.pw.edu.pl/ILINKS/ppm_internet_links_alphabetical_body.htm
+Russia: http://isabase.philol.msu.ru/bookmarks.html
+Sweden: http://www.big.du.se/~markku/links.html
+Sweden: http://www.student.hig.se/~to98rtg/bookmarks.html
+Switzerland: http://n.ethz.ch/student/zmarcel/bookmarks.html
+UK: http://bubl.ac.uk/link/c/computerprogramming-lisp.htm
+UK: http://www.wildcard.demon.co.uk/nodes/Common+Lisp.html
+ + +

Asia

+China: http://www.twinbee.info/mirror/lp/
+Korea: http://candy.yonsei.ac.kr/Courses/pl/lisp/lisp.html
+Taiwan: http://www.csie.ntu.edu.tw/~ai/lisp/lisp-resources.html
+Taiwan: http://www.hello.com.tw/~weianhsu/GOODPAGE.HTML
+India: http://www.mri.ernet.in/~raghu/
+ +

Australia

+http://www.eng.jcu.edu.au/mech/staff/geordie/links/computing.html
+ +

North America

+Canada: http://www.ltc.sk.ca/online_books_page.htm
+USA: http://ai.about.com/compute/ai/msublisp.htm
+USA: http://aleph0.clarku.edu/~cpollett/cs210.html
+USA: http://benjamin.umd.edu/courses/cl/resources.html
+USA: http://devlib.virtualave.net/lisp1.html
+USA: http://dir.x13.com/Development/Languages/Lisp/Tutorials/
+USA: http://directory.google.com/Top/Computers/Programming/Languages/Lisp/Tutorials/
+USA: http://home.att.net/~gobruen/progs/lisp/
+USA: http://home.bip.net/hans_tegnerud/larry.html
+USA: http://members.home.net/draxis/hrprogramming.html
+USA: http://members.linuxstart.com/~superlinux/languages.html
+USA: http://qlink.queensu.ca/~6jmg/comp/compinfo.html
+USA: http://quick-tips.com/local-search/pages/Computers/Languages/Lisp/
+USA: http://quick-tips.com/local-search/pages/Computers/Languages/Lisp/Tutorials/
+USA: http://ringer.cs.utsa.edu/research/AI/lisp_primer/
+USA: http://web.utk.edu/~ajw/docs/bm-fromhome.html
+USA: http://www-cad.eecs.berkeley.edu/~niraj/web/links.html
+USA: http://www-eksl.cs.umass.edu/lisp-resources.html
+USA: http://www.3apes.com/Computers/Programming/Languages/Lisp/Tutorials/
diff --git a/clones/colinallen.dnsalias.org/lp/up_motif.gif b/clones/colinallen.dnsalias.org/lp/up_motif.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d1aebf32741083d8fa674a202175c1a9acccbfc GIT binary patch literal 145 zcmZ?wbhEHblwy!z_{hMpfB*jH&!6Y#=SMRzDE?$&WB>vk5CM{BU`p!gUwL|MQp21r zQ3?q={ye+UdTD#7q9yONs;rk`f0I75P5vJOBD)vk5CM{BU`p!gUwL|MQp21r zQ3?q={ye+UdTD#7q9yONs;rk`f0I75P5vJOBD)A Few FORMAT Recipes

18. A Few FORMAT Recipes

Common Lisp's FORMAT function is--along with the extended +LOOP macro--one of the two Common Lisp features that inspires a +strong emotional response in a lot of Common Lisp users. Some love it; +others hate it.1

FORMAT's fans love it for its great power and concision, while +its detractors hate it because of the potential for misuse and its +opacity. Complex FORMAT control strings sometimes bear a +suspicious resemblance to line noise, but FORMAT remains popular +with Common Lispers who like to be able to generate little bits of +human-readable output without having to clutter their code with lots +of output-generating code. While FORMAT's control strings can be +cryptic, at least a single FORMAT expression doesn't clutter +things up too badly. For instance, suppose you want to print the +values in a list delimited with commas. You could write this:

(loop for cons on list
+    do (format t "~a" (car cons))
+    when (cdr cons) do (format t ", "))

That's not too bad, but anyone reading this code has to mentally +parse it just to figure out that all it's doing is printing the +contents of list to standard output. On the other hand, you +can tell at a glance that the following expression is printing +list, in some form, to standard output:

(format t "~{~a~^, ~}" list)

If you care exactly what form the output will take, then you'll have +to examine the control string, but if all you want is a first-order +approximation of what this line of code is doing, that's immediately +available.

At any rate, you should have at least a reading knowledge of +FORMAT, and it's worth getting a sense of what it can do before +you affiliate yourself with the pro- or anti-FORMAT camp. It's +also important to understand at least the basics of FORMAT +because other standard functions, such as the condition-signaling +functions discussed in the next chapter, use FORMAT-style +control strings to generate output.

To further complicate matters, FORMAT supports three quite +different kinds of formatting: printing tables of data, +pretty-printing s-expressions, and generating human-readable +messages with interpolated values. Printing tables of data as text is +a bit passé these days; it's one of those reminders that Lisp is +nearly as old as FORTRAN. In fact, several of the directives you can +use to print floating-point values in fixed-width fields were based +quite directly on FORTRAN edit descriptors, which are used in +FORTRAN to read and print columns of data arranged in fixed-width +fields. However, using Common Lisp as a FORTRAN replacement is beyond +the scope of this book, so I won't discuss those aspects of +FORMAT.

Pretty-printing is likewise beyond the scope of this book--not +because it's passé but just because it's too big a topic. Briefly, +the Common Lisp pretty printer is a customizable system for printing +block-structured data such as--but not limited to--s-expressions +while varying indentation and dynamically adding line breaks as +needed. It's a great thing when you need it, but it's not often +needed in day-to-day programming.2

Instead, I'll focus on the parts of FORMAT you can use to +generate human-readable strings with interpolated values. Even +limiting the scope in that way, there's still a fair bit to cover. +You shouldn't feel obliged to remember every detail described in this +chapter. You can get quite far with just a few FORMAT idioms. +I'll describe the most important features of FORMAT first; it's +up to you how much of a FORMAT wizard you want to become.

The FORMAT Function

As you've seen in previous chapters, the FORMAT function takes +two required arguments: a destination for its output and a control +string that contains literal text and embedded directives. Any +additional arguments provide the values used by the directives in the +control string that interpolate values into the output. I'll refer to +these arguments as format arguments.

The first argument to FORMAT, the destination for the output, +can be T, NIL, a stream, or a string with a fill pointer. +T is shorthand for the stream *STANDARD-OUTPUT*, while +NIL causes FORMAT to generate its output to a string, which +it then returns.3 If the destination is a +stream, the output is written to the stream. And if the destination +is a string with a fill pointer, the formatted output is added to the +end of the string and the fill pointer is adjusted appropriately. +Except when the destination is NIL and it returns a string, +FORMAT returns NIL.

The second argument, the control string, is, in essence, a program in +the FORMAT language. The FORMAT language isn't Lispy at +all--its basic syntax is based on characters, not s-expressions, and +it's optimized for compactness rather than easy comprehension. This +is why a complex FORMAT control string can end up looking like +line noise.

Most of FORMAT's directives simply interpolate an argument into +the output in one form or another. Some directives, such as +~%, which causes FORMAT to emit a newline, don't consume +any arguments. And others, as you'll see, can consume more than one +argument. One directive even allows you to jump around in the list of +arguments in order to process the same argument more than once or to +skip certain arguments in certain situations. But before I discuss +specific directives, let's look at the general syntax of a directive.

FORMAT Directives

All directives start with a tilde (~) and end with a single +character that identifies the directive. You can write the character +in either upper- or lowercase. Some directives take prefix +parameters, which are written immediately following the tilde, +separated by commas, and used to control things such as how many +digits to print after the decimal point when printing a +floating-point number. For example, the ~$ directive, one of +the directives used to print floating-point values, by default prints +two digits following the decimal point.

CL-USER> (format t "~$" pi)
+3.14
+NIL

However, with a prefix parameter, you can specify that it should +print its argument to, say, five decimal places like this:

CL-USER> (format t "~5$" pi)
+3.14159
+NIL

The values of prefix parameters are either numbers, written in +decimal, or characters, written as a single quote followed by the +desired character. The value of a prefix parameter can also be +derived from the format arguments in two ways: A prefix parameter of +v causes FORMAT to consume one format argument and use +its value for the prefix parameter. And a prefix parameter of +# will be evaluated as the number of remaining format +arguments. For example:

CL-USER> (format t "~v$" 3 pi)
+3.142
+NIL
+CL-USER> (format t "~#$" pi)
+3.1
+NIL

I'll give some more realistic examples of how you can use the +# argument in the section "Conditional Formatting."

You can also omit prefix parameters altogether. However, if you want +to specify one parameter but not the ones before it, you must include +a comma for each unspecified parameter. For instance, the ~F +directive, another directive for printing floating-point values, also +takes a parameter to control the number of decimal places to print, +but it's the second parameter rather than the first. If you want to +use ~F to print a number to five decimal places, you can write +this:

CL-USER> (format t "~,5f" pi)
+3.14159
+NIL

You can also modify the behavior of some directives with colon and +at-sign modifiers, which are placed after any prefix parameters +and before the directive's identifying character. These modifiers +change the behavior of the directive in small ways. For instance, +with a colon modifier, the ~D directive used to output +integers in decimal emits the number with commas separating every +three digits, while the at-sign modifier causes ~D to include +a plus sign when the number is positive.

CL-USER> (format t "~d" 1000000)
+1000000
+NIL
+CL-USER> (format t "~:d" 1000000)
+1,000,000
+NIL
+CL-USER> (format t "~@d" 1000000)
++1000000
+NIL

When it makes sense, you can combine the colon and at-sign modifiers +to get both modifications.

CL-USER> (format t "~:@d" 1000000)
++1,000,000
+NIL

In directives where the two modified behaviors can't be meaningfully +combined, using both modifiers is either undefined or given a third +meaning.

Basic Formatting

Now you're ready to look at specific directives. I'll start with +several of the most commonly used directives, including some you've +seen in previous chapters.

The most general-purpose directive is ~A, which consumes one +format argument of any type and outputs it in aesthetic +(human-readable) form. For example, strings are output without +quotation marks or escape characters, and numbers are output in a +natural way for the type of number. If you just want to emit a value +for human consumption, this directive is your best bet.

(format nil "The value is: ~a" 10)           ==> "The value is: 10"
+(format nil "The value is: ~a" "foo")        ==> "The value is: foo"
+(format nil "The value is: ~a" (list 1 2 3)) ==> "The value is: (1 2 3)"

A closely related directive, ~S, likewise consumes one format +argument of any type and outputs it. However, ~S tries to +generate output that can be read back in with READ. Thus, +strings will be enclosed in quotation marks, symbols will be +package-qualified when necessary, and so on. Objects that don't have +a READable representation are printed with the unreadable object +syntax, #<>. With a colon modifier, both the ~A and +~S directives emit NIL as () rather than NIL. +Both the ~A and ~S directives also take up to four +prefix parameters, which can be used to control whether padding is +added after (or before with the at-sign modifier) the value, but +those parameters are only really useful for generating tabular data.

The other two most frequently used directives are ~%, which +emits a newline, and ~&, which emits a fresh line. The +difference between the two is that ~% always emits a newline, +while ~& emits one only if it's not already at the beginning +of a line. This is handy when writing loosely coupled functions that +each generate a piece of output and that need to be combined in +different ways. For instance, if one function generates output that +ends with a newline (~%) and another function generates some +output that starts with a fresh line (~&), you don't have to +worry about getting an extra blank line if you call them one after +the other. Both of these directives can take a single prefix +parameter that specifies the number of newlines to emit. The +~% directive will simply emit that many newline characters, +while the ~& directive will emit either n - 1 or n +newlines, depending on whether it starts at the beginning of a line.

Less frequently used is the related ~~ directive, which causes +FORMAT to emit a literal tilde. Like the ~% and ~& +directives, it can be parameterized with a number that controls how +many tildes to emit.

Character and Integer Directives

In addition to the general-purpose directives, ~A and +~S, FORMAT supports several directives that can be used +to emit values of specific types in particular ways. One of the +simplest of these is the ~C directive, which is used to emit +characters. It takes no prefix arguments but can be modified with the +colon and at-sign modifiers. Unmodified, its behavior is no different +from ~A except that it works only with characters. The +modified versions are more useful. With a colon modifier, ~:C +outputs nonprinting characters such as space, tab, and newline by +name. This is useful if you want to emit a message to the user about +some character. For instance, the following:

(format t "Syntax error. Unexpected character: ~:c" char)

can emit messages like this:

Syntax error. Unexpected character: a

but also like the following:

Syntax error. Unexpected character: Space

With the at-sign modifier, ~@C will emit the character in +Lisp's literal character syntax.

CL-USER> (format t "~@c~%" #\a)
+#\a
+NIL

With both the colon and at-sign modifiers, the ~C directive +can print extra information about how to enter the character at the +keyboard if it requires special key combinations. For instance, on +the Macintosh, in certain applications you can enter a null character +(character code 0 in ASCII or in any ASCII superset such as +ISO-8859-1 or Unicode) by pressing the Control key and typing @. In +OpenMCL, if you print the null character with the ~:C +directive, it tells you this:

(format nil "~:@c" (code-char 0)) ==> "^@ (Control @)"

However, not all Lisps implement this aspect of the ~C +directive. And even if they do, it may or may not be accurate--for +instance, if you're running OpenMCL in SLIME, the C-@ key +chord is intercepted by Emacs, invoking +set-mark-command.4

Format directives dedicated to emitting numbers are another important +category. While you can use the ~A and ~S directives to +emit numbers, if you want fine control over how they're printed, you +need to use one of the number-specific directives. The numeric +directives can be divided into two subcategories: directives for +formatting integer values and directives for formatting +floating-point values.

Five closely related directives format integer values: ~D, +~X, ~O, ~B, and ~R. The most frequently +used is the ~D directive, which outputs integers in base 10.

(format nil "~d" 1000000) ==> "1000000"

As I mentioned previously, with a colon modifier it adds commas.

(format nil "~:d" 1000000) ==> "1,000,000"

And with an at-sign modifier, it always prints a sign.

(format nil "~@d" 1000000) ==> "+1000000"

And the two modifiers can be combined.

(format nil "~:@d" 1000000) ==> "+1,000,000"

The first prefix parameter can specify a minimum width for the +output, and the second parameter can specify a padding character to +use. The default padding character is space, and padding is always +inserted before the number itself.

(format nil "~12d" 1000000)    ==> "     1000000"
+(format nil "~12,'0d" 1000000) ==> "000001000000"

These parameters are handy for formatting things such as dates in a +fixed-width format.

(format nil "~4,'0d-~2,'0d-~2,'0d" 2005 6 10) ==> "2005-06-10"

The third and fourth parameters are used in conjunction with the +colon modifier: the third parameter specifies the character to use as +the separator between groups and digits, and the fourth parameter +specifies the number of digits per group. These parameters default to +a comma and the number 3. Thus, you can use the directive ~:D +without parameters to output large integers in standard format for +the United States but can change the comma to a period and the +grouping from 3 to 4 with ~,,'.,4D.

(format nil "~:d" 100000000)       ==> "100,000,000"
+(format nil "~,,'.,4:d" 100000000) ==> "1.0000.0000"

Note that you must use commas to hold the places of the unspecified +width and padding character parameters, allowing them to keep their +default values.

The ~X, ~O, and ~B directives work just like the +~D directive except they emit numbers in hexadecimal (base +16), octal (base 8), and binary (base 2).

(format nil "~x" 1000000) ==> "f4240"
+(format nil "~o" 1000000) ==> "3641100"
+(format nil "~b" 1000000) ==> "11110100001001000000"

Finally, the ~R directive is the general radix directive. +Its first parameter is a number between 2 and 36 (inclusive) that +indicates what base to use. The remaining parameters are the same as +the four parameters accepted by the ~D, ~X, ~O, +and ~B directives, and the colon and at-sign modifiers modify +its behavior in the same way. The ~R directive also has some +special behavior when used with no prefix parameters, which I'll +discuss in the section "English-Language Directives."

Floating-Point Directives

Four directives format floating-point values: ~F, ~E, +~G, and ~$. The first three of these are the directives +based on FORTRAN's edit descriptors. I'll skip most of the details of +those directives since they mostly have to do with formatting +floating-point values for use in tabular form. However, you can use +the ~F, ~E, and ~$ directives to interpolate +floating-point values into text. The ~G, or general, +floating-point directive, on the other hand, combines aspects of the +~F and ~E directives in a way that only really makes +sense for generating tabular output.

The ~F directive emits its argument, which should be a +number,5 in +decimal format, possibly controlling the number of digits after the +decimal point. The ~F directive is, however, allowed to use +computerized scientific notation if the number is sufficiently large +or small. The ~E directive, on the other hand, always emits +numbers in computerized scientific notation. Both of these directives +take a number of prefix parameters, but you need to worry only about +the second, which controls the number of digits to print after the +decimal point.

(format nil "~f" pi)   ==> "3.141592653589793d0"
+(format nil "~,4f" pi) ==> "3.1416"
+(format nil "~e" pi)   ==> "3.141592653589793d+0"
+(format nil "~,4e" pi) ==> "3.1416d+0"

The ~$, or monetary, directive is similar to ~F but a +bit simpler. As its name suggests, it's intended for emitting +monetary units. With no parameters, it's basically equivalent to +~,2F. To modify the number of digits printed after the decimal +point, you use the first parameter, while the second parameter +controls the minimum number of digits to print before the decimal +point.

(format nil "~$" pi)    ==> "3.14"
+(format nil "~2,4$" pi) ==> "0003.14"

All three directives, ~F, ~E, and ~$, can be +made to always print a sign, plus or minus, with the at-sign +modifier.6

English-Language Directives

Some of the handiest FORMAT directives for generating +human-readable messages are the ones for emitting English text. These +directives allow you to emit numbers as English words, to emit plural +markers based on the value of a format argument, and to apply case +conversions to sections of FORMAT's output.

The ~R directive, which I discussed in "Character and Integer +Directives," when used with no base specified, prints numbers as +English words or Roman numerals. When used with no prefix parameter +and no modifiers, it emits the number in words as a cardinal number.

(format nil "~r" 1234) ==> "one thousand two hundred thirty-four"

With the colon modifier, it emits the number as an ordinal.

(format nil "~:r" 1234) ==> "one thousand two hundred thirty-fourth"

And with an at-sign modifier, it emits the number as a Roman numeral; +with both an at-sign and a colon, it emits "old-style" Roman +numerals in which fours and nines are written as IIII and VIIII +instead of IV and IX.

(format nil "~@r" 1234)  ==> "MCCXXXIV"
+(format nil "~:@r" 1234) ==> "MCCXXXIIII"

For numbers too large to be represented in the given form, ~R +behaves like ~D.

To help you generate messages with words properly pluralized, +FORMAT provides the ~P directive, which simply emits an +s unless the corresponding argument is 1.

(format nil "file~p" 1)  ==> "file"
+(format nil "file~p" 10) ==> "files"
+(format nil "file~p" 0)  ==> "files"

Typically, however, you'll use ~P with the colon modifier, +which causes it to reprocess the previous format argument.

(format nil "~r file~:p" 1)  ==> "one file"
+(format nil "~r file~:p" 10) ==> "ten files"
+(format nil "~r file~:p" 0)  ==> "zero files"

With the at-sign modifier, which can be combined with the colon +modifier, ~P emits either y or ies.

(format nil "~r famil~:@p" 1)  ==> "one family"
+(format nil "~r famil~:@p" 10) ==> "ten families"
+(format nil "~r famil~:@p" 0)  ==> "zero families"

Obviously, ~P can't solve all pluralization problems and is no +help for generating messages in other languages, but it's handy for +the cases it does handle. And the ~[ directive, which I'll +discuss in a moment, gives you a more flexible way to conditionalize +parts of FORMAT's output.

The last directive for dealing with emitting English text is +~(, which allows you to control the case of text in the +output. Each ~( is paired with a ~), and all the output +generated by the portion of the control string between the two +markers will be converted to all lowercase.

(format nil "~(~a~)" "FOO") ==> "foo"
+(format nil "~(~@r~)" 124)  ==> "cxxiv"

You can modify ~( with an at sign to make it capitalize the +first word in a section of text, with a colon to make it to +capitalize all words, and with both modifiers to convert all text to +uppercase. (A word for the purpose of this directive is a +sequence of alphanumeric characters delimited by nonalphanumeric +characters or the ends of the text.)

(format nil "~(~a~)" "tHe Quick BROWN foX")   ==> "the quick brown fox"
+(format nil "~@(~a~)" "tHe Quick BROWN foX")  ==> "The quick brown fox"
+(format nil "~:(~a~)" "tHe Quick BROWN foX")  ==> "The Quick Brown Fox"
+(format nil "~:@(~a~)" "tHe Quick BROWN foX") ==> "THE QUICK BROWN FOX"

Conditional Formatting

In addition to directives that interpolate arguments and modify other +output, FORMAT provides several directives that implement simple +control constructs within the control string. One of these, which you +used in Chapter 9, is the conditional directive ~[. This +directive is closed by a corresponding ~], and in between are +a number of clauses separated by ~;. The job of the ~[ +directive is to pick one of the clauses, which is then processed by +FORMAT. With no modifiers or parameters, the clause is selected +by numeric index; the ~[ directive consumes a format argument, +which should be a number, and takes the nth (zero-based) clause +where N is the value of the argument.

(format nil "~[cero~;uno~;dos~]" 0) ==> "cero"
+(format nil "~[cero~;uno~;dos~]" 1) ==> "uno"
+(format nil "~[cero~;uno~;dos~]" 2) ==> "dos"

If the value of the argument is greater than the number of clauses, +nothing is printed.

(format nil "~[cero~;uno~;dos~]" 3) ==> ""

However, if the last clause separator is ~:; instead of +~;, then the last clause serves as a default clause.

(format nil "~[cero~;uno~;dos~:;mucho~]" 3)   ==> "mucho"
+(format nil "~[cero~;uno~;dos~:;mucho~]" 100) ==> "mucho"

It's also possible to specify the clause to be selected using a +prefix parameter. While it'd be silly to use a literal value in the +control string, recall that # used as a prefix parameter means +the number of arguments remaining to be processed. Thus, you can +define a format string such as the following:

(defparameter *list-etc*
+  "~#[NONE~;~a~;~a and ~a~:;~a, ~a~]~#[~; and ~a~:;, ~a, etc~].")

and then use it like this:

(format nil *list-etc*)                ==> "NONE."
+(format nil *list-etc* 'a)             ==> "A."
+(format nil *list-etc* 'a 'b)          ==> "A and B."
+(format nil *list-etc* 'a 'b 'c)       ==> "A, B and C."
+(format nil *list-etc* 'a 'b 'c 'd)    ==> "A, B, C, etc."
+(format nil *list-etc* 'a 'b 'c 'd 'e) ==> "A, B, C, etc."

Note that the control string actually contains two ~[~] +directives--both of which use # to select the clause to use. +The first consumes between zero and two arguments, while the second +consumes one more, if available. FORMAT will silently ignore any +arguments not consumed while processing the control string.

With a colon modifier, the ~[ can contain only two clauses; +the directive consumes a single argument and processes the first +clause if the argument is NIL and the second clause is +otherwise. You used this variant of ~[ in Chapter 9 to +generate pass/fail messages, like this:

(format t "~:[FAIL~;pass~]" test-result)

Note that either clause can be empty, but the directive must contain +a ~;.

Finally, with an at-sign modifier, the ~[ directive can have +only one clause. The directive consumes one argument and, if it's +non-NIL, processes the clause after backing up to make the +argument available to be consumed again.

(format nil "~@[x = ~a ~]~@[y = ~a~]" 10 20)   ==> "x = 10 y = 20"
+(format nil "~@[x = ~a ~]~@[y = ~a~]" 10 nil)  ==> "x = 10 "
+(format nil "~@[x = ~a ~]~@[y = ~a~]" nil 20)  ==> "y = 20"
+(format nil "~@[x = ~a ~]~@[y = ~a~]" nil nil) ==> ""

Iteration

Another FORMAT directive that you've seen already, in passing, +is the iteration directive ~{. This directive tells +FORMAT to iterate over the elements of a list or over the +implicit list of the format arguments.

With no modifiers, ~{ consumes one format argument, which must +be a list. Like the ~[ directive, which is always paired with +a ~] directive, the ~{ directive is always paired with +a closing ~}. The text between the two markers is processed as +a control string, which draws its arguments from the list consumed by +the ~{ directive. FORMAT will repeatedly process this +control string for as long as the list being iterated over has +elements left. In the following example, the ~{ consumes the +single format argument, the list (1 2 3), and then processes +the control string "~a, ", repeating until all the elements of +the list have been consumed.

(format nil "~{~a, ~}" (list 1 2 3)) ==> "1, 2, 3, "

However, it's annoying that in the output the last element of the +list is followed by a comma and a space. You can fix that with the +~^ directive; within the body of a ~{ directive, the +~^ causes the iteration to stop immediately, without +processing the rest of the control string, when no elements remain in +the list. Thus, to avoid printing the comma and space after the last +element of a list, you can precede them with a ~^.

(format nil "~{~a~^, ~}" (list 1 2 3)) ==> "1, 2, 3"

The first two times through the iteration, there are still +unprocessed elements in the list when the ~^ is processed. The +third time through, however, after the ~a directive consumes +the 3, the ~^ will cause FORMAT to break out of +the iteration without printing the comma and space.

With an at-sign modifier, ~{ processes the remaining format +arguments as a list.

(format nil "~@{~a~^, ~}" 1 2 3) ==> "1, 2, 3"

Within the body of a ~{...~}, the special prefix parameter +# refers to the number of items remaining to be processed in +the list rather than the number of remaining format arguments. You +can use that, along with the ~[ directive, to print a +comma-separated list with an "and" before the last item like this:

(format nil "~{~a~#[~;, and ~:;, ~]~}" (list 1 2 3)) ==> "1, 2, and 3"

However, that doesn't really work right if the list is two items long +because it adds an extra comma.

(format nil "~{~a~#[~;, and ~:;, ~]~}" (list 1 2)) ==> "1, and 2"

You could fix that in a bunch of ways. The following takes advantage +of the behavior of ~@{ when nested inside another ~{ or +~@{ directive--it iterates over whatever items remain in the +list being iterated over by the outer ~{. You can combine that +with a ~#[ directive to make the following control string for +formatting lists according to English grammar:

(defparameter *english-list*
+  "~{~#[~;~a~;~a and ~a~:;~@{~a~#[~;, and ~:;, ~]~}~]~}")
+
+(format nil *english-list* '())        ==> ""
+(format nil *english-list* '(1))       ==> "1"
+(format nil *english-list* '(1 2))     ==> "1 and 2"
+(format nil *english-list* '(1 2 3))   ==> "1, 2, and 3"
+(format nil *english-list* '(1 2 3 4)) ==> "1, 2, 3, and 4"

While that control string verges on being "write-only" code, it's not +too hard to understand if you take it a bit at a time. The outer +~{...~} will consume and iterate over a list. The whole body +of the iteration then consists of a ~#[...~]; the output +generated each time through the iteration will thus depend on the +number of items left to be processed from the list. Splitting apart +the ~#[...~] directive on the ~; clause separators, you +can see that it's made up of four clauses, the last of which is a +default clause because it's preceded by a ~:; rather than a +plain ~;. The first clause, for when there are zero elements +to be processed, is empty, which makes sense--if there are no more +elements to be processed, the iteration would've stopped already. The +second clause handles the case of one element with a simple ~a +directive. Two elements are handled with "~a and ~a". And the +default clause, which handles three or more elements, consists of +another iteration directive, this time using ~@{ to iterate +over the remaining elements of the list being processed by the outer +~{. And the body of that iteration is the control string that +can handle a list of three or more elements correctly, which is fine +in this context. Because the ~@{ loop consumes all the +remaining list items, the outer loop iterates only once.

If you wanted to print something special such as "<empty>" when the +list was empty, you have a couple ways to do it. Perhaps the easiest +is to put the text you want into the first (zeroth) clause of the +outer ~#[ and then add a colon modifier to the closing +~} of the outer iteration--the colon forces the iteration to +be run at least once, even if the list is empty, at which point +FORMAT processes the zeroth clause of the conditional directive.

(defparameter *english-list*
+  "~{~#[<empty>~;~a~;~a and ~a~:;~@{~a~#[~;, and ~:;, ~]~}~]~:}")
+
+(format nil *english-list* '()) ==> "<empty>"

Amazingly, the ~{ directive provides even more variations with +different combinations of prefix parameters and modifiers. I won't +discuss them other than to say you can use an integer prefix +parameter to limit the maximum number of iterations and that, with a +colon modifier, each element of the list (either an actual list or +the list constructed by the ~@{ directive) must itself be a +list whose elements will then be used as arguments to the control +string in the ~:{...~} directive.

Hop, Skip, Jump

A much simpler directive is the ~* directive, which allows you +to jump around in the list of format arguments. In its basic form, +without modifiers, it simply skips the next argument, consuming it +without emitting anything. More often, however, it's used with a +colon modifier, which causes it to move backward, allowing the same +argument to be used a second time. For instance, you can use +~:* to print a numeric argument once as a word and once in +numerals like this:

(format nil "~r ~:*(~d)" 1) ==> "one (1)"

Or you could implement a directive similar to ~:P for an +irregular plural by combing ~:* with ~[.

(format nil "I saw ~r el~:*~[ves~;f~:;ves~]." 0) ==> "I saw zero elves."
+(format nil "I saw ~r el~:*~[ves~;f~:;ves~]." 1) ==> "I saw one elf."
+(format nil "I saw ~r el~:*~[ves~;f~:;ves~]." 2) ==> "I saw two elves."

In this control string, the ~R prints the format argument as a +cardinal number. Then the ~:* directive backs up so the number +is also used as the argument to the ~[ directive, selecting +between the clauses for when the number is zero, one, or anything +else.7

Within an ~{ directive, ~* skips or backs up over the +items in the list. For instance, you could print only the keys of a +plist like this:

(format nil "~{~s~*~^ ~}" '(:a 10 :b 20)) ==> ":A :B"

The ~* directive can also be given a prefix parameter. With no +modifiers or with the colon modifier, this parameter specifies the +number of arguments to move forward or backward and defaults to one. +With an at-sign modifier, the prefix parameter specifies an absolute, +zero-based index of the argument to jump to, defaulting to zero. The +at-sign variant of ~* can be useful if you want to use +different control strings to generate different messages for the same +arguments and if different messages need to use the arguments in +different orders.8

And More . . .

And there's more--I haven't mentioned the ~? directive, which +can take snippets of control strings from the format arguments or the +~/ directive, which allows you to call an arbitrary function +to handle the next format argument. And then there are all the +directives for generating tabular and pretty-printed output. But the +directives discussed in this chapter should be plenty for the time +being.

In the next chapter, you'll move onto Common Lisp's condition system, +the Common Lisp analog to other languages' exception and error +handling systems. +


1Of course, most folks realize it's not worth +getting that worked up over anything in a programming language and +use it or not without a lot of angst. On the other hand, it's +interesting that these two features are the two features in Common +Lisp that implement what are essentially domain-specific languages +using a syntax not based on s-expressions. The syntax of FORMAT's +control strings is character based, while the extended LOOP macro +can be understood only in terms of the grammar of the LOOP +keywords. That one of the common knocks on both FORMAT and +LOOP is that they "aren't Lispy enough" is evidence that Lispers +really do like the s-expression syntax.

2Readers interested in the +pretty printer may want to read the paper "XP: A Common Lisp Pretty +Printing System" by Richard Waters. It's a description of the pretty +printer that was eventually incorporated into Common Lisp. You can +download it from +ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-1102a.pdf.

3To slightly confuse matters, most other I/O +functions also accept T and NIL as stream designators +but with a different meaning: as a stream designator, T +designates the bidirectional stream *TERMINAL-IO*, while +NIL designates *STANDARD-OUTPUT* as an output stream and +*STANDARD-INPUT* as an input stream.

4This variant on the ~C directive +makes more sense on platforms like the Lisp Machines where key press +events were represented by Lisp characters.

5Technically, if the argument isn't a real number, +~F is supposed to format it as if by the ~D directive, +which in turn behaves like the ~A directive if the argument +isn't a number, but not all implementations get this right.

6Well, that's what the language standard says. For some +reason, perhaps rooted in a common ancestral code base, several +Common Lisp implementations don't implement this aspect of the +~F directive correctly.

7If you find "I saw zero elves" to be a bit clunky, you +could use a slightly more elaborate format string that makes another +use of ~:* like this:

(format nil "I saw ~[no~:;~:*~r~] el~:*~[ves~;f~:;ves~]." 0) ==> "I saw no elves."
+(format nil "I saw ~[no~:;~:*~r~] el~:*~[ves~;f~:;ves~]." 1) ==> "I saw one elf."
+(format nil "I saw ~[no~:;~:*~r~] el~:*~[ves~;f~:;ves~]." 2) ==> "I saw two elves."

8This kind of problem can arise when trying to +localize an application and translate human-readable messages into +different languages. FORMAT can help with some of these problems +but is by no means a full-blown localization system.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html b/clones/gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html new file mode 100644 index 00000000..3466d960 --- /dev/null +++ b/clones/gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html @@ -0,0 +1,460 @@ +Beyond Exception Handling: Conditions and Restarts

19. Beyond Exception Handling: Conditions and Restarts

One of Lisp's great features is its condition system. It serves a +similar purpose to the exception handling systems in Java, Python, and +C++ but is more flexible. In fact, its flexibility extends beyond +error handling--conditions are more general than exceptions in that a +condition can represent any occurrence during a program's execution +that may be of interest to code at different levels on the call stack. +For example, in the section "Other Uses for Conditions," you'll see +that conditions can be used to emit warnings without disrupting +execution of the code that emits the warning while allowing code +higher on the call stack to control whether the warning message is +printed. For the time being, however, I'll focus on error handling.

The condition system is more flexible than exception systems because +instead of providing a two-part division between the code that +signals an error1 and the code that handles it,2 the condition system splits the +responsibilities into three parts--signaling a condition, +handling it, and restarting. In this chapter, I'll describe +how you could use conditions in part of a hypothetical application +for analyzing log files. You'll see how you could use the condition +system to allow a low-level function to detect a problem while +parsing a log file and signal an error, to allow mid-level code to +provide several possible ways of recovering from such an error, and +to allow code at the highest level of the application to define a +policy for choosing which recovery strategy to use.

To start, I'll introduce some terminology: errors, as I'll use +the term, are the consequences of Murphy's law. If something can go +wrong, it will: a file that your program needs to read will be +missing, a disk that you need to write to will be full, the server +you're talking to will crash, or the network will go down. If any of +these things happen, it may stop a piece of code from doing what you +want. But there's no bug; there's no place in the code that you can +fix to make the nonexistent file exist or the disk not be full. +However, if the rest of the program is depending on the actions that +were going to be taken, then you'd better deal with the error somehow +or you will have introduced a bug. So, errors aren't caused by +bugs, but neglecting to handle an error is almost certainly a bug.

So, what does it mean to handle an error? In a well-written program, +each function is a black box hiding its inner workings. Programs are +then built out of layers of functions: high-level functions are built +on top of the lower-level functions, and so on. This hierarchy of +functionality manifests itself at runtime in the form of the call +stack: if high calls medium, which calls low, +when the flow of control is in low, it's also still in +medium and high, that is, they're still on the call +stack.

Because each function is a black box, function boundaries are an +excellent place to deal with errors. Each function--low, for +example--has a job to do. Its direct caller--medium in this +case--is counting on it to do its job. However, an error that +prevents it from doing its job puts all its callers at risk: +medium called low because it needs the work done that +low does; if that work doesn't get done, medium is in +trouble. But this means that medium's caller, high, is +also in trouble--and so on up the call stack to the very top of the +program. On the other hand, because each function is a black box, if +any of the functions in the call stack can somehow do their job +despite underlying errors, then none of the functions above it needs +to know there was a problem--all those functions care about is that +the function they called somehow did the work expected of it.

In most languages, errors are handled by returning from a failing +function and giving the caller the choice of either recovering or +failing itself. Some languages use the normal function return +mechanism, while languages with exceptions return control by +throwing or raising an exception. Exceptions are a vast +improvement over using normal function returns, but both schemes +suffer from a common flaw: while searching for a function that can +recover, the stack unwinds, which means code that might recover has +to do so without the context of what the lower-level code was trying +to do when the error actually occurred.

Consider the hypothetical call chain of high, medium, +low. If low fails and medium can't recover, the +ball is in high's court. For high to handle the error, +it must either do its job without any help from medium or +somehow change things so calling medium will work and call it +again. The first option is theoretically clean but implies a lot of +extra code--a whole extra implementation of whatever it was +medium was supposed to do. And the further the stack unwinds, +the more work that needs to be redone. The second option--patching +things up and retrying--is tricky; for high to be able to +change the state of the world so a second call into medium +won't end up causing an error in low, it'd need an unseemly +knowledge of the inner workings of both medium and low, +contrary to the notion that each function is a black box.

The Lisp Way

Common Lisp's error handling system gives you a way out of this +conundrum by letting you separate the code that actually recovers +from an error from the code that decides how to recover. Thus, you +can put recovery code in low-level functions without committing to +actually using any particular recovery strategy, leaving that +decision to code in high-level functions.

To get a sense of how this works, let's suppose you're writing an +application that reads some sort of textual log file, such as a Web +server's log. Somewhere in your application you'll have a function to +parse the individual log entries. Let's assume you'll write a +function, parse-log-entry, that will be passed a string +containing the text of a single log entry and that is supposed to +return a log-entry object representing the entry. This +function will be called from a function, parse-log-file, that +reads a complete log file and returns a list of objects representing +all the entries in the file.

To keep things simple, the parse-log-entry function will not +be required to parse incorrectly formatted entries. It will, however, +be able to detect when its input is malformed. But what should it do +when it detects bad input? In C you'd return a special value to +indicate there was a problem. In Java or Python you'd throw or raise +an exception. In Common Lisp, you signal a condition.

Conditions

A condition is an object whose class indicates the general nature +of the condition and whose instance data carries information about +the details of the particular circumstances that lead to the +condition being signaled.3 In this +hypothetical log analysis program, you might define a condition +class, malformed-log-entry-error, that parse-log-entry +will signal if it's given data it can't parse.

Condition classes are defined with the DEFINE-CONDITION macro, +which works essentially the same as DEFCLASS except that the +default superclass of classes defined with DEFINE-CONDITION is +CONDITION rather than STANDARD-OBJECT. Slots are specified +in the same way, and condition classes can singly and multiply +inherit from other classes that descend from CONDITION. But for +historical reasons, condition classes aren't required to be instances +of STANDARD-OBJECT, so some of the functions you use with +DEFCLASSed classes aren't required to work with conditions. In +particular, a condition's slots can't be accessed using +SLOT-VALUE; you must specify either a :reader option or +an :accessor option for any slot whose value you intend to +use. Likewise, new condition objects are created with +MAKE-CONDITION rather than MAKE-INSTANCE. +MAKE-CONDITION initializes the slots of the new condition based +on the :initargs it's passed, but there's no way to further +customize a condition's initialization, equivalent to +INITIALIZE-INSTANCE.4

When using the condition system for error handling, you should define +your conditions as subclasses of ERROR, a subclass of +CONDITION. Thus, you might define +malformed-log-entry-error, with a slot to hold the argument +that was passed to parse-log-entry, like this:

(define-condition malformed-log-entry-error (error)
+  ((text :initarg :text :reader text)))

Condition Handlers

In parse-log-entry you'll signal a +malformed-log-entry-error if you can't parse the log entry. +You signal errors with the function ERROR, which calls the +lower-level function SIGNAL and drops into the debugger if the +condition isn't handled. You can call ERROR two ways: you can +pass it an already instantiated condition object, or you can pass it +the name of the condition class and any initargs needed to construct +a new condition, and it will instantiate the condition for you. The +former is occasionally useful for resignaling an existing condition +object, but the latter is more concise. Thus, you could write +parse-log-entry like this, eliding the details of actually +parsing a log entry:

(defun parse-log-entry (text)
+  (if (well-formed-log-entry-p text)
+    (make-instance 'log-entry ...)
+    (error 'malformed-log-entry-error :text text)))

What happens when the error is signaled depends on the code above +parse-log-entry on the call stack. To avoid landing in the +debugger, you must establish a condition handler in one of the +functions leading to the call to parse-log-entry. When a +condition is signaled, the signaling machinery looks through a list +of active condition handlers, looking for a handler that can handle +the condition being signaled based on the condition's class. Each +condition handler consists of a type specifier indicating what types +of conditions it can handle and a function that takes a single +argument, the condition. At any given moment there can be many active +condition handlers established at various levels of the call stack. +When a condition is signaled, the signaling machinery finds the most +recently established handler whose type specifier is compatible with +the condition being signaled and calls its function, passing it the +condition object.

The handler function can then choose whether to handle the condition. +The function can decline to handle the condition by simply returning +normally, in which case control returns to the SIGNAL function, +which will search for the next most recently established handler with +a compatible type specifier. To handle the condition, the function +must transfer control out of SIGNAL via a nonlocal exit. In +the next section, you'll see how a handler can choose where to +transfer control. However, many condition handlers simply want to +unwind the stack to the place where they were established and then +run some code. The macro HANDLER-CASE establishes this kind of +condition handler. The basic form of a HANDLER-CASE is as +follows:

(handler-case expression
+  error-clause*)

where each error-clause is of the following form:

(condition-type ([var]) code)

If the expression returns normally, then its value is returned by +the HANDLER-CASE. The body of a HANDLER-CASE must be a +single expression; you can use PROGN to combine several +expressions into a single form. If, however, the expression signals a +condition that's an instance of any of the condition-types +specified in any error-clause, then the code in the appropriate +error clause is executed and its value returned by the +HANDLER-CASE. The var, if included, is the name of the +variable that will hold the condition object when the handler code is +executed. If the code doesn't need to access the condition object, +you can omit the variable name.

For instance, one way to handle the malformed-log-entry-error +signaled by parse-log-entry in its caller, +parse-log-file, would be to skip the malformed entry. In the +following function, the HANDLER-CASE expression will either +return the value returned by parse-log-entry or return +NIL if a malformed-log-entry-error is signaled. (The +it in the LOOP clause collect it is another +LOOP keyword, which refers to the value of the most recently +evaluated conditional test, in this case the value of entry.)

(defun parse-log-file (file)
+  (with-open-file (in file :direction :input)
+    (loop for text = (read-line in nil nil) while text
+       for entry = (handler-case (parse-log-entry text)
+                     (malformed-log-entry-error () nil))
+       when entry collect it)))

When parse-log-entry returns normally, its value will be +assigned to entry and collected by the LOOP. But if +parse-log-entry signals a malformed-log-entry-error, +then the error clause will return NIL, which won't be collected.

JAVA-STYLE EXCEPTON HANDLING

This version of parse-log-file has one serious deficiency: +it's doing too much. As its name suggests, the job of +parse-log-file is to parse the file and produce a list of +log-entry objects; if it can't, it's not its place to decide +what to do instead. What if you want to use parse-log-file in +an application that wants to tell the user that the log file is +corrupted or one that wants to recover from malformed entries by +fixing them up and re-parsing them? Or maybe an application is fine +with skipping them but only until a certain number of corrupted +entries have been seen.

You could try to fix this problem by moving the HANDLER-CASE to +a higher-level function. However, then you'd have no way to implement +the current policy of skipping individual entries--when the error was +signaled, the stack would be unwound all the way to the higher-level +function, abandoning the parsing of the log file altogether. What you +want is a way to provide the current recovery strategy without +requiring that it always be used.

Restarts

The condition system lets you do this by splitting the error handling +code into two parts. You place code that actually recovers from +errors into restarts, and condition handlers can then handle a +condition by invoking an appropriate restart. You can place restart +code in mid- or low-level functions, such as parse-log-file or +parse-log-entry, while moving the condition handlers into the +upper levels of the application.

To change parse-log-file so it establishes a restart instead +of a condition handler, you can change the HANDLER-CASE to a +RESTART-CASE. The form of RESTART-CASE is quite similar to +a HANDLER-CASE except the names of restarts are just names, not +necessarily the names of condition types. In general, a restart name +should describe the action the restart takes. In +parse-log-file, you can call the restart skip-log-entry +since that's what it does. The new version will look like this:

(defun parse-log-file (file)
+  (with-open-file (in file :direction :input)
+    (loop for text = (read-line in nil nil) while text
+       for entry = (restart-case (parse-log-entry text)
+                     (skip-log-entry () nil))
+       when entry collect it)))

If you invoke this version of parse-log-file on a log file +containing corrupted entries, it won't handle the error directly; +you'll end up in the debugger. However, there among the various +restarts presented by the debugger will be one called +skip-log-entry, which, if you choose it, will cause +parse-log-file to continue on its way as before. To avoid +ending up in the debugger, you can establish a condition handler that +invokes the skip-log-entry restart automatically.

The advantage of establishing a restart rather than having +parse-log-file handle the error directly is it makes +parse-log-file usable in more situations. The higher-level +code that invokes parse-log-file doesn't have to invoke the +skip-log-entry restart. It can choose to handle the error at a +higher level. Or, as I'll show in the next section, you can add +restarts to parse-log-entry to provide other recovery +strategies, and then condition handlers can choose which strategy +they want to use.

But before I can talk about that, you need to see how to set up a +condition handler that will invoke the skip-log-entry restart. +You can set up the handler anywhere in the chain of calls leading to +parse-log-file. This may be quite high up in your application, +not necessarily in parse-log-file's direct caller. For +instance, suppose the main entry point to your application is a +function, log-analyzer, that finds a bunch of logs and +analyzes them with the function analyze-log, which eventually +leads to a call to parse-log-file. Without any error handling, +it might look like this:

(defun log-analyzer ()
+  (dolist (log (find-all-logs))
+    (analyze-log log)))

The job of analyze-log is to call, directly or indirectly, +parse-log-file and then do something with the list of log +entries returned. An extremely simple version might look like this:

(defun analyze-log (log)
+  (dolist (entry (parse-log-file log))
+    (analyze-entry entry)))

where the function analyze-entry is presumably responsible for +extracting whatever information you care about from each log entry and +stashing it away somewhere.

Thus, the path from the top-level function, log-analyzer, to +parse-log-entry, which actually signals an error, is as +follows:

Assuming you always want to skip malformed log entries, you could +change this function to establish a condition handler that invokes +the skip-log-entry restart for you. However, you can't use +HANDLER-CASE to establish the condition handler because then the +stack would be unwound to the function where the HANDLER-CASE +appears. Instead, you need to use the lower-level macro +HANDLER-BIND. The basic form of HANDLER-BIND is as follows:

(handler-bind (binding*) form*)

where each binding is a list of a condition type and a handler +function of one argument. After the handler bindings, the body of the +HANDLER-BIND can contain any number of forms. Unlike the handler +code in HANDLER-CASE, the handler code must be a function +object, and it must accept a single argument. A more important +difference between HANDLER-BIND and HANDLER-CASE is that +the handler function bound by HANDLER-BIND will be run without +unwinding the stack--the flow of control will still be in the call to +parse-log-entry when this function is called. The call to +INVOKE-RESTART will find and invoke the most recently bound +restart with the given name. So you can add a handler to +log-analyzer that will invoke the skip-log-entry +restart established in parse-log-file like this:5

(defun log-analyzer ()
+  (handler-bind ((malformed-log-entry-error
+                  #'(lambda (c)
+                      (invoke-restart 'skip-log-entry))))
+    (dolist (log (find-all-logs))
+      (analyze-log log))))

In this HANDLER-BIND, the handler function is an anonymous +function that invokes the restart skip-log-entry. You could +also define a named function that does the same thing and bind it +instead. In fact, a common practice when defining a restart is to +define a function, with the same name and taking a single argument, +the condition, that invokes the eponymous restart. Such functions are +called restart functions. You could define a restart function for +skip-log-entry like this:

(defun skip-log-entry (c)
+  (invoke-restart 'skip-log-entry))

Then you could change the definition of log-analyzer to this:

(defun log-analyzer ()
+  (handler-bind ((malformed-log-entry-error #'skip-log-entry))
+    (dolist (log (find-all-logs))
+      (analyze-log log))))

As written, the skip-log-entry restart function assumes that a +skip-log-entry restart has been established. If a +malformed-log-entry-error is ever signaled by code called from +log-analyzer without a skip-log-entry having been +established, the call to INVOKE-RESTART will signal a +CONTROL-ERROR when it fails to find the skip-log-entry +restart. If you want to allow for the possibility that a +malformed-log-entry-error might be signaled from code that +doesn't have a skip-log-entry restart established, you could +change the skip-log-entry function to this:

(defun skip-log-entry (c)
+  (let ((restart (find-restart 'skip-log-entry)))
+    (when restart (invoke-restart restart))))

FIND-RESTART looks for a restart with a given name and returns +an object representing the restart if the restart is found and +NIL if not. You can invoke the restart by passing the restart +object to INVOKE-RESTART. Thus, when skip-log-entry is +bound with HANDLER-BIND, it will handle the condition by +invoking the skip-log-entry restart if one is available and +otherwise will return normally, giving other condition handlers, +bound higher on the stack, a chance to handle the condition.

Providing Multiple Restarts

Since restarts must be explicitly invoked to have any effect, you can +define multiple restarts, each providing a different recovery +strategy. As I mentioned earlier, not all log-parsing applications +will necessarily want to skip malformed entries. Some applications +might want parse-log-file to include a special kind of object +representing malformed entries in the list of log-entry +objects; other applications may have some way to repair a malformed +entry and may want a way to pass the fixed entry back to +parse-log-entry.

To allow more complex recovery protocols, restarts can take arbitrary +arguments, which are passed in the call to INVOKE-RESTART. You +can provide support for both the recovery strategies I just mentioned +by adding two restarts to parse-log-entry, each of which takes +a single argument. One simply returns the value it's passed as the +return value of parse-log-entry, while the other tries to +parse its argument in the place of the original log entry.

(defun parse-log-entry (text)
+  (if (well-formed-log-entry-p text)
+    (make-instance 'log-entry ...)
+    (restart-case (error 'malformed-log-entry-error :text text)
+      (use-value (value) value)
+      (reparse-entry (fixed-text) (parse-log-entry fixed-text)))))

The name USE-VALUE is a standard name for this kind of restart. +Common Lisp defines a restart function for USE-VALUE similar to +the skip-log-entry function you just defined. So, if you +wanted to change the policy on malformed entries to one that created +an instance of malformed-log-entry, you could change +log-analyzer to this (assuming the existence of a +malformed-log-entry class with a :text initarg):

(defun log-analyzer ()
+  (handler-bind ((malformed-log-entry-error
+                  #'(lambda (c)
+                      (use-value
+                       (make-instance 'malformed-log-entry :text (text c))))))
+    (dolist (log (find-all-logs))
+      (analyze-log log))))

You could also have put these new restarts into parse-log-file +instead of parse-log-entry. However, you generally want to put +restarts in the lowest-level code possible. It wouldn't, though, be +appropriate to move the skip-log-entry restart into +parse-log-entry since that would cause parse-log-entry +to sometimes return normally with NIL, the very thing you +started out trying to avoid. And it'd be an equally bad idea to +remove the skip-log-entry restart on the theory that the +condition handler could get the same effect by invoking the +use-value restart with NIL as the argument; that would +require the condition handler to have intimate knowledge of how the +parse-log-file works. As it stands, the skip-log-entry +is a properly abstracted part of the log-parsing API.

Other Uses for Conditions

While conditions are mainly used for error handling, they can be used +for other purposes--you can use conditions, condition handlers, and +restarts to build a variety of protocols between low- and high-level +code. The key to understanding the potential of conditions is to +understand that merely signaling a condition has no effect on the +flow of control.

The primitive signaling function SIGNAL implements the mechanism +of searching for an applicable condition handler and invoking its +handler function. The reason a handler can decline to handle a +condition by returning normally is because the call to the handler +function is just a regular function call--when the handler returns, +control passes back to SIGNAL, which then looks for another, +less recently bound handler that can handle the condition. If +SIGNAL runs out of condition handlers before the condition is +handled, it also returns normally.

The ERROR function you've been using calls SIGNAL. If the +error is handled by a condition handler that transfers control via +HANDLER-CASE or by invoking a restart, then the call to +SIGNAL never returns. But if SIGNAL returns, ERROR +invokes the debugger by calling the function stored in +*DEBUGGER-HOOK*. Thus, a call to ERROR can never return +normally; the condition must be handled either by a condition handler +or in the debugger.

Another condition signaling function, WARN, provides an example +of a different kind of protocol built on the condition system. Like +ERROR, WARN calls SIGNAL to signal a condition. But if +SIGNAL returns, WARN doesn't invoke the debugger--it prints +the condition to *ERROR-OUTPUT* and returns NIL, allowing +its caller to proceed. WARN also establishes a restart, +MUFFLE-WARNING, around the call to SIGNAL that can be used +by a condition handler to make WARN return without printing +anything. The restart function MUFFLE-WARNING finds and invokes +its eponymous restart, signaling a CONTROL-ERROR if no such +restart is available. Of course, a condition signaled with WARN +could also be handled in some other way--a condition handler could +"promote" a warning to an error by handling it as if it were an +error.

For instance, in the log-parsing application, if there were ways a +log entry could be slightly malformed but still parsable, you could +write parse-log-entry to go ahead and parse the slightly +defective entries but to signal a condition with WARN when it +did. Then the larger application could choose to let the warning +print, to muffle the warning, or to treat the warning like an error, +recovering the same way it would from a +malformed-log-entry-error.

A third error-signaling function, CERROR, provides yet another +protocol. Like ERROR, CERROR will drop you into the +debugger if the condition it signals isn't handled. But like +WARN, it establishes a restart before it signals the condition. +The restart, CONTINUE, causes CERROR to return normally--if +the restart is invoked by a condition handler, it will keep you out +of the debugger altogether. Otherwise, you can use the restart once +you're in the debugger to resume the computation immediately after +the call to CERROR. The function CONTINUE finds and invokes +the CONTINUE restart if it's available and returns NIL +otherwise.

You can also build your own protocols on SIGNAL--whenever +low-level code needs to communicate information back up the call +stack to higher-level code, the condition mechanism is a reasonable +mechanism to use. But for most purposes, one of the standard error or +warning protocols should suffice.

You'll use the condition system in future practical chapters, both +for regular error handling and, in Chapter 25, to help in handling a +tricky corner case of parsing ID3 files. Unfortunately, it's the fate +of error handling to always get short shrift in programming +texts--proper error handling, or lack thereof, is often the biggest +difference between illustrative code and hardened, production-quality +code. The trick to writing the latter has more to do with adopting a +particularly rigorous way of thinking about software than with the +details of any particular programming language constructs. That said, +if your goal is to write that kind of software, you'll find the +Common Lisp condition system is an excellent tool for writing robust +code and one that fits quite nicely into Common Lisp's incremental +development style.

Writing Robust Software

In the next chapter I'll give a quick overview of some of the 25 +special operators you haven't had a chance to use yet, at least not +directly. +


1Throws or raises an exception in +Java/Python terms

2Catches the +exception in Java/Python terms

3In this respect, a condition is a lot +like an exception in Java or Python except not all conditions +represent an error or exceptional situation.

4In some Common Lisp implementations, +conditions are defined as subclasses of STANDARD-OBJECT, in +which case SLOT-VALUE, MAKE-INSTANCE, and +INITIALIZE-INSTANCE will work, but it's not portable to rely on +it.

5The +compiler may complain if the parameter is never used. You can silence +that warning by adding a declaration (declare (ignore c)) as +the first expression in the LAMBDA body.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/beyond-lists-other-uses-for-cons-cells.html b/clones/gigamonkeys.com/book/beyond-lists-other-uses-for-cons-cells.html new file mode 100644 index 00000000..725addfc --- /dev/null +++ b/clones/gigamonkeys.com/book/beyond-lists-other-uses-for-cons-cells.html @@ -0,0 +1,335 @@ +Beyond Lists: Other Uses for Cons Cells

13. Beyond Lists: Other Uses for Cons Cells

As you saw in the previous chapter, the list data type is an illusion +created by a set of functions that manipulate cons cells. Common Lisp +also provides functions that let you treat data structures built out +of cons cells as trees, sets, and lookup tables. In this chapter I'll +give you a quick tour of some of these other data structures and the +functions for manipulating them. As with the list-manipulation +functions, many of these functions will be useful when you start +writing more complicated macros and need to manipulate Lisp code as +data.

Trees

Treating structures built from cons cells as trees is just about as +natural as treating them as lists. What is a list of lists, after +all, but another way of thinking of a tree? The difference between a +function that treats a bunch of cons cells as a list and a function +that treats the same bunch of cons cells as a tree has to do with +which cons cells the functions traverse to find the values of the +list or tree. The cons cells traversed by a list function, called the +list structure, are found by starting at the first cons cell and +following CDR references until reaching a NIL. The elements +of the list are the objects referenced by the CARs of the cons +cells in the list structure. If a cons cell in the list structure has +a CAR that references another cons cell, the referenced cons +cell is considered to be the head of a list that's an element of the +outer list.1 Tree structure, on the other hand, is traversed by +following both CAR and CDR references for as long as they +point to other cons cells. The values in a tree are thus the +atomic--non-cons-cell-values referenced by either the CARs or +the CDRs of the cons cells in the tree structure.

For instance, the following box-and-arrow diagram shows the cons +cells that make up the list of lists: ((1 2) (3 4) (5 6)). The +list structure includes only the three cons cells inside the dashed +box while the tree structure includes all the cons cells.

To see the difference between a list function and a tree function, +you can consider how the functions COPY-LIST and COPY-TREE +will copy this bunch of cons cells. COPY-LIST, as a list +function, copies the cons cells that make up the list structure. That +is, it makes a new cons cell corresponding to each of the cons cells +inside the dashed box. The CARs of each of these new cons cells +reference the same object as the CARs of the original cons cells +in the list structure. Thus, COPY-LIST doesn't copy the sublists +(1 2), (3 4), or (5 6), as shown in this +diagram:

COPY-TREE, on the other hand, makes a new cons cell for each of +the cons cells in the diagram and links them together in the same +structure, as shown in this diagram:

Where a cons cell in the original referenced an atomic value, the +corresponding cons cell in the copy will reference the same value. +Thus, the only objects referenced in common by the original tree and +the copy produced by COPY-TREE are the numbers 1-6, and the +symbol NIL.

Another function that walks both the CARs and the CDRs of a +tree of cons cells is TREE-EQUAL, which compares two trees, +considering them equal if the tree structure is the same shape and if +the leaves are EQL (or if they satisfy the test supplied with +the :test keyword argument).

Some other tree-centric functions are the tree analogs to the +SUBSTITUTE and NSUBSTITUTE sequence functions and their +-IF and -IF-NOT variants. The function SUBST, like +SUBSTITUTE, takes a new item, an old item, and a tree (as +opposed to a sequence), along with :key and :test +keyword arguments, and it returns a new tree with the same shape as +the original tree but with all instances of the old item replaced +with the new item. For example:

CL-USER> (subst 10 1 '(1 2 (3 2 1) ((1 1) (2 2))))
+(10 2 (3 2 10) ((10 10) (2 2)))

SUBST-IF is analogous to SUBSTITUTE-IF. Instead of an old +item, it takes a one-argument function--the function is called with +each atomic value in the tree, and whenever it returns true, the +position in the new tree is filled with the new value. +SUBST-IF-NOT is the same except the values where the test +returns NIL are replaced. NSUBST, NSUBST-IF, and +NSUBST-IF-NOT are the recycling versions of the SUBST +functions. As with most other recycling functions, you should use +these functions only as drop-in replacements for their nondestructive +counterparts in situations where you know there's no danger of +modifying a shared structure. In particular, you must continue to +save the return value of these functions since you have no guarantee +that the result will be EQ to the original tree.2

Sets

Sets can also be implemented in terms of cons cells. In fact, you can +treat any list as a set--Common Lisp provides several functions for +performing set-theoretic operations on lists. However, you should +bear in mind that because of the way lists are structured, these +operations get less and less efficient the bigger the sets get.

That said, using the built-in set functions makes it easy to write +set-manipulation code. And for small sets they may well be more +efficient than the alternatives. If profiling shows you that these +functions are a performance bottleneck in your code, you can always +replace the lists with sets built on top of hash tables or bit +vectors.

To build up a set, you can use the function ADJOIN. ADJOIN +takes an item and a list representing a set and returns a list +representing the set containing the item and all the items in the +original set. To determine whether the item is present, it must scan +the list; if the item isn't found, ADJOIN creates a new cons +cell holding the item and pointing to the original list and returns +it. Otherwise, it returns the original list.

ADJOIN also takes :key and :test keyword +arguments, which are used when determining whether the item is +present in the original list. Like CONS, ADJOIN has no +effect on the original list--if you want to modify a particular list, +you need to assign the value returned by ADJOIN to the place +where the list came from. The modify macro PUSHNEW does this for +you automatically.

CL-USER> (defparameter *set* ())
+*SET*
+CL-USER> (adjoin 1 *set*)
+(1)
+CL-USER> *set*
+NIL
+CL-USER> (setf *set* (adjoin 1 *set*))
+(1)
+CL-USER> (pushnew 2 *set*)
+(2 1)
+CL-USER> *set*
+(2 1)
+CL-USER> (pushnew 2 *set*)
+(2 1)

You can test whether a given item is in a set with MEMBER and +the related functions MEMBER-IF and MEMBER-IF-NOT. These +functions are similar to the sequence functions FIND, +FIND-IF, and FIND-IF-NOT except they can be used only with +lists. And instead of returning the item when it's present, they +return the cons cell containing the item--in other words, the sublist +starting with the desired item. When the desired item isn't present +in the list, all three functions return NIL.

The remaining set-theoretic functions provide bulk operations: +INTERSECTION, UNION, SET-DIFFERENCE, and +SET-EXCLUSIVE-OR. Each of these functions takes two lists and +:key and :test keyword arguments and returns a new list +representing the set resulting from performing the appropriate +set-theoretic operation on the two lists: INTERSECTION returns a +list containing all the elements found in both arguments. UNION +returns a list containing one instance of each unique element from +the two arguments.3 SET-DIFFERENCE returns a list +containing all the elements from the first argument that don't appear +in the second argument. And SET-EXCLUSIVE-OR returns a list +containing those elements appearing in only one or the other of the +two argument lists but not in both. Each of these functions also has +a recycling counterpart whose name is the same except with an N +prefix.

Finally, the function SUBSETP takes two lists and the usual +:key and :test keyword arguments and returns true if +the first list is a subset of the second--if every element in the +first list is also present in the second list. The order of the +elements in the lists doesn't matter.

CL-USER> (subsetp '(3 2 1) '(1 2 3 4))
+T
+CL-USER> (subsetp '(1 2 3 4) '(3 2 1))
+NIL

Lookup Tables: Alists and Plists

In addition to trees and sets, you can build tables that map keys to +values out of cons cells. Two flavors of cons-based lookup tables are +commonly used, both of which I've mentioned in passing in previous +chapters. They're association lists, also called alists, and +property lists, also known as plists. While you wouldn't use +either alists or plists for large tables--for that you'd use a hash +table--it's worth knowing how to work with them both because for +small tables they can be more efficient than hash tables and because +they have some useful properties of their own.

An alist is a data structure that maps keys to values and also +supports reverse lookups, finding the key when given a value. Alists +also support adding key/value mappings that shadow existing mappings +in such a way that the shadowing mapping can later be removed and the +original mappings exposed again.

Under the covers, an alist is essentially a list whose elements are +themselves cons cells. Each element can be thought of as a key/value +pair with the key in the cons cell's CAR and the value in the +CDR. For instance, the following is a box-and-arrow diagram of +an alist mapping the symbol A to the number 1, B to 2, +and C to 3:

Unless the value in the CDR is a list, cons cells representing +the key/value pairs will be dotted pairs in s-expression +notation. The alist diagramed in the previous figure, for instance, +is printed like this:

((A . 1) (B . 2) (C . 3))

The main lookup function for alists is ASSOC, which takes a key +and an alist and returns the first cons cell whose CAR matches +the key or NIL if no match is found.

CL-USER> (assoc 'a '((a . 1) (b . 2) (c . 3)))
+(A . 1)
+CL-USER> (assoc 'c '((a . 1) (b . 2) (c . 3)))
+(C . 3)
+CL-USER> (assoc 'd '((a . 1) (b . 2) (c . 3)))
+NIL

To get the value corresponding to a given key, you simply pass the +result of ASSOC to CDR.

CL-USER> (cdr (assoc 'a '((a . 1) (b . 2) (c . 3))))
+1

By default the key given is compared to the keys in the alist using +EQL, but you can change that with the standard combination of +:key and :test keyword arguments. For instance, if you +wanted to use string keys, you might write this:

CL-USER> (assoc "a" '(("a" . 1) ("b" . 2) ("c" . 3)) :test #'string=)
+("a" . 1)

Without specifying :test to be STRING=, that ASSOC +would probably return NIL because two strings with the same +contents aren't necessarily EQL.

CL-USER> (assoc "a" '(("a" . 1) ("b" . 2) ("c" . 3)))
+NIL

Because ASSOC searches the list by scanning from the front of +the list, one key/value pair in an alist can shadow other pairs with +the same key later in the list.

CL-USER> (assoc 'a '((a . 10) (a . 1) (b . 2) (c . 3)))
+(A . 10)

You can add a pair to the front of an alist with CONS like this:

(cons (cons 'new-key 'new-value) alist)

However, as a convenience, Common Lisp provides the function +ACONS, which lets you write this:

(acons 'new-key 'new-value alist)

Like CONS, ACONS is a function and thus can't modify the +place holding the alist it's passed. If you want to modify an alist, +you need to write either this:

(setf alist (acons 'new-key 'new-value alist))

or this:

(push (cons 'new-key 'new-value) alist)

Obviously, the time it takes to search an alist with ASSOC is a +function of how deep in the list the matching pair is found. In the +worst case, determining that no pair matches requires ASSOC to +scan every element of the alist. However, since the basic mechanism +for alists is so lightweight, for small tables an alist can +outperform a hash table. Also, alists give you more flexibility in +how you do the lookup. I already mentioned that ASSOC takes +:key and :test keyword arguments. When those don't suit +your needs, you may be able to use the ASSOC-IF and +ASSOC-IF-NOT functions, which return the first key/value pair +whose CAR satisfies (or not, in the case of ASSOC-IF-NOT) +the test function passed in the place of a specific item. And three +functions--RASSOC, RASSOC-IF, and RASSOC-IF-NOT--work +just like the corresponding ASSOC functions except they use the +value in the CDR of each element as the key, performing a +reverse lookup.

The function COPY-ALIST is similar to COPY-TREE except, +instead of copying the whole tree structure, it copies only the cons +cells that make up the list structure, plus the cons cells directly +referenced from the CARs of those cells. In other words, the +original alist and the copy will both contain the same objects as the +keys and values, even if those keys or values happen to be made up of +cons cells.

Finally, you can build an alist from two separate lists of keys and +values with the function PAIRLIS. The resulting alist may +contain the pairs either in the same order as the original lists or +in reverse order. For example, you may get this result:

CL-USER> (pairlis '(a b c) '(1 2 3))
+((C . 3) (B . 2) (A . 1))

Or you could just as well get this:

CL-USER> (pairlis '(a b c) '(1 2 3))
+((A . 1) (B . 2) (C . 3))

The other kind of lookup table is the property list, or plist, which +you used to represent the rows in the database in Chapter 3. +Structurally a plist is just a regular list with the keys and values +as alternating values. For instance, a plist mapping A, +B, and C, to 1, 2, and 3 is simply the list (A 1 +B 2 C 3). In boxes-and-arrows form, it looks like this:

However, plists are less flexible than alists. In fact, plists +support only one fundamental lookup operation, the function +GETF, which takes a plist and a key and returns the associated +value or NIL if the key isn't found. GETF also takes an +optional third argument, which will be returned in place of NIL +if the key isn't found.

Unlike ASSOC, which uses EQL as its default test and allows +a different test function to be supplied with a :test +argument, GETF always uses EQ to test whether the provided +key matches the keys in the plist. Consequently, you should never use +numbers or characters as keys in a plist; as you saw in Chapter 4, +the behavior of EQ for those types is essentially undefined. +Practically speaking, the keys in a plist are almost always symbols, +which makes sense since plists were first invented to implement +symbolic "properties," arbitrary mappings between names and values.

You can use SETF with GETF to set the value associated with +a given key. SETF also treats GETF a bit specially in that +the first argument to GETF is treated as the place to modify. +Thus, you can use SETF of GETF to add a new key/value pair +to an existing plist.

CL-USER> (defparameter *plist* ())
+*PLIST*
+CL-USER> *plist*
+NIL
+CL-USER> (setf (getf *plist* :a) 1)
+1
+CL-USER> *plist*
+(:A 1)
+CL-USER> (setf (getf *plist* :a) 2)
+2
+CL-USER> *plist*
+(:A 2)

To remove a key/value pair from a plist, you use the macro REMF, +which sets the place given as its first argument to a plist +containing all the key/value pairs except the one specified. It +returns true if the given key was actually found.

CL-USER> (remf *plist* :a)
+T
+CL-USER> *plist*
+NIL

Like GETF, REMF always uses EQ to compare the given +key to the keys in the plist.

Since plists are often used in situations where you want to extract +several properties from the same plist, Common Lisp provides a +function, GET-PROPERTIES, that makes it more efficient to extract +multiple values from a single plist. It takes a plist and a list of +keys to search for and returns, as multiple values, the first key +found, the corresponding value, and the head of the list starting with +the found key. This allows you to process a property list, extracting +the desired properties, without continually rescanning from the front +of the list. For instance, the following function efficiently +processes--using the hypothetical function +process-property--all the key/value pairs in a plist for a +given list of keys:

(defun process-properties (plist keys)
+  (loop while plist do
+       (multiple-value-bind (key value tail) (get-properties plist keys)
+         (when key (process-property key value))
+         (setf plist (cddr tail)))))

The last special thing about plists is the relationship they have +with symbols: every symbol object has an associated plist that can be +used to store information about the symbol. The plist can be obtained +via the function SYMBOL-PLIST. However, you rarely care about +the whole plist; more often you'll use the functions GET, which +takes a symbol and a key and is shorthand for a GETF of the same +key in the symbols SYMBOL-PLIST.

(get 'symbol 'key) === (getf (symbol-plist 'symbol) 'key)

Like GETF, GET is SETFable, so you can attach +arbitrary information to a symbol like this:

(setf (get 'some-symbol 'my-key) "information")

To remove a property from a symbol's plist, you can use either +REMF of SYMBOL-PLIST or the convenience function +REMPROP.4

(remprop 'symbol 'key) === (remf (symbol-plist 'symbol key))

Being able to attach arbitrary information to names is quite handy +when doing any kind of symbolic programming. For instance, one of the +macros you'll write in Chapter 24 will attach information to names +that other instances of the same macros will extract and use when +generating their expansions.

DESTRUCTURING-BIND

One last tool for slicing and dicing lists that I need to cover since +you'll need it in later chapters is the DESTRUCTURING-BIND +macro. This macro provides a way to destructure arbitrary lists, +similar to the way macro parameter lists can take apart their +argument list. The basic skeleton of a DESTRUCTURING-BIND is as +follows:

(destructuring-bind (parameter*) list
+  body-form*)

The parameter list can include any of the types of parameters +supported in macro parameter lists such as &optional, +&rest, and &key parameters.5 And, as in macro parameter lists, any parameter can be +replaced with a nested destructuring parameter list, which takes +apart the list that would otherwise have been bound to the replaced +parameter. The list form is evaluated once and should return a +list, which is then destructured and the appropriate values are bound +to the variables in the parameter list. Then the body-forms are +evaluated in order with those bindings in effect. Some simple +examples follow:

(destructuring-bind (x y z) (list 1 2 3)
+  (list :x x :y y :z z)) ==> (:X 1 :Y 2 :Z 3)
+
+(destructuring-bind (x y z) (list 1 (list 2 20) 3)
+  (list :x x :y y :z z)) ==> (:X 1 :Y (2 20) :Z 3)
+
+(destructuring-bind (x (y1 y2) z) (list 1 (list 2 20) 3)
+  (list :x x :y1 y1 :y2 y2 :z z)) ==> (:X 1 :Y1 2 :Y2 20 :Z 3)
+
+(destructuring-bind (x (y1 &optional y2) z) (list 1 (list 2 20) 3)
+  (list :x x :y1 y1 :y2 y2 :z z)) ==> (:X 1 :Y1 2 :Y2 20 :Z 3)
+
+(destructuring-bind (x (y1 &optional y2) z) (list 1 (list 2) 3)
+  (list :x x :y1 y1 :y2 y2 :z z)) ==> (:X 1 :Y1 2 :Y2 NIL :Z 3)
+
+(destructuring-bind (&key x y z) (list :x 1 :y 2 :z 3)
+  (list :x x :y y :z z)) ==> (:X 1 :Y 2 :Z 3)
+
+(destructuring-bind (&key x y z) (list :z 1 :y 2 :x 3)
+  (list :x x :y y :z z)) ==> (:X 3 :Y 2 :Z 1)

One kind of parameter you can use with DESTRUCTURING-BIND and +also in macro parameter lists, though I didn't mention it in Chapter +8, is a &whole parameter. If specified, it must be the first +parameter in a parameter list, and it's bound to the whole list +form.6 After a &whole parameter, other parameters +can appear as usual and will extract specific parts of the list just +as they would if the &whole parameter weren't there. An example +of using &whole with DESTRUCTURING-BIND looks like this:

(destructuring-bind (&whole whole &key x y z) (list :z 1 :y 2 :x 3)
+  (list :x x :y y :z z :whole whole))
+==> (:X 3 :Y 2 :Z 1 :WHOLE (:Z 1 :Y 2 :X 3))

You'll use a &whole parameter in one of the macros that's part +of the HTML generation library you'll develop in Chapter 31. However, +I have a few more topics to cover before you can get to that. After +two chapters on the rather Lispy topic of cons cells, you can now +turn to the more prosaic matter of how to deal with files and +filenames. +


1It's possible to build a chain of cons cells where +the CDR of the last cons cell isn't NIL but some other +atom. This is called a dotted list because the last cons is a +dotted pair.

2It may +seem that the NSUBST family of functions can and in fact does +modify the tree in place. However, there's one edge case: when the +"tree" passed is, in fact, an atom, it can't be modified in place, so +the result of NSUBST will be a different object than the +argument: (nsubst 'x 'y 'y) X.

3UNION takes only one element from each +list, but if either list contains duplicate elements, the result may +also contain duplicates.

4It's also possible to directly SETF +SYMBOL-PLIST. However, that's a bad idea, as different code may have +added different properties to the symbol's plist for different +reasons. If one piece of code clobbers the symbol's whole plist, it +may break other code that added its own properties to the plist.

5Macro parameter lists do +support one parameter type, &environment parameters, which +DESTRUCTURING-BIND doesn't. However, I didn't discuss that +parameter type in Chapter 8, and you don't need to worry about it now +either.

6When a &whole parameter is used in a macro parameter +list, the form it's bound to is the whole macro form, including the +name of the macro.

diff --git a/clones/gigamonkeys.com/book/blurbs.html b/clones/gigamonkeys.com/book/blurbs.html new file mode 100644 index 00000000..c904512e --- /dev/null +++ b/clones/gigamonkeys.com/book/blurbs.html @@ -0,0 +1,298 @@ + + + Blurbs + + + + +
“I have been complimented many times and they always + embarrass me; I always feel that they have not said enough.” + —Mark Twain
+ +

Blurbs

+ +
+ +

“that book is dead + sexy”—Xach on #lisp

+ +
+ +

“Peter Seibel offers a fresh view of Lisp and its +possibilities for elegantly solving problems. In Practical Common +Lisp, he gives enough basic information to let you quickly see the +power of the functional language paradigm. He then dazzles you with +examples that seem almost magical in their simplicity and power. This +read is pure fun from start to finish.” +—Gary Pollice, +from Dr. +Dobb's Portal, May 17, 2006 article on the 2006 Jolt +Awards

+ +
+ +

“Peter Seibel's Practical Common Lisp is just what +the title implies: an excellent introduction to Common Lisp for +someone who wants to dive in and start using the language for real +work. The book is very well written and is fun to read—at least +for those of us whose idea of fun extends to learning new programming +languages. + +

Rather than spending a lot of time on abstract discussion of +Lisp's place in the universe of programming lnaguages, Seibel dives +right in, guiding the reader through a series of programming examples +of increasing complexity. This approach places the most emphasis on +those parts of Common Lisp that skilled programmers use the most, +without getting bogged down in the odd corners of Common Lisp that +even the experts must look up in the manual. The result of Seibel's +example-driven approach is to give the reader an excellent +appreciation of the power of Common Lisp in building complex, evolving +software systems with a minimum of effort.

+ +

There are already many good books on Common Lisp that offer a +more abstract and comparative approach, but a good ‘Here's how you do +it—and why’ book, aimed at the working programmer, is a valuable +contribution, both to current Common Lisp users and those who should +be.” —Scott E. Fahlman, Research Professor of Computer +Science, Carnegie Mellon University

+ +
+ +

“This book shows the power of Lisp not only in the areas +that it has traditionally been noted for—such as developing a +complete unit test framework in only 26 lines of code—but also +in new areas such as parsing binary MP3 files, building a web +application for browsing a collection of songs, and streaming audio +over the web. Many readers will be surprised that Lisp allows you to +do all this with conciseness similar to scripting languages such as +Python, efficiency similar to C++, and unparalleled flexibility in +designing your own language extensions.” —Peter Norvig, +Director of Search Quality, Google Inc; author of +Paradigms of Artificial Intelligence Programming: Case Studies in +Common Lisp

+ +
+ +

“I wish this book had already existed when I started + learning Lisp. It's not that there aren't other good books about + (Common) Lisp out there, but none of them has such a pragmatic, + up-to-date approach. And let's not forget that Peter covers topics + like pathnames or conditions and restarts which are completely + ignored in the rest of the Lisp literature.

+ +

If you're new to Lisp and want to dive right in don't hesitate + to buy this book. Once you've read it and worked with it you can + continue with the ‘classics’ like Graham, Norvig, Keene, or + Steele.” —Edi Weitz, maintainer of + the Common Lisp Cookbook and author of CL-PPCRE regular + expression library.

+ +
+ +

“Two prehensile toes up!” —Kenny Tilton, comp.lang.lisp demon, reporting on behalf +of his development team.

+ +
+ +

“Experienced programmers learn best from examples and it +is delightful to see that Lisp is finally being served with Seibel's +example-rich tutorial text. Especially delightful is the fact that +this book includes so many examples that fall within the realm of +problems today's programmers might be called upon to tackle, such as +Web development and streaming media.—Philip +Greenspun, author of Software Engineering for Internet +Applications, MIT Department of Electrical Engineering and +Computer Science +

+ +
+ +

Practical Common Lisp is an excellent book that +covers the breadth of the Common Lisp language and also demonstrates +the unique features of Common Lisp with real-world applications that +the reader can run and extend. This book not only shows what Common +Lisp is but also why every programmer should be familiar with +Lisp.” —John Foderaro, Senior +Scientist, Franz Inc.

+ +
+ +

“The Maxima Project frequently gets queries from +potential new contributors who would like to learn Common Lisp. I am +pleased to finally have a book that I can recommend to them without +reservation. Peter Seibel's clear, direct style allows the reader to +quickly appreciate the power of Common Lisp. His many included +examples, which focus on contemporary programming problems, +demonstrate that Lisp is much more than an academic programming +language. Practical Common Lisp is a welcome addition to the +literature.” —James Amundson, Maxima +Project Leader

+ +
+ +

“I like the interspersed Practical chapters on 'real' and + useful programs. We need books of this kind telling the world that + crunching strings and numbers into trees or graphs is easily done + in Lisp.—Professor Christian Queinnec, + Universite Paris 6 (Pierre et Marie Curie)

+ +
+ +

“One of the most important parts of learning a +programming language is learning its proper programming style. This is +hard to teach, but it can be painlessly absorbed from Practical +Common Lisp. Just reading the practical examples made me a better +programmer in any language.” —Peter +Scott, Lisp programmer

+ +
+ +

“Finally, a Lisp book for the rest of us. If you want to +learn how to write a factorial function, this is not your book. Seibel +writes for the practical programmer, emphasizing the engineer/artist +over the scientist, subtly and gracefully implying the power of the +language while solving understandable real-world problems.

+ +

In most chapters, the reading of the chapter feels just like +the experience of writing a program, starting with a little +understanding, then having that understanding grow, like building the +shoulders upon which you can then stand. When Seibel introduced macros +as an aside while building a test framework, I was shocked at how such +a simple example made me really 'get' them. Narrative context is +extremely powerful and the technical books that use it are a cut +above. Congrats!” —Keith Irwin, Lisp +Programmer

+ +
+ + +

“While learning Lisp, one is often refered to the CL +HyperSpec if they do not know what a particular function does, +however, I found that I often did not 'get it' just reading the +HyperSpec. When I had a problem of this manner, I turned +to Practical Common Lisp every single time—it is by far +the most readable source on the subject that shows you how to program, +not just tell you.” —Philip +Haddad, Lisp Programmer

+ +
+ +

“With the IT world evolving at an ever increasing pace, + professionals need the most powerful tools available. This is why + Common Lisp—the most powerful, flexible, and stable programming + language ever—is seeing such a rise in popularity. Practical + Common Lisp is the long-awaited book that will help you harness + the power of Common Lisp to tackle today's complex real world + problems.” —Marc Battyani, author of + CL-PDF, CL-TYPESETTING, and mod_lisp.

+ +
+ +

“Please don't assume Common Lisp is only useful for + Databases, Unit Test Frameworks, Spam Filters, ID3 Parsers, Web + Programming, Shoutcast Servers, HTML Generation Interpreters, and + HTML Generation Compilers just because these are the only things + happened to be implemented in the book + Practical Common Lisp.—Tobias C. + Rittweiler, Lisp Programmer

+ +
+ +

“When I met Peter, who just started writing this book, I +asked to myself (not to him, of course) ‘why yet another book on +Common Lisp, when there are many nice introductory books?’ One year +later, I found a draft of the new book and recognized I was wrong. +This book is not ‘yet another’ one. The author focuses on practical +aspects rather than on technical details of the language. When I first +studied Lisp by reading an introductory book, I felt I understood the +language, but I also had an impression ‘so what?’, meaning I had no +idea about how to use it. In contrast, this book leaps into a +‘PRACTICAL’ chapter after the first few chapters that explain the very +basic notions of the language. Then the readers are expected to learn +more about the language while they are following the PRACTICAL +projects, which are combined together to form a product of a +significant size. After reading this book, the readers will feel +themselves expert programmers on Common Lisp since they have +‘finished’ a big project already. I think Lisp is the only language +that allows this type of practical introduction. Peter makes use of +this feature of the language in building up a fancy introduction on +Common Lisp.” —Taiichi Yuasa, +Professor, Department of Communications and Computer Engineering, +Kyoto University

+ +
+ +
+ +

Have something to say about this book? + Something nice? Want to see it here? Send it along + to book@gigamonkeys.com.

+ +

Back to index.

+ + + + diff --git a/clones/gigamonkeys.com/book/collections.html b/clones/gigamonkeys.com/book/collections.html new file mode 100644 index 00000000..22051fc8 --- /dev/null +++ b/clones/gigamonkeys.com/book/collections.html @@ -0,0 +1,520 @@ +Collections

11. Collections

Like most programming languages, Common Lisp provides standard data +types that collect multiple values into a single object. Every +language slices up the collection problem a little bit differently, +but the basic collection types usually boil down to an integer-indexed +array type and a table type that can be used to map more or less +arbitrary keys to values. The former are variously called arrays, +lists, or tuples; the latter go by the names hash tables, +associative arrays, maps, and dictionaries.

Lisp is, of course, famous for its list data structure, and most Lisp +books, following the ontogeny-recapitulates-phylogeny principle of +language instruction, start their discussion of Lisp's collections +with lists. However, that approach often leads readers to the +mistaken conclusion that lists are Lisp's only collection type. +To make matters worse, because Lisp's lists are such a flexible data +structure, it is possible to use them for many of the things +arrays and hash tables are used for in other languages. But it's a +mistake to focus too much on lists; while they're a crucial data +structure for representing Lisp code as Lisp data, in many situations +other data structures are more appropriate.

To keep lists from stealing the show, in this chapter I'll focus on +Common Lisp's other collection types: vectors and hash +tables.1 However, +vectors and lists share enough characteristics that Common Lisp +treats them both as subtypes of a more general abstraction, the +sequence. Thus, you can use many of the functions I'll discuss in +this chapter with both vectors and lists.

Vectors

Vectors are Common Lisp's basic integer-indexed collection, and they +come in two flavors. Fixed-size vectors are a lot like arrays in a +language such as Java: a thin veneer over a chunk of contiguous +memory that holds the vector's elements.2 Resizable vectors, on the other hand, +are more like arrays in Perl or Ruby, lists in Python, or the +ArrayList class in Java: they abstract the actual storage, allowing +the vector to grow and shrink as elements are added and removed.

You can make fixed-size vectors containing specific values with the +function VECTOR, which takes any number of arguments and returns +a freshly allocated fixed-size vector containing those arguments.

(vector)     ==> #()
+(vector 1)   ==> #(1)
+(vector 1 2) ==> #(1 2)

The #(...) syntax is the literal notation for vectors used by +the Lisp printer and reader. This syntax allows you to save and +restore vectors by PRINTing them out and READing them back +in. You can use the #(...) syntax to include literal vectors +in your code, but as the effects of modifying literal objects aren't +defined, you should always use VECTOR or the more general +function MAKE-ARRAY to create vectors you plan to modify.

MAKE-ARRAY is more general than VECTOR since you can use it +to create arrays of any dimensionality as well as both fixed-size and +resizable vectors. The one required argument to MAKE-ARRAY is a +list containing the dimensions of the array. Since a vector is a +one-dimensional array, this list will contain one number, the size of +the vector. As a convenience, MAKE-ARRAY will also accept a +plain number in the place of a one-item list. With no other +arguments, MAKE-ARRAY will create a vector with uninitialized +elements that must be set before they can be accessed.3 To create a +vector with the elements all set to a particular value, you can pass +an :initial-element argument. Thus, to make a five-element +vector with its elements initialized to NIL, you can write the +following:

(make-array 5 :initial-element nil) ==> #(NIL NIL NIL NIL NIL)

MAKE-ARRAY is also the function to use to make a resizable +vector. A resizable vector is a slightly more complicated object than +a fixed-size vector; in addition to keeping track of the memory used +to hold the elements and the number of slots available, a resizable +vector also keeps track of the number of elements actually stored in +the vector. This number is stored in the vector's fill pointer, +so called because it's the index of the next position to be filled +when you add an element to the vector.

To make a vector with a fill pointer, you pass MAKE-ARRAY a +:fill-pointer argument. For instance, the following call to +MAKE-ARRAY makes a vector with room for five elements; but it +looks empty because the fill pointer is zero:

(make-array 5 :fill-pointer 0) ==> #()

To add an element to the end of a resizable vector, you can use the +function VECTOR-PUSH. It adds the element at the current value +of the fill pointer and then increments the fill pointer by one, +returning the index where the new element was added. The function +VECTOR-POP returns the most recently pushed item, decrementing +the fill pointer in the process.

(defparameter *x* (make-array 5 :fill-pointer 0))
+
+(vector-push 'a *x*) ==> 0
+*x*                  ==> #(A)
+(vector-push 'b *x*) ==> 1
+*x*                  ==> #(A B)
+(vector-push 'c *x*) ==> 2
+*x*                  ==> #(A B C)
+(vector-pop *x*)     ==> C
+*x*                  ==> #(A B)
+(vector-pop *x*)     ==> B
+*x*                  ==> #(A)
+(vector-pop *x*)     ==> A
+*x*                  ==> #()

However, even a vector with a fill pointer isn't completely +resizable. The vector *x* can hold at most five elements. To +make an arbitrarily resizable vector, you need to pass +MAKE-ARRAY another keyword argument: :adjustable.

(make-array 5 :fill-pointer 0 :adjustable t) ==> #()

This call makes an adjustable vector whose underlying memory can +be resized as needed. To add elements to an adjustable vector, you +use VECTOR-PUSH-EXTEND, which works just like VECTOR-PUSH +except it will automatically expand the array if you try to push an +element onto a full vector--one whose fill pointer is equal to the +size of the underlying storage.4

Subtypes of Vector

All the vectors you've dealt with so far have been general +vectors that can hold any type of object. It's also possible to +create specialized vectors that are restricted to holding certain +types of elements. One reason to use specialized vectors is they may +be stored more compactly and can provide slightly faster access to +their elements than general vectors. However, for the moment let's +focus on a couple kinds of specialized vectors that are important +data types in their own right.

One of these you've seen already--strings are vectors specialized to +hold characters. Strings are important enough to get their own +read/print syntax (double quotes) and the set of string-specific +functions I discussed in the previous chapter. But because they're +also vectors, all the functions I'll discuss in the next few sections +that take vector arguments can also be used with strings. These +functions will fill out the string library with functions for things +such as searching a string for a substring, finding occurrences of a +character within a string, and more.

Literal strings, such as "foo", are like literal vectors +written with the #() syntax--their size is fixed, and they +must not be modified. However, you can use MAKE-ARRAY to make +resizable strings by adding another keyword argument, +:element-type. This argument takes a type descriptor. I +won't discuss all the possible type descriptors you can use here; for +now it's enough to know you can create a string by passing the symbol +CHARACTER as the :element-type argument. Note that you +need to quote the symbol to prevent it from being treated as a +variable name. For example, to make an initially empty but resizable +string, you can write this:

(make-array 5 :fill-pointer 0 :adjustable t :element-type 'character)  ""

Bit vectors--vectors whose elements are all zeros or ones--also get +some special treatment. They have a special read/print syntax that +looks like #*00001111 and a fairly large library of functions, +which I won't discuss, for performing bit-twiddling operations such +as "anding" together two bit arrays. The type descriptor to pass as +the :element-type to create a bit vector is the symbol +BIT.

Vectors As Sequences

As mentioned earlier, vectors and lists are the two concrete subtypes +of the abstract type sequence. All the functions I'll discuss in +the next few sections are sequence functions; in addition to being +applicable to vectors--both general and specialized--they can also be +used with lists.

The two most basic sequence functions are LENGTH, which returns +the length of a sequence, and ELT, which allows you to access +individual elements via an integer index. LENGTH takes a +sequence as its only argument and returns the number of elements it +contains. For vectors with a fill pointer, this will be the value of +the fill pointer. ELT, short for element, takes a sequence +and an integer index between zero (inclusive) and the length of the +sequence (exclusive) and returns the corresponding element. ELT +will signal an error if the index is out of bounds. Like LENGTH, +ELT treats a vector with a fill pointer as having the length +specified by the fill pointer.

(defparameter *x* (vector 1 2 3))
+
+(length *x*) ==> 3
+(elt *x* 0)  ==> 1
+(elt *x* 1)  ==> 2
+(elt *x* 2)  ==> 3
+(elt *x* 3)  ==> error

ELT is also a SETFable place, so you can set the value of a +particular element like this:

(setf (elt *x* 0) 10)
+
+*x* ==> #(10 2 3)

Sequence Iterating Functions

While in theory all operations on sequences boil down to some +combination of LENGTH, ELT, and SETF of ELT +operations, Common Lisp provides a large library of sequence +functions.

One group of sequence functions allows you to express certain +operations on sequences such as finding or filtering specific +elements without writing explicit loops. Table 11-1 summarizes them.

Table 11-1.Basic Sequence Functions

NameRequired ArgumentsReturns
COUNTItem and sequenceNumber of times item appears in sequence
FINDItem and sequenceItem or NIL
POSITIONItem and sequenceIndex into sequence or NIL
REMOVEItem and sequenceSequence with instances of item removed
SUBSTITUTENew item, item, and sequenceSequence with instances of item replaced with new item

Here are some simple examples of how to use these functions:

(count 1 #(1 2 1 2 3 1 2 3 4))         ==> 3
+(remove 1 #(1 2 1 2 3 1 2 3 4))        ==> #(2 2 3 2 3 4)
+(remove 1 '(1 2 1 2 3 1 2 3 4))        ==> (2 2 3 2 3 4)
+(remove #\a "foobarbaz")               ==> "foobrbz"
+(substitute 10 1 #(1 2 1 2 3 1 2 3 4)) ==> #(10 2 10 2 3 10 2 3 4)
+(substitute 10 1 '(1 2 1 2 3 1 2 3 4)) ==> (10 2 10 2 3 10 2 3 4)
+(substitute #\x #\b "foobarbaz")       ==> "fooxarxaz"
+(find 1 #(1 2 1 2 3 1 2 3 4))          ==> 1
+(find 10 #(1 2 1 2 3 1 2 3 4))         ==> NIL
+(position 1 #(1 2 1 2 3 1 2 3 4))      ==> 0

Note how REMOVE and SUBSTITUTE always return a sequence of +the same type as their sequence argument.

You can modify the behavior of these five functions in a variety of +ways using keyword arguments. For instance, these functions, by +default, look for elements in the sequence that are the same object +as the item argument. You can change this in two ways: First, you can +use the :test keyword to pass a function that accepts two +arguments and returns a boolean. If provided, it will be used to +compare item to each element instead of the default object +equality test, EQL.5 Second, with the :key keyword you can pass a one-argument +function to be called on each element of the sequence to extract a +key value, which will then be compared to the item in the place of +the element itself. Note, however, that functions such as FIND +that return elements of the sequence continue to return the actual +element, not just the extracted key.

(count "foo" #("foo" "bar" "baz") :test #'string=)    ==> 1
+(find 'c #((a 10) (b 20) (c 30) (d 40)) :key #'first) ==> (C 30)

To limit the effects of these functions to a particular subsequence +of the sequence argument, you can provide bounding indices with +:start and :end arguments. Passing NIL for +:end or omitting it is the same as specifying the length of +the sequence.6

If a non-NIL :from-end argument is provided, then the +elements of the sequence will be examined in reverse order. By itself +:from-end can affect the results of only FIND and +POSITION. For instance:

(find 'a #((a 10) (b 20) (a 30) (b 40)) :key #'first)             ==> (A 10)
+(find 'a #((a 10) (b 20) (a 30) (b 40)) :key #'first :from-end t) ==> (A 30)

However, the :from-end argument can affect REMOVE and +SUBSTITUTE in conjunction with another keyword parameter, +:count, that's used to specify how many elements to remove or +substitute. If you specify a :count lower than the number of +matching elements, then it obviously matters which end you start +from:

(remove #\a "foobarbaz" :count 1)             ==> "foobrbaz"
+(remove #\a "foobarbaz" :count 1 :from-end t) ==> "foobarbz"

And while :from-end can't change the results of the COUNT +function, it does affect the order the elements are passed to any +:test and :key functions, which could possibly have +side effects. For example:

CL-USER> (defparameter *v* #((a 10) (b 20) (a 30) (b 40)))
+*V*
+CL-USER> (defun verbose-first (x) (format t "Looking at ~s~%" x) (first x))
+VERBOSE-FIRST
+CL-USER> (count 'a *v* :key #'verbose-first)
+Looking at (A 10)
+Looking at (B 20)
+Looking at (A 30)
+Looking at (B 40)
+2
+CL-USER> (count 'a *v* :key #'verbose-first :from-end t)
+Looking at (B 40)
+Looking at (A 30)
+Looking at (B 20)
+Looking at (A 10)
+2

Table 11-2 summarizes these arguments.

Table 11-2. Standard Sequence Function Keyword Arguments

ArgumentMeaningDefault
:testTwo-argument function used to compare item (or value extracted by :key function) to element.EQL
:keyOne-argument function to extract key value from actual sequence element. NIL means use element as is.NIL
:startStarting index (inclusive) of subsequence.0
:endEnding index (exclusive) of subsequence. NIL indicates end of sequence.NIL
:from-endIf true, the sequence will be traversed in reverse order, from end to start.NIL
:countNumber indicating the number of elements to remove or substitute or NIL to indicate all (REMOVE and SUBSTITUTE only).NIL

Higher-Order Function Variants

For each of the functions just discussed, Common Lisp provides two +higher-order function variants that, in the place of the item +argument, take a function to be called on each element of the +sequence. One set of variants are named the same as the basic +function with an -IF appended. These functions count, find, +remove, and substitute elements of the sequence for which the +function argument returns true. The other set of variants are named +with an -IF-NOT suffix and count, find, remove, and substitute +elements for which the function argument does not return true.

(count-if #'evenp #(1 2 3 4 5))         ==> 2
+
+(count-if-not #'evenp #(1 2 3 4 5))     ==> 3
+
+(position-if #'digit-char-p "abcd0001") ==> 4
+
+(remove-if-not #'(lambda (x) (char= (elt x 0) #\f))
+  #("foo" "bar" "baz" "foom")) ==> #("foo" "foom")

According to the language standard, the -IF-NOT variants are +deprecated. However, that deprecation is generally considered to have +itself been ill-advised. If the standard is ever revised, it's more +likely the deprecation will be removed than the -IF-NOT +functions. For one thing, the REMOVE-IF-NOT variant is probably +used more often than REMOVE-IF. Despite its negative-sounding +name, REMOVE-IF-NOT is actually the positive variant--it returns +the elements that do satisfy the predicate. 7

The -IF and -IF-NOT variants accept all the same +keyword arguments as their vanilla counterparts except for +:test, which isn't needed since the main argument is already a +function.8 With a :key argument, the value extracted by the :key +function is passed to the function instead of the actual element.

(count-if #'evenp #((1 a) (2 b) (3 c) (4 d) (5 e)) :key #'first)     ==> 2
+
+(count-if-not #'evenp #((1 a) (2 b) (3 c) (4 d) (5 e)) :key #'first) ==> 3
+
+(remove-if-not #'alpha-char-p
+  #("foo" "bar" "1baz") :key #'(lambda (x) (elt x 0))) ==> #("foo" "bar")

The REMOVE family of functions also support a fourth variant, +REMOVE-DUPLICATES, that has only one required argument, a +sequence, from which it removes all but one instance of each +duplicated element. It takes the same keyword arguments as +REMOVE, except for :count, since it always removes all +duplicates.

(remove-duplicates #(1 2 1 2 3 1 2 3 4)) ==> #(1 2 3 4)

Whole Sequence Manipulations

A handful of functions perform operations on a whole sequence (or +sequences) at a time. These tend to be simpler than the other +functions I've described so far. For instance, COPY-SEQ and +REVERSE each take a single argument, a sequence, and each +returns a new sequence of the same type. The sequence returned by +COPY-SEQ contains the same elements as its argument while the +sequence returned by REVERSE contains the same elements but in +reverse order. Note that neither function copies the elements +themselves--only the returned sequence is a new object.

The CONCATENATE function creates a new sequence containing the +concatenation of any number of sequences. However, unlike +REVERSE and COPY-SEQ, which simply return a sequence of the +same type as their single argument, CONCATENATE must be told +explicitly what kind of sequence to produce in case the arguments are +of different types. Its first argument is a type descriptor, like the +:element-type argument to MAKE-ARRAY. In this case, the +type descriptors you'll most likely use are the symbols VECTOR, +LIST, or STRING.9 For example:

(concatenate 'vector #(1 2 3) '(4 5 6))    ==> #(1 2 3 4 5 6)
+(concatenate 'list #(1 2 3) '(4 5 6))      ==> (1 2 3 4 5 6)
+(concatenate 'string "abc" '(#\d #\e #\f)) ==> "abcdef"

Sorting and Merging

The functions SORT and STABLE-SORT provide two ways of +sorting a sequence. They both take a sequence and a two-argument +predicate and return a sorted version of the sequence.

(sort (vector "foo" "bar" "baz") #'string<) ==> #("bar" "baz" "foo")

The difference is that STABLE-SORT is guaranteed to not reorder +any elements considered equivalent by the predicate while SORT +guarantees only that the result is sorted and may reorder equivalent +elements.

Both these functions are examples of what are called destructive +functions. Destructive functions are allowed--typically for reasons +of efficiency--to modify their arguments in more or less arbitrary +ways. This has two implications: one, you should always do something +with the return value of these functions (such as assign it to a +variable or pass it to another function), and, two, unless you're +done with the object you're passing to the destructive function, you +should pass a copy instead. I'll say more about destructive functions +in the next chapter.

Typically you won't care about the unsorted version of a sequence +after you've sorted it, so it makes sense to allow SORT and +STABLE-SORT to destroy the sequence in the course of sorting it. +But it does mean you need to remember to write the +following:10

(setf my-sequence (sort my-sequence #'string<))

rather than just this:

(sort my-sequence #'string<)

Both these functions also take a keyword argument, :key, +which, like the :key argument in other sequence functions, +should be a function and will be used to extract the values to be +passed to the sorting predicate in the place of the actual elements. +The extracted keys are used only to determine the ordering of +elements; the sequence returned will contain the actual elements of +the argument sequence.

The MERGE function takes two sequences and a predicate and +returns a sequence produced by merging the two sequences, according +to the predicate. It's related to the two sorting functions in that +if each sequence is already sorted by the same predicate, then the +sequence returned by MERGE will also be sorted. Like the sorting +functions, MERGE takes a :key argument. Like +CONCATENATE, and for the same reason, the first argument to +MERGE must be a type descriptor specifying the type of sequence +to produce.

(merge 'vector #(1 3 5) #(2 4 6) #'<) ==> #(1 2 3 4 5 6)
+(merge 'list #(1 3 5) #(2 4 6) #'<)   ==> (1 2 3 4 5 6)

Subsequence Manipulations

Another set of functions allows you to manipulate subsequences of +existing sequences. The most basic of these is SUBSEQ, which +extracts a subsequence starting at a particular index and continuing +to a particular ending index or the end of the sequence. For +instance:

(subseq "foobarbaz" 3)   ==> "barbaz"
+(subseq "foobarbaz" 3 6) ==> "bar"

SUBSEQ is also SETFable, but it won't extend or shrink a +sequence; if the new value and the subsequence to be replaced are +different lengths, the shorter of the two determines how many +characters are actually changed.

(defparameter *x* (copy-seq "foobarbaz"))
+
+(setf (subseq *x* 3 6) "xxx")  ; subsequence and new value are same length
+*x* ==> "fooxxxbaz"
+
+(setf (subseq *x* 3 6) "abcd") ; new value too long, extra character ignored.
+*x* ==> "fooabcbaz"
+
+(setf (subseq *x* 3 6) "xx")   ; new value too short, only two characters changed
+*x* ==> "fooxxcbaz"

You can use the FILL function to set multiple elements of a +sequence to a single value. The required arguments are a sequence and +the value with which to fill it. By default every element of the +sequence is set to the value; :start and :end keyword +arguments can limit the effects to a given subsequence.

If you need to find a subsequence within a sequence, the SEARCH +function works like POSITION except the first argument is a +sequence rather than a single item.

(position #\b "foobarbaz") ==> 3
+(search "bar" "foobarbaz") ==> 3

On the other hand, to find where two sequences with a common prefix +first diverge, you can use the MISMATCH function. It takes two +sequences and returns the index of the first pair of mismatched +elements.

(mismatch "foobarbaz" "foom") ==> 3

It returns NIL if the strings match. MISMATCH also takes +many of the standard keyword arguments: a :key argument for +specifying a function to use to extract the values to be compared; a +:test argument to specify the comparison function; and +:start1, :end1, :start2, and :end2 +arguments to specify subsequences within the two sequences. And a +:from-end argument of T specifies the sequences should be +searched in reverse order, causing MISMATCH to return the index, +in the first sequence, where whatever common suffix the two sequences +share begins.

(mismatch "foobar" "bar" :from-end t) ==> 3

Sequence Predicates

Four other handy functions are EVERY, SOME, NOTANY, +and NOTEVERY, which iterate over sequences testing a boolean +predicate. The first argument to all these functions is the +predicate, and the remaining arguments are sequences. The predicate +should take as many arguments as the number of sequences passed. The +elements of the sequences are passed to the predicate--one element +from each sequence--until one of the sequences runs out of elements +or the overall termination test is met: EVERY terminates, +returning false, as soon as the predicate fails. If the predicate is +always satisfied, it returns true. SOME returns the first +non-NIL value returned by the predicate or returns false if the +predicate is never satisfied. NOTANY returns false as soon as +the predicate is satisfied or true if it never is. And NOTEVERY +returns true as soon as the predicate fails or false if the predicate +is always satisfied. Here are some examples of testing just one +sequence:

(every #'evenp #(1 2 3 4 5))    ==> NIL
+(some #'evenp #(1 2 3 4 5))     ==> T
+(notany #'evenp #(1 2 3 4 5))   ==> NIL
+(notevery #'evenp #(1 2 3 4 5)) ==> T

These calls compare elements of two sequences pairwise:

(every #'> #(1 2 3 4) #(5 4 3 2))    ==> NIL
+(some #'> #(1 2 3 4) #(5 4 3 2))     ==> T
+(notany #'> #(1 2 3 4) #(5 4 3 2))   ==> NIL
+(notevery #'> #(1 2 3 4) #(5 4 3 2)) ==> T

Sequence Mapping Functions

Finally, the last of the sequence functions are the generic mapping +functions. MAP, like the sequence predicate functions, takes a +n-argument function and n sequences. But instead of a boolean +value, MAP returns a new sequence containing the result of +applying the function to subsequent elements of the sequences. Like +CONCATENATE and MERGE, MAP needs to be told what kind +of sequence to create.

(map 'vector #'* #(1 2 3 4 5) #(10 9 8 7 6)) ==> #(10 18 24 28 30)

MAP-INTO is like MAP except instead of producing a new +sequence of a given type, it places the results into a sequence +passed as the first argument. This sequence can be the same as one of +the sequences providing values for the function. For instance, to sum +several vectors--a, b, and c--into one, you +could write this:

(map-into a #'+ a b c)

If the sequences are different lengths, MAP-INTO affects only as +many elements as are present in the shortest sequence, including the +sequence being mapped into. However, if the sequence being mapped +into is a vector with a fill pointer, the number of elements affected +isn't limited by the fill pointer but rather by the actual size of +the vector. After a call to MAP-INTO, the fill pointer will be +set to the number of elements mapped. MAP-INTO won't, however, +extend an adjustable vector.

The last sequence function is REDUCE, which does another kind of +mapping: it maps over a single sequence, applying a two-argument +function first to the first two elements of the sequence and then to +the value returned by the function and subsequent elements of the +sequence. Thus, the following expression sums the numbers from one to +ten:

(reduce #'+ #(1 2 3 4 5 6 7 8 9 10)) ==> 55

REDUCE is a surprisingly useful function--whenever you need to +distill a sequence down to a single value, chances are you can write +it with REDUCE, and it will often be quite a concise way to +express what you want. For instance, to find the maximum value in a +sequence of numbers, you can write (reduce #'max numbers). +REDUCE also takes a full complement of keyword arguments +(:key, :from-end, :start, and :end) and +one unique to REDUCE (:initial-value). The latter +specifies a value that's logically placed before the first element of +the sequence (or after the last if you also specify a true +:from-end argument).

Hash Tables

The other general-purpose collection provided by Common Lisp is the +hash table. Where vectors provide an integer-indexed data structure, +hash tables allow you to use arbitrary objects as the indexes, or +keys. When you add a value to a hash table, you store it under a +particular key. Later you can use the same key to retrieve the value. +Or you can associate a new value with the same key--each key maps to +a single value.

With no arguments MAKE-HASH-TABLE makes a hash table that +considers two keys equivalent if they're the same object according to +EQL. This is a good default unless you want to use strings as +keys, since two strings with the same contents aren't necessarily +EQL. In that case you'll want a so-called EQUAL hash table, +which you can get by passing the symbol EQUAL as the +:test keyword argument to MAKE-HASH-TABLE. Two other +possible values for the :test argument are the symbols EQ +and EQUALP. These are, of course, the names of the standard +object comparison functions, which I discussed in Chapter 4. However, +unlike the :test argument passed to sequence functions, +MAKE-HASH-TABLE's :test can't be used to specify an +arbitrary function--only the values EQ, EQL, EQUAL, +and EQUALP. This is because hash tables actually need two +functions, an equivalence function and a hash function that +computes a numerical hash code from the key in a way compatible with +how the equivalence function will ultimately compare two keys. +However, although the language standard provides only for hash tables +that use the standard equivalence functions, most implementations +provide some mechanism for defining custom hash tables.

The GETHASH function provides access to the elements of a hash +table. It takes two arguments--a key and the hash table--and returns +the value, if any, stored in the hash table under that key or +NIL.11 For example:

(defparameter *h* (make-hash-table))
+
+(gethash 'foo *h*) ==> NIL
+
+(setf (gethash 'foo *h*) 'quux)
+
+(gethash 'foo *h*) ==> QUUX

Since GETHASH returns NIL if the key isn't present in the +table, there's no way to tell from the return value the difference +between a key not being in a hash table at all and being in the table +with the value NIL. GETHASH solves this problem with a +feature I haven't discussed yet--multiple return values. GETHASH +actually returns two values; the primary value is the value stored +under the given key or NIL. The secondary value is a boolean +indicating whether the key is present in the hash table. Because of +the way multiple values work, the extra return value is silently +discarded unless the caller explicitly handles it with a form that can +"see" multiple values.

I'll discuss multiple return values in greater detail in Chapter 20, +but for now I'll give you a sneak preview of how to use the +MULTIPLE-VALUE-BIND macro to take advantage of GETHASH's +extra return value. MULTIPLE-VALUE-BIND creates variable +bindings like LET does, filling them with the multiple values +returned by a form.

The following function shows how you might use +MULTIPLE-VALUE-BIND; the variables it binds are value and +present:

(defun show-value (key hash-table)
+  (multiple-value-bind (value present) (gethash key hash-table)
+    (if present
+      (format nil "Value ~a actually present." value)
+      (format nil "Value ~a because key not found." value))))
+
+(setf (gethash 'bar *h*) nil) ; provide an explicit value of NIL
+
+(show-value 'foo *h*) ==> "Value QUUX actually present."
+(show-value 'bar *h*) ==> "Value NIL actually present."
+(show-value 'baz *h*) ==> "Value NIL because key not found."

Since setting the value under a key to NIL leaves the key in the +table, you'll need another function to completely remove a key/value +pair. REMHASH takes the same arguments as GETHASH and +removes the specified entry. You can also completely clear a hash +table of all its key/value pairs with CLRHASH.

Hash Table Iteration

Common Lisp provides a couple ways to iterate over the entries in a +hash table. The simplest of these is via the function MAPHASH. +Analogous to the MAP function, MAPHASH takes a two-argument +function and a hash table and invokes the function once for each +key/value pair in the hash table. For instance, to print all the +key/value pairs in a hash table, you could use MAPHASH like +this:

(maphash #'(lambda (k v) (format t "~a => ~a~%" k v)) *h*)

The consequences of adding or removing elements from a hash table +while iterating over it aren't specified (and are likely to be bad) +with two exceptions: you can use SETF with GETHASH to +change the value of the current entry, and you can use REMHASH +to remove the current entry. For instance, to remove all the entries +whose value is less than ten, you could write this:

(maphash #'(lambda (k v) (when (< v 10) (remhash k *h*))) *h*)

The other way to iterate over a hash table is with the extended +LOOP macro, which I'll discuss in Chapter 22.12 The LOOP equivalent of the first MAPHASH +expression would look like this:

(loop for k being the hash-keys in *h* using (hash-value v)
+  do (format t "~a => ~a~%" k v))

I could say a lot more about the nonlist collections supported by +Common Lisp. For instance, I haven't discussed multidimensional +arrays at all or the library of functions for manipulating bit +arrays. However, what I've covered in this chapter should suffice for +most of your general-purpose programming needs. Now it's finally time +to look at Lisp's eponymous data structure: lists. +


1Once you're familiar with all the data types Common Lisp +offers, you'll also see that lists can be useful for prototyping data +structures that will later be replaced with something more efficient +once it becomes clear how exactly the data is to be used.

2Vectors are called +vectors, not arrays as their analogs in other languages are, +because Common Lisp supports true multidimensional arrays. It's +equally correct, though more cumbersome, to refer to them as +one-dimensional arrays.

3Array +elements "must" be set before they're accessed in the sense that the +behavior is undefined; Lisp won't necessarily stop you.

4While frequently used together, +the :fill-pointer and :adjustable arguments are +independent--you can make an adjustable array without a fill +pointer. However, you can use VECTOR-PUSH and VECTOR-POP +only with vectors that have a fill pointer and +VECTOR-PUSH-EXTEND only with vectors that have a fill pointer +and are adjustable. You can also use the function ADJUST-ARRAY +to modify adjustable arrays in a variety of ways beyond just +extending the length of a vector.

5Another parameter, :test-not +parameter, specifies a two-argument predicate to be used like a +:test argument except with the boolean result logically +reversed. This parameter is deprecated, however, in preference for +using the COMPLEMENT function. COMPLEMENT takes a function +argu-ment and returns a function that takes the same number of +arguments as the original and returns the logical complement of the +original function. Thus, you can, and should, write this:

(count x sequence :test (complement #'some-test))

rather than the following:

(count x sequence :test-not #'some-test)

6Note, however, that the effect of :start +and :end on REMOVE and SUBSTITUTE is only to limit +the elements they consider for removal or substitution; elements +before :start and after :end will be passed through +untouched.

7This same +functionality goes by the name grep in Perl and filter +in Python.

8The difference between the predicates passed as +:test arguments and as the function arguments to the +-IF and -IF-NOT functions is that the :test +predicates are two-argument predicates used to compare the elements +of the sequence to the specific item while the -IF and +-IF-NOT predicates are one-argument functions that simply test +the individual elements of the sequence. If the vanilla variants +didn't exist, you could implement them in terms of the -IF versions +by embedding a specific item in the test function.

(count char string) ===
+  (count-if #'(lambda (c) (eql char c)) string)
(count char string :test #'CHAR-EQUAL) ===
+  (count-if #'(lambda (c) (char-equal char c)) string)

9If you tell CONCATENATE to +return a specialized vector, such as a string, all the elements of +the argument sequences must be instances of the vector's element +type.

10When the sequence passed to the sorting functions is +a vector, the "destruction" is actually guaranteed to entail +permuting the elements in place, so you could get away without saving +the returned value. However, it's good style to always do something +with the return value since the sorting functions can modify lists in +much more arbitrary ways.

11By an accident of history, the order of arguments to +GETHASH is the opposite of ELT--ELT takes the +collection first and then the index while GETHASH takes the key +first and then the collection.

12LOOP's +hash table iteration is typically implemented on top of a more +primitive form, WITH-HASH-TABLE-ITERATOR, that you don't need to +worry about; it was added to the language specifically to support +implementing things such as LOOP and is of little use unless you +need to write completely new control constructs for iterating over +hash tables.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/conclusion-whats-next.html b/clones/gigamonkeys.com/book/conclusion-whats-next.html new file mode 100644 index 00000000..10114439 --- /dev/null +++ b/clones/gigamonkeys.com/book/conclusion-whats-next.html @@ -0,0 +1,692 @@ +Conclusion: What's Next?

32. Conclusion: What's Next?

I hope by now you're convinced that the title of this book isn't an +oxymoron. However, it's quite likely there's some area of programming +that's of great practical importance to you that I haven't discussed +at all. For instance, I haven't said anything about how to develop +graphical user interfaces (GUIs), how to connect to relational +databases, how to parse XML, or how to write programs that act as +clients for various network protocols. Similarly, I haven't discussed +two topics that will become important when you write real applications +in Common Lisp: optimizing your Lisp code and packaging your +application for delivery.

I'm obviously not going to cover all these topics in depth in this +final chapter. Instead, I'll give you a few pointers you can use to +pursue whichever aspect of Lisp programming interests you most.

Finding Lisp Libraries

While the standard library of functions, data types, and macros that +comes with Common Lisp is quite large, it provides only +general-purpose programming constructs. Specialized tasks such as +writing GUIs, talking to databases, and parsing XML require libraries +beyond what are provided by the ANSI standardized language.

The easiest way to obtain a library to do something you need may be +simply to check out your Lisp implementation. Most implementations +provide at least some facilities not specified in the language +standard. The commercial Common Lisp vendors tend to work especially +hard at providing additional libraries for their implementation in +order to justify their prices. Franz's Allegro Common Lisp, +Enterprise Edition, for instance, comes with libraries for parsing +XML, speaking SOAP, generating HTML, connecting to relational +databases, and building graphical interfaces in various ways, among +others. LispWorks, another prominent commercial Lisp, provides +several similar libraries, including a well-regarded portable GUI +toolkit, CAPI, which can be used to develop GUI applications that +will run on any operating system LispWorks runs on.

The free and open-source Common Lisp implementations typically don't +include quite so many bundled libraries, relying instead on portable +free and open-source libraries. But even those implementations +usually fill in some of the more important areas not addressed by the +language standard such as networking and multithreading.

The only disadvantage of using implementation-specific libraries is +that they tie you to the implementation that provides them. If you're +delivering end-user apps or are deploying a server-based application +on a server that you control, that may not matter a lot. But if you +want to write code to share with other Lispers or if you simply don't +want to be tied to a particular implementation, it's a little more +annoying.

For portable libraries--portable either because they're written +entirely in standard Common Lisp or because they contain appropriate +read-time conditionalization to work on multiple +implementations1--your best bet +is to go to the Web. With the usual caveats about URLs going stale as +soon as they're printed on paper, these are three of the best current +starting points:

  • Common-Lisp.net (http://www.common-lisp.net/) is a site +that hosts free and open-source Common Lisp projects, providing +version control, mailing lists, and Web hosting of project pages. In +the first year and a half after the site went live, nearly a hundred +projects were registered.
  • The Common Lisp Open Code Collection (CLOCC) +(http://clocc.sourceforge.net/) is a slightly older collection +of free software libraries, which are intended to be portable between +Common Lisp implementations and self-contained, not relying on any +libraries not included in CLOCC itself.
  • Cliki (http://www.cliki.net/) is a wiki devoted to free +software in Common Lisp. While, like any wiki, it may change at any +time, typically it has quite a few links to libraries as well to +various open-source Common Lisp implementations. The eponymous +software it runs on is also written in Common Lisp.

Linux users running the Debian or Gentoo distributions can also +easily install an ever-growing number of Lisp libraries that have +been packaged with those distributions' packing tools, apt-get +on Debian and emerge on Gentoo.

I won't recommend any specific libraries here since the library +situation is changing every day--after years of envying the library +collections of Perl, Python, and Java, Common Lispers have, in the +past couple of years, begun to take up the challenge of giving Common +Lisp the set of libraries--both open source and commercial--that it +deserves.

One area where there has been a lot of activity recently is on the +GUI front. Unlike Java and C# but like Perl, Python, and C, there's +no single way to develop GUIs in Common Lisp. Instead, it depends +both on what Common Lisp implementation you're using and what +operating system or systems you want to support.

The commercial Common Lisp implementations usually provide some way +to build GUIs for the platforms they run on. Additionally, LispWorks +provides CAPI, the previously mentioned, portable GUI API.

On the open-source side, you have a number of options. On Unix, you +can write low-level X Windows GUIs using CLX, a pure-Common Lisp +implementation of the X Windows protocol, roughly akin to xlib in C. +Or you can use various bindings to higher-level APIs and toolkits such +as GTK and Tk, much the way you might in Perl or Python.

Or, if you're looking for something completely different, you can +check out Common Lisp Interface Manager (CLIM). A descendant of the +Symbolics Lisp Machines GUI framework, CLIM is powerful but complex. +Although many commercial Common Lisp implementations actually support +it, it doesn't seem to have seen a lot of use. But in the past couple +years, an open-source implementation of CLIM, McCLIM--now hosted at +Common-Lisp.net--has been picking up steam lately, so we may be on +the verge of a CLIM renaissance.

Interfacing with Other Languages

While many useful libraries can be written in "pure" Common Lisp +using only the features specified in the language standard, and many +more can be written in Lisp using nonstandard facilities provided by +a given implementation, occasionally it's more straightforward to use +an existing library written in another language, such as C.

The language standard doesn't specify a mechanism for Lisp code to +call code written in another language or even require that +implementations provide such a mechanism. But these days, almost all +Common Lisp implementations support what's called a Foreign +Function Interface, or FFI for short.2 The basic job of an FFI is to allow +you to give Lisp enough information to be able to link in the foreign +code. Thus, if you're going to call a function from a C library, you +need to tell Lisp about how to translate the Lisp objects passed to +the function into C types and the value returned by the function back +into a Lisp object. However, each implementation provides its own +FFI, each with slightly varying capabilities and syntax. Some FFIs +allow callbacks from C to Lisp, and others don't. The Universal +Foreign Function Interface (UFFI) project provides a portability +layer over the FFIs of more than a half dozen different Common Lisp +implementations. It works by defining its own macros that expand into +appropriate FFI code for the implementation it's running in. The UFFI +takes a lowest common denominator approach, which means it can't take +advantage of all the features of different implementations' FFIs, but +it does provide a good way to build a simple Lisp wrapper around a +basic C API.3

Make It Work, Make It Right, Make It Fast

As has been said many times, and variously attributed to Donald +Knuth, C.A.R. Hoare, and Edsger Dijkstra, premature optimization is +the root of all evil.4 Common Lisp is an +excellent language to program in if you want to heed this wisdom yet +still need high performance. This may come as a surprise if you've +heard the conventional wisdom that Lisp is slow. In Lisp's earliest +days, when computers were programmed with punch cards, Lisp's +high-level features may have doomed it to be slower than the +competition, namely, assembly and FORTRAN. But that was a long time +ago. In the meantime, Lisp has been used for everything from creating +complex AI systems to writing operating systems, and a lot of work +has gone into figuring out how to compile Lisp into efficient code. +In this section I'll talk about some of the reasons why Common Lisp +is an excellent language for writing high-performance code and some +of the techniques for doing so.

The first reason that Lisp is an excellent language for writing +high-performance code is, ironically enough, the dynamic nature of +Lisp programming--the very thing that originally made it hard to bring +Lisp's performance up to the levels achieved by FORTRAN compilers. The +reason Common Lisp's dynamic features make it easier to write +high-performance code is that the first step to writing efficient code +is to find the right algorithms and data structures.

Common Lisp's dynamic features keep code flexible, which makes it +easier to try different approaches. Given a finite amount of time to +write a program, you're much more likely to end up with a +high-performance version if you don't spend a lot of time getting +into and out of dead ends. In Common Lisp, you can try an idea, see +it's going nowhere, and move on without having spent a ton of time +convincing the compiler your code is worthy of being run and then +waiting for it to finish compiling. You can write a straightforward +but inefficient version of a function--a code sketch--to +determine whether your basic approach is sound and then replace that +function with a more complex but more efficient implementation if you +determine that it is. And if the overall approach turns out to be +flawed, then you haven't wasted a bunch of time tuning a function +that's no longer needed, which means you have more time to find a +better approach.

The next reason Common Lisp is a good language for developing +high-performance software is that most Common Lisp implementations +come with mature compilers that generate quite efficient machine +code. I'll talk in a moment about how to help these compilers +generate code that will be competitive with code generated by C +compilers, but these implementations already are quite a bit faster +than those of languages whose implementations are less mature and use +simpler compilers or interpreters. Also, since the Lisp compiler is +available at runtime, the Lisp programmer has some possibilities that +would be hard to emulate in other languages--your programs can +generate Lisp code at runtime that's then compiled into machine code +and run. If the generated code is going to run enough times, this can +be a big win. Or, even without using the compiler at runtime, +closures give you another way to meld machine code with runtime data. +For instance, the CL-PPCRE regular expression library, running in +CMUCL, is faster than Perl's regular expression engine on some +benchmarks, even though Perl's engine is written in highly tuned C. +This is presumably because in Perl a regular expression is translated +into what are essentially bytecodes that are then interpreted by the +regex engine, while CL-PPCRE translates a regular expression into a +tree of compiled closures that invoke each other via the normal +function-calling machinery.5

However, even with the right algorithm and a high-quality compiler, +you may not get the raw speed you need. Then it's time to think about +profiling and tuning. The key, in Lisp as in any language, is to +profile first to find the spots where your program is actually +spending its time and then worry about speeding up those +parts.6

You have a number of different ways to approach profiling. The +language standard provides a few rudimentary tools for measuring how +long certain forms take to execute. In particular, the TIME +macro can be wrapped around any form and will return whatever values +the form returns after printing a message to *TRACE-OUTPUT* +about how long it took to run and how much memory it used. The exact +form of the message is implementation defined.

You can use TIME for a bit of quick-and-dirty profiling to +narrow your search for bottlenecks. For instance, suppose you have a +function that's taking a long time to run and that calls two other +functions--something like this:

(defun foo ()
+  (bar)
+  (baz))

If you want to see whether bar or baz is taking more +time, you can change the definition of foo to this:

(defun foo ()
+  (time (bar))
+  (time (baz)))

Now you can call foo, and Lisp will print two reports, one for +bar and one for baz. The form is implementation +dependent; here's what it looks like in Allegro Common Lisp:

CL-USER> (foo)
+; cpu time (non-gc) 60 msec user, 0 msec system
+; cpu time (gc)     0 msec user, 0 msec system
+; cpu time (total)  60 msec user, 0 msec system
+; real time  105 msec
+; space allocation:
+;  24,172 cons cells, 1,696 other bytes, 0 static bytes
+; cpu time (non-gc) 540 msec user, 10 msec system
+; cpu time (gc)     170 msec user, 0 msec system
+; cpu time (total)  710 msec user, 10 msec system
+; real time  1,046 msec
+; space allocation:
+;  270,172 cons cells, 1,696 other bytes, 0 static bytes

Of course, that'd be a bit easier to read if the output included a +label. If you use this technique a lot, it might be worth defining +your own macro like this:

(defmacro labeled-time (form)
+  `(progn
+    (format *trace-output* "~2&~a" ',form)
+    (time ,form)))

If you replace TIME with labeled-time in foo, +you'll get this output:

CL-USER> (foo)
+
+(BAR)
+; cpu time (non-gc) 60 msec user, 0 msec system
+; cpu time (gc)     0 msec user, 0 msec system
+; cpu time (total)  60 msec user, 0 msec system
+; real time  131 msec
+; space allocation:
+;  24,172 cons cells, 1,696 other bytes, 0 static bytes
+
+(BAZ)
+; cpu time (non-gc) 490 msec user, 0 msec system
+; cpu time (gc)     190 msec user, 10 msec system
+; cpu time (total)  680 msec user, 10 msec system
+; real time  1,088 msec
+; space allocation:
+;  270,172 cons cells, 1,696 other bytes, 0 static bytes

From this output, it's clear that most of the time in foo is +spent in baz.

Of course, the output from TIME gets a bit unwieldy if the form +you want to profile is called repeatedly. You can build your own +measurement tools using the functions GET-INTERNAL-REAL-TIME and +GET-INTERNAL-RUN-TIME, which return a number that increases by +the value of the constant INTERNAL-TIME-UNITS-PER-SECOND each +second. GET-INTERNAL-REAL-TIME measures wall time, the +actual amount of time elapsed, while GET-INTERNAL-RUN-TIME +measures some implementation-defined value such as the amount of time +Lisp was actually executing or the time Lisp was executing user code +and not internal bookkeeping such as the garbage collector. Here's a +trivial but useful profiling tool built with a few macros and +GET-INTERNAL-RUN-TIME:

(defparameter *timing-data* ())
+
+(defmacro with-timing (label &body body)
+  (with-gensyms (start)
+    `(let ((,start (get-internal-run-time)))
+      (unwind-protect (progn ,@body)
+        (push (list ',label ,start (get-internal-run-time)) *timing-data*)))))
+
+(defun clear-timing-data ()
+  (setf *timing-data* ()))
+
+(defun show-timing-data ()
+  (loop for (label time count time-per %-of-total) in (compile-timing-data) do
+       (format t "~3d% ~a: ~d ticks over ~d calls for ~d per.~%" 
+               %-of-total label time count time-per)))
+
+(defun compile-timing-data () 
+  (loop with timing-table = (make-hash-table)
+     with count-table = (make-hash-table)
+     for (label start end) in *timing-data*
+     for time = (- end start)
+     summing time into total
+     do
+       (incf (gethash label timing-table 0) time)
+       (incf (gethash label count-table 0))
+     finally 
+       (return
+         (sort
+          (loop for label being the hash-keys in timing-table collect
+               (let  ((time (gethash label timing-table))
+                      (count (gethash label count-table)))
+                 (list label time count (round (/ time count)) (round (* 100 (/ time total))))))
+          #'> :key #'fifth))))

This profiler lets you wrap a with-timing around any form; +each time the form is executed, the time it starts and the time it +ends are recorded, associating with a label you provide. The function +show-timing-data dumps out a table showing how much time was +spent in different labeled sections of code like this:

CL-USER> (show-timing-data)
+ 84% BAR: 650 ticks over 2 calls for 325 per.
+ 16% FOO: 120 ticks over 5 calls for 24 per.
+NIL

You could obviously make this profiling code more sophisticated in +many ways. Alternatively, your Lisp implementation most likely +provides its own profiling tools, which, since they have access to +the internals of the implementation, can get at information not +necessarily available to user-level code.

Once you've found the bottleneck in your code, you can start tuning. +The first thing you should try, of course, is to find a more +efficient basic algorithm--that's where the big gains are to be had. +But assuming you're already using an appropriate algorithm, then it's +down to code bumming--locally optimizing the code so it does +absolutely no more work than necessary.

The main tools for code bumming in Common Lisp are its optional +declarations. The basic idea behind declarations in Common Lisp is +that they're used to give the compiler information it can use in a +variety of ways to generate better code.

For a simple example, consider this Common Lisp function:

(defun add (x y) (+ x y))

I mentioned in Chapter 10 that if you compare the performance of this +function Lisp to the seemingly equivalent C function:

int add (int x, int y) { return x + y; }

you'll likely find the Common Lisp version to be quite a bit slower, +even if your Common Lisp implementation features a high-quality native +compiler.

That's because the Common Lisp version is doing a lot more--the +Common Lisp compiler doesn't even know that the values of a +and b are numbers and so has to generate code to check at +runtime. And once it determines they are numbers, it has to +determine what types of numbers--integers, rationals, floating +point, or complex--and dispatch to the appropriate addition routine +for the actual types. And even if a and b are +integers--the case you care about--then the addition routine has to +account for the possibility that the result may be too large to +represent as a fixnum, a number that can be represented in a +single machine word, and thus it may have to allocate a bignum +object.

In C, on the other hand, because the type of all variables are +declared, the compiler knows exactly what kind of values a and +b will hold. And because C's arithmetic simply overflows when +the result of an addition is too large to represent in whatever type +is being returned, there's no checking for overflow and no allocation +of a bignum object to represent the result when the mathematical sum +is too large to fit in a machine word.

Thus, while the behavior of the Common Lisp code is much more likely +to be mathematically correct, the C version can probably be compiled +down to one or two machine instructions. But if you're willing to give +the Common Lisp compiler the same information the C compiler has about +the types of arguments and return values and to accept certain C-like +compromises in terms of generality and error checking, the Common +Lisp function can also be compiled down to an instruction or two.

That's what declarations are for. The main use of declarations is to +tell the compiler about the types of variables and other expressions. +For instance, you could tell the compiler that the arguments to +add are both fixnums by writing the function like this:

(defun add (x y)
+  (declare (fixnum x y))
+  (+ x y))

The DECLARE expression isn't a Lisp form; rather, it's part of +the syntax of the DEFUN and must appear before any other code in +the function body.7 This declaration declares that the arguments +passed for the parameters x and y will always be +fixnums. In other words, it's a promise to the compiler, and the +compiler is allowed to generate code on the assumption that whatever +you tell it is true.

To declare the type of the value returned, you can wrap the form +(+ x y) in the THE special operator. This operator takes +a type specifier, such as FIXNUM, and a form and tells the +compiler the form will evaluate to the given type. Thus, to give the +Common Lisp compiler all the information about add that the C +compiler gets, you can write it like this:

(defun add (x y)
+  (declare (fixnum x y))
+  (the fixnum (+ x y)))

However, even this version needs one more declaration to give the +Common Lisp compiler the same license as the C compiler to generate +fast but dangerous code. The OPTIMIZE declaration is used to +tell the compiler how to balance five qualities: the speed of the +code generated; the amount of runtime error checking; the memory +usage of the code, both in terms of code size and runtime memory +usage; the amount of debugging information kept with the code; and +the speed of the compilation process. An OPTIMIZE declaration +consists of one or more lists, each containing one of the symbols +SPEED, SAFETY, SPACE, DEBUG, and +COMPILATION-SPEED, and a number from zero to three, inclusive. +The number specifies the relative weighting the compiler should give +to the corresponding quality, with 3 being the most important +and 0 meaning not important at all. Thus, to make Common Lisp +compile add more or less like a C compiler would, you can +write it like this:

(defun add (x y)
+  (declare (optimize (speed 3) (safety 0)))
+  (declare (fixnum x y))
+  (the fixnum (+ x y)))

Of course, now the Lisp version suffers from many of the same +liabilities as the C version--if the arguments passed aren't fixnums +or if the addition overflows, the result will be mathematically +incorrect or worse. Also, if someone calls add with a wrong +number of arguments, it may not be pretty. Thus, you should use these +kinds of declarations only after your program is working correctly. +And you should add them only where profiling shows they'll make a +difference. If you're getting reasonable performance without them, +leave them out. But when profiling shows you a real hot spot in your +code and you need to tune it up, go ahead. Because you can use +declarations this way, it's rarely necessary to rewrite code in C +just for performance reasons; FFIs are used to access existing C +code, but declarations are used when C-like performance is needed. Of +course, how close you can get the performance of a given piece of +Common Lisp code to C and C++ depends mostly on how much like C +you're willing to make it.

Another code-tuning tool built into Lisp is the function +DISASSEMBLE. The exact behavior of this function is +implementation dependent because it depends on how the implementation +compiles code--whether to machine code, bytecodes, or some other form. +But the basic idea is that it shows you the code generated by the +compiler when it compiled a specific function.

Thus, you can use DISASSEMBLE to see whether your declarations +are having any effect on the code generated. And if your Lisp +implementation uses a native compiler and you know your platform's +assembly language, you can get a pretty good sense of what's actually +going on when you call one of your functions. For instance, you could +use DISASSEMBLE to get a sense of the difference between the +first version of add, with no declarations, and the final +version. First, define and compile the original version.

(defun add (x y) (+ x y))

Then, at the REPL, call DISASSEMBLE with the name of the +function. In Allegro, it shows the following assembly-language-like +dump of the code generated by the compiler:

CL-USER> (disassemble 'add)
+;; disassembly of #<Function ADD>
+;; formals: X Y
+
+;; code start: #x737496f4:
+   0: 55         pushl	ebp
+   1: 8b ec    movl	ebp,esp
+   3: 56         pushl	esi
+   4: 83 ec 24 subl	esp,$36
+   7: 83 f9 02 cmpl	ecx,$2
+  10: 74 02    jz	14
+  12: cd 61    int	$97   ; SYS::TRAP-ARGERR
+  14: 80 7f cb 00 cmpb	[edi-53],$0        ; SYS::C_INTERRUPT-PENDING
+  18: 74 02    jz	22
+  20: cd 64    int	$100  ; SYS::TRAP-SIGNAL-HIT
+  22: 8b d8    movl	ebx,eax
+  24: 0b da    orl	ebx,edx
+  26: f6 c3 03 testb	bl,$3
+  29: 75 0e    jnz	45
+  31: 8b d8    movl	ebx,eax
+  33: 03 da    addl	ebx,edx
+  35: 70 08    jo	45
+  37: 8b c3    movl	eax,ebx
+  39: f8         clc
+  40: c9         leave
+  41: 8b 75 fc movl	esi,[ebp-4]
+  44: c3         ret
+  45: 8b 5f 8f movl	ebx,[edi-113]    ; EXCL::+_2OP
+  48: ff 57 27 call	*[edi+39]   ; SYS::TRAMP-TWO
+  51: eb f3    jmp	40
+  53: 90         nop
+; No value

Clearly, there's a bunch of stuff going on here. If you're familiar +with x86 assembly language, you can probably tell what. Now compile +this version of add with all the declarations.

(defun add (x y)
+  (declare (optimize (speed 3) (safety 0)))
+  (declare (fixnum x y))
+  (the fixnum (+ x y)))

Now disassemble add again, and see if the declarations had any +effect.

CL-USER> (disassemble 'add)
+;; disassembly of #<Function ADD>
+;; formals: X Y
+
+;; code start: #x7374dc34:
+   0: 03 c2    addl	eax,edx
+   2: f8         clc
+   3: 8b 75 fc movl	esi,[ebp-4]
+   6: c3         ret
+   7: 90         nop
+; No value

Looks like they did.

Delivering Applications

Another topic of practical importance, which I didn't talk about +elsewhere in the book, is how to deliver software written in Lisp. +The main reason I neglected this topic is because there are many +different ways to do it, and which one is best for you depends on +what kind of software you need to deliver to what kind of user with +what Common Lisp implementation. In this section I'll give an +overview of some of the different options.

If you've written code you want to share with fellow Lisp +programmers, the most straightforward way to distribute it is as +source code.8 +You can distribute a simple library as a single source file, which +programmers can LOAD into their Lisp image, possibly after +compiling it with COMPILE-FILE.

More complex libraries or applications, broken up across multiple +source files, pose an additional challenge--in order to load and +compile the code, the files need to be loaded and compiled in the +correct order. For instance, a file containing macro definitions must +be loaded before you can compile files that use those macros. And a +file containing DEFPACKAGE forms must be loaded before any files +that use those packages can even be READ. Lispers call this the +system definition problem and typically handle it with tools +called system definition facilities or system definition +utilities, which are somewhat analogous to build tools such as +make or ant. As with make and ant, system +definition tools allow you to specify the dependencies between +different files and then take care of loading and compiling the files +in the correct order while trying to do only work that's +necessary--recompiling only files that have changed, for example.

These days the most widely used system definition tool is ASDF, which +stands for Another System Definition Facility.9 +The basic idea behind ASDF is that you define systems in ASD files, +and ASDF provides a number of operations on systems such as loading +them or compiling them. A system can also be defined to depend on +other systems, which will be loaded as necessary. For instance, the +following shows the contents of html.asd, the ASD file for the +FOO library from Chapters 31 and 32:

(defpackage :com.gigamonkeys.html-system (:use :asdf :cl))
+(in-package :com.gigamonkeys.html-system)
+
+(defsystem html
+  :name "html"
+  :author "Peter Seibel <peter@gigamonkeys.com>"
+  :version "0.1"
+  :maintainer "Peter Seibel <peter@gigamonkeys.com>"
+  :license "BSD"
+  :description "HTML and CSS generation from sexps."
+  :long-description ""
+  :components
+  ((:file "packages")
+   (:file "html" :depends-on ("packages"))
+   (:file "css" :depends-on ("packages" "html")))
+  :depends-on (:macro-utilities))

If you add a symbolic link to this file from a directory listed in +asdf:*central-registry*,10 then you can type this:

(asdf:operate 'asdf:load-op :html)

to compile and load the files packages.lisp, html.lisp, +and html-macros.lisp in the correct order after first making +sure the :macro-utilities system has been compiled and loaded. +For other examples of ASD files, you can look at this book's source +code--the code from each practical chapter is defined as a system +with appropriate intersystem dependencies expressed in the ASD files.

Most free and open-source Common Lisp libraries you'll find will come +with an ASD file. Some will use other system definition tools such as +the slightly older MK:DEFSYSTEM or even utilities devised by the +library's author, but the tide seems to be turning in the direction +of ASDF.11

Of course, while ASDF makes it easy for Lispers to install Lisp +libraries, it's not much help if you want to package an application +for an end user who doesn't know or care about Lisp. If you're +delivering a pure end-user application, presumably you want to +provide something the user can download, install, and run without +having to know anything about Lisp. You can't expect them to +separately download and install a Lisp implementation. And you want +them to be able to run your application just like any other +application--by double-clicking an icon on Windows or OS X or by +typing the name of the program at the command line on Unix.

However, unlike C programs, which can typically rely on certain +shared libraries (DLLs on Windows) that make up the C "runtime" being +present as part of the operating system, Lisp programs must include a +Lisp runtime, that is, the same program you run when you start Lisp +though perhaps with certain functionality not needed to run the +application excised.

To further complicate matters, program isn't really well defined +in Lisp. As you've seen throughout this book, the process of +developing software in Lisp is an incremental process that involves +making changes to the set of definitions and data living in your Lisp +image. The "program" is just a particular state of the image arrived +at by loading the .lisp or .fasl files that contain +code that creates the appropriate definitions and data. You could, +then, distribute a Lisp application as a Lisp runtime plus a bunch of +FASL files and an executable that starts the runtime, loads the +FASLs, and somehow invokes the appropriate starting function. +However, since actually loading the FASLs can take some time, +especially if they have to do any computation to set up the state of +the world, most Common Lisp implementations provide a way to dump +an image--to save the state of a running Lisp to a file called an +image file or sometimes a core. When a Lisp runtime starts, +the first thing it does is load an image file, which it can do in +much less time than it'd take to re-create the state by loading FASL +files.

Normally the image file is a default image containing only the +standard packages defined by the language and any extras provided by +the implementation. But with most implementations, you have a way to +specify a different image file. Thus, instead of packaging an app as +a Lisp runtime plus a bunch of FASLs, you can package it as a Lisp +runtime plus a single image file containing all the definitions and +data that make up your application. Then all you need is a program +that launches the Lisp runtime with the appropriate image file and +invokes whatever function serves as the entry point to the +application.

This is where things get implementation and operating-system +dependent. Some Common Lisp implementations, in particular the +commercial ones such as Allegro and LispWorks, provide tools for +building such an executable. For instance, Allegro's Enterprise +Edition provides a function excl:generate-application that +creates a directory containing the Lisp runtime as a shared library, +an image file, and an executable that starts the runtime with the +given image. Similarly, the LispWorks Professional Edition "delivery" +mechanism allows you to build single-file executables of your +programs. On Unix, with the various free and open-source +implementations, you can do essentially the same thing except it's +probably easier to use a shell script to start everything.

And on OS X things are even better--since all applications on OS X +are packaged as .app bundles, which are essentially +directories with a certain structure, it's not all that difficult to +package all the parts of a Lisp application as a double-clickable +.app bundle. Mikel Evins's Bosco tool makes it easy to create +.app bundles for applications running on OpenMCL.

Of course, another popular way to deliver applications these days is +as server-side applications. This is a niche where Common Lisp can +really excel--you can pick a combination of operating system and +Common Lisp implementation that works well for you, and you don't +have to worry about packaging the application to be installed by an +end user. And Common Lisp's interactive debugging and development +features make it possible to debug and upgrade a live server in ways +that either just aren't possible in a less dynamic language or would +require you to build a lot of specific infrastructure.

Where to Go Next

So, that's it. Welcome to the wonderful world of Lisp. The best thing +you can do now--if you haven't already--is to start writing your own +Lisp code. Pick a project that interests you, and do it in Common +Lisp. Then do another. Lather, rinse, repeat.

However, if you need some further pointers, this section offers some +places to go. For starters, check out the Practical Common Lisp +Web site at http://www.gigamonkeys.com/book/, where you can +find the source code from the practical chapters, errata, and links +to other Lisp resources on the Web.

In addition to the sites I mentioned in the "Finding Lisp Libraries" +section, you may also want explore the Common Lisp HyperSpec (a.k.a. +the HyperSpec or CLHS), an HTML version of the ANSI language standard +prepared by Kent Pitman and made available by LispWorks at +http://www.lispworks.com/documentation/HyperSpec/index.html. +The HyperSpec is by no means a tutorial, but it's as authoritative a +guide to the language as you can get without buying a printed copy of +the standard from ANSI and much more convenient for day-to-day +use.12

If you want to get in touch with other Lispers, comp.lang.lisp +on Usenet and the #lisp IRC channel or the Freenode network +(http://www.freenode.net) are two of the main online hang- +outs. There are also a number of Lisp-related blogs, most of which +are aggregated on Planet Lisp at http://planet.lisp.org/.

And keep your eyes peeled in all those forums for announcements of +local Lisp users get-togethers in your area--in the past few years, +Lispnik gatherings have popped up in cities around the world, from +New York to Oakland, from Cologne to Munich, and from Geneva to +Helsinki.

If you want to stick to books, here are a few suggestions. For a nice +thick reference book to stick on your desk, grab The ANSI Common +Lisp Reference Book edited by David Margolies (Apress, +2005).13

For more on Common Lisp's object system, you can start with +Object-Oriented Programming in Common Lisp: A Programmer's Guide +to CLOS by Sonya E. Keene (Addison-Wesley, 1989). Then if you really +want to become an object wizard or just to stretch your mind in +interesting ways, read The Art of the Metaobject Protocol by +Gregor Kiczales, Jim des Riviéres, and Daniel G. Bobrow (MIT Press, +1991). This book, also known as AMOP, is both an explanation of what +a metaobject protocol is and why you want one and the de facto +standard for the metaobject protocol supported by many Common Lisp +implementations.

Two books that cover general Common Lisp technique are Paradigms +of Artificial Intelligence Programming: Case Studies in Common Lisp +by Peter Norvig (Morgan Kaufmann, 1992) and On Lisp: Advanced +Techniques for Common Lisp by Paul Graham (Prentice Hall, 1994). The +former provides a solid introduction to artificial intelligence +techniques while teaching quite a bit about how to write good Common +Lisp code, and the latter is especially good in its treatment of +macros.

If you're the kind of person who likes to know how things work down +to the bits, Lisp in Small Pieces by Christian Queinnec +(Cambridge University Press, 1996) provides a nice blend of +programming language theory and practical Lisp implementation +techniques. While it's primarily focused on Scheme rather than Common +Lisp, the same principles apply.

For folks who want a little more theoretical look at things--or who +just want to know what it's like to be a freshman comp sci student at +M.I.T.--Structure and Interpretation of Computer Programs, Second +Edition, by Harold Abelson, Gerald Jay Sussman, and Julie Sussman +(M.I.T. Press, 1996) is a classic computer science text that uses +Scheme to teach important programming concepts. Any programmer can +learn a lot from this book--just remember that there are important +differences between Scheme and Common Lisp.

Once you've wrapped your mind around Lisp, you may want to place it +in a bit of context. Since no one can claim to really understand +object orientation who doesn't know something about Smalltalk, you +might want to start with Smalltalk-80: The Language by Adele +Goldberg and David Robson (Addison Wesley, 1989), the standard +introduction to the core of Smalltalk. After that, Smalltalk Best +Practice Patterns by Kent Beck (Prentice Hall, 1997) is full of good +advice aimed at Smalltalkers, much of which is applicable to any +object-oriented language.

And at the other end of the spectrum, Object-Oriented Software +Construction by Bertrand Meyer (Prentice Hall, 1997) is an excellent +exposition of the static language mind-set from the inventor of +Eiffel, an oft-overlooked descendant of Simula and Algol. It contains +much food for thought, even for programmers working with dynamic +languages such as Common Lisp. In particular, Meyer's ideas about +Design By Contract can shed a lot of light on how one ought to use +Common Lisp's condition system.

Though not about computers per se, The Wisdom of Crowds: Why the +Many Are Smarter Than the Few and How Collective Wisdom Shapes +Business, Economies, Societies, and Nations by James Surowiecki +(Doubleday, 2004) contains an excellent answer to the question, "If +Lisp's so great how come everybody isn't using it?" See the section +on "Plank-Road Fever" starting on page 53.

And finally, for some fun, and to learn about the influence Lisp and +Lispers have had on hacker culture, dip into (or read from cover to +cover) The New Hacker's Dictionary, Third Edition, compiled by +Eric S. Raymond (MIT Press, 1996) and based on the original The +Hacker's Dictionary edited by Guy Steele (Harper & Row, 1983).

But don't let all these suggestions interfere with your +programming--the only way to really learn a language is to use it. If +you've made it this far, you're certainly ready to do that. Happy +hacking! +


1The combination of Common Lisp's read-time +conditionalization and macros makes it quite feasible to develop +portability libraries that do nothing but provide a common API +layered over whatever API different implementations provide for +facilities not specified in the language standard. The portable +pathname library from Chapter 15 is an example of this kind of +library, albeit to smooth over differences in interpretation of the +standard rather than implementation-dependent APIs.

2A Foreign Function +Interface is basically equivalent to JNI in Java, XS in Perl, or the +extension module API in Python.

3As of this writing, the two main drawbacks of UFFI +are the lack of support for callbacks from C into Lisp, which many +but not all implementations' FFIs support, and the lack of support +for CLISP, whose FFI is quite good but different enough from the +others as to not fit easily into the UFFI model.

4Knuth has used the saying several times in +publications, including in his 1974 ACM Turing Award paper, "Computer +Programming as an Art," and in his paper "Structured Programs with +goto Statements." In his paper "The Errors of TeX," he attributes the +saying to C.A.R. Hoare. And Hoare, in an 2004 e-mail to Hans Genwitz +of phobia.com, said he didn't remember the origin of the saying but +that he might have attributed it to Dijkstra.

5CL-PPCRE also takes advantage of +another Common Lisp feature I haven't discussed, compiler macros. +A compiler macro is a special kind of macro that's given a chance to +optimize calls to a specific function by transforming calls to that +function into more efficient code. CL-PPCRE defines compiler macros +for its functions that take regular expression arguments. The +compiler macros optimize calls to those functions in which the +regular expression is a constant value by parsing the regular +expression at compile time rather than leaving it to be done at +runtime. Look up DEFINE-COMPILER-MACRO in your favorite Common +Lisp reference for more information about compiler macros.

6The word premature in "premature optimization" can +pretty much be defined as "before profiling." Remember that even if +you can speed up a piece of code to the point where it takes +literally no time to run, you'll still speed up your program only by +whatever percentage of time it spent in that piece of code.

7Declarations can appear in most forms that +introduce new variables, such as LET, LET*, and the DO +family of looping macros. LOOP has its own syntax for declaring +the types of loop variables. The special operator LOCALLY, +mentioned in Chapter 20, does nothing but create a scope in which you +can make declarations.

8The FASL files produced by COMPILE-FILE are +implementation dependent and may or may not be compatible between +different versions of the same Common Lisp implementation. Thus, +they're not a very good way to distribute Lisp code. The one time +they can be handy is as a way of providing patches to be applied to +an application running in a known version of a particular +implementation. Applying the patch simply entails LOADing the +FASL, and because a FASL can contain arbitrary code, it can be used +to upgrade existing data as well as to provide new code definitions.

9ASDF was +originally written by Daniel Barlow, one of the SBCL developers, and +has been included as part of SBCL for a long time and also +distributed as a stand-alone library. It has recently been adopted +and included in other implementations such as OpenMCL and Allegro.

10On Windows, where there are no +symbolic links, it works a little bit differently but roughly the +same.

11Another tool, ASDF-INSTALL, builds on top of ASDF and +MK:DEFSYSTEM, providing an easy way to automatically download and +install libraries from the network. The best starting point for +learning about ASDF-INSTALL is Edi Weitz's "A tutorial for +ASDF-INSTALL" (http:// www.weitz.de/asdf-install/).

12SLIME incorporates an Elisp library that allows you to +automatically jump to the HyperSpec entry for any name defined in the +standard. You can also download a complete copy of the HyperSpec to +keep locally for offline browsing.

13Another classic reference is Common Lisp: The +Language by Guy Steele (Digital Press, 1984 and 1990). The first +edition, a.k.a. CLtL1, was the de facto standard for the language for +a number of years. While waiting for the official ANSI standard to be +finished, Guy Steele--who was on the ANSI committee--decided to +release a second edition to bridge the gap between CLtL1 and the +eventual standard. The second edition, now known as CLtL2, is +essentially a snapshot of the work of the standardization committee +taken at a particular moment in time near to, but not quite at, the +end of the standardization process. Consequently, CLtL2 differs from +the standard in ways that make it not a very good day-to-day +reference. It is, however, a useful historical document, particularly +because it includes documentation of some features that were dropped +from the standard before it was finished as well as commentary that +isn't part of the standard about why certain features are the way +they are.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/figures/account-hierarchy.png b/clones/gigamonkeys.com/book/figures/account-hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc96832717a948cc9a8538e5cfaa65c927ddf48 GIT binary patch literal 1467 zcmZ8hc{tR09R6Z5t`HuIvSYPq<*4Ub>~3a8k!u}M31xDOp^cdsS1~h{t0Z*L!H#2# zWm6=rw0`b;LW*G|0NC#6 zVCy02s3c3|Bn2qUP`m-y_MM}x&GFdbMII-r$XpdmdqGsJlEj!My-Ux~wPwDW;xl$j zI>g4L_lnQiq`jD0$L^HiqgG1GCaytv{-(;jprz9O#-^X`k~Fu6v4JWu2h~lQz7boG zRg}0kBhJ|^jE(1P@dAagH6+>pJ)+vkva<4pMqeQ`G~OZ>^^Q_WL!>m1jL9Q%dW$g} zx_)c*!KD%N4;qCt;$d#oql9B$F1RaJBovm3-gA#na?>ZxFT9#PI#aLG|mufth~Xu6wG&8=QNCxK9K9*>*H4PQM?Uk1alww3 zs`SwUBfkO2ue)G;`r+%sFCzT^OYSpILJ?$bktSRdH}M#+naE9HkG*Dp^vDmdB-#5`-?(vXz+3hNldX9a|qr^0*%LnpjKsBqW+_!s%xb7i{@ODC zwk(lPs4rGxbuv@kc7iMv$2JAps6XBt>_yb$OMwwwEU=YQ6}YX2O4o0)`L{8wCATq8 z3~SMCLLI|eaGRRMvgY0RMOfAxb}SIfn#GRmV_7rQg2$msVWI;wVwTyAXt0aar6Rg$ z;RjAJ#&XvBq=~CndxGl~KwF0SeVKhggV1?eGZ&b{4xVxD(!`Y_PEey97|F28Qq%)9 z!rUPX0mv7(_Y3M}z(!F|K%z1ja5KNAZUx*49lK9*0g-^_1uK|^02ZTiS9hjVy-?ne zCL;^@hIx>(7P!NX72!_-B4ahijJOR<_N?%?=K~__JyI*J4iX9dzA;2;utJ$=!elP> zv|{CPL+mV-9mG)iek^n?)@8+k`%nNX8R4*r-!P_tTU+ zo%wLb_@VW!lkuK|b#2`2!jQ?#ABQbpPDO@^;#JBx28_B{()o#)c52LtwOzU!#$QcJ zO{>8M&U!i=Ok0#?gBfEqk$SF{l330uvE3cvvc=DikM3=!%H!9! z4B{EiXNKEqBX&ukIrdrW=5Geklj;zLS+;;Sajo6G9(ltBiO(GO2R*+(<_S?7wW`na zirNmod)G%jcdQ$cd_G5m7ctYK;aJnFL=BW{`(*BcM79ci(%J zT^75*ZxCb)RU$cA`8ZsM%w#?DE_veLt+5l;-inL9=9ih~5DGAWIq|I??Ed1}{~QbD zz=QXZA5J@$BPm|qT;}q}B?Lm275FBU=GPK4Jw&%VMGvHgg^|PQ0OuIyPa)$d{Ae>X|8>CWk)+#+w#L_ Gulxm(bNko; literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/figures/after-append.png b/clones/gigamonkeys.com/book/figures/after-append.png new file mode 100644 index 0000000000000000000000000000000000000000..4afa1d001b6e5b329864d17ac62bcf9220e22939 GIT binary patch literal 1192 zcmV;Z1XufsP)A#s$DI7&zyB_xiPAQ9^84e2@( z!Jb$h+vY8`ASG2_^|5WE<-!aK$rbk$jt8*$#^(FJHjcxVjNV-ZW0*pVg zw(6NC(#T$&*FDpxS^s9%lMxATIwol&WY#e*UVfs_>!wz4+B~+?+apo!QHg>up$@uX zKphX~ojNaR72E0UktCg!kT{xnHgF!6=97R3I`|U{ULF!wS;U$^8Ux~Xb@t*Z}ip1+Egv7iwd33K5BsPf~ zB58^J3cJn}6Fel|Dei%Uk(2y&rkLP0&ebU%bd58{1P@894+qAW#3q4*WQ++OlGRh$ z3&}Yqc#RVc$vGx?NG3-s6{@_r!1DvtZ5)Vu!W`@QQG^?y)&((87G)&_l#RLTj&_5j*BsejFL4p$# z93(I?!9fBO6CflgF#$q?5)&jOATdEg0umD_Bp5M)LV^(!EF=&y!9oHNlM@n{Jvc8h ziR$NsB>F?*(moR$@z?`M97PksP-Nhw#(yBXWAr?3>D;&*alMo|nC3q%iAj z@}n&o6T9eVhUCCKIE40#kjTHE#)pTy;b_Iim4F{5Ue1w({J4#C)E*pC70ZxF@%7jF zs1=%T_F6ysL4Gku67sVgiFqloWe*M!lrKYKjkm0z-Zg2JACWb3jwIw~x0GDngF|Ga zqPiMMU65&`#%4cNDIFvsKf58hx(7$qEsFI>^n&v0<+Y*0gCyW*HzfABXAh35+f%*{ zNq_RVWqGy6&s!T>qfXGzK}bA%aCBWp*CDCNu)I>U&L%&ziCy$_3=-cSoS|<1VnK^7 zNC{DI)0lqcF-W|AjzMyH56+6IG&v#JNMu(e!Pnzm_C>FgkR&7tNkXzCl9iI7lK(>; zu)BQ-N=O_fB#sgiNB;o0L)3zR%$G3$002C6MObuWZ*6U5Zgc=3No`?gWgur|Ze?;| zbY)~9VtF7(PE{aBXm4|Lb7OL8aC9IjWMy_~V`V*XZf$a5cPR?`ix%?$0000>$XMMBCUmmER^Ik*Knh$tWzw_v>jBGCeuC}$3704WvFf?FV%1#Etd zy?Az+>%RH=>p2`?4FO#M`277D9LPDMu9A*0 z?Ir5VdeyoN^I;rNOd?iSszX&-orI6#KwEaFGn%fQ&X_6YQJgMf&JnL&E1gj{kOy(P zh#MyHbggtoh4~Zh7z+P9JeP=;|RNbxk_s!aSc7q-)X{x%fMs6Q(<* zGcwH6Ibpg}I%AjiXLAB|$8^Sqc{V3dcT8vW2e*?sF5Tt$>HJ1__iJ5h9Ea|D*elhT zL5$4PnS|zkT|=&8HCD$#M#v)R2C%8e&-FHvLJExb?KA^iR0<3B2yM5jz^bF zS&%rst~n}YLE`vysgwnYdxkU0L1R~ltO;`nuGlm&?s(9cYwEJ&OH z-65UPJ;oF`A>HZ{sb`7+Cq(y_&iF71aDv`N=+lYNGj%>ENViWXMg!pKoUk`dbUHEG zGEe7(=_;utMwq8_0(JS@FBU%2-7Z`B#uui=>APlFeyBTV7EhT1qy?t#JAjYounj=6 zt($wov^k&;U9+TKa#YT``0G%PfLtkI3Se<&>AXYt_Xl`y4l6;x6pf`@37b}VIK6IL zO_`fGyi=8s1#&9jH|b`{NwcQg%n#_cf8K*RY?>o}?Bo z0000ybVXQnV{dJ3Wo~o;AW3auXJsH~Wo~71VRU6=AYyqSM^05BM`&+zbaP{JX>fEP jC}d@JX=7zQaBgjKVRtDC`imCx00000NkvXXu0mjfYWEJD literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/figures/copy-list-list-or-tree.png b/clones/gigamonkeys.com/book/figures/copy-list-list-or-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..a188f3b791b8fe02f466ee4f4a4a7cf662b6b2e1 GIT binary patch literal 3273 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 T`imCx00000NkvXXu0mjffV0#b literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/figures/list-or-tree.png b/clones/gigamonkeys.com/book/figures/list-or-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..cd344a2a5d989c8fbd634923685af8f1d3237a58 GIT binary patch literal 1942 zcmV;H2Wj|;P)2(-KSW_6O(0+hB+U{q34t^xL`_l#PPHi)mkYa%s`O$nAmI9>a&tJfirj#2 z!M8BCFp+;Gk4744e%{fH<#}NjA0401p2zb_pXAqL;z`z`&`;o&mEbuj!E;c8=b$sZ zlJlxs&cAu#C0QxKbI=*yj8omaX18sEXQgCY2Z`{?YFKX-+f}b|Y;`=ttAzji`l#4m z8E&7aPN02Wf@dhvw#$GwqY^v^CEGeE!E;cut%DLg2Z3$N=Bh*G`Pmb{PJmnA=Y8?; zGEW`K4m=Wg%0ZY8nuuP1n4=DDay|@iMk(O2onp}9spQB0*`+*awguHGWq2$rBZ1eS z@Tx(J(y<$=j(FC8g2#8Yaig#;3|?#TCBSR7du*o0xosmEZisk`QY2lef&(a#Bu*mehV8`QT` z#tpI0>t}n}4wVspevix?vvTzJ^RXMv=SAw#cB*qLry)o zZ(qJ8deaWNYC;zpgC5)F-{;_N@RfFIYWoYz`P5+Y+rSUUus! z^Ut%w^Kc!h3xhHXc%1_V(eW0o#5&6S^AtSfHCrFPmEg6*v29h>)UTt=KTp9!w#hzx z+YGwO>j`w|&X}?LtF{-%na6rFZ#e%vxw-{%>Ur?(wZ+H}d_(Q=&ALfm*ZaJUywBsq z`R7S^(5M7{>a~Ne50bP31TxuUU8m5iGb=m~zK!|Z7TYF!@NL}ikZrOD-^L9ua^Kz+ zJhX2khX;)|zr$aKH@rpp zRs$ZiObXU)*$TZIC^TaIsa;9(QM3-YZFJZzi1Am3`OlZ>5u%kixi zJn#nrj^!4ymT~}ir*c8BhM=Sc58Ec6e0x9eux;|mxAz0jgKrZ&Th+e3BY5Bs%CT+v z4m9W+fQN09pB`S(ub@G9wjb>4SV{BCM4(ge-%pADXntTD(#`-+Y-ic^c1-ZFJH5Y& z+R*R%@xTjeGqEm9W9GtO#@A8?DF{6NR|{`{&coS6!{kL-%SRcWaxG<$G~t2UWd3sl ziB+r@=^D~hmbiWyGA6_Gy_T{jJaC)b8AMg&S$jaTUQ3y+c3g(%do5+%Z=Zs{SuK># zDQ}OH*0$X|@*X_pTFM|r0Pnctb3S0~GByBDwU#nSy718JNi>5voI@YZS>l4us)Rb; z*HYGn2fmuz4q{8E1BOkCy}!Lb^Zc%*to@C9;HlTnJlfcPexkp90N(Ig${=aOL$8d| z+&E>4H8a3d+a-7=b*vN|o}>j{7~t?W`M%(R+vNL#hhD}FH0T7+VbC`M58JB*%@WTK z58Wm&Kn7n+9m$G+5y=4FasoOiC3p@pfQP=CeETwh2fvzp^D=;!d@C!#bC3zV)T>A` zftT83Nha{p)RSZcZ@Z8zaVU6;xEg|z5xm_(LWw9D!K>Tk1W%9=yxO-3o}dKJL1ysE z=ifkszB_pAhcD@C;b$QNoZwCBf#|jH<3_k`ziQYfBUjahA(e@kq@j9GB{9EfR zabANf=~1lXJxh#|**@=|&wpvD5Lv?Ou1ieEYc)o2@z@V)33OMkxS1>BA@coQm!@ z*L%+rqZ9yMcl$oe<$lq7mKder@K*hA6Y!oTMkzGBin{lhB}0Bq|7l?yyk z>D*RB37((?&p`>EgAzOk8N*vbmN*o=BtZ$DgAzOkC3p_{A0XVE@%NQ2m;e9(Jak1^ zbYpLAZDnqB03ba$$63WFTUBAV*GBAV+9#b98fKa%pgMASh&Ic4=c} cJ#cPqa$$EV3i^u{^8f$<07*qoM6N<$g3%qxh5!Hn literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/figures/mixed-list.png b/clones/gigamonkeys.com/book/figures/mixed-list.png new file mode 100644 index 0000000000000000000000000000000000000000..88fea3d97576d44087973ab4fabbc39a698bcd16 GIT binary patch literal 1080 zcmV-81jqY{P)^Jv)Bvh3Pf(e zD=^g4Bip1Yb8IuVrr4zgdOV-_YeTTj8F$7Fz|F;ed$b%E7H_fnvEbUe zKUZT8}w#P zcz)au4{KUK0-y;_)T9!Y11^&h;F{pR{U-L)1eZcpH98L7)g%mqyNXVn)Lfl&W$S>c@hsIVZ$L!xA(R zAvquErwMLRU%LujyC!k5oG?`dhq-g!LU6Ns<`Ix0Ty17zI$T-O;BMp`f~%OBcb6bB zt{L(cx3(;FA_@(&w?WP!xLPh5B;`?l{BU(Y8HFw)dpSpbi_lL-!C`hfi5$1jR>5I* za*iFh5=3FPa*iEWlZ{Fv=h$#}Z1p4@X7jeE>*|rlkJEfk$*#HX%*BmMx3=o!962uCWYo$za$LgUHFAE59#_(3=hgRjFE~tm zOC1X?-O_pe1>hGBGo`>)DFawkUVeOV$tI)MuK*95@cZJ6$++XqRc=u8wwR&!W3Aut zD)1$Hj-!9RzZ=5ri!Y|*j<(KKQ>C(T<*eWEt7oRWde7-auD47ZJwnMbI3}w2uUj3!oALcn?Y+{evW;QsQuoe@lkNxI%Kim zA~F!$v^zf5+n+vtjm(w zH7$;mD{pysEU`eG?_=QF#Zm5C`?6%OcKK>|KCpMvj!Za_$;zPFP`&m^mBAUH5jG{R z5hcm_xw)x%B@7Clxryni3hAkNsYQt;sVNFcl?v{Dp$hI9`Nbv0$wiq3B?=lTsb!hT dskQ}qxkZWPnq0rS#Xf_a`GEJLCWW literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/figures/plist-abc-123.png b/clones/gigamonkeys.com/book/figures/plist-abc-123.png new file mode 100644 index 0000000000000000000000000000000000000000..f505ce8f0c1faad869e5b7d6797be6e02a1feead GIT binary patch literal 801 zcmV++1K#|JP)o&5QaO1B?SW5ixSuaDJX+21+W)VP&osopqtO6pcF`f6j;z>2K2B*!>&1WAMB|v z&tE_NNlil;EJfu3-)(^6E(lTeL5QjkLR5V$hHO7i0(uM+d5 zlc7V1s@EYz)$0(V>U9WF^*V&8dYuEJ7GxOoj?BK3LfXOBn& z@B&M5(G@5OczYA$Q?4J=F<0A72CXBZGe*82;tW5}AH6-I9wfY0l48Ncc_qVp3#`tJ z$g0;yaGTX zigZ?ymljsXz!1t{b-G!`zAJ?FGl4qz0p`KqBht=9`|flJ795kGf5JQxQKYlIMTn9_ zI$COrL=@`qpuuGMG0J$-Jk)_s*e8g3Fm`~`o*iBteH?F-9wSQ8nTtA{_x@Brc06x% z2|BR9bk6Xjq+n5~wXfp+OakPK5LRbHG$9_DLw($a6pssTs1f&wB=bK<7}G5r z@<>EcK4V;n^Ai&V&S?Uc54_FOv06pT+7M~h-y-76VTN_VS5YOgWf38U?l{jylt=3H z%NC$u$kTD#>pU*7(2rlLWOsKN`1FC%Mm*QMPN z*zS(N^HQ4?kq>!>NW#*thpp3nKce{tDEl-o*SRCRw5{K%W&VYfzewT_&!2RSTD=Y- zs$Pc>Rj)&cs@EYz)$6Q?62o3el1_OY`ft?ggAi38gsA!;MAgS%_^Pg&Euv`y0000y zbVXQnV{dJ3Wo~o;AW3auXJsH~Wo~71VRU6=AYyqSM^05BM`&+zbaP{JX>fEPC}d@J fX=7zQaBgjKVRtDC`imCx00000NkvXXu0mjfBZP0Q literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/figures/restart-call-stack.png b/clones/gigamonkeys.com/book/figures/restart-call-stack.png new file mode 100644 index 0000000000000000000000000000000000000000..13e3b46f077b2665453732faf1fcb5513ec04026 GIT binary patch literal 1463 zcmeAS@N?(olHy`uVBq!ia0y~yU`z(G7jOUxhChpfCNnUwnt8f7hE&{oJNN9y#TFv1 zqK76hF@9-dsd^|f2gDFraqfWTp1W)2GHFg=(!Aqn-;l%Nv8w#fnIARXWywpTA8C7) z1lyHP6)<_VT>Jy$1w%QjW6sAb);#{k_jtMf2i^^Rg=#Nm^u;sEK3XlG|1rwuTgc6F3Z46R$Bg&uyjE7(T%EyRy<|zA>#Vdt zek=X*mTKiydAt^1{FwK6sj)|J@2`{`CppXduJcp zyW}y$!}PedS1R)P#6vBPZ`H~!oh@@)xi+BJ|3LRW6{(#wpR35Ozxlg9&OT4_dzNM0 z5BHh2tNLUvecboB`XYbmZsW=evk%*q)O^^tNH=7&`A%&s%Z9$6elJ8(0;;et_{Zt_ zxyvSg{GD9o-GUa3;IL(XF=L@U`vt@JCJS)bVh!+v7II3*SN0eePQB0B^SHk5zxVON z>yv6*y;jE8zp!`~Ww!3aj0ul_bj**uZl(Ogvrn1ht>{NV`_1c0-3l7}RR5gm?)x#* zVL{ai4!fz#A9tz?10{{C<_g|f^XJ{33xy>|&iBNnvzTk|w_aZ?BmdF(brg)33GDc`wb)90f4wR~<{A1(dEG?zhN&19+mZEohej>jDHzIRazC5&$nXq>sww|Z(L%t zvFy#$e{T1e&i}++#w7B5$IW$r&d#}6xSF{p?%n%qrxyH~62C!s!H&I$xS8$3|D~OK zv%~289@X#H!>yh?U;4*sE`$2$k40>_?+2689bqAN#ecSSuYsKOE$1b;p zKRC;{KX@x@_I|tYcW%?K#mi&E9jpuAae5qQdp|S%vcdj^=s$l{yty-151r$PrteG1a4b#j7Zpu zcbq#ymL-4u&gEWq=e+NnYNksckDU5=@yFjC^REj}=u;1pl|S-#&%A~bn}g*}6)1Tq zp?;g^as38p;C+_=^6isawCEW>U_okA;u=wsoS&PUnpeW0;F+74o~n?ZnwMIXSdyBe zkW{JQ?iZ@yo{?W%Qk-0rSx};&k&;@LnVf1{ke6GOSgy(St6S_ds6_U3^>bP0l+XkK D+fLNg literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/files-and-file-io.html b/clones/gigamonkeys.com/book/files-and-file-io.html new file mode 100644 index 00000000..ae8b7b71 --- /dev/null +++ b/clones/gigamonkeys.com/book/files-and-file-io.html @@ -0,0 +1,619 @@ +Files and File I/O

14. Files and File I/O

Common Lisp provides a rich library of functionality for dealing with +files. In this chapter I'll focus on a few basic file-related tasks: +reading and writing files and listing files in the file system. For +these basic tasks, Common Lisp's I/O facilities are similar to those +in other languages. Common Lisp provides a stream abstraction for +reading and writing data and an abstraction, called pathnames, for +manipulating filenames in an operating system-independent way. +Additionally, Common Lisp provides other bits of functionality unique +to Lisp such as the ability to read and write s-expressions.

Reading File Data

The most basic file I/O task is to read the contents of a file. You +obtain a stream from which you can read a file's contents with the +OPEN function. By default OPEN returns a character-based +input stream you can pass to a variety of functions that read one or +more characters of text: READ-CHAR reads a single character; +READ-LINE reads a line of text, returning it as a string with +the end-of-line character(s) removed; and READ reads a single +s-expression, returning a Lisp object. When you're done with the +stream, you can close it with the CLOSE function.

The only required argument to OPEN is the name of the file to +read. As you'll see in the section "Filenames," Common Lisp provides +a couple of ways to represent a filename, but the simplest is to use +a string containing the name in the local file-naming syntax. So +assuming that /some/file/name.txt is a file, you can open it +like this:

(open "/some/file/name.txt")

You can use the object returned as the first argument to any of the +read functions. For instance, to print the first line of the file, +you can combine OPEN, READ-LINE, and CLOSE as follows:

(let ((in (open "/some/file/name.txt")))
+  (format t "~a~%" (read-line in))
+  (close in))

Of course, a number of things can go wrong while trying to open and +read from a file. The file may not exist. Or you may unexpectedly hit +the end of the file while reading. By default OPEN and the +READ-* functions will signal an error in these situations. In +Chapter 19, I'll discuss how to recover from such errors. For now, +however, there's a lighter-weight solution: each of these functions +accepts arguments that modify its behavior in these exceptional +situations.

If you want to open a possibly nonexistent file without OPEN +signaling an error, you can use the keyword argument +:if-does-not-exist to specify a different behavior. The three +possible values are :error, the default; :create, which +tells it to go ahead and create the file and then proceed as if it +had already existed; and NIL, which tells it to return NIL +instead of a stream. Thus, you can change the previous example to +deal with the possibility that the file may not exist.

(let ((in (open "/some/file/name.txt" :if-does-not-exist nil)))
+  (when in
+    (format t "~a~%" (read-line in))
+    (close in)))

The reading functions--READ-CHAR, READ-LINE, and +READ--all take an optional argument, which defaults to true, +that specifies whether they should signal an error if they're called +at the end of the file. If that argument is NIL, they instead +return the value of their third argument, which defaults to NIL. +Thus, you could print all the lines in a file like this:

(let ((in (open "/some/file/name.txt" :if-does-not-exist nil)))
+  (when in
+    (loop for line = (read-line in nil)
+         while line do (format t "~a~%" line))
+    (close in)))

Of the three text-reading functions, READ is unique to Lisp. +This is the same function that provides the R in the REPL and +that's used to read Lisp source code. Each time it's called, it reads +a single s-expression, skipping whitespace and comments, and returns +the Lisp object denoted by the s-expression. For instance, suppose +/some/file/name.txt has the following contents:

(1 2 3)
+456
+"a string" ; this is a comment
+((a b)
+ (c d))

In other words, it contains four s-expressions: a list of numbers, a +number, a string, and a list of lists. You can read those expressions +like this:

CL-USER> (defparameter *s* (open "/some/file/name.txt"))
+*S*
+CL-USER> (read *s*)
+(1 2 3)
+CL-USER> (read *s*)
+456
+CL-USER> (read *s*)
+"a string"
+CL-USER> (read *s*)
+((A B) (C D))
+CL-USER> (close *s*)
+T

As you saw in Chapter 3, you can use PRINT to print Lisp objects +in "readable" form. Thus, whenever you need to store a bit of data in +a file, PRINT and READ provide an easy way to do it without +having to design a data format or write a parser. They even--as the +previous example demonstrated--give you comments for free. And +because s-expressions were designed to be human editable, it's also a +fine format for things like configuration files.1

Reading Binary Data

By default OPEN returns character streams, which translate the +underlying bytes to characters according to a particular +character-encoding scheme.2 To read the raw +bytes, you need to pass OPEN an :element-type argument of +'(unsigned-byte 8).3 +You can pass the resulting stream to the function READ-BYTE, +which will return an integer between 0 and 255 each time it's called. +READ-BYTE, like the character-reading functions, also accepts +optional arguments to specify whether it should signal an error if +called at the end of the file and what value to return if not. In +Chapter 24 you'll build a library that allows you to conveniently +read structured binary data using READ-BYTE.4

Bulk Reads

One last reading function, READ-SEQUENCE, works with both +character and binary streams. You pass it a sequence (typically a +vector) and a stream, and it attempts to fill the sequence with data +from the stream. It returns the index of the first element of the +sequence that wasn't filled or the length of the sequence if it was +able to completely fill it. You can also pass :start and +:end keyword arguments to specify a subsequence that should be +filled instead. The sequence argument must be a type that can hold +elements of the stream's element type. Since most operating systems +support some form of block I/O, READ-SEQUENCE is likely to be +quite a bit more efficient than filling a sequence by repeatedly +calling READ-BYTE or READ-CHAR.

File Output

To write data to a file, you need an output stream, which you obtain +by calling OPEN with a :direction keyword argument of +:output. When opening a file for output, OPEN assumes the +file shouldn't already exist and will signal an error if it does. +However, you can change that behavior with the :if-exists +keyword argument. Passing the value :supersede tells OPEN +to replace the existing file. Passing :append causes OPEN +to open the existing file such that new data will be written at the +end of the file, while :overwrite returns a stream that will +overwrite existing data starting from the beginning of the file. And +passing NIL will cause OPEN to return NIL instead of a +stream if the file already exists. A typical use of OPEN for +output looks like this:

(open "/some/file/name.txt" :direction :output :if-exists :supersede)

Common Lisp also provides several functions for writing data: +WRITE-CHAR writes a single character to the stream. +WRITE-LINE writes a string followed by a newline, which will be +output as the appropriate end-of-line character or characters for the +platform. Another function, WRITE-STRING, writes a string +without adding any end-of-line characters. Two different functions +can print just a newline: TERPRI--short for "terminate +print"--unconditionally prints a newline character, and +FRESH-LINE prints a newline character unless the stream is at +the beginning of a line. FRESH-LINE is handy when you want to +avoid spurious blank lines in textual output generated by different +functions called in sequence. For example, suppose you have one +function that generates output that should always be followed by a +line break and another that should start on a new line. But assume +that if the functions are called one after the other, you don't want +a blank line between the two bits of output. If you use +FRESH-LINE at the beginning of the second function, its output +will always start on a new line, but if it's called right after the +first, it won't emit an extra line break.

Several functions output Lisp data as s-expressions: PRINT +prints an s-expression preceded by an end-of-line and followed by a +space. PRIN1 prints just the s-expression. And the function +PPRINT prints s-expressions like PRINT and PRIN1 but +using the "pretty printer," which tries to print its output in an +aesthetically pleasing way.

However, not all objects can be printed in a form that READ will +understand. The variable *PRINT-READABLY* controls what happens +if you try to print such an object with PRINT, PRIN1, or +PPRINT. When it's NIL, these functions will print the +object in a special syntax that's guaranteed to cause READ to +signal an error if it tries to read it; otherwise they will signal an +error rather than print the object.

Another function, PRINC, also prints Lisp objects, but in a way +designed for human consumption. For instance, PRINC prints +strings without quotation marks. You can generate more elaborate text +output with the incredibly flexible if somewhat arcane FORMAT +function. I'll discuss some of the more important details of +FORMAT, which essentially defines a mini-language for emitting +formatted output, in Chapter 18.

To write binary data to a file, you have to OPEN the file with +the same :element-type argument as you did to read it: +'(unsigned-byte 8). You can then write individual bytes to the +stream with WRITE-BYTE.

The bulk output function WRITE-SEQUENCE accepts both binary and +character streams as long as all the elements of the sequence are of +an appropriate type for the stream, either characters or bytes. As +with READ-SEQUENCE, this function is likely to be quite a bit +more efficient than writing the elements of the sequence one at a +time.

Closing Files

As anyone who has written code that deals with lots of files knows, +it's important to close files when you're done with them, because +file handles tend to be a scarce resource. If you open files and +don't close them, you'll soon discover you can't open any more +files.5 It might seem +straightforward enough to just be sure every OPEN has a matching +CLOSE. For instance, you could always structure your file using +code like this:

(let ((stream (open "/some/file/name.txt")))
+  ;; do stuff with stream
+  (close stream))

However, this approach suffers from two problems. One is simply that +it's error prone--if you forget the CLOSE, the code will leak a +file handle every time it runs. The other--and more +significant--problem is that there's no guarantee you'll get to the +CLOSE. For instance, if the code prior to the CLOSE +contains a RETURN or RETURN-FROM, you could leave the +LET without closing the stream. Or, as you'll see in Chapter 19, +if any of the code before the CLOSE signals an error, control +may jump out of the LET to an error handler and never come back +to close the stream.

Common Lisp provides a general solution to the problem of how to +ensure that certain code always runs: the special operator +UNWIND-PROTECT, which I'll discuss in Chapter 20. However, +because the pattern of opening a file, doing something with the +resulting stream, and then closing the stream is so common, Common +Lisp provides a macro, WITH-OPEN-FILE, built on top of +UNWIND-PROTECT, to encapsulate this pattern. This is the basic +form:

(with-open-file (stream-var open-argument*)
+  body-form*)

The forms in body-forms are evaluated with stream-var bound +to a file stream opened by a call to OPEN with +open-arguments as its arguments. WITH-OPEN-FILE then ensures +the stream in stream-var is closed before the WITH-OPEN-FILE +form returns. Thus, you can write this to read a line from a file:

(with-open-file (stream "/some/file/name.txt")
+  (format t "~a~%" (read-line stream)))

To create a new file, you can write something like this:

(with-open-file (stream "/some/file/name.txt" :direction :output)
+  (format stream "Some text."))

You'll probably use WITH-OPEN-FILE for 90-99 percent of the file +I/O you do--the only time you need to use raw OPEN and +CLOSE calls is if you need to open a file in a function and keep +the stream around after the function returns. In that case, you must +take care to eventually close the stream yourself, or you'll leak +file descriptors and may eventually end up unable to open any more +files.

Filenames

So far you've used strings to represent filenames. However, using +strings as filenames ties your code to a particular operating system +and file system. Likewise, if you programmatically construct names +according to the rules of a particular naming scheme (separating +directories with /, say), you also tie your code to a particular file +system.

To avoid this kind of nonportability, Common Lisp provides another +representation of filenames: pathname objects. Pathnames represent +filenames in a structured way that makes them easy to manipulate +without tying them to a particular filename syntax. And the burden of +translating back and forth between strings in the local syntax--called +namestrings--and pathnames is placed on the Lisp implementation.

Unfortunately, as with many abstractions designed to hide the details +of fundamentally different underlying systems, the pathname +abstraction introduces its own complications. When pathnames were +designed, the set of file systems in general use was quite a bit more +variegated than those in common use today. Consequently, some nooks +and crannies of the pathname abstraction make little sense if all +you're concerned about is representing Unix or Windows filenames. +However, once you understand which parts of the pathname abstraction +you can ignore as artifacts of pathnames' evolutionary history, they +do provide a convenient way to manipulate filenames.6

Most places a filename is called for, you can use either a namestring +or a pathname. Which to use depends mostly on where the name +originated. Filenames provided by the user--for example, as arguments +or as values in configuration files--will typically be namestrings, +since the user knows what operating system they're running on and +shouldn't be expected to care about the details of how Lisp +represents filenames. But programmatically generated filenames will +be pathnames because you can create them portably. A stream returned +by OPEN also represents a filename, namely, the filename that +was originally used to open the stream. Together these three types +are collectively referred to as pathname designators. All the +built-in functions that expect a filename argument accept all three +types of pathname designator. For instance, all the places in the +previous section where you used a string to represent a filename, you +could also have passed a pathname object or a stream.

How We Got Here

How Pathnames Represent Filenames

A pathname is a structured object that represents a filename using +six components: host, device, directory, name, type, and version. +Most of these components take on atomic values, usually strings; only +the directory component is further structured, containing a list of +directory names (as strings) prefaced with the keyword +:absolute or :relative. However, not all pathname +components are needed on all platforms--this is one of the reasons +pathnames strike many new Lispers as gratuitously complex. On the +other hand, you don't really need to worry about which components may +or may not be used to represent names on a particular file system +unless you need to create a new pathname object from scratch, which +you'll almost never need to do. Instead, you'll usually get hold of +pathname objects either by letting the implementation parse a file +system-specific namestring into a pathname object or by creating a +new pathname that takes most of its components from an existing +pathname.

For instance, to translate a namestring to a pathname, you use the +PATHNAME function. It takes a pathname designator and returns an +equivalent pathname object. When the designator is already a +pathname, it's simply returned. When it's a stream, the original +filename is extracted and returned. When the designator is a +namestring, however, it's parsed according to the local filename +syntax. The language standard, as a platform-neutral document, +doesn't specify any particular mapping from namestring to pathname, +but most implementations follow the same conventions on a given +operating system.

On Unix file systems, only the directory, name, and type components +are typically used. On Windows, one more component--usually the +device or host--holds the drive letter. On these platforms, a +namestring is parsed by first splitting it into elements on the path +separator--a slash on Unix and a slash or backslash on Windows. The +drive letter on Windows will be placed into either the device or the +host component. All but the last of the other name elements are +placed in a list starting with :absolute or :relative +depending on whether the name (ignoring the drive letter, if any) +began with a path separator. This list becomes the directory +component of the pathname. The last element is then split on the +rightmost dot, if any, and the two parts put into the name and type +components of the pathname.7

You can examine these individual components of a pathname with the +functions PATHNAME-DIRECTORY, PATHNAME-NAME, and +PATHNAME-TYPE.

(pathname-directory (pathname "/foo/bar/baz.txt")) ==> (:ABSOLUTE "foo" "bar")
+(pathname-name (pathname "/foo/bar/baz.txt"))      ==> "baz"
+(pathname-type (pathname "/foo/bar/baz.txt"))      ==> "txt"

Three other functions--PATHNAME-HOST, PATHNAME-DEVICE, and +PATHNAME-VERSION--allow you to get at the other three pathname +components, though they're unlikely to have interesting values on +Unix. On Windows either PATHNAME-HOST or PATHNAME-DEVICE +will return the drive letter.

Like many other built-in objects, pathnames have their own read +syntax, #p followed by a double-quoted string. This allows you +to print and read back s-expressions containing pathname objects, but +because the syntax depends on the namestring parsing algorithm, such +data isn't necessarily portable between operating systems.

(pathname "/foo/bar/baz.txt") ==> #p"/foo/bar/baz.txt"

To translate a pathname back to a namestring--for instance, to +present to the user--you can use the function NAMESTRING, which +takes a pathname designator and returns a namestring. Two other +functions, DIRECTORY-NAMESTRING and FILE-NAMESTRING, return +a partial namestring. DIRECTORY-NAMESTRING combines the elements +of the directory component into a local directory name, and +FILE-NAMESTRING combines the name and type components.8

(namestring #p"/foo/bar/baz.txt")           ==> "/foo/bar/baz.txt"
+(directory-namestring #p"/foo/bar/baz.txt") ==> "/foo/bar/"
+(file-namestring #p"/foo/bar/baz.txt")      ==> "baz.txt"

Constructing New Pathnames

You can construct arbitrary pathnames using the MAKE-PATHNAME +function. It takes one keyword argument for each pathname component +and returns a pathname with any supplied components filled in and the +rest NIL.9

(make-pathname
+  :directory '(:absolute "foo" "bar")
+  :name "baz"
+  :type "txt") ==> #p"/foo/bar/baz.txt"

However, if you want your programs to be portable, you probably don't +want to make pathnames completely from scratch: even though the +pathname abstraction protects you from unportable filename syntax, +filenames can be unportable in other ways. For instance, the filename +/home/peter/foo.txt is no good on an OS X box where +/home/ is called /Users/.

Another reason not to make pathnames completely from scratch is that +different implementations use the pathname components slightly +differently. For instance, as mentioned previously, some +Windows-based Lisp implementations store the drive letter in the +device component while others store it in the host component. If you +write code like this:

(make-pathname :device "c" :directory '(:absolute "foo" "bar") :name "baz")

it will be correct on some implementations but not on others.

Rather than making names from scratch, you can build a new pathname +based on an existing pathname with MAKE-PATHNAME's keyword +parameter :defaults. With this parameter you can provide a +pathname designator, which will supply the values for any components +not specified by other arguments. For example, the following +expression creates a pathname with an .html extension and all +other components the same as the pathname in the variable +input-file:

(make-pathname :type "html" :defaults input-file)

Assuming the value in input-file was a user-provided name, +this code will be robust in the face of operating system and +implementation differences such as whether filenames have drive +letters in them and where they're stored in a pathname if they +do.10

You can use the same technique to create a pathname with a different +directory component.

(make-pathname :directory '(:relative "backups") :defaults input-file)

However, this will create a pathname whose whole directory component +is the relative directory backups/, regardless of any +directory component input-file may have had. For example:

(make-pathname :directory '(:relative "backups")
+               :defaults #p"/foo/bar/baz.txt") ==> #p"backups/baz.txt"

Sometimes, though, you want to combine two pathnames, at least one of +which has a relative directory component, by combining their +directory components. For instance, suppose you have a relative +pathname such as #p"foo/bar.html" that you want to combine +with an absolute pathname such as #p"/www/html/" to get +#p"/www/html/foo/bar.html". In that case, MAKE-PATHNAME +won't do; instead, you want MERGE-PATHNAMES.

MERGE-PATHNAMES takes two pathnames and merges them, filling in +any NIL components in the first pathname with the corresponding +value from the second pathname, much like MAKE-PATHNAME fills in +any unspecified components with components from the :defaults +argument. However, MERGE-PATHNAMES treats the directory +component specially: if the first pathname's directory is relative, +the directory component of the resulting pathname will be the first +pathname's directory relative to the second pathname's directory. +Thus:

(merge-pathnames #p"foo/bar.html" #p"/www/html/") ==> #p"/www/html/foo/bar.html"

The second pathname can also be relative, in which case the resulting +pathname will also be relative.

(merge-pathnames #p"foo/bar.html" #p"html/") ==> #p"html/foo/bar.html"

To reverse this process and obtain a filename relative to a +particular root directory, you can use the handy function +ENOUGH-NAMESTRING.

(enough-namestring #p"/www/html/foo/bar.html" #p"/www/") ==> "html/foo/bar.html"

You can then combine ENOUGH-NAMESTRING with MERGE-PATHNAMES +to create a pathname representing the same name but in a different +root.

(merge-pathnames
+  (enough-namestring #p"/www/html/foo/bar/baz.html" #p"/www/")
+  #p"/www-backups/") ==> #p"/www-backups/html/foo/bar/baz.html"

MERGE-PATHNAMES is also used internally by the standard +functions that actually access files in the file system to fill in +incomplete pathnames. For instance, suppose you make a pathname with +just a name and a type.

(make-pathname :name "foo" :type "txt") ==> #p"foo.txt"

If you try to use this pathname as an argument to OPEN, the +missing components, such as the directory, must be filled in before +Lisp will be able to translate the pathname to an actual filename. +Common Lisp will obtain values for the missing components by merging +the given pathname with the value of the variable +*DEFAULT-PATHNAME-DEFAULTS*. The initial value of this variable +is determined by the implementation but is usually a pathname with a +directory component representing the directory where Lisp was started +and appropriate values for the host and device components, if needed. +If invoked with just one argument, MERGE-PATHNAMES will merge +the argument with the value of *DEFAULT-PATHNAME-DEFAULTS*. For +instance, if *DEFAULT-PATHNAME-DEFAULTS* is +#p"/home/peter/", then you'd get the following:

(merge-pathnames #p"foo.txt") ==> #p"/home/peter/foo.txt"

Two Representations of Directory Names

When dealing with pathnames that name directories, you need to be +aware of one wrinkle. Pathnames separate the directory and name +components, but Unix and Windows consider directories just another +kind of file. Thus, on those systems, every directory has two +different pathname representations.

One representation, which I'll call file form, treats a directory +like any other file and puts the last element of the namestring into +the name and type components. The other representation, directory +form, places all the elements of the name in the directory +component, leaving the name and type components NIL. If +/foo/bar/ is a directory, then both of the following pathnames +name it.

(make-pathname :directory '(:absolute "foo") :name "bar") ; file form
+(make-pathname :directory '(:absolute "foo" "bar"))       ; directory form

When you create pathnames with MAKE-PATHNAME, you can control +which form you get, but you need to be careful when dealing with +namestrings. All current implementations create file form pathnames +unless the namestring ends with a path separator. But you can't rely +on user-supplied namestrings necessarily being in one form or +another. For instance, suppose you've prompted the user for a +directory to save a file in and they entered "/home/peter". If +you pass that value as the :defaults argument of +MAKE-PATHNAME like this:

(make-pathname :name "foo" :type "txt" :defaults user-supplied-name)

you'll end up saving the file in /home/foo.txt rather than the +intended /home/peter/foo.txt because the "peter" in the +namestring will be placed in the name component when +user-supplied-name is converted to a pathname. In the pathname +portability library I'll discuss in the next chapter, you'll write a +function called pathname-as-directory that converts a pathname +to directory form. With that function you can reliably save the file +in the directory indicated by the user.

(make-pathname
+  :name "foo" :type "txt" :defaults (pathname-as-directory user-supplied-name))

Interacting with the File System

While the most common interaction with the file system is probably +OPENing files for reading and writing, you'll also occasionally +want to test whether a file exists, list the contents of a directory, +delete and rename files, create directories, and get information +about a file such as who owns it, when it was last modified, and its +length. This is where the generality of the pathname abstraction +begins to cause a bit of pain: because the language standard doesn't +specify how functions that interact with the file system map to any +specific file system, implementers are left with a fair bit of +leeway.

That said, most of the functions that interact with the file system +are still pretty straightforward. I'll discuss the standard functions +here and point out the ones that suffer from nonportability between +implementations. In the next chapter you'll develop a pathname +portability library to smooth over some of those nonportability +issues.

To test whether a file exists in the file system corresponding to a +pathname designator--a pathname, namestring, or file stream--you can +use the function PROBE-FILE. If the file named by the pathname +designator exists, PROBE-FILE returns the file's truename, a +pathname with any file system-level translations such as resolving +symbolic links performed. Otherwise, it returns NIL. However, +not all implementations support using this function to test whether a +directory exists. Also, Common Lisp doesn't provide a portable way to +test whether a given file that exists is a regular file or a +directory. In the next chapter you'll wrap PROBE-FILE with a new +function, file-exists-p, that can both test whether a +directory exists and tell you whether a given name is the name of a +file or directory.

Similarly, the standard function for listing files in the file +system, DIRECTORY, works fine for simple cases, but the +differences between implementations make it tricky to use portably. +In the next chapter you'll define a list-directory function +that smoothes over some of these differences.

DELETE-FILE and RENAME-FILE do what their names suggest. +DELETE-FILE takes a pathname designator and deletes the named +file, returning true if it succeeds. Otherwise it signals a +FILE-ERROR.11

RENAME-FILE takes two pathname designators and renames the file +named by the first name to the second name.

You can create directories with the function +ENSURE-DIRECTORIES-EXIST. It takes a pathname designator and +ensures that all the elements of the directory component exist and +are directories, creating them as necessary. It returns the pathname +it was passed, which makes it convenient to use inline.

(with-open-file (out (ensure-directories-exist name) :direction :output)
+   ...
+   )

Note that if you pass ENSURE-DIRECTORIES-EXIST a directory name, +it should be in directory form, or the leaf directory won't be +created.

The functions FILE-WRITE-DATE and FILE-AUTHOR both take a +pathname designator. FILE-WRITE-DATE returns the time in number +of seconds since midnight January 1, 1900, Greenwich mean time (GMT), +that the file was last written, and FILE-AUTHOR returns, on Unix +and Windows, the file owner.12

To find the length of a file, you can use the function +FILE-LENGTH. For historical reasons FILE-LENGTH takes a +stream as an argument rather than a pathname. In theory this allows +FILE-LENGTH to return the length in terms of the element type of +the stream. However, since on most present-day operating systems, the +only information available about the length of a file, short of +actually reading the whole file to measure it, is its length in +bytes, that's what most implementations return, even when +FILE-LENGTH is passed a character stream. However, the standard +doesn't require this behavior, so for predictable results, the best +way to get the length of a file is to use a binary stream.13

(with-open-file (in filename :element-type '(unsigned-byte 8))
+  (file-length in))

A related function that also takes an open file stream as its +argument is FILE-POSITION. When called with just a stream, this +function returns the current position in the file--the number of +elements that have been read from or written to the stream. When +called with two arguments, the stream and a position designator, it +sets the position of the stream to the designated position. The +position designator must be the keyword :start, the keyword +:end, or a non-negative integer. The two keywords set the +position of the stream to the start or end of the file while an +integer moves to the indicated position in the file. With a binary +stream the position is simply a byte offset into the file. However, +for character streams things are a bit more complicated because of +character-encoding issues. Your best bet, if you need to jump around +within a file of textual data, is to only ever pass, as a second +argument to the two-argument version of FILE-POSITION, a value +previously returned by the one-argument version of FILE-POSITION +with the same stream argument.

Other Kinds of I/O

In addition to file streams, Common Lisp supports other kinds of +streams, which can also be used with the various reading, writing, +and printing I/O functions. For instance, you can read data from, or +write data to, a string using STRING-STREAMs, which you can +create with the functions MAKE-STRING-INPUT-STREAM and +MAKE-STRING-OUTPUT-STREAM.

MAKE-STRING-INPUT-STREAM takes a string and optional start and +end indices to bound the area of the string from which data should be +read and returns a character stream that you can pass to any of the +character-based input functions such as READ-CHAR, +READ-LINE, or READ. For example, if you have a string +containing a floating-point literal in Common Lisp's syntax, you can +convert it to a float like this:

(let ((s (make-string-input-stream "1.23")))
+  (unwind-protect (read s)
+    (close s)))

Similarly, MAKE-STRING-OUTPUT-STREAM creates a stream you can +use with FORMAT, PRINT, WRITE-CHAR, WRITE-LINE, +and so on. It takes no arguments. Whatever you write, a string output +stream will be accumulated into a string that can then be obtained +with the function GET-OUTPUT-STREAM-STRING. Each time you call +GET-OUTPUT-STREAM-STRING, the stream's internal string is +cleared so you can reuse an existing string output stream.

However, you'll rarely use these functions directly, because the +macros WITH-INPUT-FROM-STRING and WITH-OUTPUT-TO-STRING +provide a more convenient interface. WITH-INPUT-FROM-STRING is +similar to WITH-OPEN-FILE--it creates a string input stream from +a given string and then executes the forms in its body with the +stream bound to the variable you provide. For instance, instead of +the LET form with the explicit UNWIND-PROTECT, you'd +probably write this:

(with-input-from-string (s "1.23")
+  (read s))

The WITH-OUTPUT-TO-STRING macro is similar: it binds a newly +created string output stream to a variable you name and then executes +its body. After all the body forms have been executed, +WITH-OUTPUT-TO-STRING returns the value that would be returned +by GET-OUTPUT-STREAM-STRING.

CL-USER> (with-output-to-string (out)
+            (format out "hello, world ")
+            (format out "~s" (list 1 2 3)))
+"hello, world (1 2 3)"

The other kinds of streams defined in the language standard provide +various kinds of stream "plumbing," allowing you to plug together +streams in almost any configuration. A BROADCAST-STREAM is an +output stream that sends any data written to it to a set of output +streams provided as arguments to its constructor function, +MAKE-BROADCAST-STREAM.14 Conversely, a +CONCATENATED-STREAM is an input stream that takes its input from +a set of input streams, moving from stream to stream as it hits the +end of each stream. CONCATENATED-STREAMs are constructed with +the function MAKE-CONCATENATED-STREAM, which takes any number of +input streams as arguments.

Two kinds of bidirectional streams that can plug together streams in +a couple ways are TWO-WAY-STREAM and ECHO-STREAM. Their +constructor functions, MAKE-TWO-WAY-STREAM and +MAKE-ECHO-STREAM, both take two arguments, an input stream and +an output stream, and return a stream of the appropriate type, which +you can use with both input and output functions.

In a TWO-WAY-STREAM every read you perform will return data read +from the underlying input stream, and every write will send data to +the underlying output stream. An ECHO-STREAM works essentially +the same way except that all the data read from the underlying input +stream is also echoed to the output stream. Thus, the output stream +of an ECHO-STREAM stream will contain a transcript of both sides +of the conversation.

Using these five kinds of streams, you can build almost any topology +of stream plumbing you want.

Finally, although the Common Lisp standard doesn't say anything about +networking APIs, most implementations support socket programming and +typically implement sockets as another kind of stream, so you can use +all the regular I/O functions with them.15

Now you're ready to move on to building a library that smoothes over +some of the differences between how the basic pathname functions +behave in different Common Lisp implementations. +


1Note, however, +that while the Lisp reader knows how to skip comments, it completely +skips them. Thus, if you use READ to read in a configuration +file containing comments and then use PRINT to save changes to +the data, you'll lose the comments.

2By default OPEN uses the default +character encoding for the operating system, but it also accepts a +keyword parameter, :external-format, that can pass +implementation-defined values that specify a different encoding. +Character streams also translate the platform-specific end-of-line +sequence to the single character #\Newline.

3The type (unsigned-byte 8) +indicates an 8-bit byte; Common Lisp "byte" types aren't a fixed size +since Lisp has run at various times on architectures with byte sizes +from 6 to 9 bits, to say nothing of the PDP-10, which had +individually addressable variable-length bit fields of 1 to 36 bits.

4In general, a +stream is either a character stream or a binary stream, so you can't +mix calls to READ-BYTE and READ-CHAR or other +character-based read functions. However, some implementations, such +as Allegro, support so-called bivalent streams, which support both +character and binary I/O.

5Some folks expect this wouldn't be a problem in a +garbage-collected language such as Lisp. It is the case in most Lisp +implementations that a stream that becomes garbage will automatically +be closed. However, this isn't something to rely on--the problem is +that garbage collectors usually run only when memory is low; they +don't know about other scarce resources such as file handles. If +there's plenty of memory available, it's easy to run out of file +handles long before the garbage collector runs.

6Another +reason the pathname system is considered somewhat baroque is because +of the inclusion of logical pathnames. However, you can use the +rest of the pathname system perfectly well without knowing anything +more about logical pathnames than that you can safely ignore them. +Briefly, logical pathnames allow Common Lisp programs to contain +references to pathnames without naming specific files. Logical +pathnames could then be mapped to specific locations in an actual +file system when the program was installed by defining a "logical +pathname translation" that translates logical pathnames matching +certain wildcards to pathnames representing files in the file system, +so-called physical pathnames. They have their uses in certain +situations, but you can get pretty far without worrying about them.

7Many Unix-based implementations +treat filenames whose last element starts with a dot and don't +contain any other dots specially, putting the whole element, with the +dot, in the name component and leaving the type component NIL.

(pathname-name (pathname "/foo/.emacs")) ==> ".emacs"
+(pathname-type (pathname "/foo/.emacs")) ==> NIL

However, not all implementations follow this convention; some will +create a pathname with "" as the name and emacs as the type.

8The +name returned by FILE-NAMESTRING also includes the version +component on file systems that use it.

9The host component may not default to NIL, +but if not, it will be an opaque implementation-defined value.

10For absolutely maximum portability, you should really write +this:

(make-pathname :type "html" :version :newest :defaults input-file)

Without the :version argument, on a file system with built-in +versioning, the output pathname would inherit its version number from +the input file which isn't likely to be right--if the input file has +been saved many times it will have a much higher version number than +the generated HTML file. On implementations without file versioning, +the :version argument should be ignored. It's up to you if you +care that much about portability.

11See Chapter 19 for more on handling errors.

12For applications that need access +to other file attributes on a particular operating system or file +system, libraries provide bindings to underlying C system calls. The +Osicat library at http://common-lisp.net/project/osicat/ +provides a simple API built using the Universal Foreign Function +Interface (UFFI), which should run on most Common Lisps that run on a +POSIX operating system.

13The +number of bytes and characters in a file can differ even if you're +not using a multibyte character encoding. Because character streams +also translate platform-specific line endings to a single +#\Newline character, on Windows (which uses CRLF as its line +ending) the number of characters will typically be smaller than the +number of bytes. If you really have to know the number of characters +in a file, you have to bite the bullet and write something like +this:

(with-open-file (in filename)
+  (loop while (read-char in nil) count t))

or maybe something more efficient like this:

(with-open-file (in filename)
+  (let ((scratch (make-string 4096)))
+    (loop for read = (read-sequence scratch in)
+          while (plusp read) sum read)))

14MAKE-BROADCAST-STREAM can make +a data black hole by calling it with no arguments.

15The biggest missing +piece in Common Lisp's standard I/O facilities is a way for users to +define new stream classes. There are, however, two de facto standards +for user-defined streams. During the Common Lisp standardization, +David Gray of Texas Instruments wrote a draft proposal for an API to +allow users to define new stream classes. Unfortunately, there wasn't +time to work out all the issues raised by his draft to include it in +the language standard. However, many implementations support some form +of so-called Gray Streams, basing their API on Gray's draft proposal. +Another, newer API, called Simple Streams, has been developed by Franz +and included in Allegro Common Lisp. It was designed to improve the +performance of user-defined streams relative to Gray Streams and has +been adopted by some of the open-source Common Lisp implementations.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/functions.html b/clones/gigamonkeys.com/book/functions.html new file mode 100644 index 00000000..6cca1e9a --- /dev/null +++ b/clones/gigamonkeys.com/book/functions.html @@ -0,0 +1,498 @@ +Functions

5. Functions

After the rules of syntax and semantics, the three most basic +components of all Lisp programs are functions, variables and macros. +You used all three while building the database in Chapter 3, but I +glossed over a lot of the details of how they work and how to best +use them. I'll devote the next few chapters to these three topics, +starting with functions, which--like their counterparts in other +languages--provide the basic mechanism for abstracting, well, +functionality.

The bulk of Lisp itself consists of functions. More than three +quarters of the names defined in the language standard name +functions. All the built-in data types are defined purely in terms of +what functions operate on them. Even Lisp's powerful object system is +built upon a conceptual extension to functions, generic functions, +which I'll cover in Chapter 16.

And, despite the importance of macros to The Lisp Way, in the end all +real functionality is provided by functions. Macros run at compile +time, so the code they generate--the code that will actually make up +the program after all the macros are expanded--will consist entirely +of calls to functions and special operators. Not to mention, macros +themselves are also functions, albeit functions that are used to +generate code rather than to perform the actions of the +program.1

Defining New Functions

Normally functions are defined using the DEFUN macro. The basic +skeleton of a DEFUN looks like this:

(defun name (parameter*)
+  "Optional documentation string."
+  body-form*)

Any symbol can be used as a function name.2 Usually function names contain only +alphabetic characters and hyphens, but other characters are allowed +and are used in certain naming conventions. For instance, functions +that convert one kind of value to another sometimes use -> in +the name. For example, a function to convert strings to widgets might +be called string->widget. The most important naming convention +is the one mentioned in Chapter 2, which is that you construct +compound names with hyphens rather than underscores or inner caps. +Thus, frob-widget is better Lisp style than either +frob_widget or frobWidget.

A function's parameter list defines the variables that will be used +to hold the arguments passed to the function when it's +called.3 If the function takes no +arguments, the list is empty, written as (). Different flavors +of parameters handle required, optional, multiple, and keyword +arguments. I'll discuss the details in the next section.

If a string literal follows the parameter list, it's a documentation +string that should describe the purpose of the function. When the +function is defined, the documentation string will be associated with +the name of the function and can later be obtained using the +DOCUMENTATION function.4

Finally, the body of a DEFUN consists of any number of Lisp +expressions. They will be evaluated in order when the function is +called and the value of the last expression is returned as the value +of the function. Or the RETURN-FROM special operator can be used +to return immediately from anywhere in a function, as I'll discuss in +a moment.

In Chapter 2 we wrote a hello-world function, which looked +like this:

(defun hello-world () (format t "hello, world"))

You can now analyze the parts of this function. Its name is +hello-world, its parameter list is empty so it takes no +arguments, it has no documentation string, and its body consists of +one expression.

(format t "hello, world")

The following is a slightly more complex function:

(defun verbose-sum (x y)
+  "Sum any two numbers after printing a message."
+  (format t "Summing ~d and ~d.~%" x y)
+  (+ x y))

This function is named verbose-sum, takes two arguments that +will be bound to the parameters x and y, has a +documentation string, and has a body consisting of two expressions. +The value returned by the call to + becomes the return value of +verbose-sum.

Function Parameter Lists

There's not a lot more to say about function names or documentation +strings, and it will take a good portion of the rest of this book to +describe all the things you can do in the body of a function, which +leaves us with the parameter list.

The basic purpose of a parameter list is, of course, to declare the +variables that will receive the arguments passed to the function. +When a parameter list is a simple list of variable names--as in +verbose-sum--the parameters are called required +parameters. When a function is called, it must be supplied with one +argument for every required parameter. Each parameter is bound to the +corresponding argument. If a function is called with too few or too +many arguments, Lisp will signal an error.

However, Common Lisp's parameter lists also give you more flexible +ways of mapping the arguments in a function call to the function's +parameters. In addition to required parameters, a function can have +optional parameters. Or a function can have a single parameter that's +bound to a list containing any extra arguments. And, finally, +arguments can be mapped to parameters using keywords rather than +position. Thus, Common Lisp's parameter lists provide a convenient +solution to several common coding problems.

Optional Parameters

While many functions, like verbose-sum, need only required +parameters, not all functions are quite so simple. Sometimes a +function will have a parameter that only certain callers will care +about, perhaps because there's a reasonable default value. An example +is a function that creates a data structure that can grow as needed. +Since the data structure can grow, it doesn't matter--from a +correctness point of view--what the initial size is. But callers who +have a good idea how many items they're going to put into the data +structure may be able to improve performance by specifying a specific +initial size. Most callers, though, would probably rather let the +code that implements the data structure pick a good general-purpose +value. In Common Lisp you can accommodate both kinds of callers by +using an optional parameter; callers who don't care will get a +reasonable default, and other callers can provide a specific +value.5

To define a function with optional parameters, after the names of any +required parameters, place the symbol &optional followed by the +names of the optional parameters. A simple example looks like this:

(defun foo (a b &optional c d) (list a b c d))

When the function is called, arguments are first bound to the +required parameters. After all the required parameters have been +given values, if there are any arguments left, their values are +assigned to the optional parameters. If the arguments run out before +the optional parameters do, the remaining optional parameters are +bound to the value NIL. Thus, the function defined previously +gives the following results:

(foo 1 2)     ==> (1 2 NIL NIL)
+(foo 1 2 3)   ==> (1 2 3 NIL)
+(foo 1 2 3 4) ==> (1 2 3 4)

Lisp will still check that an appropriate number of arguments are +passed to the function--in this case between two and four, +inclusive--and will signal an error if the function is called with +too few or too many.

Of course, you'll often want a different default value than NIL. +You can specify the default value by replacing the parameter name +with a list containing a name and an expression. The expression will +be evaluated only if the caller doesn't pass enough arguments to +provide a value for the optional parameter. The common case is simply +to provide a value as the expression.

(defun foo (a &optional (b 10)) (list a b))

This function requires one argument that will be bound to the +parameter a. The second parameter, b, will take either +the value of the second argument, if there is one, or 10.

(foo 1 2) ==> (1 2)
+(foo 1)   ==> (1 10)

Sometimes, however, you may need more flexibility in choosing the +default value. You may want to compute a default value based on other +parameters. And you can--the default-value expression can refer to +parameters that occur earlier in the parameter list. If you were +writing a function that returned some sort of representation of a +rectangle and you wanted to make it especially convenient to make +squares, you might use an argument list like this:

(defun make-rectangle (width &optional (height width)) ...)

which would cause the height parameter to take the same value +as the width parameter unless explicitly specified.

Occasionally, it's useful to know whether the value of an optional +argument was supplied by the caller or is the default value. Rather +than writing code to check whether the value of the parameter is the +default (which doesn't work anyway, if the caller happens to +explicitly pass the default value), you can add another variable name +to the parameter specifier after the default-value expression. This +variable will be bound to true if the caller actually supplied an +argument for this parameter and NIL otherwise. By convention, +these variables are usually named the same as the actual parameter +with a "-supplied-p" on the end. For example:

(defun foo (a b &optional (c 3 c-supplied-p))
+  (list a b c c-supplied-p))

This gives results like this:

(foo 1 2)   ==> (1 2 3 NIL)
+(foo 1 2 3) ==> (1 2 3 T)
+(foo 1 2 4) ==> (1 2 4 T)

Rest Parameters

Optional parameters are just the thing when you have discrete +parameters for which the caller may or may not want to provide +values. But some functions need to take a variable number of +arguments. Several of the built-in functions you've seen already work +this way. FORMAT has two required arguments, the stream and the +control string. But after that it needs a variable number of +arguments depending on how many values need to be interpolated into +the control string. The + function also takes a variable number +of arguments--there's no particular reason to limit it to summing +just two numbers; it will sum any number of values. (It even works +with zero arguments, returning 0, the identity under addition.) The +following are all legal calls of those two functions:

(format t "hello, world")
+(format t "hello, ~a" name)
+(format t "x: ~d y: ~d" x y)
+(+)
+(+ 1)
+(+ 1 2)
+(+ 1 2 3)

Obviously, you could write functions taking a variable number of +arguments by simply giving them a lot of optional parameters. But +that would be incredibly painful--just writing the parameter list +would be bad enough, and that doesn't get into dealing with all the +parameters in the body of the function. To do it properly, you'd have +to have as many optional parameters as the number of arguments that +can legally be passed in a function call. This number is +implementation dependent but guaranteed to be at least 50. And in +current implementations it ranges from 4,096 to 536,870,911.6 Blech. That kind of mind-bending +tedium is definitely not The Lisp Way.

Instead, Lisp lets you include a catchall parameter after the symbol +&rest. If a function includes a &rest parameter, any +arguments remaining after values have been doled out to all the +required and optional parameters are gathered up into a list that +becomes the value of the &rest parameter. Thus, the parameter +lists for FORMAT and + probably look something like this:

(defun format (stream string &rest values) ...)
+(defun + (&rest numbers) ...) 

Keyword Parameters

Optional and rest parameters give you quite a bit of flexibility, but +neither is going to help you out much in the following situation: +Suppose you have a function that takes four optional parameters. Now +suppose that most of the places the function is called, the caller +wants to provide a value for only one of the four parameters and, +further, that the callers are evenly divided as to which parameter +they will use.

The callers who want to provide a value for the first parameter are +fine--they just pass the one optional argument and leave off the +rest. But all the other callers have to pass some value for between +one and three arguments they don't care about. Isn't that exactly the +problem optional parameters were designed to solve?

Of course it is. The problem is that optional parameters are still +positional--if the caller wants to pass an explicit value for the +fourth optional parameter, it turns the first three optional +parameters into required parameters for that caller. Luckily, another +parameter flavor, keyword parameters, allow the caller to specify +which values go with which parameters.

To give a function keyword parameters, after any required, +&optional, and &rest parameters you include the symbol +&key and then any number of keyword parameter specifiers, which +work like optional parameter specifiers. Here's a function that has +only keyword parameters:

(defun foo (&key a b c) (list a b c))

When this function is called, each keyword parameters is bound to the +value immediately following a keyword of the same name. Recall from +Chapter 4 that keywords are names that start with a colon and that +they're automatically defined as self-evaluating constants.

If a given keyword doesn't appear in the argument list, then the +corresponding parameter is assigned its default value, just like an +optional parameter. Because the keyword arguments are labeled, they +can be passed in any order as long as they follow any required +arguments. For instance, foo can be invoked as follows:

(foo)                ==> (NIL NIL NIL)
+(foo :a 1)           ==> (1 NIL NIL)
+(foo :b 1)           ==> (NIL 1 NIL)
+(foo :c 1)           ==> (NIL NIL 1)
+(foo :a 1 :c 3)      ==> (1 NIL 3)
+(foo :a 1 :b 2 :c 3) ==> (1 2 3)
+(foo :a 1 :c 3 :b 2) ==> (1 2 3)

As with optional parameters, keyword parameters can provide a default +value form and the name of a supplied-p variable. In both keyword and +optional parameters, the default value form can refer to parameters +that appear earlier in the parameter list.

(defun foo (&key (a 0) (b 0 b-supplied-p) (c (+ a b)))
+  (list a b c b-supplied-p))
+
+(foo :a 1)           ==> (1 0 1 NIL)
+(foo :b 1)           ==> (0 1 1 T)
+(foo :b 1 :c 4)      ==> (0 1 4 T)
+(foo :a 2 :b 1 :c 4) ==> (2 1 4 T)

Also, if for some reason you want the keyword the caller uses to +specify the parameter to be different from the name of the actual +parameter, you can replace the parameter name with another list +containing the keyword to use when calling the function and the name +to be used for the parameter. The following definition of foo:

(defun foo (&key ((:apple a)) ((:box b) 0) ((:charlie c) 0 c-supplied-p))
+  (list a b c c-supplied-p))

lets the caller call it like this:

(foo :apple 10 :box 20 :charlie 30) ==> (10 20 30 T)

This style is mostly useful if you want to completely decouple the +public API of the function from the internal details, usually because +you want to use short variable names internally but descriptive +keywords in the API. It's not, however, very frequently used.

Mixing Different Parameter Types

It's possible, but rare, to use all four flavors of parameters in a +single function. Whenever more than one flavor of parameter is used, +they must be declared in the order I've discussed them: first the +names of the required parameters, then the optional parameters, then +the rest parameter, and finally the keyword parameters. Typically, +however, in functions that use multiple flavors of parameters, you'll +combine required parameters with one other flavor or possibly combine +&optional and &rest parameters. The other two combinations, +either &optional or &rest parameters combined with +&key parameters, can lead to somewhat surprising behavior.

Combining &optional and &key parameters yields surprising +enough results that you should probably avoid it altogether. The +problem is that if a caller doesn't supply values for all the +optional parameters, then those parameters will eat up the keywords +and values intended for the keyword parameters. For instance, this +function unwisely mixes &optional and &key parameters:

(defun foo (x &optional y &key z) (list x y z))

If called like this, it works fine:

(foo 1 2 :z 3) ==> (1 2 3)

And this is also fine:

(foo 1)  ==> (1 nil nil)

But this will signal an error:

(foo 1 :z 3) ==> ERROR

This is because the keyword :z is taken as a value to fill the +optional y parameter, leaving only the argument 3 to be +processed. At that point, Lisp will be expecting either a +keyword/value pair or nothing and will complain. Perhaps even worse, +if the function had had two &optional parameters, this last call +would have resulted in the values :z and 3 being bound to the +two &optional parameters and the &key parameter z +getting the default value NIL with no indication that anything +was amiss.

In general, if you find yourself writing a function that uses both +&optional and &key parameters, you should probably just +change it to use all &key parameters--they're more flexible, and +you can always add new keyword parameters without disturbing existing +callers of the function. You can also remove keyword parameters, as +long as no one is using them.7 In +general, using keyword parameters helps make code much easier to +maintain and evolve--if you need to add some new behavior to a +function that requires new parameters, you can add keyword parameters +without having to touch, or even recompile, any existing code that +calls the function.

You can safely combine &rest and &key parameters, but the +behavior may be a bit surprising initially. Normally the presence of +either &rest or &key in a parameter list causes all the +values remaining after the required and &optional parameters +have been filled in to be processed in a particular way--either +gathered into a list for a &rest parameter or assigned to the +appropriate &key parameters based on the keywords. If both +&rest and &key appear in a parameter list, then both things +happen--all the remaining values, which include the keywords +themselves, are gathered into a list that's bound to the &rest +parameter, and the appropriate values are also bound to the &key +parameters. So, given this function:

(defun foo (&rest rest &key a b c) (list rest a b c))

you get this result:

(foo :a 1 :b 2 :c 3)  ==> ((:A 1 :B 2 :C 3) 1 2 3)

Function Return Values

All the functions you've written so far have used the default +behavior of returning the value of the last expression evaluated as +their own return value. This is the most common way to return a value +from a function.

However, sometimes it's convenient to be able to return from the +middle of a function such as when you want to break out of nested +control constructs. In such cases you can use the RETURN-FROM +special operator to immediately return any value from the function.

You'll see in Chapter 20 that RETURN-FROM is actually not tied +to functions at all; it's used to return from a block of code defined +with the BLOCK special operator. However, DEFUN +automatically wraps the whole function body in a block with the same +name as the function. So, evaluating a RETURN-FROM with the name +of the function and the value you want to return will cause the +function to immediately exit with that value. RETURN-FROM is a +special operator whose first "argument" is the name of the block from +which to return. This name isn't evaluated and thus isn't quoted.

The following function uses nested loops to find the first pair of +numbers, each less than 10, whose product is greater than the +argument, and it uses RETURN-FROM to return the pair as soon as +it finds it:

(defun foo (n)
+  (dotimes (i 10)
+    (dotimes (j 10)
+      (when (> (* i j) n)
+        (return-from foo (list i j))))))

Admittedly, having to specify the name of the function you're +returning from is a bit of a pain--for one thing, if you change the +function's name, you'll need to change the name used in the +RETURN-FROM as well.8 But +it's also the case that explicit RETURN-FROMs are used much less +frequently in Lisp than return statements in C-derived +languages, because all Lisp expressions, including control +constructs such as loops and conditionals, evaluate to a value. So +it's not much of a problem in practice.

Functions As Data, a.k.a. Higher-Order Functions

While the main way you use functions is to call them by name, a +number of situations exist where it's useful to be able treat +functions as data. For instance, if you can pass one function as an +argument to another, you can write a general-purpose sorting function +while allowing the caller to provide a function that's responsible +for comparing any two elements. Then the same underlying algorithm +can be used with many different comparison functions. Similarly, +callbacks and hooks depend on being able to store references to code +in order to run it later. Since functions are already the standard +way to abstract bits of code, it makes sense to allow functions to be +treated as data.9

In Lisp, functions are just another kind of object. When you define a +function with DEFUN, you're really doing two things: creating a +new function object and giving it a name. It's also possible, as you +saw in Chapter 3, to use LAMBDA expressions to create a function +without giving it a name. The actual representation of a function +object, whether named or anonymous, is opaque--in a native-compiling +Lisp, it probably consists mostly of machine code. The only things +you need to know are how to get hold of it and how to invoke it once +you've got it.

The special operator FUNCTION provides the mechanism for getting +at a function object. It takes a single argument and returns the +function with that name. The name isn't quoted. Thus, if you've +defined a function foo, like so:

CL-USER> (defun foo (x) (* 2 x))
+FOO

you can get the function object like this:10

CL-USER> (function foo)
+#<Interpreted Function FOO>

In fact, you've already used FUNCTION, but it was in disguise. +The syntax #', which you used in Chapter 3, is syntactic sugar +for FUNCTION, just the way ' is syntactic sugar for +QUOTE.11 Thus, you can also get +the function object for foo like this:

CL-USER> #'foo
+#<Interpreted Function FOO>

Once you've got the function object, there's really only one thing +you can do with it--invoke it. Common Lisp provides two functions +for invoking a function through a function object: FUNCALL and +APPLY.12 They differ +only in how they obtain the arguments to pass to the function.

FUNCALL is the one to use when you know the number of arguments +you're going to pass to the function at the time you write the code. +The first argument to FUNCALL is the function object to be +invoked, and the rest of the arguments are passed onto that function. +Thus, the following two expressions are equivalent:

(foo 1 2 3) === (funcall #'foo 1 2 3)

However, there's little point in using FUNCALL to call a +function whose name you know when you write the code. In fact, the +previous two expressions will quite likely compile to exactly the +same machine instructions.

The following function demonstrates a more apt use of FUNCALL. +It accepts a function object as an argument and plots a simple +ASCII-art histogram of the values returned by the argument function +when it's invoked on the values from min to max, +stepping by step.

(defun plot (fn min max step)
+  (loop for i from min to max by step do
+        (loop repeat (funcall fn i) do (format t "*"))
+        (format t "~%")))

The FUNCALL expression computes the value of the function for +each value of i. The inner LOOP uses that computed value +to determine how many times to print an asterisk to standard output.

Note that you don't use FUNCTION or #' to get the +function value of fn; you want it to be interpreted as a +variable because it's the variable's value that will be the function +object. You can call plot with any function that takes a +single numeric argument, such as the built-in function EXP that +returns the value of e raised to the power of its argument.

CL-USER> (plot #'exp 0 4 1/2)
+*
+*
+**
+****
+*******
+************
+********************
+*********************************
+******************************************************
+NIL

FUNCALL, however, doesn't do you any good when the argument list +is known only at runtime. For instance, to stick with the plot +function for another moment, suppose you've obtained a list +containing a function object, a minimum and maximum value, and a step +value. In other words, the list contains the values you want to pass +as arguments to plot. Suppose this list is in the variable +plot-data. You could invoke plot on the values in that +list like this:

(plot (first plot-data) (second plot-data) (third plot-data) (fourth plot-data))

This works fine, but it's pretty annoying to have to explicitly +unpack the arguments just so you can pass them to plot.

That's where APPLY comes in. Like FUNCALL, the first +argument to APPLY is a function object. But after the function +object, instead of individual arguments, it expects a list. It then +applies the function to the values in the list. This allows you to +write the following instead:

(apply #'plot plot-data)

As a further convenience, APPLY can also accept "loose" +arguments as long as the last argument is a list. Thus, if +plot-data contained just the min, max, and step values, you +could still use APPLY like this to plot the EXP function +over that range:

(apply #'plot #'exp plot-data)

APPLY doesn't care about whether the function being applied +takes &optional, &rest, or &key arguments--the +argument list produced by combining any loose arguments with the +final list must be a legal argument list for the function with enough +arguments for all the required parameters and only appropriate +keyword parameters.

Anonymous Functions

Once you start writing, or even simply using, functions that accept +other functions as arguments, you're bound to discover that sometimes +it's annoying to have to define and name a whole separate function +that's used in only one place, especially when you never call it by +name.

When it seems like overkill to define a new function with DEFUN, +you can create an "anonymous" function using a LAMBDA +expression. As discussed in Chapter 3, a LAMBDA expression looks +like this:

(lambda (parameters) body)

One way to think of LAMBDA expressions is as a special kind of +function name where the name itself directly describes what the +function does. This explains why you can use a LAMBDA expression +in the place of a function name with #'.

(funcall #'(lambda (x y) (+ x y)) 2 3) ==> 5

You can even use a LAMBDA expression as the "name" of a function +in a function call expression. If you wanted, you could write the +previous FUNCALL expression more concisely.

((lambda (x y) (+ x y)) 2 3) ==> 5

But this is almost never done; it's merely worth noting that it's +legal in order to emphasize that LAMBDA expressions can be used +anywhere a normal function name can be.13

Anonymous functions can be useful when you need to pass a function as +an argument to another function and the function you need to pass is +simple enough to express inline. For instance, suppose you wanted to +plot the function 2x. You could define the following +function:

(defun double (x) (* 2 x))

which you could then pass to plot.

CL-USER> (plot #'double 0 10 1)
+
+**
+****
+******
+********
+**********
+************
+**************
+****************
+******************
+********************
+NIL

But it's easier, and arguably clearer, to write this:

CL-USER> (plot #'(lambda (x) (* 2 x)) 0 10 1)
+
+**
+****
+******
+********
+**********
+************
+**************
+****************
+******************
+********************
+NIL

The other important use of LAMBDA expressions is in making +closures, functions that capture part of the environment where +they're created. You used closures a bit in Chapter 3, but the +details of how closures work and what they're used for is really more +about how variables work than functions, so I'll save that discussion +for the next chapter. +


1Despite the importance of functions in Common Lisp, it +isn't really accurate to describe it as a functional language. +It's true some of Common Lisp's features, such as its list +manipulation functions, are designed to be used in a body-form* style +and that Lisp has a prominent place in the history of functional +programming--McCarthy introduced many ideas that are now considered +important in functional programming--but Common Lisp was +intentionally designed to support many different styles of +programming. In the Lisp family, Scheme is the nearest thing to a +"pure" functional language, and even it has several features that +disqualify it from absolute purity compared to languages such as +Haskell and ML.

2Well, almost any +symbol. It's undefined what happens if you use any of the names +defined in the language standard as a name for one of your own +functions. However, as you'll see in Chapter 21, the Lisp package +system allows you to create names in different namespaces, so this +isn't really an issue.

3Parameter lists are sometimes also called lambda +lists because of the historical relationship between Lisp's notion +of functions and the lambda calculus.

4For example, the following:

(documentation 'foo 'function)

returns the documentation string for the function foo. Note, +however, that documentation strings are intended for human +consumption, not programmatic access. A Lisp implementation isn't +required to store them and is allowed to discard them at any time, +so portable programs shouldn't depend on their presence. In some +implementations an implementation-defined variable needs to be set +before it will store documentation strings.

5In languages that don't support optional parameters +directly, programmers typically find ways to simulate them. One +technique is to use distinguished "no-value" values that the caller +can pass to indicate they want the default value of a given +parameter. In C, for example, it's common to use NULL as such +a distinguished value. However, such a protocol between the function +and its callers is ad hoc--in some functions or for some arguments +NULL may be the distinguished value while in other functions +or for other arguments the magic value may be -1 or some +#defined constant.

6The +constant CALL-ARGUMENTS-LIMIT tells you the +implementation-specific value.

7Four standard functions take +both &optional and &key arguments--READ-FROM-STRING, +PARSE-NAMESTRING, WRITE-LINE, and WRITE-STRING. They +were left that way during standardization for backward compatibility +with earlier Lisp dialects. READ-FROM-STRING tends to be the one +that catches new Lisp programmers most frequently--a call such as +(read-from-string s :start 10) seems to ignore the +:start keyword argument, reading from index 0 instead of 10. +That's because READ-FROM-STRING also has two &optional +parameters that swallowed up the arguments :start and 10.

8Another macro, RETURN, doesn't +require a name. However, you can't use it instead of RETURN-FROM +to avoid having to specify the function name; it's syntactic sugar +for returning from a block named NIL. I'll cover it, along with +the details of BLOCK and RETURN-FROM, in Chapter 20.

9Lisp, of course, isn't the only language to +treat functions as data. C uses function pointers, Perl uses +subroutine references, Python uses a scheme similar to Lisp, and C# +introduces delegates, essentially typed function pointers, as an +improvement over Java's rather clunky reflection and anonymous class +mechanisms.

10The exact printed +representation of a function object will differ from implementation +to implementation.

11The best way to think of FUNCTION is as a +special kind of quotation. QUOTEing a symbol prevents it from +being evaluated at all, resulting in the symbol itself rather than +the value of the variable named by that symbol. FUNCTION also +circumvents the normal evaluation rule but, instead of preventing the +symbol from being evaluated at all, causes it to be evaluated as the +name of a function, just the way it would if it were used as the +function name in a function call expression.

12There's actually a third, the special operator +MULTIPLE-VALUE-CALL, but I'll save that for when I discuss +expressions that return multiple values in Chapter 20.

13In Common Lisp it's also +possible to use a LAMBDA expression as an argument to +FUNCALL (or some other function that takes a function argument +such as SORT or MAPCAR) with no #' before it, like +this:

(funcall (lambda (x y) (+ x y)) 2 3)

This is legal and is equivalent to the version with the #' but +for a tricky reason. Historically LAMBDA expressions by +themselves weren't expressions that could be evaluated. That is +LAMBDA wasn't the name of a function, macro, or special operator. +Rather, a list starting with the symbol LAMBDA was a special +syntactic construct that Lisp recognized as a kind of function name.

But if that were still true, then (funcall (lambda (...) ...)) +would be illegal because FUNCALL is a function and the normal +evaluation rule for a function call would require that the LAMBDA +expression be evaluated. However, late in the ANSI standardization +process, in order to make it possible to implement ISLISP, another +Lisp dialect being standardized at the same time, strictly as a +user-level compatibility layer on top of Common Lisp, a LAMBDA +macro was defined that expands into a call to FUNCTION wrapped +around the LAMBDA expression. In other words, the following +LAMBDA expression:

(lambda () 42)

exands into the following when it occurs in a context where it evaluated:

(function (lambda () 42))   ; or #'(lambda () 42)

This makes its use in a value position, such as an argument to +FUNCALL, legal. In other words, it's pure syntactic sugar. Most +folks either always use #' before LAMBDA expressions in +value positions or never do. In this book, I always use #'.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/index.html b/clones/gigamonkeys.com/book/index.html new file mode 100644 index 00000000..4d2805b6 --- /dev/null +++ b/clones/gigamonkeys.com/book/index.html @@ -0,0 +1,161 @@ + + + Practical Common Lisp + + + + + + +

Practical Common Lisp

+

that book is dead sexy —Xach on #lisp

+

(more blurbs)

+

This page, and the pages it links to, contain text + of the Common Lisp book Practical Common + Lisp published by Apress These pages now contain the final text as it + appears in the book. If you find errors in these + pages, please send email + to book@gigamonkeys.com. + These pages will remain online in perpetuity—I hope + they will serve as a useful introduction to Common + Lisp for folks who are curious about Lisp but maybe + not yet curious enough to shell out big bucks for a + dead-tree book and a good Common Lisp tutorial for folks who want to get down to real coding right away. However, don't let that stop you from + buying the printed version available from Apress at + your favorite local or online bookseller. For the + complete bookstore browsing experience, you can read + the letter to the + reader that appears on the back cover of the + treeware edition of the book.

+
+

Coders at Work out!

+

My new book, + Coders at Work, a collection + of Q&A interviews with fifteen all-time great + programmers and computer scientists, is out and available from + Amazon, + Barnes & Noble, + Powell's, + other fine booksellers near you and as an eBook from Apress.

+ + +

Buy Practical Common Lisp now

+

+ Amazon | + Powells | + Barnes & Noble +

+ +
+

Download source code: tar.gz | zip

+
+

Spread the word

+

Like what you've read? + Then help spread the word. Recommend this book to your friends. + Write + a review + on Amazon. Blog about it. Link to this page from your web site. + Whatever. Apress took a chance, publishing this book when other + publishers thought there was no market for a Lisp book. While + it's unlikely that I'll get rich off my royalties, we don't have + to sell all that many copies for Apress to turn a profit and show + the naysayers that Lisp has legs yet.

+
+
    +
  1. Introduction: Why Lisp?
  2. +
  3. Lather, Rinse, Repeat: A Tour of the REPL
  4. +
  5. Practical: A Simple Database
  6. +
  7. Syntax and Semantics
  8. +
  9. Functions
  10. +
  11. Variables
  12. +
  13. Macros: Standard Control Constructs
  14. +
  15. Macros: Defining Your Own
  16. +
  17. Practical: Building a Unit Test Framework
  18. +
  19. Numbers, Characters, and Strings
  20. +
  21. Collections
  22. +
  23. They Called It LISP for a Reason: List Processing
  24. +
  25. Beyond Lists: Other Uses for Cons Cells
  26. +
  27. Files and File I/O
  28. +
  29. Practical: A Portable Pathname Library
  30. +
  31. Object Reorientation: Generic Functions
  32. +
  33. Object Reorientation: Classes
  34. +
  35. A Few FORMAT Recipes
  36. +
  37. Beyond Exception Handling: Conditions and Restarts
  38. +
  39. The Special Operators
  40. +
  41. Programming in the Large: Packages and Symbols
  42. +
  43. LOOP for Black Belts
  44. +
  45. Practical: A Spam Filter
  46. +
  47. Practical: Parsing Binary Files
  48. +
  49. Practical: An ID3 Parser
  50. +
  51. Practical: Web Programming with AllegroServe
  52. +
  53. Practical: An MP3 Database
  54. +
  55. Practical: A Shoutcast Server
  56. +
  57. Practical: An MP3 Browser
  58. +
  59. Practical: An HTML Generation Library, the Interpreter
  60. +
  61. Practical: An HTML Generation Library, the Compiler
  62. +
  63. Conclusion: What's Next?
  64. +
+ + + + diff --git a/clones/gigamonkeys.com/book/introduction-why-lisp.html b/clones/gigamonkeys.com/book/introduction-why-lisp.html new file mode 100644 index 00000000..efab2cdd --- /dev/null +++ b/clones/gigamonkeys.com/book/introduction-why-lisp.html @@ -0,0 +1,365 @@ +Introduction: Why Lisp?

1. Introduction: Why Lisp?

If you think the greatest pleasure in programming comes from getting +a lot done with code that simply and clearly expresses your +intention, then programming in Common Lisp is likely to be about the +most fun you can have with a computer. You'll get more done, faster, +using it than you would using pretty much any other language.

That's a bold claim. Can I justify it? Not in a just a few pages in +this chapter--you're going to have to learn some Lisp and see for +yourself--thus the rest of this book. For now, let me start with some +anecdotal evidence, the story of my own road to Lisp. Then, in the +next section, I'll explain the payoff I think you'll get from +learning Common Lisp.

I'm one of what must be a fairly small number of second-generation +Lisp hackers. My father got his start in computers writing an +operating system in assembly for the machine he used to gather data +for his doctoral dissertation in physics. After running computer +systems at various physics labs, by the 1980s he had left physics +altogether and was working at a large pharmaceutical company. That +company had a project under way to develop software to model +production processes in its chemical plants--if you increase the size +of this vessel, how does it affect annual production? The original +team, writing in FORTRAN, had burned through half the money and +almost all the time allotted to the project with nothing to show for +their efforts. This being the 1980s and the middle of the artificial +intelligence (AI) boom, Lisp was in the air. So my dad--at that point +not a Lisper--went to Carnegie Mellon University (CMU) to talk to +some of the folks working on what was to become Common Lisp about +whether Lisp might be a good language for this project.

The CMU folks showed him some demos of stuff they were working on, +and he was convinced. He in turn convinced his bosses to let his team +take over the failing project and do it in Lisp. A year later, and +using only what was left of the original budget, his team delivered a +working application with features that the original team had given up +any hope of delivering. My dad credits his team's success to their +decision to use Lisp.

Now, that's just one anecdote. And maybe my dad is wrong about why +they succeeded. Or maybe Lisp was better only in comparison to other +languages of the day. These days we have lots of fancy new languages, +many of which have incorporated features from Lisp. Am I really +saying Lisp can offer you the same benefits today as it offered my +dad in the 1980s? Read on.

Despite my father's best efforts, I didn't learn any Lisp in high +school. After a college career that didn't involve much programming +in any language, I was seduced by the Web and back into computers. I +worked first in Perl, learning enough to be dangerous while building +an online discussion forum for Mother Jones magazine's Web site +and then moving to a Web shop, Organic Online, where I worked on +big--for the time--Web sites such as the one Nike put up during the +1996 Olympics. Later I moved onto Java as an early developer at +WebLogic, now part of BEA. After WebLogic, I joined another startup +where I was the lead programmer on a team building a transactional +messaging system in Java. Along the way, my general interest in +programming languages led me to explore such mainstream languages as +C, C++, and Python, as well as less well-known ones such as +Smalltalk, Eiffel, and Beta.

So I knew two languages inside and out and was familiar with another +half dozen. Eventually, however, I realized my interest in +programming languages was really rooted in the idea planted by my +father's tales of Lisp--that different languages really are +different, and that, despite the formal Turing equivalence of all +programming languages, you really can get more done more quickly in +some languages than others and have more fun doing it. Yet, +ironically, I had never spent that much time with Lisp itself. So, I +started doing some Lisp hacking in my free time. And whenever I did, +it was exhilarating how quickly I was able to go from idea to working +code.

For example, one vacation, having a week or so to hack Lisp, I +decided to try writing a version of a program--a system for breeding +genetic algorithms to play the game of Go--that I had written early +in my career as a Java programmer. Even handicapped by my then +rudimentary knowledge of Common Lisp and having to look up even basic +functions, it still felt more productive than it would have been to +rewrite the same program in Java, even with several extra years of +Java experience acquired since writing the first version.

A similar experiment led to the library I'll discuss in Chapter 24. +Early in my time at WebLogic I had written a library, in Java, for +taking apart Java class files. It worked, but the code was a bit of a +mess and hard to modify or extend. I had tried several times, over +the years, to rewrite that library, thinking that with my +ever-improving Java chops I'd find some way to do it that didn't bog +down in piles of duplicated code. I never found a way. But when I +tried to do it in Common Lisp, it took me only two days, and I ended +up not only with a Java class file parser but with a general-purpose +library for taking apart any kind of binary file. You'll see how that +library works in Chapter 24 and use it in Chapter 25 to write a +parser for the ID3 tags embedded in MP3 files.

Why Lisp?

It's hard, in only a few pages of an introductory chapter, to explain +why users of a language like it, and it's even harder to make the +case for why you should invest your time in learning a certain +language. Personal history only gets us so far. Perhaps I like Lisp +because of some quirk in the way my brain is wired. It could even be +genetic, since my dad has it too. So before you dive into learning +Lisp, it's reasonable to want to know what the payoff is going to be.

For some languages, the payoff is relatively obvious. For instance, if +you want to write low-level code on Unix, you should learn C. Or if +you want to write certain kinds of cross-platform applications, you +should learn Java. And any of a number companies still use a lot of +C++, so if you want to get a job at one of them, you should learn C++.

For most languages, however, the payoff isn't so easily categorized; +it has to do with subjective criteria such as how it feels to use the +language. Perl advocates like to say that Perl "makes easy things +easy and hard things possible" and revel in the fact that, as the +Perl motto has it, "There's more than one way to do it."1 Python's +fans, on the other hand, think Python is clean and simple and think +Python code is easier to understand because, as their motto says, +"There's only one way to do it."

So, why Common Lisp? There's no immediately obvious payoff for +adopting Common Lisp the way there is for C, Java, and C++ (unless, +of course, you happen to own a Lisp Machine). The benefits of using +Lisp have much more to do with the experience of using it. I'll spend +the rest of this book showing you the specific features of Common +Lisp and how to use them so you can see for yourself what it's like. +For now I'll try to give you a sense of Lisp's philosophy.

The nearest thing Common Lisp has to a motto is the koan-like +description, "the programmable programming language." While cryptic, +that description gets at the root of the biggest advantage Common +Lisp still has over other languages. More than any other language, +Common Lisp follows the philosophy that what's good for the +language's designer is good for the language's users. Thus, when +you're programming in Common Lisp, you almost never find yourself +wishing the language supported some feature that would make your +program easier to write, because, as you'll see throughout this book, +you can just add the feature yourself.

Consequently, a Common Lisp program tends to provide a much clearer +mapping between your ideas about how the program works and the code +you actually write. Your ideas aren't obscured by boilerplate code +and endlessly repeated idioms. This makes your code easier to +maintain because you don't have to wade through reams of code every +time you need to make a change. Even systemic changes to a program's +behavior can often be achieved with relatively small changes to the +actual code. This also means you'll develop code more quickly; +there's less code to write, and you don't waste time thrashing around +trying to find a clean way to express yourself within the limitations +of the language.2

Common Lisp is also an excellent language for exploratory +programming--if you don't know exactly how your program is going to +work when you first sit down to write it, Common Lisp provides +several features to help you develop your code incrementally and +interactively.

For starters, the interactive read-eval-print loop, which I'll +introduce in the next chapter, lets you continually interact with +your program as you develop it. Write a new function. Test it. Change +it. Try a different approach. You never have to stop for a lengthy +compilation cycle.3

Other features that support a flowing, interactive programming style +are Lisp's dynamic typing and the Common Lisp condition system. +Because of the former, you spend less time convincing the compiler +you should be allowed to run your code and more time actually running +it and working on it,4 and the latter lets you +develop even your error handling code interactively.

Another consequence of being "a programmable programming language" is +that Common Lisp, in addition to incorporating small changes that +make particular programs easier to write, can easily adopt big new +ideas about how programming languages should work. For instance, the +original implementation of the Common Lisp Object System (CLOS), +Common Lisp's powerful object system, was as a library written in +portable Common Lisp. This allowed Lisp programmers to gain actual +experience with the facilities it provided before it was officially +incorporated into the language.

Whatever new paradigm comes down the pike next, it's extremely likely +that Common Lisp will be able to absorb it without requiring any +changes to the core language. For example, a Lisper has recently +written a library, AspectL, that adds support for aspect-oriented +programming (AOP) to Common Lisp.5 If AOP turns out to +be the next big thing, Common Lisp will be able to support it without +any changes to the base language and without extra preprocessors and +extra compilers.6

Where It Began

Common Lisp is the modern descendant of the Lisp language first +conceived by John McCarthy in 1956. Lisp circa 1956 was designed for +"symbolic data processing"7 and derived its name from one of the things it +was quite good at: LISt Processing. We've come a long way since then: +Common Lisp sports as fine an array of modern data types as you can +ask for: a condition system that, as you'll see in Chapter 19, +provides a whole level of flexibility missing from the exception +systems of languages such as Java, Python, and C++; powerful +facilities for doing object-oriented programming; and several language +facilities that just don't exist in other programming languages. How +is this possible? What on Earth would provoke the evolution of such a +well-equipped language?

Well, McCarthy was (and still is) an artificial intelligence (AI) +researcher, and many of the features he built into his initial +version of the language made it an excellent language for AI +programming. During the AI boom of the 1980s, Lisp remained a +favorite tool for programmers writing software to solve hard problems +such as automated theorem proving, planning and scheduling, and +computer vision. These were problems that required a lot of +hard-to-write software; to make a dent in them, AI programmers needed +a powerful language, and they grew Lisp into the language they +needed. And the Cold War helped--as the Pentagon poured money into +the Defense Advanced Research Projects Agency (DARPA), a lot of it +went to folks working on problems such as large-scale battlefield +simulations, automated planning, and natural language interfaces. +These folks also used Lisp and continued pushing it to do what they +needed.

The same forces that drove Lisp's feature evolution also pushed the +envelope along other dimensions--big AI problems eat up a lot of +computing resources however you code them, and if you run Moore's law +in reverse for 20 years, you can imagine how scarce computing +resources were on circa-80s hardware. The Lisp guys had to find all +kinds of ways to squeeze performance out of their implementations. +Modern Common Lisp implementations are the heirs to those early +efforts and often include quite sophisticated, native machine +code-generating compilers. While today, thanks to Moore's law, it's +possible to get usable performance from a purely interpreted +language, that's no longer an issue for Common Lisp. As I'll show in +Chapter 32, with proper (optional) declarations, a good Lisp compiler +can generate machine code quite similar to what might be generated by +a C compiler.

The 1980s were also the era of the Lisp Machines, with several +companies, most famously Symbolics, producing computers that ran Lisp +natively from the chips up. Thus, Lisp became a systems programming +language, used for writing the operating system, editors, compilers, +and pretty much everything else that ran on the Lisp Machines.

In fact, by the early 1980s, with various AI labs and the Lisp +machine vendors all providing their own Lisp implementations, there +was such a proliferation of Lisp systems and dialects that the folks +at DARPA began to express concern about the Lisp community +splintering. To address this concern, a grassroots group of Lisp +hackers got together in 1981 and began the process of standardizing a +new language called Common Lisp that combined the best features from +the existing Lisp dialects. Their work was documented in the book +Common Lisp the Language by Guy Steele (Digital Press, +1984)--CLtL to the Lisp-cognoscenti.

By 1986 the first Common Lisp implementations were available, and the +writing was on the wall for the dialects it was intended to replace. +In 1996, the American National Standards Institute (ANSI) released a +standard for Common Lisp that built on and extended the language +specified in CLtL, adding some major new features such as the CLOS +and the condition system. And even that wasn't the last word: like +CLtL before it, the ANSI standard intentionally leaves room for +implementers to experiment with the best way to do things: a full +Lisp implementation provides a rich runtime environment with access +to GUI widgets, multiple threads of control, TCP/IP sockets, and +more. These days Common Lisp is evolving much like other open-source +languages--the folks who use it write the libraries they need and +often make them available to others. In the last few years, in +particular, there has been a spurt of activity in open-source Lisp +libraries.

So, on one hand, Lisp is one of computer science's "classical" +languages, based on ideas that have stood the test of time.8 On the other, it's a +thoroughly modern, general-purpose language whose design reflects a +deeply pragmatic approach to solving real problems as efficiently and +robustly as possible. The only downside of Lisp's "classical" heritage +is that lots of folks are still walking around with ideas about Lisp +based on some particular flavor of Lisp they were exposed to at some +particular time in the nearly half century since McCarthy invented +Lisp. If someone tells you Lisp is only interpreted, that it's slow, +or that you have to use recursion for everything, ask them what +dialect of Lisp they're talking about and whether people were wearing +bell-bottoms when they learned it.9

But I learned Lisp Once, And IT Wasn't Like what you're describing

Who This Book Is For

This book is for you if you're curious about Common Lisp, regardless +of whether you're already convinced you want to use it or if you just +want to know what all the fuss is about.

If you've learned some Lisp already but have had trouble making the +leap from academic exercises to real programs, this book should get +you on your way. On the other hand, you don't have to be already +convinced that you want to use Lisp to get something out of this +book.

If you're a hard-nosed pragmatist who wants to know what advantages +Common Lisp has over languages such as Perl, Python, Java, C, or C#, +this book should give you some ideas. Or maybe you don't even care +about using Lisp--maybe you're already sure Lisp isn't really any +better than other languages you know but are annoyed by some Lisper +telling you that's because you just don't "get it." If so, this book +will give you a straight-to-the-point introduction to Common Lisp. +If, after reading this book, you still think Common Lisp is no better +than your current favorite languages, you'll be in an excellent +position to explain exactly why.

I cover not only the syntax and semantics of the language but also +how you can use it to write software that does useful stuff. In the +first part of the book, I'll cover the language itself, mixing in a +few "practical" chapters, where I'll show you how to write real code. +Then, after I've covered most of the language, including several +parts that other books leave for you to figure out on your own, the +remainder of the book consists of nine more practical chapters where +I'll help you write several medium-sized programs that actually do +things you might find useful: filter spam, parse binary files, +catalog MP3s, stream MP3s over a network, and provide a Web interface +for the MP3 catalog and server.

After you finish this book, you'll be familiar with all the most +important features of the language and how they fit together, you'll +have used Common Lisp to write several nontrivial programs, and +you'll be well prepared to continue exploring the language on your +own. While everyone's road to Lisp is different, I hope this book +will help smooth the way for you. So, let's begin.


1Perl is +also worth learning as "the duct tape of the Internet."

2Unfortunately, there's little actual research +on the productivity of different languages. One report that shows +Lisp coming out well compared to C++ and Java in the combination of +programmer and program efficiency is discussed at +http://www.norvig.com/java-lisp.html.

3Psychologists have identified a state of mind +called flow in which we're capable of incredible concentration +and productivity. The importance of flow to programming has been +recognized for nearly two decades since it was discussed in the +classic book about human factors in programming Peopleware: +Productive Projects and Teams by Tom DeMarco and Timothy Lister +(Dorset House, 1987). The two key facts about flow are that it takes +around 15 minutes to get into a state of flow and that even brief +interruptions can break you right out of it, requiring another +15-minute immersion to reenter. DeMarco and Lister, like most +subsequent authors, concerned themselves mostly with flow-destroying +interruptions such as ringing telephones and inopportune visits from +the boss. Less frequently considered but probably just as important +to programmers are the interruptions caused by our tools. Languages +that require, for instance, a lengthy compilation before you can try +your latest code can be just as inimical to flow as a noisy phone or +a nosy boss. So, one way to look at Lisp is as a language designed to +keep you in a state of flow.

4This point is bound to be somewhat +controversial, at least with some folks. Static versus dynamic typing +is one of the classic religious wars in programming. If you're coming +from C++ and Java (or from statically typed functional languages such +as Haskel and ML) and refuse to consider living without static type +checks, you might as well put this book down now. However, before you +do, you might first want to check out what self-described "statically +typed bigot" Robert Martin (author of Designing Object Oriented +C++ Applications Using the Booch Method [Prentice Hall, 1995]) and +C++ and Java author Bruce Eckel (author of Thinking in C++ +[Prentice Hall, 1995] and Thinking in Java [Prentice Hall, 1998]) +have had to say about dynamic typing on their weblogs +(http://www.artima.com/weblogs/viewpost.jsp?thread=4639 and +http://www.mindview.net/WebLog/log-0025). On the other hand, +folks coming from Smalltalk, Python, Perl, or Ruby should feel right +at home with this aspect of Common Lisp.

5AspectL is an interesting +project insofar as AspectJ, its Java-based predecessor, was written +by Gregor Kiczales, one of the designers of Common Lisp's object and +metaobject systems. To many Lispers, AspectJ seems like Kiczales's +attempt to backport his ideas from Common Lisp into Java. However, +Pascal Costanza, the author of AspectL, thinks there are interesting +ideas in AOP that could be useful in Common Lisp. Of course, the +reason he's able to implement AspectL as a library is because of the +incredible flexibility of the Common Lisp Meta Object Protocol +Kiczales designed. To implement AspectJ, Kiczales had to write what +was essentially a separate compiler that compiles a new language into +Java source code. The AspectL project page is at +http://common-lisp.net/ project/aspectl/.

6Or to look at it another, more technically +accurate, way, Common Lisp comes with a built-in facility for +integrating compilers for embedded languages.

7Lisp 1.5 Programmer's Manual +(M.I.T. Press, 1962)

8Ideas +first introduced in Lisp include the if/then/else construct, recursive +function calls, dynamic memory allocation, garbage collection, +first-class functions, lexical closures, interactive programming, +incremental compilation, and dynamic typing.

9One of the most commonly +repeated myths about Lisp is that it's "dead." While it's true that +Common Lisp isn't as widely used as, say, Visual Basic or Java, it +seems strange to describe a language that continues to be used for new +development and that continues to attract new users as "dead." Some +recent Lisp success stories include Paul Graham's Viaweb, which became +Yahoo Store when Yahoo bought his company; ITA Software's airfare +pricing and shopping system, QPX, used by the online ticket seller +Orbitz and others; Naughty Dog's game for the PlayStation 2, Jak and +Daxter, which is largely written in a domain-specific Lisp dialect +Naughty Dog invented called GOAL, whose compiler is itself written in +Common Lisp; and the Roomba, the autonomous robotic vacuum cleaner, +whose software is written in L, a downwardly compatible subset of +Common Lisp. Perhaps even more telling is the growth of the +Common-Lisp.net Web site, which hosts open-source Common Lisp +projects, and the number of local Lisp user groups that have sprung up +in the past couple of years.

diff --git a/clones/gigamonkeys.com/book/jolt_logo16_sm.gif b/clones/gigamonkeys.com/book/jolt_logo16_sm.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ba7b32e3c2297bf8e421a0a8a9ff094402a0b28 GIT binary patch literal 6136 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, Rinse, Repeat: A Tour of the REPL

2. Lather, Rinse, Repeat: A Tour of the REPL

In this chapter you'll set up your programming environment and write +your first Common Lisp programs. We'll use the easy-to-install Lisp +in a Box developed by Matthew Danish and Mikel Evins, which packages +a Common Lisp implementation with Emacs, a powerful Lisp-aware text +editor, and SLIME,1 a +Common Lisp development environment built on top of Emacs.

This combo provides a state-of-the-art Common Lisp development +environment that supports the incremental, interactive development +style that characterizes Lisp programming. The SLIME environment has +the added advantage of providing a fairly uniform user interface +regardless of the operating system and Common Lisp implementation you +choose. I'll use the Lisp in a Box environment in order to have a +specific development environment to talk about; folks who want to +explore other development environments such as the graphical +integrated development environments (IDEs) provided by some of the +commercial Lisp vendors or environments based on other editors +shouldn't have too much trouble translating the basics.2

Choosing a Lisp Implementation

The first thing you have to do is to choose a Lisp implementation. +This may seem like a strange thing to have to do for folks used to +languages such as Perl, Python, Visual Basic (VB), C#, and Java. The +difference between Common Lisp and these languages is that Common +Lisp is defined by its standard--there is neither a single +implementation controlled by a benevolent dictator, as with Perl and +Python, nor a canonical implementation controlled by a single +company, as with VB, C#, and Java. Anyone who wants to read the +standard and implement the language is free to do so. Furthermore, +changes to the standard have to be made in accordance with a process +controlled by the standards body American National Standards +Institute (ANSI). That process is designed to keep any one entity, +such as a single vendor, from being able to arbitrarily change the +standard.3 +Thus, the Common Lisp standard is a contract between any Common Lisp +vendor and Common Lisp programmers. The contract tells you that if +you write a program that uses the features of the language the way +they're described in the standard, you can count on your program +behaving the same in any conforming implementation.

On the other hand, the standard may not cover everything you may want +to do in your programs--some things were intentionally left +unspecified in order to allow continuing experimentation by +implementers in areas where there wasn't consensus about the best way +for the language to support certain features. So every implementation +offers some features above and beyond what's specified in the +standard. Depending on what kind of programming you're going to be +doing, it may make sense to just pick one implementation that has the +extra features you need and use that. On the other hand, if we're +delivering Lisp source to be used by others, such as libraries, +you'll want--as far as possible--to write portable Common Lisp. For +writing code that should be mostly portable but that needs facilities +not defined by the standard, Common Lisp provides a flexible way to +write code "conditionalized" on the features available in a +particular implementation. You'll see an example of this kind of code +in Chapter 15 when we develop a simple library that smoothes over +some differences between how different Lisp implementations deal with +filenames.

For the moment, however, the most important characteristic of an +implementation is whether it runs on our favorite operating system. +The folks at Franz, makers of Allegro Common Lisp, are making +available a trial version of their product for use with this book +that runs on Linux, Windows, and OS X. Folks looking for an +open-source implementation have several options. SBCL4 is a high-quality open-source implementation that +compiles to native code and runs on a wide variety of Unixes, +including Linux and OS X. SBCL is derived from CMUCL,5 which is a Common Lisp developed at Carnegie Mellon University, +and, like CMUCL, is largely in the public domain, except a few +sections licensed under Berkeley Software Distribution (BSD) style +licenses. CMUCL itself is another fine choice, though SBCL tends to +be easier to install and now supports 21-bit Unicode.6 For OS X users, OpenMCL +is an excellent choice--it compiles to machine code, supports +threads, and has quite good integration with OS X's Carbon and Cocoa +toolkits. Other open-source and commercial implementations are +available. See Chapter 32 for resources from which you can get more +information.

All the Lisp code in this book should work in any conforming Common +Lisp implementation unless otherwise noted, and SLIME will smooth out +some of the differences between implementations by providing us with +a common interface for interacting with Lisp. The output shown in +this book is from Allegro running on GNU/Linux; in some cases, other +Lisp's may generate slightly different error messages or debugger +output.

Getting Up and Running with Lisp in a Box

Since the Lisp in a Box packaging is designed to get new Lispers up +and running in a first-rate Lisp development environment with minimum +hassle, all you need to do to get it running is to grab the +appropriate package for your operating system and the preferred Lisp +from the Lisp in a Box Web site listed in Chapter 32 and then follow +the installation instructions.

Since Lisp in a Box uses Emacs as its editor, you'll need to know at +least a bit about how to use it. Perhaps the best way to get started +with Emacs is to work through its built-in tutorial. To start the +tutorial, select the first item of the Help menu, Emacs tutorial. Or +press the Ctrl key, type h, release the Ctrl key, and then +press t. Most Emacs commands are accessible via such key +combinations; because key combinations are so common, Emacs users +have a notation for describing key combinations that avoids having to +constantly write out combinations such as "Press the Ctrl key, type +h, release the Ctrl key, and then press t." Keys to be +pressed together--a so-called key chord--are written together and +separated by a hyphen. Keys, or key chords, to be pressed in sequence +are separated by spaces. In a key chord, C represents the Ctrl +key and M represents the Meta key (also known as Alt). Thus, +we could write the key combination we just described that starts the +tutorial like so: C-h t.

The tutorial describes other useful commands and the key combinations +that invoke them. Emacs also comes with extensive online +documentation using its own built-in hypertext documentation browser, +Info. To read the manual, type C-h i. The Info system comes +with its own tutorial, accessible simply by pressing h while +reading the manual. Finally, Emacs provides quite a few ways to get +help, all bound to key combos starting with C-h. Typing +C-h ? brings up a complete list. Two of the most useful, +besides the tutorial, are C-h k, which lets us type any key +combo and tells us what command it invokes, and C-h w, which +lets us enter the name of a command and tells us what key combination +invokes it.

The other crucial bit of Emacs terminology, for folks who refuse to +work through the tutorial, is the notion of a buffer. While +working in Emacs, each file you edit will be represented by a +different buffer, only one of which is "current" at any given time. +The current buffer receives all input--whatever you type and any +commands you invoke. Buffers are also used to represent interactions +with programs such as Common Lisp. Thus, one common action you'll +take is to "switch buffers," which means to make a different buffer +the current buffer so you can edit a particular file or interact with +a particular program. The command switch-to-buffer, bound to +the key combination C-x b, prompts for the name of a buffer in +the area at the bottom of the Emacs frame. When entering a buffer +name, hitting Tab will complete the name based on the characters +typed so far or will show a list of possible completions. The prompt +also suggests a default buffer, which you can accept just by hitting +Return. You can also switch buffers by selecting a buffer from the +Buffers menu.

In certain contexts, other key combinations may be available for +switching to certain buffers. For instance, when editing Lisp source +files, the key combo C-c C-z switches to the buffer where you +interact with Lisp.

Free Your Mind: Interactive Programming

When you start Lisp in a Box, you should see a buffer containing a +prompt that looks like this:

CL-USER>

This is the Lisp prompt. Like a Unix or DOS shell prompt, the Lisp +prompt is a place where you can type expressions that will cause +things to happen. However, instead of reading and interpreting a line +of shell commands, Lisp reads Lisp expressions, evaluates them +according to the rules of Lisp, and prints the result. Then it does +it again with the next expression you type. That endless cycle of +reading, evaluating, and printing is why it's called the +read-eval-print loop, or REPL for short. It's also referred to as +the top-level, the top-level listener, or the Lisp +listener.

From within the environment provided by the REPL, you can define and +redefine program elements such as variables, functions, classes, and +methods; evaluate any Lisp expression; load files containing Lisp +source code or compiled code; compile whole files or individual +functions; enter the debugger; step through code; and inspect the +state of individual Lisp objects.

All those facilities are built into the language, accessible via +functions defined in the language standard. If you had to, you could +build a pretty reasonable programming environment out of just the +REPL and any text editor that knows how to properly indent Lisp code. +But for the true Lisp programming experience, you need an +environment, such as SLIME, that lets you interact with Lisp both via +the REPL and while editing source files. For instance, you don't want +to have to cut and paste a function definition from a source file to +the REPL or have to load a whole file just because you changed one +function; your Lisp environment should let us evaluate or compile +both individual expressions and whole files directly from your +editor.

Experimenting in the REPL

To try the REPL, you need a Lisp expression that can be read, +evaluated, and printed. One of the simplest kinds of Lisp expressions +is a number. At the Lisp prompt, you can type 10 followed by +Return and should see something like this:

CL-USER> 10
+10

The first 10 is the one you typed. The Lisp reader, the R +in REPL, reads the text "10" and creates a Lisp object representing +the number 10. This object is a self-evaluating object, which +means that when given to the evaluator, the E in REPL, it +evaluates to itself. This value is then given to the printer, which +prints the 10 on the line by itself. While that may seem like +a lot of work just to get back to where you started, things get a bit +more interesting when you give Lisp something meatier to chew on. For +instance, you can type (+ 2 3) at the Lisp prompt.

CL-USER> (+ 2 3)
+5

Anything in parentheses is a list, in this case a list of three +elements, the symbol +, and the numbers 2 and 3. Lisp, in +general, evaluates lists by treating the first element as the name of +a function and the rest of the elements as expressions to be +evaluated to yield the arguments to the function. In this case, the +symbol + names a function that performs addition. 2 and 3 +evaluate to themselves and are then passed to the addition function, +which returns 5. The value 5 is passed to the printer, which prints +it. Lisp can evaluate a list expression in other ways, but we needn't +get into them right away. First we have to write. . .

"Hello, World," Lisp Style

No programming book is complete without a "hello, world"7 program. +As it turns out, it's trivially easy to get the REPL to print "hello, +world."

CL-USER> "hello, world"
+"hello, world"

This works because strings, like numbers, have a literal syntax +that's understood by the Lisp reader and are self-evaluating objects: +Lisp reads the double-quoted string and instantiates a string object +in memory that, when evaluated, evaluates to itself and is then +printed in the same literal syntax. The quotation marks aren't part +of the string object in memory--they're just the syntax that tells +the reader to read a string. The printer puts them back on when it +prints the string because it tries to print objects in the same +syntax the reader understands.

However, this may not really qualify as a "hello, world" program. +It's more like the "hello, world" value.

You can take a step toward a real program by writing some code that +as a side effect prints the string "hello, world" to standard output. +Common Lisp provides a couple ways to emit output, but the most +flexible is the FORMAT function. FORMAT takes a variable +number of arguments, but the only two required arguments are the +place to send the output and a string. You'll see in the next chapter +how the string can contain embedded directives that allow you to +interpolate subsequent arguments into the string, à la printf +or Python's string-%. As long as the string doesn't contain an +~, it will be emitted as-is. If you pass t as its first +argument, it sends its output to standard output. So a FORMAT +expression that will print "hello, world" looks like this:8

CL-USER> (format t "hello, world")
+hello, world
+NIL

One thing to note about the result of the FORMAT expression is +the NIL on the line after the "hello, world" output. That +NIL is the result of evaluating the FORMAT expression, +printed by the REPL. (NIL is Lisp's version of false and/or +null. More on that in Chapter 4.) Unlike the other expressions we've +seen so far, a FORMAT expression is more interesting for its +side effect--printing to standard output in this case--than for its +return value. But every expression in Lisp evaluates to some +result.9

However, it's still arguable whether you've yet written a true +"program." But you're getting there. And you're seeing the bottom-up +style of programming supported by the REPL: you can experiment with +different approaches and build a solution from parts you've already +tested. Now that you have a simple expression that does what you +want, you just need to package it in a function. Functions are one of +the basic program building blocks in Lisp and can be defined with a +DEFUN expression such as this:

CL-USER> (defun hello-world () (format t "hello, world"))
+HELLO-WORLD

The hello-world after the DEFUN is the name of the +function. In Chapter 4 we'll look at exactly what characters can be +used in a name, but for now suffice it to say that lots of +characters, such as -, that are illegal in names in other +languages are legal in Common Lisp. It's standard Lisp style--not to +mention more in line with normal English typography--to form compound +names with hyphens, such as hello-world, rather than with +underscores, as in hello_world, or with inner caps such as +helloWorld. The ()s after the name delimit the +parameter list, which is empty in this case because the function +takes no arguments. The rest is the body of the function.

At one level, this expression, like all the others you've seen, is +just another expression to be read, evaluated, and printed by the +REPL. The return value in this case is the name of the function you +just defined.10 But like the FORMAT expression, this +expression is more interesting for the side effects it has than for +its return value. Unlike the FORMAT expression, however, the side +effects are invisible: when this expression is evaluated, a new +function that takes no arguments and with the body (format t +"hello, world") is created and given the name HELLO-WORLD.

Once you've defined the function, you can call it like this:

CL-USER> (hello-world)
+hello, world
+NIL

You can see that the output is just the same as when you evaluated +the FORMAT expression directly, including the NIL value +printed by the REPL. Functions in Common Lisp automatically return +the value of the last expression evaluated.

Saving Your Work

You could argue that this is a complete "hello, world" program of +sorts. However, it still has a problem. If you exit Lisp and restart, +the function definition will be gone. Having written such a fine +function, you'll want to save your work.

Easy enough. You just need to create a file in which to save the +definition. In Emacs you can create a new file by typing C-x +C-f and then, when Emacs prompts you, entering the name of the file +you want to create. It doesn't matter particularly where you put the +file. It's customary to name Common Lisp source files with a +.lisp extension, though some folks use .cl instead.

Once you've created the file, you can type the definition you +previously entered at the REPL. Some things to note are that after +you type the opening parenthesis and the word DEFUN, at the +bottom of the Emacs window, SLIME will tell you the arguments +expected. The exact form will depend somewhat on what Common Lisp +implementation you're using, but it'll probably look something like +this:

(defun name varlist &rest body)

The message will disappear as you start to type each new element but +will reappear each time you enter a space. When you're entering the +definition in the file, you might choose to break the definition +across two lines after the parameter list. If you hit Return and then +Tab, SLIME will automatically indent the second line appropriately, +like this:11

(defun hello-world ()
+  (format t "hello, world"))

SLIME will also help match up the parentheses--as you type a closing +parenthesis, it will flash the corresponding opening parenthesis. Or +you can just type C-c C-q to invoke the command +slime-close-parens-at-point, which will insert as many closing +parentheses as necessary to match all the currently open parentheses.

Now you can get this definition into your Lisp environment in several +ways. The easiest is to type C-c C-c with the cursor anywhere +in or immediately after the DEFUN form, which runs the command +slime-compile-defun, which in turn sends the definition to +Lisp to be evaluated and compiled. To make sure this is working, you +can make some change to hello-world, recompile it, and then go +back to the REPL, using C-c C-z or C-x b, and call it +again. For instance, you could make it a bit more grammatical.

(defun hello-world ()
+  (format t "Hello, world!"))

Next, recompile with C-c C-c and then type C-c C-z to +switch to the REPL to try the new version.

CL-USER> (hello-world)
+Hello, world!
+NIL

You'll also probably want to save the file you've been working on; in +the hello.lisp buffer, type C-x C-s to invoke the Emacs +command save-buffer.

Now to try reloading this function from the source file, you'll need +to quit Lisp and restart. To quit you can use a SLIME shortcut: at +the REPL, type a comma. At the bottom of the Emacs window, you will +be prompted for a command. Type quit (or sayoonara), +and then hit Enter. This will quit Lisp and close all the buffers +created by SLIME such as the REPL buffer.12 Now restart SLIME +by typing M-x slime.

Just for grins, you can try to invoke hello-world.

CL-USER> (hello-world)

At that point SLIME will pop up a new buffer that starts with +something that looks like this:

attempt to call `HELLO-WORLD' which is an undefined function.
+   [Condition of type UNDEFINED-FUNCTION]
+
+Restarts:
+  0: [TRY-AGAIN] Try calling HELLO-WORLD again.
+  1: [RETURN-VALUE] Return a value instead of calling HELLO-WORLD.
+  2: [USE-VALUE] Try calling a function other than HELLO-WORLD.
+  3: [STORE-VALUE] Setf the symbol-function of HELLO-WORLD and call it again.
+  4: [ABORT] Abort handling SLIME request.
+  5: [ABORT] Abort entirely from this process.
+
+Backtrace:
+  0: (SWANK::DEBUG-IN-EMACS #<UNDEFINED-FUNCTION @ #x716b082a>)
+  1: ((FLET SWANK:SWANK-DEBUGGER-HOOK SWANK::DEBUG-IT))
+  2: (SWANK:SWANK-DEBUGGER-HOOK #<UNDEFINED-FUNCTION @ #x716b082a> #<Function SWANK-DEBUGGER-HOOK>)
+  3: (ERROR #<UNDEFINED-FUNCTION @ #x716b082a>)
+  4: (EVAL (HELLO-WORLD))
+  5: (SWANK::EVAL-REGION "(hello-world)
+" T)

Blammo! What happened? Well, you tried to invoke a function that +doesn't exist. But despite the burst of output, Lisp is actually +handling this situation gracefully. Unlike Java or Python, Common +Lisp doesn't just bail--throwing an exception and unwinding the +stack. And it definitely doesn't dump core just because you tried to +invoke a missing function. Instead Lisp drops you into the debugger.

While you're in the debugger you still have full access to Lisp, so +you can evaluate expressions to examine the state of our program and +maybe even fix things. For now don't worry about that; just type +q to exit the debugger and get back to the REPL. The debugger +buffer will go away, and the REPL will show this:

CL-USER> (hello-world)
+; Evaluation aborted
+CL-USER>

There's obviously more that can be done from within the debugger than +just abort--we'll see, for instance, in Chapter 19 how the debugger +integrates with the error handling system. For now, however, the +important thing to know is that you can always get out of it, and +back to the REPL, by typing q.

Back at the REPL you can try again. Things blew up because Lisp +didn't know the definition of hello-world. So you need to let +Lisp know about the definition we saved in the file +hello.lisp. You have several ways you could do this. You could +switch back to the buffer containing the file (type C-x b and +then enter hello.lisp when prompted) and recompile the +definition as you did before with C-c C-c. Or you can load the +whole file, which would be a more convenient approach if the file +contained a bunch of definitions, using the LOAD function at +the REPL like this:

CL-USER> (load "hello.lisp")
+; Loading /home/peter/my-lisp-programs/hello.lisp
+T

The T means everything loaded correctly.13 +Loading a file with LOAD is essentially equivalent to typing +each of the expressions in the file at the REPL in the order they +appear in the file, so after the call to LOAD, hello-world +should be defined:

CL-USER> (hello-world)
+Hello, world!
+NIL

Another way to load a file's worth of definitions is to compile the +file first with COMPILE-FILE and then LOAD the resulting +compiled file, called a FASL file, which is short for +fast-load file. COMPILE-FILE returns the name of the FASL +file, so we can compile and load from the REPL like this:

CL-USER> (load (compile-file "hello.lisp"))
+;;; Compiling file hello.lisp
+;;; Writing fasl file hello.fasl
+;;; Fasl write complete
+; Fast loading /home/peter/my-lisp-programs/hello.fasl
+T

SLIME also provides support for loading and compiling files without +using the REPL. When you're in a source code buffer, you can use +C-c C-l to load the file with slime-load-file. Emacs +will prompt for the name of a file to load with the name of the +current file already filled in; you can just hit Enter. Or you can +type C-c C-k to compile and load the file represented by the +current buffer. In some Common Lisp implementations, compiling code +this way will make it quite a bit faster; in others, it won't, +typically because they always compile everything.

This should be enough to give you a flavor of how Lisp programming +works. Of course I haven't covered all the tricks and techniques yet, +but you've seen the essential elements--interacting with the REPL +trying things out, loading and testing new code, tweaking and +debugging. Serious Lisp hackers often keep a Lisp image running for +days on end, adding, redefining, and testing bits of their program +incrementally.

Also, even when the Lisp app is deployed, there's often still a way +to get to a REPL. You'll see in Chapter 26 how you can use the REPL +and SLIME to interact with the Lisp that's running a Web server at +the same time as it's serving up Web pages. It's even possible to use +SLIME to connect to a Lisp running on a different machine, allowing +you--for instance--to debug a remote server just like a local one.

An even more impressive instance of remote debugging occurred on +NASA's 1998 Deep Space 1 mission. A half year after the space craft +launched, a bit of Lisp code was going to control the spacecraft for +two days while conducting a sequence of experiments. Unfortunately, a +subtle race condition in the code had escaped detection during ground +testing and was already in space. When the bug manifested in the +wild--100 million miles away from Earth--the team was able to +diagnose and fix the running code, allowing the experiments to +complete.14 One +of the programmers described it as follows:

Debugging a program running on a $100M piece of hardware that is +100 million miles away is an interesting experience. Having a +read-eval-print loop running on the spacecraft proved invaluable in +finding and fixing the problem.

You're not quite ready to send any Lisp code into deep space, but in +the next chapter you'll take a crack at writing a program a bit more +interesting than "hello, world." +


1Superior Lisp Interaction Mode for Emacs

2If +you've had a bad experience with Emacs previously, you should treat +Lisp in a Box as an IDE that happens to use an Emacs-like editor as +its text editor; there will be no need to become an Emacs guru to +program Lisp. It is, however, orders of magnitude more enjoyable to +program Lisp with an editor that has some basic Lisp awareness. At a +minimum, you'll want an editor that can automatically match +()s for you and knows how to automatically indent Lisp code. +Because Emacs is itself largely written in a Lisp dialect, Elisp, it +has quite a bit of support for editing Lisp code. Emacs is also +deeply embedded into the history of Lisp and the culture of Lisp +hackers: the original Emacs and its immediate predecessors, TECMACS +and TMACS, were written by Lispers at the Massachusetts Institute of +Technology (MIT). The editors on the Lisp Machines were versions of +Emacs written entirely in Lisp. The first two Lisp Machine Emacs, +following the hacker tradition of recursive acronyms, were EINE and +ZWEI, which stood for EINE Is Not Emacs and ZWEI Was EINE Initially. +Later ones used a descendant of ZWEI, named, more prosaically, +ZMACS.

3Practically speaking, there's very little likelihood +of the language standard itself being revised--while there are a +small handful of warts that folks might like to clean up, the ANSI +process isn't amenable to opening an existing standard for minor +tweaks, and none of the warts that might be cleaned up actually cause +anyone any serious difficulty. The future of Common Lisp +standardization is likely to proceed via de facto standards, much +like the "standardization" of Perl and Python--as different +implementers experiment with application programming interfaces +(APIs) and libraries for doing things not specified in the language +standard, other implementers may adopt them or people will develop +portability libraries to smooth over the differences between +implementations for features not specified in the language standard.

4Steel Bank +Common Lisp

5CMU Common +Lisp

6SBCL +forked from CMUCL in order to focus on cleaning up the internals and +making it easier to maintain. But the fork has been amiable; bug +fixes tend to propagate between the two projects, and there's talk +that someday they will merge back together.

7The +venerable "hello, world" predates even the classic Kernighan and +Ritchie C book that played a big role in its popularization. The +original "hello, world" seems to have come from Brian Kernighan's "A +Tutorial Introduction to the Language B" that was part of the Bell +Laboratories Computing Science Technical Report #8: The Programming +Language B published in January 1973. (It's available online at +http://cm.bell-labs.com/cm/cs/who/dmr/bintro.html.)

8These +are some other expressions that also print the string "hello, +world":

9Well, as you'll see when I discuss returning multiple +values, it's technically possible to write expressions that evaluate +to no value, but even such expressions are treated as returning +NIL when evaluated in a context that expects a value.

10I'll discuss in Chapter 4 why the name has been +converted to all uppercase.

11You could also have entered the definition as two +lines at the REPL, as the REPL reads whole expressions, not lines.

12SLIME shortcuts aren't +part of Common Lisp--they're commands to SLIME.

13If for some reason +the LOAD doesn't go cleanly, you'll get another error and drop +back into the debugger. If this happens, the most likely reason is +that Lisp can't find the file, probably because its idea of the +current working directory isn't the same as where the file is located. +In that case, you can quit the debugger by typing q and then +use the SLIME shortcut cd to change Lisp's idea of the current +directory--type a comma and then cd when prompted for a command +and then the name of the directory where hello.lisp was saved.

14http://www.flownet.com/gat/jpl-lisp.html

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/letter-to-reader.html b/clones/gigamonkeys.com/book/letter-to-reader.html new file mode 100644 index 00000000..92620476 --- /dev/null +++ b/clones/gigamonkeys.com/book/letter-to-reader.html @@ -0,0 +1,71 @@ + + + + + +Letter To Reader + + + + + + + + +
+ +

Dear Reader,

+ +

Practical Common Lisp ... isn't that an +oxymoron? If you're like most programmers, you probably know something +about Lisp—from a comp sci course in college or from learning +enough Elisp to customize Emacs a bit. Or maybe you just know someone +who won't shut up about Lisp, the greatest language ever. But you +probably never figured you'd see +practical and Lisp in the same book title.

+ +

Yet, you're reading this; you must want to know more. Maybe you +believe learning Lisp will make you a better programmer in any +language. Or maybe you just want to know what those Lisp fanatics are +yammering about all the time. Or maybe you have learned some Lisp but +haven't quite made the leap to using it to write interesting software.

+ +

If any of those is true, this book is for you. Using +Common Lisp, an ANSI standardized, industrial-strength dialect of +Lisp, I show you how to write software that goes well beyond silly +academic exercises or trivial editor customizations. And I show you +how Lisp—even with many of its features adopted by other +languages—still has a few tricks up its sleeve.

+ +

But unlike many Lisp books, this one doesn't just +touch on a few of Lisp's greatest features and then leave you on your +own to actually use them. I cover all the language features you'll +need to write real programs and devote well over a third of the book +to developing nontrivial software—a statistical spam filter, a +library for parsing binary files, and a server for streaming MP3s over +a network complete with an online MP3 database and Web interface.

+ +

So turn the book over, open it up, and see for yourself how eminently +practical using the greatest language ever invented can be.

+ +

Sincerely,

+

Peter Seibel

+ +
+ +

Back to index.

+ + + diff --git a/clones/gigamonkeys.com/book/loop-for-black-belts.html b/clones/gigamonkeys.com/book/loop-for-black-belts.html new file mode 100644 index 00000000..7b09d7da --- /dev/null +++ b/clones/gigamonkeys.com/book/loop-for-black-belts.html @@ -0,0 +1,469 @@ +LOOP for Black Belts

22. LOOP for Black Belts

In Chapter 7 I briefly discussed the extended LOOP macro. As I +mentioned then, LOOP provides what is essentially a +special-purpose language just for writing iteration constructs.

This might seem like a lot of bother--inventing a whole language just +for writing loops. But if you think about the ways loops are used in +programs, it actually makes a fair bit of sense. Any program of any +size at all will contain quite a number of loops. And while they +won't all be the same, they won't all be unique either; patterns will +emerge, particularly if you include the code immediately preceding +and following the loops--patterns of how things are set up for the +loop, patterns in what gets done in the loop proper, and patterns in +what gets done after the loop. The LOOP language captures these +patterns so you can express them directly.

The LOOP macro has a lot of parts--one of the main complaints of +LOOP's detractors is that it's too complex. In this chapter, +I'll tackle LOOP head on, giving you a systematic tour of the +various parts and how they fit together.

The Parts of a LOOP

You can do the following in a LOOP:

  • Step variables numerically and over various data structures
  • Collect, count, sum, minimize, and maximize values seen while looping
  • Execute arbitrary Lisp expressions
  • Decide when to terminate the loop
  • Conditionally do any of these

Additionally, LOOP provides syntax for the following:

  • Creating local variables for use within the loop
  • Specifying arbitrary Lisp expressions to run before and after +the loop proper

The basic structure of a LOOP is a set of clauses, each of which +begins with a loop keyword.1 How each clause is parsed by the +LOOP macro depends on the keyword. Some of the main keywords, +which you saw in Chapter 7, are for, collecting, +summing, counting, do, and finally.

Iteration Control

Most of the so-called iteration control clauses start with the loop +keyword for, or its synonym as,2 +followed by the name of a variable. What follows after the variable +name depends on the type of for clause.

The subclauses of a for clause can iterate over the following:

  • Ranges of numbers, up or down, by specified intervals
  • The individual items of a list
  • The cons cells that make up a list
  • The elements of a vector, including subtypes such as strings and +bit vectors
  • The pairs of a hash table
  • The symbols in a package
  • The results of repeatedly evaluating a given form

A single loop can have multiple for clauses with each clause +naming its own variable. When a loop has multiple for clauses, +the loop terminates as soon as any for clause reaches its end +condition. For instance, the following loop:

(loop
+  for item in list
+  for i from 1 to 10
+  do (something))

will iterate at most ten times but may stop sooner if list +contains fewer than ten items.

Counting Loops

Arithmetic iteration clauses control the number of times the loop body +will be executed by stepping a variable over a range of numbers, +executing the body once per step. These clauses consist of from one to +three of the following prepositional phrases after the for +(or as): the from where phrase, the to where phrase, and +the by how much phrase.

The from where phrase specifies the initial value of the clause's +variable. It consists of one of the prepositions from, +downfrom, or upfrom followed by a form, which supplies +the initial value (a number).

The to where phrase specifies a stopping point for the loop and +consists of one of the prepositions to, upto, +below, downto, or above followed by a form, +which supplies the stopping point. With upto and +downto, the loop body will be terminated (without executing +the body again) when the variable passes the stopping point; with +below and above, it stops one iteration earlier.The +by how much phrase consists of the prepositions by and a +form, which must evaluate to a positive number. The variable will be +stepped (up or down, as determined by the other phrases) by this +amount on each iteration or by one if it's omitted.

You must specify at least one of these prepositional phrases. The +defaults are to start at zero, increment the variable by one at each +iteration, and go forever or, more likely, until some other clause +terminates the loop. You can modify any or all of these defaults by +adding the appropriate prepositional phrases. The only wrinkle is +that if you want decremental stepping, there's no default from +where value, so you must specify one with either from or +downfrom. So, the following:

(loop for i upto 10 collect i)

collects the first eleven integers (zero to ten), but the behavior of +this:

(loop for i downto -10 collect i)         ; wrong

is undefined. Instead, you need to write this:

(loop for i from 0 downto -10 collect i)

Also note that because LOOP is a macro, which runs at compile +time, it has to be able to determine the direction to step the +variable based solely on the prepositions--not the values of the +forms, which may not be known until runtime. So, the following:

(loop for i from 10 to 20 ...) 

works fine since the default is incremental stepping. But this:

(loop for i from 20 to 10 ...) 

won't know to count down from twenty to ten. Worse yet, it won't give +you an error--it will just not execute the loop since i is +already greater than ten. Instead, you must write this:

(loop for i from 20 downto 10 ...)

or this:

(loop for i downfrom 20 to 10 ...)

Finally, if you just want a loop that repeats a certain number of +times, you can replace a clause of the following form:

for i from 1 to number-form

with a repeat clause like this:

repeat number-form

These clauses are identical in effect except the repeat clause +doesn't create an explicit loop variable.

Looping Over Collections and Packages

The for clauses for iterating over lists are much simpler than +the arithmetic clauses. They support only two prepositional phrases, +in and on.

A phrase of this form:

for var in list-form

steps var over all the elements of the list produced by +evaluating list-form.

(loop for i in (list 10 20 30 40) collect i) ==> (10 20 30 40)

Occasionally this clause is supplemented with a by phrase, +which specifies a function to use to move down the list. The default +is CDR but can be any function that takes a list and returns a +sublist. For instance, you could collect every other element of a +list with a loop like this:

(loop for i in (list 10 20 30 40) by #'cddr collect i) ==> (10 30)

An on prepositional phrase is used to step var over the +cons cells that make up a list.

(loop for x on (list 10 20 30) collect x) ==> ((10 20 30) (20 30) (30))

This phrase too can take a by preposition:

(loop for x on (list 10 20 30 40) by #'cddr collect x) ==> ((10 20 30 40) (30 40))

Looping over the elements of a vector (which includes strings and bit +vectors) is similar to looping over the elements of a list except the +preposition across is used instead of in.3 For instance:

(loop for x across "abcd" collect x) ==> (#\a #\b #\c #\d)

Iterating over a hash table or package is slightly more complicated +because hash tables and packages have different sets of values you +might want to iterate over--the keys or values in a hash table and +the different kinds of symbols in a package. Both kinds of iteration +follow the same pattern. The basic pattern looks like this:

(loop for var being the things in hash-or-package ...)

For hash tables, the possible values for things are +hash-keys and hash-values, which cause var to be +bound to successive values of either the keys or the values of the +hash table. The hash-or-package form is evaluated once to +produce a value, which must be a hash table.

To iterate over a package, things can be symbols, +present-symbols, and external-symbols, which cause +var to be bound to each of the symbols accessible in a package, +each of the symbols present in a package (in other words, interned or +imported into that package), or each of the symbols that have been +exported from the package. The hash-or-package form is evaluated +to produce the name of a package, which is looked up as if by +FIND-PACKAGE or a package object. Synonyms are also available +for parts of the for clause. In place of the, you can +use each; you can use of instead of in; and you +can write the things in the singular (for example, +hash-key or symbol).

Finally, since you'll often want both the keys and the values when +iterating over a hash table, the hash table clauses support a +using subclause at the end of the hash table clause.

(loop for k being the hash-keys in h using (hash-value v) ...)
+(loop for v being the hash-values in h using (hash-key k) ...)

Both of these loops will bind k to each key in the hash table +and v to the corresponding value. Note that the first element +of the using subclause must be in the singular +form.4

Equals-Then Iteration

If none of the other for clauses supports exactly the form of +variable stepping you need, you can take complete control over +stepping with an equals-then clause. This clause is similar to +the binding clauses in a DO loop but cast in a more Algolish +syntax. The template is as follows:

(loop for var = initial-value-form [ then step-form ] ...)

As usual, var is the name of the variable to be stepped. Its +initial value is obtained by evaluating initial-value-form once +before the first iteration. In each subsequent iteration, +step-form is evaluated, and its value becomes the new value of +var. With no then part to the clause, the +initial-value-form is reevaluated on each iteration to provide +the new value. Note that this is different from a DO binding +clause with no step form.

The step-form can refer to other loop variables, including +variables created by other for clauses later in the loop. For +instance:

(loop repeat 5 
+      for x = 0 then y
+      for y = 1 then (+ x y)
+      collect y) ==> (1 2 4 8 16)

However, note that each for clause is evaluated separately in +the order it appears. So in the previous loop, on the second +iteration x is set to the value of y before y +changes (in other words, 1). But y is then set to the +sum of its old value (still 1) and the new value of x. +If the order of the for clauses is reversed, the results +change.

(loop repeat 5
+      for y = 1 then (+ x y)
+      for x = 0 then y
+      collect y) ==> (1 1 2 4 8)

Often, however, you'll want the step forms for multiple variables to +be evaluated before any of the variables is given its new value +(similar to how DO steps its variables). In that case, you can +join multiple for clauses by replacing all but the first +for with and. You saw this formulation already in the +LOOP version of the Fibonacci computation in Chapter 7. Here's +another variant, based on the two previous examples:

(loop repeat 5 
+      for x = 0 then y
+      and y = 1 then (+ x y)
+      collect y) ==> (1 1 2 3 5)

Local Variables

While the main variables needed within a loop are usually declared +implicitly in for clauses, sometimes you'll need auxiliary +variables, which you can declare with with clauses.

with var [ = value-form ]

The name var becomes the name of a local variable that will cease +to exist when the loop finishes. If the with clause contains +an = value-form part, the variable will be initialized, +before the first iteration of the loop, to the value of +value-form.

Multiple with clauses can appear in a loop; each clause is +evaluated independently in the order it appears and the value is +assigned before proceeding to the next clause, allowing later +variables to depend on the value of already declared variables. +Mutually independent variables can be declared in one with +clause with an and between each declaration.

Destructuring Variables

One handy feature of LOOP I haven't mentioned yet is the ability +to destructure list values assigned to loop variables. This lets you +take apart the value of lists that would otherwise be assigned to a +loop variable, similar to the way DESTRUCTURING-BIND works but a +bit less elaborate. Basically, you can replace any loop variable in a +for or with clause with a tree of symbols, and the list +value that would have been assigned to the simple variable will +instead be destructured into variables named by the symbols in the +tree. A simple example looks like this:

CL-USER> (loop for (a b) in '((1 2) (3 4) (5 6))
+            do (format t "a: ~a; b: ~a~%" a b))
+a: 1; b: 2
+a: 3; b: 4
+a: 5; b: 6
+NIL

The tree can also include dotted lists, in which case the name after +the dot acts like a &rest parameter, being bound to a list +containing any remaining elements of the list. This is particularly +handy with for/on loops since the value is always a +list. For instance, this LOOP (which I used in Chapter 18 to +emit a comma-delimited list):

(loop for cons on list
+    do (format t "~a" (car cons))
+    when (cdr cons) do (format t ", "))

could also be written like this:

(loop for (item . rest) on list
+    do (format t "~a" item)
+    when rest do (format t ", "))

If you want to ignore a value in the destructured list, you can use +NIL in place of a variable name.

(loop for (a nil) in '((1 2) (3 4) (5 6)) collect a) ==> (1 3 5)

If the destructuring list contains more variables than there are +values in the list, the extra variables are set to NIL, making +all the variables essentially like &optional parameters. There +isn't, however, any equivalent to &key parameters.

Value Accumulation

The value accumulation clauses are perhaps the most powerful part of +LOOP. While the iteration control clauses provide a concise +syntax for expressing the basic mechanics of looping, they aren't +dramatically different from the equivalent mechanisms provided by +DO, DOLIST, and DOTIMES.

The value accumulation clauses, on the other hand, provide a concise +notation for a handful of common loop idioms having to do with +accumulating values while looping. Each accumulation clause starts +with a verb and follows this pattern:

verb form [ into var ]

Each time through the loop, an accumulation clause evaluates form +and saves the value in a manner determined by the verb. With an +into subclause, the value is saved into the variable named by +var. The variable is local to the loop, as if it'd been declared +in a with clause. With no into subclause, the +accumulation clause instead accumulates a default value for the whole +loop expression.

The possible verbs are collect, append, nconc, +count, sum, maximize, and minimize. Also +available as synonyms are the present participle forms: +collecting, appending, nconcing, +counting, summing, maximizing, and +minimizing.

A collect clause builds up a list containing all the values of +form in the order they're seen. This is a particularly useful +construct because the code you'd have to write to collect a list in +order as efficiently as LOOP does is more painful than you'd +normally write by hand.5 Related to collect are the verbs append and +nconc. These verbs also accumulate values into a list, but they +join the values, which must be lists, into a single list as if by the +functions APPEND or NCONC. 6

The remaining accumulation clauses are used to accumulate numeric +values. The verb count counts the number of times form is +true, sum collects a running total of the values of form, +maximize collects the largest value seen for form, and +minimize collects the smallest. For instance, suppose you +define a variable *random* that contains a list of random +numbers.

(defparameter *random* (loop repeat 100 collect (random 10000)))

Then the following loop will return a list containing various summary +information about the numbers:

(loop for i in *random*
+   counting (evenp i) into evens
+   counting (oddp i) into odds
+   summing i into total
+   maximizing i into max
+   minimizing i into min
+   finally (return (list min max total evens odds)))

Unconditional Execution

As useful as the value accumulation constructs are, LOOP wouldn't +be a very good general-purpose iteration facility if there wasn't a +way to execute arbitrary Lisp code in the loop body.

The simplest way to execute arbitrary code within a loop body is with +a do clause. Compared to the clauses I've described so far, +with their prepositions and subclauses, do is a model of +Yodaesque simplicity.7 A do clause +consists of the word do (or doing) followed by one or +more Lisp forms that are all evaluated when the do clause is. +The do clause ends at the closing parenthesis of the loop or +the next loop keyword.

For instance, to print the numbers from one to ten, you could write +this:

(loop for i from 1 to 10 do (print i))

Another, more dramatic, form of immediate execution is a return +clause. This clause consists of the word return followed by a +single Lisp form, which is evaluated, with the resulting value +immediately returned as the value of the loop.

You can also break out of a loop in a do clause using any of +Lisp's normal control flow operators, such as RETURN and +RETURN-FROM. Note that a return clause always returns +from the immediately enclosing LOOP expression, while a +RETURN or RETURN-FROM in a do clause can return from +any enclosing expression. For instance, compare the following:

(block outer
+  (loop for i from 0 return 100) ; 100 returned from LOOP
+  (print "This will print")
+  200) ==> 200

to this:

(block outer
+  (loop for i from 0 do (return-from outer 100)) ; 100 returned from BLOCK
+  (print "This won't print")
+  200) ==> 100

The do and return clauses are collectively called the +unconditional execution clauses.

Conditional Execution

Because a do clause can contain arbitrary Lisp forms, you can +use any Lisp expressions you want, including control constructs such +as IF and WHEN. So, the following is one way to write a +loop that prints only the even numbers between one and ten:

(loop for i from 1 to 10 do (when (evenp i) (print i)))

However, sometimes you'll want conditional control at the level of +loop clauses. For instance, suppose you wanted to sum only the even +numbers between one and ten using a summing clause. You +couldn't write such a loop with a do clause because there'd be +no way to "call" the sum i in the middle of a regular Lisp +form. In cases like this, you need to use one of LOOP's own +conditional expressions like this:

(loop for i from 1 to 10 when (evenp i) sum i) ==> 30

LOOP provides three conditional constructs, and they all follow +this basic pattern:

conditional test-form loop-clause

The conditional can be if, when, or unless. +The test-form is any regular Lisp form, and loop-clause can +be a value accumulation clause (count, collect, +and so on), an unconditional execution clause, or another +conditional execution clause. Multiple loop clauses can be attached +to a single conditional by joining them with and.

As an extra bit of syntactic sugar, within the first loop clause, +after the test form, you can use the variable it to refer to +the value returned by the test form. For instance, the following loop +collects the non-NIL values found in some-hash when +looking up the keys in some-list:

(loop for key in some-list when (gethash key some-hash) collect it)

A conditional clause is executed each time through the loop. An +if or when clause executes its loop-clause if +test-form evaluates to true. An unless reverses the test, +executing loop-clause only when test-form is NIL. Unlike +their Common Lisp namesakes, LOOP's if and when +are merely synonyms--there's no difference in their behavior.

All three conditional clauses can also take an else branch, +which is followed by another loop clause or multiple clauses joined by +and. When conditional clauses are nested, the set of clauses +connected to an inner conditional clause can be closed with the word +end. The end is optional when not needed to disambiguate +a nested conditional--the end of a conditional clause will be inferred +from the end of the loop or the start of another clause not joined by +and.

The following rather silly loop demonstrates the various forms of +LOOP conditionals. The update-analysis function will be +called each time through the loop with the latest values of the +various variables accumulated by the clauses within the conditionals.

(loop for i from 1 to 100
+      if (evenp i)
+        minimize i into min-even and 
+        maximize i into max-even and
+        unless (zerop (mod i 4))
+          sum i into even-not-fours-total
+        end
+        and sum i into even-total
+      else
+        minimize i into min-odd and
+        maximize i into max-odd and
+        when (zerop (mod i 5)) 
+          sum i into fives-total
+        end
+        and sum i into odd-total
+      do (update-analysis min-even
+                          max-even
+                          min-odd
+                          max-odd
+                          even-total
+                          odd-total
+                          fives-total
+                          even-not-fours-total))

Setting Up and Tearing Down

One of the key insights the designers of the LOOP language had +about actual loops "in the wild" is that the loop proper is often +preceded by a bit of code to set things up and then followed by some +more code that does something with the values computed by the loop. A +trivial example, in Perl,8 might look like this:

my $evens_sum = 0;
+my $odds_sum  = 0;
+foreach my $i (@list_of_numbers) {
+  if ($i % 2) {
+    $odds_sum += $i;
+  } else {
+    $evens_sum += $i;
+  }
+}
+if ($evens_sum > $odds_sum) {
+  print "Sum of evens greater\n";
+} else {
+  print "Sum of odds greater\n";
+}

The loop proper in this code is the foreach statement. But the +foreach loop doesn't stand on its own: the code in the loop +body refers to variables declared in the two lines before the +loop.9 And +the work the loop does is all for naught without the if +statement after the loop that actually reports the results. In Common +Lisp, of course, the LOOP construct is an expression that +returns a value, so there's even more often a need to do something +after the loop proper, namely, generate the return value.

So, said the LOOP designers, let's give a way to include the +code that's really part of the loop in the loop itself. Thus, +LOOP provides two keywords, initially and finally, +that introduce code to be run outside the loop's main body.

After the initially or finally, these clauses consist +of all the Lisp forms up to the start of the next loop clause or the +end of the loop. All the initially forms are combined into a +single prologue, which runs once, immediately after all the local +loop variables are initialized and before the body of the loop. The +finally forms are similarly combined into a epilogue to be +run after the last iteration of the loop body. Both the prologue and +epilogue code can refer to local loop variables.

The prologue is always run, even if the loop body iterates zero +times. The loop can return without running the epilogue if any of the +following happens:

  • A return clause executes.
  • RETURN , RETURN-FROM, or another transfer of control +construct is called from within a Lisp form within the body.10
  • The loop is terminated by an always, never, or +thereis clause, as I'll discuss in the next section.

Within the epilogue code, RETURN or RETURN-FROM can be used +to explicitly provide a return value for the loop. Such an explicit +return value will take precedence over any value that might otherwise +be provided by an accumulation or termination test clause.

To allow RETURN-FROM to be used to return from a specific loop +(useful when nesting LOOP expressions), you can name a LOOP +with the loop keyword named. If a named clause appears +in a loop, it must be the first clause. For a simple example, assume +lists is a list of lists and you want to find an item that +matches some criteria in one of those nested lists. You could find it +with a pair of nested loops like this:

(loop named outer for list in lists do
+     (loop for item in list do
+          (if (what-i-am-looking-for-p item)
+            (return-from outer item))))

Termination Tests

While the for and repeat clauses provide the basic +infrastructure for controlling the number of iterations, sometimes +you'll need to break out of a loop early. You've already seen how a +return clause or a RETURN or RETURN-FROM within a +do clause can immediately terminate the loop; but just as +there are common patterns for accumulating values, there are also +common patterns for deciding when it's time to bail on a loop. These +patterns are supported in LOOP by the termination clauses, +while, until, always, never, and +thereis. They all follow the same pattern.

loop-keyword test-form

All five evaluate test-form each time through the iteration and +decide, based on the resulting value, whether to terminate the loop. +They differ in what happens after they terminate the loop--if they +do--and how they decide.

The loop keywords while and until introduce the "mild" +termination clauses. When they decide to terminate the loop, control +passes to the epilogue, skipping the rest of the loop body. The +epilogue can then return a value or do whatever it wants to finish +the loop. A while clause terminates the loop the first time +the test form is false; until, conversely, stops it the first +time the test form is true.

Another form of mild termination is provided by the LOOP-FINISH +macro. This is a regular Lisp form, not a loop clause, so it can be +used anywhere within the Lisp forms of a do clause. It also +causes an immediate jump to the loop epilogue. It can be useful when +the decision to break out of the loop can't be easily condensed into a +single form that can be used with a while or until +clause.

The other three clauses--always, never, and +thereis--terminate the loop with extreme prejudice; they +immediately return from the loop, skipping not only any subsequent +loop clauses but also the epilogue. They also provide a default value +for the loop even when they don't cause the loop to terminate. +However, if the loop is not terminated by one of these termination +tests, the epilogue is run and can return a value other than the +default provided by the termination clauses.

Because these clauses provide their own return values, they can't be +combined with accumulation clauses unless the accumulation clause has +an into subclause. The compiler (or interpreter) should signal +an error at compile time if they are.The always and +never clauses return only boolean values, so they're most +useful when you need to use a loop expression as part of a predicate. +You can use always to check that the test form is true on +every iteration of the loop. Conversely, never tests that the +test form evaluates to NIL on every iteration. If the test form +fails (returning NIL in an always clause or non-NIL +in a never clause), the loop is immediately terminated, +returning NIL. If the loop runs to completion, the default value +of T is provided.

For instance, if you want to test that all the numbers in a list, +numbers, are even, you can write this:

(if (loop for n in numbers always (evenp n))
+    (print "All numbers even."))

Equivalently you could write the following:

(if (loop for n in numbers never (oddp n))
+    (print "All numbers even."))

A thereis clause is used to test whether the test form is +ever true. As soon as the test form returns a non-NIL value, +the loop is terminated, returning that value. If the loop runs to +completion, the thereis clause provides a default return value +of NIL.

(loop for char across "abc123" thereis (digit-char-p char)) ==> 1
+
+(loop for char across "abcdef" thereis (digit-char-p char)) ==> NIL

Putting It All Together

Now you've seen all the main features of the LOOP facility. You +can combine any of the clauses I've discussed as long as you abide by +the following rules:

  • The named clause, if any, must be the first clause.
  • After the named clause come all the initially, +with, for, and repeat clauses.
  • Then comes the body clauses: conditional and unconditional +execution, accumulation, and termination test.11
  • End with any finally clauses.

The LOOP macro will expand into code that performs the following +actions:

  • Initializes all local loop variables as declared with +with or for clauses as well as those implicitly created +by accumulation clauses. The initial value forms are evaluated in the +order the clauses appear in the loop.
  • Execute the forms provided by any initially clauses--the +prologue--in the order they appear in the loop.
  • Iterate, executing the body of the loop as described in the next +paragraph.
  • Execute the forms provided by any finally clauses--the +epilogue--in the order they appear in the loop.

While the loop is iterating, the body is executed by first stepping +any iteration control variables and then executing any conditional or +unconditional execution, accumulation, or termination test clauses in +the order they appear in the loop code. If any of the clauses in the +loop body terminate the loop, the rest of the body is skipped and the +loop returns, possibly after running the epilogue.

And that's pretty much all there is to it.12 You'll use +LOOP fairly often in the code later in this book, so it's worth +having some knowledge of it. Beyond that, it's up to you how much you +use it.

And with that, you're ready to dive into the practical chapters that +make up the rest of the book--up first, writing a spam filter. +


1The term loop keyword is a +bit unfortunate, as loop keywords aren't keywords in the normal sense +of being symbols in the KEYWORD package. In fact, any symbol, +from any package, with the appropriate name will do; the LOOP +macro cares only about their names. Typically, though, they're +written with no package qualifier and are thus read (and interned as +necessary) in the current package.

2Because one of the +goals of LOOP is to allow loop expressions to be written with a +quasi-English syntax, many of the keywords have synonyms that are +treated the same by LOOP but allow some freedom to express +things in slightly more idiomatic English for different contexts.

3You may +wonder why LOOP can't figure out whether it's looping over a +list or a vector without needing different prepositions. This is +another consequence of LOOP being a macro: the value of the list +or vector won't be known until runtime, but LOOP, as a macro, +has to generate code at compile time. And LOOP's designers +wanted it to generate extremely efficient code. To be able to +generate efficient code for looping across, say, a vector, it needs +to know at compile time that the value will be a vector at +runtime--thus, the different prepositions are needed.

4Don't ask me why LOOP's authors chickened out on the +no-parentheses style for the using subclause.

5The trick is to keep ahold of the tail +of the list and add new cons cells by SETFing the CDR of +the tail. A handwritten equivalent of the code generated by +(loop for i upto 10 collect i) would look like this:

(do ((list nil) (tail nil) (i 0 (1+ i)))
+    ((> i 10) list)
+  (let ((new (cons i nil)))
+    (if (null list)
+        (setf list new)
+        (setf (cdr tail) new))
+    (setf tail new)))

Of course you'll rarely, if ever, write code like that. You'll use +either LOOP or (if, for some reason, you don't want to use +LOOP) the standard PUSH/NREVERSE idiom for collecting +values.

6Recall that NCONC is +the destructive version of APPEND--it's safe to use an +nconc clause only if the values you're collecting are fresh +lists that don't share any structure with other lists. For instance, +this is safe:

(loop for i upto 3 nconc (list i i)) ==> (0 0 1 1 2 2 3 3)

But this will get you into trouble:

(loop for i on (list 1 2 3) nconc i) ==> undefined

The later will most likely get into an infinite loop as the various +parts of the list produced by (list 1 2 3) are destructively modified +to point to each other. But even that's not guaranteed--the behavior +is simply undefined.

7"No! Try not. Do . . . or do not. There is +no try." -- Yoda, The Empire Strikes Back

8I'm not picking on Perl here--this +example would look pretty much the same in any language that bases +its syntax on C's.

9Perl would let you get away with not declaring those +variables if your program didn't use strict. But you should +always use strict in Perl. The equivalent code in Python, +Java, or C would always require the variables to be declared.

10You +can cause a loop to finish normally, running the epilogue, from Lisp +code executed as part of the loop body with the local macro +LOOP-FINISH.

11Some Common Lisp +implementations will let you get away with mixing body clauses and +for clauses, but that's strictly undefined, and some +implementations will reject such loops.

12The one aspect of +LOOP I haven't touched on at all is the syntax for declaring the +types of loop variables. Of course, I haven't discussed type +declarations outside of LOOP either. I'll cover the general +topic a bit in Chapter 32. For information on how they work with +LOOP, consult your favorite Common Lisp reference.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/macros-defining-your-own.html b/clones/gigamonkeys.com/book/macros-defining-your-own.html new file mode 100644 index 00000000..cc1e7e5f --- /dev/null +++ b/clones/gigamonkeys.com/book/macros-defining-your-own.html @@ -0,0 +1,558 @@ +Macros: Defining Your Own

8. Macros: Defining Your Own

Now it's time to start writing your own macros. The standard macros I +covered in the previous chapter hint at some of the things you can do +with macros, but that's just the beginning. Common Lisp doesn't +support macros so every Lisp programmer can create their own variants +of standard control constructs any more than C supports functions so +every C programmer can write trivial variants of the functions in the +C standard library. Macros are part of the language to allow you to +create abstractions on top of the core language and standard library +that move you closer toward being able to directly express the things +you want to express.

Perhaps the biggest barrier to a proper understanding of macros is, +ironically, that they're so well integrated into the language. In +many ways they seem like just a funny kind of function--they're +written in Lisp, they take arguments and return results, and they +allow you to abstract away distracting details. Yet despite these +many similarities, macros operate at a different level than functions +and create a totally different kind of abstraction.

Once you understand the difference between macros and functions, the +tight integration of macros in the language will be a huge benefit. +But in the meantime, it's a frequent source of confusion for new +Lispers. The following story, while not true in a historical or +technical sense, tries to alleviate the confusion by giving you a way +to think about how macros work.

The Story of Mac: A Just-So Story

Once upon a time, long ago, there was a company of Lisp programmers. +It was so long ago, in fact, that Lisp had no macros. Anything that +couldn't be defined with a function or done with a special operator +had to be written in full every time, which was rather a drag. +Unfortunately, the programmers in this company--though +brilliant--were also quite lazy. Often in the middle of their +programs--when the tedium of writing a bunch of code got to be too +much--they would instead write a note describing the code they needed +to write at that place in the program. Even more unfortunately, +because they were lazy, the programmers also hated to go back and +actually write the code described by the notes. Soon the company had +a big stack of programs that nobody could run because they were full +of notes about code that still needed to be written.

In desperation, the big bosses hired a junior programmer, Mac, whose +job was to find the notes, write the required code, and insert it +into the program in place of the notes. Mac never ran the +programs--they weren't done yet, of course, so he couldn't. But even +if they had been completed, Mac wouldn't have known what inputs to +feed them. So he just wrote his code based on the contents of the +notes and sent it back to the original programmer.

With Mac's help, all the programs were soon completed, and the +company made a ton of money selling them--so much money that the +company could double the size of its programming staff. But for some +reason no one thought to hire anyone to help Mac; soon he was single- +handedly assisting several dozen programmers. To avoid spending all +his time searching for notes in source code, Mac made a small +modification to the compiler the programmers used. Thereafter, +whenever the compiler hit a note, it would e-mail him the note and +wait for him to e-mail back the replacement code. Unfortunately, even +with this change, Mac had a hard time keeping up with the +programmers. He worked as carefully as he could, but sometimes-- +especially when the notes weren't clear--he would make mistakes.

The programmers noticed, however, that the more precisely they wrote +their notes, the more likely it was that Mac would send back correct +code. One day, one of the programmers, having a hard time describing +in words the code he wanted, included in one of his notes a Lisp +program that would generate the code he wanted. That was fine by Mac; +he just ran the program and sent the result to the compiler.

The next innovation came when a programmer put a note at the top of +one of his programs containing a function definition and a comment +that said, "Mac, don't write any code here, but keep this function +for later; I'm going to use it in some of my other notes." Other +notes in the same program said things such as, "Mac, replace this +note with the result of running that other function with the symbols +x and y as arguments."

This technique caught on so quickly that within a few days, most +programs contained dozens of notes defining functions that were only +used by code in other notes. To make it easy for Mac to pick out the +notes containing only definitions that didn't require any immediate +response, the programmers tagged them with the standard preface: +"Definition for Mac, Read Only." This--as the programmers were still +quite lazy--was quickly shortened to "DEF. MAC. R/O" and then +"DEFMACRO."

Pretty soon, there was no actual English left in the notes for Mac. +All he did all day was read and respond to e-mails from the compiler +containing DEFMACRO notes and calls to the functions defined in the +DEFMACROs. Since the Lisp programs in the notes did all the real +work, keeping up with the e-mails was no problem. Mac suddenly had a +lot of time on his hands and would sit in his office daydreaming +about white-sand beaches, clear blue ocean water, and drinks with +little paper umbrellas in them.

Several months later the programmers realized nobody had seen Mac for +quite some time. When they went to his office, they found a thin +layer of dust over everything, a desk littered with travel brochures +for various tropical locations, and the computer off. But the +compiler still worked--how could it be? It turned out Mac had made +one last change to the compiler: instead of e-mailing notes to Mac, +the compiler now saved the functions defined by DEFMACRO notes and +ran them when called for by the other notes. The programmers decided +there was no reason to tell the big bosses Mac wasn't coming to the +office anymore. So to this day, Mac draws a salary and from time to +time sends the programmers a postcard from one tropical locale or +another.

Macro Expansion Time vs. Runtime

The key to understanding macros is to be quite clear about the +distinction between the code that generates code (macros) and the +code that eventually makes up the program (everything else). When you +write macros, you're writing programs that will be used by the +compiler to generate the code that will then be compiled. Only after +all the macros have been fully expanded and the resulting code +compiled can the program actually be run. The time when macros run is +called macro expansion time; this is distinct from runtime, +when regular code, including the code generated by macros, runs.

It's important to keep this distinction firmly in mind because code +running at macro expansion time runs in a very different environment +than code running at runtime. Namely, at macro expansion time, +there's no way to access the data that will exist at runtime. Like +Mac, who couldn't run the programs he was working on because he +didn't know what the correct inputs were, code running at macro +expansion time can deal only with the data that's inherent in the +source code. For instance, suppose the following source code appears +somewhere in a program:

(defun foo (x)
+  (when (> x 10) (print 'big)))

Normally you'd think of x as a variable that will hold the +argument passed in a call to foo. But at macro expansion time, +such as when the compiler is running the WHEN macro, the only +data available is the source code. Since the program isn't running +yet, there's no call to foo and thus no value associated with +x. Instead, the values the compiler passes to WHEN are +the Lisp lists representing the source code, namely, (> x 10) +and (print 'big). Suppose that WHEN is defined, as you +saw in the previous chapter, with something like the following macro:

(defmacro when (condition &rest body)
+  `(if ,condition (progn ,@body)))

When the code in foo is compiled, the WHEN macro will be +run with those two forms as arguments. The parameter condition +will be bound to the form (> x 10), and the form (print +'big) will be collected into a list that will become the value of +the &rest body parameter. The backquote expression will +then generate this code:

(if (> x 10) (progn (print 'big)))

by interpolating in the value of condition and splicing the +value of body into the PROGN.

When Lisp is interpreted, rather than compiled, the distinction +between macro expansion time and runtime is less clear because +they're temporally intertwined. Also, the language standard doesn't +specify exactly how an interpreter must handle macros--it could +expand all the macros in the form being interpreted and then +interpret the resulting code, or it could start right in on +interpreting the form and expand macros when it hits them. In either +case, macros are always passed the unevaluated Lisp objects +representing the subforms of the macro form, and the job of the macro +is still to produce code that will do something rather than to do +anything directly.

DEFMACRO

As you saw in Chapter 3, macros really are defined with DEFMACRO +forms, though it stands--of course--for DEFine MACRO, not Definition +for Mac. The basic skeleton of a DEFMACRO is quite similar to +the skeleton of a DEFUN.

(defmacro name (parameter*)
+  "Optional documentation string."
+  body-form*)

Like a function, a macro consists of a name, a parameter list, an +optional documentation string, and a body of Lisp +expressions.1 +However, as I just discussed, the job of a macro isn't to do anything +directly--its job is to generate code that will later do what you +want.

Macros can use the full power of Lisp to generate their expansion, +which means in this chapter I can only scratch the surface of what +you can do with macros. I can, however, describe a general process +for writing macros that works for all macros from the simplest to the +most complex.

The job of a macro is to translate a macro form--in other words, a +Lisp form whose first element is the name of the macro--into code +that does a particular thing. Sometimes you write a macro starting +with the code you'd like to be able to write, that is, with an +example macro form. Other times you decide to write a macro after +you've written the same pattern of code several times and realize you +can make your code clearer by abstracting the pattern.

Regardless of which end you start from, you need to figure out the +other end before you can start writing a macro: you need to know both +where you're coming from and where you're going before you can hope +to write code to do it automatically. Thus, the first step of writing +a macro is to write at least one example of a call to the macro and +the code into which that call should expand.

Once you have an example call and the desired expansion, you're ready +for the second step: writing the actual macro code. For simple macros +this will be a trivial matter of writing a backquoted template with +the macro parameters plugged into the right places. Complex macros +will be significant programs in their own right, complete with helper +functions and data structures.

After you've written code to translate the example call to the +appropriate expansion, you need to make sure the abstraction the +macro provides doesn't "leak" details of its implementation. Leaky +macro abstractions will work fine for certain arguments but not +others or will interact with code in the calling environment in +undesirable ways. As it turns out, macros can leak in a small handful +of ways, all of which are easily avoided as long as you know to check +for them. I'll discuss how in the section "Plugging the Leaks."

To sum up, the steps to writing a macro are as follows:

    + +
  1. Write a sample call to the macro and the code it should expand +into, or vice versa.
  2. + +
  3. Write code that generates the handwritten expansion from the +arguments in the sample call.
  4. + +
  5. Make sure the macro abstraction doesn't "leak."
  6. + +

A Sample Macro: do-primes

To see how this three-step process works, you'll write a macro +do-primes that provides a looping construct similar to +DOTIMES and DOLIST except that instead of iterating over +integers or elements of a list, it iterates over successive prime +numbers. This isn't meant to be an example of a particularly useful +macro--it's just a vehicle for demonstrating the process.

First, you'll need two utility functions, one to test whether a given +number is prime and another that returns the next prime number +greater or equal to its argument. In both cases you can use a simple, +but inefficient, brute-force approach.

(defun primep (number)
+  (when (> number 1)
+    (loop for fac from 2 to (isqrt number) never (zerop (mod number fac)))))
+
+(defun next-prime (number)
+  (loop for n from number when (primep n) return n))

Now you can write the macro. Following the procedure outlined +previously, you need at least one example of a call to the macro and +the code into which it should expand. Suppose you start with the idea +that you want to be able to write this:

(do-primes (p 0 19)
+  (format t "~d " p))

to express a loop that executes the body once each for each prime +number greater or equal to 0 and less than or equal to 19, with the +variable p holding the prime number. It makes sense to model +this macro on the form of the standard DOLIST and DOTIMES +macros; macros that follow the pattern of existing macros are easier +to understand and use than macros that introduce gratuitously novel +syntax.

Without the do-primes macro, you could write such a loop with +DO (and the two utility functions defined previously) like this:

(do ((p (next-prime 0) (next-prime (1+ p))))
+    ((> p 19))
+  (format t "~d " p))

Now you're ready to start writing the macro code that will translate +from the former to the latter.

Macro Parameters

Since the arguments passed to a macro are Lisp objects representing +the source code of the macro call, the first step in any macro is to +extract whatever parts of those objects are needed to compute the +expansion. For macros that simply interpolate their arguments +directly into a template, this step is trivial: simply defining the +right parameters to hold the different arguments is sufficient.

But this approach, it seems, will not suffice for do-primes. +The first argument to the do-primes call is a list containing +the name of the loop variable, p; the lower bound, 0; +and the upper bound, 19. But if you look at the expansion, the +list as a whole doesn't appear in the expansion; the three element +are split up and put in different places.

You could define do-primes with two parameters, one to hold +the list and a &rest parameter to hold the body forms, and then +take apart the list by hand, something like this:

(defmacro do-primes (var-and-range &rest body)
+  (let ((var (first var-and-range))
+        (start (second var-and-range))
+        (end (third var-and-range)))
+    `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
+         ((> ,var ,end))
+       ,@body)))

In a moment I'll explain how the body generates the correct +expansion; for now you can just note that the variables var, +start, and end each hold a value, extracted from +var-and-range, that's then interpolated into the backquote +expression that generates do-primes's expansion.

However, you don't need to take apart var-and-range "by hand" +because macro parameter lists are what are called destructuring +parameter lists. Destructuring, as the name suggests, involves taking +apart a structure--in this case the list structure of the forms +passed to a macro.

Within a destructuring parameter list, a simple parameter name can be +replaced with a nested parameter list. The parameters in the nested +parameter list will take their values from the elements of the +expression that would have been bound to the parameter the list +replaced. For instance, you can replace var-and-range with a +list (var start end), and the three elements of the list will +automatically be destructured into those three parameters.

Another special feature of macro parameter lists is that you can use +&body as a synonym for &rest. Semantically &body and +&rest are equivalent, but many development environments will use +the presence of a &body parameter to modify how they indent uses +of the macro--typically &body parameters are used to hold a +list of forms that make up the body of the macro.

So you can streamline the definition of do-primes and give a +hint to both human readers and your development tools about its +intended use by defining it like this:

(defmacro do-primes ((var start end) &body body)
+  `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
+       ((> ,var ,end))
+     ,@body))

In addition to being more concise, destructuring parameter lists also +give you automatic error checking--with do-primes defined this +way, Lisp will be able to detect a call whose first argument isn't a +three-element list and will give you a meaningful error message just +as if you had called a function with too few or too many arguments. +Also, in development environments such as SLIME that indicate what +arguments are expected as soon as you type the name of a function or +macro, if you use a destructuring parameter list, the environment +will be able to tell you more specifically the syntax of the macro +call. With the original definition, SLIME would tell you +do-primes is called like this:

(do-primes var-and-range &rest body)

But with the new definition, it can tell you that a call should look +like this:

(do-primes (var start end) &body body)

Destructuring parameter lists can contain &optional, &key, +and &rest parameters and can contain nested destructuring lists. +However, you don't need any of those options to write +do-primes.

Generating the Expansion

Because do-primes is a fairly simple macro, after you've +destructured the arguments, all that's left is to interpolate them +into a template to get the expansion.

For simple macros like do-primes, the special backquote syntax +is perfect. To review, a backquoted expression is similar to a quoted +expression except you can "unquote" particular subexpressions by +preceding them with a comma, possibly followed by an at (@) sign. +Without an at sign, the comma causes the value of the subexpression +to be included as is. With an at sign, the value--which must be a +list--is "spliced" into the enclosing list.

Another useful way to think about the backquote syntax is as a +particularly concise way of writing code that generates lists. This +way of thinking about it has the benefit of being pretty much exactly +what's happening under the covers--when the reader reads a backquoted +expression, it translates it into code that generates the appropriate +list structure. For instance, `(,a b) might be read as +(list a 'b). The language standard doesn't specify exactly +what code the reader must produce as long as it generates the right +list structure.

Table 8-1 shows some examples of backquoted expressions along with +equivalent list-building code and the result you'd get if you +evaluated either the backquoted expression or the equivalent +code.2

Table 8-1. Backquote Examples

Backquote SyntaxEquivalent List-Building CodeResult
`(a (+ 1 2) c)(list 'a '(+ 1 2) 'c)(a (+ 1 2) c)
`(a ,(+ 1 2) c)(list 'a (+ 1 2) 'c)(a 3 c)
`(a (list 1 2) c)(list 'a '(list 1 2) 'c)(a (list 1 2) c)
`(a ,(list 1 2) c)(list 'a (list 1 2) 'c)(a (1 2) c)
`(a ,@(list 1 2) c)(append (list 'a) (list 1 2) (list 'c))(a 1 2 c)

It's important to note that backquote is just a convenience. But it's +a big convenience. To appreciate how big, compare the backquoted +version of do-primes to the following version, which uses +explicit list-building code:

(defmacro do-primes-a ((var start end) &body body)
+  (append '(do)
+          (list  (list (list var
+                             (list 'next-prime start)
+                             (list 'next-prime (list '1+ var)))))
+          (list (list (list '> var end)))
+          body))

As you'll see in a moment, the current implementation of +do-primes doesn't handle certain edge cases correctly. But +first you should verify that it at least works for the original +example. You can test it in two ways. You can test it indirectly by +simply using it--presumably, if the resulting behavior is correct, +the expansion is correct. For instance, you can type the original +example's use of do-primes to the REPL and see that it indeed +prints the right series of prime numbers.

CL-USER> (do-primes (p 0 19) (format t "~d " p))
+2 3 5 7 11 13 17 19
+NIL

Or you can check the macro directly by looking at the expansion of a +particular call. The function MACROEXPAND-1 takes any Lisp +expression as an argument and returns the result of doing one level +of macro expansion.3 Because MACROEXPAND-1 is a +function, to pass it a literal macro form you must quote it. You can +use it to see the expansion of the previous call.4

CL-USER> (macroexpand-1 '(do-primes (p 0 19) (format t "~d " p)))
+(DO ((P (NEXT-PRIME 0) (NEXT-PRIME (1+ P))))
+    ((> P 19))
+  (FORMAT T "~d " P))
+T

Or, more conveniently, in SLIME you can check a macro's expansion by +placing the cursor on the opening parenthesis of a macro form in your +source code and typing C-c RET to invoke the Emacs function +slime-macroexpand-1, which will pass the macro form to +MACROEXPAND-1 and "pretty print" the result in a temporary +buffer.

However you get to it, you can see that the result of macro expansion +is the same as the original handwritten expansion, so it seems that +do-primes works.

Plugging the Leaks

In his essay "The Law of Leaky Abstractions," Joel Spolsky coined the +term leaky abstraction to describe an abstraction that "leaks" +details it's supposed to be abstracting away. Since writing a macro +is a way of creating an abstraction, you need to make sure your +macros don't leak needlessly.5

As it turns out, a macro can leak details of its inner workings in +three ways. Luckily, it's pretty easy to tell whether a given macro +suffers from any of those leaks and to fix them.

The current definition suffers from one of the three possible macro +leaks: namely, it evaluates the end subform too many times. +Suppose you were to call do-primes with, instead of a literal +number such as 19, an expression such as (random 100) +in the end position.

(do-primes (p 0 (random 100))
+  (format t "~d " p))

Presumably the intent here is to loop over the primes from zero to +whatever random number is returned by (random 100). However, +this isn't what the current implementation does, as +MACROEXPAND-1 shows.

CL-USER> (macroexpand-1 '(do-primes (p 0 (random 100)) (format t "~d " p)))
+(DO ((P (NEXT-PRIME 0) (NEXT-PRIME (1+ P))))
+    ((> P (RANDOM 100)))
+  (FORMAT T "~d " P))
+T

When this expansion code is run, RANDOM will be called each time +the end test for the loop is evaluated. Thus, instead of looping +until p is greater than an initially chosen random number, +this loop will iterate until it happens to draw a random number less +than or equal to the current value of p. While the total +number of iterations will still be random, it will be drawn from a +much different distribution than the uniform distribution RANDOM +returns.

This is a leak in the abstraction because, to use the macro correctly, +the caller needs to be aware that the end form is going to be +evaluated more than once. One way to plug this leak would be to simply +define this as the behavior of do-primes. But that's not very +satisfactory--you should try to observe the Principle of Least +Astonishment when implementing macros. And programmers will typically +expect the forms they pass to macros to be evaluated no more times +than absolutely necessary.6 Furthermore, since do-primes is built +on the model of the standard macros, DOTIMES and DOLIST, +neither of which causes any of the forms except those in the body to +be evaluated more than once, most programmers will expect +do-primes to behave similarly.

You can fix the multiple evaluation easily enough; you just need to +generate code that evaluates end once and saves the value in a +variable to be used later. Recall that in a DO loop, variables +defined with an initialization form and no step form don't change +from iteration to iteration. So you can fix the multiple evaluation +problem with this definition:

(defmacro do-primes ((var start end) &body body)
+  `(do ((ending-value ,end)
+        (,var (next-prime ,start) (next-prime (1+ ,var))))
+       ((> ,var ending-value))
+     ,@body))

Unfortunately, this fix introduces two new leaks to the macro +abstraction.

One new leak is similar to the multiple-evaluation leak you just +fixed. Because the initialization forms for variables in a DO +loop are evaluated in the order the variables are defined, when the +macro expansion is evaluated, the expression passed as end +will be evaluated before the expression passed as start, +opposite to the order they appear in the macro call. This leak +doesn't cause any problems when start and end are +literal values like 0 and 19. But when they're forms that can have +side effects, evaluating them out of order can once again run afoul +of the Principle of Least Astonishment.

This leak is trivially plugged by swapping the order of the two +variable definitions.

(defmacro do-primes ((var start end) &body body)
+  `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
+        (ending-value ,end))
+       ((> ,var ending-value))
+     ,@body))

The last leak you need to plug was created by using the variable name +ending-value. The problem is that the name, which ought to be +a purely internal detail of the macro implementation, can end up +interacting with code passed to the macro or in the context where the +macro is called. The following seemingly innocent call to +do-primes doesn't work correctly because of this leak:

(do-primes (ending-value 0 10)
+  (print ending-value))

Neither does this one:

(let ((ending-value 0))
+  (do-primes (p 0 10)
+    (incf ending-value p))
+  ending-value)

Again, MACROEXPAND-1 can show you the problem. The first call +expands to this:

(do ((ending-value (next-prime 0) (next-prime (1+ ending-value)))
+     (ending-value 10))
+    ((> ending-value ending-value))
+  (print ending-value))

Some Lisps may reject this code because ending-value is used +twice as a variable name in the same DO loop. If not rejected +outright, the code will loop forever since ending-value will +never be greater than itself.

The second problem call expands to the following:

(let ((ending-value 0))
+  (do ((p (next-prime 0) (next-prime (1+ p)))
+       (ending-value 10))
+      ((> p ending-value))
+    (incf ending-value p))
+  ending-value)

In this case the generated code is perfectly legal, but the behavior +isn't at all what you want. Because the binding of +ending-value established by the LET outside the loop is +shadowed by the variable with the same name inside the DO, the +form (incf ending-value p) increments the loop variable +ending-value instead of the outer variable with the same name, +creating another infinite loop.7

Clearly, what you need to patch this leak is a symbol that will never +be used outside the code generated by the macro. You could try using +a really unlikely name, but that's no guarantee. You could also +protect yourself to some extent by using packages, as described in +Chapter 21. But there's a better solution.

The function GENSYM returns a unique symbol each time it's +called. This is a symbol that has never been read by the Lisp reader +and never will be because it isn't interned in any package. Thus, +instead of using a literal name like ending-value, you can +generate a new symbol each time do-primes is expanded.

(defmacro do-primes ((var start end) &body body)
+  (let ((ending-value-name (gensym)))
+    `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
+          (,ending-value-name ,end))
+         ((> ,var ,ending-value-name))
+       ,@body)))

Note that the code that calls GENSYM isn't part of the +expansion; it runs as part of the macro expander and thus creates a +new symbol each time the macro is expanded. This may seem a bit +strange at first--ending-value-name is a variable whose value +is the name of another variable. But really it's no different from +the parameter var whose value is the name of a variable--the +difference is the value of var was created by the reader when +the macro form was read, and the value of ending-value-name is +generated programmatically when the macro code runs.

With this definition the two previously problematic forms expand into +code that works the way you want. The first form:

(do-primes (ending-value 0 10)
+  (print ending-value))

expands into the following:

(do ((ending-value (next-prime 0) (next-prime (1+ ending-value)))
+     (#:g2141 10))
+    ((> ending-value #:g2141))
+  (print ending-value))

Now the variable used to hold the ending value is the gensymed +symbol, #:g2141. The name of the symbol, G2141, was +generated by GENSYM but isn't significant; the thing that +matters is the object identity of the symbol. Gensymed symbols are +printed in the normal syntax for uninterned symbols, with a leading +#:.

The other previously problematic form:

(let ((ending-value 0))
+  (do-primes (p 0 10)
+    (incf ending-value p))
+  ending-value)

looks like this if you replace the do-primes form with its +expansion:

(let ((ending-value 0))
+  (do ((p (next-prime 0) (next-prime (1+ p)))
+       (#:g2140 10))
+      ((> p #:g2140))
+    (incf ending-value p))
+  ending-value)

Again, there's no leak since the ending-value variable bound +by the LET surrounding the do-primes loop is no longer +shadowed by any variables introduced in the expanded code.

Not all literal names used in a macro expansion will necessarily +cause a problem--as you get more experience with the various binding +forms, you'll be able to determine whether a given name is being used +in a position that could cause a leak in a macro abstraction. But +there's no real downside to using a gensymed name just to be safe.

With that fix, you've plugged all the leaks in the implementation of +do-primes. Once you've gotten a bit of macro-writing +experience under your belt, you'll learn to write macros with these +kinds of leaks preplugged. It's actually fairly simple if you follow +these rules of thumb:

  • Unless there's a particular reason to do otherwise, include any +subforms in the expansion in positions that will be evaluated in the +same order as the subforms appear in the macro call.
  • Unless there's a particular reason to do otherwise, make sure +subforms are evaluated only once by creating a variable in the +expansion to hold the value of evaluating the argument form and then +using that variable anywhere else the value is needed in the +expansion.
  • Use GENSYM at macro expansion time to create variable names +used in the expansion.

Macro-Writing Macros

Of course, there's no reason you should be able to take advantage of +macros only when writing functions. The job of macros is to abstract +away common syntactic patterns, and certain patterns come up again +and again in writing macros that can also benefit from being +abstracted away.

In fact, you've already seen one such pattern--many macros will, like +the last version of do-primes, start with a LET that +introduces a few variables holding gensymed symbols to be used in the +macro's expansion. Since this is such a common pattern, why not +abstract it away with its own macro?

In this section you'll write a macro, with-gensyms, that does +just that. In other words, you'll write a macro-writing macro: a +macro that generates code that generates code. While complex +macro-writing macros can be a bit confusing until you get used to +keeping the various levels of code clear in your mind, +with-gensyms is fairly straightforward and will serve as a +useful but not too strenuous mental limbering exercise.

You want to be able to write something like this:

(defmacro do-primes ((var start end) &body body)
+  (with-gensyms (ending-value-name)
+    `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
+          (,ending-value-name ,end))
+         ((> ,var ,ending-value-name))
+       ,@body)))

and have it be equivalent to the previous version of +do-primes. In other words, the with-gensyms needs to +expand into a LET that binds each named variable, +ending-value-name in this case, to a gensymed symbol. That's +easy enough to write with a simple backquote template.

(defmacro with-gensyms ((&rest names) &body body)
+  `(let ,(loop for n in names collect `(,n (gensym)))
+     ,@body))

Note how you can use a comma to interpolate the value of the +LOOP expression. The loop generates a list of binding forms +where each binding form consists of a list containing one of the +names given to with-gensyms and the literal code +(gensym). You can test what code the LOOP expression +would generate at the REPL by replacing names with a list of +symbols.

CL-USER> (loop for n in '(a b c) collect `(,n (gensym)))
+((A (GENSYM)) (B (GENSYM)) (C (GENSYM)))

After the list of binding forms, the body argument to +with-gensyms is spliced in as the body of the LET. Thus, +in the code you wrap in a with-gensyms you can refer to any of +the variables named in the list of variables passed to +with-gensyms.

If you macro-expand the with-gensyms form in the new +definition of do-primes, you should see something like this:

(let ((ending-value-name (gensym)))
+  `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
+        (,ending-value-name ,end))
+       ((> ,var ,ending-value-name))
+     ,@body))

Looks good. While this macro is fairly trivial, it's important to +keep clear about when the different macros are expanded: when you +compile the DEFMACRO of do-primes, the +with-gensyms form is expanded into the code just shown and +compiled. Thus, the compiled version of do-primes is just the +same as if you had written the outer LET by hand. When you +compile a function that uses do-primes, the code generated +by with-gensyms runs generating the do-primes +expansion, but with-gensyms itself isn't needed to compile a +do-primes form since it has already been expanded, back when +do-primes was compiled.

Another classic macro-writing MACRO: ONCE-ONLY

Beyond Simple Macros

I could, of course, say a lot more about macros. All the macros +you've seen so far have been fairly simple examples that save you a +bit of typing but don't provide radical new ways of expressing +things. In upcoming chapters you'll see examples of macros that allow +you to express things in ways that would be virtually impossible +without macros. You'll start in the very next chapter, in which +you'll build a simple but effective unit test framework. +


1As with functions, macros can also contain +declarations, but you don't need to worry about those for now.

2APPEND, which I haven't discussed yet, is a function +that takes any number of list arguments and returns the result of +splicing them together into a single list.

3Another function, MACROEXPAND, keeps +expanding the result as long as the first element of the resulting +expansion is the name of the macro. However, this will often show you +a much lower-level view of what the code is doing than you want, +since basic control constructs such as DO are also implemented +as macros. In other words, while it can be educational to see what +your macro ultimately expands into, it isn't a very useful view into +what your own macros are doing.

4If the macro +expansion is shown all on one line, it's probably because the +variable *PRINT-PRETTY* is NIL. If it is, evaluating +(setf *print-pretty* t) should make the macro expansion easier +to read.

5This is from Joel on Software +by Joel Spolsky, also available at +http://www.joelonsoftware.com/ +articles/LeakyAbstractions.html. Spolsky's point in the essay is +that all abstractions leak to some extent; that is, there are no +perfect abstractions. But that doesn't mean you should tolerate leaks +you can easily plug.

6Of course, certain forms are supposed +to be evaluated more than once, such as the forms in the body of a +do-primes loop.

7It may not be obvious that this +loop is necessarily infinite given the nonuniform occurrences of +prime numbers. The starting point for a proof that it is in fact +infinite is Bertrand's postulate, which says for any n > 1, there +exists a prime p, n < p < 2n. From there you can +prove that for any prime number, P less than the sum of the preceding +prime numbers, the next prime, P', is also smaller than the original +sum plus P.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/macros-standard-control-constructs.html b/clones/gigamonkeys.com/book/macros-standard-control-constructs.html new file mode 100644 index 00000000..a4f0ecdf --- /dev/null +++ b/clones/gigamonkeys.com/book/macros-standard-control-constructs.html @@ -0,0 +1,388 @@ +Macros: Standard Control Constructs

7. Macros: Standard Control Constructs

While many of the ideas that originated in Lisp, from the conditional +expression to garbage collection, have been incorporated into other +languages, the one language feature that continues to set Common Lisp +apart is its macro system. Unfortunately, the word macro describes +a lot of things in computing to which Common Lisp's macros bear only a +vague and metaphorical similarity. This causes no end of +misunderstanding when Lispers try to explain to non-Lispers what a +great feature macros are.1 To understand +Lisp's macros, you really need to come at them fresh, without +preconceptions based on other things that also happen to be called +macros. So let's start our discussion of Lisp's macros by taking a +step back and looking at various ways languages support extensibility.

All programmers should be used to the idea that the definition of a +language can include a standard library of functionality that's +implemented in terms of the "core" language--functionality that could +have been implemented by any programmer on top of the language if it +hadn't been defined as part of the standard library. C's standard +library, for instance, can be implemented almost entirely in portable +C. Similarly, most of the ever-growing set of classes and interfaces +that ship with Java's standard Java Development Kit (JDK) are written +in "pure" Java.

One advantage of defining languages in terms of a core plus a +standard library is it makes them easier to understand and implement. +But the real benefit is in terms of expressiveness--since much of +what you think of as "the language" is really just a library--the +language is easy to extend. If C doesn't have a function to do some +thing or another that you need, you can write that function, and now +you have a slightly richer version of C. Similarly, in a language +such as Java or Smalltalk where almost all the interesting parts of +the "language" are defined in terms of classes, by defining new +classes you extend the language, making it more suited for writing +programs to do whatever it is you're trying to do.

While Common Lisp supports both these methods of extending the +language, macros give Common Lisp yet another way. As I discussed +briefly in Chapter 4, each macro defines its own syntax, determining +how the s-expressions it's passed are turned into Lisp forms. With +macros as part of the core language it's possible to build new +syntax--control constructs such as WHEN, DOLIST, and +LOOP as well as definitional forms such as DEFUN and +DEFPARAMETER--as part of the "standard library" rather than +having to hardwire them into the core. This has implications for how +the language itself is implemented, but as a Lisp programmer you'll +care more that it gives you another way to extend the language, +making it a better language for expressing solutions to your +particular programming problems.

Now, it may seem that the benefits of having another way to extend +the language would be easy to recognize. But for some reason a lot of +folks who haven't actually used Lisp macros--folks who think nothing +of spending their days creating new functional abstractions or +defining hierarchies of classes to solve their programming +problems--get spooked by the idea of being able to define new +syntactic abstractions. The most common cause of macrophobia seems to +be bad experiences with other "macro" systems. Simple fear of the +unknown no doubt plays a role, too. To avoid triggering any +macrophobic reactions, I'll ease into the subject by discussing +several of the standard control-construct macros defined by Common +Lisp. These are some of the things that, if Lisp didn't have macros, +would have to be built into the language core. When you use them, you +don't have to care that they're implemented as macros, but they +provide a good example of some of the things you can do with +macros.2 In the +next chapter, I'll show you how you can define your own macros.

WHEN and UNLESS

As you've already seen, the most basic form of conditional +execution--if x, do y; otherwise do z--is provided by the +IF special operator, which has this basic form:

(if condition then-form [else-form])

The condition is evaluated and, if its value is non-NIL, the +then-form is evaluated and the resulting value returned. +Otherwise, the else-form, if any, is evaluated and its value +returned. If condition is NIL and there's no else-form, +then the IF returns NIL.

(if (> 2 3) "Yup" "Nope") ==> "Nope"
+(if (> 2 3) "Yup")        ==> NIL
+(if (> 3 2) "Yup" "Nope") ==> "Yup"

However, IF isn't actually such a great syntactic construct +because the then-form and else-form are each restricted to +being a single Lisp form. This means if you want to perform a +sequence of actions in either clause, you need to wrap them in some +other syntax. For instance, suppose in the middle of a spam-filtering +program you wanted to both file a message as spam and update the spam +database when a message is spam. You can't write this:

(if (spam-p current-message)
+    (file-in-spam-folder current-message)
+    (update-spam-database current-message))

because the call to update-spam-database will be treated as +the else clause, not as part of the then clause. Another special +operator, PROGN, executes any number of forms in order and +returns the value of the last form. So you could get the desired +behavior by writing the following:

(if (spam-p current-message)
+    (progn
+      (file-in-spam-folder current-message)
+      (update-spam-database current-message)))

That's not too horrible. But given the number of times you'll likely +have to use this idiom, it's not hard to imagine that you'd get tired +of it after a while. "Why," you might ask yourself, "doesn't Lisp +provide a way to say what I really want, namely, 'When x is true, +do this, that, and the other thing'?" In other words, after a while +you'd notice the pattern of an IF plus a PROGN and wish for +a way to abstract away the details rather than writing them out every +time.

This is exactly what macros provide. In this case, Common Lisp comes +with a standard macro, WHEN, which lets you write this:

(when (spam-p current-message)
+  (file-in-spam-folder current-message)
+  (update-spam-database current-message))

But if it wasn't built into the standard library, you could define +WHEN yourself with a macro such as this, using the backquote +notation I discussed in Chapter 3:3

(defmacro when (condition &rest body)
+  `(if ,condition (progn ,@body)))

A counterpart to the WHEN macro is UNLESS, which reverses +the condition, evaluating its body forms only if the condition is +false. In other words:

(defmacro unless (condition &rest body)
+  `(if (not ,condition) (progn ,@body)))

Admittedly, these are pretty trivial macros. There's no deep black +magic here; they just abstract away a few language-level bookkeeping +details, allowing you to express your true intent a bit more clearly. +But their very triviality makes an important point: because the macro +system is built right into the language, you can write trivial macros +like WHEN and UNLESS that give you small but real gains in +clarity that are then multiplied by the thousands of times you use +them. In Chapters 24, 26, and 31 you'll see how macros can also be +used on a larger scale, creating whole domain-specific embedded +languages. But first let's finish our discussion of the standard +control-construct macros.

COND

Another time raw IF expressions can get ugly is when you have a +multibranch conditional: if a do x, else if b do y; +else do z. There's no logical problem writing such a chain of +conditional expressions with just IF, but it's not pretty.

(if a
+    (do-x)
+    (if b
+       (do-y)
+       (do-z)))

And it would be even worse if you needed to include multiple forms in +the then clauses, requiring PROGNs. So, not surprisingly, Common +Lisp provides a macro for expressing multibranch conditionals: +COND. This is the basic skeleton:

(cond
+  (test-1 form*)
+      .
+      .
+      .
+  (test-N form*))

Each element of the body represents one branch of the conditional and +consists of a list containing a condition form and zero or more forms +to be evaluated if that branch is chosen. The conditions are +evaluated in the order the branches appear in the body until one of +them evaluates to true. At that point, the remaining forms in that +branch are evaluated, and the value of the last form in the branch is +returned as the value of the COND as a whole. If the branch +contains no forms after the condition, the value of the condition is +returned instead. By convention, the branch representing the final +else clause in an if/else-if chain is written with a condition of +T. Any non-NIL value will work, but a T serves as a +useful landmark when reading the code. Thus, you can write the +previous nested IF expression using COND like this:

(cond (a (do-x))
+      (b (do-y))
+      (t (do-z)))

AND, OR, and NOT

When writing the conditions in IF, WHEN, UNLESS, and +COND forms, three operators that will come in handy are the +boolean logic operators, AND, OR, and NOT.

NOT is a function so strictly speaking doesn't belong in this +chapter, but it's closely tied to AND and OR. It takes a +single argument and inverts its truth value, returning T if the +argument is NIL and NIL otherwise.

AND and OR, however, are macros. They implement logical +conjunction and disjunction of any number of subforms and are defined +as macros so they can short-circuit. That is, they evaluate only +as many of their subforms--in left-to-right order--as necessary to +determine the overall truth value. Thus, AND stops and returns +NIL as soon as one of its subforms evaluates to NIL. If all +the subforms evaluate to non-NIL, it returns the value of the +last subform. OR, on the other hand, stops as soon as one of its +subforms evaluates to non-NIL and returns the resulting value. If +none of the subforms evaluate to true, OR returns NIL. Here +are some examples:

(not nil)             ==> T
+(not (= 1 1))         ==> NIL
+(and (= 1 2) (= 3 3)) ==> NIL
+(or (= 1 2) (= 3 3))  ==> T

Looping

Control constructs are the other main kind of looping constructs. +Common Lisp's looping facilities are--in addition to being quite +powerful and flexible--an interesting lesson in the +have-your-cake-and-eat-it-too style of programming that macros +provide.

As it turns out, none of Lisp's 25 special operators directly support +structured looping. All of Lisp's looping control constructs are +macros built on top of a pair of special operators that provide a +primitive goto facility.4 Like many good abstractions, +syntactic or otherwise, Lisp's looping macros are built as a set of +layered abstractions starting from the base provided by those two +special operators.

At the bottom (leaving aside the special operators) is a very general +looping construct, DO. While very powerful, DO suffers, as +do many general-purpose abstractions, from being overkill for simple +situations. So Lisp also provides two other macros, DOLIST and +DOTIMES, that are less flexible than DO but provide +convenient support for the common cases of looping over the elements +of a list and counting loops. While an implementation can implement +these macros however it wants, they're typically implemented as +macros that expand into an equivalent DO loop. Thus, DO +provides a basic structured looping construct on top of the +underlying primitives provided by Common Lisp's special operators, +and DOLIST and DOTIMES provide two easier-to-use, if less +general, constructs. And, as you'll see in the next chapter, you can +build your own looping constructs on top of DO for situations +where DOLIST and DOTIMES don't meet your needs.

Finally, the LOOP macro provides a full-blown mini-language for +expressing looping constructs in a non-Lispy, English-like (or at +least Algol-like) language. Some Lisp hackers love LOOP; others +hate it. LOOP's fans like it because it provides a concise way +to express certain commonly needed looping constructs. Its detractors +dislike it because it's not Lispy enough. But whichever side one +comes down on, it's a remarkable example of the power of macros to +add new constructs to the language.

DOLIST and DOTIMES

I'll start with the easy-to-use DOLIST and DOTIMES macros.

DOLIST loops across the items of a list, executing the loop body +with a variable holding the successive items of the +list.5 This is the +basic skeleton (leaving out some of the more esoteric options):

(dolist (var list-form)
+  body-form*)

When the loop starts, the list-form is evaluated once to produce +a list. Then the body of the loop is evaluated once for each item in +the list with the variable var holding the value of the item. For +instance:

CL-USER> (dolist (x '(1 2 3)) (print x))
+1
+2
+3
+NIL

Used this way, the DOLIST form as a whole evaluates to NIL.

If you want to break out of a DOLIST loop before the end of the +list, you can use RETURN.

CL-USER> (dolist (x '(1 2 3)) (print x) (if (evenp x) (return)))
+1
+2
+NIL

DOTIMES is the high-level looping construct for counting loops. +The basic template is much the same as DOLIST's.

(dotimes (var count-form)
+  body-form*)

The count-form must evaluate to an integer. Each time through the +loop var holds successive integers from 0 to one less than that +number. For instance:

CL-USER> (dotimes (i 4) (print i))
+0
+1
+2
+3
+NIL

As with DOLIST, you can use RETURN to break out of the loop +early.

Because the body of both DOLIST and DOTIMES loops can +contain any kind of expressions, you can also nest loops. For +example, to print out the times tables from 1 × 1 = 1 to +20 × 20 = 400, you can write this pair of nested DOTIMES +loops:

(dotimes (x 20)
+  (dotimes (y 20)
+    (format t "~3d " (* (1+ x) (1+ y))))
+  (format t "~%"))

DO

While DOLIST and DOTIMES are convenient and easy to use, +they aren't flexible enough to use for all loops. For instance, what +if you want to step multiple variables in parallel? Or use an +arbitrary expression to test for the end of the loop? If neither +DOLIST nor DOTIMES meet your needs, you still have access +to the more general DO loop.

Where DOLIST and DOTIMES provide only one loop variable, +DO lets you bind any number of variables and gives you complete +control over how they change on each step through the loop. You also +get to define the test that determines when to end the loop and can +provide a form to evaluate at the end of the loop to generate a +return value for the DO expression as a whole. The basic +template looks like this:

(do (variable-definition*)
+    (end-test-form result-form*)
+  statement*)

Each variable-definition introduces a variable that will be in +scope in the body of the loop. The full form of a single variable +definition is a list containing three elements.

(var init-form step-form)

The init-form will be evaluated at the beginning of the loop and +the resulting values bound to the variable var. Before each +subsequent iteration of the loop, the step-form will be evaluated +and the new value assigned to var. The step-form is optional; +if it's left out, the variable will keep its value from iteration to +iteration unless you explicitly assign it a new value in the loop +body. As with the variable definitions in a LET, if the +init-form is left out, the variable is bound to NIL. Also as +with LET, you can use a plain variable name as shorthand for a +list containing just the name.

At the beginning of each iteration, after all the loop variables have +been given their new values, the end-test-form is evaluated. As +long as it evaluates to NIL, the iteration proceeds, evaluating +the statements in order.

When the end-test-form evaluates to true, the result-forms +are evaluated, and the value of the last result form is returned as +the value of the DO expression.

At each step of the iteration the step forms for all the variables +are evaluated before assigning any of the values to the variables. +This means you can refer to any of the other loop variables in the +step forms.6 That is, in a loop like this:

(do ((n 0 (1+ n))
+     (cur 0 next)
+     (next 1 (+ cur next)))
+    ((= 10 n) cur))

the step forms (1+ n), next, and (+ cur next) +are all evaluated using the old values of n, cur, and +next. Only after all the step forms have been evaluated are +the variables given their new values. (Mathematically inclined +readers may notice that this is a particularly efficient way of +computing the eleventh Fibonacci number.)

This example also illustrates another characteristic of +DO--because you can step multiple variables, you often don't +need a body at all. Other times, you may leave out the result form, +particularly if you're just using the loop as a control construct. +This flexibility, however, is the reason that DO expressions can +be a bit cryptic. Where exactly do all the parentheses go? The best +way to understand a DO expression is to keep in mind the basic +template.

(do (variable-definition*)
+    (end-test-form result-form*)
+  statement*)

The six parentheses in that template are the only ones required by +the DO itself. You need one pair to enclose the variable +declarations, one pair to enclose the end test and result forms, and +one pair to enclose the whole expression. Other forms within the +DO may require their own parentheses--variable definitions are +usually lists, for instance. And the test form is often a function +call. But the skeleton of a DO loop will always be the same. +Here are some example DO loops with the skeleton in bold:

(do ((i 0 (1+ i)))
+    ((>= i 4))
+  (print i))

Notice that the result form has been omitted. This is, however, not a +particularly idiomatic use of DO, as this loop is much more +simply written using DOTIMES.7

(dotimes (i 4) (print i))

As another example, here's the bodiless Fibonacci-computing loop:

(do ((n 0 (1+ n))
+     (cur 0 next)
+     (next 1 (+ cur next)))
+    ((= 10 n) cur))

Finally, the next loop demonstrates a DO loop that binds no +variables. It loops while the current time is less than the value of +a global variable, printing "Waiting" once a minute. Note that even +with no loop variables, you still need the empty variables list.

(do ()
+    ((> (get-universal-time) *some-future-date*))
+  (format t "Waiting~%")
+  (sleep 60)) 

The Mighty LOOP

For the simple cases you have DOLIST and DOTIMES. And if +they don't suit your needs, you can fall back on the completely +general DO. What more could you want?

Well, it turns out a handful of looping idioms come up over and over +again, such as looping over various data structures: lists, vectors, +hash tables, and packages. Or accumulating values in various ways +while looping: collecting, counting, summing, minimizing, or +maximizing. If you need a loop to do one of these things (or several +at the same time), the LOOP macro may give you an easier way to +express it.

The LOOP macro actually comes in two flavors--simple and +extended. The simple version is as simple as can be--an infinite +loop that doesn't bind any variables. The skeleton looks like this:

(loop
+  body-form*)

The forms in body are evaluated each time through the loop, which +will iterate forever unless you use RETURN to break out. For +example, you could write the previous DO loop with a simple +LOOP.

(loop
+  (when (> (get-universal-time) *some-future-date*)
+    (return))
+  (format t "Waiting~%")
+  (sleep 60))

The extended LOOP is quite a different beast. It's distinguished +by the use of certain loop keywords that implement a +special-purpose language for expressing looping idioms. It's worth +noting that not all Lispers love the extended LOOP language. At +least one of Common Lisp's original designers hated it. LOOP's +detractors complain that its syntax is totally un-Lispy (in other +words, not enough parentheses). LOOP's fans counter that that's +the point: complicated looping constructs are hard enough to +understand without wrapping them up in DO's cryptic syntax. It's +better, they say, to have a slightly more verbose syntax that gives +you some clues what the heck is going on.

For instance, here's an idiomatic DO loop that collects the +numbers from 1 to 10 into a list:

(do ((nums nil) (i 1 (1+ i)))
+    ((> i 10) (nreverse nums))
+  (push i nums)) ==> (1 2 3 4 5 6 7 8 9 10)

A seasoned Lisper won't have any trouble understanding that +code--it's just a matter of understanding the basic form of a DO +loop and recognizing the PUSH/NREVERSE idiom for building +up a list. But it's not exactly transparent. The LOOP version, +on the other hand, is almost understandable as an English sentence.

(loop for i from 1 to 10 collecting i) ==> (1 2 3 4 5 6 7 8 9 10)

The following are some more examples of simple uses of LOOP. +This sums the first ten squares:

(loop for x from 1 to 10 summing (expt x 2)) ==> 385

This counts the number of vowels in a string:

(loop for x across "the quick brown fox jumps over the lazy dog"
+      counting (find x "aeiou")) ==> 11

This computes the eleventh Fibonacci number, similar to the DO +loop used earlier:

(loop for i below 10
+      and a = 0 then b
+      and b = 1 then (+ b a)
+      finally (return  a))

The symbols across, and, below, +collecting, counting, finally, for, +from, summing, then, and to are some of +the loop keywords whose presence identifies these as instances of the +extended LOOP. 8

I'll save the details of LOOP for Chapter 22, but it's worth +noting here as another example of the way macros can be used to +extend the base language. While LOOP provides its own language +for expressing looping constructs, it doesn't cut you off from the +rest of Lisp. The loop keywords are parsed according to loop's +grammar, but the rest of the code in a LOOP is regular Lisp +code.

And it's worth pointing out one more time that while the LOOP +macro is quite a bit more complicated than macros such as WHEN +or UNLESS, it is just another macro. If it hadn't been +included in the standard library, you could implement it yourself or +get a third-party library that does.

With that I'll conclude our tour of the basic control-construct +macros. Now you're ready to take a closer look at how to define your +own macros. +


1To see what this misunderstanding looks +like, find any longish Usenet thread cross-posted between +comp.lang.lisp and any other comp.lang.* group with macro in the +subject. A rough paraphrase goes like this:

Lispnik: "Lisp is the best because of its macros!";

Othernik: "You think Lisp is good because of macros?! But macros +are horrible and evil; Lisp must be horrible and evil."

2Another important class of language constructs that are +defined using macros are all the definitional constructs such as +DEFUN, DEFPARAMETER, DEFVAR, and others. In Chapter 24 +you'll define your own definitional macros that will allow you to +concisely write code for reading and writing binary data.

3You can't actually feed this +definition to Lisp because it's illegal to redefine names in the +COMMON-LISP package where WHEN comes from. If you really +want to try writing such a macro, you'd need to change the name to +something else, such as my-when.

4The special operators, if you must +know, are TAGBODY and GO. There's no need to discuss them +now, but I'll cover them in Chapter 20.

5DOLIST is similar to Perl's foreach or +Python's for. Java added a similar kind of loop construct with +the "enhanced" for loop in Java 1.5, as part of JSR-201. +Notice what a difference macros make. A Lisp programmer who notices a +common pattern in their code can write a macro to give themselves a +source-level abstraction of that pattern. A Java programmer who +notices the same pattern has to convince Sun that this particular +abstraction is worth adding to the language. Then Sun has to publish +a JSR and convene an industry-wide "expert group" to hash everything +out. That process--according to Sun--takes an average of 18 months. +After that, the compiler writers all have to go upgrade their +compilers to support the new feature. And even once the Java +programmer's favorite compiler supports the new version of Java, they +probably still can't use the new feature until they're allowed to +break source compatibility with older versions of Java. So an +annoyance that Common Lisp programmers can resolve for themselves +within five minutes plagues Java programmers for years.

6A variant of DO, DO*, assigns each +variable its value before evaluating the step form for subsequent +variables. For more details, consult your favorite Common Lisp +reference.

7The DOTIMES is also +preferred because the macro expansion will likely include +declarations that allow the compiler to generate more efficient +code.

8Loop keywords is a bit of a misnomer +since they aren't keyword symbols. In fact, LOOP doesn't care +what package the symbols are from. When the LOOP macro parses +its body, it considers any appropriately named symbols equivalent. +You could even use true keywords if you wanted--:for, +:across, and so on--because they also have the correct name. +But most folks just use plain symbols. Because the loop keywords are +used only as syntactic markers, it doesn't matter if they're used for +other purposes--as function or variable names.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/numbers-characters-and-strings.html b/clones/gigamonkeys.com/book/numbers-characters-and-strings.html new file mode 100644 index 00000000..6d194c1c --- /dev/null +++ b/clones/gigamonkeys.com/book/numbers-characters-and-strings.html @@ -0,0 +1,438 @@ +Numbers, Characters, and Strings

10. Numbers, Characters, and Strings

While functions, variables, macros, and 25 special operators provide +the basic building blocks of the language itself, the building blocks +of your programs will be the data structures you use. As Fred Brooks +observed in The Mythical Man-Month, "Representation is the +essence of programming."1

Common Lisp provides built-in support for most of the data types +typically found in modern languages: numbers (integer, floating +point, and complex), characters, strings, arrays (including +multidimensional arrays), lists, hash tables, input and output +streams, and an abstraction for portably representing filenames. +Functions are also a first-class data type in Lisp--they can be +stored in variables, passed as arguments, returned as return values, +and created at runtime.

And these built-in types are just the beginning. They're defined in +the language standard so programmers can count on them being +available and because they tend to be easier to implement efficiently +when tightly integrated with the rest of the implementation. But, as +you'll see in later chapters, Common Lisp also provides several ways +for you to define new data types, define operations on them, and +integrate them with the built-in data types.

For now, however, you can start with the built-in data types. Because +Lisp is a high-level language, the details of exactly how different +data types are implemented are largely hidden. From your point of +view as a user of the language, the built-in data types are defined +by the functions that operate on them. So to learn a data type, you +just have to learn about the functions you can use with it. +Additionally, most of the built-in data types have a special syntax +that the Lisp reader understands and that the Lisp printer uses. +That's why, for instance, you can write strings as "foo"; +numbers as 123, 1/23, and 1.23; and lists as +(a b c). I'll describe the syntax for different kinds of +objects when I describe the functions for manipulating them.

In this chapter, I'll cover the built-in "scalar" data types: +numbers, characters, and strings. Technically, strings aren't true +scalars--a string is a sequence of characters, and you can access +individual characters and manipulate strings with a function that +operates on sequences. But I'll discuss strings here because most of +the string-specific functions manipulate them as single values and +also because of the close relation between several of the string +functions and their character counterparts.

Numbers

Math, as Barbie says, is hard.2 Common +Lisp can't make the math part any easier, but it does tend to get in +the way a lot less than other programming languages. That's not +surprising given its mathematical heritage. Lisp was originally +designed by a mathematician as a tool for studying mathematical +functions. And one of the main projects of the MAC project at MIT was +the Macsyma symbolic algebra system, written in Maclisp, one of +Common Lisp's immediate predecessors. Additionally, Lisp has been +used as a teaching language at places such as MIT where even the +computer science professors cringe at the thought of telling their +students that 10/4 = 2, leading to Lisp's support for exact +ratios. And at various times Lisp has been called upon to compete +with FORTRAN in the high-performance numeric computing arena.

One of the reasons Lisp is a nice language for math is its numbers +behave more like true mathematical numbers than the approximations of +numbers that are easy to implement in finite computer hardware. For +instance, integers in Common Lisp can be almost arbitrarily large +rather than being limited by the size of a machine +word.3 And dividing two integers results in an exact +ratio, not a truncated value. And since ratios are represented as +pairs of arbitrarily sized integers, ratios can represent arbitrarily +precise fractions.4

On the other hand, for high-performance numeric programming, you may +be willing to trade the exactitude of rationals for the speed offered +by using the hardware's underlying floating-point operations. So, +Common Lisp also offers several types of floating-point numbers, +which are mapped by the implementation to the appropriate +hardware-supported floating-point representations.5 Floats are also used +to represent the results of a computation whose true mathematical +value would be an irrational number.

Finally, Common Lisp supports complex numbers--the numbers that +result from doing things such as taking square roots and logarithms +of negative numbers. The Common Lisp standard even goes so far as to +specify the principal values and branch cuts for irrational and +transcendental functions on the complex domain.

Numeric Literals

You can write numeric literals in a variety of ways; you saw a few +examples in Chapter 4. However, it's important to keep in mind the +division of labor between the Lisp reader and the Lisp evaluator--the +reader is responsible for translating text into Lisp objects, and the +Lisp evaluator then deals only with those objects. For a given number +of a given type, there can be many different textual representations, +all of which will be translated to the same object representation by +the Lisp reader. For instance, you can write the integer 10 as +10, 20/2, #xA, or any of a number of other ways, +but the reader will translate all these to the same object. When +numbers are printed back out--say, at the REPL--they're printed in a +canonical textual syntax that may be different from the syntax used +to enter the number. For example:

CL-USER> 10
+10
+CL-USER> 20/2
+10
+CL-USER> #xa
+10

The syntax for integer values is an optional sign (+ or +-) followed by one or more digits. Ratios are written as an +optional sign and a sequence of digits, representing the numerator, a +slash (/), and another sequence of digits representing the +denominator. All rational numbers are "canonicalized" as they're +read--that's why 10 and 20/2 are both read as the same +number, as are 3/4 and 6/8. Rationals are printed in +"reduced" form--integer values are printed in integer syntax and +ratios with the numerator and denominator reduced to lowest terms.

It's also possible to write rationals in bases other than 10. If +preceded by #B or #b, a rational literal is read as a +binary number with 0 and 1 as the only legal digits. An +#O or #o indicates an octal number (legal digits +0-7), and #X or #x indicates hexadecimal +(legal digits 0-F or 0-f). You can write +rationals in other bases from 2 to 36 with #nR where n is +the base (always written in decimal). Additional "digits" beyond 9 +are taken from the letters A-Z or a-z. +Note that these radix indicators apply to the whole rational--it's +not possible to write a ratio with the numerator in one base and +denominator in another. Also, you can write integer values, but not +ratios, as decimal digits terminated with a decimal point.6 Some examples of rationals, +with their canonical, decimal representation are as follows:

123                            ==> 123
++123                           ==> 123
+-123                           ==> -123
+123.                           ==> 123
+2/3                            ==> 2/3
+-2/3                           ==> -2/3
+4/6                            ==> 2/3
+6/3                            ==> 2
+#b10101                        ==> 21
+#b1010/1011                    ==> 10/11
+#o777                          ==> 511
+#xDADA                         ==> 56026
+#36rABCDEFGHIJKLMNOPQRSTUVWXYZ ==> 8337503854730415241050377135811259267835

You can also write floating-point numbers in a variety of ways. +Unlike rational numbers, the syntax used to notate a floating-point +number can affect the actual type of number read. Common Lisp defines +four subtypes of floating-point number: short, single, double, and +long. Each subtype can use a different number of bits in its +representation, which means each subtype can represent values +spanning a different range and with different precision. More bits +gives a wider range and more precision.7

The basic format for floating-point numbers is an optional sign +followed by a nonempty sequence of decimal digits possibly with an +embedded decimal point. This sequence can be followed by an exponent +marker for "computerized scientific notation."8 The exponent marker consists of a single +letter followed by an optional sign and a sequence of digits, which +are interpreted as the power of ten by which the number before the +exponent marker should be multiplied. The letter does double duty: it +marks the beginning of the exponent and indicates what floating- +point representation should be used for the number. The exponent +markers s, f, d, l (and their uppercase equivalents) +indicate short, single, double, and long floats, respectively. The +letter e indicates that the default representation (initially +single-float) should be used.

Numbers with no exponent marker are read in the default +representation and must contain a decimal point followed by at least +one digit to distinguish them from integers. The digits in a +floating-point number are always treated as base 10 digits--the +#B, #X, #O, and #R syntaxes work only +with rationals. The following are some example floating-point numbers +along with their canonical representation:

1.0      ==> 1.0
+1e0      ==> 1.0
+1d0      ==> 1.0d0
+123.0    ==> 123.0
+123e0    ==> 123.0
+0.123    ==> 0.123
+.123     ==> 0.123
+123e-3   ==> 0.123
+123E-3   ==> 0.123
+0.123e20 ==> 1.23e+19
+123d23   ==> 1.23d+25

Finally, complex numbers are written in their own syntax, namely, +#C or #c followed by a list of two real numbers +representing the real and imaginary part of the complex number. There +are actually five kinds of complex numbers because the real and +imaginary parts must either both be rational or both be the same kind +of floating-point number.

But you can write them however you want--if a complex is written with +one rational and one floating-point part, the rational is converted +to a float of the appropriate representation. Similarly, if the real +and imaginary parts are both floats of different representations, the +one in the smaller representation will be upgraded.

However, no complex numbers have a rational real component and a zero +imaginary part--since such values are, mathematically speaking, +rational, they're represented by the appropriate rational value. The +same mathematical argument could be made for complex numbers with +floating-point components, but for those complex types a number with +a zero imaginary part is always a different object than the +floating-point number representing the real component. Here are some +examples of numbers written the complex number syntax:

#c(2      1)    ==> #c(2 1)
+#c(2/3  3/4)    ==> #c(2/3 3/4)
+#c(2    1.0)    ==> #c(2.0 1.0)
+#c(2.0  1.0d0)  ==> #c(2.0d0 1.0d0)
+#c(1/2  1.0)    ==> #c(0.5 1.0)
+#c(3      0)    ==> 3
+#c(3.0  0.0)    ==> #c(3.0 0.0)
+#c(1/2    0)    ==> 1/2
+#c(-6/3   0)    ==> -2

Basic Math

The basic arithmetic operations--addition, subtraction, +multiplication, and division--are supported for all the different +kinds of Lisp numbers with the functions +, -, *, and +/. Calling any of these functions with more than two arguments is +equivalent to calling the same function on the first two arguments and +then calling it again on the resulting value and the rest of the +arguments. For example, (+ 1 2 3) is equivalent to (+ (+ +1 2) 3). With only one argument, + and * return the value; +- returns its negation and / its reciprocal.9

(+ 1 2)              ==> 3
+(+ 1 2 3)            ==> 6
+(+ 10.0 3.0)         ==> 13.0
+(+ #c(1 2) #c(3 4))  ==> #c(4 6)
+(- 5 4)              ==> 1
+(- 2)                ==> -2
+(- 10 3 5)           ==> 2
+(* 2 3)              ==> 6
+(* 2 3 4)            ==> 24
+(/ 10 5)             ==> 2
+(/ 10 5 2)           ==> 1
+(/ 2 3)              ==> 2/3
+(/ 4)                ==> 1/4

If all the arguments are the same type of number (rational, floating +point, or complex), the result will be the same type except in the +case where the result of an operation on complex numbers with +rational components yields a number with a zero imaginary part, in +which case the result will be a rational. However, floating-point and +complex numbers are contagious--if all the arguments are reals +but one or more are floating-point numbers, the other arguments are +converted to the nearest floating-point value in a "largest" +floating-point representation of the actual floating-point arguments. +Floating-point numbers in a "smaller" representation are also +converted to the larger representation. Similarly, if any of the +arguments are complex, any real arguments are converted to the +complex equivalents.

(+ 1 2.0)             ==> 3.0
+(/ 2 3.0)             ==> 0.6666667
+(+ #c(1 2) 3)         ==> #c(4 2)
+(+ #c(1 2) 3/2)       ==> #c(5/2 2)
+(+ #c(1 1) #c(2 -1))  ==> 3

Because / doesn't truncate, Common Lisp provides four flavors of +truncating and rounding for converting a real number (rational or +floating point) to an integer: FLOOR truncates toward negative +infinity, returning the largest integer less than or equal to the +argument. CEILING truncates toward positive infinity, returning +the smallest integer greater than or equal to the argument. +TRUNCATE truncates toward zero, making it equivalent to +FLOOR for positive arguments and to CEILING for negative +arguments. And ROUND rounds to the nearest integer. If the +argument is exactly halfway between two integers, it rounds to the +nearest even integer.

Two related functions are MOD and REM, which return the +modulus and remainder of a truncating division on real numbers. These +two functions are related to the FLOOR and TRUNCATE +functions as follows:

(+ (* (floor    (/ x y)) y) (mod x y)) === x
+(+ (* (truncate (/ x y)) y) (rem x y)) === x

Thus, for positive quotients they're equivalent, but for negative +quotients they produce different results.10

The functions 1+ and 1- provide a shorthand way to express +adding and subtracting one from a number. Note that these are +different from the macros INCF and DECF. 1+ and +1- are just functions that return a new value, but INCF and +DECF modify a place. The following equivalences show the +relation between INCF/DECF, 1+/1-, and ++/-:

(incf x)    === (setf x (1+ x)) === (setf x (+ x 1))
+(decf x)    === (setf x (1- x)) === (setf x (- x 1))
+(incf x 10) === (setf x (+ x 10))
+(decf x 10) === (setf x (- x 10))

Numeric Comparisons

The function = is the numeric equality predicate. It compares +numbers by mathematical value, ignoring differences in type. Thus, += will consider mathematically equivalent values of different +types equivalent while the generic equality predicate EQL would +consider them inequivalent because of the difference in type. (The +generic equality predicate EQUALP, however, uses = to +compare numbers.) If it's called with more than two arguments, it +returns true only if they all have the same value. Thus:

(= 1 1)                        ==> T
+(= 10 20/2)                    ==> T
+(= 1 1.0 #c(1.0 0.0) #c(1 0))  ==> T

The /= function, conversely, returns true only if all its +arguments are different values.

(/= 1 1)        ==> NIL
+(/= 1 2)        ==> T
+(/= 1 2 3)      ==> T
+(/= 1 2 3 1)    ==> NIL
+(/= 1 2 3 1.0)  ==> NIL

The functions <, >, <=, and >= order rationals +and floating-point numbers (in other words, the real numbers.) Like += and /=, these functions can be called with more than two +arguments, in which case each argument is compared to the argument to +its right.

(< 2 3)       ==> T
+(> 2 3)       ==> NIL
+(> 3 2)       ==> T
+(< 2 3 4)     ==> T
+(< 2 3 3)     ==> NIL
+(<= 2 3 3)    ==> T
+(<= 2 3 3 4)  ==> T
+(<= 2 3 4 3)  ==> NIL

To pick out the smallest or largest of several numbers, you can use +the function MIN or MAX, which takes any number of real +number arguments and returns the minimum or maximum value.

(max 10 11)    ==> 11
+(min -12 -10)  ==> -12
+(max -1 2 -3)  ==> 2

Some other handy functions are ZEROP, MINUSP, and +PLUSP, which test whether a single real number is equal to, less +than, or greater than zero. Two other predicates, EVENP and +ODDP, test whether a single integer argument is even or odd. The +P suffix on the names of these functions is a standard naming +convention for predicate functions, functions that test some +condition and return a boolean.

Higher Math

The functions you've seen so far are the beginning of the built-in +mathematical functions. Lisp also supports logarithms: LOG; +exponentiation: EXP and EXPT; the basic trigonometric +functions: SIN, COS, and TAN; their inverses: +ASIN, ACOS, and ATAN; hyperbolic functions: SINH, +COSH, and TANH; and their inverses: ASINH, ACOSH, +and ATANH. It also provides functions to get at the individual +bits of an integer and to extract the parts of a ratio or a complex +number. For a complete list, see any Common Lisp reference.

Characters

Common Lisp characters are a distinct type of object from numbers. +That's as it should be--characters are not numbers, and +languages that treat them as if they are tend to run into problems +when character encodings change, say, from 8-bit ASCII to 21-bit +Unicode.11 Because the Common Lisp +standard didn't mandate a particular representation for characters, +today several Lisp implementations use Unicode as their "native" +character encoding despite Unicode being only a gleam in a standards +body's eye at the time Common Lisp's own standardization was being +wrapped up.

The read syntax for characters objects is simple: #\ followed +by the desired character. Thus, #\x is the character x. +Any character can be used after the #\, including otherwise +special characters such as ", (, and whitespace. +However, writing whitespace characters this way isn't very (human) +readable; an alternative syntax for certain characters is #\ +followed by the character's name. Exactly what names are supported +depends on the character set and on the Lisp implementation, but all +implementations support the names Space and Newline. Thus, +you should write #\Space instead of #\ , though the +latter is technically legal. Other semistandard names (that +implementations must use if the character set has the appropriate +characters) are Tab, Page, Rubout, Linefeed, +Return, and Backspace.

Character Comparisons

The main thing you can do with characters, other than putting them +into strings (which I'll get to later in this chapter), is to compare +them with other characters. Since characters aren't numbers, you +can't use the numeric comparison functions, such as < and +>. Instead, two sets of functions provide character-specific +analogs to the numeric comparators; one set is case-sensitive and +the other case-insensitive.

The case-sensitive analog to the numeric = is the function +CHAR=. Like =, CHAR= can take any number of arguments +and returns true only if they're all the same character. The case- +insensitive version is CHAR-EQUAL.

The rest of the character comparators follow this same naming scheme: +the case-sensitive comparators are named by prepending the analogous +numeric comparator with CHAR; the case-insensitive versions +spell out the comparator name, separated from the CHAR with a +hyphen. Note, however, that <= and >= are "spelled out" +with the logical equivalents NOT-GREATERP and NOT-LESSP +rather than the more verbose LESSP-OR-EQUALP and +GREATERP-OR-EQUALP. Like their numeric counterparts, all these +functions can take one or more arguments. Table 10-1 summarizes the +relation between the numeric and character comparison functions.

Table 10-1. Character Comparison Functions

Numeric AnalogCase-SensitiveCase-Insensitive
=CHAR=CHAR-EQUAL
/=CHAR/=CHAR-NOT-EQUAL
<CHAR<CHAR-LESSP
>CHAR>CHAR-GREATERP
<=CHAR<=CHAR-NOT-GREATERP
>=CHAR>=CHAR-NOT-LESSP

Other functions that deal with characters provide functions for, among other things, testing whether a given character is alphabetic or +a digit character, testing the case of a character, obtaining a +corresponding character in a different case, and translating between +numeric values representing character codes and actual character +objects. Again, for complete details, see your favorite Common Lisp +reference.

Strings

As mentioned earlier, strings in Common Lisp are really a composite +data type, namely, a one-dimensional array of characters. +Consequently, I'll cover many of the things you can do with strings in +the next chapter when I discuss the many functions for manipulating +sequences, of which strings are just one type. But strings also have +their own literal syntax and a library of functions for performing +string-specific operations. I'll discuss these aspects of strings in +this chapter and leave the others for Chapter 11.

As you've seen, literal strings are written enclosed in double +quotes. You can include any character supported by the character set +in a literal string except double quote (") and backslash (\). +And you can include these two as well if you escape them with a +backslash. In fact, backslash always escapes the next character, +whatever it is, though this isn't necessary for any character except +for " and itself. Table 10-2 shows how various literal +strings will be read by the Lisp reader.

Table 10-2. Literal Strings

LiteralContentsComment
"foobar"foobarPlain string.
"foo\"bar"foo"barThe backslash escapes quote.
"foo\\bar"foo\barThe first backslash escapes second backslash.
"\"foobar\"""foobar"The backslashes escape quotes.
"foo\bar"foobarThe backslash "escapes" b

Note that the REPL will ordinarily print strings in readable form, +adding the enclosing quotation marks and any necessary escaping +backslashes, so if you want to see the actual contents of a string, +you need to use function such as FORMAT designed to print +human-readable output. For example, here's what you see if you type a +string containing an embedded quotation mark at the REPL:

CL-USER> "foo\"bar"
+"foo\"bar"

FORMAT, on the other hand, will show you the actual string +contents:12

CL-USER> (format t "foo\"bar")
+foo"bar
+NIL

String Comparisons

You can compare strings using a set of functions that follow the same +naming convention as the character comparison functions except with +STRING as the prefix rather than CHAR (see Table 10-3).

Table 10-3. String Comparison Functions

Numeric AnalogCase-SensitiveCase-Insensitive
=STRING=STRING-EQUAL
/=STRING/=STRING-NOT-EQUAL
<STRING<STRING-LESSP
>STRING>STRING-GREATERP
<=STRING<=STRING-NOT-GREATERP
>=STRING>=STRING-NOT-LESSP

However, unlike the character and number comparators, the string +comparators can compare only two strings. That's because they also +take keyword arguments that allow you to restrict the comparison to a +substring of either or both strings. The arguments--:start1, +:end1, :start2, and :end2--specify the starting +(inclusive) and ending (exclusive) indices of substrings in the first +and second string arguments. Thus, the following:

(string= "foobarbaz" "quuxbarfoo" :start1 3 :end1 6 :start2 4 :end2 7)

compares the substring "bar" in the two arguments and returns true. +The :end1 and :end2 arguments can be NIL (or the +keyword argument omitted altogether) to indicate that the +corresponding substring extends to the end of the string.

The comparators that return true when their arguments differ--that +is, all of them except STRING= and STRING-EQUAL--return the +index in the first string where the mismatch was detected.

(string/= "lisp" "lissome") ==> 3

If the first string is a prefix of the second, the return value will +be the length of the first string, that is, one greater than the +largest valid index into the string.

(string< "lisp" "lisper") ==> 4

When comparing substrings, the resulting value is still an index into +the string as a whole. For instance, the following compares the +substrings "bar" and "baz" but returns 5 because that's the index of +the r in the first string:

(string< "foobar" "abaz" :start1 3 :start2 1) ==> 5   ; N.B. not 2

Other string functions allow you to convert the case of strings and +trim characters from one or both ends of a string. And, as I +mentioned previously, since strings are really a kind of sequence, +all the sequence functions I'll discuss in the next chapter can be +used with strings. For instance, you can discover the length of a +string with the LENGTH function and can get and set individual +characters of a string with the generic sequence element accessor +function, ELT, or the generic array element accessor function, +AREF. Or you can use the string-specific accessor, CHAR. +But those functions, and others, are the topic of the next chapter, +so let's move on. +


1Fred Brooks, The Mythical Man-Month, +20th Anniversary Edition (Boston: Addison-Wesley, 1995), p. 103. +Emphasis in original.

2Mattel's Teen Talk Barbie

3Obviously, the size of a number that can be represented on +a computer with finite memory is still limited in practice; +furthermore, the actual representation of bignums used in a +particular Common Lisp implementation may place other limits on the +size of number that can be represented. But these limits are going to +be well beyond "astronomically" large numbers. For instance, the +number of atoms in the universe is estimated to be less than 2^269; +current Common Lisp implementations can easily handle numbers up to +and beyond 2^262144.

4Folks interested in using Common Lisp for +intensive numeric computation should note that a naive comparison of +the performance of numeric code in Common Lisp and languages such as +C or FORTRAN will probably show Common Lisp to be much slower. This +is because something as simple as (+ a b) in Common Lisp is +doing a lot more than the seemingly equivalent a + b in one of +those languages. Because of Lisp's dynamic typing and support for +things such as arbitrary precision rationals and complex numbers, a +seemingly simple addition is doing a lot more than an addition of two +numbers that are known to be represented by machine words. However, +you can use declarations to give Common Lisp information about the +types of numbers you're using that will enable it to generate code +that does only as much work as the code that would be generated by a +C or FORTRAN compiler. Tuning numeric code for this kind of +performance is beyond the scope of this book, but it's certainly +possible.

5While the +standard doesn't require it, many Common Lisp implementations support +the IEEE standard for floating-point arithmetic, IEEE Standard for +Binary Floating-Point Arithmetic, ANSI/ IEEE Std 754-1985 (Institute +of Electrical and Electronics Engineers, 1985).

6It's +also possible to change the default base the reader uses for numbers +without a specific radix marker by changing the value of the global +variable *READ-BASE*. However, it's not clear that's the path to +anything other than complete insanity.

7Since the purpose of +floating-point numbers is to make efficient use of floating-point +hardware, each Lisp implementation is allowed to map these four +subtypes onto the native floating-point types as appropriate. If the +hardware supports fewer than four distinct representations, one or +more of the types may be equivalent.

8"Computerized +scientific notation" is in scare quotes because, while commonly used +in computer languages since the days of FORTRAN, it's actually quite +different from real scientific notation. In particular, something +like 1.0e4 means 10000.0, but in true scientific +notation that would be written as 1.0 x 10^4. And to further confuse +matters, in true scientific notation the letter e stands for the +base of the natural logarithm, so something like 1.0 x e^4, while +superficially similar to 1.0e4, is a completely different +value, approximately 54.6.

9For +mathematical consistency, + and * can also be called with no +arguments, in which case they return the appropriate identity: 0 for ++ and 1 for *.

10Roughly speaking, +MOD is equivalent to the % operator in Perl and Python, +and REM is equivalent to the % in C and Java. (Technically, the +exact behavior of % in C wasn't specified until the C99 standard.)

11Even Java, which was designed from the beginning to use +Unicode characters on the theory that Unicode was the going to be +the character encoding of the future, has run into trouble since +Java characters are defined to be a 16-bit quantity and the Unicode +3.1 standard extended the range of the Unicode character set to +require a 21-bit representation. Ooops.

12Note, however, that not all literal strings can be +printed by passing them as the second argument to FORMAT since +certain sequences of characters have a special meaning to +FORMAT. To safely print an arbitrary string--say, the value of a +variable s--with FORMAT you should write (format t "~a" s).

diff --git a/clones/gigamonkeys.com/book/object-reorientation-classes.html b/clones/gigamonkeys.com/book/object-reorientation-classes.html new file mode 100644 index 00000000..ac882b80 --- /dev/null +++ b/clones/gigamonkeys.com/book/object-reorientation-classes.html @@ -0,0 +1,680 @@ +Object Reorientation: Classes

17. Object Reorientation: Classes

If generic functions are the verbs of the object system, classes are +the nouns. As I mentioned in the previous chapter, all values in a +Common Lisp program are instances of some class. Furthermore, all +classes are organized into a single hierarchy rooted at the class +T.

The class hierarchy consists of two major families of classes, +built-in and user-defined classes. Classes that represent the data +types you've been learning about up until now, classes such as +INTEGER, STRING, and LIST, are all built-in. They live +in their own section of the class hierarchy, arranged into appropriate +sub- and superclass relationships, and are manipulated by the +functions I've been discussing for much of the book up until now. You +can't subclass these classes, but, as you saw in the previous chapter, +you can define methods that specialize on them, effectively extending +the behavior of those classes.1

But when you want to create new nouns--for instance, the classes used +in the previous chapter for representing bank accounts--you need to +define your own classes. That's the subject of this chapter.

DEFCLASS

You create user-defined classes with the DEFCLASS macro. Because +behaviors are associated with a class by defining generic functions +and methods specialized on the class, DEFCLASS is responsible +only for defining the class as a data type.

The three facets of the class as a data type are its name, its +relation to other classes, and the names of the slots that make up +instances of the class.2 The basic form of a DEFCLASS is quite simple.

(defclass name (direct-superclass-name*)
+  (slot-specifier*))
What Are "User-Defined Classes"?

As with functions and variables, you can use any symbol as the name +of a new class.3 Class names are in a separate +namespace from both functions and variables, so you can have a class, +function, and variable all with the same name. You'll use the class +name as the argument to MAKE-INSTANCE, the function that creates +new instances of user-defined classes.

The direct-superclass-names specify the classes of which the new +class is a subclass. If no superclasses are listed, the new class +will directly subclass STANDARD-OBJECT. Any classes listed must +be other user-defined classes, which ensures that each new class is +ultimately descended from STANDARD-OBJECT. STANDARD-OBJECT +in turn subclasses T, so all user-defined classes are part of +the single class hierarchy that also contains all the built-in +classes.

Eliding the slot specifiers for a moment, the DEFCLASS forms of +some of the classes you used in the previous chapter might look like +this:

(defclass bank-account () ...)
+
+(defclass checking-account (bank-account) ...)
+
+(defclass savings-account (bank-account) ...)

I'll discuss in the section "Multiple Inheritance" what it means to +list more than one direct superclass in direct-superclass-names.

Slot Specifiers

The bulk of a DEFCLASS form consists of the list of slot +specifiers. Each slot specifier defines a slot that will be part of +each instance of the class. Each slot in an instance is a place that +can hold a value, which can be accessed using the SLOT-VALUE +function. SLOT-VALUE takes an object and the name of a slot as +arguments and returns the value of the named slot in the given +object. It can be used with SETF to set the value of a slot in +an object.

A class also inherits slot specifiers from its superclasses, so the +set of slots actually present in any object is the union of all the +slots specified in a class's DEFCLASS form and those specified +in all its superclasses.

At the minimum, a slot specifier names the slot, in which case the +slot specifier can be just a name. For instance, you could define a +bank-account class with two slots, customer-name and +balance, like this:

(defclass bank-account ()
+  (customer-name
+   balance))

Each instance of this class will contain two slots, one to hold the +name of the customer the account belongs to and another to hold the +current balance. With this definition, you can create new +bank-account objects using MAKE-INSTANCE.

(make-instance 'bank-account) ==> #<BANK-ACCOUNT @ #x724b93ba>

The argument to MAKE-INSTANCE is the name of the class to +instantiate, and the value returned is the new object.4 The printed representation of an object is +determined by the generic function PRINT-OBJECT. In this case, +the applicable method will be one provided by the implementation, +specialized on STANDARD-OBJECT. Since not every object can be +printed so that it can be read back, the STANDARD-OBJECT print +method uses the #<> syntax, which will cause the reader to +signal an error if it tries to read it. The rest of the +representation is implementation-defined but will typically be +something like the output just shown, including the name of the class +and some distinguishing value such as the address of the object in +memory. In Chapter 23 you'll see an example of how to define a method +on PRINT-OBJECT to make objects of a certain class be printed in +a more informative form.

Using the definition of bank-account just given, new objects +will be created with their slots unbound. Any attempt to get the +value of an unbound slot signals an error, so you must set a slot +before you can read it.

(defparameter *account* (make-instance 'bank-account))  ==> *ACCOUNT*
+(setf (slot-value *account* 'customer-name) "John Doe") ==> "John Doe"
+(setf (slot-value *account* 'balance) 1000)             ==> 1000

Now you can access the value of the slots.

(slot-value *account* 'customer-name) ==> "John Doe"
+(slot-value *account* 'balance)       ==> 1000

Object Initialization

Since you can't do much with an object with unbound slots, it'd be +nice to be able to create objects with their slots already +initialized. Common Lisp provides three ways to control the initial +value of slots. The first two involve adding options to the slot +specifier in the DEFCLASS form: with the :initarg option, +you can specify a name that can then be used as a keyword parameter +to MAKE-INSTANCE and whose argument will be stored in the slot. +A second option, :initform, lets you specify a Lisp expression +that will be used to compute a value for the slot if no +:initarg argument is passed to MAKE-INSTANCE. Finally, +for complete control over the initialization, you can define a method +on the generic function INITIALIZE-INSTANCE, which is called by +MAKE-INSTANCE.5

A slot specifier that includes options such as :initarg or +:initform is written as a list starting with the name of the +slot followed by the options. For example, if you want to modify the +definition of bank-account to allow callers of +MAKE-INSTANCE to pass the customer name and the initial balance +and to provide a default value of zero dollars for the balance, you'd +write this:

(defclass bank-account ()
+  ((customer-name
+    :initarg :customer-name)
+   (balance
+    :initarg :balance
+    :initform 0)))

Now you can create an account and specify the slot values at the same +time.

(defparameter *account*
+  (make-instance 'bank-account :customer-name "John Doe" :balance 1000))
+
+(slot-value *account* 'customer-name) ==> "John Doe"
+(slot-value *account* 'balance)       ==> 1000

If you don't supply a :balance argument to MAKE-INSTANCE, +the SLOT-VALUE of balance will be computed by evaluating +the form specified with the :initform option. But if you don't +supply a :customer-name argument, the customer-name +slot will be unbound, and an attempt to read it before you set it +will signal an error.

(slot-value (make-instance 'bank-account) 'balance)       ==> 0
+(slot-value (make-instance 'bank-account) 'customer-name) ==> error

If you want to ensure that the customer name is supplied when the +account is created, you can signal an error in the initform since it +will be evaluated only if an initarg isn't supplied. You can also use +initforms that generate a different value each time they're +evaluated--the initform is evaluated anew for each object. To +experiment with these techniques, you can modify the +customer-name slot specifier and add a new slot, +account-number, that's initialized with the value of an +ever-increasing counter.

(defvar *account-numbers* 0)
+
+(defclass bank-account ()
+  ((customer-name
+    :initarg :customer-name
+    :initform (error "Must supply a customer name."))
+   (balance
+    :initarg :balance
+    :initform 0)
+   (account-number
+    :initform (incf *account-numbers*))))

Most of the time the combination of :initarg and +:initform options will be sufficient to properly initialize an +object. However, while an initform can be any Lisp expression, it has +no access to the object being initialized, so it can't initialize one +slot based on the value of another. For that you need to define a +method on the generic function INITIALIZE-INSTANCE.

The primary method on INITIALIZE-INSTANCE specialized on +STANDARD-OBJECT takes care of initializing slots based on their +:initarg and :initform options. Since you don't want to +disturb that, the most common way to add custom initialization code +is to define an :after method specialized on your +class.6 +For instance, suppose you want to add a slot account-type that +needs to be set to one of the values :gold, :silver, or +:bronze based on the account's initial balance. You might +change your class definition to this, adding the account-type +slot with no options:

(defclass bank-account ()
+  ((customer-name
+    :initarg :customer-name
+    :initform (error "Must supply a customer name."))
+   (balance
+    :initarg :balance
+    :initform 0)
+   (account-number
+    :initform (incf *account-numbers*))
+   account-type))

Then you can define an :after method on +INITIALIZE-INSTANCE that sets the account-type slot based +on the value that has been stored in the balance +slot.7

(defmethod initialize-instance :after ((account bank-account) &key)
+  (let ((balance (slot-value account 'balance)))
+    (setf (slot-value account 'account-type)
+          (cond
+            ((>= balance 100000) :gold)
+            ((>= balance 50000) :silver)
+            (t :bronze)))))

The &key in the parameter list is required to keep the method's +parameter list congruent with the generic function's--the parameter +list specified for the INITIALIZE-INSTANCE generic function +includes &key in order to allow individual methods to supply +their own keyword parameters but doesn't require any particular ones. +Thus, every method must specify &key even if it doesn't specify +any &key parameters.

On the other hand, if an INITIALIZE-INSTANCE method specialized +on a particular class does specify a &key parameter, that +parameter becomes a legal parameter to MAKE-INSTANCE when +creating an instance of that class. For instance, if the bank +sometimes pays a percentage of the initial balance as a bonus when an +account is opened, you could implement that using a method on +INITIALIZE-INSTANCE that takes a keyword argument to specify the +percentage of the bonus like this:

(defmethod initialize-instance :after ((account bank-account)
+                                       &key opening-bonus-percentage)
+  (when opening-bonus-percentage
+    (incf (slot-value account 'balance)
+          (* (slot-value account 'balance) (/ opening-bonus-percentage 100)))))

By defining this INITIALIZE-INSTANCE method, you make +:opening-bonus-percentage a legal argument to +MAKE-INSTANCE when creating a bank-account object.

CL-USER> (defparameter *acct* (make-instance
+                                'bank-account
+                                 :customer-name "Sally Sue"
+                                 :balance 1000
+                                 :opening-bonus-percentage 5))
+*ACCT*
+CL-USER> (slot-value *acct* 'balance)
+1050

Accessor Functions

Between MAKE-INSTANCE and SLOT-VALUE, you have all the +tools you need for creating and manipulating instances of your +classes. Everything else you might want to do can be implemented in +terms of those two functions. However, as anyone familiar with the +principles of good object-oriented programming practices knows, +directly accessing the slots (or fields or member variables) of an +object can lead to fragile code. The problem is that directly +accessing slots ties your code too tightly to the concrete structure +of your class. For example, suppose you decide to change the +definition of bank-account so that, instead of storing the +current balance as a number, you store a list of time-stamped +withdrawals and deposits. Code that directly accesses the +balance slot will likely break if you change the class +definition to remove the slot or to store the new list in the old +slot. On the other hand, if you define a function, balance, +that accesses the slot, you can redefine it later to preserve its +behavior even if the internal representation changes. And code that +uses such a function will continue to work without modification.

Another advantage to using accessor functions rather than direct +access to slots via SLOT-VALUE is that they let you limit the +ways outside code can modify a slot.8 It may be fine for users of +the bank-account class to get the current balance, but you may +want all modifications to the balance to go through other functions +you'll provide, such as deposit and withdraw. If +clients know they're supposed to manipulate objects only through the +published functional API, you can provide a balance function +but not make it SETFable if you want the balance to be +read-only.

Finally, using accessor functions makes your code tidier since it +helps you avoid lots of uses of the rather verbose SLOT-VALUE +function.

It's trivial to define a function that reads the value of the +balance slot.

(defun balance (account)
+  (slot-value account 'balance))

However, if you know you're going to define subclasses of +bank-account, it might be a good idea to define balance +as a generic function. That way, you can provide different methods on +balance for those subclasses or extend its definition with +auxiliary methods. So you might write this instead:

(defgeneric balance (account))
+
+(defmethod balance ((account bank-account))
+  (slot-value account 'balance))

As I just discussed, you don't want callers to be able to directly +set the balance, but for other slots, such as customer-name, +you may also want to provide a function to set them. The cleanest way +to define such a function is as a SETF function.

A SETF function is a way to extend SETF, defining a new +kind of place that it knows how to set. The name of a SETF +function is a two-item list whose first element is the symbol +setf and whose second element is a symbol, typically the name +of a function used to access the place the SETF function will +set. A SETF function can take any number of arguments, but the +first argument is always the value to be assigned to the +place.9 You could, for +instance, define a SETF function to set the customer-name +slot in a bank-account like this:

(defun (setf customer-name) (name account)
+  (setf (slot-value account 'customer-name) name))

After evaluating that definition, an expression like the following +one:

(setf (customer-name my-account) "Sally Sue")

will be compiled as a call to the SETF function you just defined +with "Sally Sue" as the first argument and the value of +my-account as the second argument.

Of course, as with reader functions, you'll probably want your +SETF function to be generic, so you'd actually define it like +this:

(defgeneric (setf customer-name) (value account))
+
+(defmethod (setf customer-name) (value (account bank-account))
+  (setf (slot-value account 'customer-name) value))

And of course you'll also want to define a reader function for +customer-name.

(defgeneric customer-name (account))
+
+(defmethod customer-name ((account bank-account))
+  (slot-value account 'customer-name))

This allows you to write the following:

(setf (customer-name *account*) "Sally Sue") ==> "Sally Sue"
+
+(customer-name *account*)                    ==> "Sally Sue"

There's nothing hard about writing these accessor functions, but it +wouldn't be in keeping with The Lisp Way to have to write them all by +hand. Thus, DEFCLASS supports three slot options that allow you +to automatically create reader and writer functions for a specific +slot.

The :reader option specifies a name to be used as the name of +a generic function that accepts an object as its single argument. +When the DEFCLASS is evaluated, the generic function is created, +if it doesn't already exist. Then a method specializing its single +argument on the new class and returning the value of the slot is +added to the generic function. The name can be anything, but it's +typical to name it the same as the slot itself. Thus, instead of +explicitly writing the balance generic function and method as +shown previously, you could change the slot specifier for the +balance slot in the definition of bank-account to this:

(balance
+ :initarg :balance
+ :initform 0
+ :reader balance)

The :writer option is used to create a generic function and +method for setting the value of a slot. The function and method +created follow the requirements for a SETF function, taking the +new value as the first argument and returning it as the result, so +you can define a SETF function by providing a name such as +(setf customer-name). For instance, you could provide reader +and writer methods for customer-name equivalent to the ones +you just wrote by changing the slot specifier to this:

(customer-name
+ :initarg :customer-name
+ :initform (error "Must supply a customer name.")
+ :reader customer-name
+ :writer (setf customer-name))

Since it's quite common to want both reader and writer functions, +DEFCLASS also provides an option, :accessor, that creates +both a reader function and the corresponding SETF function. So +instead of the slot specifier just shown, you'd typically write this:

(customer-name
+ :initarg :customer-name
+ :initform (error "Must supply a customer name.")
+ :accessor customer-name)

Finally, one last slot option you should know about is the +:documentation option, which you can use to provide a string +that documents the purpose of the slot. Putting it all together and +adding a reader method for the account-number and +account-type slots, the DEFCLASS form for the +bank-account class would look like this:

(defclass bank-account ()
+  ((customer-name
+    :initarg :customer-name
+    :initform (error "Must supply a customer name.")
+    :accessor customer-name
+    :documentation "Customer's name")
+   (balance
+    :initarg :balance
+    :initform 0
+    :reader balance
+    :documentation "Current account balance")
+   (account-number
+    :initform (incf *account-numbers*)
+    :reader account-number
+    :documentation "Account number, unique within a bank.")
+   (account-type
+    :reader account-type
+    :documentation "Type of account, one of :gold, :silver, or :bronze.")))

WITH-SLOTS and WITH-ACCESSORS

While using accessor functions will make your code easier to +maintain, they can still be a bit verbose. And there will be times, +when writing methods that implement the low-level behaviors of a +class, that you may specifically want to access slots directly to set +a slot that has no writer function or to get at the slot value +without causing any auxiliary methods defined on the reader function +to run.

This is what SLOT-VALUE is for; however, it's still quite +verbose. To make matters worse, a function or method that accesses +the same slot several times can become clogged with calls to accessor +functions and SLOT-VALUE. For example, even a fairly simple +method such as the following, which assesses a penalty on a +bank-account if its balance falls below a certain minimum, is +cluttered with calls to balance and SLOT-VALUE:

(defmethod assess-low-balance-penalty ((account bank-account))
+  (when (< (balance account) *minimum-balance*)
+    (decf (slot-value account 'balance) (* (balance account) .01))))

And if you decide you want to directly access the slot value in order +to avoid running auxiliary methods, it gets even more cluttered.

(defmethod assess-low-balance-penalty ((account bank-account))
+  (when (< (slot-value account 'balance) *minimum-balance*)
+    (decf (slot-value account 'balance) (* (slot-value account 'balance) .01))))

Two standard macros, WITH-SLOTS and WITH-ACCESSORS, can +help tidy up this clutter. Both macros create a block of code in +which simple variable names can be used to refer to slots on a +particular object. WITH-SLOTS provides direct access to the +slots, as if by SLOT-VALUE, while WITH-ACCESSORS provides a +shorthand for accessor methods.

The basic form of WITH-SLOTS is as follows:

(with-slots (slot*) instance-form
+  body-form*)

Each element of slots can be either the name of a slot, which is +also used as a variable name, or a two-item list where the first item +is a name to use as a variable and the second is the name of the +slot. The instance-form is evaluated once to produce the object +whose slots will be accessed. Within the body, each occurrence of one +of the variable names is translated to a call to SLOT-VALUE with +the object and the appropriate slot name as arguments.10 Thus, you can write +assess-low-balance-penalty like this:

(defmethod assess-low-balance-penalty ((account bank-account))
+  (with-slots (balance) account
+    (when (< balance *minimum-balance*)
+      (decf balance (* balance .01)))))

or, using the two-item list form, like this:

(defmethod assess-low-balance-penalty ((account bank-account))
+  (with-slots ((bal balance)) account
+    (when (< bal *minimum-balance*)
+      (decf bal (* bal .01)))))

If you had defined balance with an :accessor rather +than just a :reader, then you could also use +WITH-ACCESSORS. The form of WITH-ACCESSORS is the same as +WITH-SLOTS except each element of the slot list is a two-item +list containing a variable name and the name of an accessor function. +Within the body of WITH-ACCESSORS, a reference to one of the +variables is equivalent to a call to the corresponding accessor +function. If the accessor function is SETFable, then so is the +variable.

(defmethod assess-low-balance-penalty ((account bank-account))
+  (with-accessors ((balance balance)) account
+    (when (< balance *minimum-balance*)
+      (decf balance (* balance .01)))))

The first balance is the name of the variable, and the second +is the name of the accessor function; they don't have to be the same. +You could, for instance, write a method to merge two accounts using +two calls to WITH-ACCESSORS, one for each account.

(defmethod merge-accounts ((account1 bank-account) (account2 bank-account))
+  (with-accessors ((balance1 balance)) account1
+    (with-accessors ((balance2 balance)) account2
+      (incf balance1 balance2)
+      (setf balance2 0))))

The choice of whether to use WITH-SLOTS versus +WITH-ACCESSORS is the same as the choice between SLOT-VALUE +and an accessor function: low-level code that provides the basic +functionality of a class may use SLOT-VALUE or WITH-SLOTS +to directly manipulate slots in ways not supported by accessor +functions or to explicitly avoid the effects of auxiliary methods +that may have been defined on the accessor functions. But you should +generally use accessor functions or WITH-ACCESSORS unless you +have a specific reason not to.

Class-Allocated Slots

The last slot option you need to know about is :allocation. +The value of :allocation can be either :instance or +:class and defaults to :instance if not specified. When +a slot has :class allocation, the slot has only a single +value, which is stored in the class and shared by all instances.

However, :class slots are accessed the same as +:instance slots--they're accessed with SLOT-VALUE or an +accessor function, which means you can access the slot value only +through an instance of the class even though it isn't actually stored +in the instance. The :initform and :initarg options +have essentially the same effect except the initform is evaluated +once when the class is defined rather than each time an instance is +created. On the other hand, passing an initarg to MAKE-INSTANCE +will set the value, affecting all instances of the class.

Because you can't get at a class-allocated slot without an instance +of the class, class-allocated slots aren't really equivalent to +static or class fields in languages such as Java, C++, and +Python.11 Rather, +class-allocated slots are used primarily to save space; if you're +going to create many instances of a class and all instances are going +to have a reference to the same object--say, a pool of shared +resources--you can save the cost of each instance having its own +reference by making the slot class-allocated.

Slots and Inheritance

As I discussed in the previous chapter, classes inherit behavior from +their superclasses thanks to the generic function machinery--a method +specialized on class A is applicable not only to direct +instances of A but also to instances of A's subclasses. +Classes also inherit slots from their superclasses, but the mechanism +is slightly different.

In Common Lisp a given object can have only one slot with a +particular name. However, it's possible that more than one class in +the inheritance hierarchy of a given class will specify a slot with a +particular name. This can happen either because a subclass includes a +slot specifier with the same name as a slot specified in a superclass +or because multiple superclasses specify slots with the same name.

Common Lisp resolves these situations by merging all the specifiers +with the same name from the new class and all its superclasses to +create a single specifier for each unique slot name. When merging +specifiers, different slot options are treated differently. For +instance, since a slot can have only a single default value, if +multiple classes specify an :initform, the new class uses the +one from the most specific class. This allows a subclass to specify a +different default value than the one it would otherwise inherit.

On the other hand, :initargs needn't be exclusive--each +:initarg option in a slot specifier creates a keyword +parameter that can be used to initialize the slot; multiple +parameters don't create a conflict, so the new slot specifier +contains all the :initargs. Callers of MAKE-INSTANCE can +use any of the :initargs to initialize the slot. If a caller +passes multiple keyword arguments that initialize the same slot, then +the leftmost argument in the call to MAKE-INSTANCE is used.

Inherited :reader, :writer, and :accessor +options aren't included in the merged slot specifier since the +methods created by the superclass's DEFCLASS will already apply +to the new class. The new class can, however, create its own accessor +functions by supplying its own :reader, :writer, or +:accessor options.

Finally, the :allocation option is, like :initform, +determined by the most specific class that specifies the slot. Thus, +it's possible for all instances of one class to share a :class +slot while instances of a subclass may each have their own +:instance slot of the same name. And a sub-subclass may then +redefine it back to :class slot, so all instances of that +class will again share a single slot. In the latter case, the slot +shared by instances of the sub-subclass is different than the slot +shared by the original superclass.

For instance, suppose you have these classes:

(defclass foo ()
+  ((a :initarg :a :initform "A" :accessor a)
+   (b :initarg :b :initform "B" :accessor b)))
+
+(defclass bar (foo)
+  ((a :initform (error "Must supply a value for a"))
+   (b :initarg :the-b :accessor the-b :allocation :class)))

When instantiating the class bar, you can use the inherited +initarg, :a, to specify a value for the slot a and, in +fact, must do so to avoid an error, since the :initform +supplied by bar supersedes the one inherited from foo. +To initialize the b slot, you can use either the inherited +initarg :b or the new initarg :the-b. However, because +of the :allocation option on the b slot in bar, +the value specified will be stored in the slot shared by all +instances of bar. That same slot can be accessed either with +the method on the generic function b that specializes on +foo or with the new method on the generic function +the-b that specializes directly on bar. To access the +a slot on either a foo or a bar, you'll continue +to use the generic function a.

Usually merging slot definitions works quite nicely. However, it's +important to be aware when using multiple inheritance that two +unrelated slots that happen to have the same name can be merged into +a single slot in the new class. Thus, methods specialized on +different classes could end up manipulating the same slot when +applied to a class that extends those classes. This isn't much of a +problem in practice since, as you'll see in Chapter 21, you can use +the package system to avoid collisions between names in independently +developed pieces of code.

Multiple Inheritance

All the classes you've seen so far have had only a single direct +superclass. Common Lisp also supports multiple inheritance--a class +can have multiple direct superclasses, inheriting applicable methods +and slot specifiers from all of them.

Multiple inheritance doesn't dramatically change any of the +mechanisms of inheritance I've discussed so far--every user-defined +class already has multiple superclasses since they all extend +STANDARD-OBJECT, which extends T, and so have at least two +superclasses. The wrinkle that multiple inheritance adds is that a +class can have more than one direct superclass. This complicates +the notion of class specificity that's used both when building the +effective methods for a generic function and when merging inherited +slot specifiers.

That is, if classes could have only a single direct superclass, +ordering classes by specificity would be trivial--a class and all its +superclasses could be ordered in a straight line starting from the +class itself, followed by its single direct superclass, followed by +its direct superclass, all the way up to T. But when a class +has multiple direct superclasses, those superclasses are typically +not related to each other--indeed, if one was a subclass of another, +you wouldn't need to subclass both directly. In that case, the rule +that subclasses are more specific than their superclasses isn't +enough to order all the superclasses. So Common Lisp uses a second +rule that sorts unrelated superclasses according to the order they're +listed in the DEFCLASS's direct superclass list--classes earlier +in the list are considered more specific than classes later in the +list. This rule is admittedly somewhat arbitrary but does allow every +class to have a linear class precedence list, which can be used +to determine which superclasses should be considered more specific +than others. Note, however, there's no global ordering of +classes--each class has its own class precedence list, and the same +classes can appear in different orders in different classes' class +precedence lists.

To see how this works, let's add a class to the banking app: +money-market-account. A money market account combines the +characteristics of a checking account and a savings account: a +customer can write checks against it, but it also earns interest. You +might define it like this:

(defclass money-market-account (checking-account savings-account) ())

The class precedence list for money-market-account will be as +follows:

(money-market-account
+ checking-account
+ savings-account
+ bank-account
+ standard-object
+ t)

Note how this list satisfies both rules: every class appears before +all its superclasses, and checking-account and +savings-account appear in the order specified in +DEFCLASS.

This class defines no slots of its own but will inherit slots from +both of its direct superclasses, including the slots they inherit +from their superclasses. Likewise, any method that's applicable to +any class in the class precedence list will be applicable to a +money-market-account object. Because all slot specifiers for +the same slot are merged, it doesn't matter that +money-market-account inherits the same slot specifiers from +bank-account twice. 12

Multiple inheritance is easiest to understand when the different +superclasses provide completely independent slots and behaviors. For +instance, money-market-account will inherit slots and +behaviors for dealing with checks from checking-account and +slots and behaviors for computing interest from +savings-account. You don't have to worry about the class +precedence list for methods and slots inherited from only one +superclass or another.

However, it's also possible to inherit different methods for the same +generic function from different superclasses. In that case, the class +precedence list does come into play. For instance, suppose the +banking application defined a generic function print-statement +used to generate monthly statements. Presumably there would already +be methods for print-statement specialized on both +checking-account and savings-account. Both of these +methods will be applicable to instances of +money-market-account, but the one specialized on +checking-account will be considered more specific than the one +on savings-account because checking-account precedes +savings-account in money-market-account's class +precedence list.

Assuming the inherited methods are all primary methods and you +haven't defined any other methods, the method specialized on +checking-account will be used if you invoke +print-statement on money-market-account. However, that +won't necessarily give you the behavior you want since you probably +want a money market account's statement to contain elements of both a +checking account and a savings account statement.

You can modify the behavior of print-statement for +money-market-accounts in a couple ways. One straightforward +way is to define a new primary method specialized on +money-market-account. This gives you the most control over the +new behavior but will probably require more new code than some other +options I'll discuss in a moment. The problem is that while you can +use CALL-NEXT-METHOD to call "up" to the next most specific +method, namely, the one specialized on checking-account, +there's no way to invoke a particular less-specific method, such as +the one specialized on savings-account. Thus, if you want to +be able to reuse the code that prints the savings-account part +of the statement, you'll need to break that code into a separate +function, which you can then call directly from both the +money-market-account and savings-account +print-statement methods.

Another possibility is to write the primary methods of all three +classes to call CALL-NEXT-METHOD. Then the method specialized on +money-market-account will use CALL-NEXT-METHOD to invoke +the method specialized on checking-account. When that method +calls CALL-NEXT-METHOD, it will result in running the +savings-account method since it will be the next most specific +method according to money-market-account's class precedence +list.

Of course, if you're going to rely on a coding convention--that every +method calls CALL-NEXT-METHOD--to ensure all the applicable +methods run at some point, you should think about using auxiliary +methods instead. In this case, instead of defining primary methods on +print-statement for checking-account and +savings-account, you can define those methods as :after +methods, defining a single primary method on bank-account. +Then, print-statement, called on a +money-market-account, will print a basic account statement, +output by the primary method specialized on bank-account, +followed by details output by the :after methods specialized +on savings-account and checking-account. And if you +want to add details specific to money-market-accounts, you can +define an :after method specialized on +money-market-account, which will run last of all.

The advantage of using auxiliary methods is that it makes it quite +clear which methods are primarily responsible for implementing the +generic function and which ones are only contributing additional bits +of functionality. The disadvantage is that you don't get fine-grained +control over the order in which the auxiliary methods run--if you +wanted the checking-account part of the statement to print +before the savings-account part, you'd have to change the order +in which the money-market-account subclasses those classes. But +that's a fairly dramatic change that could affect other methods and +inherited slots. In general, if you find yourself twiddling the order +of the direct superclass list as a way of fine-tuning the behavior of +specific methods, you probably need to step back and rethink your +approach.

On the other hand, if you don't care exactly what the order is but +want it to be consistent across several generic functions, then using +auxiliary methods may be just the thing. For example, if in addition +to print-statement you have a print-detailed-statement +generic function, you can implement both functions using :after +methods on the various subclasses of bank-account, and the +order of the parts of both a regular and a detailed statement will be +the same.

Good Object-Oriented Design

That's about it for the main features of Common Lisp's object system. +If you have lots of experience with object-oriented programming, you +can probably see how Common Lisp's features can be used to implement +good object-oriented designs. However, if you have less experience +with object orientation, you may need to spend some time absorbing +the object-oriented way of thinking. Unfortunately, that's a fairly +large topic and beyond the scope of this book. Or, as the man page +for Perl's object system puts it, "Now you need just to go off and +buy a book about object-oriented design methodology and bang your +forehead with it for the next six months or so." Or you can wait for +some of the practical chapters, later in this book, where you'll see +several examples of how these features are used in practice. For now, +however, you're ready to take a break from all this theory of object +orientation and turn to the rather different topic of how to make +good use of Common Lisp's powerful, but sometimes cryptic, +FORMAT function. +


1Defining new methods for an +existing class may seem strange to folks used to statically typed +languages such as C++ and Java in which all the methods of a class +must be defined as part of the class definition. But programmers with +experience in dynamically typed object-oriented languages such as +Smalltalk and Objective C will find nothing strange about adding new +behaviors to existing classes.

2In other object-oriented languages, +slots might be called fields, member variables, or +attributes.

3As when naming functions and variables, it's not +quite true that you can use any symbol as a class name--you can't +use names defined by the language standard. You'll see in Chapter 21 +how to avoid such name conflicts.

4The +argument to MAKE-INSTANCE can actually be either the name of the +class or a class object returned by the function CLASS-OF or +FIND-CLASS.

5Another way to affect the values of slots is +with the :default-initargs option to DEFCLASS. This +option is used to specify forms that will be evaluated to provide +arguments for specific initialization parameters that aren't given a +value in a particular call to MAKE-INSTANCE. You don't need to +worry about :default-initargs for now.

6Adding an :after method to +INITIALIZE-INSTANCE is the Common Lisp analog to defining a +constructor in Java or C++ or an __init__ method in Python.

7One mistake you might make until you get used to using +auxiliary methods is to define a method on INITIALIZE-INSTANCE +but without the :after qualifier. If you do that, you'll get a +new primary method that shadows the default one. You can remove the +unwanted primary method using the functions REMOVE-METHOD and +FIND-METHOD. Certain development environments may provide a +graphical user interface to do the same thing.

(remove-method #'initialize-instance
+  (find-method #'initialize-instance () (list (find-class 'bank-account))))

8Of course, providing an +accessor function doesn't really limit anything since other code can +still use SLOT-VALUE to get at slots directly. Common Lisp +doesn't provide strict encapsulation of slots the way some languages +such as C++ and Java do; however, if the author of a class provides +accessor functions and you ignore them, using SLOT-VALUE +instead, you had better know what you're doing. It's also possible to +use the package system, which I'll discuss in Chapter 21, to make it +even more obvious that certain slots aren't to be accessed directly, +by not exporting the names of the slots.

9One consequence of defining a SETF function--say, +(setf foo)--is that if you also define the corresponding +accessor function, foo in this case, you can use all the +modify macros built upon SETF, such as INCF, DECF, +PUSH, and POP, on the new kind of place.

10The +"variable" names provided by WITH-SLOTS and WITH-ACCESSORS +aren't true variables; they're implemented using a special kind of +macro, called a symbol macro, that allows a simple name to expand +into arbitrary code. Symbol macros were introduced into the language +to support WITH-SLOTS and WITH-ACCESSORS, but you can also +use them for your own purposes. I'll discuss them in a bit more +detail in Chapter 20.

11The Meta Object Protocol (MOP), which isn't part of the +language standard but is supported by most Common Lisp +implementations, provides a function, class-prototype, that +returns an instance of a class that can be used to access class +slots. If you're using an implementation that supports the MOP and +happen to be translating some code from another language that makes +heavy use of static or class fields, this may give you a way to ease +the translation. But it's not all that idiomatic.

12In other words, Common Lisp doesn't +suffer from the diamond inheritance problem the way, say, C++ +does. In C++, when one class subclasses two classes that both inherit +a member variable from a common superclass, the bottom class inherits +the member variable twice, leading to no end of confusion.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/object-reorientation-generic-functions.html b/clones/gigamonkeys.com/book/object-reorientation-generic-functions.html new file mode 100644 index 00000000..d5af3898 --- /dev/null +++ b/clones/gigamonkeys.com/book/object-reorientation-generic-functions.html @@ -0,0 +1,588 @@ +Object Reorientation: Generic Functions

16. Object Reorientation: Generic Functions

Because the invention of Lisp predated the rise of object-oriented +programming by a couple decades,1 new Lispers are sometimes surprised to +discover what a thoroughly object-oriented language Common Lisp is. +Common Lisp's immediate predecessors were developed at a time when +object orientation was an exciting new idea and there were many +experiments with ways to incorporate the ideas of object orientation, +especially as manifested in Smalltalk, into Lisp. As part of the +Common Lisp standardization, a synthesis of several of these +experiments emerged under the name Common Lisp Object System, or CLOS. +The ANSI standard incorporated CLOS into the language, so it no longer +really makes sense to speak of CLOS as a separate entity.

The features CLOS contributed to Common Lisp range from those that +can hardly be avoided to relatively esoteric manifestations of Lisp's +language-as-language-building-tool philosophy. Complete coverage of +all these features is beyond the scope of this book, but in this +chapter and the next I'll describe the bread-and-butter features and +give an overview of Common Lisp's approach to objects.

You should note at the outset that Common Lisp's object system offers +a fairly different embodiment of the principles of object orientation +than many other languages. If you have a deep understanding of the +fundamental ideas behind object orientation, you'll likely appreciate +the particularly powerful and general way Common Lisp manifests those +ideas. On the other hand, if your experience with object orientation +has been largely with a single language, you may find Common Lisp's +approach somewhat foreign; you should try to avoid assuming that +there's only one way for a language to support object +orientation.2 If you have little object-oriented +programming experience, you should have no trouble understanding the +explanations here, though it may help to ignore the occasional +comparisons to the way other languages do things.

Generic Functions and Classes

The fundamental idea of object orientation is that a powerful way to +organize a program is to define data types and then associate +operations with those data types. In particular, you want to be able +to invoke an operation and have the exact behavior determined by the +type of the object or objects on which the operation was invoked. The +classic example used, seemingly by all introductions to object +orientation, is an operation draw that can be applied to +objects representing various geometric shapes. Different +implementations of the draw operation can be provided for +drawing circles, triangles, and squares, and a call to draw +will actually result in drawing a circle, triangle, or square, +depending on the type of the object to which the draw +operation is applied. The different implementations of draw +are defined separately, and new versions can be defined that draw +other shapes without having to change the code of either the caller +or any of the other draw implementations. This feature of +object orientation goes by the fancy Greek name polymorphism, +meaning "many forms," because a single conceptual operation, such as +drawing an object, can take many different concrete forms.

Common Lisp, like most object-oriented languages today, is +class-based; all objects are instances of a particular +class.3 The class of an object determines its +representation--built-in classes such as NUMBER and STRING +have opaque representations accessible only via the standard +functions for manipulating those types, while instances of +user-defined classes, as you'll see in the next chapter, consist of +named parts called slots.

Classes are arranged in a hierarchy, a taxonomy for all objects. A +class can be defined as a subclass of other classes, called its +superclasses. A class inherits part of its definition from its +superclasses and instances of a class are also considered instances of +the superclasses. In Common Lisp, the hierarchy of classes has a +single root, the class T, which is a direct or indirect +superclass of every other class. Thus, every datum in Common Lisp is +an instance of T.4 +Common Lisp also supports multiple inheritance--a single class can +have multiple direct superclasses.

Outside the Lisp family, almost all object-oriented languages follow +the basic pattern established by Simula of having behavior associated +with classes through methods or member functions that belong +to a particular class. In these languages, a method is invoked on a +particular object, and the class of that object determines what code +runs. This model of method invocation is called--after the Smalltalk +terminology--message passing. Conceptually, method invocation in +a message-passing system starts by sending a message containing +the name of the method to run and any arguments to the object on +which the method is being invoked. The object then uses its class to +look up the method associated with the name in the message and runs +it. Because each class can have its own method for a given name, the +same message, sent to different objects, can invoke different +methods.

Early Lisp object systems worked in a similar way, providing a +special function SEND that could be used to send a message to +a particular object. However, this wasn't entirely satisfactory, as +it made method invocations different from normal function calls. +Syntactically method invocations were written like this:

(send object 'foo)

rather than like this:

(foo object)

More significantly, because methods weren't functions, they couldn't +be passed as arguments to higher-order functions such as MAPCAR; +if one wanted to call a method on all the elements of a list with +MAPCAR, one had to write this:

(mapcar #'(lambda (object) (send object 'foo)) objects)

rather than this:

(mapcar #'foo objects)

Eventually the folks working on Lisp object systems unified methods +with functions by creating a new kind of function called a generic +function. In addition to solving the problems just described, +generic functions opened up new possibilities for the object system, +including many features that simply don't make sense in a +message-passing object system.

Generic functions are the heart of Common Lisp's object system and +the topic of the rest of this chapter. While I can't talk about +generic functions without some mention of classes, for now I'll focus +on how to define and use generic functions. In the next chapter I'll +show you how to define your own classes.

Generic Functions and Methods

A generic function defines an abstract operation, specifying its name +and a parameter list but no implementation. Here, for example, is how +you might define a generic function, draw, that will be used +to draw different kinds of shapes on the screen:

(defgeneric draw (shape)
+  (:documentation "Draw the given shape on the screen."))

I'll discuss the syntax of DEFGENERIC in the next section; for +now just note that this definition doesn't contain any actual code.

A generic function is generic in the sense that it can--at least in +theory--accept any objects as arguments.5 However, by itself a generic function can't actually do +anything; if you just define a generic function, no matter what +arguments you call it with, it will signal an error. The actual +implementation of a generic function is provided by methods. Each +method provides an implementation of the generic function for +particular classes of arguments. Perhaps the biggest difference +between a generic function-based system and a message-passing system +is that methods don't belong to classes; they belong to the generic +function, which is responsible for determining what method or methods +to run in response to a particular invocation.

Methods indicate what kinds of arguments they can handle by +specializing the required parameters defined by the generic +function. For instance, on the generic function draw, you +might define one method that specializes the shape parameter +for objects that are instances of the class circle while +another method specializes shape for objects that are +instances of the class triangle. They would look like this, +eliding the actual drawing code:

(defmethod draw ((shape circle))
+  ...)
+
+(defmethod draw ((shape triangle))
+  ...)

When a generic function is invoked, it compares the actual arguments +it was passed with the specializers of each of its methods to find +the applicable methods--those methods whose specializers are +compatible with the actual arguments. If you invoke draw, +passing an instance of circle, the method that specialized +shape on the class circle is applicable, while if you +pass it a triangle, then the method that specializes +shape on the class triangle applies. In simple cases, +only one method will be applicable, and it will handle the +invocation. In more complex cases, there may be multiple methods that +apply; they're then combined, as I'll discuss in the section "Method +Combination," into a single effective method that handles the +invocation.

You can specialize a parameter in two ways--usually you'll specify a +class that the argument must be an instance of. Because instances of +a class are also considered instances of that class's superclasses, a +method with a parameter specialized on a particular class can be +applicable whenever the corresponding argument is a direct instance +of the specializing class or of any of its subclasses. The other kind +of specializer is a so-called EQL specializer, which specifies a +particular object to which the method applies.

When a generic function has only methods specialized on a single +parameter and all the specializers are class specializers, the result +of invoking a generic function is quite similar to the result of +invoking a method in a message-passing system--the combination of the +name of the operation and the class of the object on which it's +invoked determines what method to run.

However, reversing the order of lookup opens up possibilities not +found in message-passing systems. Generic functions support methods +that specialize on multiple parameters, provide a framework that +makes multiple inheritance much more manageable, and let you use +declarative constructs to control how methods are combined into an +effective method, supporting several common usage patterns without a +lot of boilerplate code. I'll discuss those topics in a moment. But +first you need to look at the basics of the two macros used to define +the generic functions DEFGENERIC and DEFMETHOD.

DEFGENERIC

To give you a feel for these macros and the various facilities they +support, I'll show you some code you might write as part of a banking +application--or, rather, a toy banking application; the point is to +look at a few language features, not to learn how to really write +banking software. For instance, this code doesn't even pretend to +deal with such issues as multiple currencies let alone audit trails +and transactional integrity.

Because I'm not going to discuss how to define new classes until the +next chapter, for now you can just assume that certain classes +already exist: for starters, assume there's a class +bank-account and that it has two subclasses, +checking-account and savings-account. The class +hierarchy looks like this:

The first generic function will be withdraw, which decreases +the account balance by a specified amount. If the balance is less +than the amount, it should signal an error and leave the balance +unchanged. You can start by defining the generic function with +DEFGENERIC.

The basic form of DEFGENERIC is similar to DEFUN except +with no body. The parameter list of DEFGENERIC specifies the +parameters that must be accepted by all the methods that will be +defined on the generic function. In the place of the body, a +DEFGENERIC can contain various options. One option you should +always include is :documentation, which you use to provide a +string describing the purpose of the generic function. Because a +generic function is purely abstract, it's important to be clear to +both users and implementers what it's for. Thus, you might define +withdraw like this:

(defgeneric withdraw (account amount)
+  (:documentation "Withdraw the specified amount from the account.
+Signal an error if the current balance is less than amount."))

DEFMETHOD

Now you're ready to use DEFMETHOD to define methods that +implement withdraw.6

A method's parameter list must be congruent with its generic +function's. In this case, that means all methods defined on +withdraw must have exactly two required parameters. More +generally, methods must have the same number of required and optional +parameters and must be capable of accepting any arguments +corresponding to any &rest or &key parameters specified by +the generic function.7

Since the basics of withdrawing are the same for all accounts, you +can define a method that specializes the account parameter on +the bank-account class. You can assume the function +balance returns the current balance of the account and can be +used with SETF--and thus with DECF--to set the balance. The +function ERROR is a standard function used to signal an error, +which I'll discuss in greater detail in Chapter 19. Using those two +functions, you can define a basic withdraw method that looks +like this:

(defmethod withdraw ((account bank-account) amount)
+  (when (< (balance account) amount)
+    (error "Account overdrawn."))
+  (decf (balance account) amount))

As this code suggests, the form of DEFMETHOD is even more like +that of DEFUN than DEFGENERIC's is. The only difference is +that the required parameters can be specialized by replacing the +parameter name with a two-element list. The first element is the name +of the parameter, and the second element is the specializer, either +the name of a class or an EQL specializer, the form of which +I'll discuss in a moment. The parameter name can be anything--it +doesn't have to match the name used in the generic function, though +it often will.

This method will apply whenever the first argument to withdraw +is an instance of bank-account. The second parameter, +amount, is implicitly specialized on T, and since all +objects are instances of T, it doesn't affect the applicability +of the method.

Now suppose all checking accounts have overdraft protection. That is, +each checking account is linked to another bank account that's drawn +upon when the balance of the checking account itself can't cover a +withdrawal. You can assume that the function overdraft-account +takes a checking-account object and returns a +bank-account object representing the linked account.

Thus, withdrawing from a checking-account object requires a +few extra steps compared to withdrawing from a standard +bank-account object. You must first check whether the amount +being withdrawn is greater than the account's current balance and, if +it is, transfer the difference from the overdraft account. Then you +can proceed as with a standard bank-account object.

So what you'd like to do is define a method on withdraw that +specializes on checking-account to handle the transfer and +then lets the method specialized on bank-account take control. +Such a method might look like this:

(defmethod withdraw ((account checking-account) amount)
+  (let ((overdraft (- amount (balance account))))
+    (when (plusp overdraft)
+      (withdraw (overdraft-account account) overdraft)
+      (incf (balance account) overdraft)))
+  (call-next-method))

The function CALL-NEXT-METHOD is part of the generic function +machinery used to combine applicable methods. It indicates that +control should be passed from this method to the method specialized +on bank-account.8 +When it's called with no arguments, as it is here, the next method is +invoked with whatever arguments were originally passed to the generic +function. It can also be called with arguments, which will then be +passed onto the next method.

You aren't required to invoke CALL-NEXT-METHOD in every method. +However, if you don't, the new method is then responsible for +completely implementing the desired behavior of the generic function. +For example, if you had a subclass of bank-account, +proxy-account, that didn't actually keep track of its own +balance but instead delegated withdrawals to another account, you +might write a method like this (assuming a function, +proxied-account, that returns the proxied account):

(defmethod withdraw ((proxy proxy-account) amount)
+  (withdraw (proxied-account proxy) amount))

Finally, DEFMETHOD also allows you to create methods specialized +on a particular object with an EQL specializer. For example, +suppose the banking app is going to be deployed in a particularly +corrupt bank. Suppose the variable *account-of-bank-president* +holds a reference to a particular bank account that belongs--as the +name suggests--to the bank's president. Further suppose the variable +*bank* represents the bank as a whole, and the function +embezzle steals money from the bank. The bank president might +ask you to "fix" withdraw to handle his account specially.

(defmethod withdraw ((account (eql *account-of-bank-president*)) amount)
+  (let ((overdraft (- amount (balance account))))
+    (when (plusp overdraft)
+      (incf (balance account) (embezzle *bank* overdraft)))
+  (call-next-method)))

Note, however, that the form in the EQL specializer that +provides the object to specialize +on--*account-of-bank-president* in this case--is evaluated +once, when the DEFMETHOD is evaluated. This method will be +specialized on the value of *account-of-bank-president* at the +time the method is defined; changing the variable later won't change +the method.

Method Combination

Outside the body of a method, CALL-NEXT-METHOD has no meaning. +Within a method, it's given a meaning by the generic function +machinery that builds an effective method each time the generic +function is invoked using all the methods applicable to that +particular invocation. This notion of building an effective method by +combining applicable methods is the heart of the generic function +concept and is the thing that allows generic functions to support +facilities not found in message-passing systems. So it's worth taking +a closer look at what's really happening. Folks with the +message-passing model deeply ingrained in their consciousness should +pay particular attention because generic functions turn method +dispatching inside out compared to message passing, making the +generic function, rather than the class, the prime mover.

Conceptually, the effective method is built in three steps: First, +the generic function builds a list of applicable methods based on the +actual arguments it was passed. Second, the list of applicable +methods is sorted according to the specificity of their parameter +specializers. Finally, methods are taken in order from the sorted +list and their code combined to produce the effective +method.9

To find applicable methods, the generic function compares the actual +arguments with the corresponding parameter specializers in each of +its methods. A method is applicable if, and only if, all the +specializers are compatible with the corresponding arguments.

When the specializer is the name of a class, it's compatible if it +names the actual class of the argument or one of its superclasses. +(Recall that parameters without explicit specializers are implicitly +specialized on the class T so will be compatible with any +argument.) An EQL specializer is compatible only when the +argument is the same object as was specified in the specializer.

Because all the arguments are checked against the corresponding +specializers, they all affect whether a method is applicable. Methods +that explicitly specialize more than one parameter are called +multimethods; I'll discuss them in the section "Multimethods."

After the applicable methods have been found, the generic function +machinery needs to sort them before it can combine them into an +effective method. To order two applicable methods, the generic +function compares their parameter specializers from left to +right,10 and the first specializer that's different between the two +methods determines their ordering, with the method with the more +specific specializer coming first.

Because only applicable methods are being sorted, you know all class +specializers will name classes that the corresponding argument is +actually an instance of. In the typical case, if two class +specializers differ, one will be a subclass of the other. In that +case, the specializer naming the subclass is considered more +specific. This is why the method that specialized account on +checking-account was considered more specific than the method +that specialized it on bank-account.

Multiple inheritance slightly complicates the notion of specificity +since the actual argument may be an instance of two classes, neither +of which is a subclass of the other. If such classes are used as +parameter specializers, the generic function can't order them using +only the rule that subclasses are more specific than their +superclasses. In the next chapter I'll discuss how the notion of +specificity is extended to deal with multiple inheritance. For now, +suffice it to say that there's a deterministic algorithm for ordering +class specializers.

Finally, an EQL specializer is always more specific than any +class specializer, and because only applicable methods are being +considered, if more than one method has an EQL specializer for a +particular parameter, they must all have the same EQL +specializer. The comparison of those methods will thus be decided +based on other parameters.

The Standard Method Combination

Now that you understand how the applicable methods are found and +sorted, you're ready to take a closer look at the last step--how the +sorted list of methods is combined into a single effective method. By +default, generic functions use what's called the standard method +combination. The standard method combination combines methods so +that CALL-NEXT-METHOD works as you've already seen--the most +specific method runs first, and each method can pass control to the +next most specific method via CALL-NEXT-METHOD.

However, there's a bit more to it than that. The methods I've been +discussing so far are called primary methods. Primary methods, as +their name suggests, are responsible for providing the primary +implementation of a generic function. The standard method combination +also supports three kinds of auxiliary methods: :before, +:after, and :around methods. An auxiliary method +definition is written with DEFMETHOD like a primary method but +with a method qualifier, which names the type of method, between +the name of the method and the parameter list. For instance, a +:before method on withdraw that specializes the +account parameter on the class bank-account would start +like this:

(defmethod withdraw :before ((account bank-account) amount) ...)

Each kind of auxiliary method is combined into the effective method +in a different way. All the applicable :before methods--not +just the most specific--are run as part of the effective method. They +run, as their name suggests, before the most specific primary method +and are run in most-specific-first order. Thus, :before +methods can be used to do any preparation needed to ensure that the +primary method can run. For instance, you could've used a +:before method specialized on checking-account to +implement the overdraft protection on checking accounts like this:

(defmethod withdraw :before ((account checking-account) amount)
+  (let ((overdraft (- amount (balance account))))
+    (when (plusp overdraft)
+      (withdraw (overdraft-account account) overdraft)
+      (incf (balance account) overdraft))))

This :before method has three advantages over a primary +method. One is that it makes it immediately obvious how the method +changes the overall behavior of the withdraw function--it's +not going to interfere with the main behavior or change the result +returned.

The next advantage is that a primary method specialized on a class +more specific than checking-account won't interfere with this +:before method, making it easier for an author of a subclass +of checking-account to extend the behavior of withdraw +while keeping part of the old behavior.

Lastly, since a :before method doesn't have to call +CALL-NEXT-METHOD to pass control to the remaining methods, it's +impossible to introduce a bug by forgetting to.

The other auxiliary methods also fit into the effective method in +ways suggested by their names. All the :after methods run +after the primary methods in most-specific-last order, that is, the +reverse of the :before methods. Thus, the :before and +:after methods combine to create a sort of nested wrapping +around the core functionality provided by the primary methods--each +more-specific :before method will get a chance to set things +up so the less-specific :before methods and primary methods +can run successfully, and each more-specific :after method +will get a chance to clean up after all the primary methods and +less-specific :after methods.

Finally, :around methods are combined much like primary +methods except they're run "around" all the other methods. That is, +the code from the most specific :around method is run before +anything else. Within the body of an :around method, +CALL-NEXT-METHOD will lead to the code of the next most specific +:around method or, in the least specific :around +method, to the complex of :before, primary, and :after +methods. Almost all :around methods will contain such a call +to CALL-NEXT-METHOD because an :around method that +doesn't will completely hijack the implementation of the generic +function from all the methods except for more-specific :around +methods.

Occasionally that kind of hijacking is called for, but typically +:around methods are used to establish some dynamic context in +which the rest of the methods will run--to bind a dynamic variable, +for example, or to establish an error handler (as I'll discuss in +Chapter 19). About the only time it's appropriate for an +:around method to not call CALL-NEXT-METHOD is when it +returns a result cached from a previous call to +CALL-NEXT-METHOD. At any rate, an :around method that +doesn't call CALL-NEXT-METHOD is responsible for correctly +implementing the semantics of the generic function for all classes of +arguments to which the method may apply, including future subclasses.

Auxiliary methods are just a convenient way to express certain common +patterns more concisely and concretely. They don't actually allow you +to do anything you couldn't do by combining primary methods with +diligent adherence to a few coding conventions and some extra typing. +Perhaps their biggest benefit is that they provide a uniform +framework for extending generic functions. Often a library will +define a generic function and provide a default primary method, +allowing users of the library to customize its behavior by defining +appropriate auxiliary methods.

Other Method Combinations

In addition to the standard method combination, the language +specifies nine other built-in method combinations known as the +simple built-in method combinations. You can also define custom +method combinations, though that's a fairly esoteric feature and +beyond the scope of this book. I'll briefly cover how to use the +simple built-in combinations to give you a sense of the +possibilities.

All the simple combinations follow the same pattern: instead of +invoking the most specific primary method and letting it invoke +less-specific primary methods via CALL-NEXT-METHOD, the simple +method combinations produce an effective method that contains the +code of all the primary methods, one after another, all wrapped in a +call to the function, macro, or special operator that gives the +method combination its name. The nine combinations are named for the +operators: +, AND, OR, LIST, APPEND, +NCONC, MIN, MAX, and PROGN. The simple +combinations also support only two kinds of methods, primary methods, +which are combined as just described, and :around methods, +which work like :around methods in the standard method +combination.

For example, a generic function that uses the + method +combination will return the sum of all the results returned by its +primary methods. Note that the AND and OR method +combinations won't necessarily run all the primary methods because of +those macros' short-circuiting behavior--a generic function using the +AND combination will return NIL as soon as one of the +methods does and will return the value of the last method otherwise. +Similarly, the OR combination will return the first non-NIL +value returned by any of the methods.

To define a generic function that uses a particular method +combination, you include a :method-combination option in the +DEFGENERIC form. The value supplied with this option is the name +of the method combination you want to use. For example, to define a +generic function, priority, that returns the sum of values +returned by individual methods using the + method combination, +you might write this:

(defgeneric priority (job)
+  (:documentation "Return the priority at which the job should be run.")
+  (:method-combination +))

By default all these method combinations combine the primary methods +in most-specific-first order. However, you can reverse the order by +including the keyword :most-specific-last after the name of +the method combination in the DEFGENERIC form. The order +probably doesn't matter if you're using the + combination unless +the methods have side effects, but for demonstration purposes you can +change priority to use most-specific-last order like this:

(defgeneric priority (job)
+  (:documentation "Return the priority at which the job should be run.")
+  (:method-combination + :most-specific-last))

The primary methods on a generic function that uses one of these +combinations must be qualified with the name of the method +combination. Thus, a primary method defined on priority might +look like this:

(defmethod priority + ((job express-job)) 10)

This makes it obvious when you see a method definition that it's part +of a particular kind of generic function.

All the simple built-in method combinations also support +:around methods that work like :around methods in the +standard method combination: the most specific :around method +runs before any other methods, and CALL-NEXT-METHOD is used to +pass control to less-and-less-specific :around methods until +it reaches the combined primary methods. The +:most-specific-last option doesn't affect the order of +:around methods. And, as I mentioned before, the built-in +method combinations don't support :before or :after +methods.

Like the standard method combination, these method combinations don't +allow you to do anything you couldn't do "by hand." Rather, they +allow you to express what you want and let the language take care +of wiring everything together for you, making your code both more +concise and more expressive.

That said, probably 99 percent of the time, the standard method +combination will be exactly what you want. Of the remaining 1 +percent, probably 99 percent of them will be handled by one of the +simple built-in method combinations. If you run into one of the 1 +percent of 1 percent of cases where none of the built-in combinations +suffices, you can look up DEFINE-METHOD-COMBINATION in your +favorite Common Lisp reference.

Multimethods

Methods that explicitly specialize more than one of the generic +function's required parameters are called multimethods. +Multimethods are where generic functions and message passing really +part ways. Multimethods don't fit into message-passing languages +because they don't belong to a particular class; instead, each +multimethod defines a part of the implementations of a given generic +function that applies when the generic function is invoked with +arguments that match all the method's specialized parameters.

Multimethods vs. Method Overloading

Multimethods are perfect for all those situations where, in a +message-passing language, you struggle to decide to which class a +certain behavior ought to belong. Is the sound a drum makes when it's +hit with a drumstick a function of what kind of drum it is or what +kind of stick you use to hit it? Both, of course. To model this +situation in Common Lisp, you simply define a generic function +beat that takes two arguments.

(defgeneric beat (drum stick)
+  (:documentation
+   "Produce a sound by hitting the given drum with the given stick."))

Then you can define various multimethods to implement beat for +the combinations you care about. For example:

(defmethod beat ((drum snare-drum) (stick wooden-drumstick)) ...)
+(defmethod beat ((drum snare-drum) (stick brush)) ...)
+(defmethod beat ((drum snare-drum) (stick soft-mallet)) ...)
+(defmethod beat ((drum tom-tom) (stick wooden-drumstick)) ...)
+(defmethod beat ((drum tom-tom) (stick brush)) ...)
+(defmethod beat ((drum tom-tom) (stick soft-mallet)) ...)

Multimethods don't help with the combinatorial explosion--if you need +to model five kinds of drums and six kinds of sticks, and every +combination makes a different sound, there's no way around it; you +need thirty different methods to implement all the combinations, with +or without multimethods. What multimethods do save you from is having +to write a bunch of dispatching code by letting you use the same +built-in polymorphic dispatching that's so useful when dealing with +methods specialized on a single parameter.11

Multimethods also save you from having to tightly couple one set of +classes with the other. In the drum/stick example, nothing requires +the implementation of the drum classes to know about the various +classes of drumstick, and nothing requires the drumstick classes to +know anything about the various classes of drum. The multimethods +connect the otherwise independent classes to describe their joint +behavior without requiring any cooperation from the classes +themselves.

To Be Continued . . .

I've covered the basics--and a bit beyond--of generic functions, the +verbs of Common Lisp's object system. In the next chapter I'll show +you how to define your own classes. +


1The language now generally +considered the first object-oriented language, Simula, was invented in +the early 1960s, only a few years after McCarthy's first Lisp. +However, object orientation didn't really take off until the 1980s +when the first widely available version of Smalltalk was released, +followed by the release of C++ a few years later. Smalltalk took quite +a bit of inspiration from Lisp and combined it with ideas from Simula +to produce a dynamic object-oriented language, while C++ combined +Simula with C, another fairly static language, to yield a static +object-oriented language. This early split has led to much confusion +in the definition of object orientation. Folks who come from the C++ +tradition tend to consider certain aspects of C++, such as strict data +encapsulation, to be key characteristics of object orientation. Folks +from the Smalltalk tradition, however, consider many features of C++ +to be just that, features of C++, and not core to object orientation. +Indeed, Alan Kay, the inventor of Smalltalk, is reported to have said, +"I invented the term object oriented, and I can tell you that C++ +wasn't what I had in mind."

2There are those who reject the notion that Common +Lisp is in fact object oriented at all. In particular, folks who +consider strict data encapsulation a key characteristic of object +orientation--usually advocates of relatively static languages such as +C++, Eiffel, or Java--don't consider Common Lisp to be properly +object oriented. Of course, by that definition, Smalltalk, arguably +one of the original and purest object-oriented languages, isn't +object oriented either. On the other hand, folks who consider message +passing to be the key to object orientation will also not be happy +with the claim that Common Lisp is object oriented since Common +Lisp's generic function orientation provides degrees of freedom not +offered by pure message passing.

3Prototype-based languages are the other style of +object-oriented language. In these languages, JavaScript being +perhaps the most famous example, objects are created by cloning a +prototypical object. The clone can then be modified and used as a +prototype for other objects.

4T the constant value and T the +class have no particular relationship except they happen to have the +same name. T the value is a direct instance of the class +SYMBOL and only indirectly an instance of T the class.

5Here, as elsewhere, +object means any Lisp datum--Common Lisp doesn't distinguish, as +some languages do, between objects and "primitive" data types; all +data in Common Lisp are objects, and every object is an instance of a +class.

6Technically you could skip the +DEFGENERIC altogether--if you define a method with +DEFMETHOD and no such generic function has been defined, one is +automatically created. But it's good form to define generic functions +explicitly, if only because it gives you a good place to document the +intended behavior.

7A method can "accept" &key and +&rest arguments defined in its generic function by having a +&rest parameter, by having the same &key parameters, or by +specifying &allow-other-keys along with &key. A method can +also specify &key parameters not found in the generic function's +parameter list--when the generic function is called, any &key +parameter specified by the generic function or any applicable method +will be accepted.

8CALL-NEXT-METHOD is roughly +analogous to invoking a method on super in Java or using an +explicitly class-qualified method or function name in Python or C++.

9While building the effective method sounds +time-consuming, quite a bit of the effort in developing fast Common +Lisp implementations has gone into making it efficient. One strategy +is to cache the effective method so future calls with the same +argument types will be able to proceed directly.

10Actually, the order in which specializers are compared is +customizable via the DEFGENERIC option +:argument-precedence-order, though that option is rarely +used.

11In languages without +multimethods, you must write dispatching code yourself to implement +behavior that depends on the class of more than one object. The +purpose of the popular Visitor design pattern is to structure a +series of singly dispatched method calls so as to provide multiple +dispatch. However, it requires one set of classes to know about the +other. The Visitor pattern also quickly bogs down in a combinatorial +explosion of dispatching methods if it's used to dispatch on more +than two objects.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-a-portable-pathname-library.html b/clones/gigamonkeys.com/book/practical-a-portable-pathname-library.html new file mode 100644 index 00000000..648f64ea --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-a-portable-pathname-library.html @@ -0,0 +1,364 @@ +Practical: A Portable Pathname Library

15. Practical: A Portable Pathname Library

As I discussed in the previous chapter, Common Lisp provides an +abstraction, the pathname, that's supposed to insulate you from the +details of how different operating systems and file systems name +files. Pathnames provide a useful API for manipulating names as names, +but when it comes to the functions that actually interact with the +file system, things get a bit hairy.

The root of the problem, as I mentioned, is that the pathname +abstraction was designed to represent filenames on a much wider +variety of file systems than are commonly used now. Unfortunately, by +making pathnames abstract enough to account for a wide variety of +file systems, Common Lisp's designers left implementers with a fair +number of choices to make about how exactly to map the pathname +abstraction onto any particular file system. Consequently, different +implementers, each implementing the pathname abstraction for the same +file system, just by making different choices at a few key junctions, +could end up with conforming implementations that nonetheless provide +different behavior for several of the main pathname-related +functions.

However, one way or another, all implementations provide the same +basic functionality, so it's not too hard to write a library that +provides a consistent interface for the most common operations across +different implementations. That's your task for this chapter. In +addition to giving you several useful functions that you'll use in +future chapters, writing this library will give you a chance to learn +how to write code that deals with differences between +implementations.

The API

The basic operations the library will support will be getting a list +of files in a directory and determining whether a file or directory +with a given name exists. You'll also write a function for +recursively walking a directory hierarchy, calling a given function +for each pathname in the tree.

In theory, these directory listing and file existence operations are +already provided by the standard functions DIRECTORY and +PROBE-FILE. However, as you'll see, there are enough different +ways to implement these functions--all within the bounds of valid +interpretations of the language standard--that you'll want to write +new functions that provide a consistent behavior across +implementations.

*FEATURES* and Read-Time Conditionalization

Before you can implement this API in a library that will run +correctly on multiple Common Lisp implementations, I need to show you +the mechanism for writing implementation-specific code.

While most of the code you write can be "portable" in the sense that +it will run the same on any conforming Common Lisp implementation, +you may occasionally need to rely on implementation-specific +functionality or to write slightly different bits of code for +different implementations. To allow you to do so without totally +destroying the portability of your code, Common Lisp provides a +mechanism, called read-time conditionalization, that allows you +to conditionally include code based on various features such as what +implementation it's being run in.

The mechanism consists of a variable *FEATURES* and two extra +bits of syntax understood by the Lisp reader. *FEATURES* is a +list of symbols; each symbol represents a "feature" that's present in +the implementation or on the underlying platform. These symbols are +then used in feature expressions that evaluate to true or false +depending on whether the symbols in the expression are present in +*FEATURES*. The simplest feature expression is a single symbol; +the expression is true if the symbol is in *FEATURES* and false +if it isn't. Other feature expressions are boolean expressions built +out of NOT, AND, and OR operators. For instance, if +you wanted to conditionalize some code to be included only if the +features foo and bar were present, you could write the +feature expression (and foo bar).

The reader uses feature expressions in conjunction with two bits of +syntax, #+ and #-. When the reader sees either of these +bits of syntax, it first reads a feature expression and then +evaluates it as I just described. When a feature expression following +a #+ is true, the reader reads the next expression normally. +Otherwise it skips the next expression, treating it as whitespace. +#- works the same way except it reads the form if the feature +expression is false and skips it if it's true.

The initial value of *FEATURES* is implementation dependent, and +what functionality is implied by the presence of any given symbol is +likewise defined by the implementation. However, all implementations +include at least one symbol that indicates what implementation it is. +For instance, Allegro Common Lisp includes the symbol +:allegro, CLISP includes :clisp, SBCL includes +:sbcl, and CMUCL includes :cmu. To avoid dependencies +on packages that may or may not exist in different implementations, +the symbols in *FEATURES* are usually keywords, and the reader +binds *PACKAGE* to the KEYWORD package while reading +feature expressions. Thus, a name with no package qualification will +be read as a keyword symbol. So, you could write a function that +behaves slightly differently in each of the implementations just +mentioned like this:

(defun foo ()
+  #+allegro (do-one-thing)
+  #+sbcl (do-another-thing)
+  #+clisp (something-else)
+  #+cmu (yet-another-version)
+  #-(or allegro sbcl clisp cmu) (error "Not implemented"))

In Allegro that code will be read as if it had been written like +this:

(defun foo ()
+  (do-one-thing))

while in SBCL the reader will read this:

(defun foo ()
+  (do-another-thing))

while in an implementation other than one of the ones specifically +conditionalized, it will read this:

(defun foo ()
+  (error "Not implemented"))

Because the conditionalization happens in the reader, the compiler +doesn't even see expressions that are skipped.1 This means you pay no runtime cost for having different +versions for different implementations. Also, when the reader skips +conditionalized expressions, it doesn't bother interning symbols, so +the skipped expressions can safely contain symbols from packages that +may not exist in other implementations.

Packaging the Library

Listing a Directory

You can implement the function for listing a single directory, +list-directory, as a thin wrapper around the standard function +DIRECTORY. DIRECTORY takes a special kind of pathname, +called a wild pathname, that has one or more components +containing the special value :wild and returns a list of +pathnames representing files in the file system that match the wild +pathname.2 The matching algorithm--like most +things having to do with the interaction between Lisp and a +particular file system--isn't defined by the language standard, but +most implementations on Unix and Windows follow the same basic +scheme.

The DIRECTORY function has two problems that you need to address +with list-directory. The main one is that certain aspects of +its behavior differ fairly significantly between different Common +Lisp implementations, even on the same operating system. The other is +that while DIRECTORY provides a powerful interface for listing +files, to use it properly requires understanding some rather subtle +points about the pathname abstraction. Between these subtleties and +the idiosyncrasies of different implementations, actually writing +portable code that uses DIRECTORY to do something as simple as +listing all the files and subdirectories in a single directory can be +a frustrating experience. You can deal with those subtleties and +idiosyncrasies once and for all, by writing list-directory, +and forget them thereafter.

One subtlety I discussed in Chapter 14 is the two ways to represent +the name of a directory as a pathname: directory form and file form.

To get DIRECTORY to return a list of files in +/home/peter/, you need to pass it a wild pathname whose +directory component is the directory you want to list and whose name +and type components are :wild. Thus, to get a listing of the +files in /home/peter/, it might seem you could write this:

(directory (make-pathname :name :wild :type :wild :defaults home-dir))

where home-dir is a pathname representing /home/peter/. +This would work if home-dir were in directory form. But if it +were in file form--for example, if it had been created by parsing the +namestring "/home/peter"--then that same expression would list +all the files in /home since the name component "peter" +would be replaced with :wild.

To avoid having to worry about explicitly converting between +representations, you can define list-directory to accept a +nonwild pathname in either form, which it will then convert to the +appropriate wild pathname.

To help with this, you should define a few helper functions. One, +component-present-p, will test whether a given component of a +pathname is "present," meaning neither NIL nor the special value +:unspecific.3 Another, directory-pathname-p, +tests whether a pathname is already in directory form, and the third, +pathname-as-directory, converts any pathname to a directory +form pathname.

(defun component-present-p (value)
+  (and value (not (eql value :unspecific))))
+
+(defun directory-pathname-p  (p)
+  (and
+   (not (component-present-p (pathname-name p)))
+   (not (component-present-p (pathname-type p)))
+   p))
+
+(defun pathname-as-directory (name)
+  (let ((pathname (pathname name)))
+    (when (wild-pathname-p pathname)
+      (error "Can't reliably convert wild pathnames."))
+    (if (not (directory-pathname-p name))
+      (make-pathname
+       :directory (append (or (pathname-directory pathname) (list :relative))
+                          (list (file-namestring pathname)))
+       :name      nil
+       :type      nil
+       :defaults pathname)
+      pathname)))

Now it seems you could generate a wild pathname to pass to +DIRECTORY by calling MAKE-PATHNAME with a directory form +name returned by pathname-as-directory. Unfortunately, it's +not quite that simple, thanks to a quirk in CLISP's implementation of +DIRECTORY. In CLISP, DIRECTORY won't return files with no +extension unless the type component of the wildcard is NIL +rather than :wild. So you can define a function, +directory-wildcard, that takes a pathname in either directory +or file form and returns a proper wildcard for the given +implementation using read-time conditionalization to make a pathname +with a :wild type component in all implementations except for +CLISP and NIL in CLISP.

(defun directory-wildcard (dirname)
+  (make-pathname
+   :name :wild
+   :type #-clisp :wild #+clisp nil
+   :defaults (pathname-as-directory dirname)))

Note how each read-time conditional operates at the level of a single +expression After #-clisp, the expression :wild is +either read or skipped; likewise, after #+clisp, the NIL +is read or skipped.

Now you can take a first crack at the list-directory function.

(defun list-directory (dirname)
+  (when (wild-pathname-p dirname)
+    (error "Can only list concrete directory names."))
+  (directory (directory-wildcard dirname)))

As it stands, this function would work in SBCL, CMUCL, and LispWorks. +Unfortunately, a couple more implementation differences remain to be +smoothed over. One is that not all implementations will return +subdirectories of the given directory. Allegro, SBCL, CMUCL, and +LispWorks do. OpenMCL doesn't by default but will if you pass +DIRECTORY a true value via the implementation-specific keyword +argument :directories. CLISP's DIRECTORY returns +subdirectories only when it's passed a wildcard pathname with +:wild as the last element of the directory component and +NIL name and type components. In this case, it returns only +subdirectories, so you'll need to call DIRECTORY twice with +different wildcards and combine the results.

Once you get all the implementations returning directories, you'll +discover they can also differ in whether they return the names of +directories in directory or file form. You want list-directory +to always return directory names in directory form so you can +differentiate subdirectories from regular files based on just the +name. Except for Allegro, all the implementations this library will +support do that. Allegro, on the other hand, requires you to pass +DIRECTORY the implementation-specific keyword argument +:directories-are-files NIL to get it to return +directories in file form.

Once you know how to make each implementation do what you want, +actually writing list-directory is simply a matter of +combining the different versions using read-time conditionals.

(defun list-directory (dirname)
+  (when (wild-pathname-p dirname)
+    (error "Can only list concrete directory names."))
+  (let ((wildcard (directory-wildcard dirname)))
+
+    #+(or sbcl cmu lispworks)
+    (directory wildcard)
+
+    #+openmcl
+    (directory wildcard :directories t)
+
+    #+allegro
+    (directory wildcard :directories-are-files nil)
+
+    #+clisp
+    (nconc
+     (directory wildcard)
+     (directory (clisp-subdirectories-wildcard wildcard)))
+
+    #-(or sbcl cmu lispworks openmcl allegro clisp)
+    (error "list-directory not implemented")))

The function clisp-subdirectories-wildcard isn't actually +specific to CLISP, but since it isn't needed by any other +implementation, you can guard its definition with a read-time +conditional. In this case, since the expression following the +#+ is the whole DEFUN, the whole function definition will +be included or not, depending on whether clisp is present in +*FEATURES*.

#+clisp
+(defun clisp-subdirectories-wildcard (wildcard)
+  (make-pathname
+   :directory (append (pathname-directory wildcard) (list :wild))
+   :name nil
+   :type nil
+   :defaults wildcard))

Testing a File's Existence

To replace PROBE-FILE, you can define a function called +file-exists-p. It should accept a pathname and return an +equivalent pathname if the file exists and NIL if it doesn't. It +should be able to accept the name of a directory in either directory +or file form but should always return a directory form pathname if +the file exists and is a directory. This will allow you to use +file-exists-p, along with directory-pathname-p, to test +whether an arbitrary name is the name of a file or directory.

In theory, file-exists-p is quite similar to the standard +function PROBE-FILE; indeed, in several implementations--SBCL, +LispWorks, and OpenMCL--PROBE-FILE already gives you the +behavior you want for file-exists-p. But not all +implementations of PROBE-FILE behave quite the same.

Allegro and CMUCL's PROBE-FILE functions are close to what you +need--they will accept the name of a directory in either form but, +instead of returning a directory form name, simply return the name in +the same form as the argument it was passed. Luckily, if passed the +name of a nondirectory in directory form, they return NIL. So +with those implementations you can get the behavior you want by first +passing the name to PROBE-FILE in directory form--if the file +exists and is a directory, it will return the directory form name. If +that call returns NIL, then you try again with a file form name.

CLISP, on the other hand, once again has its own way of doing things. +Its PROBE-FILE immediately signals an error if passed a name in +directory form, regardless of whether a file or directory exists with +that name. It also signals an error if passed a name in file form +that's actually the name of a directory. For testing whether a +directory exists, CLISP provides its own function: +probe-directory (in the ext package). This is almost +the mirror image of PROBE-FILE: it signals an error if passed a +name in file form or if passed a name in directory form that happens +to name a file. The only difference is it returns T rather than +a pathname when the named directory exists.

But even in CLISP you can implement the desired semantics by wrapping +the calls to PROBE-FILE and probe-directory in +IGNORE-ERRORS.4

(defun file-exists-p (pathname)
+  #+(or sbcl lispworks openmcl)
+  (probe-file pathname)
+
+  #+(or allegro cmu)
+  (or (probe-file (pathname-as-directory pathname))
+      (probe-file pathname))
+
+  #+clisp
+  (or (ignore-errors
+        (probe-file (pathname-as-file pathname)))
+      (ignore-errors
+        (let ((directory-form (pathname-as-directory pathname)))
+          (when (ext:probe-directory directory-form)
+            directory-form))))
+
+  #-(or sbcl cmu lispworks openmcl allegro clisp)
+  (error "file-exists-p not implemented"))

The function pathname-as-file that you need for the CLISP +implementation of file-exists-p is the inverse of the +previously defined pathname-as-directory, returning a pathname +that's the file form equivalent of its argument. This function, +despite being needed here only by CLISP, is generally useful, so +define it for all implementations and make it part of the library.

(defun pathname-as-file (name)
+  (let ((pathname (pathname name)))
+    (when (wild-pathname-p pathname)
+      (error "Can't reliably convert wild pathnames."))
+    (if (directory-pathname-p name)
+      (let* ((directory (pathname-directory pathname))
+             (name-and-type (pathname (first (last directory)))))
+        (make-pathname
+         :directory (butlast directory)
+         :name (pathname-name name-and-type)
+         :type (pathname-type name-and-type)
+         :defaults pathname))
+      pathname)))

Walking a Directory Tree

Finally, to round out this library, you can implement a function +called walk-directory. Unlike the functions defined +previously, this function doesn't need to do much of anything to +smooth over implementation differences; it just needs to use the +functions you've already defined. However, it's quite handy, and +you'll use it several times in subsequent chapters. It will take the +name of a directory and a function and call the function on the +pathnames of all the files under the directory, recursively. It will +also take two keyword arguments: :directories and +:test. When :directories is true, it will call the +function on the pathnames of directories as well as regular files. +The :test argument, if provided, specifies another function +that's invoked on each pathname before the main function is; the main +function will be called only if the test function returns true.

(defun walk-directory (dirname fn &key directories (test (constantly t)))
+  (labels
+      ((walk (name)
+         (cond
+           ((directory-pathname-p name)
+            (when (and directories (funcall test name))
+              (funcall fn name))
+            (dolist (x (list-directory name)) (walk x)))
+           ((funcall test name) (funcall fn name)))))
+    (walk (pathname-as-directory dirname))))

Now you have a useful library of functions for dealing with +pathnames. As I mentioned, these functions will come in handy in +later chapters, particularly Chapters 23 and 27, where you'll use +walk-directory to crawl through directory trees containing +spam messages and MP3 files. But before we get to that, though, I +need to talk about object orientation, the topic of the next two +chapters. +


1One slightly +annoying consequence of the way read-time conditionalization works is +that there's no easy way to write a fall-through case. For example, +if you add support for another implementation to foo by adding +another expression guarded with #+, you need to remember to +also add the same feature to the or feature expression after +the #- or the ERROR form will be evaluated after your new +code runs.

2Another special value, :wild-inferiors, can +appear as part of the directory component of a wild pathname, but you +won't need it in this chapter.

3Implementations are allowed to return +:unspecific instead of NIL as the value of pathname +components in certain situations such as when the component isn't +used by that implementation.

4This is slightly broken in the sense that if +PROBE-FILE signals an error for some other reason, this code +will interpret it incorrectly. Unfortunately, the CLISP documentation +doesn't specify what errors might be signaled by PROBE-FILE and +probe-directory, and experimentation seems to show that they +signal simple-file-errors in most erroneous situations.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-a-shoutcast-server.html b/clones/gigamonkeys.com/book/practical-a-shoutcast-server.html new file mode 100644 index 00000000..a3c858e1 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-a-shoutcast-server.html @@ -0,0 +1,404 @@ +Practical: A Shoutcast Server

28. Practical: A Shoutcast Server

In this chapter you'll develop another important part of what will +eventually be a Web-based application for streaming MP3s, namely, the +server that implements the Shoutcast protocol for actually streaming +MP3s to clients such as iTunes, XMMS,1 or Winamp.

The Shoutcast Protocol

The Shoutcast protocol was invented by the folks at Nullsoft, the +makers of the Winamp MP3 software. It was designed to support +Internet audio broadcasting--Shoutcast DJs send audio data from their +personal computers to a central Shoutcast server that then turns +around and streams it out to any connected listeners.

The server you'll build is actually only half a true Shoutcast +server--you'll use the protocol that Shoutcast servers use to stream +MP3s to listeners, but your server will be able to serve only songs +already stored on the file system of the computer where the server is +running.

You need to worry about only two parts of the Shoutcast protocol: the +request that a client makes in order to start receiving a stream and +the format of the response, including the mechanism by which metadata +about what song is currently playing is embedded in the stream.

The initial request from the MP3 client to the Shoutcast server is +formatted as a normal HTTP request. In response, the Shoutcast server +sends an ICY response that looks like an HTTP response except with +the string "ICY"2 in place of the normal HTTP version string and with +different headers. After sending the headers and a blank line, the +server streams a potentially endless amount of MP3 data.

The only tricky thing about the Shoutcast protocol is the way +metadata about the songs being streamed is embedded in the data sent +to the client. The problem facing the Shoutcast designers was to +provide a way for the Shoutcast server to communicate new title +information to the client each time it started playing a new song so +the client could display it in its UI. (Recall from Chapter 25 that +the MP3 format doesn't make any provision for encoding metadata.) +While one of the design goals of ID3v2 had been to make it better +suited for use when streaming MP3s, the Nullsoft folks decided to go +their own route and invent a new scheme that's fairly easy to +implement on both the client side and the server side. That, of +course, was ideal for them since they were also the authors of their +own MP3 client.

Their scheme was to simply ignore the structure of MP3 data and embed +a chunk of self-delimiting metadata every n bytes. The client +would then be responsible for stripping out this metadata so it +wasn't treated as MP3 data. Since metadata sent to a client that +isn't ready for it will cause glitches in the sound, the server is +supposed to send metadata only if the client's original request +contains a special Icy-Metadata header. And in order for the client +to know how often to expect metadata, the server must send back a +header Icy-Metaint whose value is the number of bytes of MP3 data +that will be sent between each chunk of metadata.

The basic content of the metadata is a string of the form +"StreamTitle='title';" where title is the title of the +current song and can't contain single quote marks. This payload is +encoded as a length-delimited array of bytes: a single byte is sent +indicating how many 16-byte blocks follow, and then that many blocks +are sent. They contain the string payload as an ASCII string, with +the final block padded out with null bytes as necessary.

Thus, the smallest legal metadata chunk is a single byte, zero, +indicating zero subsequent blocks. If the server doesn't need to +update the metadata, it can send such an empty chunk, but it must +send at least the one byte so the client doesn't throw away actual +MP3 data.

Song Sources

Because a Shoutcast server has to keep streaming songs to the client +for as long as it's connected, you need to provide your server with a +source of songs to draw on. In the Web-based application, each +connected client will have a playlist that can be manipulated via the +Web interface. But in the interest of avoiding excessive coupling, +you should define an interface that the Shoutcast server can use to +obtain songs to play. You can write a simple implementation of this +interface now and then a more complex one as part of the Web +application you'll build in Chapter 29.

The Package

The idea behind the interface is that the Shoutcast server will find +a source of songs based on an ID extracted from the AllegroServe +request object. It can then do three things with the song source it's +given.

  • Get the current song from the source
  • Tell the song source that it's done with the current song
  • Ask the source whether the song it was given earlier is still +the current song

The last operation is necessary because there may be ways--and will be +in Chapter 29--to manipulate the songs source outside the Shoutcast +server. You can express the operations the Shoutcast server needs with +the following generic functions:

(defgeneric current-song (source)
+  (:documentation "Return the currently playing song or NIL."))
+
+(defgeneric maybe-move-to-next-song (song source)
+  (:documentation
+   "If the given song is still the current one update the value
+returned by current-song."))
+
+(defgeneric still-current-p (song source)
+  (:documentation
+   "Return true if the song given is the same as the current-song."))

The function maybe-move-to-next-song is defined the way it is +so a single operation checks whether the song is current and, if it +is, moves the song source to the next song. This will be important in +the next chapter when you need to implement a song source that can be +safely manipulated from two different threads.3

To represent the information about a song that the Shoutcast server +needs, you can define a class, song, with slots to hold the +name of the MP3 file, the title to send in the Shoutcast metadata, +and the size of the ID3 tag so you can skip it when serving up the +file.

(defclass song ()
+  ((file     :reader file     :initarg :file)
+   (title    :reader title    :initarg :title)
+   (id3-size :reader id3-size :initarg :id3-size)))

The value returned by current-song (and thus the first +argument to still-current-p and +maybe-move-to-next-song) will be an instance of song.

In addition, you need to define a generic function that the server +can use to find a song source based on the type of source desired and +the request object. Methods will specialize the type parameter +in order to return different kinds of song source and will pull +whatever information they need from the request object to determine +which source to return.

(defgeneric find-song-source (type request)
+  (:documentation "Find the song-source of the given type for the given request."))

However, for the purposes of this chapter, you can use a trivial +implementation of this interface that always uses the same object, a +simple queue of song objects that you can manipulate from the REPL. +You can start by defining a class, simple-song-queue, and a +global variable, *songs*, that holds an instance of this +class.

(defclass simple-song-queue ()
+  ((songs :accessor songs :initform (make-array 10 :adjustable t :fill-pointer 0))
+   (index :accessor index :initform 0)))
+
+(defparameter *songs* (make-instance 'simple-song-queue))

Then you can define a method on find-song-source that +specializes type with an EQL specializer on the symbol +singleton and returns the instance stored in *songs*.

(defmethod find-song-source ((type (eql 'singleton)) request)
+  (declare (ignore request))
+  *songs*)

Now you just need to implement methods on the three generic functions +that the Shoutcast server will use.

(defmethod current-song ((source simple-song-queue))
+  (when (array-in-bounds-p (songs source) (index source))
+    (aref (songs source) (index source))))
+
+(defmethod still-current-p (song (source simple-song-queue))
+  (eql song (current-song source)))
+
+(defmethod maybe-move-to-next-song (song (source simple-song-queue))
+  (when (still-current-p song source)
+    (incf (index source))))

And for testing purposes you should provide a way to add songs to +this queue.

(defun add-file-to-songs (file)
+  (vector-push-extend (file->song file) (songs *songs*)))
+
+(defun file->song (file)
+  (let ((id3 (read-id3 file)))
+    (make-instance 
+     'song
+     :file (namestring (truename file))
+     :title (format nil "~a by ~a from ~a" (song id3) (artist id3) (album id3))
+     :id3-size (size id3))))

Implementing Shoutcast

Now you're ready to implement the Shoutcast server. Since the +Shoutcast protocol is loosely based on HTTP, you can implement the +server as a function within AllegroServe. However, since you need to +interact with some of the low-level features of AllegroServe, you +can't use the define-url-function macro from Chapter 26. +Instead, you need to write a regular function that looks like this:

(defun shoutcast (request entity)
+  (with-http-response
+      (request entity :content-type "audio/MP3" :timeout *timeout-seconds*)
+    (prepare-icy-response request *metadata-interval*)
+    (let ((wants-metadata-p (header-slot-value request :icy-metadata)))
+      (with-http-body (request entity)
+        (play-songs 
+         (request-socket request)
+         (find-song-source *song-source-type* request)
+         (if wants-metadata-p *metadata-interval*))))))

Then publish that function under the path /stream.mp3 like +this:4

(publish :path "/stream.mp3" :function 'shoutcast)

In the call to with-http-response, in addition to the usual +request and entity arguments, you need to pass +:content-type and :timeout arguments. The +:content-type argument tells AllegroServe how to set the +Content-Type header it sends. And the :timeout argument +specifies the number of seconds AllegroServe gives the function to +generate its response. By default AllegroServe times out each request +after five minutes. Because you're going to stream an essentially +endless sequence of MP3s, you need much more time. There's no way to +tell AllegroServe to never time out the request, so you should +set it to the value of *timeout-seconds*, which you can define +to some suitably large value such as the number of seconds in ten +years.

(defparameter *timeout-seconds* (* 60 60 24 7 52 10))

Then, within the body of the with-http-response and before the +call to with-http-body that will cause the response headers to +be sent, you need to manipulate the reply that AllegroServe will +send. The function prepare-icy-response encapsulates the +necessary manipulations: changing the protocol string from the +default of "HTTP" to "ICY" and adding the Shoutcast-specific +headers.5 You also need, +in order to work around a bug in iTunes, to tell AllegroServe not to +use chunked transfer-encoding.6 The functions request-reply-protocol-string, +request-uri, and reply-header-slot-value are all part +of AllegroServe.

(defun prepare-icy-response (request metadata-interval)
+  (setf (request-reply-protocol-string request) "ICY")
+  (loop for (k v) in (reverse
+       `((:|icy-metaint| ,(princ-to-string metadata-interval))
+         (:|icy-notice1| "<BR>This stream blah blah blah<BR>")
+         (:|icy-notice2| "More blah")
+         (:|icy-name|    "MyLispShoutcastServer")
+         (:|icy-genre|   "Unknown")
+         (:|icy-url|     ,(request-uri request))
+         (:|icy-pub|     "1")))
+     do (setf (reply-header-slot-value request k) v))
+  ;; iTunes, despite claiming to speak HTTP/1.1, doesn't understand
+  ;; chunked Transfer-encoding. Grrr. So we just turn it off.
+  (turn-off-chunked-transfer-encoding request))
+
+(defun turn-off-chunked-transfer-encoding (request)
+  (setf (request-reply-strategy request)
+        (remove :chunked (request-reply-strategy request))))

Within the with-http-body of shoutcast, you actually +stream the MP3 data. The function play-songs takes the stream +to which it should write the data, the song source, and the metadata +interval it should use or NIL if the client doesn't want +metadata. The stream is the socket obtained from the request object, +the song source is obtained by calling find-song-source, and +the metadata interval comes from the global variable +*metadata-interval*. The type of song source is controlled by +the variable *song-source-type*, which for now you can set to +singleton in order to use the simple-song-queue you +implemented previously.

(defparameter *metadata-interval* (expt 2 12))
+
+(defparameter *song-source-type* 'singleton)

The function play-songs itself doesn't do much--it loops +calling the function play-current, which does all the heavy +lifting of sending the contents of a single MP3 file, skipping the ID3 +tag and embedding ICY metadata. The only wrinkle is that you need to +keep track of when to send the metadata.

Since you must send metadata chunks at a fixed intervals, regardless +of when you happen to switch from one MP3 file to the next, each time +you call play-current you need to tell it when the next +metadata is due, and when it returns, it must tell you the same thing +so you can pass the information to the next call to +play-current. If play-current gets NIL from the +song source, it returns NIL, which allows the play-songs +LOOP to end.

In addition to handling the looping, play-songs also provides +a HANDLER-CASE to trap the error that will be signaled when the +MP3 client disconnects from the server and one of the writes to the +socket, down in play-current, fails. Since the +HANDLER-CASE is outside the LOOP, handling the error will +break out of the loop, allowing play-songs to return.

(defun play-songs (stream song-source metadata-interval)
+  (handler-case 
+      (loop
+         for next-metadata = metadata-interval
+         then (play-current 
+               stream 
+               song-source
+               next-metadata
+               metadata-interval)
+         while next-metadata)
+    (error (e) (format *trace-output* "Caught error in play-songs: ~a" e))))

Finally, you're ready to implement play-current, which +actually sends the Shoutcast data. The basic idea is that you get the +current song from the song source, open the song's file, and then +loop reading data from the file and writing it to the socket until +either you reach the end of the file or the current song is no longer +the current song.

There are only two complications: One is that you need to make sure +you send the metadata at the correct interval. The other is that if +the file starts with an ID3 tag, you want to skip it. If you don't +worry too much about I/O efficiency, you can implement +play-current like this:

(defun play-current (out song-source next-metadata metadata-interval)
+  (let ((song (current-song song-source)))
+    (when song
+      (let ((metadata (make-icy-metadata (title song))))
+        (with-open-file (mp3 (file song))
+          (unless (file-position mp3 (id3-size song))
+            (error "Can't skip to position ~d in ~a" (id3-size song) (file song)))
+          (loop for byte = (read-byte mp3 nil nil)
+             while (and byte (still-current-p song song-source)) do
+               (write-byte byte out)
+               (decf next-metadata)
+             when (and (zerop next-metadata) metadata-interval) do
+               (write-sequence metadata out)
+               (setf next-metadata metadata-interval))
+
+          (maybe-move-to-next-song song song-source)))
+      next-metadata)))

This function gets the current song from the song source and gets a +buffer containing the metadata it'll need to send by passing the +title to make-icy-metadata. Then it opens the file and skips +past the ID3 tag using the two-argument form of FILE-POSITION. +Then it commences reading bytes from the file and writing them to the +request stream.7

It'll break out of the loop either when it reaches the end of the +file or when the song source's current song changes out from under +it. In the meantime, whenever next-metadata gets to zero (if +you're supposed to send metadata at all), it writes metadata +to the stream and resets next-metadata. Once it finishes the +loop, it checks to see if the song is still the song source's current +song; if it is, that means it broke out of the loop because it read +the whole file, in which case it tells the song source to move to the +next song. Otherwise, it broke out of the loop because someone +changed the current song out from under it, and it just returns. In +either case, it returns the number of bytes left before the next +metadata is due so it can be passed in the next call to +play-current.8

The function make-icy-metadata, which takes the title of the +current song and generates an array of bytes containing a properly +formatted chunk of ICY metadata, is also straightforward.9

(defun make-icy-metadata (title)
+  (let* ((text (format nil "StreamTitle='~a';" (substitute #\Space #\' title)))
+         (blocks (ceiling (length text) 16))
+         (buffer (make-array (1+ (* blocks 16))
+                             :element-type '(unsigned-byte 8)
+                             :initial-element 0)))
+    (setf (aref buffer 0) blocks)
+    (loop 
+       for char across text
+       for i from 1 
+       do (setf (aref buffer i) (char-code char)))
+    buffer))

Depending on how your particular Lisp implementation handles its +streams, and also how many MP3 clients you want to serve at once, the +simple version of play-current may or may not be efficient +enough.

The potential problem with the simple implementation is that you have +to call READ-BYTE and WRITE-BYTE for every byte you +transfer. It's possible that each call may result in a relatively +expensive system call to read or write one byte. And even if Lisp +implements its own streams with internal buffering so not every call +to READ-BYTE or WRITE-BYTE results in a system call, +function calls still aren't free. In particular, in implementations +that provide user-extensible streams using so-called Gray Streams, +READ-BYTE and WRITE-BYTE may result in a generic function +call under the covers to dispatch on the class of the stream +argument. While generic function dispatch is normally speedy enough +that you don't have to worry about it, it's a bit more expensive than +a nongeneric function call and thus not something you necessarily +want to do several million times in a few minutes if you can avoid +it.

A more efficient, if slightly more complex, way to implement +play-current is to read and write multiple bytes at a time +using the functions READ-SEQUENCE and WRITE-SEQUENCE. This +also gives you a chance to match your file reads with the natural +block size of the file system, which will likely give you the best +disk throughput. Of course, no matter what buffer size you use, +keeping track of when to send the metadata becomes a bit more +complicated. A more efficient version of play-current that +uses READ-SEQUENCE and WRITE-SEQUENCE might look like this:

(defun play-current (out song-source next-metadata metadata-interval)
+  (let ((song (current-song song-source)))
+    (when song
+      (let ((metadata (make-icy-metadata (title song)))
+            (buffer (make-array size :element-type '(unsigned-byte 8))))
+        (with-open-file (mp3 (file song))
+          (labels ((write-buffer (start end)
+                     (if metadata-interval
+                       (write-buffer-with-metadata start end)
+                       (write-sequence buffer out :start start :end end)))
+
+                   (write-buffer-with-metadata (start end)
+                     (cond
+                       ((> next-metadata (- end start))
+                        (write-sequence buffer out :start start :end end)
+                        (decf next-metadata (- end start)))
+                       (t 
+                        (let ((middle (+ start next-metadata)))
+                          (write-sequence buffer out :start start :end middle)
+                          (write-sequence metadata out)
+                          (setf next-metadata metadata-interval)
+                          (write-buffer-with-metadata middle end))))))
+
+            (multiple-value-bind (skip-blocks skip-bytes)
+                (floor (id3-size song) (length buffer))
+
+              (unless (file-position mp3 (* skip-blocks (length buffer)))
+                (error "Couldn't skip over ~d ~d byte blocks."
+                       skip-blocks (length buffer)))
+
+              (loop for end = (read-sequence buffer mp3) 
+                 for start = skip-bytes then 0
+                 do (write-buffer start end)
+                 while (and (= end (length buffer))
+                            (still-current-p song song-source)))
+
+              (maybe-move-to-next-song song song-source)))))
+      next-metadata)))

Now you're ready to put all the pieces together. In the next chapter +you'll write a Web interface to the Shoutcast server developed in +this chapter, using the MP3 database from Chapter 27 as the source of +songs. +


1The version of XMMS shipped +with Red Hat 8.0 and 9.0 and Fedora no longer knows how to play MP3s +because the folks at Red Hat were worried about the licensing issues +related to the MP3 codec. To get an XMMS with MP3 support on these +versions of Linux, you can grab the source from +http://www.xmms.org and build it yourself. Or, see +http://www.fedorafaq.org/#xmms-mp3 for information about other +possibilities.

2To further confuse matters, there's a different +streaming protocol called Icecast. There seems to be no +connection between the ICY header used by Shoutcast and the Icecast +protocol.

3Technically, the +implementation in this chapter will also be manipulated from two +threads--the AllegroServe thread running the Shoutcast server and the +REPL thread. But you can live with the race condition for now. I'll +discuss how to use locking to make code thread safe in the next +chapter.

4Another thing you may want to do while working on this +code is to evaluate the form (net.aserve::debug-on :notrap). +This tells AllegroServe to not trap errors signaled by your code, +which will allow you to debug them in the normal Lisp debugger. In +SLIME this will pop up a SLIME debugger buffer just like any other +error.

5Shoutcast headers are usually sent in lowercase, so you +need to escape the names of the keyword symbols used to identify them +to AllegroServe to keep the Lisp reader from converting them to all +uppercase. Thus, you'd write :|icy-metaint| rather than +:icy-metaint. You could also write +:\i\c\y-\m\e\t\a\i\n\t, but that'd be silly.

6The function +turn-off-chunked-transfer-encoding is a bit of a kludge. +There's no way to turn off chunked transfer encoding via +AllegroServe's official APIs without specifying a content length +because any client that advertises itself as an HTTP/1.1 client, +which iTunes does, is supposed to understand it. But this does the +trick.

7Most MP3-playing software will display the +metadata somewhere in the user interface. However, the XMMS program +on Linux by default doesn't. To get XMMS to display Shoutcast +metadata, press Ctrl+P to see the Preferences pane. Then in the Audio +I/O Plugins tab (the leftmost tab in version 1.2.10), select the MPEG +Layer 1/2/3 Player (libmpg123.so) and hit the Configure +button. Then select the Streaming tab on the configuration window, +and at the bottom of the tab in the SHOUTCAST/Icecast section, check +the "Enable SHOUTCAST/Icecast title streaming" box.

8Folks coming to Common Lisp from Scheme +might wonder why play-current can't just call itself +recursively. In Scheme that would work fine since Scheme +implementations are required by the Scheme specification to support +"an unbounded number of active tail calls." Common Lisp +implementations are allowed to have this property, but it isn't +required by the language standard. Thus, in Common Lisp the idiomatic +way to write loops is with a looping construct, not with recursion.

9This +function assumes, as has other code you've written, that your Lisp +implementation's internal character encoding is ASCII or a superset +of ASCII, so you can use CHAR-CODE to translate Lisp +CHARACTER objects to bytes of ASCII data.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-a-simple-database.html b/clones/gigamonkeys.com/book/practical-a-simple-database.html new file mode 100644 index 00000000..dfd8cdc7 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-a-simple-database.html @@ -0,0 +1,709 @@ +Practical: A Simple Database

3. Practical: A Simple Database

Obviously, before you can start building real software in Lisp, +you'll have to learn the language. But let's face it--you may be +thinking, "'Practical Common Lisp,' isn't that an oxymoron? Why +should you be expected to bother learning all the details of a +language unless it's actually good for something you care about?" So +I'll start by giving you a small example of what you can do with +Common Lisp. In this chapter you'll write a simple database for +keeping track of CDs. You'll use similar techniques in Chapter 27 +when you build a database of MP3s for our streaming MP3 server. In +fact, you could think of this as part of the MP3 software +project--after all, in order to have a bunch of MP3s to listen to, it +might be helpful to be able to keep track of which CDs you have and +which ones you need to rip.

In this chapter, I'll cover just enough Lisp as we go along for you +to understand how the code works. But I'll gloss over quite a few +details. For now you needn't sweat the small stuff--the next several +chapters will cover all the Common Lisp constructs used here, and +more, in a much more systematic way.

One terminology note: I'll discuss a handful of Lisp operators in +this chapter. In Chapter 4, you'll learn that Common Lisp provides +three distinct kinds of operators: functions, macros, and +special operators. For the purposes of this chapter, you don't +really need to know the difference. I will, however, refer to +different operators as functions or macros or special operators as +appropriate, rather than trying to hide the details behind the word +operator. For now you can treat function, macro, and +special operator as all more or less equivalent.1

Also, keep in mind that I won't bust out all the most sophisticated +Common Lisp techniques for your very first post-"hello, world" +program. The point of this chapter isn't that this is how you would +write a database in Lisp; rather, the point is for you to get an idea +of what programming in Lisp is like and to see how even a relatively +simple Lisp program can be quite featureful.

CDs and Records

To keep track of CDs that need to be ripped to MP3s and which CDs +should be ripped first, each record in the database will contain the +title and artist of the CD, a rating of how much the user likes it, +and a flag saying whether it has been ripped. So, to start with, +you'll need a way to represent a single database record (in other +words, one CD). Common Lisp gives you lots of choices of data +structures from a simple four-item list to a user-defined class, +using the Common Lisp Object System (CLOS).

For now you can stay at the simple end of the spectrum and use a +list. You can make a list with the LIST function, which, +appropriately enough, returns a list of its arguments.

CL-USER> (list 1 2 3)
+(1 2 3)

You could use a four-item list, mapping a given position in the list +to a given field in the record. However, another flavor of +list--called a property list, or plist for short--is even +more convenient. A plist is a list where every other element, +starting with the first, is a symbol that describes what the next +element in the list is. I won't get into all the details of exactly +what a symbol is right now; basically it's a name. For the symbols +that name the fields in the CD database, you can use a particular +kind of symbol, called a keyword symbol. A keyword is any name +that starts with a colon (:), for instance, :foo. +Here's an example of a plist using the keyword symbols :a, +:b, and :c as property names:

CL-USER> (list :a 1 :b 2 :c 3)
+(:A 1 :B 2 :C 3)

Note that you can create a property list with the same LIST +function as you use to create other lists; it's the contents that +make it a plist.

The thing that makes plists a convenient way to represent the records +in a database is the function GETF, which takes a plist and a +symbol and returns the value in the plist following the symbol, +making a plist a sort of poor man's hash table. Lisp has real hash +tables too, but plists are sufficient for your needs here and can +more easily be saved to a file, which will come in handy later.

CL-USER> (getf (list :a 1 :b 2 :c 3) :a)
+1
+CL-USER> (getf (list :a 1 :b 2 :c 3) :c)
+3

Given all that, you can easily enough write a function make-cd +that will take the four fields as arguments and return a plist +representing that CD.

(defun make-cd (title artist rating ripped)
+  (list :title title :artist artist :rating rating :ripped ripped))

The word DEFUN tells us that this form is defining a new +function. The name of the function is make-cd. After the name +comes the parameter list. This function has four parameters: +title, artist, rating, and ripped. +Everything after the parameter list is the body of the function. In +this case the body is just one form, a call to LIST. When +make-cd is called, the arguments passed to the call will be +bound to the variables in the parameter list. For instance, to make a +record for the CD Roses by Kathy Mattea, you might call +make-cd like this:

CL-USER> (make-cd "Roses" "Kathy Mattea" 7 t)
+(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T) 

Filing CDs

A single record, however, does not a database make. You need some +larger construct to hold the records. Again, for simplicity's sake, a +list seems like a good choice. Also for simplicity you can use a +global variable, *db*, which you can define with the +DEFVAR macro. The asterisks (*) in the name are a Lisp naming +convention for global variables.2

(defvar *db* nil)

You can use the PUSH macro to add items to *db*. But it's +probably a good idea to abstract things a tiny bit, so you should +define a function add-record that adds a record to the +database.

(defun add-record (cd) (push cd *db*))

Now you can use add-record and make-cd together to add +CDs to the database.

CL-USER> (add-record (make-cd "Roses" "Kathy Mattea" 7 t))
+((:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T))
+CL-USER> (add-record (make-cd "Fly" "Dixie Chicks" 8 t))
+((:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T)
+ (:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T))
+CL-USER> (add-record (make-cd "Home" "Dixie Chicks" 9 t))
+((:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
+ (:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T)
+ (:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T))

The stuff printed by the REPL after each call to add-record is +the return value, which is the value returned by the last expression +in the function body, the PUSH. And PUSH returns the new +value of the variable it's modifying. So what you're actually seeing +is the value of the database after the record has been added.

Looking at the Database Contents

You can also see the current value of *db* whenever you want +by typing *db* at the REPL.

CL-USER> *db*
+((:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
+ (:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T)
+ (:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T))

However, that's not a very satisfying way of looking at the output. +You can write a dump-db function that dumps out the database +in a more human-readable format, like this:

TITLE:    Home
+ARTIST:   Dixie Chicks
+RATING:   9
+RIPPED:   T
+
+TITLE:    Fly
+ARTIST:   Dixie Chicks
+RATING:   8
+RIPPED:   T
+
+TITLE:    Roses
+ARTIST:   Kathy Mattea
+RATING:   7
+RIPPED:   T

The function looks like this:

(defun dump-db ()
+  (dolist (cd *db*)
+    (format t "~{~a:~10t~a~%~}~%" cd)))

This function works by looping over all the elements of *db* +with the DOLIST macro, binding each element to the variable +cd in turn. For each value of cd, you use the +FORMAT function to print it.

Admittedly, the FORMAT call is a little cryptic. However, +FORMAT isn't particularly more complicated than C or Perl's +printf function or Python's string-% operator. In +Chapter 18 I'll discuss FORMAT in greater detail. For now we can +take this call bit by bit. As you saw in Chapter 2, FORMAT takes +at least two arguments, the first being the stream where it sends its +output; t is shorthand for the stream +*standard-output*.

The second argument to FORMAT is a format string that can +contain both literal text and directives telling FORMAT things +such as how to interpolate the rest of its arguments. Format +directives start with ~ (much the way printf's +directives start with %). FORMAT understands dozens of +directives, each with their own set of options.3 However, for now I'll just focus on the ones you need to write +dump-db.

The ~a directive is the aesthetic directive; it means to +consume one argument and output it in a human-readable form. This +will render keywords without the leading : and strings without +quotation marks. For instance:

CL-USER> (format t "~a" "Dixie Chicks")
+Dixie Chicks
+NIL

or:

CL-USER> (format t "~a" :title)
+TITLE
+NIL

The ~t directive is for tabulating. The ~10t tells +FORMAT to emit enough spaces to move to the tenth column before +processing the next ~a. A ~t doesn't consume any +arguments.

CL-USER> (format t "~a:~10t~a" :artist "Dixie Chicks")
+ARTIST:   Dixie Chicks
+NIL

Now things get slightly more complicated. When FORMAT sees +~{ the next argument to be consumed must be a list. +FORMAT loops over that list, processing the directives between +the ~{ and ~}, consuming as many elements of the list +as needed each time through the list. In dump-db, the +FORMAT loop will consume one keyword and one value from the list +each time through the loop. The ~% directive doesn't consume +any arguments but tells FORMAT to emit a newline. Then after the +~} ends the loop, the last ~% tells FORMAT to emit +one more newline to put a blank line between each CD.

Technically, you could have also used FORMAT to loop over the +database itself, turning our dump-db function into a +one-liner.

(defun dump-db ()
+  (format t "~{~{~a:~10t~a~%~}~%~}" *db*))

That's either very cool or very scary depending on your point of +view.

Improving the User Interaction

While our add-record function works fine for adding records, +it's a bit Lispy for the casual user. And if they want to add a bunch +of records, it's not very convenient. So you may want to write a +function to prompt the user for information about a set of CDs. Right +away you know you'll need some way to prompt the user for a piece of +information and read it. So let's write that.

(defun prompt-read (prompt)
+  (format *query-io* "~a: " prompt)
+  (force-output *query-io*)
+  (read-line *query-io*))

You use your old friend FORMAT to emit a prompt. Note that +there's no ~% in the format string, so the cursor will stay on +the same line. The call to FORCE-OUTPUT is necessary in some +implementations to ensure that Lisp doesn't wait for a newline before +it prints the prompt.

Then you can read a single line of text with the aptly named +READ-LINE function. The variable *query-io* is a global +variable (which you can tell because of the * naming +convention for global variables) that contains the input stream +connected to the terminal. The return value of prompt-read +will be the value of the last form, the call to READ-LINE, which +returns the string it read (without the trailing newline.)

You can combine your existing make-cd function with +prompt-read to build a function that makes a new CD record +from data it gets by prompting for each value in turn.

(defun prompt-for-cd ()
+  (make-cd
+   (prompt-read "Title")
+   (prompt-read "Artist")
+   (prompt-read "Rating")
+   (prompt-read "Ripped [y/n]")))

That's almost right. Except prompt-read returns a string, +which, while fine for the Title and Artist fields, isn't so great for +the Rating and Ripped fields, which should be a number and a boolean. +Depending on how sophisticated a user interface you want, you can go +to arbitrary lengths to validate the data the user enters. For now +let's lean toward the quick and dirty: you can wrap the +prompt-read for the rating in a call to Lisp's +PARSE-INTEGER function, like this:

(parse-integer (prompt-read "Rating"))

Unfortunately, the default behavior of PARSE-INTEGER is to +signal an error if it can't parse an integer out of the string or if +there's any non-numeric junk in the string. However, it takes an +optional keyword argument :junk-allowed, which tells it to +relax a bit.

(parse-integer (prompt-read "Rating") :junk-allowed t)

But there's still one problem: if it can't find an integer amidst all +the junk, PARSE-INTEGER will return NIL rather than a +number. In keeping with the quick-and-dirty approach, you may just +want to call that 0 and continue. Lisp's OR macro is just the +thing you need here. It's similar to the "short-circuiting" || +in Perl, Python, Java, and C; it takes a series of expressions, +evaluates them one at a time, and returns the first non-nil value (or +NIL if they're all NIL). So you can use the following:

(or (parse-integer (prompt-read "Rating") :junk-allowed t) 0)

to get a default value of 0.

Fixing the code to prompt for Ripped is quite a bit simpler. You can +just use the Common Lisp function Y-OR-N-P.

(y-or-n-p "Ripped [y/n]: ")

In fact, this will be the most robust part of prompt-for-cd, +as Y-OR-N-P will reprompt the user if they enter something that +doesn't start with y, Y, n, or N.

Putting those pieces together you get a reasonably robust +prompt-for-cd function.

(defun prompt-for-cd ()
+  (make-cd
+   (prompt-read "Title")
+   (prompt-read "Artist")
+   (or (parse-integer (prompt-read "Rating") :junk-allowed t) 0)
+   (y-or-n-p "Ripped [y/n]: ")))

Finally, you can finish the "add a bunch of CDs" interface by +wrapping prompt-for-cd in a function that loops until the user +is done. You can use the simple form of the LOOP macro, which +repeatedly executes a body of expressions until it's exited by a call +to RETURN. For example:

(defun add-cds ()
+  (loop (add-record (prompt-for-cd))
+      (if (not (y-or-n-p "Another? [y/n]: ")) (return))))

Now you can use add-cds to add some more CDs to the database.

CL-USER> (add-cds)
+Title: Rockin' the Suburbs
+Artist: Ben Folds
+Rating: 6
+Ripped  [y/n]: y
+Another?  [y/n]: y
+Title: Give Us a Break
+Artist: Limpopo
+Rating: 10
+Ripped  [y/n]: y
+Another?  [y/n]: y
+Title: Lyle Lovett
+Artist: Lyle Lovett
+Rating: 9
+Ripped  [y/n]: y
+Another?  [y/n]: n
+NIL

Saving and Loading the Database

Having a convenient way to add records to the database is nice. But +it's not so nice that the user is going to be very happy if they have +to reenter all the records every time they quit and restart Lisp. +Luckily, with the data structures you're using to represent the data, +it's trivially easy to save the data to a file and reload it later. +Here's a save-db function that takes a filename as an argument +and saves the current state of the database:

(defun save-db (filename)
+  (with-open-file (out filename
+                   :direction :output
+                   :if-exists :supersede)
+    (with-standard-io-syntax
+      (print *db* out))))

The WITH-OPEN-FILE macro opens a file, binds the stream to a +variable, executes a set of expressions, and then closes the file. It +also makes sure the file is closed even if something goes wrong while +evaluating the body. The list directly after WITH-OPEN-FILE +isn't a function call but rather part of the syntax defined by +WITH-OPEN-FILE. It contains the name of the variable that will +hold the file stream to which you'll write within the body of +WITH-OPEN-FILE, a value that must be a file name, and then some +options that control how the file is opened. Here you specify that +you're opening the file for writing with :direction :output +and that you want to overwrite an existing file of the same name if +it exists with :if-exists :supersede.

Once you have the file open, all you have to do is print the contents +of the database with (print *db* out). Unlike FORMAT, +PRINT prints Lisp objects in a form that can be read back in by +the Lisp reader. The macro WITH-STANDARD-IO-SYNTAX ensures that +certain variables that affect the behavior of PRINT are set to +their standard values. You'll use the same macro when you read the +data back in to make sure the Lisp reader and printer are operating +compatibly.

The argument to save-db should be a string containing the name +of the file where the user wants to save the database. The exact form +of the string will depend on what operating system they're using. For +instance, on a Unix box they should be able to call save-db +like this:

CL-USER> (save-db "~/my-cds.db")
+((:TITLE "Lyle Lovett" :ARTIST "Lyle Lovett" :RATING 9 :RIPPED T)
+ (:TITLE "Give Us a Break" :ARTIST "Limpopo" :RATING 10 :RIPPED T)
+ (:TITLE "Rockin' the Suburbs" :ARTIST "Ben Folds" :RATING 6 :RIPPED
+  T)
+ (:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
+ (:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T)
+ (:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 9 :RIPPED T))

On Windows, the filename might be something like +"c:/my-cds.db" or "c:\\my-cds.db."4

You can open this file in any text editor to see what it looks like. +You should see something a lot like what the REPL prints if you type +*db*.

The function to load the database back in is similar.

(defun load-db (filename)
+  (with-open-file (in filename)
+    (with-standard-io-syntax
+      (setf *db* (read in)))))

This time you don't need to specify :direction in the options +to WITH-OPEN-FILE, since you want the default of :input. +And instead of printing, you use the function READ to read from +the stream in. This is the same reader used by the REPL and +can read any Lisp expression you could type at the REPL prompt. +However, in this case, you're just reading and saving the expression, +not evaluating it. Again, the WITH-STANDARD-IO-SYNTAX macro +ensures that READ is using the same basic syntax that +save-db did when it PRINTed the data.

The SETF macro is Common Lisp's main assignment operator. It +sets its first argument to the result of evaluating its second +argument. So in load-db the *db* variable will contain +the object read from the file, namely, the list of lists written by +save-db. You do need to be careful about one +thing--load-db clobbers whatever was in *db* before the +call. So if you've added records with add-record or +add-cds that haven't been saved with save-db, you'll +lose them.

Querying the Database

Now that you have a way to save and reload the database to go along +with a convenient user interface for adding new records, you soon may +have enough records that you won't want to be dumping out the whole +database just to look at what's in it. What you need is a way to +query the database. You might like, for instance, to be able to write +something like this:

(select :artist "Dixie Chicks")

and get a list of all the records where the artist is the Dixie +Chicks. Again, it turns out that the choice of saving the records in +a list will pay off.

The function REMOVE-IF-NOT takes a predicate and a list and +returns a list containing only the elements of the original list that +match the predicate. In other words, it has removed all the elements +that don't match the predicate. However, REMOVE-IF-NOT doesn't +really remove anything--it creates a new list, leaving the original +list untouched. It's like running grep over a file. The predicate +argument can be any function that accepts a single argument and +returns a boolean value--NIL for false and anything else for +true.

For instance, if you wanted to extract all the even elements from a +list of numbers, you could use REMOVE-IF-NOT as follows:

CL-USER> (remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10))
+(2 4 6 8 10)

In this case, the predicate is the function EVENP, which returns +true if its argument is an even number. The funny notation #' +is shorthand for "Get me the function with the following name." +Without the #', Lisp would treat evenp as the name of a +variable and look up the value of the variable, not the function.

You can also pass REMOVE-IF-NOT an anonymous function. For +instance, if EVENP didn't exist, you could write the previous +expression as the following:

CL-USER> (remove-if-not #'(lambda (x) (= 0 (mod x 2))) '(1 2 3 4 5 6 7 8 9 10))
+(2 4 6 8 10)

In this case, the predicate is this anonymous function:

(lambda (x) (= 0 (mod x 2)))

which checks that its argument is equal to 0 modulus 2 (in other +words, is even). If you wanted to extract only the odd numbers using +an anonymous function, you'd write this:

CL-USER> (remove-if-not #'(lambda (x) (= 1 (mod x 2))) '(1 2 3 4 5 6 7 8 9 10))
+(1 3 5 7 9)

Note that lambda isn't the name of the function--it's the +indicator you're defining an anonymous function.5 Other than the lack of a name, however, a LAMBDA +expression looks a lot like a DEFUN: the word lambda is +followed by a parameter list, which is followed by the body of the +function.

To select all the Dixie Chicks' albums in the database using +REMOVE-IF-NOT, you need a function that returns true when the +artist field of a record is "Dixie Chicks". Remember that we +chose the plist representation for the database records because the +function GETF can extract named fields from a plist. So assuming +cd is the name of a variable holding a single database record, +you can use the expression (getf cd :artist) to extract the +name of the artist. The function EQUAL, when given string +arguments, compares them character by character. So (equal +(getf cd :artist) "Dixie Chicks") will test whether the artist field +of a given CD is equal to "Dixie Chicks". All you need to do +is wrap that expression in a LAMBDA form to make an anonymous +function and pass it to REMOVE-IF-NOT.

CL-USER> (remove-if-not
+  #'(lambda (cd) (equal (getf cd :artist) "Dixie Chicks")) *db*)
+((:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
+ (:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T))

Now suppose you want to wrap that whole expression in a function that +takes the name of the artist as an argument. You can write that like +this:

(defun select-by-artist (artist)
+  (remove-if-not
+   #'(lambda (cd) (equal (getf cd :artist) artist))
+   *db*))

Note how the anonymous function, which contains code that won't run +until it's invoked in REMOVE-IF-NOT, can nonetheless refer to +the variable artist. In this case the anonymous function +doesn't just save you from having to write a regular function--it +lets you write a function that derives part of its meaning--the value +of artist--from the context in which it's embedded.

So that's select-by-artist. However, selecting by artist is +only one of the kinds of queries you might like to support. You +could write several more functions, such as +select-by-title, select-by-rating, +select-by-title-and-artist, and so on. But they'd all be about +the same except for the contents of the anonymous function. You can +instead make a more general select function that takes a +function as an argument.

(defun select (selector-fn)
+  (remove-if-not selector-fn *db*))

So what happened to the #'? Well, in this case you don't want +REMOVE-IF-NOT to use the function named selector-fn. You +want it to use the anonymous function that was passed as an argument +to select in the variable selector-fn. Though, the +#' comes back in the call to select.

CL-USER> (select #'(lambda (cd) (equal (getf cd :artist) "Dixie Chicks")))
+((:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
+ (:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T))

But that's really quite gross-looking. Luckily, you can wrap up the +creation of the anonymous function.

(defun artist-selector (artist)
+  #'(lambda (cd) (equal (getf cd :artist) artist)))

This is a function that returns a function and one that references a +variable that--it seems--won't exist after artist-selector +returns.6 It may seem odd now, but it actually works just the way +you'd want--if you call artist-selector with an argument of +"Dixie Chicks", you get an anonymous function that matches CDs +whose :artist field is "Dixie Chicks", and if you call +it with "Lyle Lovett", you get a different function that will +match against an :artist field of "Lyle Lovett". So now +you can rewrite the call to select like this:

CL-USER> (select (artist-selector "Dixie Chicks"))
+((:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
+ (:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T))

Now you just need some more functions to generate selectors. But just +as you don't want to have to write select-by-title, +select-by-rating, and so on, because they would all be quite +similar, you're not going to want to write a bunch of nearly +identical selector-function generators, one for each field. Why not +write one general-purpose selector-function generator, a function +that, depending on what arguments you pass it, will generate a +selector function for different fields or maybe even a combination of +fields? You can write such a function, but first you need a crash +course in a feature called keyword parameters.

In the functions you've written so far, you've specified a simple +list of parameters, which are bound to the corresponding arguments in +the call to the function. For instance, the following function:

(defun foo (a b c) (list a b c))

has three parameters, a, b, and c, and must be +called with three arguments. But sometimes you may want to write a +function that can be called with varying numbers of arguments. +Keyword parameters are one way to achieve this. A version of +foo that uses keyword parameters might look like this:

(defun foo (&key a b c) (list a b c))

The only difference is the &key at the beginning of the +argument list. However, the calls to this new foo will look +quite different. These are all legal calls with the result to the +right of the ==>:

(foo :a 1 :b 2 :c 3)  ==> (1 2 3)
+(foo :c 3 :b 2 :a 1)  ==> (1 2 3)
+(foo :a 1 :c 3)       ==> (1 NIL 3)
+(foo)                 ==> (NIL NIL NIL)

As these examples show, the value of the variables a, b, +and c are bound to the values that follow the corresponding +keyword. And if a particular keyword isn't present in the call, the +corresponding variable is set to NIL. I'm glossing over a bunch +of details of how keyword parameters are specified and how they relate +to other kinds of parameters, but you need to know one more detail.

Normally if a function is called with no argument for a particular +keyword parameter, the parameter will have the value NIL. +However, sometimes you'll want to be able to distinguish between a +NIL that was explicitly passed as the argument to a keyword +parameter and the default value NIL. To allow this, when you +specify a keyword parameter you can replace the simple name with a +list consisting of the name of the parameter, a default value, and +another parameter name, called a supplied-p parameter. The +supplied-p parameter will be set to true or false depending on +whether an argument was actually passed for that keyword parameter in +a particular call to the function. Here's a version of foo +that uses this feature:

(defun foo (&key a (b 20) (c 30 c-p)) (list a b c c-p))

Now the same calls from earlier yield these results:

(foo :a 1 :b 2 :c 3)  ==> (1 2 3 T)
+(foo :c 3 :b 2 :a 1)  ==> (1 2 3 T)
+(foo :a 1 :c 3)       ==> (1 20 3 T)
+(foo)                 ==> (NIL 20 30 NIL)

The general selector-function generator, which you can call +where for reasons that will soon become apparent if you're +familiar with SQL databases, is a function that takes four keyword +parameters corresponding to the fields in our CD records and +generates a selector function that selects any CDs that match all the +values given to where. For instance, it will let you say +things like this:

(select (where :artist "Dixie Chicks"))

or this:

(select (where :rating 10 :ripped nil))

The function looks like this:

(defun where (&key title artist rating (ripped nil ripped-p))
+  #'(lambda (cd)
+      (and
+       (if title    (equal (getf cd :title)  title)  t)
+       (if artist   (equal (getf cd :artist) artist) t)
+       (if rating   (equal (getf cd :rating) rating) t)
+       (if ripped-p (equal (getf cd :ripped) ripped) t))))

This function returns an anonymous function that returns the logical +AND of one clause per field in our CD records. Each clause +checks if the appropriate argument was passed in and then either +compares it to the value in the corresponding field in the CD record +or returns t, Lisp's version of truth, if the parameter wasn't +passed in. Thus, the selector function will return t only for +CDs that match all the arguments passed to where.7 Note that you need to use a three-item list to specify +the keyword parameter ripped because you need to know whether +the caller actually passed :ripped nil, meaning, "Select CDs +whose ripped field is nil," or whether they left out :ripped +altogether, meaning "I don't care what the value of the ripped field +is."

Updating Existing Records--Another Use for WHERE

Now that you've got nice generalized select and where +functions, you're in a good position to write the next feature that +every database needs--a way to update particular records. In SQL the +update command is used to update a set of records matching a +particular where clause. That seems like a good model, +especially since you've already got a where-clause generator. +In fact, the update function is mostly just the application of +a few ideas you've already seen: using a passed-in selector function +to choose the records to update and using keyword arguments to +specify the values to change. The main new bit is the use of a +function MAPCAR that maps over a list, *db* in this case, +and returns a new list containing the results of calling a function +on each item in the original list.

(defun update (selector-fn &key title artist rating (ripped nil ripped-p))
+  (setf *db*
+        (mapcar
+         #'(lambda (row)
+             (when (funcall selector-fn row)
+               (if title    (setf (getf row :title) title))
+               (if artist   (setf (getf row :artist) artist))
+               (if rating   (setf (getf row :rating) rating))
+               (if ripped-p (setf (getf row :ripped) ripped)))
+             row) *db*)))

One other new bit here is the use of SETF on a complex form such +as (getf row :title). I'll discuss SETF in greater detail +in Chapter 6, but for now you just need to know that it's a general +assignment operator that can be used to assign lots of "places" other +than just variables. (It's a coincidence that SETF and GETF +have such similar names--they don't have any special relationship.) +For now it's enough to know that after (setf (getf row :title) +title), the plist referenced by row will have the value of the +variable title following the property name :title. With +this update function if you decide that you really dig the +Dixie Chicks and that all their albums should go to 11, you can +evaluate the following form:

CL-USER> (update (where :artist "Dixie Chicks") :rating 11)
+NIL

And it is so.

CL-USER> (select (where :artist "Dixie Chicks"))
+((:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 11 :RIPPED T)
+ (:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 11 :RIPPED T))

You can even more easily add a function to delete rows from the +database.

(defun delete-rows (selector-fn)
+  (setf *db* (remove-if selector-fn *db*)))

The function REMOVE-IF is the complement of REMOVE-IF-NOT; +it returns a list with all the elements that do match the predicate +removed. Like REMOVE-IF-NOT, it doesn't actually affect the list +it's passed but by saving the result back into *db*, +delete-rows8 actually changes the contents of the +database.9

Removing Duplication and Winning Big

So far all the database code supporting insert, +select, update, and delete, not to mention a command-line user +interface for adding new records and dumping out the contents, is +just a little more than 50 lines. Total.10

Yet there's still some annoying code duplication. And it turns out you +can remove the duplication and make the code more flexible at the same +time. The duplication I'm thinking of is in the where function. The +body of the where function is a bunch of clauses like this, one +per field:

(if title (equal (getf cd :title) title) t)

Right now it's not so bad, but like all code duplication it has the +same cost: if you want to change how it works, you have to change +multiple copies. And if you change the fields in a CD, you'll have to +add or remove clauses to where. And update suffers from +the same kind of duplication. It's doubly annoying since the whole +point of the where function is to dynamically generate a bit +of code that checks the values you care about; why should it have to +do work at runtime checking whether title was even passed in?

Imagine that you were trying to optimize this code and discovered +that it was spending too much time checking whether title and +the rest of the keyword parameters to where were even +set?11 If you really wanted to +remove all those runtime checks, you could go through a program and +find all the places you call where and look at exactly what +arguments you're passing. Then you could replace each call to +where with an anonymous function that does only the +computation necessary. For instance, if you found this snippet of +code:

(select (where :title "Give Us a Break" :ripped t))

you could change it to this:

(select
+ #'(lambda (cd)
+     (and (equal (getf cd :title) "Give Us a Break")
+          (equal (getf cd :ripped) t))))

Note that the anonymous function is different from the one that +where would have returned; you're not trying to save the call +to where but rather to provide a more efficient selector +function. This anonymous function has clauses only for the fields +that you actually care about at this call site, so it doesn't do any +extra work the way a function returned by where might.

You can probably imagine going through all your source code and +fixing up all the calls to where in this way. But you can +probably also imagine that it would be a huge pain. If there were +enough of them, and it was important enough, it might even be +worthwhile to write some kind of preprocessor that converts +where calls to the code you'd write by hand.

The Lisp feature that makes this trivially easy is its macro system. +I can't emphasize enough that the Common Lisp macro shares +essentially nothing but the name with the text-based macros found in +C and C++. Where the C pre-processor operates by textual substitution +and understands almost nothing of the structure of C and C++, a Lisp +macro is essentially a code generator that gets run for you +automatically by the compiler.12 When +a Lisp expression contains a call to a macro, instead of evaluating +the arguments and passing them to the function, the Lisp compiler +passes the arguments, unevaluated, to the macro code, which returns a +new Lisp expression that is then evaluated in place of the original +macro call.

I'll start with a simple, and silly, example and then show how you +can replace the where function with a where macro. +Before I can write this example macro, I need to quickly introduce +one new function: REVERSE takes a list as an argument and +returns a new list that is its reverse. So (reverse '(1 2 3)) +evaluates to (3 2 1). Now let's create a macro.

(defmacro backwards (expr) (reverse expr))

The main syntactic difference between a function and a macro is that +you define a macro with DEFMACRO instead of DEFUN. After +that a macro definition consists of a name, just like a function, a +parameter list, and a body of expressions, both also like a function. +However, a macro has a totally different effect. You can use this +macro as follows:

CL-USER> (backwards ("hello, world" t format))
+hello, world
+NIL

How did that work? When the REPL started to evaluate the +backwards expression, it recognized that backwards is +the name of a macro. So it left the expression ("hello, world" +t format) unevaluated, which is good because it isn't a legal Lisp +form. It then passed that list to the backwards code. The code +in backwards passed the list to REVERSE, which returned +the list (format t "hello, world"). backwards then +passed that value back out to the REPL, which then evaluated it in +place of the original expression.

The backwards macro thus defines a new language that's a lot +like Lisp--just backward--that you can drop into anytime simply by +wrapping a backward Lisp expression in a call to the backwards +macro. And, in a compiled Lisp program, that new language is just as +efficient as normal Lisp because all the macro code--the code that +generates the new expression--runs at compile time. In other words, +the compiler will generate exactly the same code whether you write +(backwards ("hello, world" t format)) or (format t +"hello, world").

So how does that help with the code duplication in where? +Well, you can write a macro that generates exactly the code you need +for each particular call to where. Again, the best approach is +to build our code bottom up. In the hand-optimized selector function, +you had an expression of the following form for each actual field +referred to in the original call to where:

(equal (getf cd field) value)

So let's write a function that, given the name of a field and a +value, returns such an expression. Since an expression is just a +list, you might think you could write something like this:

(defun make-comparison-expr (field value)    ; wrong
+  (list equal (list getf cd field) value))

However, there's one trick here: as you know, when Lisp sees a simple +name such as field or value other than as the first +element of a list, it assumes it's the name of a variable and looks +up its value. That's fine for field and value; it's +exactly what you want. But it will treat equal, getf, +and cd the same way, which isn't what you want. However, +you also know how to stop Lisp from evaluating a form: stick a single +forward quote (') in front of it. So if you write +make-comparison-expr like this, it will do what you want:

(defun make-comparison-expr (field value)
+  (list 'equal (list 'getf 'cd field) value))

You can test it out in the REPL.

CL-USER> (make-comparison-expr :rating 10)
+(EQUAL (GETF CD :RATING) 10)
+CL-USER> (make-comparison-expr :title "Give Us a Break")
+(EQUAL (GETF CD :TITLE) "Give Us a Break")

It turns out that there's an even better way to do it. What you'd +really like is a way to write an expression that's mostly not +evaluated and then have some way to pick out a few expressions that +you do want evaluated. And, of course, there's just such a +mechanism. A back quote (`) before an expression stops +evaluation just like a forward quote.

CL-USER> `(1 2 3)
+(1 2 3)
+CL-USER> '(1 2 3)
+(1 2 3)

However, in a back-quoted expression, any subexpression that's +preceded by a comma is evaluated. Notice the effect of the comma in +the second expression:

`(1 2 (+ 1 2))        ==> (1 2 (+ 1 2))
+`(1 2 ,(+ 1 2))       ==> (1 2 3)

Using a back quote, you can write make-comparison-expr like +this:

(defun make-comparison-expr (field value)
+  `(equal (getf cd ,field) ,value))

Now if you look back to the hand-optimized selector function, you can +see that the body of the function consisted of one comparison +expression per field/value pair, all wrapped in an AND +expression. Assume for the moment that you'll arrange for the +arguments to the where macro to be passed as a single list. +You'll need a function that can take the elements of such a list +pairwise and collect the results of calling +make-comparison-expr on each pair. To implement that function, +you can dip into the bag of advanced Lisp tricks and pull out the +mighty and powerful LOOP macro.

(defun make-comparisons-list (fields)
+  (loop while fields
+     collecting (make-comparison-expr (pop fields) (pop fields))))

A full discussion of LOOP will have to wait until Chapter 22; +for now just note that this LOOP expression does exactly what +you need: it loops while there are elements left in the fields +list, popping off two at a time, passing them to +make-comparison-expr, and collecting the results to be +returned at the end of the loop. The POP macro performs the +inverse operation of the PUSH macro you used to add records to +*db*.

Now you just need to wrap up the list returned by +make-comparison-list in an AND and an anonymous +function, which you can do in the where macro itself. Using a +back quote to make a template that you fill in by interpolating the +value of make-comparisons-list, it's trivial.

(defmacro where (&rest clauses)
+  `#'(lambda (cd) (and ,@(make-comparisons-list clauses))))

This macro uses a variant of , (namely, the ,@) before +the call to make-comparisons-list. The ,@ "splices" the +value of the following expression--which must evaluate to a +list--into the enclosing list. You can see the difference between +, and ,@ in the following two expressions:

`(and ,(list 1 2 3))   ==> (AND (1 2 3))
+`(and ,@(list 1 2 3))  ==> (AND 1 2 3)

You can also use ,@ to splice into the middle of a list.

`(and ,@(list 1 2 3) 4) ==> (AND 1 2 3 4)

The other important feature of the where macro is the use of +&rest in the argument list. Like &key, &rest +modifies the way arguments are parsed. With a &rest in its +parameter list, a function or macro can take an arbitrary number of +arguments, which are collected into a single list that becomes the +value of the variable whose name follows the &rest. So if you +call where like this:

(where :title "Give Us a Break" :ripped t)

the variable clauses will contain the list.

(:title "Give Us a Break" :ripped t)

This list is passed to make-comparisons-list, which returns a +list of comparison expressions. You can see exactly what code a call +to where will generate using the function MACROEXPAND-1. +If you pass MACROEXPAND-1, a form representing a macro call, it +will call the macro code with appropriate arguments and return the +expansion. So you can check out the previous where call like +this:

CL-USER> (macroexpand-1 '(where :title "Give Us a Break" :ripped t))
+#'(LAMBDA (CD)
+    (AND (EQUAL (GETF CD :TITLE) "Give Us a Break")
+         (EQUAL (GETF CD :RIPPED) T)))
+T

Looks good. Let's try it for real.

CL-USER> (select (where :title "Give Us a Break" :ripped t))
+((:TITLE "Give Us a Break" :ARTIST "Limpopo" :RATING 10 :RIPPED T))

It works. And the where macro with its two helper functions is +actually one line shorter than the old where function. And +it's more general in that it's no longer tied to the specific fields +in our CD records.

Wrapping Up

Now, an interesting thing has happened. You removed duplication and +made the code more efficient and more general at the same time. +That's often the way it goes with a well-chosen macro. This makes +sense because a macro is just another mechanism for creating +abstractions--abstraction at the syntactic level, and abstractions are +by definition more concise ways of expressing underlying generalities. +Now the only code in the mini-database that's specific to CDs and the +fields in them is in the make-cd, prompt-for-cd, and +add-cd functions. In fact, our new where macro would +work with any plist-based database.

However, this is still far from being a complete database. You can +probably think of plenty of features to add, such as supporting +multiple tables or more elaborate queries. In Chapter 27 we'll build +an MP3 database that incorporates some of those features.

The point of this chapter was to give you a quick introduction to +just a handful of Lisp's features and show how they're used to write +code that's a bit more interesting than "hello, world." In the next +chapter we'll begin a more systematic overview of Lisp. +


1Before I +proceed, however, it's crucially important that you forget anything +you may know about #define-style "macros" as implemented in the C +pre-processor. Lisp macros are a totally different beast.

2Using a global variable also +has some drawbacks--for instance, you can have only one database at a +time. In Chapter 27, with more of the language under your belt, +you'll be ready to build a more flexible database. You'll also see, +in Chapter 6, how even using a global variable is more flexible in +Common Lisp than it may be in other languages.

3One of the +coolest FORMAT directives is the ~R directive. Ever want +to know how to say a really big number in English words? Lisp knows. +Evaluate this:

(format nil "~r" 1606938044258990275541962092)

and you should get back (wrapped for legibility):

"one octillion six hundred six septillion nine hundred thirty-eight +sextillion forty-four quintillion two hundred fifty-eight +quadrillion nine hundred ninety trillion two hundred seventy-five +billion five hundred forty-one million nine hundred sixty-two +thousand ninety-two"

4Windows +actually understands forward slashes in filenames even though it +normally uses a backslash as the directory separator. This is +convenient since otherwise you have to write double backslashes +because backslash is the escape character in Lisp strings.

5The word lambda +is used in Lisp because of an early connection to the lambda +calculus, a mathematical formalism invented for studying mathematical +functions.

6The technical term for a function that references a +variable in its enclosing scope is a closure because the function +"closes over" the variable. I'll discuss closures in more detail in +Chapter 6.

7Note +that in Lisp, an IF form, like everything else, is an expression that +returns a value. It's actually more like the ternary operator +(?:) in Perl, Java, and C in that this is legal in those +languages:

some_var = some_boolean ? value1 : value2;

while this isn't:

some_var = if (some_boolean) value1; else value2;

because in those languages, if is a statement, not an +expression.

8You need to use the name delete-rows +rather than the more obvious delete because there's already a +function in Common Lisp called DELETE. The Lisp package system +gives you a way to deal with such naming conflicts, so you could have +a function named delete if you wanted. But I'm not ready to explain +packages just yet.

9If you're worried that this code creates a memory +leak, rest assured: Lisp was the language that invented garbage +collection (and heap allocation for that matter). The memory used by +the old value of *db* will be automatically reclaimed, +assuming no one else is holding on to a reference to it, which none +of this code is.

10A friend of mine was +once interviewing an engineer for a programming job and asked him a +typical interview question: how do you know when a function or method +is too big? Well, said the candidate, I don't like any method to be +bigger than my head. You mean you can't keep all the details in your +head? No, I mean I put my head up against my monitor, and the code +shouldn't be bigger than my head.

11It's unlikely that the cost of checking whether keyword +parameters had been passed would be a detectible drag on performance +since checking whether a variable is NIL is going to be pretty +cheap. On the other hand, these functions returned by where +are going to be right in the middle of the inner loop of any +select, update, or delete-rows call, as they +have to be called once per entry in the database. Anyway, for +illustrative purposes, this will have to do.

12Macros are also run by the +interpreter--however, it's easier to understand the point of macros +when you think about compiled code. As with everything else in this +chapter, I'll cover this in greater detail in future chapters.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-a-spam-filter.html b/clones/gigamonkeys.com/book/practical-a-spam-filter.html new file mode 100644 index 00000000..d9612049 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-a-spam-filter.html @@ -0,0 +1,789 @@ +Practical: A Spam Filter

23. Practical: A Spam Filter

In 2002 Paul Graham, having some time on his hands after selling +Viaweb to Yahoo, wrote the essay "A Plan for Spam"1 that +launched a minor revolution in spam-filtering technology. Prior to +Graham's article, most spam filters were written in terms of +handcrafted rules: if a message has XXX in the subject, it's +probably a spam; if a message has a more than three or more words in a +row in ALL CAPITAL LETTERS, it's probably a spam. Graham spent several +months trying to write such a rule-based filter before realizing it +was fundamentally a soul-sucking task.

To recognize individual spam features you have to try to get into +the mind of the spammer, and frankly I want to spend as little time +inside the minds of spammers as possible.

To avoid having to think like a spammer, Graham decided to try +distinguishing spam from nonspam, a.k.a. ham, based on statistics +gathered about which words occur in which kinds of e-mails. The +filter would keep track of how often specific words appear in both +spam and ham messages and then use the frequencies associated with +the words in a new message to compute a probability that it was +either spam or ham. He called his approach Bayesian filtering +after the statistical technique that he used to combine the +individual word frequencies into an overall probability.2

The Heart of a Spam Filter

In this chapter, you'll implement the core of a spam-filtering +engine. You won't write a soup-to-nuts spam-filtering application; +rather, you'll focus on the functions for classifying new messages +and training the filter.

This application is going to be large enough that it's worth defining +a new package to avoid name conflicts. For instance, in the source +code you can download from this book's Web site, I use the package +name COM.GIGAMONKEYS.SPAM, defining a package that uses both +the standard COMMON-LISP package and the +COM.GIGAMONKEYS.PATHNAMES package from Chapter 15, like this:

(defpackage :com.gigamonkeys.spam
+  (:use :common-lisp :com.gigamonkeys.pathnames))

Any file containing code for this application should start with this +line:

(in-package :com.gigamonkeys.spam)

You can use the same package name or replace com.gigamonkeys +with some domain you control.3

You can also type this same form at the REPL to switch to this package +to test the functions you write. In SLIME this will change the prompt +from CL-USER> to SPAM> like this:

CL-USER> (in-package :com.gigamonkeys.spam)
+#<The COM.GIGAMONKEYS.SPAM package>
+SPAM> 

Once you have a package defined, you can start on the actual code. +The main function you'll need to implement has a simple job--take the +text of a message as an argument and classify the message as spam, +ham, or unsure. You can easily implement this basic function by +defining it in terms of other functions that you'll write in a +moment.

(defun classify (text)
+  (classification (score (extract-features text))))

Reading from the inside out, the first step in classifying a message +is to extract features to pass to the score function. In +score you'll compute a value that can then be translated into +one of three classifications--spam, ham, or unsure--by the function +classification. Of the three functions, classification +is the simplest. You can assume score will return a value near +1 if the message is a spam, near 0 if it's a ham, and near .5 if it's +unclear.

Thus, you can implement classification like this:

(defparameter *max-ham-score* .4)
+(defparameter *min-spam-score* .6)
+
+(defun classification (score)
+  (cond
+    ((<= score *max-ham-score*) 'ham)
+    ((>= score *min-spam-score*) 'spam)
+    (t 'unsure)))

The extract-features function is almost as straightforward, +though it requires a bit more code. For the moment, the features +you'll extract will be the words appearing in the text. For each +word, you need to keep track of the number of times it has been seen +in a spam and the number of times it has been seen in a ham. A +convenient way to keep those pieces of data together with the word +itself is to define a class, word-feature, with three slots.

(defclass word-feature ()
+  ((word       
+    :initarg :word
+    :accessor word
+    :initform (error "Must supply :word")
+    :documentation "The word this feature represents.")
+   (spam-count
+    :initarg :spam-count
+    :accessor spam-count
+    :initform 0
+    :documentation "Number of spams we have seen this feature in.")
+   (ham-count
+    :initarg :ham-count
+    :accessor ham-count
+    :initform 0
+    :documentation "Number of hams we have seen this feature in.")))

You'll keep the database of features in a hash table so you can +easily find the object representing a given feature. You can define a +special variable, *feature-database*, to hold a reference to +this hash table.

(defvar *feature-database* (make-hash-table :test #'equal))

You should use DEFVAR rather than DEFPARAMETER because you +don't want *feature-database* to be reset if you happen to +reload the file containing this definition during development--you +might have data stored in *feature-database* that you don't +want to lose. Of course, that means if you do want to clear out +the feature database, you can't just reevaluate the DEFVAR form. +So you should define a function clear-database.

(defun clear-database ()
+  (setf *feature-database* (make-hash-table :test #'equal)))

To find the features present in a given message, the code will need +to extract the individual words and then look up the corresponding +word-feature object in *feature-database*. If +*feature-database* contains no such feature, it'll need to +create a new word-feature to represent the word. You can +encapsulate that bit of logic in a function, intern-feature, +that takes a word and returns the appropriate feature, creating it if +necessary.

(defun intern-feature (word)
+  (or (gethash word *feature-database*)
+      (setf (gethash word *feature-database*)
+            (make-instance 'word-feature :word word))))

You can extract the individual words from the message text using a +regular expression. For example, using the Common Lisp Portable +Perl-Compatible Regular Expression (CL-PPCRE) library written by Edi +Weitz, you can write extract-words like this:4

(defun extract-words (text)
+  (delete-duplicates
+   (cl-ppcre:all-matches-as-strings "[a-zA-Z]{3,}" text)
+   :test #'string=))

Now all that remains to implement extract-features is to put +extract-features and intern-feature together. Since +extract-words returns a list of strings and you want a list +with each string translated to the corresponding word-feature, +this is a perfect time to use MAPCAR.

(defun extract-features (text)
+  (mapcar #'intern-feature (extract-words text)))

You can test these functions at the REPL like this:

SPAM> (extract-words "foo bar baz")
+("foo" "bar" "baz")

And you can make sure the DELETE-DUPLICATES is working like this:

SPAM> (extract-words "foo bar baz foo bar")
+("baz" "foo" "bar")

You can also test extract-features.

SPAM> (extract-features "foo bar baz foo bar")
+(#<WORD-FEATURE @ #x71ef28da> #<WORD-FEATURE @ #x71e3809a>
+ #<WORD-FEATURE @ #x71ef28aa>)

However, as you can see, the default method for printing arbitrary +objects isn't very informative. As you work on this program, it'll be +useful to be able to print word-feature objects in a less +opaque way. Luckily, as I mentioned in Chapter 17, the printing of +all objects is implemented in terms of a generic function +PRINT-OBJECT, so to change the way word-feature objects +are printed, you just need to define a method on PRINT-OBJECT +that specializes on word-feature. To make implementing such +methods easier, Common Lisp provides the macro +PRINT-UNREADABLE-OBJECT.5

The basic form of PRINT-UNREADABLE-OBJECT is as follows:

(print-unreadable-object (object stream-variable &key type identity)
+  body-form*)

The object argument is an expression that evaluates to the object +to be printed. Within the body of PRINT-UNREADABLE-OBJECT, +stream-variable is bound to a stream to which you can print +anything you want. Whatever you print to that stream will be output +by PRINT-UNREADABLE-OBJECT and enclosed in the standard syntax +for unreadable objects, #<>.6

PRINT-UNREADABLE-OBJECT also lets you include the type of the +object and an indication of the object's identity via the keyword +parameters type and identity. If they're non-NIL, the +output will start with the name of the object's class and end with an +indication of the object's identity similar to what's printed by the +default PRINT-OBJECT method for STANDARD-OBJECTs. For +word-feature, you probably want to define a PRINT-OBJECT +method that includes the type but not the identity along with the +values of the word, ham-count, and spam-count +slots. Such a method would look like this:

(defmethod print-object ((object word-feature) stream)
+  (print-unreadable-object (object stream :type t)
+    (with-slots (word ham-count spam-count) object
+      (format stream "~s :hams ~d :spams ~d" word ham-count spam-count))))

Now when you test extract-features at the REPL, you can see +more clearly what features are being extracted.

SPAM> (extract-features "foo bar baz foo bar")
+(#<WORD-FEATURE "baz" :hams 0 :spams 0>
+ #<WORD-FEATURE "foo" :hams 0 :spams 0>
+ #<WORD-FEATURE "bar" :hams 0 :spams 0>)

Training the Filter

Now that you have a way to keep track of individual features, you're +almost ready to implement score. But first you need to write +the code you'll use to train the spam filter so score will +have some data to use. You'll define a function, train, that +takes some text and a symbol indicating what kind of message it +is--ham or spam--and that increments either the ham +count or the spam count of all the features present in the text as +well as a global count of hams or spams processed. Again, you can +take a top-down approach and implement it in terms of other functions +that don't yet exist.

(defun train (text type)
+  (dolist (feature (extract-features text))
+    (increment-count feature type))
+  (increment-total-count type))

You've already written extract-features, so next up is +increment-count, which takes a word-feature and a +message type and increments the appropriate slot of the feature. +Since there's no reason to think that the logic of incrementing these +counts is going to change for different kinds of objects, you can +write this as a regular function.7 Because you defined both ham-count and +spam-count with an :accessor option, you can use +INCF and the accessor functions created by DEFCLASS to +increment the appropriate slot.

(defun increment-count (feature type)
+  (ecase type
+    (ham (incf (ham-count feature)))
+    (spam (incf (spam-count feature)))))

The ECASE construct is a variant of CASE, both of which are +similar to case statements in Algol-derived languages (renamed +switch in C and its progeny). They both evaluate their first +argument--the key form--and then find the clause whose first +element--the key--is the same value according to EQL. In +this case, that means the variable type is evaluated, yielding +whatever value was passed as the second argument to +increment-count.

The keys aren't evaluated. In other words, the value of type +will be compared to the literal objects read by the Lisp reader as +part of the ECASE form. In this function, that means the keys +are the symbols ham and spam, not the values of any +variables named ham and spam. So, if +increment-count is called like this:

(increment-count some-feature 'ham)

the value of type will be the symbol ham, and the first +branch of the ECASE will be evaluated and the feature's ham +count incremented. On the other hand, if it's called like this:

(increment-count some-feature 'spam)

then the second branch will run, incrementing the spam count. Note +that the symbols ham and spam are quoted when calling +increment-count since otherwise they'd be evaluated as the +names of variables. But they're not quoted when they appear in +ECASE since ECASE doesn't evaluate the +keys.8

The E in ECASE stands for "exhaustive" or "error," meaning +ECASE should signal an error if the key value is anything other +than one of the keys listed. The regular CASE is looser, +returning NIL if no matching clause is found.

To implement increment-total-count, you need to decide where +to store the counts; for the moment, two more special variables, +*total-spams* and *total-hams*, will do fine.

(defvar *total-spams* 0)
+(defvar *total-hams* 0)
+
+(defun increment-total-count (type)
+  (ecase type
+    (ham (incf *total-hams*))
+    (spam (incf *total-spams*))))

You should use DEFVAR to define these two variables for the same +reason you used it with *feature-database*--they'll hold data +built up while you run the program that you don't necessarily want to +throw away just because you happen to reload your code during +development. But you'll want to reset those variables if you ever +reset *feature-database*, so you should add a few lines to +clear-database as shown here:

(defun clear-database ()
+  (setf
+   *feature-database* (make-hash-table :test #'equal)
+   *total-spams* 0
+   *total-hams* 0))

Per-Word Statistics

The heart of a statistical spam filter is, of course, the functions +that compute statistics-based probabilities. The mathematical +nuances9 of why exactly these computations work are beyond the +scope of this book--interested readers may want to refer to several +papers by Gary Robinson.10 I'll focus rather on how they're implemented.

The starting point for the statistical computations is the set of +measured values--the frequencies stored in *feature-database*, +*total-spams*, and *total-hams*. Assuming that the set +of messages trained on is statistically representative, you can treat +the observed frequencies as probabilities of the same features showing up +in hams and spams in future messages.

The basic plan is to classify a message by extracting the features it +contains, computing the individual probability that a given message +containing the feature is a spam, and then combining all the +individual probabilities into a total score for the message. Messages +with many "spammy" features and few "hammy" features will receive a +score near 1, and messages with many hammy features and few spammy +features will score near 0.

The first statistical function you need is one that computes the +basic probability that a message containing a given feature is a +spam. By one point of view, the probability that a given message +containing the feature is a spam is the ratio of spam messages +containing the feature to all messages containing the feature. Thus, +you could compute it this way:

(defun spam-probability (feature)
+  (with-slots (spam-count ham-count) feature
+    (/ spam-count (+ spam-count ham-count))))

The problem with the value computed by this function is that it's +strongly affected by the overall probability that any message +will be a spam or a ham. For instance, suppose you get nine times as +much ham as spam in general. A completely neutral feature will then +appear in one spam for every nine hams, giving you a spam probability +of 1/10 according to this function.

But you're more interested in the probability that a given feature +will appear in a spam message, independent of the overall probability +of getting a spam or ham. Thus, you need to divide the spam count by +the total number of spams trained on and the ham count by the total +number of hams. To avoid division-by-zero errors, if either of +*total-spams* or *total-hams* is zero, you should treat +the corresponding frequency as zero. (Obviously, if the total number +of either spams or hams is zero, then the corresponding per-feature +count will also be zero, so you can treat the resulting frequency as +zero without ill effect.)

(defun spam-probability (feature)
+  (with-slots (spam-count ham-count) feature
+    (let ((spam-frequency (/ spam-count (max 1 *total-spams*)))
+          (ham-frequency (/ ham-count (max 1 *total-hams*))))
+      (/ spam-frequency (+ spam-frequency ham-frequency)))))

This version suffers from another problem--it doesn't take into +account the number of messages analyzed to arrive at the per-word +probabilities. Suppose you've trained on 2,000 messages, half spam +and half ham. Now consider two features that have appeared only in +spams. One has appeared in all 1,000 spams, while the other appeared +only once. According to the current definition of +spam-probability, the appearance of either feature predicts +that a message is spam with equal probability, namely, 1.

However, it's still quite possible that the feature that has appeared +only once is actually a neutral feature--it's obviously rare in +either spams or hams, appearing only once in 2,000 messages. If you +trained on another 2,000 messages, it might very well appear one more +time, this time in a ham, making it suddenly a neutral feature with a +spam probability of .5.

So it seems you might like to compute a probability that somehow +factors in the number of data points that go into each feature's +probability. In his papers, Robinson suggested a function based on +the Bayesian notion of incorporating observed data into prior +knowledge or assumptions. Basically, you calculate a new probability +by starting with an assumed prior probability and a weight to give +that assumed probability before adding new information. Robinson's +function is this:

(defun bayesian-spam-probability (feature &optional
+                                  (assumed-probability 1/2)
+                                  (weight 1))
+  (let ((basic-probability (spam-probability feature))
+        (data-points (+ (spam-count feature) (ham-count feature))))
+    (/ (+ (* weight assumed-probability)
+          (* data-points basic-probability))
+       (+ weight data-points))))

Robinson suggests values of 1/2 for assumed-probability and 1 +for weight. Using those values, a feature that has appeared in +one spam and no hams has a bayesian-spam-probability of 0.75, +a feature that has appeared in 10 spams and no hams has a +bayesian-spam-probability of approximately 0.955, and one that +has matched in 1,000 spams and no hams has a spam probability of +approximately 0.9995.

Combining Probabilities

Now that you can compute the bayesian-spam-probability of each +individual feature you find in a message, the last step in implementing +the score function is to find a way to combine a bunch of +individual probabilities into a single value between 0 and 1.

If the individual feature probabilities were independent, then it'd +be mathematically sound to multiply them together to get a combined +probability. But it's unlikely they actually are independent--certain +features are likely to appear together, while others never +do.11

Robinson proposed using a method for combining probabilities invented +by the statistician R. A. Fisher. Without going into the details of +exactly why his technique works, it's this: First you combine the +probabilities by multiplying them together. This gives you a number +nearer to 0 the more low probabilities there were in the original +set. Then take the log of that number and multiply by -2. Fisher +showed in 1950 that if the individual probabilities were independent +and drawn from a uniform distribution between 0 and 1, then the +resulting value would be on a chi-square distribution. This value and +twice the number of probabilities can be fed into an inverse +chi-square function, and it'll return the probability that reflects +the likelihood of obtaining a value that large or larger by combining +the same number of randomly selected probabilities. When the inverse +chi-square function returns a low probability, it means there was a +disproportionate number of low probabilities (either a lot of +relatively low probabilities or a few very low probabilities) in the +individual probabilities.

To use this probability in determining whether a given message is a +spam, you start with a null hypothesis, a straw man you hope to +knock down. The null hypothesis is that the message being classified +is in fact just a random collection of features. If it were, then the +individual probabilities--the likelihood that each feature would +appear in a spam--would also be random. That is, a random selection +of features would usually contain some features with a high +probability of appearing in spam and other features with a low +probability of appearing in spam. If you were to combine these +randomly selected probabilities according to Fisher's method, you +should get a middling combined value, which the inverse chi-square +function will tell you is quite likely to arise just by chance, as, +in fact, it would have. But if the inverse chi-square function +returns a very low probability, it means it's unlikely the +probabilities that went into the combined value were selected at +random; there were too many low probabilities for that to be likely. +So you can reject the null hypothesis and instead adopt the +alternative hypothesis that the features involved were drawn from a +biased sample--one with few high spam probability features and many +low spam probability features. In other words, it must be a ham +message.

However, the Fisher method isn't symmetrical since the inverse +chi-square function returns the probability that a given number of +randomly selected probabilities would combine to a value as large or +larger than the one you got by combining the actual probabilities. +This asymmetry works to your advantage because when you reject the +null hypothesis, you know what the more likely hypothesis is. When +you combine the individual spam probabilities via the Fisher method, +and it tells you there's a high probability that the null hypothesis +is wrong--that the message isn't a random collection of words--then +it means it's likely the message is a ham. The number returned is, if +not literally the probability that the message is a ham, at least a +good measure of its "hamminess." Conversely, the Fisher combination +of the individual ham probabilities gives you a measure of the +message's "spamminess."

To get a final score, you need to combine those two measures into a +single number that gives you a combined hamminess-spamminess score +ranging from 0 to 1. The method recommended by Robinson is to add +half the difference between the hamminess and spamminess scores to +1/2, in other words, to average the spamminess and 1 minus the +hamminess. This has the nice effect that when the two scores agree +(high spamminess and low hamminess, or vice versa) you'll end up with +a strong indicator near either 0 or 1. But when the spamminess and +hamminess scores are both high or both low, then you'll end up with a +final value near 1/2, which you can treat as an "uncertain" +classification.

The score function that implements this scheme looks like this:

(defun score (features)
+  (let ((spam-probs ()) (ham-probs ()) (number-of-probs 0))
+    (dolist (feature features)
+      (unless (untrained-p feature)
+        (let ((spam-prob (float (bayesian-spam-probability feature) 0.0d0)))
+          (push spam-prob spam-probs)
+          (push (- 1.0d0 spam-prob) ham-probs)
+          (incf number-of-probs))))
+    (let ((h (- 1 (fisher spam-probs number-of-probs)))
+          (s (- 1 (fisher ham-probs number-of-probs))))
+      (/ (+ (- 1 h) s) 2.0d0))))

You take a list of features and loop over them, building up two lists +of probabilities, one listing the probabilities that a message +containing each feature is a spam and the other that a message +containing each feature is a ham. As an optimization, you can also +count the number of probabilities while looping over them and pass +the count to fisher to avoid having to count them again in +fisher itself. The value returned by fisher will be low +if the individual probabilities contained too many low probabilities +to have come from random text. Thus, a low fisher score for +the spam probabilities means there were many hammy features; +subtracting that score from 1 gives you a probability that the +message is a ham. Conversely, subtracting the fisher score for +the ham probabilities gives you the probability that the message was +a spam. Combining those two probabilities gives you an overall +spamminess score between 0 and 1.

Within the loop, you can use the function untrained-p to skip +features extracted from the message that were never seen during +training. These features will have spam counts and ham counts of +zero. The untrained-p function is trivial.

(defun untrained-p (feature)
+  (with-slots (spam-count ham-count) feature
+    (and (zerop spam-count) (zerop ham-count))))

The only other new function is fisher itself. Assuming you +already had an inverse-chi-square function, fisher is +conceptually simple.

(defun fisher (probs number-of-probs)
+  "The Fisher computation described by Robinson."
+  (inverse-chi-square 
+   (* -2 (log (reduce #'* probs)))
+   (* 2 number-of-probs)))

Unfortunately, there's a small problem with this straightforward +implementation. While using REDUCE is a concise and idiomatic +way of multiplying a list of numbers, in this particular application +there's a danger the product will be too small a number to be +represented as a floating-point number. In that case, the result will +underflow to zero. And if the product of the probabilities +underflows, all bets are off because taking the LOG of zero will +either signal an error or, in some implementation, result in a +special negative-infinity value, which will render all subsequent +calculations essentially meaningless. This is particularly +unfortunate in this function because the Fisher method is most +sensitive when the input probabilities are low--near zero--and +therefore in the most danger of causing the multiplication to +underflow.

Luckily, you can use a bit of high-school math to avoid this problem. +Recall that the log of a product is the same as the sum of the logs +of the factors. So instead of multiplying all the probabilities and +then taking the log, you can sum the logs of each probability. And +since REDUCE takes a :key keyword parameter, you can use +it to perform the whole calculation. Instead of this:

(log (reduce #'* probs))

write this:

(reduce #'+ probs :key #'log)

Inverse Chi Square

The implementation of inverse-chi-square in this section is a +fairly straightforward translation of a version written in Python by +Robinson. The exact mathematical meaning of this function is beyond +the scope of this book, but you can get an intuitive sense of what it +does by thinking about how the values you pass to fisher will +affect the result: the more low probabilities you pass to +fisher, the smaller the product of the probabilities will be. +The log of a small product will be a negative number with a large +absolute value, which is then multiplied by -2, making it an even +larger positive number. Thus, the more low probabilities were passed +to fisher, the larger the value it'll pass to +inverse-chi-square. Of course, the number of probabilities +involved also affects the value passed to inverse-chi-square. +Since probabilities are, by definition, less than or equal to 1, the +more probabilities that go into a product, the smaller it'll be and +the larger the value passed to inverse-chi-square. Thus, +inverse-chi-square should return a low probability when the +Fisher combined value is abnormally large for the number of +probabilities that went into it. The following function does exactly +that:

(defun inverse-chi-square (value degrees-of-freedom)
+  (assert (evenp degrees-of-freedom))
+  (min 
+   (loop with m = (/ value 2)
+      for i below (/ degrees-of-freedom 2)
+      for prob = (exp (- m)) then (* prob (/ m i))
+      summing prob)
+   1.0))

Recall from Chapter 10 that EXP raises e to the argument +given. Thus, the larger value is, the smaller the initial +value of prob will be. But that initial value will then be +adjusted upward slightly for each degree of freedom as long as +m is greater than the number of degrees of freedom. Since the +value returned by inverse-chi-square is supposed to be another +probability, it's important to clamp the value returned with MIN +since rounding errors in the multiplication and exponentiation may +cause the LOOP to return a sum just a shade over 1.

Training the Filter

Since you wrote classify and train to take a string +argument, you can test them easily at the REPL. If you haven't yet, +you should switch to the package in which you've been writing this +code by evaluating an IN-PACKAGE form at the REPL or using the +SLIME shortcut change-package. To use the SLIME shortcut, type +a comma at the REPL and then type the name at the prompt. Pressing +Tab while typing the package name will autocomplete based on the +packages your Lisp knows about. Now you can invoke any of the +functions that are part of the spam application. You should first +make sure the database is empty.

SPAM> (clear-database)

Now you can train the filter with some text.

SPAM> (train "Make money fast" 'spam)

And then see what the classifier thinks.

SPAM> (classify "Make money fast")
+SPAM
+SPAM> (classify "Want to go to the movies?")
+UNSURE

While ultimately all you care about is the classification, it'd be nice +to be able to see the raw score too. The easiest way to get both +values without disturbing any other code is to change +classification to return multiple values.

(defun classification (score)
+  (values
+   (cond
+     ((<= score *max-ham-score*) 'ham)
+     ((>= score *min-spam-score*) 'spam)
+     (t 'unsure))
+   score))

You can make this change and then recompile just this one function. +Because classify returns whatever classification +returns, it'll also now return two values. But since the primary +return value is the same, callers of either function who expect only +one value won't be affected. Now when you test classify, you +can see exactly what score went into the classification.

SPAM> (classify "Make money fast")
+SPAM
+0.863677101854273D0
+SPAM> (classify "Want to go to the movies?")
+UNSURE
+0.5D0

And now you can see what happens if you train the filter with some +more ham text.

SPAM> (train "Do you have any money for the movies?" 'ham)
+1
+SPAM> (classify "Make money fast")
+SPAM
+0.7685351219857626D0

It's still spam but a bit less certain since money was seen in +ham text.

SPAM> (classify "Want to go to the movies?")
+HAM
+0.17482223132078922D0

And now this is clearly recognizable ham thanks to the presence of +the word movies, now a hammy feature.

However, you don't really want to train the filter by hand. What +you'd really like is an easy way to point it at a bunch of files and +train it on them. And if you want to test how well the filter +actually works, you'd like to then use it to classify another set of +files of known types and see how it does. So the last bit of code +you'll write in this chapter will be a test harness that tests the +filter on a corpus of messages of known types, using a certain +fraction for training and then measuring how accurate the filter is +when classifying the remainder.

Testing the Filter

To test the filter, you need a corpus of messages of known types. You +can use messages lying around in your inbox, or you can grab one of +the corpora available on the Web. For instance, the SpamAssassin +corpus12 +contains several thousand messages hand classified as spam, easy ham, +and hard ham. To make it easy to use whatever files you have, you can +define a test rig that's driven off an array of file/type pairs. You +can define a function that takes a filename and a type and adds it to +the corpus like this:

(defun add-file-to-corpus (filename type corpus)
+  (vector-push-extend (list filename type) corpus))

The value of corpus should be an adjustable vector with a fill +pointer. For instance, you can make a new corpus like this:

(defparameter *corpus* (make-array 1000 :adjustable t :fill-pointer 0))

If you have the hams and spams already segregated into separate +directories, you might want to add all the files in a directory as +the same type. This function, which uses the list-directory +function from Chapter 15, will do the trick:

(defun add-directory-to-corpus (dir type corpus)
+  (dolist (filename (list-directory dir))
+    (add-file-to-corpus filename type corpus)))

For instance, suppose you have a directory mail containing two +subdirectories, spam and ham, each containing messages +of the indicated type; you can add all the files in those two +directories to *corpus* like this:

SPAM> (add-directory-to-corpus "mail/spam/" 'spam *corpus*)
+NIL
+SPAM> (add-directory-to-corpus "mail/ham/" 'ham *corpus*)
+NIL

Now you need a function to test the classifier. The basic strategy +will be to select a random chunk of the corpus to train on and then +test the corpus by classifying the remainder of the corpus, comparing +the classification returned by the classify function to the +known classification. The main thing you want to know is how accurate +the classifier is--what percentage of the messages are classified +correctly? But you'll probably also be interested in what messages +were misclassified and in what direction--were there more false +positives or more false negatives? To make it easy to perform +different analyses of the classifier's behavior, you should define the +testing functions to build a list of raw results, which you can then +analyze however you like.

The main testing function might look like this:

(defun test-classifier (corpus testing-fraction)
+  (clear-database)
+  (let* ((shuffled (shuffle-vector corpus))
+         (size (length corpus))
+         (train-on (floor (* size (- 1 testing-fraction)))))
+    (train-from-corpus shuffled :start 0 :end train-on)
+    (test-from-corpus shuffled :start train-on)))

This function starts by clearing out the feature database.13 +Then it shuffles the corpus, using a function you'll implement in a +moment, and figures out, based on the testing-fraction +parameter, how many messages it'll train on and how many it'll +reserve for testing. The two helper functions +train-from-corpus and test-from-corpus will both take +:start and :end keyword parameters, allowing them to +operate on a subsequence of the given corpus.

The train-from-corpus function is quite simple--simply loop +over the appropriate part of the corpus, use DESTRUCTURING-BIND +to extract the filename and type from the list found in each element, +and then pass the text of the named file and the type to +train. Since some mail messages, such as those with +attachments, are quite large, you should limit the number of +characters it'll take from the message. It'll obtain the text with a +function start-of-file, which you'll implement in a moment, +that takes a filename and a maximum number of characters to return. +train-from-corpus looks like this:

(defparameter *max-chars* (* 10 1024))
+
+(defun train-from-corpus (corpus &key (start 0) end)
+  (loop for idx from start below (or end (length corpus)) do
+        (destructuring-bind (file type) (aref corpus idx)
+          (train (start-of-file file *max-chars*) type))))

The test-from-corpus function is similar except you want to +return a list containing the results of each classification so you +can analyze them after the fact. Thus, you should capture both the +classification and score returned by classify and then collect +a list of the filename, the actual type, the type returned by +classify, and the score. To make the results more human +readable, you can include keywords in the list to indicate which +values are which.

(defun test-from-corpus (corpus &key (start 0) end)
+  (loop for idx from start below (or end (length corpus)) collect
+        (destructuring-bind (file type) (aref corpus idx)
+          (multiple-value-bind (classification score)
+              (classify (start-of-file file *max-chars*))
+            (list 
+             :file file
+             :type type
+             :classification classification
+             :score score)))))

A Couple of Utility Functions

To finish the implementation of test-classifier, you need to +write the two utility functions that don't really have anything +particularly to do with spam filtering, shuffle-vector and +start-of-file.

An easy and efficient way to implement shuffle-vector is using +the Fisher-Yates algorithm.14 You can start by implementing a +function, nshuffle-vector, that shuffles a vector in place. +This name follows the same naming convention of other destructive +functions such as NCONC and NREVERSE. It looks like this:

(defun nshuffle-vector (vector)
+  (loop for idx downfrom (1- (length vector)) to 1
+        for other = (random (1+ idx))
+        do (unless (= idx other)
+             (rotatef (aref vector idx) (aref vector other))))
+  vector)

The nondestructive version simply makes a copy of the original vector +and passes it to the destructive version.

(defun shuffle-vector (vector)
+  (nshuffle-vector (copy-seq vector)))

The other utility function, start-of-file, is almost as +straightforward with just one wrinkle. The most efficient way to read +the contents of a file into memory is to create an array of the +appropriate size and use READ-SEQUENCE to fill it in. So it +might seem you could make a character array that's either the size of +the file or the maximum number of characters you want to read, +whichever is smaller. Unfortunately, as I mentioned in Chapter 14, +the function FILE-LENGTH isn't entirely well defined when +dealing with character streams since the number of characters encoded +in a file can depend on both the character encoding used and the +particular text in the file. In the worst case, the only way to get +an accurate measure of the number of characters in a file is to +actually read the whole file. Thus, it's ambiguous what +FILE-LENGTH should do when passed a character stream; in most +implementations, FILE-LENGTH always returns the number of octets +in the file, which may be greater than the number of characters that +can be read from the file.

However, READ-SEQUENCE returns the number of characters actually +read. So, you can attempt to read the number of characters reported +by FILE-LENGTH and return a substring if the actual number of +characters read was smaller.

(defun start-of-file (file max-chars)
+  (with-open-file (in file)
+    (let* ((length (min (file-length in) max-chars))
+           (text (make-string length))
+           (read (read-sequence text in)))
+      (if (< read length)
+        (subseq text 0 read)
+        text))))

Analyzing the Results

Now you're ready to write some code to analyze the results generated +by test-classifier. Recall that test-classifier returns +the list returned by test-from-corpus in which each element is +a plist representing the result of classifying one file. This plist +contains the name of the file, the actual type of the file, the +classification, and the score returned by classify. The first +bit of analytical code you should write is a function that returns a +symbol indicating whether a given result was correct, a false +positive, a false negative, a missed ham, or a missed spam. You can +use DESTRUCTURING-BIND to pull out the :type and +:classification elements of an individual result list (using +&allow-other-keys to tell DESTRUCTURING-BIND to ignore any +other key/value pairs it sees) and then use nested ECASE to +translate the different pairings into a single symbol.

(defun result-type (result)
+  (destructuring-bind (&key type classification &allow-other-keys) result
+    (ecase type
+      (ham
+       (ecase classification
+         (ham 'correct)
+         (spam 'false-positive)
+         (unsure 'missed-ham)))
+      (spam
+       (ecase classification
+         (ham 'false-negative)
+         (spam 'correct)
+         (unsure 'missed-spam))))))

You can test out this function at the REPL.

SPAM> (result-type '(:FILE #p"foo" :type ham :classification ham :score 0))
+CORRECT
+SPAM> (result-type '(:FILE #p"foo" :type spam :classification spam :score 0))
+CORRECT
+SPAM> (result-type '(:FILE #p"foo" :type ham :classification spam :score 0))
+FALSE-POSITIVE
+SPAM> (result-type '(:FILE #p"foo" :type spam :classification ham :score 0))
+FALSE-NEGATIVE
+SPAM> (result-type '(:FILE #p"foo" :type ham :classification unsure :score 0))
+MISSED-HAM
+SPAM> (result-type '(:FILE #p"foo" :type spam :classification unsure :score 0))
+MISSED-SPAM

Having this function makes it easy to slice and dice the results of +test-classifier in a variety of ways. For instance, you can +start by defining predicate functions for each type of result.

(defun false-positive-p (result)
+  (eql (result-type result) 'false-positive))
+
+(defun false-negative-p (result)
+  (eql (result-type result) 'false-negative))
+
+(defun missed-ham-p (result)
+  (eql (result-type result) 'missed-ham))
+
+(defun missed-spam-p (result)
+  (eql (result-type result) 'missed-spam))
+
+(defun correct-p (result)
+  (eql (result-type result) 'correct))

With those functions, you can easily use the list and sequence +manipulation functions I discussed in Chapter 11 to extract and count +particular kinds of results.

SPAM> (count-if #'false-positive-p *results*)
+6
+SPAM> (remove-if-not #'false-positive-p *results*)
+((:FILE #p"ham/5349" :TYPE HAM :CLASSIFICATION SPAM :SCORE 0.9999983107355541d0)
+ (:FILE #p"ham/2746" :TYPE HAM :CLASSIFICATION SPAM :SCORE 0.6286468956619795d0)
+ (:FILE #p"ham/3427" :TYPE HAM :CLASSIFICATION SPAM :SCORE 0.9833753501352983d0)
+ (:FILE #p"ham/7785" :TYPE HAM :CLASSIFICATION SPAM :SCORE 0.9542788587998488d0)
+ (:FILE #p"ham/1728" :TYPE HAM :CLASSIFICATION SPAM :SCORE 0.684339162891261d0)
+ (:FILE #p"ham/10581" :TYPE HAM :CLASSIFICATION SPAM :SCORE 0.9999924537959615d0))

You can also use the symbols returned by result-type as keys +into a hash table or an alist. For instance, you can write a function +to print a summary of the counts and percentages of each type of +result using an alist that maps each type plus the extra symbol +total to a count.

(defun analyze-results (results)
+  (let* ((keys '(total correct false-positive 
+                 false-negative missed-ham missed-spam))
+         (counts (loop for x in keys collect (cons x 0))))
+    (dolist (item results)
+      (incf (cdr (assoc 'total counts)))
+      (incf (cdr (assoc (result-type item) counts))))
+    (loop with total = (cdr (assoc 'total counts))
+          for (label . count) in counts
+          do (format t "~&~@(~a~):~20t~5d~,5t: ~6,2f%~%"
+                     label count (* 100 (/ count total))))))

This function will give output like this when passed a list of results +generated by test-classifier:

SPAM> (analyze-results *results*)
+Total:               3761 : 100.00%
+Correct:             3689 :  98.09%
+False-positive:         4 :   0.11%
+False-negative:         9 :   0.24%
+Missed-ham:            19 :   0.51%
+Missed-spam:           40 :   1.06%
+NIL

And as a last bit of analysis you might want to look at why an +individual message was classified the way it was. The following +functions will show you:

(defun explain-classification (file)
+  (let* ((text (start-of-file file *max-chars*))
+         (features (extract-features text))
+         (score (score features))
+         (classification (classification score)))
+    (show-summary file text classification score)
+    (dolist (feature (sorted-interesting features))
+      (show-feature feature))))
+
+(defun show-summary (file text classification score)
+  (format t "~&~a" file)
+  (format t "~2%~a~2%" text)
+  (format t "Classified as ~a with score of ~,5f~%" classification score))
+
+(defun show-feature (feature)
+  (with-slots (word ham-count spam-count) feature
+    (format
+     t "~&~2t~a~30thams: ~5d; spams: ~5d;~,10tprob: ~,f~%"
+     word ham-count spam-count (bayesian-spam-probability feature))))
+
+(defun sorted-interesting (features)
+  (sort (remove-if #'untrained-p features) #'< :key #'bayesian-spam-probability))

What's Next

Obviously, you could do a lot more with this code. To turn it into a +real spam-filtering application, you'd need to find a way to +integrate it into your normal e-mail infrastructure. One approach +that would make it easy to integrate with almost any e-mail client is +to write a bit of code to act as a POP3 proxy--that's the protocol +most e-mail clients use to fetch mail from mail servers. Such a proxy +would fetch mail from your real POP3 server and serve it to your mail +client after either tagging spam with a header that your e-mail +client's filters can easily recognize or simply putting it aside. Of +course, you'd also need a way to communicate with the filter about +misclassifications--as long as you're setting it up as a server, you +could also provide a Web interface. I'll talk about how to write Web +interfaces in Chapter 26, and you'll build one, for a different +application, in Chapter 29.

Or you might want to work on improving the basic classification--a +likely place to start is to make extract-features more +sophisticated. In particular, you could make the tokenizer smarter +about the internal structure of e-mail--you could extract different +kinds of features for words appearing in the body versus the message +headers. And you could decode various kinds of message encoding such +as base 64 and quoted printable since spammers often try to obfuscate +their message with those encodings.

But I'll leave those improvements to you. Now you're ready to head +down the path of building a streaming MP3 server, starting by writing +a general-purpose library for parsing binary files.


1Available at +http://www.paulgraham.com/spam.html and also in Hackers & +Painters: Big Ideas from the Computer Age (O'Reilly, 2004)

2There +has since been some disagreement over whether the technique Graham +described was actually "Bayesian." However, the name has stuck and is +well on its way to becoming a synonym for "statistical" when talking +about spam filters.

3It would, however, be poor form to +distribute a version of this application using a package starting +with com.gigamonkeys since you don't control that domain.

4A version +of CL-PPCRE is included with the book's source code available from +the book's Web site. Or you can download it from Weitz's site at +http://www.weitz.de/cl-ppcre/.

5The main reason to use +PRINT-UNREADABLE-OBJECT is that it takes care of signaling the +appropriate error if someone tries to print your object readably, +such as with the ~S FORMAT directive.

6PRINT-UNREADABLE-OBJECT +also signals an error if it's used when the printer control variable +*PRINT-READABLY* is true. Thus, a PRINT-OBJECT method +consisting solely of a PRINT-UNREADABLE-OBJECT form will +correctly implement the PRINT-OBJECT contract with regard to +*PRINT-READABLY*.

7If you decide later that you +do need to have different versions of increment-feature for +different classes, you can redefine increment-count as a +generic function and this function as a method specialized on +word-feature.

8Technically, the key in each clause of a CASE or +ECASE is interpreted as a list designator, an object that +designates a list of objects. A single nonlist object, treated as a +list designator, designates a list containing just that one object, +while a list designates itself. Thus, each clause can have multiple +keys; CASE and ECASE will select the clause whose list of +keys contains the value of the key form. For example, if you wanted +to make good a synonym for ham and bad a synonym +for spam, you could write increment-count like this:

(defun increment-count (feature type)
+  (ecase type
+    ((ham good) (incf (ham-count feature)))
+    ((spam bad) (incf (spam-count feature)))))

9Speaking of mathematical nuances, hard-core statisticians +may be offended by the sometimes loose use of the word probability +in this chapter. However, since even the pros, who are divided between +the Bayesians and the frequentists, can't agree on what a probability +is, I'm not going to worry about it. This is a book about programming, +not statistics.

10Robinson's articles that directly +informed this chapter are "A Statistical Approach to the Spam Problem" +(published in the Linux Journal and available at +http://www.linuxjournal.com/ article.php?sid=6467 and in a +shorter form on Robinson's blog at http://radio.weblogs.com/ +0101454/stories/2002/09/16/spamDetection.html) and "Why Chi? +Motivations for the Use of Fisher's Inverse Chi-Square Procedure in +Spam Classification" (available at http://garyrob.blogs.com/ +whychi93.pdf). Another article that may be useful is "Handling +Redundancy in Email Token Probabilities" (available at +http://garyrob.blogs.com//handlingtokenredundancy94.pdf). The +archived mailing lists of the SpamBayes project +(http://spambayes.sourceforge.net/) also contain a lot of +useful information about different algorithms and approaches to +testing spam filters.

11Techniques that combine nonindependent probabilities as +though they were, in fact, independent, are called naive +Bayesian. Graham's original proposal was essentially a naive +Bayesian classifier with some "empirically derived" constant factors +thrown in.

12Several spam corpora including the SpamAssassin corpus +are linked to from +http://nexp.cs.pdx.edu/~psam/cgi-bin/view/PSAM/CorpusSets.

13If +you wanted to conduct a test without disturbing the existing +database, you could bind *feature-database*, +*total-spams*, and *total-hams* with a LET, but +then you'd have no way of looking at the database after the +fact--unless you returned the values you used within the function.

14This algorithm is named for the same +Fisher who invented the method used for combining probabilities and +for Frank Yates, his coauthor of the book Statistical Tables for +Biological, Agricultural and Medical Research (Oliver & Boyd, 1938) +in which, according to Knuth, they provided the first published +description of the algorithm.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html b/clones/gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html new file mode 100644 index 00000000..7a2be283 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html @@ -0,0 +1,616 @@ +Practical: An HTML Generation Library, the Compiler

31. Practical: An HTML Generation Library, the Compiler

Now you're ready to look at how the FOO compiler works. The main +difference between a compiler and an interpreter is that an +interpreter processes a program and directly generates some +behavior--generating HTML in the case of a FOO interpreter--but a +compiler processes the same program and generates code in some other +language that will exhibit the same behavior. In FOO, the compiler is +a Common Lisp macro that translates FOO into Common Lisp so it can be +embedded in a Common Lisp program. Compilers, in general, have the +advantage over interpreters that, because compilation happens in +advance, they can spend a bit of time optimizing the code they +generate to make it more efficient. The FOO compiler does that, +merging literal text as much as possible in order to emit the same +HTML with a smaller number of writes than the interpreter uses. When +the compiler is a Common Lisp macro, you also have the advantage that +it's easy for the language understood by the compiler to contain +embedded Common Lisp--the compiler just has to recognize it and embed +it in the right place in the generated code. The FOO compiler will +take advantage of this capability.

The Compiler

The basic architecture of the compiler consists of three layers. +First you'll implement a class html-compiler that has one slot +that holds an adjustable vector that's used to accumulate ops +representing the calls made to the generic functions in the backend +interface during the execution of process.

You'll then implement methods on the generic functions in the backend +interface that will store the sequence of actions in the vector. Each +op is represented by a list consisting of a keyword naming the +operation and the arguments passed to the function that generated the +op. The function sexp->ops implements the first phase of the +compiler, compiling a list of FOO forms by calling process on +each form with an instance of html-compiler.

This vector of ops stored by the compiler is then passed to a +function that optimizes it, merging consecutive raw-string ops +into a single op that emits the combined string in one go. The +optimization function can also, optionally, strip out ops that are +needed only for pretty printing, which is mostly important because it +allows you to merge more raw-string ops.

Finally, the optimized ops vector is passed to a third function, +generate-code, that returns a list of Common Lisp expressions +that will actually output the HTML. When *pretty* is true, +generate-code generates code that uses the methods specialized +on html-pretty-printer to output pretty HTML. When +*pretty* is NIL, it generates code that writes directly +to the stream *html-output*.

The macro html actually generates a body that contains two +expansions, one generated with *pretty* bound to T and +one with *pretty* bound to NIL. Which expansion is used +is determined by the runtime value of *pretty*. Thus, every +function that contains a call to html will contain code to +generate both pretty and compact output.

The other significant difference between the compiler and the +interpreter is that the compiler can embed Lisp forms in the code it +generates. To take advantage of that, you need to modify the +process function so it calls the embed-code and +embed-value functions when asked to process an expression +that's not a FOO form. Since all self-evaluating objects are valid +FOO forms, the only forms that won't be passed to +process-sexp-html are lists that don't match the syntax for +FOO cons forms and non-keyword symbols, the only atoms that aren't +self-evaluating. You can assume that any non-FOO cons is code to be +run inline and all symbols are variables whose value you should +embed.

(defun process (processor form)
+  (cond
+    ((sexp-html-p form) (process-sexp-html processor form))
+    ((consp form)       (embed-code processor form))
+    (t                  (embed-value processor form))))

Now let's look at the compiler code. First you should define two +functions that slightly abstract the vector you'll use to save ops in +the first two phases of compilation.

(defun make-op-buffer () (make-array 10 :adjustable t :fill-pointer 0))
+
+(defun push-op (op ops-buffer) (vector-push-extend op ops-buffer))

Next you can define the html-compiler class and the methods +specialized on it to implement the backend interface.

(defclass html-compiler ()
+  ((ops :accessor ops :initform (make-op-buffer))))
+
+(defmethod raw-string ((compiler html-compiler) string &optional newlines-p)
+  (push-op `(:raw-string ,string ,newlines-p) (ops compiler)))
+
+(defmethod newline ((compiler html-compiler))
+  (push-op '(:newline) (ops compiler)))
+
+(defmethod freshline ((compiler html-compiler))
+  (push-op '(:freshline) (ops compiler)))
+
+(defmethod indent ((compiler html-compiler))
+  (push-op `(:indent) (ops compiler)))
+
+(defmethod unindent ((compiler html-compiler))
+  (push-op `(:unindent) (ops compiler)))
+
+(defmethod toggle-indenting ((compiler html-compiler))
+  (push-op `(:toggle-indenting) (ops compiler)))
+
+(defmethod embed-value ((compiler html-compiler) value)
+  (push-op `(:embed-value ,value ,*escapes*) (ops compiler)))
+
+(defmethod embed-code ((compiler html-compiler) code)
+  (push-op `(:embed-code ,code) (ops compiler)))

With those methods defined, you can implement the first phase of the +compiler, sexp->ops.

(defun sexp->ops (body)
+  (loop with compiler = (make-instance 'html-compiler)
+     for form in body do (process compiler form)
+     finally (return (ops compiler))))

During this phase you don't need to worry about the value of +*pretty*: just record all the functions called by +process. Here's what sexp->ops makes of a simple FOO +form:

HTML> (sexp->ops '((:p "Foo")))
+#((:FRESHLINE) (:RAW-STRING "<p" NIL) (:RAW-STRING ">" NIL)
+  (:RAW-STRING "Foo" T) (:RAW-STRING "</p>" NIL) (:FRESHLINE))

The next phase, optimize-static-output, takes a vector of ops +and returns a new vector containing the optimized version. The +algorithm is simple--for each :raw-string op, it writes the +string to a temporary string buffer. Thus, consecutive +:raw-string ops will build up a single string containing the +concatenation of the strings that need to be emitted. Whenever you +encounter an op other than a :raw-string op, you convert the +built-up string into a sequence of alternating :raw-string and +:newline ops with the helper function compile-buffer +and then add the next op. This function is also where you strip out +the pretty printing ops if *pretty* is NIL.

(defun optimize-static-output (ops)
+  (let ((new-ops (make-op-buffer)))
+    (with-output-to-string (buf)
+      (flet ((add-op (op) 
+               (compile-buffer buf new-ops)
+               (push-op op new-ops)))
+        (loop for op across ops do
+             (ecase (first op)
+               (:raw-string (write-sequence (second op) buf))
+               ((:newline :embed-value :embed-code) (add-op op))
+               ((:indent :unindent :freshline :toggle-indenting)
+                (when *pretty* (add-op op)))))
+        (compile-buffer buf new-ops)))
+    new-ops))
+
+(defun compile-buffer (buf ops)
+  (loop with str = (get-output-stream-string buf)
+     for start = 0 then (1+ pos)
+     for pos = (position #\Newline str :start start)
+     when (< start (length str))
+     do (push-op `(:raw-string ,(subseq str start pos) nil) ops)
+     when pos do (push-op '(:newline) ops)
+     while pos))

The last step is to translate the ops into the corresponding Common +Lisp code. This phase also pays attention to the value of +*pretty*. When *pretty* is true, it generates code that +invokes the backend generic functions on +*html-pretty-printer*, which will be bound to an instance of +html-pretty-printer. When *pretty* is NIL, it +generates code that writes directly to *html-output*, the +stream to which the pretty printer would send its output.

The actual function, generate-code, is trivial.

(defun generate-code (ops)
+  (loop for op across ops collect (apply #'op->code op)))

All the work is done by methods on the generic function +op->code specializing the op argument with an EQL +specializer on the name of the op.

(defgeneric op->code (op &rest operands))
+
+(defmethod op->code ((op (eql :raw-string)) &rest operands)
+  (destructuring-bind (string check-for-newlines) operands
+    (if *pretty*
+      `(raw-string *html-pretty-printer* ,string ,check-for-newlines)
+      `(write-sequence ,string *html-output*))))
+
+(defmethod op->code ((op (eql :newline)) &rest operands)
+  (if *pretty*
+    `(newline *html-pretty-printer*)
+    `(write-char #\Newline *html-output*)))    
+
+(defmethod op->code ((op (eql :freshline)) &rest operands)
+  (if *pretty*
+    `(freshline *html-pretty-printer*)
+    (error "Bad op when not pretty-printing: ~a" op)))
+
+(defmethod op->code ((op (eql :indent)) &rest operands)
+  (if *pretty*
+    `(indent *html-pretty-printer*)
+    (error "Bad op when not pretty-printing: ~a" op)))
+
+(defmethod op->code ((op (eql :unindent)) &rest operands)
+  (if *pretty*
+    `(unindent *html-pretty-printer*)
+    (error "Bad op when not pretty-printing: ~a" op)))
+
+(defmethod op->code ((op (eql :toggle-indenting)) &rest operands)
+  (if *pretty*
+    `(toggle-indenting *html-pretty-printer*)
+    (error "Bad op when not pretty-printing: ~a" op)))

The two most interesting op->code methods are the ones that +generate code for the :embed-value and :embed-code ops. +In the :embed-value method, you can generate slightly +different code depending on the value of the escapes operand +since if escapes is NIL, you don't need to generate a +call to escape. And when both *pretty* and +escapes are NIL, you can generate code that uses +PRINC to emit the value directly to the stream.

(defmethod op->code ((op (eql :embed-value)) &rest operands)
+  (destructuring-bind (value escapes) operands
+    (if *pretty*
+      (if escapes
+        `(raw-string *html-pretty-printer* (escape (princ-to-string ,value) ,escapes) t)
+        `(raw-string *html-pretty-printer* (princ-to-string ,value) t))
+      (if escapes
+        `(write-sequence (escape (princ-to-string ,value) ,escapes) *html-output*)
+        `(princ ,value *html-output*)))))

Thus, something like this:

HTML> (let ((x 10)) (html (:p x)))
+<p>10</p>
+NIL

works because html translates (:p x) into something +like this:

(progn
+  (write-sequence "<p>" *html-output*)
+  (write-sequence (escape (princ-to-string x) "<>&") *html-output*)
+  (write-sequence "</p>" *html-output*))

When that code replaces the call to html in the context of the +LET, you get the following:

(let ((x 10))
+  (progn
+    (write-sequence "<p>" *html-output*)
+    (write-sequence (escape (princ-to-string x) "<>&") *html-output*)
+    (write-sequence "</p>" *html-output*)))

and the reference to x in the generated code turns into a +reference to the lexical variable from the LET surrounding the +html form.

The :embed-code method, on the other hand, is interesting +because it's so trivial. Because process passed the form to +embed-code, which stashed it in the :embed-code op, all +you have to do is pull it out and return it.

(defmethod op->code ((op (eql :embed-code)) &rest operands)
+  (first operands))

This allows code like this to work:

HTML> (html (:ul (dolist (x '(foo bar baz)) (html (:li x)))))
+<ul>
+  <li>FOO</li>
+  <li>BAR</li>
+  <li>BAZ</li>
+</ul>
+NIL

The outer call to html expands into code that does something +like this:

(progn
+  (write-sequence "<ul>" *html-output*)
+  (dolist (x '(foo bar baz)) (html (:li x)))
+  (write-sequence "</ul>" *html-output*))))

Then if you expand the call to html in the body of the +DOLIST, you'll get something like this:

(progn
+  (write-sequence "<ul>" *html-output*)
+  (dolist (x '(foo bar baz))
+    (progn
+      (write-sequence "<li>" *html-output*)
+      (write-sequence (escape (princ-to-string x) "<>&") *html-output*)
+      (write-sequence "</li>" *html-output*)))
+  (write-sequence "</ul>" *html-output*))

This code will, in fact, generate the output you saw.

FOO Special Operators

You could stop there; certainly the FOO language is expressive enough +to generate nearly any HTML you'd care to. However, you can add two +features to the language, with just a bit more code, that will make +it quite a bit more powerful: special operators and macros.

Special operators in FOO are analogous to special operators in Common +Lisp. Special operators provide ways to express things in the +language that can't be expressed in the language supported by the +basic evaluation rule. Or, another way to look at it is that special +operators provide access to the primitive mechanisms used by the +language evaluator.1

To take a simple example, in the FOO compiler, the language evaluator +uses the embed-value function to generate code that will embed +the value of a variable in the output HTML. However, because only +symbols are passed to embed-value, there's no way, in the +language I've described so far, to embed the value of an arbitrary +Common Lisp expression; the process function passes cons cells +to embed-code rather than embed-value, so the values +returned are ignored. Typically this is what you'd want, since the +main reason to embed Lisp code in a FOO program is to use Lisp +control constructs. However, sometimes you'd like to embed computed +values in the generated HTML. For example, you might like this FOO +program to generate a paragraph tag containing a random number:

(:p (random 10))

But that doesn't work because the code is run and its value +discarded.

HTML> (html (:p (random 10)))
+<p></p>
+NIL

In the language, as you've implemented it so far, you could work +around this limitation by computing the value outside the call to +html and then embedding it via a variable.

HTML> (let ((x (random 10))) (html (:p x)))
+<p>1</p>
+NIL

But that's sort of annoying, particularly when you consider that if +you could arrange for the form (random 10) to be passed to +embed-value instead of embed-code, it'd do exactly what +you want. So, you can define a special operator, :print, +that's processed by the FOO language processor according to a +different rule than a normal FOO expression. Namely, instead of +generating a <print> element, it passes the form in its body +to embed-value. Thus, you can generate a paragraph containing +a random number like this:

HTML> (html (:p (:print (random 10))))
+<p>9</p>
+NIL

Obviously, this special operator is useful only in compiled FOO code +since embed-value doesn't work in the interpreter. Another +special operator that can be used in both interpreted and compiled FOO +code is :format, which lets you generate output using the +FORMAT function. The arguments to the :format special +operator are a string used as a format control string and then any +arguments to be interpolated. When all the arguments to +:format are self-evaluating objects, a string is generated by +passing them to FORMAT, and that string is then emitted like any +other string. This allows such :format forms to be used in FOO +passed to emit-html. In compiled FOO, the arguments to +:format can be any Lisp expressions.

Other special operators provide control over what characters are +automatically escaped and to explicitly emit newline characters: the +:noescape special operator causes all the forms in its body to +be evaluated as regular FOO forms but with *escapes* bound to +NIL, while :attribute evaluates the forms in its body +with *escapes* bound to *attribute-escapes*. And +:newline is translated into code to emit an explicit newline.

So, how do you define special operators? There are two aspects to +processing special operators: how does the language processor +recognize forms that use special operators, and how does it know what +code to run to process each special operator?

You could hack process-sexp-html to recognize each special +operator and handle it in the appropriate manner--special operators +are, logically, part of the implementation of the language, and there +aren't going to be that many of them. However, it'd be nice to have a +slightly more modular way to add new special operators--not because +users of FOO will be able to but just for your own sanity.

Define a special form as any list whose CAR is a symbol +that's the name of a special operator. You can mark the names of +special operators by adding a non-NIL value to the symbol's +property list under the key html-special-operator. So, you can +define a function that tests whether a given form is a special form +like this:

(defun special-form-p (form)
+  (and (consp form) (symbolp (car form)) (get (car form) 'html-special-operator)))

The code that implements each special operator is responsible for +taking apart the rest of the list however it sees fit and doing +whatever the semantics of the special operator require. Assuming +you'll also define a function process-special-form, which will +take the language processor and a special form and run the appropriate +code to generate a sequence of calls on the processor object, you can +augment the top-level process function to handle special forms +like this:

(defun process (processor form)
+  (cond
+    ((special-form-p form) (process-special-form processor form))
+    ((sexp-html-p form)    (process-sexp-html processor form))
+    ((consp form)          (embed-code processor form))
+    (t                     (embed-value processor form))))

You must add the special-form-p clause first because special +forms can look, syntactically, like regular FOO expressions just the +way Common Lisp's special forms can look like regular function calls.

Now you just need to implement process-special-form. Rather +than define a single monolithic function that implements all the +special operators, you should define a macro that allows you to +define special operators much like regular functions and that also +takes care of adding the html-special-operator entry to the +property list of the special operator's name. In fact, the value you +store in the property list can be a function that implements the +special operator. Here's the macro:

(defmacro define-html-special-operator (name (processor &rest other-parameters) &body body)
+  `(eval-when (:compile-toplevel :load-toplevel :execute)
+     (setf (get ',name 'html-special-operator)
+           (lambda (,processor ,@other-parameters) ,@body))))

This is a fairly advanced type of macro, but if you take it one line +at a time, there's nothing all that tricky about it. To see how it +works, take a simple use of the macro, the definition of the special +operator :noescape, and look at the macro expansion. If you +write this:

(define-html-special-operator :noescape (processor &rest body)
+  (let ((*escapes* nil))
+    (loop for exp in body do (process processor exp))))

it's as if you had written this:

(eval-when (:compile-toplevel :load-toplevel :execute)
+  (setf (get ':noescape 'html-special-operator)
+        (lambda (processor &rest body)
+          (let ((*escapes* nil))
+            (loop for exp in body do (process processor exp))))))

The EVAL-WHEN special operator, as I discussed in Chapter 20, +ensures that the effects of code in its body will be made visible +during compilation when you compile with COMPILE-FILE. This +matters if you want to use define-html-special-operator in a +file and then use the just-defined special operator in that same file.

Then the SETF expression sets the property +html-special-operator on the symbol :noescape to an +anonymous function with the same parameter list as was specified in +define-html-special-operator. By defining +define-html-special-operator to split the parameter list in two +parts, processor and everything else, you ensure that all +special operators accept at least one argument.

The body of the anonymous function is then the body provided to +define-html-special-operator. The job of the anonymous +function is to implement the special operator by making the +appropriate calls on the backend interface to generate the correct +HTML or the code that will generate it. It can also use +process to evaluate an expression as a FOO form.

The :noescape special operator is particularly simple--all it +does is pass the forms in its body to process with +*escapes* bound to NIL. In other words, this special +operator disables the normal character escaping preformed by +process-sexp-html.

With special operators defined this way, all +process-special-form has to do is look up the anonymous +function in the property list of the special operator's name and +APPLY it to the processor and rest of the form.

(defun process-special-form (processor form)
+  (apply (get (car form) 'html-special-operator) processor (rest form)))

Now you're ready to define the five remaining FOO special operators. +Similar to :noescape is :attribute, which evaluates the +forms in its body with *escapes* bound to +*attribute-escapes*. This special operator is useful if you +want to write helper functions that output attribute values. If you +write a function like this:

(defun foo-value (something)
+  (html (:print (frob something))))

the html macro is going to generate code that escapes the +characters in *element-escapes*. But if you're planning to use +foo-value like this:

(html (:p :style (foo-value 42) "Foo"))

then you want it to generate code that uses +*attribute-escapes*. So, instead, you can write it like +this:2

(defun foo-value (something)
+  (html (:attribute (:print (frob something)))))

The definition of :attribute looks like this:

(define-html-special-operator :attribute (processor &rest body)
+  (let ((*escapes* *attribute-escapes*))
+    (loop for exp in body do (process processor exp))))

The next two special operators, :print and :format, are +used to output values. The :print special operator, as I +discussed earlier, is used in compiled FOO programs to embed the value +of an arbitrary Lisp expression. The :format special operator +is more or less equivalent to generating a string with (format +nil ...) and then embedding it. The primary reason to define +:format as a special operator is for convenience. This:

(:format "Foo: ~d" x)

is nicer than this:

(:print (format nil "Foo: ~d" x))

It also has the slight advantage that if you use :format with +arguments that are all self-evaluating, FOO can evaluate the +:format at compile time rather than waiting until runtime. The +definitions of :print and :format are as follows:

(define-html-special-operator :print (processor form)
+  (cond
+    ((self-evaluating-p form)
+     (warn "Redundant :print of self-evaluating form ~s" form)
+     (process-sexp-html processor form))
+    (t
+     (embed-value processor form))))
+
+(define-html-special-operator :format (processor &rest args)
+  (if (every #'self-evaluating-p args)
+    (process-sexp-html processor (apply #'format nil args))
+    (embed-value processor `(format nil ,@args))))

The :newline special operator forces an output of a literal +newline, which is occasionally handy.

(define-html-special-operator :newline (processor)
+  (newline processor))

Finally, the :progn special operator is analogous to the +PROGN special operator in Common Lisp. It simply processes the +forms in its body in sequence.

(define-html-special-operator :progn (processor &rest body)
+  (loop for exp in body do (process processor exp)))

In other words, the following:

(html (:p (:progn "Foo " (:i "bar") " baz")))

will generate the same code as this:

(html (:p "Foo " (:i "bar") " baz"))

This might seem like a strange thing to need since normal FOO +expressions can have any number of forms in their body. However, this +special operator will come in quite handy in one situation--when +writing FOO macros, which brings you to the last language feature you +need to implement.

FOO Macros

FOO macros are similar in spirit to Common Lisp's macros. A FOO macro +is a bit of code that accepts a FOO expression as an argument and +returns a new FOO expression as the result, which is then evaluated +according to the normal FOO evaluation rules. The actual +implementation is quite similar to the implementation of special +operators.

As with special operators, you can define a predicate function to +test whether a given form is a macro form.

(defun macro-form-p (form)
+  (cons-form-p form #'(lambda (x) (and (symbolp x) (get x 'html-macro)))))

You use the previously defined function cons-form-p because +you want to allow macros to be used in either of the syntaxes of +nonmacro FOO cons forms. However, you need to pass a different +predicate function, one that tests whether the form name is a symbol +with a non-NIL html-macro property. Also, as in the +implementation of special operators, you'll define a macro for +defining FOO macros, which is responsible for storing a function in +the property list of the macro's name, under the key +html-macro. However, defining a macro is a bit more +complicated because FOO supports two flavors of macro. Some macros +you'll define will behave much like normal HTML elements and may want +to have easy access to a list of attributes. Other macros will simply +want raw access to the elements of their body.

You can make the distinction between the two flavors of macros +implicit: when you define a FOO macro, the parameter list can include +an &attributes parameter. If it does, the macro form will be +parsed like a regular cons form, and the macro function will be +passed two values, a plist of attributes and a list of expressions +that make up the body of the form. A macro form without an +&attributes parameter won't be parsed for attributes, and the +macro function will be invoked with a single argument, a list +containing the body expressions. The former is useful for what are +essentially HTML templates. For example:

(define-html-macro :mytag (&attributes attrs &body body)
+  `((:div :class "mytag" ,@attrs) ,@body))
+
+HTML> (html (:mytag "Foo"))
+<div class='mytag'>Foo</div>
+NIL
+HTML> (html (:mytag :id "bar" "Foo"))
+<div class='mytag' id='bar'>Foo</div>
+NIL
+HTML> (html ((:mytag :id "bar") "Foo"))
+<div class='mytag' id='bar'>Foo</div>
+NIL

The latter kind of macro is more useful for writing macros that +manipulate the forms in their body. This type of macro can function +as a kind of HTML control construct. As a trivial example, consider +the following macro that implements an :if construct:

(define-html-macro :if (test then else)
+  `(if ,test (html ,then) (html ,else)))

This macro allows you to write this:

(:p (:if (zerop (random 2)) "Heads" "Tails"))

instead of this slightly more verbose version:

(:p (if (zerop (random 2)) (html "Heads") (html "Tails")))

To determine which kind of macro you should generate, you need a +function that can parse the parameter list given to +define-html-macro. This function returns two values, the name +of the &attributes parameter, or NIL if there was none, +and a list containing all the elements of args after removing +the &attributes marker and the subsequent list +element.3

(defun parse-html-macro-lambda-list (args)
+  (let ((attr-cons (member '&attributes args)))
+    (values 
+     (cadr attr-cons)
+     (nconc (ldiff args attr-cons) (cddr attr-cons)))))
+
+HTML> (parse-html-macro-lambda-list '(a b c))
+NIL
+(A B C)
+HTML> (parse-html-macro-lambda-list '(&attributes attrs a b c))
+ATTRS
+(A B C)
+HTML> (parse-html-macro-lambda-list '(a b c &attributes attrs))
+ATTRS
+(A B C)

The element following &attributes in the parameter list can +also be a destructuring parameter list.

HTML> (parse-html-macro-lambda-list '(&attributes (&key x y) a b c))
+(&KEY X Y)
+(A B C)

Now you're ready to write define-html-macro. Depending on +whether there was an &attributes parameter specified, you need +to generate one form or the other of HTML macro so the main macro +simply determines which kind of HTML macro it's defining and then +calls out to a helper function to generate the right kind of code.

(defmacro define-html-macro (name (&rest args) &body body)
+  (multiple-value-bind (attribute-var args)
+      (parse-html-macro-lambda-list args)
+    (if attribute-var
+      (generate-macro-with-attributes name attribute-var args body)
+      (generate-macro-no-attributes name args body))))

The functions that actually generate the expansion look like this:

(defun generate-macro-with-attributes (name attribute-args args body)
+  (with-gensyms (attributes form-body)
+    (if (symbolp attribute-args) (setf attribute-args `(&rest ,attribute-args)))
+    `(eval-when (:compile-toplevel :load-toplevel :execute)
+       (setf (get ',name 'html-macro-wants-attributes) t)
+       (setf (get ',name 'html-macro) 
+             (lambda (,attributes ,form-body)
+               (destructuring-bind (,@attribute-args) ,attributes
+                 (destructuring-bind (,@args) ,form-body
+                   ,@body)))))))
+
+(defun generate-macro-no-attributes (name args body)
+  (with-gensyms (form-body)
+    `(eval-when (:compile-toplevel :load-toplevel :execute)
+       (setf (get ',name 'html-macro-wants-attributes) nil)
+       (setf (get ',name 'html-macro)
+             (lambda (,form-body)
+               (destructuring-bind (,@args) ,form-body ,@body)))))

The macro functions you'll define accept either one or two arguments +and then use DESTRUCTURING-BIND to take them apart and bind them +to the parameters defined in the call to define-html-macro. In +both expansions you need to save the macro function in the name's +property list under html-macro and a boolean indicating +whether the macro takes an &attributes parameter under the +property html-macro-wants-attributes. You use that property in +the following function, expand-macro-form, to determine how +the macro function should be invoked:

(defun expand-macro-form (form)
+  (if (or (consp (first form))
+          (get (first form) 'html-macro-wants-attributes))
+    (multiple-value-bind (tag attributes body) (parse-cons-form form)
+      (funcall (get tag 'html-macro) attributes body))
+    (destructuring-bind (tag &body body) form
+      (funcall (get tag 'html-macro) body))))

The last step is to integrate macros by adding a clause to the +dispatching COND in the top-level process function.

(defun process (processor form)
+  (cond
+    ((special-form-p form) (process-special-form processor form))
+    ((macro-form-p form)   (process processor (expand-macro-form form)))
+    ((sexp-html-p form)    (process-sexp-html processor form))
+    ((consp form)          (embed-code processor form))
+    (t                     (embed-value processor form))))

This is the final version of process.

The Public API

Now, at long last, you're ready to implement the html macro, +the main entry point to the FOO compiler. The other parts of FOO's +public API are emit-html and with-html-output, which I +discussed in the previous chapter, and define-html-macro, +which I discussed in the previous section. The +define-html-macro macro needs to be part of the public API +because FOO's users will want to write their own HTML macros. On the +other hand, define-html-special-operator isn't part of the +public API because it requires too much knowledge of FOO's internals +to define a new special operator. And there should be very little +that can't be done using the existing language and special +operators.4

One last element of the public API, before I get to html, is +another macro, in-html-style. This macro controls whether FOO +generates XHTML or regular HTML by setting the *xhtml* +variable. The reason this needs to be a macro is because you'll want +to wrap the code that sets *xhtml* in an EVAL-WHEN so you +can set it in a file and have it affect uses of the html macro +later in that same file.

(defmacro in-html-style (syntax)
+  (eval-when (:compile-toplevel :load-toplevel :execute)
+    (case syntax
+      (:html (setf *xhtml* nil))
+      (:xhtml (setf *xhtml* t)))))

Finally let's look at html itself. The only tricky bit about +implementing html comes from the need to generate code that +can be used to generate both pretty and compact output, depending on +the runtime value of the variable *pretty*. Thus, html +needs to generate an expansion that contains an IF expression +and two versions of the code, one compiled with *pretty* bound +to true and one compiled with it bound to NIL. To further +complicate matters, it's common for one html call to contain +embedded calls to html, like this:

(html (:ul (dolist (item stuff)) (html (:li item))))

If the outer html expands into an IF expression with two +versions of the code, one for when *pretty* is true and one +for when it's false, it's silly for nested html forms to +expand into two versions too. In fact, it'll lead to an exponential +explosion of code since the nested html is already going to be +expanded twice--once in the *pretty*-is-true branch and once +in the *pretty*-is-false branch. If each expansion generates +two versions, then you'll have four total versions. And if the nested +html form contained another nested html form, you'd end +up with eight versions of that code. If the compiler is smart, it'll +eventually realize that most of that generated code is dead and will +eliminate it, but even figuring that out can take quite a bit of +time, slowing down compilation of any function that uses nested calls +to html.

Luckily, you can easily avoid this explosion of dead code by +generating an expansion that locally redefines the html macro, +using MACROLET, to generate only the right kind of code. First +you define a helper function that takes the vector of ops returned by +sexp->ops and runs it through optimize-static-output +and generate-code--the two phases that are affected by the +value of *pretty*--with *pretty* bound to a specified +value and that interpolates the resulting code into a PROGN. +(The PROGN returns NIL just to keep things tidy.).

(defun codegen-html (ops pretty)
+  (let ((*pretty* pretty))
+    `(progn ,@(generate-code (optimize-static-output ops)) nil)))

With that function, you can then define html like this:

(defmacro html (&whole whole &body body)
+  (declare (ignore body))
+  `(if *pretty*
+     (macrolet ((html (&body body) (codegen-html (sexp->ops body) t)))
+       (let ((*html-pretty-printer* (get-pretty-printer))) ,whole))
+     (macrolet ((html (&body body) (codegen-html (sexp->ops body) nil)))
+       ,whole)))

The &whole parameter represents the original html form, +and because it's interpolated into the expansion in the bodies of the +two MACROLETs, it will be reprocessed with each of the new +definitions of html, the one that generates pretty-printing +code and the other that generates non-pretty-printing code. Note that +the variable *pretty* is used both during macro expansion +and when the resulting code is run. It's used at macro expansion +time by codegen-html to cause generate-code to generate +one kind of code or the other. And it's used at runtime, in the +IF generated by the top-level html macro, to determine +whether the pretty-printing or non-pretty-printing code should +actually run.

The End of the Line

As usual, you could keep working with this code to enhance it in +various ways. One interesting avenue to pursue is to use the +underlying output generation framework to emit other kinds of output. +In the version of FOO you can download from the book's Web site, +you'll find some code that implements CSS output that can be +integrated into HTML output in both the interpreter and compiler. +That's an interesting case because CSS's syntax can't be mapped to +s-expressions in such a trivial way as HTML's can. However, if you +look at that code, you'll see it's still possible to define an +s-expression syntax for representing the various constructs available +in CSS.

A more ambitious undertaking would be to add support for generating +embedded JavaScript. Done right, adding JavaScript support to FOO +could yield two big wins. One is that after you define an +s-expression syntax that you can map to JavaScript syntax, then you +can start writing macros, in Common Lisp, to add new constructs to +the language you use to write client-side code, which will then be +compiled to JavaScript. The other is that, as part of the FOO +s-expression JavaScript to regular JavaScript translation, you could +deal with the subtle but annoying differences between JavaScript +implementations in different browsers. That is, the JavaScript code +that FOO generates could either contain the appropriate conditional +code to do one thing in one browser and another in a different +browser or could generate different code depending on which browser +you wanted to support. Then if you use FOO in dynamically generated +pages, it could use information about the User-Agent making the +request to generate the right flavor of JavaScript for that browser.

But if that interests you, you'll have to implement it yourself since +this is the end of the last practical chapter of this book. In the +next chapter I'll wrap things up, discussing briefly some topics that +I haven't touched on elsewhere in the book such as how to find +libraries, how to optimize Common Lisp code, and how to deliver Lisp +applications. +


1The analogy between FOO's special operators, +and macros, which I'll discuss in the next section, and Lisp's own is +fairly sound. In fact, understanding how FOO's special operators and +macros work may give you some insight into why Common Lisp is put +together the way it is.

2The :noescape and :attribute special +operators must be defined as special operators because FOO determines +what escapes to use at compile time, not at runtime. This allows FOO +to escape literal values at compile time, which is much more +efficient than having to scan all output at runtime.

3Note that &attributes is just another symbol; +there's nothing intrinsically special about names that start with +&.

4The one element of the underlying language-processing +infrastructure that's not currently exposed through special operators +is the indentation. If you wanted to make FOO more flexible, albeit +at the cost of making its API that much more complex, you could add +special operators for manipulating the underlying indenting printer. +But it seems like the cost of having to explain the extra special +operators would outweigh the rather small gain in expressiveness.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html b/clones/gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html new file mode 100644 index 00000000..90d610c4 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html @@ -0,0 +1,610 @@ +Practical: An HTML Generation Library, the Interpreter

30. Practical: An HTML Generation Library, the Interpreter

In this chapter and the next you'll take a look under the hood of the +FOO HTML generator that you've been using in the past few chapters. +FOO is an example of a kind of programming that's quite common in +Common Lisp and relatively uncommon in non-Lisp languages, namely, +language-oriented programming. Rather than provide an API built +primarily out of functions, classes, and macros, FOO provides language +processors for a domain-specific language that you can embed in your +Common Lisp programs.

FOO provides two language processors for the same s-expression +language. One is an interpreter that takes a FOO "program" as data +and interprets it to generate HTML. The other is a compiler that +compiles FOO expressions, possibly with embedded Common Lisp code, +into Common Lisp that generates HTML and runs the embedded code. The +interpreter is exposed as the function emit-html and the +compiler as the macro html, which you used in previous +chapters.

In this chapter you'll look at some of the infrastructure shared +between the interpreter and the compiler and then at the +implementation of the interpreter. In the next chapter, I'll show you +how the compiler works.

Designing a Domain-Specific Language

Designing an embedded language requires two steps: first, design the +language that'll allow you to express the things you want to express, +and second, implement a processor, or processors, that accepts a +"program" in that language and either performs the actions indicated +by the program or translates the program into Common Lisp code +that'll perform equivalent behaviors.

So, step one is to design the HTML-generating language. The key to +designing a good domain-specific language is to strike the right +balance between expressiveness and concision. For instance, a highly +expressive but not very concise "language" for generating HTML is the +language of literal HTML strings. The legal "forms" of this language +are strings containing literal HTML. Language processors for this +"language" could process such forms by simply emitting them as-is.

(defvar *html-output* *standard-output*)
+
+(defun emit-html (html)
+  "An interpreter for the literal HTML language."
+  (write-sequence html *html-output*))
+
+(defmacro html (html)
+  "A compiler for the literal HTML language."
+  `(write-sequence ,html *html-output*))

This "language" is highly expressive since it can express any +HTML you could possibly want to generate.1 On the other hand, this language doesn't win a lot of +points for its concision because it gives you zero compression--its +input is its output.

To design a language that gives you some useful compression without +sacrificing too much expressiveness, you need to identify the details +of the output that are either redundant or uninteresting. You can +then make those aspects of the output implicit in the semantics of +the language.

For instance, because of the structure of HTML, every opening tag is +paired with a matching closing tag.2 When you write +HTML by hand, you have to write those closing tags, but you can +improve the concision of your HTML-generating language by making the +closing tags implicit.

Another way you can gain concision at a slight cost in expressiveness +is to make the language processors responsible for adding appropriate +whitespace between elements--blank lines and indentation. When you're +generating HTML programmatically, you typically don't care much about +which elements have line breaks before or after them or about whether +different elements are indented relative to their parent elements. +Letting the language processor insert whitespace according to some +rule means you don't have to worry about it. As it turns out, FOO +actually supports two modes--one that uses the minimum amount of +whitespace, which allows it to generate extremely efficient code and +compact HTML, and another that generates nicely formatted HTML with +different elements indented and separated from other elements +according to their role.

Another detail that's best moved into the language processor is the +escaping of certain characters that have a special meaning in HTML +such as <, >, and &. Obviously, if you generate +HTML by just printing strings to a stream, then it's up to you to +replace any occurrences of those characters in the string with the +appropriate escape sequences, &lt;, &gt; and +&amp;. But if the language processor can know which strings +are to be emitted as element data, then it can take care of +automatically escaping those characters for you.

The FOO Language

So, enough theory. I'll give you a quick overview of the language +implemented by FOO, and then you'll look at the implementation of the +two FOO language processors--the interpreter, in this chapter, and +the compiler, in the next.

Like Lisp itself, the basic syntax of the FOO language is defined in +terms of forms made up of Lisp objects. The language defines how each +legal FOO form is translated into HTML.

The simplest FOO forms are self-evaluating Lisp objects such as +strings, numbers, and keyword symbols.3 You'll need a function self-evaluating-p that +tests whether a given object is self-evaluating for FOO's purposes.

(defun self-evaluating-p (form)
+  (and (atom form) (if (symbolp form) (keywordp form) t)))

Objects that satisfy this predicate will be emitted by converting +them to strings with PRINC-TO-STRING and then escaping any +reserved characters, such as <, >, or &. When +the value is being emitted as an attribute, the characters ", +and ' are also escaped. Thus, you can invoke the html +macro on a self-evaluating object to emit it to *html-output* +(which is initially bound to *STANDARD-OUTPUT*). Table 30-1 +shows how a few different self-evaluating values will be output.

Table 30-1. FOO Output for Self-Evaluating Objects

FOO FormGenerated HTML
"foo"foo
1010
:fooFOO
"foo & bar"foo &amp; bar

Of course, most HTML consists of tagged elements. The three pieces of +information that describe each element are the tag, a set of +attributes, and a body containing text and/or more HTML elements. +Thus, you need a way to represent these three pieces of information +as Lisp objects, preferably ones that the Lisp reader already knows +how to read.4 If you forget about attributes for a moment, there's an +obvious mapping between Lisp lists and HTML elements: any HTML +element can be represented by a list whose FIRST is a symbol +where the name is the name of the element's tag and whose REST +is a list of self-evaluating objects or lists representing other HTML +elements. Thus:

<p>Foo</p> <==> (:p "Foo")
+
+<p><i>Now</i> is the time</p> <==> (:p (:i "Now") " is the time")

Now the only problem is where to squeeze in the attributes. Since +most elements have no attributes, it'd be nice if you could use the +preceding syntax for elements without attributes. FOO provides two +ways to notate elements with attributes. The first is to simply +include the attributes in the list immediately following the symbol, +alternating keyword symbols naming the attributes and objects +representing the attribute value forms. The body of the element +starts with the first item in the list that's in a position to be an +attribute name and isn't a keyword symbol. Thus:

HTML> (html (:p "foo"))
+<p>foo</p>
+NIL
+HTML> (html (:p "foo " (:i "bar") " baz"))
+<p>foo <i>bar</i> baz</p>
+NIL
+HTML> (html (:p :style "foo" "Foo"))
+<p style='foo'>Foo</p>
+NIL
+HTML> (html (:p :id "x" :style "foo" "Foo"))
+<p id='x' style='foo'>Foo</p>
+NIL

For folks who prefer a bit more obvious delineation between the +element's attributes and its body, FOO supports an alternative +syntax: if the first element of a list is itself a list with a +keyword as its first element, then the outer list represents an +HTML element with that keyword indicating the tag, with the REST +of the nested list as the attributes, and with the REST of the +outer list as the body. Thus, you could write the previous two +expressions like this:

HTML> (html ((:p :style "foo") "Foo"))
+<p style='foo'>Foo</p>
+NIL
+HTML> (html ((:p :id "x" :style "foo") "Foo"))
+<p id='x' style='foo'>Foo</p>
+NIL

The following function tests whether a given object matches either of +these syntaxes:

(defun cons-form-p (form &optional (test #'keywordp))
+  (and (consp form)
+       (or (funcall test (car form))
+           (and (consp (car form)) (funcall test (caar form))))))

You should parameterize the test function because later you'll +need to test the same two syntaxes with a slightly different predicate +on the name.

To completely abstract the differences between the two syntax +variants, you can define a function, parse-cons-form, that +takes a form and parses it into three elements, the tag, the +attributes plist, and the body list, returning them as multiple +values. The code that actually evaluates cons forms will use this +function and not have to worry about which syntax was used.

(defun parse-cons-form (sexp)
+  (if (consp (first sexp))
+    (parse-explicit-attributes-sexp sexp)
+    (parse-implicit-attributes-sexp sexp)))
+
+(defun parse-explicit-attributes-sexp (sexp)
+  (destructuring-bind ((tag &rest attributes) &body body) sexp
+    (values tag attributes body)))
+
+(defun parse-implicit-attributes-sexp (sexp)
+  (loop with tag = (first sexp)
+     for rest on (rest sexp) by #'cddr
+     while (and (keywordp (first rest)) (second rest))
+     when (second rest)
+       collect (first rest) into attributes and
+       collect (second rest) into attributes
+     end
+     finally (return (values tag attributes rest))))

Now that you have the basic language specified, you can think about +how you're actually going to implement the language processors. How +do you get from a series of FOO forms to the desired HTML? As I +mentioned previously, you'll be implementing two language processors +for FOO: an interpreter that walks a tree of FOO forms and emits the +corresponding HTML directly and a compiler that walks a tree and +translates it into Common Lisp code that'll emit the same HTML. Both +the interpreter and compiler will be built on top of a common +foundation of code, which provides support for things such as +escaping reserved characters and generating nicely indented output, +so it makes sense to start there.

Character Escaping

The first bit of the foundation you'll need to lay is the code that +knows how to escape characters with a special meaning in HTML. There +are three such characters, and they must not appear in the text of an +element or in an attribute value; they are <, >, and +&. In element text or attribute values, these characters must +be replaced with the character reference entities &lt;, +&gt;, and &amp;. Similarly, in attribute values, the +quotation marks used to delimit the value must be escaped, ' +with &apos; and " with &quot;. Additionally, any +character can be represented by a numeric character reference entity +consisting of an ampersand, followed by a sharp sign, followed by the +numeric code as a base 10 integer, and followed by a semicolon. These +numeric escapes are sometimes used to embed non-ASCII characters in +HTML.

The Package

The following function accepts a single character and returns a string +containing a character reference entity for that character:

(defun escape-char (char)
+  (case char
+    (#\& "&amp;")
+    (#\< "&lt;")
+    (#\> "&gt;")
+    (#\' "&apos;")
+    (#\" "&quot;")
+    (t (format nil "&#~d;" (char-code char)))))

You can use this function as the basis for a function, escape, +that takes a string and a sequence of characters and returns a copy of +the first argument with all occurrences of the characters in the +second argument replaced with the corresponding character entity +returned by escape-char.

(defun escape (in to-escape)
+  (flet ((needs-escape-p (char) (find char to-escape)))
+    (with-output-to-string (out)
+      (loop for start = 0 then (1+ pos)
+            for pos = (position-if #'needs-escape-p in :start start)
+            do (write-sequence in out :start start :end pos)
+            when pos do (write-sequence (escape-char (char in pos)) out)
+            while pos))))

You can also define two parameters: *element-escapes*, which +contains the characters you need to escape in normal element data, +and *attribute-escapes*, which contains the set of characters +to be escaped in attribute values.

(defparameter *element-escapes* "<>&")
+(defparameter *attribute-escapes* "<>&\"'")

Here are some examples:

HTML> (escape "foo & bar" *element-escapes*)
+"foo &amp; bar"
+HTML> (escape "foo & 'bar'" *element-escapes*)
+"foo &amp; 'bar'"
+HTML> (escape "foo & 'bar'" *attribute-escapes*)
+"foo &amp; &apos;bar&apos;"

Finally, you'll need a variable, *escapes*, that will be bound +to the set of characters that need to be escaped. It's initially set +to the value of *element-escapes*, but when generating +attributes, it will, as you'll see, be rebound to the value of +*attribute-escapes*.

(defvar *escapes* *element-escapes*)

Indenting Printer

To handle generating nicely indented output, you can define a class +indenting-printer, which wraps around an output stream, and +functions that use an instance of that class to emit strings to the +stream while keeping track of when it's at the beginning of the line. +The class looks like this:

(defclass indenting-printer ()
+  ((out                 :accessor out                 :initarg :out)
+   (beginning-of-line-p :accessor beginning-of-line-p :initform t)
+   (indentation         :accessor indentation         :initform 0)
+   (indenting-p         :accessor indenting-p         :initform t)))

The main function that operates on indenting-printers is +emit, which takes the printer and a string and emits the +string to the printer's output stream, keeping track of when it emits +a newline so it can reset the beginning-of-line-p slot.

(defun emit (ip string)
+  (loop for start = 0 then (1+ pos)
+     for pos = (position #\Newline string :start start)
+     do (emit/no-newlines ip string :start start :end pos)
+     when pos do (emit-newline ip)
+     while pos))

To actually emit the string, it uses the function +emit/no-newlines, which emits any needed indentation, via the +helper indent-if-necessary, and then writes the string to the +stream. This function can also be called directly by other code to +emit a string that's known not to contain any newlines.

(defun emit/no-newlines (ip string &key (start 0) end)
+  (indent-if-necessary ip)
+  (write-sequence string (out ip) :start start :end end)
+  (unless (zerop (- (or end (length string)) start))
+    (setf (beginning-of-line-p ip) nil)))

The helper indent-if-necessary checks +beginning-of-line-p and indenting-p to determine +whether it needs to emit indentation and, if they're both true, emits +as many spaces as indicated by the value of indentation. Code +that uses the indenting-printer can control the indentation by +manipulating the indentation and indenting-p slots. +Incrementing and decrementing indentation changes the number +of leading spaces, while setting indenting-p to NIL can +temporarily turn off indentation.

(defun indent-if-necessary (ip)
+  (when (and (beginning-of-line-p ip) (indenting-p ip))
+    (loop repeat (indentation ip) do (write-char #\Space (out ip)))
+    (setf (beginning-of-line-p ip) nil)))

The last two functions in the indenting-printer API are +emit-newline and emit-freshline, which are both used to +emit a newline character, similar to the ~% and ~& +FORMAT directives. That is, the only difference is that +emit-newline always emits a newline, while +emit-freshline does so only if beginning-of-line-p is +false. Thus, multiple calls to emit-freshline without any +intervening emits won't result in a blank line. This is handy +when one piece of code wants to generate some output that should end +with a newline while another piece of code wants to generate some +output that should start on a newline but you don't want a blank line +between the two bits of output.

(defun emit-newline (ip)
+  (write-char #\Newline (out ip))
+  (setf (beginning-of-line-p ip) t))
+
+(defun emit-freshline (ip)
+  (unless (beginning-of-line-p ip) (emit-newline ip)))

With those preliminaries out of the way, you're ready to get to the +guts of the FOO processor.

HTML Processor Interface

Now you're ready to define the interface that'll be used by the FOO +language processor to emit HTML. You can define this interface as a +set of generic functions because you'll need two implementations--one +that actually emits HTML and another that the html macro can +use to collect a list of actions that need to be performed, which can +then be optimized and compiled into code that emits the same output +in a more efficient way. I'll call this set of generic functions the +backend interface. It consists of the following eight generic +functions:

(defgeneric raw-string (processor string &optional newlines-p))
+
+(defgeneric newline (processor))
+
+(defgeneric freshline (processor))
+
+(defgeneric indent (processor))
+
+(defgeneric unindent (processor))
+
+(defgeneric toggle-indenting (processor))
+
+(defgeneric embed-value (processor value))
+
+(defgeneric embed-code (processor code))

While several of these functions have obvious correspondence to +indenting-printer functions, it's important to understand that +these generic functions define the abstract operations that are used by +the FOO language processors and won't always be implemented in terms +of calls to the indenting-printer functions.

That said, perhaps the easiest way to understand the semantics of +these abstract operations is to look at the concrete implementations +of the methods specialized on html-pretty-printer, the class +used to generate human-readable HTML.

The Pretty Printer Backend

You can start by defining a class with two slots--one to hold an +instance of indenting-printer and one to hold the tab +width--the number of spaces you want to increase the indentation for +each level of nesting of HTML elements.

(defclass html-pretty-printer ()
+  ((printer   :accessor printer   :initarg :printer)
+   (tab-width :accessor tab-width :initarg :tab-width :initform 2)))

Now you can implement methods specialized on +html-pretty-printer on the eight generic functions that make up +the backend interface.

The FOO processors use the raw-string function to emit strings +that don't need character escaping, either because you actually want +to emit normally reserved characters or because all reserved +characters have already been escaped. Usually raw-string is +invoked with strings that don't contain newlines, so the default +behavior is to use emit/no-newlines unless the caller +specifies a non-NIL newlines-p argument.

(defmethod raw-string ((pp html-pretty-printer) string &optional newlines-p)
+  (if newlines-p
+    (emit (printer pp) string)
+    (emit/no-newlines (printer pp) string)))

The functions newline, freshline, indent, +unindent, and toggle-indenting implement fairly +straightforward manipulations of the underlying +indenting-printer. The only wrinkle is that the HTML pretty +printer generates pretty output only when the dynamic variable +*pretty* is true. When it's NIL, you should generate +compact HTML with no unnecessary whitespace. So, these methods, with +the exception of newline, all check *pretty* before +doing anything:5

(defmethod newline ((pp html-pretty-printer))
+  (emit-newline (printer pp)))
+
+(defmethod freshline ((pp html-pretty-printer))
+  (when *pretty* (emit-freshline (printer pp))))
+
+(defmethod indent ((pp html-pretty-printer))
+  (when *pretty* 
+    (incf (indentation (printer pp)) (tab-width pp))))
+
+(defmethod unindent ((pp html-pretty-printer))
+  (when *pretty* 
+    (decf (indentation (printer pp)) (tab-width pp))))
+
+(defmethod toggle-indenting ((pp html-pretty-printer))
+  (when *pretty* 
+    (with-slots (indenting-p) (printer pp)
+      (setf indenting-p (not indenting-p)))))

Finally, the functions embed-value and embed-code are +used only by the FOO compiler--embed-value is used to +generate code that'll emit the value of a Common Lisp expression, +while embed-code is used to embed a bit of code to be run and +its result discarded. In the interpreter, you can't meaningfully +evaluate embedded Lisp code, so the methods on these functions always +signal an error.

(defmethod embed-value ((pp html-pretty-printer) value)
+  (error "Can't embed values when  interpreting. Value: ~s" value))
+
+(defmethod embed-code ((pp html-pretty-printer) code)
+  (error "Can't embed code when interpreting. Code: ~s" code))
Using Conditions to Have Your Cake and Eat It Too

The Basic Evaluation Rule

Now to connect the FOO language to the processor interface, all you +need is a function that takes an object and processes it, invoking +the appropriate processor functions to generate HTML. For instance, +when given a simple form like this:

(:p "Foo")

this function might execute this sequence of calls on the processor:

(freshline processor)
+(raw-string processor "<p" nil)
+(raw-string processor ">" nil)
+(raw-string processor "Foo" nil)
+(raw-string processor "</p>" nil)
+(freshline processor)

For now you can define a simple function that just checks whether a +form is, in fact, a legal FOO form and, if it is, hands it off to the +function process-sexp-html for processing. In the next +chapter, you'll add some bells and whistles to this function to allow +it to handle macros and special operators. But for now it looks like +this:

(defun process (processor form)
+  (if (sexp-html-p form)
+    (process-sexp-html processor form)
+    (error "Malformed FOO form: ~s" form)))

The function sexp-html-p determines whether the given object +is a legal FOO expression, either a self-evaluating form or a +properly formatted cons.

(defun sexp-html-p (form)
+  (or (self-evaluating-p form) (cons-form-p form)))

Self-evaluating forms are easily handled: just convert to a string +with PRINC-TO-STRING and escape the characters in the variable +*escapes*, which, as you'll recall, is initially bound to the +value of *element-escapes*. Cons forms you pass off to +process-cons-sexp-html.

(defun process-sexp-html (processor form)
+  (if (self-evaluating-p form)
+    (raw-string processor (escape (princ-to-string form) *escapes*) t)
+    (process-cons-sexp-html processor form)))

The function process-cons-sexp-html is then responsible for +emitting the opening tag, any attributes, the body, and the closing +tag. The main complication here is that to generate pretty HTML, you +need to emit fresh lines and adjust the indentation according to the +type of the element being emitted. You can categorize all the +elements defined in HTML into one of three categories: block, +paragraph, and inline. Block elements--such as body and +ul--are emitted with fresh lines before and after both their +opening and closing tags and with their contents indented one level. +Paragraph elements--such as p, li, and +blockquote--are emitted with a fresh line before the opening +tag and after the closing tag. Inline elements are simply emitted in +line. The following three parameters list the elements of each type:

(defparameter *block-elements*
+  '(:body :colgroup :dl :fieldset :form :head :html :map :noscript :object
+    :ol :optgroup :pre :script :select :style :table :tbody :tfoot :thead
+    :tr :ul))
+
+(defparameter *paragraph-elements*
+  '(:area :base :blockquote :br :button :caption :col :dd :div :dt :h1
+    :h2 :h3 :h4 :h5 :h6 :hr :input :li :link :meta :option :p :param
+    :td :textarea :th :title))
+
+(defparameter *inline-elements*
+  '(:a :abbr :acronym :address :b :bdo :big :cite :code :del :dfn :em
+    :i :img :ins :kbd :label :legend :q :samp :small :span :strong :sub
+    :sup :tt :var))

The functions block-element-p and paragraph-element-p +test whether a given tag is a member of the corresponding +list.6

(defun block-element-p (tag) (find tag *block-elements*))
+
+(defun paragraph-element-p (tag) (find tag *paragraph-elements*))

Two other categorizations with their own predicates are the elements +that are always empty, such as br and hr, and the three +elements, pre, style, and script, in which +whitespace is supposed to be preserved. The former are handled +specially when generating regular HTML (in other words, not XHTML) +since they're not supposed to have a closing tag. And when emitting +the three tags in which whitespace is preserved, you can temporarily +turn off indentation so the pretty printer doesn't add any spaces +that aren't part of the element's actual contents.

(defparameter *empty-elements*
+  '(:area :base :br :col :hr :img :input :link :meta :param))
+
+(defparameter *preserve-whitespace-elements* '(:pre :script :style))
+
+(defun empty-element-p (tag) (find tag *empty-elements*))
+
+(defun preserve-whitespace-p (tag) (find tag *preserve-whitespace-elements*))

The last piece of information you need when generating HTML is +whether you're generating XHTML since that affects how you emit empty +elements.

(defparameter *xhtml* nil)

With all that information, you're ready to process a cons FOO form. +You use parse-cons-form to parse the list into three parts, the +tag symbol, a possibly empty plist of attribute key/value pairs, and a +possibly empty list of body forms. You then emit the opening tag, the +body, and the closing tag with the helper functions +emit-open-tag, emit-element-body, and +emit-close-tag.

(defun process-cons-sexp-html (processor form)
+  (when (string= *escapes* *attribute-escapes*)
+    (error "Can't use cons forms in attributes: ~a" form))
+  (multiple-value-bind (tag attributes body) (parse-cons-form form)
+    (emit-open-tag     processor tag body attributes)
+    (emit-element-body processor tag body)
+    (emit-close-tag    processor tag body)))

In emit-open-tag you have to call freshline when +appropriate and then emit the attributes with emit-attributes. +You need to pass the element's body to emit-open-tag so when +it's emitting XHTML, it knows whether to finish the tag with +/> or >.

(defun emit-open-tag (processor tag body-p attributes)
+  (when (or (paragraph-element-p tag) (block-element-p tag))
+    (freshline processor))
+  (raw-string processor (format nil "<~(~a~)" tag))
+  (emit-attributes processor attributes)
+  (raw-string processor (if (and *xhtml* (not body-p)) "/>" ">")))

In emit-attributes the attribute names aren't evaluated since +they must be keyword symbols, but you should invoke the top-level +process function to evaluate the attribute values, binding +*escapes* to *attribute-escapes*. As a convenience for +specifying boolean attributes, whose value should be the name of the +attribute, if the value is T--not just any true value but +actually T--then you replace the value with the name of the +attribute.7

(defun emit-attributes (processor attributes)
+  (loop for (k v) on attributes by #'cddr do
+       (raw-string processor (format nil " ~(~a~)='" k))
+       (let ((*escapes* *attribute-escapes*))
+         (process processor (if (eql v t) (string-downcase k) v)))
+       (raw-string processor "'")))

Emitting the element's body is similar to emitting the attribute +values: you can loop through the body calling process to +evaluate each form. The rest of the code is dedicated to emitting +fresh lines and adjusting the indentation as appropriate for the type +of element.

(defun emit-element-body (processor tag body)
+  (when (block-element-p tag)
+    (freshline processor)
+    (indent processor))
+  (when (preserve-whitespace-p tag) (toggle-indenting processor))
+  (dolist (item body)  (process processor item))
+  (when (preserve-whitespace-p tag) (toggle-indenting processor))
+  (when (block-element-p tag)
+    (unindent processor)
+    (freshline processor)))

Finally, emit-close-tag, as you'd probably expect, emits the +closing tag (unless no closing tag is necessary, such as when the +body is empty and you're either emitting XHTML or the element is one +of the special empty elements). Regardless of whether you actually +emit a close tag, you need to emit a final fresh line for block and +paragraph elements.

(defun emit-close-tag (processor tag body-p)
+  (unless (and (or *xhtml* (empty-element-p tag)) (not body-p))
+    (raw-string processor (format nil "</~(~a~)>" tag)))
+  (when (or (paragraph-element-p tag) (block-element-p tag))
+    (freshline processor)))

The function process is the basic FOO interpreter. To make it +a bit easier to use, you can define a function, emit-html, +that invokes process, passing it an html-pretty-printer +and a form to evaluate. You can define and use a helper function, +get-pretty-printer, to get the pretty printer, which returns +the current value of *html-pretty-printer* if it's bound; +otherwise, it makes a new instance of html-pretty-printer with +*html-output* as its output stream.

(defun emit-html (sexp) (process (get-pretty-printer) sexp))
+
+(defun get-pretty-printer ()
+  (or *html-pretty-printer*
+      (make-instance 
+       'html-pretty-printer
+       :printer (make-instance 'indenting-printer :out *html-output*))))

With this function, you can emit HTML to *html-output*. Rather +than expose the variable *html-output* as part of FOO's public +API, you should define a macro, with-html-output, that takes +care of binding the stream for you. It also lets you specify whether +you want pretty HTML output, defaulting to the value of the variable +*pretty*.

(defmacro with-html-output ((stream &key (pretty *pretty*)) &body body)
+  `(let* ((*html-output* ,stream)
+          (*pretty* ,pretty))
+    ,@body))

So, if you wanted to use emit-html to generate HTML to a file, +you could write the following:

(with-open-file (out "foo.html" :direction output)
+  (with-html-output (out :pretty t)
+    (emit-html *some-foo-expression*)))

What's Next?

In the next chapter, you'll look at how to implement a macro that +compiles FOO expressions into Common Lisp so you can embed HTML +generation code directly into your Lisp programs. You'll also extend +the FOO language to make it a bit more expressive by adding its own +flavor of special operators and macros. +


1In fact, it's probably +too expressive since it can also generate all sorts of output +that's not even vaguely legal HTML. Of course, that might be a +feature if you need to generate HTML that's not strictly correct to +compensate for buggy Web browsers. Also, it's common for language +processors to accept programs that are syntactically correct and +otherwise well formed that'll nonetheless provoke undefined behavior +when run.

2Well, almost every tag. +Certain tags such as IMG and BR don't. You'll deal with +those in the section "The Basic Evaluation Rule."

3In the strict language of +the Common Lisp standard, keyword symbols aren't self-evaluating, +though they do, in fact, evaluate to themselves. See section +3.1.2.1.3 of the language standard or HyperSpec for a brief +discussion.

4The requirement to use objects that the Lisp reader +knows how to read isn't a hard-and-fast one. Since the Lisp reader is +itself customizable, you could also define a new reader-level syntax +for a new kind of object. But that tends to be more trouble than it's +worth.

5Another, more purely object-oriented, approach +would be to define two classes, perhaps html-pretty-printer +and html-raw-printer, and then define no-op methods +specialized on html-raw-printer for the methods that should do +stuff only when *pretty* is true. However, in this case, after +defining all the no-op methods, you'd end up with more code, and then +you'd have the hassle of making sure you created an instance of the +right class at the right time. But in general, using polymorphism to +replace conditionals is a good strategy.

6You don't need a predicate for *inline-elements* +since you only ever test for block and paragraph elements. I include +the parameter here for completeness.

7While XHTML requires boolean attributes to be notated +with their name as the value to indicate a true value, in HTML it's +also legal to simply include the name of the attribute with no value, +for example, <option selected> rather than <option +selected='selected'>. All HTML 4.0-compatible browsers should +understand both forms, but some buggy browsers understand only the +no-value form for certain attributes. If you need to generate HTML +for such browsers, you'll need to hack emit-attributes to emit +those attributes a bit differently.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-an-id3-parser.html b/clones/gigamonkeys.com/book/practical-an-id3-parser.html new file mode 100644 index 00000000..302e0482 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-an-id3-parser.html @@ -0,0 +1,1098 @@ +Practical: An ID3 Parser

25. Practical: An ID3 Parser

With a library for parsing binary data, you're ready to write some +code for reading and writing an actual binary format, that of ID3 +tags. ID3 tags are used to embed metadata in MP3 audio files. Dealing +with ID3 tags will be a good test of the binary data library because +the ID3 format is a true real-world format--a mix of engineering +trade-offs and idiosyncratic design choices that does, whatever else +might be said about it, get the job done. In case you missed the +file-sharing revolution, here's a quick overview of what ID3 tags are +and how they relate to MP3 files.

MP3, also known as MPEG Audio Layer 3, is a format for storing +compressed audio data, designed by researchers at Fraunhofer IIS and +standardized by the Moving Picture Experts Group, a joint committee +of the International Organization for Standardization (ISO) and the +International Electrotechnical Commission (IEC). However, the MP3 +format, by itself, defines only how to store audio data. That's fine +as long as all your MP3 files are managed by a single application +that can store metadata externally and keep track of which metadata +goes with which files. However, when people started passing around +individual MP3 files on the Internet, via file-sharing systems such +as Napster, they soon discovered they needed a way to embed metadata +in the MP3 files themselves.

Because the MP3 standard was already codified and a fair bit of +software and hardware had already been written that knew how to +decode the existing MP3 format, any scheme for embedding information +in an MP3 file would have to be invisible to MP3 decoders. Enter ID3.

The original ID3 format, invented by programmer Eric Kemp, consisted +of 128 bytes stuck on the end of an MP3 file where it'd be ignored by +most MP3 software. It consisted of four 30-character fields, one each +for the song title, the album title, the artist name, and a comment; +a four-byte year field; and a one-byte genre code. Kemp provided +standard meanings for the first 80 genre codes. Nullsoft, the makers +of Winamp, a popular MP3 player, later supplemented this list with +another 60 or so genres.

This format was easy to parse but obviously quite limited. It had no +way to encode names longer than 30 characters; it was limited to 256 +genres, and the meaning of the genre codes had to be agreed upon by +all users of ID3-aware software. There wasn't even a way to encode +the CD track number of a particular MP3 file until another +programmer, Michael Mutschler, proposed embedding the track number in +the comment field, separated from the rest of the comment by a null +byte, so existing ID3 software, which tended to read up to the first +null in each of the text fields, would ignore it. Kemp's version is +now called ID3v1, and Mutschler's is ID3v1.1.

Limited as they were, the version 1 proposals were at least a partial +solution to the metadata problem, so they were adopted by many MP3 +ripping programs (which had to put the ID3 tag into the MP3 files) +and MP3 players (which would extract the information in the ID3 tag +to display to the user).1

By 1998, however, the limitations were really becoming annoying, and +a new group, led by Martin Nilsson, started work on a completely new +tagging scheme, which came to be called ID3v2. The ID3v2 format is +extremely flexible, allowing for many kinds of information to be +included, with almost no length limitations. It also takes advantage +of certain details of the MP3 format to allow ID3v2 tags to be placed +at the beginning of an MP3 file.

ID3v2 tags are, however, more of a challenge to parse than version 1 +tags. In this chapter, you'll use the binary data parsing library +from the previous chapter to develop code that can read and write +ID3v2 tags. Or at least you'll make a reasonable start--where ID3v1 +was too simple, ID3v2 is baroque to the point of being completely +overengineered. Implementing every nook and cranny of the +specification, especially if you want to support all three versions +that have been specified, would be a fair bit of work. However, you +can ignore many of the features in those specifications since they're +rarely used "in the wild." For starters, you can ignore, for now, a +whole version, 2.4, since it has not been widely adopted and mostly +just adds more needless flexibility compared to version 2.3. I'll +focus on versions 2.2 and 2.3 because they're both widely used and +are different enough from each other to keep things interesting.

Structure of an ID3v2 Tag

Before you can start cutting code, you'll need to be familiar with +the overall structure of an ID3v2 tag. A tag starts with a header +containing information about the tag as a whole. The first three +bytes of the header encode the string "ID3" in ISO-8859-1 characters. +In other words, they're the bytes 73, 68, and 51. Then comes two +bytes that encode the major version and revision of the ID3 +specification to which the tag purports to conform. They're followed +by a single byte whose individual bits are treated as flags. The +meanings of the individual flags depend on the version of the spec. +Some of the flags can affect the way the rest of the tag is parsed. +The "major version" is actually used to record the minor version of +the spec, while the "revision" is the subminor version of the spec. +Thus, the "major version" field for a tag conforming to the 2.3.0 +spec is 3. The revision field is always zero since each new ID3v2 +spec has bumped the minor version, leaving the subminor version at +zero. The value stored in the major version field of the tag has, as +you'll see, a dramatic effect on how you'll parse the rest of the +tag.

The last field in the tag header is an integer, encoded in four bytes +but using only seven bits from each byte, that gives the total size +of the tag, not counting the header. In version 2.3 tags, the header +may be followed by several extended header fields; otherwise, the +remainder of the tag data is divided into frames. Different types +of frames store different kinds of information, from simple textual +information, such as the song name, to embedded images. Each frame +starts with a header containing a string identifier and a size. In +version 2.3, the frame header also contains two bytes worth of flags +and, depending on the value of one the flags, an optional one-byte +code indicating how the rest of the frame is encrypted.

Frames are a perfect example of a tagged data structure--to know how +to parse the body of a frame, you need to read the header and use the +identifier to determine what kind of frame you're reading.

The ID3 tag header contains no direct indication of how many frames +are in a tag--the tag header tells you how big the tag is, but since +many frames are variable length, the only way to find out how many +frames the tag contains is to read the frame data. Also, the size +given in the tag header may be larger than the actual number of bytes +of frame data; the frames may be followed with enough null bytes to +pad the tag out to the specified size. This makes it possible for tag +editors to modify a tag without having to rewrite the whole MP3 +file.2

So, the main issues you have to deal with are reading the ID3 header; +determining whether you're reading a version 2.2 or 2.3 tag; and +reading the frame data, stopping either when you've read the complete +tag or when you've hit the padding bytes.

Defining a Package

Like the other libraries you've developed so far, the code you'll +write in this chapter is worth putting in its own package. You'll +need to refer to functions from both the binary data and pathname +libraries developed in Chapters 24 and 15 and will also want to +export the names of the functions that make up the public API to this +package. The following package definition does all that:

(defpackage :com.gigamonkeys.id3v2
+  (:use :common-lisp
+        :com.gigamonkeys.binary-data
+        :com.gigamonkeys.pathnames)
+  (:export
+   :read-id3
+   :mp3-p
+   :id3-p
+   :album
+   :composer
+   :genre
+   :encoding-program
+   :artist
+   :part-of-set
+   :track
+   :song
+   :year
+   :size
+   :translated-genre))

As usual, you can, and probably should, change the +com.gigamonkeys part of the package name to your own domain.

Integer Types

You can start by defining binary types for reading and writing +several of the primitive types used by the ID3 format, various sizes +of unsigned integers, and four kinds of strings.

ID3 uses unsigned integers encoded in one, two, three, and four +bytes. If you first write a general unsigned-integer binary +type that takes the number of bytes to read as an argument, you can +then use the short form of define-binary-type to define the +specific types. The general unsigned-integer type looks like +this:

(define-binary-type unsigned-integer (bytes)
+  (:reader (in)
+    (loop with value = 0
+       for low-bit downfrom (* 8 (1- bytes)) to 0 by 8 do
+         (setf (ldb (byte 8 low-bit) value) (read-byte in))
+       finally (return value)))
+  (:writer (out value)
+    (loop for low-bit downfrom (* 8 (1- bytes)) to 0 by 8
+       do (write-byte (ldb (byte 8 low-bit) value) out))))

Now you can use the short form of define-binary-type to define +one type for each size of integer used in the ID3 format like this:

(define-binary-type u1 () (unsigned-integer :bytes 1))
+(define-binary-type u2 () (unsigned-integer :bytes 2))
+(define-binary-type u3 () (unsigned-integer :bytes 3))
+(define-binary-type u4 () (unsigned-integer :bytes 4))

Another type you'll need to be able to read and write is the 28-bit +value used in the header. This size is encoded using 28 bits rather +than a multiple of 8, such as 32 bits, because an ID3 tag can't +contain the byte #xff followed by a byte with the top 3 bits +on because that pattern has a special meaning to MP3 decoders. None +of the other fields in the ID3 header could possibly contain such a +byte sequence, but if you encoded the tag size as a regular +unsigned-integer, it might. To avoid that possibility, the +size is encoded using only the bottom seven bits of each byte, with +the top bit always zero.3

Thus, it can be read and written a lot like an +unsigned-integer except the size of the byte specifier you +pass to LDB should be seven rather than eight. This similarity +suggests that if you add a parameter, bits-per-byte, to the +existing unsigned-integer binary type, you could then define a +new type, id3-tag-size, using a short-form +define-binary-type. The new version of unsigned-integer +is just like the old version except with bits-per-byte used +everywhere the old version hardwired the number eight. It looks like +this:

(define-binary-type unsigned-integer (bytes bits-per-byte)
+  (:reader (in)
+    (loop with value = 0
+       for low-bit downfrom (* bits-per-byte (1- bytes)) to 0 by bits-per-byte do
+         (setf (ldb (byte bits-per-byte low-bit) value) (read-byte in))
+       finally (return value)))
+  (:writer (out value)
+    (loop for low-bit downfrom (* bits-per-byte (1- bytes)) to 0 by bits-per-byte
+       do (write-byte (ldb (byte bits-per-byte low-bit) value) out))))

The definition of id3-tag-size is then trivial.

(define-binary-type id3-tag-size () (unsigned-integer :bytes 4 :bits-per-byte 7))

You'll also have to change the definitions of u1 through +u4 to specify eight bits per byte like this:

(define-binary-type u1 () (unsigned-integer :bytes 1 :bits-per-byte 8))
+(define-binary-type u2 () (unsigned-integer :bytes 2 :bits-per-byte 8))
+(define-binary-type u3 () (unsigned-integer :bytes 3 :bits-per-byte 8))
+(define-binary-type u4 () (unsigned-integer :bytes 4 :bits-per-byte 8))

String Types

The other kinds of primitive types that are ubiquitous in the ID3 +format are strings. In the previous chapter I discussed some of the +issues you have to consider when dealing with strings in binary files, +such as the difference between character codes and character +encodings.

ID3 uses two different character codes, ISO 8859-1 and Unicode. ISO +8859-1, also known as Latin-1, is an eight-bit character code that +extends ASCII with characters used by the languages of Western +Europe. In other words, the code points from 0-127 map to the same +characters in ASCII and ISO 8859-1, but ISO 8859-1 also provides +mappings for code points up to 255. Unicode is a character code +designed to provide a code point for virtually every character of all +the world's languages. Unicode is a superset of ISO 8859-1 in the +same way that ISO 8859-1 is a superset of ASCII--the code points from +0-255 map to the same characters in both ISO 8859-1 and Unicode. +(Thus, Unicode is also a superset of ASCII.)

Since ISO 8859-1 is an eight-bit character code, it's encoded using +one byte per character. For Unicode strings, ID3 uses the UCS-2 +encoding with a leading byte order mark.4 I'll discuss what a byte order +mark is in a moment.

Reading and writing these two encodings isn't a problem--it's just a +question of reading and writing unsigned integers in various formats, +and you just finished writing the code to do that. The trick is how +you translate those numeric values to Lisp character objects.

The Lisp implementation you're using probably uses either Unicode or +ISO 8859-1 as its internal character code. And since all the values +from 0-255 map to the same characters in both ISO 8859-1 and Unicode, +you can use Lisp's CODE-CHAR and CHAR-CODE functions to +translate those values in both character codes. However, if your Lisp +supports only ISO 8859-1, then you'll be able to represent only the +first 255 Unicode characters as Lisp characters. In other words, in +such a Lisp implementation, if you try to process an ID3 tag that +uses Unicode strings and if any of those strings contain characters +with code points higher than 255, you'll get an error when you try to +translate the code point to a Lisp character. For now I'll assume +either you're using a Unicode-based Lisp or you won't process any +files containing characters outside the ISO 8859-1 range.

The other issue with encoding strings is how to know how many bytes +to interpret as character data. ID3 uses two strategies I mentioned +in the previous chapter--some strings are terminated with a null +character, while other strings occur in positions where you can +determine the number of bytes to read, either because the string at +that position is always the same length or because the string is at +the end of a composite structure whose overall size you know. Note, +however, that the number of bytes isn't necessarily the same as the +number of characters in the string.

Putting all these variations together, the ID3 format uses four ways +to read and write strings--two characters crossed with two ways of +delimiting the string data.

Obviously, much of the logic of reading and writing strings will be +quite similar. So, you can start by defining two binary types, one +for reading strings of a specific length (in characters) and another +for reading terminated strings. Both types take advantage of that the +type argument to read-value and write-value is just +another piece of data; you can make the type of character to read a +parameter of these types. This is a technique you'll use quite a few +times in this chapter.

(define-binary-type generic-string (length character-type)
+  (:reader (in)
+    (let ((string (make-string length)))
+      (dotimes (i length)
+        (setf (char string i) (read-value character-type in)))
+      string))
+  (:writer (out string)
+    (dotimes (i length)
+      (write-value character-type out (char string i)))))
+
+(define-binary-type generic-terminated-string (terminator character-type)
+  (:reader (in)
+    (with-output-to-string (s)
+      (loop for char = (read-value character-type in)
+            until (char= char terminator) do (write-char char s))))
+  (:writer (out string)
+    (loop for char across string
+          do (write-value character-type out char)
+          finally (write-value character-type out terminator))))

With these types available, there's not much to reading ISO 8859-1 +strings. Because the character-type argument you pass to +read-value and write-value of a generic-string +must be the name of a binary type, you need to define an +iso-8859-1-char binary type. This also gives you a good place +to put a bit of sanity checking on the code points of characters you +read and write.

(define-binary-type iso-8859-1-char ()
+  (:reader (in)
+    (let ((code (read-byte in)))
+      (or (code-char code)
+          (error "Character code ~d not supported" code))))
+  (:writer (out char)
+    (let ((code (char-code char)))
+      (if (<= 0 code #xff)
+          (write-byte code out)
+          (error "Illegal character for iso-8859-1 encoding: character: ~c with code: ~d" char code)))))

Now defining the ISO 8859-1 string types is trivial using the short +form of define-binary-type as follows:

(define-binary-type iso-8859-1-string (length)
+  (generic-string :length length :character-type 'iso-8859-1-char))
+
+(define-binary-type iso-8859-1-terminated-string (terminator)
+  (generic-terminated-string :terminator terminator :character-type 'iso-8859-1-char))

Reading UCS-2 strings is only slightly more complex. The complexity +arises because you can encode a UCS-2 code point in two ways: most +significant byte first (big-endian) or least significant byte first +(little-endian). UCS-2 strings therefore start with two extra bytes, +called the byte order mark, made up of the numeric value +#xfeff encoded in either big-endian form or little-endian +form. When reading a UCS-2 string, you read the byte order mark and +then, depending on its value, read either big-endian or little-endian +characters. Thus, you'll need two different UCS-2 character types. +But you need only one version of the sanity-checking code, so you can +define a parameterized binary type like this:

(define-binary-type ucs-2-char (swap)
+  (:reader (in)
+    (let ((code (read-value 'u2 in)))
+      (when swap (setf code (swap-bytes code)))
+      (or (code-char code) (error "Character code ~d not supported" code))))
+  (:writer (out char)
+    (let ((code (char-code char)))
+      (unless (<= 0 code #xffff)
+        (error "Illegal character for ucs-2 encoding: ~c with char-code: ~d" char code))
+      (when swap (setf code (swap-bytes code)))
+      (write-value 'u2 out code))))

where the swap-bytes function can be defined as follows, +taking advantage of LDB being SETFable and thus +ROTATEFable:

(defun swap-bytes (code)
+  (assert (<= code #xffff))
+  (rotatef (ldb (byte 8 0) code) (ldb (byte 8 8) code))
+  code)

Using ucs-2-char, you can define two character types that will +be used as the character-type arguments to the generic string +functions.

(define-binary-type ucs-2-char-big-endian () (ucs-2-char :swap nil))
+
+(define-binary-type ucs-2-char-little-endian () (ucs-2-char :swap t))

Then you need a function that returns the name of the character type +to use based on the value of the byte order mark.

(defun ucs-2-char-type (byte-order-mark)
+  (ecase byte-order-mark
+    (#xfeff 'ucs-2-char-big-endian)
+    (#xfffe 'ucs-2-char-little-endian)))

Now you can define length- and terminator-delimited string types for +UCS-2-encoded strings that read the byte order mark and use it to +determine which variant of UCS-2 character to pass as the +character-type argument to read-value and +write-value. The only other wrinkle is that you need to +translate the length argument, which is a number of bytes, to +the number of characters to read, accounting for the byte order mark.

(define-binary-type ucs-2-string (length)
+  (:reader (in)
+    (let ((byte-order-mark (read-value 'u2 in))
+          (characters (1- (/ length 2))))
+      (read-value
+       'generic-string in
+       :length characters
+       :character-type (ucs-2-char-type byte-order-mark))))
+  (:writer (out string)
+    (write-value 'u2 out #xfeff)
+    (write-value
+     'generic-string out string
+     :length (length string)
+     :character-type (ucs-2-char-type #xfeff))))
+
+(define-binary-type ucs-2-terminated-string (terminator)
+  (:reader (in)
+    (let ((byte-order-mark (read-value 'u2 in)))
+      (read-value
+       'generic-terminated-string in
+       :terminator terminator
+       :character-type (ucs-2-char-type byte-order-mark))))
+  (:writer (out string)
+    (write-value 'u2 out #xfeff)
+    (write-value 
+     'generic-terminated-string out string
+     :terminator terminator
+     :character-type (ucs-2-char-type #xfeff))))

ID3 Tag Header

With the basic primitive types done, you're ready to switch to a +high-level view and start defining binary classes to represent first +the ID3 tag as a whole and then the individual frames.

If you turn first to the ID3v2.2 specification, you'll see that the +basic structure of the tag is this header:

ID3/file identifier      "ID3"
+ID3 version              $02 00
+ID3 flags                %xx000000
+ID3 size             4 * %0xxxxxxx

followed by frame data and padding. Since you've already defined +binary types to read and write all the fields in the header, defining +a class that can read the header of an ID3 tag is just a matter of +putting them together.

(define-binary-class id3-tag ()
+  ((identifier     (iso-8859-1-string :length 3))
+   (major-version  u1)
+   (revision       u1)
+   (flags          u1)
+   (size           id3-tag-size)))

If you have some MP3 files lying around, you can test this much of +the code and also see what version of ID3 tags your MP3s contain. +First you can write a function that reads an id3-tag, as just +defined, from the beginning of a file. Be aware, however, that ID3 +tags aren't required to appear at the beginning of a file, though +these days they almost always do. To find an ID3 tag elsewhere in a +file, you can scan the file looking for the sequence of bytes 73, 68, +51 (in other words, the string "ID3").5 For now +you can probably get away with assuming the tags are the first thing +in the file.

(defun read-id3 (file)
+  (with-open-file (in file :element-type '(unsigned-byte 8))
+    (read-value 'id3-tag in)))

On top of this function you can build a function that takes a +filename and prints the information in the tag header along with the +name of the file.

(defun show-tag-header (file)
+  (with-slots (identifier major-version revision flags size) (read-id3 file)
+    (format t "~a ~d.~d ~8,'0b ~d bytes -- ~a~%"
+            identifier major-version revision flags size (enough-namestring file))))

It prints output that looks like this:

ID3V2> (show-tag-header "/usr2/mp3/Kitka/Wintersongs/02 Byla Cesta.mp3")
+ID3 2.0 00000000 2165 bytes -- Kitka/Wintersongs/02 Byla Cesta.mp3
+NIL

Of course, to determine what versions of ID3 are most common in your +MP3 library, it'd be handier to have a function that returns a +summary of all the MP3 files under a given directory. You can write +one easily enough using the walk-directory function defined in +Chapter 15. First define a helper function that tests whether a given +filename has an mp3 extension.

(defun mp3-p (file)
+  (and
+   (not (directory-pathname-p file))
+   (string-equal "mp3" (pathname-type file))))

Then you can combine show-tag-header and mp3-p with +walk-directory to print a summary of the ID3 header in each +file under a given directory.

(defun show-tag-headers (dir) 
+  (walk-directory dir #'show-tag-header :test #'mp3-p))

However, if you have a lot of MP3s, you may just want a count of how +many ID3 tags of each version you have in your MP3 collection. To get +that information, you might write a function like this:

(defun count-versions (dir)
+  (let ((versions (mapcar #'(lambda (x) (cons x 0)) '(2 3 4))))
+    (flet ((count-version (file)
+             (incf (cdr (assoc (major-version (read-id3 file)) versions)))))
+      (walk-directory dir #'count-version :test #'mp3-p))
+    versions))

Another function you'll need in Chapter 29 is one that tests whether +a file actually starts with an ID3 tag, which you can define like +this:

(defun id3-p (file)
+  (with-open-file (in file :element-type '(unsigned-byte 8))
+    (string= "ID3" (read-value 'iso-8859-1-string in :length 3))))

ID3 Frames

As I discussed earlier, the bulk of an ID3 tag is divided into +frames. Each frame has a structure similar to that of the tag as a +whole. Each frame starts with a header indicating what kind of frame +it is and the size of the frame in bytes. The structure of the frame +header changed slightly between version 2.2 and version 2.3 of the +ID3 format, and eventually you'll have to deal with both forms. To +start, you can focus on parsing version 2.2 frames.

The header of a 2.2 frame consists of three bytes that encode a +three-character ISO 8859-1 string followed by a three-byte unsigned +integer, which specifies the size of the frame in bytes, excluding +the six-byte header. The string identifies what type of frame it is, +which determines how you parse the data following the size. This is +exactly the kind of situation for which you defined the +define-tagged-binary-class macro. You can define a tagged +class that reads the frame header and then dispatches to the +appropriate concrete class using a function that maps IDs to a class +names.

(define-tagged-binary-class id3-frame ()
+  ((id (iso-8859-1-string :length 3))
+   (size u3))
+  (:dispatch (find-frame-class id)))

Now you're ready to start implementing concrete frame classes. +However, the specification defines quite a few--63 in version 2.2 and +even more in later specs. Even considering frame types that share a +common structure to be equivalent, you'll still find 24 unique frame +types in version 2.2. But only a few of these are used "in the wild." +So rather than immediately setting to work defining classes for each +of the frame types, you can start by writing a generic frame class +that lets you read the frames in a tag without parsing the data +within the frames themselves. This will give you a way to find out +what frames are actually present in the MP3s you want to process. +You'll need this class eventually anyway because the specification +allows for experimental frames that you'll need to be able to read +without parsing.

Since the size field of the frame header tells you exactly how many +bytes long the frame is, you can define a generic-frame class +that extends id3-frame and adds a single field, data, +that will hold an array of bytes.

(define-binary-class generic-frame (id3-frame)
+  ((data (raw-bytes :size size))))

The type of the data field, raw-bytes, just needs to hold an +array of bytes. You can define it like this:

(define-binary-type raw-bytes (size)
+  (:reader (in)
+    (let ((buf (make-array size :element-type '(unsigned-byte 8))))
+      (read-sequence buf in)
+      buf))
+  (:writer (out buf)
+    (write-sequence buf out)))

For the time being, you'll want all frames to be read as +generic-frames, so you can define the find-frame-class +function used in id3-frame's :dispatch expression to +always return generic-frame, regardless of the frame's +id.

(defun find-frame-class (id)
+  (declare (ignore id))
+  'generic-frame)

Now you need to modify id3-tag so it'll read frames after the +header fields. There's only one tricky bit to reading the frame data: +although the tag header tells you how many bytes long the tag is, +that number includes the padding that can follow the frame data. +Since the tag header doesn't tell you how many frames the tag +contains, the only way to tell when you've hit the padding is to look +for a null byte where you'd expect a frame identifier.

To handle this, you can define a binary type, id3-frames, that +will be responsible for reading the remainder of a tag, creating +frame objects to represent all the frames it finds, and then skipping +over any padding. This type will take as a parameter the tag size, +which it can use to avoid reading past the end of the tag. But the +reading code will also need to detect the beginning of the padding +that can follow the tag's frame data. Rather than calling +read-value directly in id3-frames :reader, you +should use a function read-frame, which you'll define to +return NIL when it detects padding, otherwise returning an +id3-frame object read using read-value. Assuming you +define read-frame so it reads only one byte past the end of +the last frame in order to detect the start of the padding, you can +define the id3-frames binary type like this:

(define-binary-type id3-frames (tag-size)
+  (:reader (in)
+    (loop with to-read = tag-size
+          while (plusp to-read)
+          for frame = (read-frame in)
+          while frame
+          do (decf to-read (+ 6 (size frame)))
+          collect frame
+          finally (loop repeat (1- to-read) do (read-byte in))))
+  (:writer (out frames)
+    (loop with to-write = tag-size
+          for frame in frames
+          do (write-value 'id3-frame out frame)
+          (decf to-write (+ 6 (size frame)))
+          finally (loop repeat to-write do (write-byte 0 out)))))

You can use this type to add a frames slot to id3-tag.

(define-binary-class id3-tag ()
+  ((identifier     (iso-8859-1-string :length 3))
+   (major-version  u1)
+   (revision       u1)
+   (flags          u1)
+   (size           id3-tag-size)
+   (frames         (id3-frames :tag-size size))))

Detecting Tag Padding

Now all that remains is to implement read-frame. This is a bit +tricky since the code that actually reads bytes from the stream is +several layers down from read-frame.

What you'd really like to do in read-frame is read one byte +and return NIL if it's a null and otherwise read a frame with +read-value. Unfortunately, if you read the byte in +read-frame, then it won't be available to be read by +read-value.6

It turns out this is a perfect opportunity to use the condition +system--you can check for null bytes in the low-level code that reads +from the stream and signal a condition when you read a null; +read-frame can then handle the condition by unwinding the +stack before more bytes are read. In addition to turning out to be a +tidy solution to the problem of detecting the start of the tag's +padding, this is also an example of how you can use conditions for +purposes other than handling errors.

You can start by defining a condition type to be signaled by the +low-level code and handled by the high-level code. This condition +doesn't need any slots--you just need a distinct class of condition +so you know no other code will be signaling or handling it.

(define-condition in-padding () ())

Next you need to define a binary type whose :reader reads a +given number of bytes, first reading a single byte and signaling an +in-padding condition if the byte is null and otherwise reading +the remaining bytes as an iso-8859-1-string and combining it +with the first byte read.

(define-binary-type frame-id (length)
+  (:reader (in)
+    (let ((first-byte (read-byte in)))
+      (when (= first-byte 0) (signal 'in-padding))
+      (let ((rest (read-value 'iso-8859-1-string in :length (1- length))))
+        (concatenate
+         'string (string (code-char first-byte)) rest))))
+  (:writer (out id)
+    (write-value 'iso-8859-1-string out id :length length)))

If you redefine id3-frame to make the type of its id +slot frame-id instead of iso-8859-1-string, the +condition will be signaled whenever id3-frame's +read-value method reads a null byte instead of the beginning +of a frame.

(define-tagged-binary-class id3-frame ()
+  ((id (frame-id :length 3))
+   (size u3))
+  (:dispatch (find-frame-class id)))

Now all read-frame has to do is wrap a call to +read-value in a HANDLER-CASE that handles the +in-padding condition by returning NIL.

(defun read-frame (in)
+  (handler-case (read-value 'id3-frame in)
+    (in-padding () nil)))

With read-frame defined, you can now read a complete version +2.2 ID3 tag, representing frames with instances of +generic-frame. In the "What Frames Do You Actually Need?" +section, you'll do some experiments at the REPL to determine what +frame classes you need to implement. But first let's add support for +version 2.3 ID3 tags.

Supporting Multiple Versions of ID3

Currently, id3-tag is defined using +define-binary-class, but if you want to support multiple +versions of ID3, it makes more sense to use a +define-tagged-binary-class that dispatches on the +major-version value. As it turns out, all versions of ID3v2 +have the same structure up to the size field. So, you can define a +tagged binary class like the following that defines this basic +structure and then dispatches to the appropriate version-specific +subclass:

(define-tagged-binary-class id3-tag ()
+  ((identifier     (iso-8859-1-string :length 3))
+   (major-version  u1)
+   (revision       u1)
+   (flags          u1)
+   (size           id3-tag-size))
+  (:dispatch 
+   (ecase major-version
+     (2 'id3v2.2-tag)
+     (3 'id3v2.3-tag))))

Version 2.2 and version 2.3 tags differ in two ways. First, the +header of a version 2.3 tag may be extended with up to four optional +extended header fields, as determined by values in the flags field. +Second, the frame format changed between version 2.2 and version 2.3, +which means you'll have to use different classes to represent version +2.2 frames and the corresponding version 2.3 frames.

Since the new id3-tag class is based on the one you originally +wrote to represent version 2.2 tags, it's not surprising that the new +id3v2.2-tag class is trivial, inheriting most of its slots +from the new id3-tag class and adding the one missing slot, +frames. Because version 2.2 and version 2.3 tags use different +frame formats, you'll have to change the id3-frames type to be +parameterized with the type of frame to read. For now, assume you'll +do that and add a :frame-type argument to the +id3-frames type descriptor like this:

(define-binary-class id3v2.2-tag (id3-tag)
+  ((frames (id3-frames :tag-size size :frame-type 'id3v2.2-frame))))

The id3v2.3-tag class is slightly more complex because of the +optional fields. The first three of the four optional fields are +included when the sixth bit in flags is set. They're a four- +byte integer specifying the size of the extended header, two bytes +worth of flags, and another four-byte integer specifying how many +bytes of padding are included in the tag.7 The fourth optional field, included when +the fifteenth bit of the extended header flags is set, is a four-byte +cyclic redundancy check (CRC) of the rest of the tag.

The binary data library doesn't provide any special support for +optional fields in a binary class, but it turns out that regular +parameterized binary types are sufficient. You can define a type +parameterized with the name of a type and a value that indicates +whether a value of that type should actually be read or written.

(define-binary-type optional (type if)
+  (:reader (in)
+    (when if (read-value type in)))
+  (:writer (out value)
+    (when if (write-value type out value))))

Using if as the parameter name looks a bit strange in that +code, but it makes the optional type descriptors quite +readable. For instance, here's the definition of id3v2.3-tag +using optional slots:

(define-binary-class id3v2.3-tag (id3-tag)
+  ((extended-header-size (optional :type 'u4 :if (extended-p flags)))
+   (extra-flags          (optional :type 'u2 :if (extended-p flags)))
+   (padding-size         (optional :type 'u4 :if (extended-p flags)))
+   (crc                  (optional :type 'u4 :if (crc-p flags extra-flags)))
+   (frames               (id3-frames :tag-size size :frame-type 'id3v2.3-frame))))

where extended-p and crc-p are helper functions that +test the appropriate bit of the flags value they're passed. To test +whether an individual bit of an integer is set, you can use +LOGBITP, another bit-twiddling function. It takes an index and +an integer and returns true if the specified bit is set in the +integer.

(defun extended-p (flags) (logbitp 6 flags))
+
+(defun crc-p (flags extra-flags)
+  (and (extended-p flags) (logbitp 15 extra-flags)))

As in the version 2.2 tag class, the frames slot is defined to be of +type id3-frames, passing the name of the frame type as a +parameter. You do, however, need to make a few small changes to +id3-frames and read-frame to support the extra +frame-type parameter.

(define-binary-type id3-frames (tag-size frame-type)
+  (:reader (in)
+    (loop with to-read = tag-size
+          while (plusp to-read)
+          for frame = (read-frame frame-type in)
+          while frame
+          do (decf to-read (+ (frame-header-size frame) (size frame)))
+          collect frame
+          finally (loop repeat (1- to-read) do (read-byte in))))
+  (:writer (out frames)
+    (loop with to-write = tag-size
+          for frame in frames
+          do (write-value frame-type out frame)
+          (decf to-write (+ (frame-header-size frame) (size frame)))
+          finally (loop repeat to-write do (write-byte 0 out)))))
+
+(defun read-frame (frame-type in)
+  (handler-case (read-value frame-type in)
+    (in-padding () nil)))

The changes are in the calls to read-frame and +write-value, where you need to pass the frame-type +argument and, in computing the size of the frame, where you need to +use a function frame-header-size instead of the literal value +6 since the frame header changed size between version 2.2 and +version 2.3. Since the difference in the result of this function is +based on the class of the frame, it makes sense to define it as a +generic function like this:

(defgeneric frame-header-size (frame))

You'll define the necessary methods on that generic function in the +next section after you define the new frame classes.

Versioned Frame Base Classes

Where before you defined a single base class for all frames, you'll +now have two classes, id3v2.2-frame and id3v2.3-frame. +The id3v2.2-frame class will be essentially the same as the +original id3-frame class.

(define-tagged-binary-class id3v2.2-frame ()
+  ((id (frame-id :length 3))
+   (size u3))
+  (:dispatch (find-frame-class id)))

The id3v2.3-frame, on the other hand, requires more changes. +The frame identifier and size fields were extended in version 2.3 +from three to four bytes each, and two bytes worth of flags were +added. Additionally, the frame, like the version 2.3 tag, can contain +optional fields, controlled by the values of three of the frame's +flags.8 With those changes in +mind, you can define the version 2.3 frame base class, along with +some helper functions, like this:

(define-tagged-binary-class id3v2.3-frame ()
+  ((id                (frame-id :length 4))
+   (size              u4)
+   (flags             u2)
+   (decompressed-size (optional :type 'u4 :if (frame-compressed-p flags)))
+   (encryption-scheme (optional :type 'u1 :if (frame-encrypted-p flags)))
+   (grouping-identity (optional :type 'u1 :if (frame-grouped-p flags))))
+  (:dispatch (find-frame-class id)))
+
+(defun frame-compressed-p (flags) (logbitp 7 flags))
+
+(defun frame-encrypted-p (flags) (logbitp 6 flags))
+
+(defun frame-grouped-p (flags) (logbitp 5 flags))

With these two classes defined, you can now implement the methods on +the generic function frame-header-size.

(defmethod frame-header-size ((frame id3v2.2-frame)) 6)
+
+(defmethod frame-header-size ((frame id3v2.3-frame)) 10)

The optional fields in a version 2.3 frame aren't counted as part of +the header for this computation since they're already included in the +value of the frame's size.

Versioned Concrete Frame Classes

In the original definition, generic-frame subclassed +id3-frame. But now id3-frame has been replaced with the +two version-specific base classes, id3v2.2-frame and +id3v2.3-frame. So, you need to define two new versions of +generic-frame, one for each base class. One way to define this +classes would be like this:

(define-binary-class generic-frame-v2.2 (id3v2.2-frame)
+  ((data (raw-bytes :size size))))
+
+(define-binary-class generic-frame-v2.3 (id3v2.3-frame)
+  ((data (raw-bytes :size size))))

However, it's a bit annoying that these two classes are the same +except for their superclass. It's not too bad in this case since +there's only one additional field. But if you take this approach for +other concrete frame classes, ones that have a more complex internal +structure that's identical between the two ID3 versions, the +duplication will be more irksome.

Another approach, and the one you should actually use, is to define a +class generic-frame as a mixin: a class intended to be +used as a superclass along with one of the version-specific base +classes to produce a concrete, version-specific frame class. The only +tricky bit about this approach is that if generic-frame +doesn't extend either of the frame base classes, then you can't refer +to the size slot in its definition. Instead, you must use the +current-binary-object function I discussed at the end of the +previous chapter to access the object you're in the midst of reading +or writing and pass it to size. And you need to account for +the difference in the number of bytes of the total frame size that +will be left over, in the case of a version 2.3 frame, if any of the +optional fields are included in the frame. So, you should define a +generic function data-bytes with methods that do the right +thing for both version 2.2 and version 2.3 frames.

(define-binary-class generic-frame ()
+  ((data (raw-bytes :size (data-bytes (current-binary-object))))))
+
+(defgeneric data-bytes (frame))
+
+(defmethod data-bytes ((frame id3v2.2-frame))
+  (size frame))
+
+(defmethod data-bytes ((frame id3v2.3-frame))
+  (let ((flags (flags frame)))
+    (- (size frame)
+       (if (frame-compressed-p flags) 4 0)
+       (if (frame-encrypted-p flags) 1 0)
+       (if (frame-grouped-p flags) 1 0))))

Then you can define concrete classes that extend one of the +version-specific base classes and generic-frame to define +version-specific generic frame classes.

(define-binary-class generic-frame-v2.2 (id3v2.2-frame generic-frame) ())
+
+(define-binary-class generic-frame-v2.3 (id3v2.3-frame generic-frame) ())

With these classes defined, you can redefine the +find-frame-class function to return the right versioned class +based on the length of the identifier.

(defun find-frame-class (id)
+  (ecase (length id)
+    (3 'generic-frame-v2.2)
+    (4 'generic-frame-v2.3)))

What Frames Do You Actually Need?

With the ability to read both version 2.2 and version 2.3 tags using +generic frames, you're ready to start implementing classes to +represent the specific frames you care about. However, before you +dive in, you should take a breather and figure out what frames you +actually care about since, as I mentioned earlier, the ID3 spec +specifies many frames that are almost never used. Of course, what +frames you care about depends on what kinds of applications you're +interested in writing. If you're mostly interested in extracting +information from existing ID3 tags, then you need implement only the +classes representing the frames containing the information you care +about. On the other hand, if you want to write an ID3 tag editor, you +may need to support all the frames.

Rather than guessing which frames will be most useful, you can use +the code you've already written to poke around a bit at the REPL and +see what frames are actually used in your own MP3s. To start, you +need an instance of id3-tag, which you can get with the +read-id3 function.

ID3V2> (read-id3 "/usr2/mp3/Kitka/Wintersongs/02 Byla Cesta.mp3")
+#<ID3V2.2-TAG @ #x727b2912>

Since you'll want to play with this object a bit, you should save it +in a variable.

ID3V2> (defparameter *id3* (read-id3 "/usr2/mp3/Kitka/Wintersongs/02 Byla Cesta.mp3"))
+*ID3*

Now you can see, for example, how many frames it has.

ID3V2> (length (frames *id3*))
+11

Not too many--let's take a look at what they are.

ID3V2> (frames *id3*)
+(#<GENERIC-FRAME-V2.2 @ #x72dabdda> #<GENERIC-FRAME-V2.2 @ #x72dabec2>
+ #<GENERIC-FRAME-V2.2 @ #x72dabfa2> #<GENERIC-FRAME-V2.2 @ #x72dac08a>
+ #<GENERIC-FRAME-V2.2 @ #x72dac16a> #<GENERIC-FRAME-V2.2 @ #x72dac24a>
+ #<GENERIC-FRAME-V2.2 @ #x72dac32a> #<GENERIC-FRAME-V2.2 @ #x72dac40a>
+ #<GENERIC-FRAME-V2.2 @ #x72dac4f2> #<GENERIC-FRAME-V2.2 @ #x72dac632>
+ #<GENERIC-FRAME-V2.2 @ #x72dac7b2>)

Okay, that's not too informative. What you really want to know are +what kinds of frames are in there. In other words, you want to know +the ids of those frames, which you can get with a simple +MAPCAR like this:

ID3V2> (mapcar #'id (frames *id3*))
+("TT2" "TP1" "TAL" "TRK" "TPA" "TYE" "TCO" "TEN" "COM" "COM" "COM")

If you look up these identifiers in the ID3v2.2 spec, you'll discover +that all the frames with identifiers starting with T are text +information frames and have a similar structure. And COM is the +identifier for comment frames, which have a structure similar to that +of text information frames. The particular text information frames +identified here turn out to be the frames for representing the song +title, artist, album, track, part of set, year, genre, and encoding +program.

Of course, this is just one MP3 file. Maybe other frames are used in +other files. It's easy enough to discover. First define a function +that combines the previous MAPCAR expression with a call to +read-id3 and wraps the whole thing in a DELETE-DUPLICATES +to keep things tidy. You'll have to use a :test argument of +#'string= to DELETE-DUPLICATES to specify that you want +two elements considered the same if they're the same string.

(defun frame-types (file)
+  (delete-duplicates (mapcar #'id (frames (read-id3 file))) :test #'string=))

This should give the same answer except with only one of each +identifier when passed the same filename.

ID3V2> (frame-types "/usr2/mp3/Kitka/Wintersongs/02 Byla Cesta.mp3")
+("TT2" "TP1" "TAL" "TRK" "TPA" "TYE" "TCO" "TEN" "COM")

Then you can use Chapter 15's walk-directory function along +with mp3-p to find every MP3 file under a directory and +combine the results of calling frame-types on each file. +Recall that NUNION is the recycling version of the UNION +function; since frame-types makes a new list for each file, +this is safe.

(defun frame-types-in-dir (dir)
+  (let ((ids ()))
+    (flet ((collect (file)
+             (setf ids (nunion ids (frame-types file) :test #'string=))))
+      (walk-directory dir #'collect :test #'mp3-p))
+    ids))

Now pass it the name of a directory, and it'll tell you the set of +identifiers used in all the MP3 files under that directory. It may +take a few seconds depending how many MP3 files you have, but you'll +probably get something similar to this:

ID3V2> (frame-types-in-dir "/usr2/mp3/")
+("TCON" "COMM" "TRCK" "TIT2" "TPE1" "TALB" "TCP" "TT2" "TP1" "TCM"
+ "TAL" "TRK" "TPA" "TYE" "TCO" "TEN" "COM")

The four-letter identifiers are the version 2.3 equivalents of the +version 2.2 identifiers I discussed previously. Since the information +stored in those frames is exactly the information you'll need in +Chapter 27, it makes sense to implement classes only for the frames +actually used, namely, text information and comment frames, which +you'll do in the next two sections. If you decide later that you want +to support other frame types, it's mostly a matter of translating the +ID3 specifications into the appropriate binary class definitions.

Text Information Frames

All text information frames consist of two fields: a single byte +indicating which string encoding is used in the frame and a string +encoded in the remaining bytes of the frame. If the encoding byte is +zero, the string is encoded in ISO 8859-1; if the encoding is one, +the string is a UCS-2 string.

You've already defined binary types representing the four different +kinds of strings--two different encodings each with two different +methods of delimiting the string. However, define-binary-class +provides no direct facility for determining the type of value to read +based on other values in the object. Instead, you can define a binary +type that you pass the value of the encoding byte and that then reads +or writes the appropriate kind of string.

As long as you're defining such a type, you can also define it to +take two parameters, :length and :terminator, and pick +the right type of string based on which argument is supplied. To +implement this new type, you must first define some helper functions. +The first two return the name of the appropriate string type based on +the encoding byte.

(defun non-terminated-type (encoding)
+  (ecase encoding
+    (0 'iso-8859-1-string)
+    (1 'ucs-2-string)))
+
+(defun terminated-type (encoding)
+  (ecase encoding
+    (0 'iso-8859-1-terminated-string)
+    (1 'ucs-2-terminated-string)))

Then string-args uses the encoding byte, the length, and the +terminator to determine several of the arguments to be passed to +read-value and write-value by the :reader and +:writer of id3-encoded-string. One of the length and +terminator arguments to string-args should always be NIL.

(defun string-args (encoding length terminator)
+  (cond 
+    (length
+     (values (non-terminated-type encoding) :length length))
+    (terminator
+     (values (terminated-type encoding) :terminator terminator))))

With those helpers, the definition of id3-encoded-string is +simple. One detail to note is that the keyword--either :length +or :terminator--used in the call to read-value and +write-value is just another piece of data returned by +string-args. Although keywords in arguments lists are almost +always literal keywords, they don't have to be.

(define-binary-type id3-encoded-string (encoding length terminator)
+  (:reader (in) 
+    (multiple-value-bind (type keyword arg)
+        (string-args encoding length terminator)
+      (read-value type in keyword arg)))
+  (:writer (out string)
+    (multiple-value-bind (type keyword arg)
+        (string-args encoding length terminator)
+      (write-value type out string keyword arg))))

Now you can define a text-info mixin class, much the way you +defined generic-frame earlier.

(define-binary-class text-info-frame ()
+  ((encoding u1)
+   (information (id3-encoded-string :encoding encoding :length (bytes-left 1)))))

As when you defined generic-frame, you need access to the size +of the frame, in this case to compute the :length argument to +pass to id3-encoded-string. Because you'll need to do a similar +computation in the next class you define, you can go ahead and define +a helper function, bytes-left, that uses +current-binary-object to get at the size of the frame.

(defun bytes-left (bytes-read)
+  (- (size (current-binary-object)) bytes-read))

Now, as you did with the generic-frame mixin, you can define +two version-specific concrete classes with a minimum of duplicated +code.

(define-binary-class text-info-frame-v2.2 (id3v2.2-frame text-info-frame) ())
+
+(define-binary-class text-info-frame-v2.3 (id3v2.3-frame text-info-frame) ())

To wire these classes in, you need to modify find-frame-class +to return the appropriate class name when the ID indicates the frame +is a text information frame, namely, whenever the ID starts with +T and isn't TXX or TXXX.

(defun find-frame-class (name)
+  (cond
+    ((and (char= (char name 0) #\T)
+          (not (member name '("TXX" "TXXX") :test #'string=)))
+     (ecase (length name)
+       (3 'text-info-frame-v2.2)
+       (4 'text-info-frame-v2.3)))
+    (t
+     (ecase (length name)
+       (3 'generic-frame-v2.2)
+       (4 'generic-frame-v2.3)))))

Comment Frames

Another commonly used frame type is the comment frame, which is like a +text information frame with a few extra fields. Like a text +information frame, it starts with a single byte indicating the string +encoding used in the frame. That byte is followed by a three-character +ISO 8859-1 string (regardless of the value of the string encoding +byte), which indicates what language the comment is in using an +ISO-639-2 code, for example, "eng" for English or "jpn" for Japanese. +That field is followed by two strings encoded as indicated by the +first byte. The first is a null-terminated string containing a +description of the comment. The second, which takes up the remainder +of the frame, is the comment text itself.

(define-binary-class comment-frame ()
+  ((encoding u1)
+   (language (iso-8859-1-string :length 3))
+   (description (id3-encoded-string :encoding encoding :terminator +null+))
+   (text (id3-encoded-string
+          :encoding encoding
+          :length (bytes-left
+                   (+ 1 ; encoding
+                      3 ; language
+                      (encoded-string-length description encoding t)))))))

As in the definition of the text-info mixin, you can use +bytes-left to compute the size of the final string. However, +since the description field is a variable-length string, the +number of bytes read prior to the start of text isn't a +constant. To make matters worse, the number of bytes used to encode +description is dependent on the encoding. So, you should +define a helper function that returns the number of bytes used to +encode a string given the string, the encoding code, and a boolean +indicating whether the string is terminated with an extra character.

(defun encoded-string-length (string encoding terminated)
+  (let ((characters (+ (length string) (if terminated 1 0))))
+    (* characters (ecase encoding (0 1) (1 2)))))

And, as before, you can define the concrete version-specific comment +frame classes and wire them into find-frame-class.

(define-binary-class comment-frame-v2.2 (id3v2.2-frame comment-frame) ())
+
+(define-binary-class comment-frame-v2.3 (id3v2.3-frame comment-frame) ())
+
+(defun find-frame-class (name)
+  (cond
+    ((and (char= (char name 0) #\T)
+          (not (member name '("TXX" "TXXX") :test #'string=)))
+     (ecase (length name)
+       (3 'text-info-frame-v2.2)
+       (4 'text-info-frame-v2.3)))
+    ((string= name "COM")  'comment-frame-v2.2)
+    ((string= name "COMM") 'comment-frame-v2.3)
+    (t
+     (ecase (length name)
+       (3 'generic-frame-v2.2)
+       (4 'generic-frame-v2.3)))))

Extracting Information from an ID3 Tag

Now that you have the basic ability to read and write ID3 tags, you +have a lot of directions you could take this code. If you want to +develop a complete ID3 tag editor, you'll need to implement specific +classes for all the frame types. You'd also need to define methods +for manipulating the tag and frame objects in a consistent way (for +instance, if you change the value of a string in a +text-info-frame, you'll likely need to adjust the size); as +the code stands, there's nothing to make sure that +happens.9

Or, if you just need to extract certain pieces of information about +an MP3 file from its ID3 tag--as you will when you develop a +streaming MP3 server in Chapters 27, 28, and 29--you'll need to write +functions that find the appropriate frames and extract the +information you want.

Finally, to make this production-quality code, you'd have to pore +over the ID3 specs and deal with the details I skipped over in the +interest of space. In particular, some of the flags in both the tag +and the frame can affect the way the contents of the tag or frame is +read; unless you write some code that does the right thing when those +flags are set, there may be ID3 tags that this code won't be able to +parse correctly. But the code from this chapter should be capable of +parsing nearly all the MP3s you actually encounter.

For now you can finish with a few functions to extract individual +pieces of information from an id3-tag. You'll need these +functions in Chapter 27 and probably in other code that uses this +library. They belong in this library because they depend on details +of the ID3 format that the users of this library shouldn't have to +worry about.

To get, say, the name of the song of the MP3 from which an +id3-tag was extracted, you need to find the ID3 frame with a +specific identifier and then extract the information field. And some +pieces of information, such as the genre, can require further +decoding. Luckily, all the frames that contain the information you'll +care about are text information frames, so extracting a particular +piece of information mostly boils down to using the right identifier +to look up the appropriate frame. Of course, the ID3 authors decided +to change all the identifiers between ID3v2.2 and ID3v2.3, so you'll +have to account for that.

Nothing too complex--you just need to figure out the right path to +get to the various pieces of information. This is a perfect bit of +code to develop interactively, much the way you figured out what +frame classes you needed to implement. To start, you need an +id3-tag object to play with. Assuming you have an MP3 laying +around, you can use read-id3 like this:

ID3V2> (defparameter *id3* (read-id3 "Kitka/Wintersongs/02 Byla Cesta.mp3"))
+*ID3*
+ID3V2> *id3*
+#<ID3V2.2-TAG @ #x73d04c1a>

replacing Kitka/Wintersongs/02 Byla Cesta.mp3 with the +filename of your MP3. Once you have your id3-tag object, you +can start poking around. For instance, you can check out the list of +frame objects with the frames function.

ID3V2> (frames *id3*)
+(#<TEXT-INFO-FRAME-V2.2 @ #x73d04cca>
+ #<TEXT-INFO-FRAME-V2.2 @ #x73d04dba>
+ #<TEXT-INFO-FRAME-V2.2 @ #x73d04ea2>
+ #<TEXT-INFO-FRAME-V2.2 @ #x73d04f9a>
+ #<TEXT-INFO-FRAME-V2.2 @ #x73d05082>
+ #<TEXT-INFO-FRAME-V2.2 @ #x73d0516a>
+ #<TEXT-INFO-FRAME-V2.2 @ #x73d05252>
+ #<TEXT-INFO-FRAME-V2.2 @ #x73d0533a>
+ #<COMMENT-FRAME-V2.2 @ #x73d0543a>
+ #<COMMENT-FRAME-V2.2 @ #x73d05612>
+ #<COMMENT-FRAME-V2.2 @ #x73d0586a>)

Now suppose you want to extract the song title. It's probably in one +of those frames, but to find it, you need to find the frame with the +"TT2" identifier. Well, you can check easily enough to see if the tag +contains such a frame by extracting all the identifiers like this:

ID3V2> (mapcar #'id (frames *id3*))
+("TT2" "TP1" "TAL" "TRK" "TPA" "TYE" "TCO" "TEN" "COM" "COM" "COM")

There it is, the first frame. However, there's no guarantee it'll +always be the first frame, so you should probably look it up by +identifier rather than position. That's also straightforward using +the FIND function.

ID3V2> (find "TT2" (frames *id3*) :test #'string= :key #'id)
+#<TEXT-INFO-FRAME-V2.2 @ #x73d04cca>

Now, to get at the actual information in the frame, do this:

ID3V2> (information (find "TT2" (frames *id3*) :test #'string= :key #'id))
+"Byla Cesta^@"

Whoops. That ^@ is how Emacs prints a null character. In a +maneuver reminiscent of the kludge that turned ID3v1 into ID3v1.1, +the information slot of a text information frame, though not +officially a null-terminated string, can contain a null, and ID3 +readers are supposed to ignore any characters after the null. So, you +need a function that takes a string and returns the contents up to +the first null character, if any. That's easy enough using the ++null+ constant from the binary data library.

(defun upto-null (string)
+  (subseq string 0 (position +null+ string)))

Now you can get just the title.

ID3V2> (upto-null (information (find "TT2" (frames *id3*) :test #'string= :key #'id)))
+"Byla Cesta"

You could just wrap that code in a function named song that +takes an id3-tag as an argument, and you'd be done. However, +the only difference between this code and the code you'll use to +extract the other pieces of information you'll need (such as the +album name, the artist, and the genre) is the identifier. So, it's +better to split up the code a bit. For starters, you can write a +function that just finds a frame given an id3-tag and an +identifier like this:

(defun find-frame (id3 id)
+  (find id (frames id3) :test #'string= :key #'id))
+
+ID3V2> (find-frame *id3* "TT2")
+#<TEXT-INFO-FRAME-V2.2 @ #x73d04cca>

Then the other bit of code, the part that extracts the information +from a text-info-frame, can go in another function.

(defun get-text-info (id3 id)
+  (let ((frame (find-frame id3 id)))
+    (when frame (upto-null (information frame)))))
+
+ID3V2> (get-text-info *id3* "TT2")
+"Byla Cesta"

Now the definition of song is just a matter of passing the +right identifier.

(defun song (id3) (get-text-info id3 "TT2"))
+
+ID3V2> (song *id3*)
+"Byla Cesta"

However, this definition of song works only with version 2.2 +tags since the identifier changed from "TT2" to "TIT2" between +version 2.2 and version 2.3. And all the other tags changed too. +Since the user of this library shouldn't have to know about different +versions of the ID3 format to do something as simple as get the song +title, you should probably handle those details for them. A simple +way is to change find-frame to take not just a single +identifier but a list of identifiers like this:

(defun find-frame (id3 ids)
+  (find-if #'(lambda (x) (find (id x) ids :test #'string=)) (frames id3)))

Then change get-text-info slightly so it can take one or more +identifiers using a &rest parameter.

(defun get-text-info (id3 &rest ids)
+  (let ((frame (find-frame id3 ids)))
+    (when frame (upto-null (information frame)))))

Then the change needed to allow song to support both version +2.2 and version 2.3 tags is just a matter of adding the version 2.3 +identifier.

(defun song (id3) (get-text-info id3 "TT2" "TIT2"))

Then you just need to look up the appropriate version 2.2 and version +2.3 frame identifiers for any fields for which you want to provide an +accessor function. Here are the ones you'll need in Chapter 27:

(defun album (id3) (get-text-info id3 "TAL" "TALB"))
+
+(defun artist (id3) (get-text-info id3 "TP1" "TPE1"))
+
+(defun track (id3) (get-text-info id3 "TRK" "TRCK"))
+
+(defun year (id3) (get-text-info id3 "TYE" "TYER" "TDRC"))
+
+(defun genre (id3) (get-text-info id3 "TCO" "TCON"))

The last wrinkle is that the way the genre is stored in the +TCO or TCON frames isn't always human readable. Recall that in ID3v1, +genres were stored as a single byte that encoded a particular genre +from a fixed list. Unfortunately, those codes live on in ID3v2--if +the text of the genre frame is a number in parentheses, the number is +supposed to be interpreted as an ID3v1 genre code. But, again, users +of this library probably won't care about that ancient history. So, +you should provide a function that automatically translates the +genre. The following function uses the genre function just +defined to extract the actual genre text and then checks whether it +starts with a left parenthesis, decoding the version 1 genre code +with a function you'll define in a moment if it does:

(defun translated-genre (id3)
+  (let ((genre (genre id3)))
+    (if (and genre (char= #\( (char genre 0)))
+      (translate-v1-genre genre)
+      genre)))

Since a version 1 genre code is effectively just an index into an +array of standard names, the easiest way to implement +translate-v1-genre is to extract the number from the genre +string and use it as an index into an actual array.

(defun translate-v1-genre (genre)
+  (aref *id3-v1-genres* (parse-integer genre :start 1 :junk-allowed t)))

Then all you need to do is to define the array of names. The +following array of names includes the 80 official version 1 genres +plus the genres created by the authors of Winamp:

(defparameter *id3-v1-genres*
+  #(
+    ;; These are the official ID3v1 genres.
+    "Blues" "Classic Rock" "Country" "Dance" "Disco" "Funk" "Grunge"
+    "Hip-Hop" "Jazz" "Metal" "New Age" "Oldies" "Other" "Pop" "R&B" "Rap"
+    "Reggae" "Rock" "Techno" "Industrial" "Alternative" "Ska"
+    "Death Metal" "Pranks" "Soundtrack" "Euro-Techno" "Ambient"
+    "Trip-Hop" "Vocal" "Jazz+Funk" "Fusion" "Trance" "Classical"
+    "Instrumental" "Acid" "House" "Game" "Sound Clip" "Gospel" "Noise"
+    "AlternRock" "Bass" "Soul" "Punk" "Space" "Meditative"
+    "Instrumental Pop" "Instrumental Rock" "Ethnic" "Gothic" "Darkwave"
+    "Techno-Industrial" "Electronic" "Pop-Folk" "Eurodance" "Dream"
+    "Southern Rock" "Comedy" "Cult" "Gangsta" "Top 40" "Christian Rap"
+    "Pop/Funk" "Jungle" "Native American" "Cabaret" "New Wave"
+    "Psychadelic" "Rave" "Showtunes" "Trailer" "Lo-Fi" "Tribal"
+    "Acid Punk" "Acid Jazz" "Polka" "Retro" "Musical" "Rock & Roll"
+    "Hard Rock"
+
+    ;; These were made up by the authors of Winamp but backported into
+    ;; the ID3 spec.
+    "Folk" "Folk-Rock" "National Folk" "Swing" "Fast Fusion"
+    "Bebob" "Latin" "Revival" "Celtic" "Bluegrass" "Avantgarde"
+    "Gothic Rock" "Progressive Rock" "Psychedelic Rock" "Symphonic Rock"
+    "Slow Rock" "Big Band" "Chorus" "Easy Listening" "Acoustic" "Humour"
+    "Speech" "Chanson" "Opera" "Chamber Music" "Sonata" "Symphony"
+    "Booty Bass" "Primus" "Porn Groove" "Satire" "Slow Jam" "Club"
+    "Tango" "Samba" "Folklore" "Ballad" "Power Ballad" "Rhythmic Soul"
+    "Freestyle" "Duet" "Punk Rock" "Drum Solo" "A capella" "Euro-House"
+    "Dance Hall"
+
+    ;; These were also invented by the Winamp folks but ignored by the
+    ;; ID3 authors.
+    "Goa" "Drum & Bass" "Club-House" "Hardcore" "Terror" "Indie"
+    "BritPop" "Negerpunk" "Polsk Punk" "Beat" "Christian Gangsta Rap"
+    "Heavy Metal" "Black Metal" "Crossover" "Contemporary Christian"
+    "Christian Rock" "Merengue" "Salsa" "Thrash Metal" "Anime" "Jpop"
+    "Synthpop"))

Once again, it probably feels like you wrote a ton of code in this +chapter. But if you put it all in a file, or if you download the +version from this book's Web site, you'll see it's just not that many +lines--most of the pain of writing this library stems from having to +understand the intricacies of the ID3 format itself. Anyway, now you +have a major piece of what you'll turn into a streaming MP3 server in +Chapters 27, 28, and 29. The other major bit of infrastructure you'll +need is a way to write server-side Web software, the topic of the +next chapter. +


1Ripping is the process by which a +song on an audio CD is converted to an MP3 file on your hard drive. +These days most ripping software also automatically retrieves +information about the songs being ripped from online databases such +as Gracenote (née the Compact Disc Database [CDDB]) or FreeDB, which +it then embeds in the MP3 files as ID3 tags.

2Almost all file systems provide the ability to overwrite +existing bytes of a file, but few, if any, provide a way to add or +remove data at the beginning or middle of a file without having to +rewrite the rest of the file. Since ID3 tags are typically stored at +the beginning of a file, to rewrite an ID3 tag without disturbing the +rest of the file you must replace the old tag with a new tag of +exactly the same length. By writing ID3 tags with a certain amount of +padding, you have a better chance of being able to do so--if the new +tag has more data than the original tag, you use less padding, and if +it's shorter, you use more.

3The frame data following the ID3 header +could also potentially contain the illegal sequence. That's prevented +using a different scheme that's turned on via one of the flags in the +tag header. The code in this chapter doesn't account for the +possibility that this flag might be set; in practice it's rarely +used.

4In ID3v2.4, UCS-2 +is replaced by the virtually identical UTF-16, and UTF-16BE and UTF-8 +are added as additional encodings.

5The 2.4 version of the +ID3 format also supports placing a footer at the end of a tag, which +makes it easier to find a tag appended to the end of a file.

6Character streams support two functions, +PEEK-CHAR and UNREAD-CHAR, either of which would be a +perfect solution to this problem, but binary streams support no +equivalent functions.

7If a tag had an +extended header, you could use this value to determine where the +frame data should end. However, if the extended header isn't used, +you'd have to use the old algorithm anyway, so it's not worth adding +code to do it another way.

8These flags, in addition to controlling whether the +optional fields are included, can affect the parsing of the rest of +the tag. In particular, if the seventh bit of the flags is set, then +the actual frame data is compressed using the zlib algorithm, and if +the sixth bit is set, the data is encrypted. In practice these +options are rarely, if ever, used, so you can get away with ignoring +them for now. But that would be an area you'd have to address to make +this a production-quality ID3 library. One simple half solution would +be to change find-frame-class to accept a second argument and +pass it the flags; if the frame is compressed or encrypted, you could +instantiate a generic frame to hold the data.

9Ensuring that kind of interfield consistency would be a +fine application for :after methods on the accessor generic +functions. For instance, you could define this :after method +to keep size in sync with the information string:

(defmethod (setf information) :after (value (frame text-info-frame))
+  (declare (ignore value))
+  (with-slots (encoding size information) frame
+    (setf size (encoded-string-length information encoding nil))))
\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-an-mp3-browser.html b/clones/gigamonkeys.com/book/practical-an-mp3-browser.html new file mode 100644 index 00000000..c681cef4 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-an-mp3-browser.html @@ -0,0 +1,863 @@ +Practical: An MP3 Browser

29. Practical: An MP3 Browser

The final step in building the MP3 streaming application is to provide +a Web interface that allows a user to find the songs they want to +listen to and add them to a playlist that the Shoutcast server will +draw upon when the user's MP3 client requests the stream URL. For this +component of the application, you'll pull together several bits of +code from the previous few chapters: the MP3 database, the +define-url-function macro from Chapter 26, and, of course, the +Shoutcast server itself.

Playlists

The basic idea behind the interface will be that each MP3 client that +connects to the Shoutcast server gets its own playlist, which +serves as the source of songs for the Shoutcast server. A playlist +will also provide facilities beyond those needed by the Shoutcast +server: through the Web interface the user will be able to add songs +to the playlist, delete songs already in the playlist, and reorder +the playlist by sorting and shuffling.

You can define a class to represent playlists like this:

(defclass playlist ()
+  ((id           :accessor id           :initarg :id)
+   (songs-table  :accessor songs-table  :initform (make-playlist-table))
+   (current-song :accessor current-song :initform *empty-playlist-song*)
+   (current-idx  :accessor current-idx  :initform 0)
+   (ordering     :accessor ordering     :initform :album)
+   (shuffle      :accessor shuffle      :initform :none)
+   (repeat       :accessor repeat       :initform :none)
+   (user-agent   :accessor user-agent   :initform "Unknown")
+   (lock         :reader   lock         :initform (make-process-lock))))

The id of a playlist is the key you extract from the request +object passed to find-song-source when looking up a playlist. +You don't actually need to store it in the playlist object, +but it makes debugging a bit easier if you can find out from an +arbitrary playlist object what its id is.

The heart of the playlist is the songs-table slot, which will +hold a table object. The schema for this table will be the +same as for the main MP3 database. The function +make-playlist-table, which you use to initialize +songs-table, is simply this:

(defun make-playlist-table ()
+  (make-instance 'table :schema *mp3-schema*))
The Package

By storing the list of songs as a table, you can use the database +functions from Chapter 27 to manipulate the playlist: you can add to +the playlist with insert-row, delete songs with +delete-rows, and reorder the playlist with sort-rows +and shuffle-table.

The current-song and current-idx slots keep track of +which song is playing: current-song is an actual song +object, while current-idx is the index into the +songs-table of the row representing the current song. You'll +see in the section "Manipulating the Playlist" how to make sure +current-song is updated whenever current-idx changes.

The ordering and shuffle slots hold information about +how the songs in songs-table are to be ordered. The +ordering slot holds a keyword that tells how the +songs-table should be sorted when it's not shuffled. The legal +values are :genre, :artist, :album, and +:song. The shuffle slot holds one of the keywords +:none, :song, or :album, which specifies how +songs-table should be shuffled, if at all.

The repeat slot also holds a keyword, one of :none, +:song, or :all, which specifies the repeat mode for the +playlist. If repeat is :none, after the last song in +the songs-table has been played, the current-song goes +back to a default MP3. When :repeat is :song, the +playlist keeps returning the same current-song forever. And if +it's :all, after the last song, current-song goes back +to the first song.

The user-agent slot holds the value of the User-Agent header +sent by the MP3 client in its request for the stream. You need to +hold onto this value purely for use in the Web interface--the +User-Agent header identifies the program that made the request, so +you can display the value on the page that lists all the playlists to +make it easier to tell which playlist goes with which connection when +multiple clients connect.

Finally, the lock slot holds a process lock created with +the function make-process-lock, which is part of Allegro's +MULTIPROCESSING package. You'll need to use that lock in +certain functions that manipulate playlist objects to ensure +that only one thread at a time manipulates a given playlist object. +You can define the following macro, built upon the +with-process-lock macro from MULTIPROCESSING, to give +an easy way to wrap a body of code that should be performed while +holding a playlist's lock:

(defmacro with-playlist-locked ((playlist) &body body)
+  `(with-process-lock ((lock ,playlist))
+     ,@body))

The with-process-lock macro acquires exclusive access to the +process lock given and then executes the body forms, releasing the +lock afterward. By default, with-process-lock allows recursive +locks, meaning the same thread can safely acquire the same lock +multiple times.

Playlists As Song Sources

To use playlists as a source of songs for the Shoutcast server, +you'll need to implement a method on the generic function +find-song-source from Chapter 28. Since you're going to have +multiple playlists, you need a way to find the right one for each +client that connects to the server. The mapping part is easy--you can +define a variable that holds an EQUAL hash table that you can +use to map from some identifier to the playlist object.

(defvar *playlists* (make-hash-table :test #'equal))

You'll also need to define a process lock to protect access to this +hash table like this:

(defparameter *playlists-lock* (make-process-lock :name "playlists-lock"))

Then define a function that looks up a playlist given an ID, creating +a new playlist object if necessary and using +with-process-lock to ensure that only one thread at a time +manipulates the hash table.1

(defun lookup-playlist (id)
+  (with-process-lock (*playlists-lock*)
+    (or (gethash id *playlists*)
+        (setf (gethash id *playlists*) (make-instance 'playlist :id id)))))

Then you can implement find-song-source on top of that +function and another, playlist-id, that takes an AllegroServe +request object and returns the appropriate playlist identifier. The +find-song-source function is also where you grab the +User-Agent string out of the request object and stash it in the +playlist object.

(defmethod find-song-source ((type (eql 'playlist)) request)
+  (let ((playlist (lookup-playlist (playlist-id request))))
+    (with-playlist-locked (playlist)
+      (let ((user-agent (header-slot-value request :user-agent)))
+        (when user-agent (setf (user-agent playlist) user-agent))))
+    playlist))

The trick, then, is how you implement playlist-id, the +function that extracts the identifier from the request object. You +have a couple options, each with different implications for the user +interface. You can pull whatever information you want out of the +request object, but however you decide to identify the client, you +need some way for the user of the Web interface to get hooked up to +the right playlist.

For now you can take an approach that "just works" as long as there's +only one MP3 client per machine connecting to the server and as long +as the user is browsing the Web interface from the machine running +the MP3 client: you'll use the IP address of the client machine as +the identifier. This way you can find the right playlist for a +request regardless of whether the request is from the MP3 client or a +Web browser. You will, however, provide a way in the Web interface to +select a different playlist from the browser, so the only real +constraint this choice puts on the application is that there can be +only one connected MP3 client per client IP address.2 The implementation of playlist-id looks like this:

(defun playlist-id (request)
+  (ipaddr-to-dotted (remote-host (request-socket request))))

The function request-socket is part of AllegroServe, while +remote-host and ipaddr-to-dotted are part of Allegro's +socket library.

To make a playlist usable as a song source by the Shoutcast server, +you need to define methods on current-song, +still-current-p, and maybe-move-to-next-song that +specialize their source parameter on playlist. The +current-song method is already taken care of: by defining the +accessor current-song on the eponymous slot, you automatically +got a current-song method specialized on playlist that +returns the value of that slot. However, to make accesses to the +playlist thread safe, you need to lock the playlist +before accessing the current-song slot. In this case, the +easiest way is to define an :around method like the following:

(defmethod current-song :around ((playlist playlist))
+  (with-playlist-locked (playlist) (call-next-method)))

Implementing still-current-p is also quite simple, assuming +you can be sure that current-song gets updated with a new +song object only when the current song actually changes. +Again, you need to acquire the process lock to ensure you get a +consistent view of the playlist's state.

(defmethod still-current-p (song (playlist playlist))
+  (with-playlist-locked (playlist)
+    (eql song (current-song playlist))))

The trick, then, is to make sure the current-song slot gets +updated at the right times. However, the current song can change in a +number of ways. The obvious one is when the Shoutcast server calls +maybe-move-to-next-song. But it can also change when songs are +added to the playlist, when the Shoutcast server has run out of +songs, or even if the playlist's repeat mode is changed.

Rather than trying to write code specific to every situation to +determine whether to update current-song, you can define a +function, update-current-if-necessary, that updates +current-song if the song object in current-song +no longer matches the file that the current-idx slot says +should be playing. Then, if you call this function after any +manipulation of the playlist that could possibly put those two slots +out of sync, you're sure to keep current-song set properly. +Here are update-current-if-necessary and its helper functions:

(defun update-current-if-necessary (playlist)
+  (unless (equal (file (current-song playlist))
+                 (file-for-current-idx playlist))
+    (reset-current-song playlist)))
+
+(defun file-for-current-idx (playlist)
+  (if (at-end-p playlist)
+    nil
+    (column-value (nth-row (current-idx playlist) (songs-table playlist)) :file)))
+
+(defun at-end-p (playlist)
+  (>= (current-idx playlist) (table-size (songs-table playlist))))

You don't need to add locking to these functions since they'll be +called only from functions that will take care of locking the +playlist first.

The function reset-current-song introduces one more wrinkle: +because you want the playlist to provide an endless stream of MP3s to +the client, you don't want to ever set current-song to +NIL. Instead, when a playlist runs out of songs to play--when +songs-table is empty or after the last song has been played +and repeat is set to :none--then you need to set +current-song to a special song whose file is an MP3 of +silence3 and whose title +explains why no music is playing. Here's some code to define two +parameters, *empty-playlist-song* and +*end-of-playlist-song*, each set to a song with the file named +by *silence-mp3* as their file and an appropriate title:

(defparameter *silence-mp3* ...)
+
+(defun make-silent-song (title &optional (file *silence-mp3*))
+  (make-instance
+   'song 
+   :file file
+   :title title
+   :id3-size (if (id3-p file) (size (read-id3 file)) 0)))
+
+(defparameter *empty-playlist-song* (make-silent-song "Playlist empty."))
+
+(defparameter *end-of-playlist-song* (make-silent-song "At end of playlist."))

reset-current-song uses these parameters when the +current-idx doesn't point to a row in songs-table. +Otherwise, it sets current-song to a song object +representing the current row.

(defun reset-current-song (playlist)
+  (setf
+   (current-song playlist) 
+   (cond
+     ((empty-p playlist) *empty-playlist-song*)
+     ((at-end-p playlist) *end-of-playlist-song*)
+     (t (row->song (nth-row (current-idx playlist) (songs-table playlist)))))))
+
+(defun row->song (song-db-entry)
+  (with-column-values (file song artist album id3-size) song-db-entry
+    (make-instance
+     'song
+     :file file
+     :title (format nil "~a by ~a from ~a" song artist album)
+     :id3-size id3-size)))
+
+(defun empty-p (playlist)
+  (zerop (table-size (songs-table playlist))))

Now, at last, you can implement the method on +maybe-move-to-next-song that moves current-idx to its +next value, based on the playlist's repeat mode, and then calls +update-current-if-necessary. You don't change +current-idx when it's already at the end of the playlist +because you want it to keep its current value, so it'll point at the +next song you add to the playlist. This function must lock the +playlist before manipulating it since it's called by the Shoutcast +server code, which doesn't do any locking.

(defmethod maybe-move-to-next-song (song (playlist playlist))
+  (with-playlist-locked (playlist)
+    (when (still-current-p song playlist)
+      (unless (at-end-p playlist)
+        (ecase (repeat playlist)
+          (:song) ; nothing changes
+          (:none (incf (current-idx playlist)))
+          (:all  (setf (current-idx playlist)
+                       (mod (1+ (current-idx playlist))
+                            (table-size (songs-table playlist)))))))
+      (update-current-if-necessary playlist))))

Manipulating the Playlist

The rest of the playlist code is functions used by the Web interface +to manipulate playlist objects, including adding and deleting +songs, sorting and shuffling, and setting the repeat mode. As in the +helper functions in the previous section, you don't need to worry +about locking in these functions because, as you'll see, the lock +will be acquired in the Web interface function that calls these.

Adding and deleting is mostly a question of manipulating the +songs-table. The only extra work you have to do is to keep the +current-song and current-idx in sync. For instance, +whenever the playlist is empty, its current-idx will be zero, +and the current-song will be the *empty-playlist-song*. +If you add a song to an empty playlist, then the index of zero is now +in bounds, and you should change the current-song to the newly +added song. By the same token, when you've played all the songs in a +playlist and current-song is *end-of-playlist-song*, +adding a song should cause current-song to be reset. All this +really means, though, is that you need to call +update-current-if-necessary at the appropriate points.

Adding songs to a playlist is a bit involved because of the way the +Web interface communicates which songs to add. For reasons I'll +discuss in the next section, the Web interface code can't just give +you a simple set of criteria to use in selecting songs from the +database. Instead, it gives you the name of a column and a list of +values, and you're supposed to add all the songs from the main +database where the given column has a value in the list of values. +Thus, to add the right songs, you need to first build a table object +containing the desired values, which you can then use with an +in query against the song database. So, add-songs looks +like this:

(defun add-songs (playlist column-name values)
+  (let ((table (make-instance
+                'table 
+                :schema (extract-schema (list column-name) (schema *mp3s*)))))
+    (dolist (v values) (insert-row (list column-name v) table))
+    (do-rows (row (select :from *mp3s* :where (in column-name table)))
+      (insert-row row (songs-table playlist))))
+  (update-current-if-necessary playlist))

Deleting songs is a bit simpler; you just need to be able to delete +songs from the songs-table that match particular +criteria--either a particular song or all songs in a particular +genre, by a particular artist, or from a particular album. So, you +can provide a delete-songs function that takes keyword/value +pairs, which are used to construct a matching :where +clause you can pass to the delete-rows database function.

Another complication that arises when deleting songs is that +current-idx may need to change. Assuming the current song +isn't one of the ones just deleted, you'd like it to remain the +current song. But if songs before it in songs-table are +deleted, it'll be in a different position in the table after the +delete. So after a call to delete-rows, you need to look for +the row containing the current song and reset current-idx. If +the current song has itself been deleted, then, for lack of anything +better to do, you can reset current-idx to zero. After +updating current-idx, calling +update-current-if-necessary will take care of updating +current-song. And if current-idx changed but still +points at the same song, current-song will be left alone.

(defun delete-songs (playlist &rest names-and-values)
+  (delete-rows
+   :from (songs-table playlist)
+   :where (apply #'matching (songs-table playlist) names-and-values))
+  (setf (current-idx playlist) (or (position-of-current playlist) 0))
+  (update-current-if-necessary playlist))
+
+(defun position-of-current (playlist)
+  (let* ((table (songs-table playlist))
+         (matcher (matching table :file (file (current-song playlist))))
+         (pos 0))
+    (do-rows (row table)
+      (when (funcall matcher row)
+        (return-from position-of-current pos))
+      (incf pos))))

You can also provide a function to completely clear the playlist, +which uses delete-all-rows and doesn't have to worry about +finding the current song since it has obviously been deleted. The +call to update-current-if-necessary will take care of setting +current-song to NIL.

(defun clear-playlist (playlist)
+  (delete-all-rows (songs-table playlist))
+  (setf (current-idx playlist) 0)
+  (update-current-if-necessary playlist))

Sorting and shuffling the playlist are related in that the playlist is +always either sorted or shuffled. The shuffle slot says +whether the playlist should be shuffled and if so how. If it's set to +:none, then the playlist is ordered according to the value in +the ordering slot. When shuffle is :song, the +playlist will be randomly permuted. And when it's set to +:album, the list of albums is randomly permuted, but the songs +within each album are listed in track order. Thus, the +sort-playlist function, which will be called by the Web +interface code whenever the user selects a new ordering, needs to set +ordering to the desired ordering and set shuffle to +:none before calling order-playlist, which actually +does the sort. As in delete-songs, you need to use +position-of-current to reset current-idx to the new +location of the current song. However, this time you don't need to +call update-current-if-necessary since you know the current +song is still in the table.

(defun sort-playlist (playlist ordering)
+  (setf (ordering playlist) ordering)
+  (setf (shuffle playlist) :none)
+  (order-playlist playlist)
+  (setf (current-idx playlist) (position-of-current playlist)))

In order-playlist, you can use the database function +sort-rows to actually perform the sort, passing a list of +columns to sort by based on the value of ordering.

(defun order-playlist (playlist)
+  (apply #'sort-rows (songs-table playlist)
+    (case (ordering playlist)
+      (:genre  '(:genre :album :track))
+      (:artist '(:artist :album :track))
+      (:album  '(:album :track))
+      (:song   '(:song)))))

The function shuffle-playlist, called by the Web interface +code when the user selects a new shuffle mode, works in a similar +fashion except it doesn't need to change the value of +ordering. Thus, when shuffle-playlist is called with a +shuffle of :none, the playlist goes back to being +sorted according to the most recent ordering. Shuffling by songs is +simple--just call shuffle-table on songs-table. +Shuffling by albums is a bit more involved but still not rocket +science.

(defun shuffle-playlist (playlist shuffle)
+  (setf (shuffle playlist) shuffle)
+  (case shuffle
+    (:none (order-playlist playlist))
+    (:song (shuffle-by-song playlist))
+    (:album (shuffle-by-album playlist)))
+  (setf (current-idx playlist) (position-of-current playlist)))
+
+(defun shuffle-by-song (playlist)
+  (shuffle-table (songs-table playlist)))
+
+(defun shuffle-by-album (playlist)
+  (let ((new-table (make-playlist-table)))
+    (do-rows (album-row (shuffled-album-names playlist))
+      (do-rows (song (songs-for-album playlist (column-value album-row :album)))
+        (insert-row song new-table)))
+    (setf (songs-table playlist) new-table)))
+
+(defun shuffled-album-names (playlist)
+  (shuffle-table 
+   (select
+    :columns :album
+    :from (songs-table playlist)
+    :distinct t)))
+
+(defun songs-for-album (playlist album)
+  (select
+   :from (songs-table playlist) 
+   :where (matching (songs-table playlist) :album album)
+   :order-by :track))

The last manipulation you need to support is setting the playlist's +repeat mode. Most of the time you don't need to take any extra action +when setting repeat--its value comes into play only in +maybe-move-to-next-song. However, you need to update the +current-song as a result of changing repeat in one +situation, namely, if current-idx is at the end of a nonempty +playlist and repeat is being changed to :song or +:all. In that case, you want to continue playing, either +repeating the last song or starting at the beginning of the playlist. +So, you should define an :after method on the generic function +(setf repeat).

(defmethod (setf repeat) :after (value (playlist playlist))
+  (if (and (at-end-p playlist) (not (empty-p playlist)))
+    (ecase value
+      (:song (setf (current-idx playlist) (1- (table-size (songs-table playlist)))))
+      (:none)
+      (:all  (setf (current-idx playlist) 0)))
+    (update-current-if-necessary playlist)))

Now you have all the underlying bits you need. All that remains is +the code that will provide a Web-based user interface for browsing +the MP3 database and manipulating playlists. The interface will +consist of three main functions defined with +define-url-function: one for browsing the song database, one +for viewing and manipulating a single playlist, and one for listing +all the available playlists.

But before you get to writing these three functions, you need to +start with some helper functions and HTML macros that they'll use.

Query Parameter Types

Since you'll be using define-url-function, you need to define +a few methods on the string->type generic function from +Chapter 28 that define-url-function uses to convert string +query parameters into Lisp objects. In this application, you'll need +methods to convert strings to integers, keyword symbols, and a list +of values.

The first two are quite simple.

(defmethod string->type ((type (eql 'integer)) value)
+  (parse-integer (or value "") :junk-allowed t))
+
+(defmethod string->type ((type (eql 'keyword)) value)
+  (and (plusp (length value)) (intern (string-upcase value) :keyword)))

The last string->type method is slightly more complex. For +reasons I'll get to in a moment, you'll need to generate pages that +display a form that contains a hidden field whose value is a list of +strings. Since you're responsible for generating the value in the +hidden field and for parsing it when it comes back, you can use +whatever encoding is convenient. You could use the functions +WRITE-TO-STRING and READ-FROM-STRING, which use the Lisp +printer and reader to write and read data to and from strings, except +the printed representation of strings can contain quotation marks and +other characters that may cause problems when embedded in the value +attribute of an INPUT element. So, you'll need to escape those +characters somehow. Rather than trying to come up with your own +escaping scheme, you can just use base 64, an encoding commonly used +to protect binary data sent through e-mail. AllegroServe comes with +two functions, base64-encode and base64-decode, that do +the encoding and decoding for you, so all you have to do is write a +pair of functions: one that encodes a Lisp object by converting it to +a readable string with WRITE-TO-STRING and then base 64 encoding +it and, conversely, another to decode such a string by base 64 +decoding it and passing the result to READ-FROM-STRING. You'll +want to wrap the calls to WRITE-TO-STRING and +READ-FROM-STRING in WITH-STANDARD-IO-SYNTAX to make sure +all the variables that affect the printer and reader are set to their +standard values. However, because you're going to be reading data +that's coming in from the network, you'll definitely want to turn off +one feature of the reader--the ability to evaluate arbitrary Lisp +code while reading!4 You can define your own macro with-safe-io-syntax, +which wraps its body forms in WITH-STANDARD-IO-SYNTAX wrapped +around a LET that binds *READ-EVAL* to NIL.

(defmacro with-safe-io-syntax (&body body)
+  `(with-standard-io-syntax
+     (let ((*read-eval* nil))
+       ,@body)))

Then the encoding and decoding functions are trivial.

(defun obj->base64 (obj)
+  (base64-encode (with-safe-io-syntax (write-to-string obj))))
+
+(defun base64->obj (string)
+  (ignore-errors
+    (with-safe-io-syntax (read-from-string (base64-decode string)))))

Finally, you can use these functions to define a method on +string->type that defines the conversion for the query +parameter type base64-list.

(defmethod string->type ((type (eql 'base-64-list)) value)
+  (let ((obj (base64->obj value)))
+    (if (listp obj) obj nil)))

Boilerplate HTML

Next you need to define some HTML macros and helper functions to make +it easy to give the different pages in the application a consistent +look and feel. You can start with an HTML macro that defines the +basic structure of a page in the application.

(define-html-macro :mp3-browser-page ((&key title (header title)) &body body)
+  `(:html
+     (:head
+      (:title ,title)
+      (:link :rel "stylesheet" :type "text/css" :href "mp3-browser.css"))
+     (:body
+      (standard-header)
+      (when ,header (html (:h1 :class "title" ,header)))
+      ,@body
+      (standard-footer))))

You should define standard-header and standard-footer +as separate functions for two reasons. First, during development you +can redefine those functions and see the effect immediately without +having to recompile functions that use the :mp3-browser-page +macro. Second, it turns out that one of the pages you'll write later +won't be defined with :mp3-browser-page but will still need +the standard header and footers. They look like this:

(defparameter *r* 25)
+
+(defun standard-header ()
+  (html
+   ((:p :class "toolbar")
+    "[" (:a :href (link "/browse" :what "genre") "All genres") "] "
+    "[" (:a :href (link "/browse" :what "genre" :random *r*) "Random genres") "] "
+    "[" (:a :href (link "/browse" :what "artist") "All artists") "] "
+    "[" (:a :href (link "/browse" :what "artist" :random *r*) "Random artists") "] "
+    "[" (:a :href (link "/browse" :what "album") "All albums") "] "
+    "[" (:a :href (link "/browse" :what "album" :random *r*) "Random albums") "] "
+    "[" (:a :href (link "/browse" :what "song" :random *r*) "Random songs") "] "
+    "[" (:a :href (link "/playlist") "Playlist") "] "
+    "[" (:a :href (link "/all-playlists") "All playlists") "]")))
+
+(defun standard-footer ()
+  (html (:hr) ((:p :class "footer") "MP3 Browser v" *major-version* "." *minor-version*)))

A couple of smaller HTML macros and helper functions automate other +common patterns. The :table-row HTML macro makes it easier to +generate the HTML for a single row of a table. It uses a feature of +FOO that I'll discuss in Chapter 31, an &attributes parameter, +which causes uses of the macro to be parsed just like normal +s-expression HTML forms, with any attributes gathered into a list +that will be bound to the &attributes parameter. It looks like +this:

(define-html-macro :table-row (&attributes attrs &rest values)
+  `(:tr ,@attrs ,@(loop for v in values collect `(:td ,v))))

And the link function generates a URL back into the +application to be used as the HREF attribute with an A +element, building a query string out of a set of keyword/value pairs +and making sure all special characters are properly escaped. For +instance, instead of writing this:

(:a :href "browse?what=artist&genre=Rhythm+%26+Blues" "Artists")

you can write the following:

(:a :href (link "browse" :what "artist" :genre "Rhythm & Blues") "Artists")

It looks like this:

(defun link (target &rest attributes)
+  (html 
+    (:attribute
+     (:format "~a~@[?~{~(~a~)=~a~^&~}~]" target (mapcar #'urlencode attributes)))))

To URL encode the keys and values, you use the helper function +urlencode, which is a wrapper around the function +encode-form-urlencoded, which is a nonpublic function from +AllegroServe. This is--on one hand--bad form; since the name +encode-form-urlencoded isn't exported from NET.ASERVE, +it's possible that encode-form-urlencoded may go away or get +renamed out from under you. On the other hand, using this unexported +symbol for the time being lets you get work done for the moment; by +wrapping encode-form-urlencoded in your own function, you +isolate the crufty code to one function, which you could rewrite if +you had to.

(defun urlencode (string)
+  (net.aserve::encode-form-urlencoded string))

Finally, you need the CSS style sheet mp3-browser.css used by +:mp3-browser-page. Since there's nothing dynamic about it, +it's probably easiest to just publish a static file with +publish-file.

(publish-file :path "/mp3-browser.css"  :file filename :content-type "text/css")

A sample style sheet is included with the source code for this +chapter on the book's Web site. You'll define a function, at the end +of this chapter, that starts the MP3 browser application. It'll take +care of, among other things, publishing this file.

The Browse Page

The first URL function will generate a page for browsing the MP3 +database. Its query parameters will tell it what kind of thing the +user is browsing and provide the criteria of what elements of the +database they're interested in. It'll give them a way to select +database entries that match a specific genre, artist, or album. In +the interest of serendipity, you can also provide a way to select a +random subset of matching items. When the user is browsing at the +level of individual songs, the title of the song will be a link that +causes that song to be added to the playlist. Otherwise, each item +will be presented with links that let the user browse the listed item +by some other category. For example, if the user is browsing genres, +the entry "Blues" will contain links to browse all albums, artists, +and songs in the genre Blues. Additionally, the browse page will +feature an "Add all" button that adds every song matching the page's +criteria to the user's playlist. The function looks like this:

(define-url-function browse
+    (request (what keyword :genre) genre artist album (random integer))
+
+  (let* ((values (values-for-page what genre artist album random))
+         (title (browse-page-title what random genre artist album))
+         (single-column (if (eql what :song) :file what))
+         (values-string (values->base-64 single-column values)))
+    (html
+     (:mp3-browser-page
+      (:title title)
+      ((:form :method "POST" :action "playlist")
+       (:input :name "values" :type "hidden" :value values-string)
+       (:input :name "what" :type "hidden" :value single-column)
+       (:input :name "action" :type "hidden" :value :add-songs)
+       (:input :name "submit" :type "submit" :value "Add all"))
+      (:ul (do-rows (row values) (list-item-for-page what row)))))))

This function starts by using the function values-for-page to +get a table containing the values it needs to present. When the user +is browsing by song--when the what parameter is +:song--you want to select complete rows from the database. But +when they're browsing by genre, artist, or album, you want to select +only the distinct values for the given category. The database +function select does most of the heavy lifting, with +values-for-page mostly responsible for passing the right +arguments depending on the value of what. This is also where +you select a random subset of the matching rows if necessary.

(defun values-for-page (what genre artist album random)
+  (let ((values
+         (select 
+          :from *mp3s*
+          :columns (if (eql what :song) t what)
+          :where (matching *mp3s* :genre genre :artist artist :album album)
+          :distinct (not (eql what :song))
+          :order-by (if (eql what :song) '(:album :track) what))))
+    (if random (random-selection values random) values)))

To generate the title for the browse page, you pass the browsing +criteria to the following function, browse-page-title:

(defun browse-page-title (what random genre artist album)
+  (with-output-to-string (s)
+    (when random (format s "~:(~r~) Random " random))
+    (format s "~:(~a~p~)" what random)
+    (when (or genre artist album)
+      (when (not (eql what :song)) (princ " with songs" s))
+      (when genre  (format s " in genre ~a" genre))
+      (when artist (format s " by artist ~a " artist))
+      (when album  (format s " on album ~a" album)))))

Once you have the values you want to present, you need to do two +things with them. The main task, of course, is to present them, which +happens in the do-rows loop, leaving the rendering of each row +to the function list-item-for-page. That function renders +:song rows one way and all other kinds another way.

(defun list-item-for-page (what row)
+  (if (eql what :song)
+    (with-column-values (song file album artist genre) row
+      (html
+        (:li
+         (:a :href (link "playlist" :file file :action "add-songs") (:b song)) " from "
+         (:a :href (link "browse"  :what :song :album  album) album) " by "
+         (:a :href (link "browse" :what :song :artist artist) artist) " in genre "
+         (:a :href (link "browse"  :what :song :genre  genre) genre))))
+    (let ((value (column-value row what)))
+      (html
+       (:li value " - "
+            (browse-link :genre  what value)
+            (browse-link :artist what value)
+            (browse-link :album  what value)
+            (browse-link :song   what value))))))
+
+(defun browse-link (new-what what value)
+  (unless (eql new-what what)
+    (html
+     "[" 
+     (:a :href (link "browse" :what new-what what value) (:format "~(~as~)" new-what))
+     "] ")))

The other thing on the browse page is a form with several +hidden INPUT fields and an "Add all" submit button. You need +to use an HTML form instead of a regular link to keep the application +stateless--to make sure all the information needed to respond to a +request comes in the request itself. Because the browse page results +can be partially random, you need to submit a fair bit of data for +the server to be able to reconstitute the list of songs to add to the +playlist. If you didn't allow the browse page to return randomly +generated results, you wouldn't need much data--you could just submit +a request to add songs with whatever search criteria the browse page +used. But if you added songs that way, with criteria that included a +random argument, then you'd end up adding a different set of +random songs than the user was looking at on the page when they hit +the "Add all" button.

The solution you'll use is to send back a form that has enough +information stashed away in a hidden INPUT element to allow the +server to reconstitute the list of songs matching the browse page +criteria. That information is the list of values returned by +values-for-page and the value of the what parameter. +This is where you use the base64-list parameter type; the +function values->base64 extracts the values of a specified +column from the table returned by values-for-page into a list +and then makes a base 64-encoded string out of that list to embed in +the form.

(defun values->base-64 (column values-table)
+  (flet ((value (r) (column-value r column)))
+    (obj->base64 (map-rows #'value values-table))))

When that parameter comes back as the value of the values +query parameter to a URL function that declares values to be +of type base-64-list, it'll be automatically converted back to +a list. As you'll see in a moment, that list can then be used to +construct a query that'll return the correct list of songs.5 When you're +browsing by :song, you use the values from the :file +column since they uniquely identify the actual songs while the song +names may not.

The Playlist

This brings me to the next URL function, playlist. This is the +most complex page of the three--it's responsible for displaying the +current contents of the user's playlist as well as for providing the +interface to manipulate the playlist. But with most of the tedious +bookkeeping handled by define-url-function, it's not too hard +to see how playlist works. Here's the beginning of the +definition, with just the parameter list:

(define-url-function playlist 
+    (request
+     (playlist-id string (playlist-id request) :package)
+     (action keyword)      ; Playlist manipulation action
+     (what keyword :file)  ; for :add-songs action
+     (values base-64-list) ;             "
+     file                  ; for :add-songs and :delete-songs actions
+     genre                 ; for :delete-songs action
+     artist                ;             "
+     album                 ;             "
+     (order-by keyword)    ; for :sort action
+     (shuffle keyword)     ; for :shuffle action
+     (repeat keyword))     ; for :set-repeat action

In addition to the obligatory request parameter, +playlist takes a number of query parameters. The most important +in some ways is playlist-id, which identifies which +playlist object the page should display and manipulate. For +this parameter, you can take advantage of +define-url-function's "sticky parameter" feature. Normally, +the playlist-id won't be supplied explicitly, defaulting to +the value returned by the playlist-id function, namely, the IP +address of the client machine on which the browser is running. +However, users can also manipulate their playlists from different +machines than the ones running their MP3 clients by allowing this +value to be explicitly specified. And if it's specified once, +define-url-function will arrange for it to "stick" by setting +a cookie in the browser. Later you'll define a URL function that +generates a list of all existing playlists, which users can use to +pick a playlist other than the one for the machines they're browsing +from.

The action parameter specifies some action to take on the +user's playlist object. The value of this parameter, which will be +converted to a keyword symbol for you, can be :add-songs, +:delete-songs, :clear, :sort, :shuffle, +or :set-repeat. The :add-songs action is used by the +"Add all" button in the browse page and also by the links used to add +individual songs. The other actions are used by the links on the +playlist page itself.

The file, what, and values parameters are used +with the :add-songs action. By declaring values to be +of type base-64-list, the define-url-function +infrastructure will take care of decoding the value submitted by the +"Add all" form. The other parameters are used with other actions as +noted in the comments.

Now let's look at the body of playlist. The first thing you +need to do is use the playlist-id to look up the queue object +and then acquire the playlist's lock with the following two lines:

(let ((playlist (lookup-playlist playlist-id)))
+  (with-playlist-locked (playlist)

Since lookup-playlist will create a new playlist if necessary, +this will always return a playlist object. Then you take care +of any necessary queue manipulation, dispatching on the value of the +action parameter in order to call one of the playlist +functions.

(case action
+  (:add-songs      (add-songs playlist what (or values (list file))))
+  (:delete-songs   (delete-songs 
+                    playlist 
+                    :file file :genre genre
+                    :artist artist :album album))
+  (:clear          (clear-playlist playlist))
+  (:sort           (sort-playlist playlist order-by))
+  (:shuffle        (shuffle-playlist playlist shuffle))
+  (:set-repeat     (setf (repeat playlist) repeat)))

All that's left of the playlist function is the actual HTML +generation. Again, you can use the :mp3-browser-page HTML +macro to make sure the basic form of the page matches the other pages +in the application, though this time you pass NIL to the +:header argument in order to leave out the H1 header. +Here's the rest of the function:

(html
+ (:mp3-browser-page
+  (:title (:format "Playlist - ~a" (id playlist)) :header nil)
+  (playlist-toolbar playlist)
+  (if (empty-p playlist)
+    (html (:p (:i "Empty.")))
+    (html 
+      ((:table :class "playlist")
+       (:table-row "#" "Song" "Album" "Artist" "Genre")
+       (let ((idx 0)
+             (current-idx (current-idx playlist)))
+         (do-rows (row (songs-table playlist))
+           (with-column-values (track file song album artist genre) row
+             (let ((row-style (if (= idx current-idx) "now-playing" "normal")))
+               (html
+                 ((:table-row :class row-style)
+                  track
+                  (:progn song   (delete-songs-link :file file))
+                  (:progn album  (delete-songs-link :album album))
+                  (:progn artist (delete-songs-link :artist artist))
+                  (:progn genre  (delete-songs-link :genre genre)))))
+             (incf idx))))))))))))

The function playlist-toolbar generates a toolbar containing +links to playlist to perform the various :action +manipulations. And delete-songs-link generates a link to +playlist with the :action parameter set to +:delete-songs and the appropriate arguments to delete an +individual file, or all files on an album, by a particular artist or +in a specific genre.

(defun playlist-toolbar (playlist)
+  (let ((current-repeat (repeat playlist))
+        (current-sort (ordering playlist))
+        (current-shuffle (shuffle playlist)))
+    (html
+     (:p :class "playlist-toolbar"
+         (:i "Sort by:")
+         " [ "
+         (sort-playlist-button "genre" current-sort) " | " 
+         (sort-playlist-button "artist" current-sort) " | " 
+         (sort-playlist-button "album" current-sort) " | " 
+         (sort-playlist-button "song" current-sort) " ] "
+         (:i "Shuffle by:")
+         " [ "
+         (playlist-shuffle-button "none" current-shuffle) " | "
+         (playlist-shuffle-button "song" current-shuffle) " | "
+         (playlist-shuffle-button "album" current-shuffle) " ] "
+         (:i "Repeat:")
+         " [ "
+         (playlist-repeat-button "none" current-repeat) " | "
+         (playlist-repeat-button "song" current-repeat) " | "
+         (playlist-repeat-button "all" current-repeat) " ] "
+         "[ " (:a :href (link "playlist" :action "clear") "Clear") " ] "))))
+
+(defun playlist-button (action argument new-value current-value)
+  (let ((label (string-capitalize new-value)))
+    (if (string-equal new-value current-value)
+      (html (:b label))
+      (html (:a :href (link "playlist" :action action argument new-value) label)))))
+
+(defun sort-playlist-button (order-by current-sort)
+  (playlist-button :sort :order-by order-by current-sort))
+
+(defun playlist-shuffle-button (shuffle current-shuffle)
+  (playlist-button :shuffle :shuffle shuffle current-shuffle))
+
+(defun playlist-repeat-button (repeat current-repeat)
+  (playlist-button :set-repeat :repeat repeat current-repeat))
+
+(defun delete-songs-link (what value)
+  (html " [" (:a :href (link "playlist" :action :delete-songs what value) "x") "]"))

Finding a Playlist

The last of the three URL functions is the simplest. It presents a +table listing all the playlists that have been created. Ordinarily +users won't need to use this page, but during development it gives +you a useful view into the state of the system. It also provides the +mechanism to choose a different playlist--each playlist ID is a link +to the playlist page with an explicit playlist-id query +parameter, which will then be made sticky by the playlist URL +function. Note that you need to acquire the *playlists-lock* +to make sure the *playlists* hash table doesn't change out +from under you while you're iterating over it.

(define-url-function all-playlists (request)
+  (:mp3-browser-page
+   (:title "All Playlists")
+   ((:table :class "all-playlists")
+    (:table-row "Playlist" "# Songs" "Most recent user agent")
+    (with-process-lock (*playlists-lock*)
+      (loop for playlist being the hash-values of *playlists* do
+           (html
+             (:table-row
+              (:a :href (link "playlist" :playlist-id (id playlist)) (:print (id playlist)))
+              (:print (table-size (songs-table playlist)))
+              (:print (user-agent playlist)))))))))

Running the App

And that's it. To use this app, you just need to load the MP3 +database with the load-database function from Chapter 27, +publish the CSS style sheet, set *song-source-type* to +playlist so find-song-source uses playlists instead of +the singleton song source defined in the previous chapter, and start +AllegroServe. The following function takes care of all these steps +for you, after you fill in appropriate values for the two parameters +*mp3-dir*, which is the root directory of your MP3 collection, +and *mp3-css*, the filename of the CSS style sheet:

(defparameter *mp3-dir* ...)
+
+(defparameter *mp3-css* ...)
+
+(defun start-mp3-browser ()
+  (load-database *mp3-dir* *mp3s*)
+  (publish-file :path "/mp3-browser.css"  :file *mp3-css* :content-type "text/css")
+  (setf *song-source-type* 'playlist)
+  (net.aserve::debug-on :notrap)
+  (net.aserve:start :port 2001))

When you invoke this function, it will print dots while it loads the +ID3 information from your ID3 files. Then you can point your MP3 +client at this URL:

http://localhost:2001/stream.mp3

and point your browser at some good starting place, such as this:

http://localhost:2001/browse

which will let you start browsing by the default category, Genre. +After you've added some songs to the playlist, you can press Play on +the MP3 client, and it should start playing the first song.

Obviously, you could improve the user interface in any of a number of +ways--for instance, if you have a lot of MP3s in your library, it +might be useful to be able to browse artists or albums by the first +letter of their names. Or maybe you could add a "Play whole album" +button to the playlist page that causes the playlist to immediately +put all the songs from the same album as the currently playing song +at the top of the playlist. Or you could change the playlist +class, so instead of playing silence when there are no songs queued +up, it picks a random song from the database. But all those ideas +fall in the realm of application design, which isn't really the topic +of this book. Instead, the next two chapters will drop back to the +level of software infrastructure to cover how the FOO HTML generation +library works. +


1The intricacies of concurrent +programming are beyond the scope of this book. The basic idea is that +if you have multiple threads of control--as you will in this +application with some threads running the shoutcast function +and other threads responding to requests from the browser--then you +need to make sure only one thread at a time manipulates an object in +order to prevent one thread from seeing the object in an inconsistent +state while another thread is working on it. In this function, for +instance, if two new MP3 clients are connecting at the same time, +they'd both try to add an entry to *playlists* and might +interfere with each other. The with-process-lock ensures that +each thread gets exclusive access to the hash table for long enough +to do the work it needs to do.

2This +approach also assumes that every client machine has a unique IP +address. This assumption should hold as long as all the users are on +the same LAN but may not hold if clients are connecting from behind a +firewall that does network address translation. Deploying this +application outside a LAN will require some modifications, but if you +want to deploy this application to the wider Internet, you'd better +know enough about networking to figure out an appropriate scheme +yourself.

3Unfortunately, because of licensing issues around the +MP3 format, it's not clear that it's legal for me to provide you with +such an MP3 without paying licensing fees to Fraunhofer IIS. I got +mine as part of the software that came with my Slimp3 from Slim +Devices. You can grab it from their Subversion repository via the Web +at http://svn.slimdevices.com/*checkout*/trunk/server/ +HTML/EN/html/silentpacket.mp3?rev=2. Or buy a Squeezebox, the +new, wireless version of Slimp3, and you'll get +silentpacket.mp3 as part of the software that comes with it. +Or find an MP3 of John Cage's piece 4'33".

4The reader supports a bit of syntax, +#., that causes the following s-expression to be evaluated at +read time. This is occasionally useful in source code but obviously +opens a big security hole when you read untrusted data. However, you +can turn off this syntax by setting *READ-EVAL* to NIL, +which will cause the reader to signal an error if it encounters +#..

5This +solution has its drawbacks--if a browse page returns a lot of +results, a fair bit of data is going back and forth under the covers. +Also, the database queries aren't necessarily the most efficient. But +it does keep the application stateless. An alternative approach is to +squirrel away, on the server side, information about the results +returned by browse and then, when a request to add songs come +in, find the appropriate bit of information in order to re-create the +correct set of songs. For instance, you could just save the values +list instead of sending it back in the form. Or you could copy the +RANDOM-STATE object before you generate the browse results so +you can later re-create the same "random" results. But this approach +causes its own problems. For instance, you'd then need to worry about +when you can get rid of the squirreled-away information; you never +know when the user might hit the Back button on their browser to +return to an old browse page and then hit the "Add all" button. +Welcome to the wonderful world of Web programming.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-an-mp3-database.html b/clones/gigamonkeys.com/book/practical-an-mp3-database.html new file mode 100644 index 00000000..caad7962 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-an-mp3-database.html @@ -0,0 +1,623 @@ +Practical: An MP3 Database

27. Practical: An MP3 Database

In this chapter you'll revisit the idea first explored in Chapter 3 of +building an in-memory database out of basic Lisp data structures. This +time your goal is to hold information that you'll extract from a +collection of MP3 files using the ID3v2 library from Chapter 25. +You'll then use this database in Chapters 28 and 29 as part of a +Web-based streaming MP3 server. Of course, this time around you can +use some of the language features you've learned since Chapter 3 to +build a more sophisticated version.

The Database

The main problem with the database in Chapter 3 is that there's only +one table, the list stored in the variable *db*. Another is +that the code doesn't know anything about what type of values are +stored in different columns. In Chapter 3 you got away with that by +using the fairly general-purpose EQUAL method to compare column +values when selecting rows from the database, but you would've been +in trouble if you had wanted to store values that couldn't be +compared with EQUAL or if you had wanted to sort the rows in the +database since there's no ordering function that's as general as +EQUAL.

This time you'll solve both problems by defining a class, +table, to represent individual database tables. Each +table instance will consist of two slots--one to hold the +table's data and another to hold information about the columns in the +table that database operations will be able to use. The class looks +like this:

(defclass table ()
+  ((rows   :accessor rows   :initarg :rows :initform (make-rows))
+   (schema :accessor schema :initarg :schema)))

As in Chapter 3, you can represent the individual rows with plists, +but this time around you'll create an abstraction that will make that +an implementation detail you can change later without too much +trouble. And this time you'll store the rows in a vector rather than +a list since certain operations that you'll want to support, such as +random access to rows by a numeric index and the ability to sort a +table, can be more efficiently implemented with vectors.

The function make-rows used to initialize the rows slot +can be a simple wrapper around MAKE-ARRAY that builds an empty, +adjustable,vector with a fill pointer.

The Package
(defparameter *default-table-size* 100)
+
+(defun make-rows (&optional (size *default-table-size*))
+  (make-array size :adjustable t :fill-pointer 0))

To represent a table's schema, you need to define another class, +column, each instance of which will contain information about +one column in the table: its name, how to compare values in the column +for equality and ordering, a default value, and a function that will +be used to normalize the column's values when inserting data into the +table and when querying the table. The schema slot will hold a +list of column objects. The class definition looks like this:

(defclass column ()
+  ((name               
+    :reader name
+    :initarg :name)
+
+   (equality-predicate
+    :reader equality-predicate
+    :initarg :equality-predicate)
+
+   (comparator
+    :reader comparator
+    :initarg :comparator)
+
+   (default-value
+    :reader default-value
+    :initarg :default-value
+    :initform nil)
+
+   (value-normalizer
+    :reader value-normalizer
+    :initarg :value-normalizer
+    :initform #'(lambda (v column) (declare (ignore column)) v))))

The equality-predicate and comparator slots of a +column object hold functions used to compare values from the +given column for equivalence and ordering. Thus, a column containing +string values might have STRING= as its +equality-predicate and STRING< as its comparator, +while a column containing numbers might have = and <.

The default-value and value-normalizer slots are used +when inserting rows into the database and, in the case of +value-normalizer, when querying the database. When you insert +a row into the database, if no value is provided for a particular +column, you can use the value stored in the column's +default-value slot. Then the value--defaulted or otherwise--is +normalized by passing it and the column object to the function stored +in the value-normalizer slot. You pass the column in case the +value-normalizer function needs to use some data associated +with the column object. (You'll see an example of this in the next +section.) You should also normalize values passed in queries before +comparing them with values in the database.

Thus, the value-normalizer's responsibility is primarily to +return a value that can be safely and correctly passed to the +equality-predicate and comparator functions. If the +value-normalizer can't figure out an appropriate value to +return, it can signal an error.

The other reason to normalize values before you store them in the +database is to save both memory and CPU cycles. For instance, if you +have a column that's going to contain string values but the number of +distinct strings that will be stored in the column is small--for +instance, the genre column in the MP3 database--you can save space +and speed by using the value-normalizer to intern the +strings (translate all STRING= values to a single string +object). Thus, you'll need only as many strings as there are distinct +values, regardless of how many rows are in the table, and you can use +EQL to compare column values rather than the slower +STRING=.1

Defining a Schema

Thus, to make an instance of table, you need to build a list +of column objects. You could build the list by hand, using +LIST and MAKE-INSTANCE. But you'll soon notice that you're +frequently making a lot column objects with the same comparator and +equality-predicate combinations. This is because the combination of a +comparator and equality predicate essentially defines a column type. +It'd be nice if there was a way to give those types names that would +allow you to say simply that a given column is a string column, +rather than having to specify STRING< as its comparator and +STRING= as its equality predicate. One way is to define a +generic function, make-column, like this:

(defgeneric make-column (name type &optional default-value))

Now you can implement methods on this generic function that +specialize on type with EQL specializers and return +column objects with the slots filled in with appropriate +values. Here's the generic function and methods that define column +types for the type names string and number:

(defmethod make-column (name (type (eql 'string)) &optional default-value)
+  (make-instance
+   'column 
+   :name name
+   :comparator #'string< 
+   :equality-predicate #'string=
+   :default-value default-value
+   :value-normalizer #'not-nullable))
+
+(defmethod make-column (name (type (eql 'number)) &optional default-value)
+  (make-instance 
+   'column
+   :name name
+   :comparator #'< 
+   :equality-predicate #'=
+   :default-value default-value))

The following function, not-nullable, used as the +value-normalizer for string columns, simply returns the +value it's given unless the value is NIL, in which case it +signals an error:

(defun not-nullable (value column)
+  (or value (error "Column ~a can't be null" (name column))))

This is important because STRING< and STRING= will signal +an error if called on NIL; it's better to catch bad values +before they go into the table rather than when you try to use +them.2

Another column type you'll need for the MP3 database is an +interned-string whose values are interned as discussed +previously. Since you need a hash table in which to intern values, +you should define a subclass of column, +interned-values-column, that adds a slot whose value is the +hash table you use to intern.

To implement the actual interning, you'll also need to provide an +:initform for value-normalizer of a function that +interns the value in the column's interned-values hash table. +And because one of the main reasons to intern values is to allow you +to use EQL as the equality predicate, you should also add an +:initform for the equality-predicate of #'eql.

(defclass interned-values-column (column)
+  ((interned-values
+    :reader interned-values
+    :initform (make-hash-table :test #'equal))
+   (equality-predicate :initform #'eql)
+   (value-normalizer   :initform #'intern-for-column)))
+
+(defun intern-for-column (value column)
+  (let ((hash (interned-values column)))
+    (or (gethash (not-nullable value column) hash)
+        (setf (gethash value hash) value))))

You can then define a make-column method specialized on the +name interned-string that returns an instance of +interned-values-column.

(defmethod make-column (name (type (eql 'interned-string)) &optional default-value)
+  (make-instance 
+   'interned-values-column
+   :name name
+   :comparator #'string< 
+   :default-value default-value))

With these methods defined on make-column, you can now define +a function, make-schema, that builds a list of column +objects from a list of column specifications consisting of a column +name, a column type name, and, optionally, a default value.

(defun make-schema (spec)
+  (mapcar #'(lambda (column-spec) (apply #'make-column column-spec)) spec))

For instance, you can define the schema for the table you'll use to +store data extracted from MP3s like this:

(defparameter *mp3-schema* 
+  (make-schema 
+   '((:file     string)
+     (:genre    interned-string "Unknown")
+     (:artist   interned-string "Unknown")
+     (:album    interned-string "Unknown")
+     (:song     string)
+     (:track    number 0)
+     (:year     number 0)
+     (:id3-size number))))

To make an actual table for holding information about MP3s, you pass +*mp3-schema* as the :schema initarg to +MAKE-INSTANCE.

(defparameter *mp3s* (make-instance 'table :schema *mp3-schema*))

Inserting Values

Now you're ready to define your first table operation, +insert-row, which takes a plist of names and values and a table +and adds a row to the table containing the given values. The bulk of +the work is done in a helper function, normalize-row, that +builds a plist with a defaulted, normalized value for each column, +using the values from names-and-values if available and the +default-value for the column if not.

(defun insert-row (names-and-values table)
+  (vector-push-extend (normalize-row names-and-values (schema table)) (rows table)))
+
+(defun normalize-row (names-and-values schema)
+  (loop
+     for column in schema
+     for name  = (name column)
+     for value = (or (getf names-and-values name) (default-value column))
+     collect name
+     collect (normalize-for-column value column)))

It's worth defining a separate helper function, +normalize-for-column, that takes a value and a column +object and returns the normalized value because you'll need to perform +the same normalization on query arguments.

(defun normalize-for-column (value column)
+  (funcall (value-normalizer column) value column))

Now you're ready to combine this database code with code from +previous chapters to build a database of data extracted from MP3 +files. You can define a function, file->row, that uses +read-id3 from the ID3v2 library to extract an ID3 tag from a +file and turns it into a plist that you can pass to +insert-row.

(defun file->row (file)
+  (let ((id3 (read-id3 file)))
+    (list
+     :file   (namestring (truename file))
+     :genre  (translated-genre id3)
+     :artist (artist id3)
+     :album  (album id3)
+     :song   (song id3)
+     :track  (parse-track (track id3))
+     :year   (parse-year (year id3))
+     :id3-size (size id3))))

You don't have to worry about normalizing the values since +insert-row takes care of that for you. You do, however, have +to convert the string values returned by the track and +year into numbers. The track number in an ID3 tag is sometimes +stored as the ASCII representation of the track number and sometimes +as a number followed by a slash followed by the total number of +tracks on the album. Since you care only about the actual track +number, you should use the :end argument to PARSE-INTEGER +to specify that it should parse only up to the slash, if any.3

(defun parse-track (track)
+  (when track (parse-integer track :end (position #\/ track))))
+
+(defun parse-year (year)
+  (when year (parse-integer year)))

Finally, you can put all these functions together, along with +walk-directory from the portable pathnames library and +mp3-p from the ID3v2 library, to define a function that loads +an MP3 database with data extracted from all the MP3 files it can +find under a given directory.

(defun load-database (dir db)
+  (let ((count 0))
+    (walk-directory 
+     dir 
+     #'(lambda (file)
+         (princ #\.)
+         (incf count)
+         (insert-row (file->row file) db))
+     :test #'mp3-p)
+    (format t "~&Loaded ~d files into database." count)))

Querying the Database

Once you've loaded your database with data, you'll need a way to +query it. For the MP3 application you'll need a slightly more +sophisticated query function than you wrote in Chapter 3. This time +around you want not only to be able to select rows matching +particular criteria but also to limit the results to particular +columns, to limit the results to unique rows, and perhaps to sort the +rows by particular columns. In keeping with the spirit of relational +database theory, the result of a query will be a new table +object containing the desired rows and columns.

The query function you'll write, select, is loosely modeled on +the SELECT statement from Structured Query Language (SQL). +It'll take five keyword parameters: :from, :columns, +:where, :distinct, and :order-by. The +:from argument is the table object you want to query. +The :columns argument specifies which columns should be +included in the result. The value should be a list of column names, a +single column name, or a T, the default, meaning return all +columns. The :where argument, if provided, should be a +function that accepts a row and returns true if it should be included +in the results. In a moment, you'll write two functions, +matching and in, that return functions appropriate for +use as :where arguments. The :order-by argument, if +supplied, should be a list of column names; the results will be +sorted by the named columns. As with the :columns argument, +you can specify a single column using just the name, which is +equivalent to a one-item list containing the same name. Finally, the +:distinct argument is a boolean that says whether to eliminate +duplicate rows from the results. The default value for +:distinct is NIL.

Here are some examples of using select:

;; Select all rows where the :artist column is "Green Day"
+(select :from *mp3s* :where (matching *mp3s* :artist "Green Day"))
+
+;; Select a sorted list of artists with songs in the genre "Rock"
+(select
+  :columns :artist
+  :from *mp3s*
+  :where (matching *mp3s* :genre "Rock")
+  :distinct t
+  :order-by :artist)

The implementation of select with its immediate helper +functions looks like this:

(defun select (&key (columns t) from where distinct order-by)
+  (let ((rows (rows from))
+        (schema (schema from)))
+
+    (when where
+      (setf rows (restrict-rows rows where)))
+
+    (unless (eql columns 't)
+      (setf schema (extract-schema (mklist columns) schema))
+      (setf rows (project-columns rows schema)))
+
+    (when distinct
+      (setf rows (distinct-rows rows schema)))
+
+    (when order-by
+      (setf rows (sorted-rows rows schema (mklist order-by))))
+
+    (make-instance 'table :rows rows :schema schema)))
+
+(defun mklist (thing)
+  (if (listp thing) thing (list thing)))
+
+(defun extract-schema (column-names schema)
+  (loop for c in column-names collect (find-column c schema)))
+
+(defun find-column (column-name schema)
+  (or (find column-name schema :key #'name)
+      (error "No column: ~a in schema: ~a" column-name schema)))
+
+(defun restrict-rows (rows where)
+  (remove-if-not where rows))
+
+(defun project-columns (rows schema)
+  (map 'vector (extractor schema) rows))
+
+(defun distinct-rows (rows schema)
+  (remove-duplicates rows :test (row-equality-tester schema)))
+
+(defun sorted-rows (rows schema order-by)
+  (sort (copy-seq rows) (row-comparator order-by schema)))

Of course, the really interesting part of select is how you +implement the functions extractor, row-equality-tester, +and row-comparator.

As you can tell by how they're used, each of these functions must +return a function. For instance, project-columns uses the value +returned by extractor as the function argument to MAP. +Since the purpose of project-columns is to return a set of rows +with only certain column values, you can infer that extractor +returns a function that takes a row as an argument and returns a new +row containing only the columns specified in the schema it's passed. +Here's how you can implement it:

(defun extractor (schema)
+  (let ((names (mapcar #'name schema)))
+    #'(lambda (row)
+        (loop for c in names collect c collect (getf row c)))))

Note how you can do the work of extracting the names from the schema +outside the body of the closure: since the closure will be called +many times, you want it to do as little work as possible each time +it's called.

The functions row-equality-tester and row-comparator are +implemented in a similar way. To decide whether two rows are +equivalent, you need to apply the appropriate equality predicate for +each column to the appropriate column values. Recall from Chapter 22 +that the LOOP clause always will return NIL as soon +as a pair of values fails their test or will cause the LOOP to +return T.

(defun row-equality-tester (schema)
+  (let ((names (mapcar #'name schema))
+        (tests (mapcar #'equality-predicate schema)))
+    #'(lambda (a b)
+        (loop for name in names and test in tests
+           always (funcall test (getf a name) (getf b name))))))

Ordering two rows is a bit more complex. In Lisp, comparator functions +return true if their first argument should be sorted ahead of the +second and NIL otherwise. Thus, a NIL can mean that the +second argument should be sorted ahead of the first or that they're equivalent. You want your row comparators to behave the same way: +return T if the first row should be sorted ahead of the second +and NIL otherwise.

Thus, to compare two rows, you should compare the values from the +columns you're sorting by, in order, using the appropriate comparator +for each column. First call the comparator with the value from the +first row as the first argument. If the comparator returns true, that +means the first row should definitely be sorted ahead of the second +row, so you can immediately return T.

But if the column comparator returns NIL, then you need to +determine whether that's because the second value should sort ahead +of the first value or because they're equivalent. So you should call +the comparator again with the arguments reversed. If the comparator +returns true this time, it means the second column value sorts ahead +of the first and thus the second row ahead of the first row, so you +can return NIL immediately. Otherwise, the column values are +equivalent, and you need to move onto the next column. If you get +through all the columns without one row's value ever winning the +comparison, then the rows are equivalent, and you return NIL. A +function that implements this algorithm looks like this:

(defun row-comparator (column-names schema)
+  (let ((comparators (mapcar #'comparator (extract-schema column-names schema))))
+    #'(lambda (a b)
+        (loop
+           for name in column-names
+           for comparator in comparators
+           for a-value = (getf a name)
+           for b-value = (getf b name)
+           when (funcall comparator a-value b-value) return t
+           when (funcall comparator b-value a-value) return nil
+           finally (return nil)))))

Matching Functions

The :where argument to select can be any function that +takes a row object and returns true if it should be included in the +results. In practice, however, you'll rarely need the full power of +arbitrary code to express query criteria. So you should provide two +functions, matching and in, that will build query +functions that allow you to express the common kinds of queries and +that take care of using the proper equality predicates and value +normalizers for each column.

The workhouse query-function constructor will be matching, +which returns a function that will match rows with specific column +values. You saw how it was used in the earlier examples of +select. For instance, this call to matching:

(matching *mp3s* :artist "Green Day")

returns a function that matches rows whose :artist value is +"Green Day". You can also pass multiple names and values; the +returned function matches when all the columns match. For example, +the following returns a closure that matches rows where the artist is +"Green Day" and the album is "American Idiot":

(matching *mp3s* :artist "Green Day" :album "American Idiot")

You have to pass matching the table object because it needs +access to the table's schema in order to get at the equality +predicates and value normalizer functions for the columns it matches +against.

You build up the function returned by matching out of smaller +functions, each responsible for matching one column's value. To build +these functions, you should define a function, column-matcher, +that takes a column object and an unnormalized value you want +to match and returns a function that accepts a single row and returns +true when the value of the given column in the row matches the +normalized version of the given value.

(defun column-matcher (column value)
+  (let ((name (name column))
+        (predicate (equality-predicate column))
+        (normalized (normalize-for-column value column)))
+    #'(lambda (row) (funcall predicate (getf row name) normalized))))

You then build a list of column-matching functions for the names and +values you care about with the following function, +column-matchers:

(defun column-matchers (schema names-and-values)
+  (loop for (name value) on names-and-values by #'cddr
+     when value collect
+       (column-matcher (find-column name schema) value)))

Now you can implement matching. Again, note that you do as +much work as possible outside the closure in order to do it only once +rather than once per row in the table.

(defun matching (table &rest names-and-values)
+  "Build a where function that matches rows with the given column values."
+  (let ((matchers (column-matchers (schema table) names-and-values)))
+    #'(lambda (row)
+        (every #'(lambda (matcher) (funcall matcher row)) matchers))))

This function is a bit of a twisty maze of closures, but it's worth +contemplating for a moment to get a flavor of the possibilities of +programming with functions as first-class objects.

The job of matching is to return a function that will be +invoked on each row in a table to determine whether it should be +included in the new table. So, matching returns a closure with +one parameter, row.

Now recall that the function EVERY takes a predicate function as +its first argument and returns true if, and only if, that function +returns true each time it's applied to an element of the list passed +as EVERY's second argument. However, in this case, the list you +pass to EVERY is itself a list of functions, the column +matchers. What you want to know is that every column matcher, when +invoked on the row you're currently testing, returns true. So, as the +predicate argument to EVERY, you pass yet another closure that +FUNCALLs the column matcher, passing it the row.

Another matching function that you'll occasionally find useful is +in, which returns a function that matches rows where a +particular column is in a given set of values. You'll define +in to take two arguments: a column name and a table that +contains the values you want to match. For instance, suppose you +wanted to find all the songs in the MP3 database that have names the +same as a song performed by the Dixie Chicks. You can write that +where clause using in and a subselect like +this:4

(select
+  :columns '(:artist :song)
+  :from *mp3s*
+  :where (in :song 
+             (select
+               :columns :song
+               :from *mp3s*
+               :where (matching *mp3s* :artist "Dixie Chicks"))))

Although the queries are more complex, the definition of in is +much simpler than that of matching.

(defun in (column-name table)
+  (let ((test (equality-predicate (find-column column-name (schema table))))
+        (values (map 'list #'(lambda (r) (getf r column-name)) (rows table))))
+    #'(lambda (row)
+        (member (getf row column-name) values :test test))))

Getting at the Results

Since select returns another table, you need to think a +bit about how you want to get at the individual row and column values +in a table. If you're sure you'll never want to change the way you +represent the data in a table, you can just make the structure of a +table part of the API--that table has a slot rows +that's a vector of plists--and use all the normal Common Lisp +functions for manipulating vectors and plists to get at the values in +the table. But that representation is really an internal detail that +you might want to change. Also, you don't necessarily want other code +manipulating the data structures directly--for instance, you don't +want anyone to use SETF to put an unnormalized column value into +a row. So it might be a good idea to define a few abstractions that +provide the operations you want to support. Then if you decide to +change the internal representation later, you'll need to change only +the implementation of these functions and macros. And while Common +Lisp doesn't enable you to absolutely prevent folks from getting at +"internal" data, by providing an official API you at least make it +clear where the boundary is.

Probably the most common thing you'll need to do with the results of a +query is to iterate over the individual rows and extract specific +column values. So you need to provide a way to do both those things +without touching the rows vector directly or using GETF +to get at the column values within a row.

For now these operations are trivial to implement; they're merely +wrappers around the code you'd write if you didn't have these +abstractions. You can provide two ways to iterate over the rows of a +table: a macro do-rows, which provides a basic looping +construct, and a function map-rows, which builds a list +containing the results of applying a function to each row in the +table.5

(defmacro do-rows ((row table) &body body)
+  `(loop for ,row across (rows ,table) do ,@body))
+
+(defun map-rows (fn table)
+  (loop for row across (rows table) collect (funcall fn row)))

To get at individual column values within a row, you should provide a +function, column-value, that takes a row and a column name and +returns the appropriate value. Again, it's a trivial wrapper around +the code you'd write otherwise. But if you change the internal +representation of a table later, users of column-value needn't +be any the wiser.

(defun column-value (row column-name)
+  (getf row column-name))

While column-value is a sufficient abstraction for getting at +column values, you'll often want to get at the values of multiple +columns at once. So you can provide a bit of syntactic sugar, a +macro, with-column-values, that binds a set of variables to +the values extracted from a row using the corresponding keyword +names. Thus, instead of writing this:

 (do-rows (row table)
+   (let ((song (column-value row :song))
+         (artist (column-value row :artist))
+         (album (column-value row :album)))
+     (format t "~a by ~a from ~a~%" song artist album)))

you can simply write the following:

(do-rows (row table)
+  (with-column-values (song artist album) row
+    (format t "~a by ~a from ~a~%" song artist album)))

Again, the actual implementation isn't complicated if you use the +once-only macro from Chapter 8.

(defmacro with-column-values ((&rest vars) row &body body)
+  (once-only (row)
+    `(let ,(column-bindings vars row) ,@body)))
+
+(defun column-bindings (vars row)
+  (loop for v in vars collect `(,v (column-value ,row ,(as-keyword v)))))
+
+(defun as-keyword (symbol)
+  (intern (symbol-name symbol) :keyword))

Finally, you should provide abstractions for getting at the number of +rows in a table and for accessing a specific row by numeric index.

(defun table-size (table)
+  (length (rows table)))
+
+(defun nth-row (n table)
+  (aref (rows table) n))

Other Database Operations

Finally, you'll implement a few other database operations that you'll +need in Chapter 29. The first two are analogs of the SQL +DELETE statement. The function delete-rows is used to +delete rows from a table that match particular criteria. Like +select, it takes :from and :where keyword +arguments. Unlike select, it doesn't return a new table--it +actually modifies the table passed as the :from argument.

(defun delete-rows (&key from where)
+  (loop
+     with rows = (rows from)
+     with store-idx = 0
+     for read-idx from 0
+     for row across rows
+     do (setf (aref rows read-idx) nil)
+     unless (funcall where row) do
+       (setf (aref rows store-idx) row)
+       (incf store-idx)
+     finally (setf (fill-pointer rows) store-idx)))

In the interest of efficiency, you might want to provide a separate +function for deleting all the rows from a table.

(defun delete-all-rows (table)
+  (setf (rows table) (make-rows *default-table-size*)))

The remaining table operations don't really map to normal relational +database operations but will be useful in the MP3 browser +application. The first is a function to sort the rows of a table in +place.

(defun sort-rows (table &rest column-names)
+  (setf (rows table) (sort (rows table) (row-comparator column-names (schema table))))
+  table)

On the flip side, in the MP3 browser application, you'll need a +function that shuffles a table's rows in place using the function +nshuffle-vector from Chapter 23.

(defun shuffle-table (table)
+  (nshuffle-vector (rows table))
+  table)

And finally, again for the purposes of the MP3 browser, you should +provide a function that selects n random rows, returning the +results as a new table. It also uses nshuffle-vector along +with a version of random-sample based on Algorithm S from +Donald Knuth's The Art of Computer Programming, Volume 2: +Seminumerical Algorithms, Third Edition (Addison-Wesley, 1998) that +I discussed in Chapter 20.

(defun random-selection (table n)
+  (make-instance
+   'table
+   :schema (schema table)
+   :rows (nshuffle-vector (random-sample (rows table) n))))
+
+(defun random-sample (vector n)
+  "Based on Algorithm S from Knuth. TAOCP, vol. 2. p. 142"
+  (loop with selected = (make-array n :fill-pointer 0)
+     for idx from 0
+     do
+       (loop
+          with to-select = (- n (length selected))
+          for remaining = (- (length vector) idx)
+          while (>= (* remaining (random 1.0)) to-select)
+          do (incf idx))
+       (vector-push (aref vector idx) selected)
+     when (= (length selected) n) return selected))

With this code you'll be ready, in Chapter 29, to build a Web +interface for browsing a collection of MP3 files. But before you get +to that, you need to implement the part of the server that streams +MP3s using the Shoutcast protocol, which is the topic of the next +chapter. +


1The general theory behind interning objects is +that if you're going to compare a particular value many times, it's +worth it to pay the cost of interning it. The value-normalizer +runs once when you insert a value into the table and, as you'll see, +once at the beginning of each query. Since a query can involve +invoking the equality-predicate once per row in the table, the +amortized cost of interning the values will quickly approach zero. +

2As always, the first causality of concise exposition in +programming books is proper error handling; in production code you'd +probably want to define your own error type, such as the following, +and signal it instead:

(error 'illegal-column-value :value value :column column)

Then you'd want to think about where you can add restarts that might +be able to recover from this condition. And, finally, in any given +application you could establish condition handlers that would choose +from among those restarts.

3If +any MP3 files have malformed data in the track and year frames, +PARSE-INTEGER could signal an error. One way to deal with that +is to pass PARSE-INTEGER the :junk-allowed argument of +T, which will cause it to ignore any non-numeric junk following +the number and to return NIL if no number can be found in the +string. Or, if you want practice at using the condition system, you +could define an error and signal it from these functions when the +data is malformed and also establish a few restarts to allow these +functions to recover. +

4This query will also return all the songs performed by the +Dixie Chicks. If you want to limit it to songs by artists other than +the Dixie Chicks, you need a more complex :where function. +Since the :where argument can be any function, it's certainly +possible; you could remove the Dixie Chicks' own songs with this +query:

(let* ((dixie-chicks (matching *mp3s* :artist "Dixie Chicks"))
+       (same-song (in :song (select :columns :song :from *mp3s* :where dixie-chicks)))
+       (query #'(lambda (row) (and (not (funcall dixie-chicks row)) (funcall same-song row)))))
+  (select :columns '(:artist :song) :from *mp3s* :where query))

This obviously isn't quite as convenient. If you were going to write +an application that needed to do lots of complex queries, you might +want to consider coming up with a more expressive query language.

5The version of LOOP implemented at M.I.T. before +Common Lisp was standardized included a mechanism for extending the +LOOP grammar to support iteration over new data structures. Some +Common Lisp implementations that inherited their LOOP +implementation from that code base may still support that facility, +which would make do-rows and map-rows less necessary. +

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-building-a-unit-test-framework.html b/clones/gigamonkeys.com/book/practical-building-a-unit-test-framework.html new file mode 100644 index 00000000..f018feeb --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-building-a-unit-test-framework.html @@ -0,0 +1,386 @@ +Practical: Building a Unit Test Framework

9. Practical: Building a Unit Test Framework

In this chapter you'll return to cutting code and develop a simple +unit testing framework for Lisp. This will give you a chance to use +some of the features you've learned about since Chapter 3, including +macros and dynamic variables, in real code.

The main design goal of the test framework will be to make it as easy +as possible to add new tests, to run various suites of tests, and to +track down test failures. For now you'll focus on designing a +framework you can use during interactive development.

The key feature of an automated testing framework is that the +framework is responsible for telling you whether all the tests +passed. You don't want to spend your time slogging through test +output checking answers when the computer can do it much more quickly +and accurately. Consequently, each test case must be an expression +that yields a boolean value--true or false, pass or fail. For +instance, if you were writing tests for the built-in + function, +these might be reasonable test cases:1

(= (+ 1 2) 3)
+(= (+ 1 2 3) 6)
+(= (+ -1 -3) -4)

Functions that have side effects will be tested slightly +differently--you'll have to call the function and then check for +evidence of the expected side effects.2 But in the end, every test case has to boil down to a +boolean expression, thumbs up or thumbs down.

Two First Tries

If you were doing ad hoc testing, you could enter these expressions +at the REPL and check that they return T. But you want a +framework that makes it easy to organize and run these test cases +whenever you want. If you want to start with the simplest thing that +could possibly work, you can just write a function that evaluates the +test cases and ANDs the results together.

(defun test-+ ()
+  (and
+    (= (+ 1 2) 3)
+    (= (+ 1 2 3) 6)
+    (= (+ -1 -3) -4)))

Whenever you want to run this set of test cases, you can call +test-+.

CL-USER> (test-+)
+T

As long as it returns T, you know the test cases are passing. +This way of organizing tests is also pleasantly concise--you don't +have to write a bunch of test bookkeeping code. However, as you'll +discover the first time a test case fails, the result reporting +leaves something to be desired. When test-+ returns NIL, +you'll know something failed, but you'll have no idea which test case +it was.

So let's try another simple--even simpleminded--approach. To find out +what happens to each test case, you could write something like this:

(defun test-+ ()
+  (format t "~:[FAIL~;pass~] ... ~a~%" (= (+ 1 2) 3) '(= (+ 1 2) 3))
+  (format t "~:[FAIL~;pass~] ... ~a~%" (= (+ 1 2 3) 6) '(= (+ 1 2 3) 6))
+  (format t "~:[FAIL~;pass~] ... ~a~%" (= (+ -1 -3) -4) '(= (+ -1 -3) -4)))

Now each test case will be reported individually. The +~:[FAIL~;pass~] part of the FORMAT directive causes +FORMAT to print "FAIL" if the first format argument is false and +"pass" otherwise.3 Then you label the result +with the test expression itself. Now running test-+ shows you +exactly what's going on.

CL-USER> (test-+)
+pass ... (= (+ 1 2) 3)
+pass ... (= (+ 1 2 3) 6)
+pass ... (= (+ -1 -3) -4)
+NIL

This time the result reporting is more like what you want, but the +code itself is pretty gross. The repeated calls to FORMAT as +well as the tedious duplication of the test expression cry out to be +refactored. The duplication of the test expression is particularly +grating because if you mistype it, the test results will be +mislabeled.

Another problem is that you don't get a single indicator whether all +the test cases passed. It's easy enough, with only three test cases, +to scan the output looking for "FAIL"; however, when you have +hundreds of test cases, it'll be more of a hassle.

Refactoring

What you'd really like is a way to write test functions as +streamlined as the first test-+ that return a single T or +NIL value but that also report on the results of individual test +cases like the second version. Since the second version is close to +what you want in terms of functionality, your best bet is to see if +you can factor out some of the annoying duplication.

The simplest way to get rid of the repeated similar calls to +FORMAT is to create a new function.

(defun report-result (result form)
+  (format t "~:[FAIL~;pass~] ... ~a~%" result form))

Now you can write test-+ with calls to report-result +instead of FORMAT. It's not a huge improvement, but at least now +if you decide to change the way you report results, there's only one +place you have to change.

(defun test-+ ()
+  (report-result (= (+ 1 2) 3) '(= (+ 1 2) 3))
+  (report-result (= (+ 1 2 3) 6) '(= (+ 1 2 3) 6))
+  (report-result (= (+ -1 -3) -4) '(= (+ -1 -3) -4)))

Next you need to get rid of the duplication of the test case +expression, with its attendant risk of mislabeling of results. What +you'd really like is to be able to treat the expression as both code +(to get the result) and data (to use as the label). Whenever you want +to treat code as data, that's a sure sign you need a macro. Or, to +look at it another way, what you need is a way to automate writing +the error-prone report-result calls. You'd like to be able to +say something like this:

(check (= (+ 1 2) 3))

and have it mean the following:

(report-result (= (+ 1 2) 3) '(= (+ 1 2) 3))

Writing a macro to do this translation is trivial.

(defmacro check (form)
+  `(report-result ,form ',form))

Now you can change test-+ to use check.

(defun test-+ ()
+  (check (= (+ 1 2) 3))
+  (check (= (+ 1 2 3) 6))
+  (check (= (+ -1 -3) -4)))

Since you're on the hunt for duplication, why not get rid of those +repeated calls to check? You can define check to take +an arbitrary number of forms and wrap them each in a call to +report-result.

(defmacro check (&body forms)
+  `(progn
+     ,@(loop for f in forms collect `(report-result ,f ',f))))

This definition uses a common macro idiom of wrapping a PROGN +around a series of forms in order to turn them into a single form. +Notice also how you can use ,@ to splice in the result of an +expression that returns a list of expressions that are themselves +generated with a backquote template.

With the new version of check you can write a new version of +test-+ like this:

(defun test-+ ()
+  (check
+    (= (+ 1 2) 3)
+    (= (+ 1 2 3) 6)
+    (= (+ -1 -3) -4)))

that is equivalent to the following code:

(defun test-+ ()
+  (progn
+    (report-result (= (+ 1 2) 3) '(= (+ 1 2) 3))
+    (report-result (= (+ 1 2 3) 6) '(= (+ 1 2 3) 6))
+    (report-result (= (+ -1 -3) -4) '(= (+ -1 -3) -4))))

Thanks to check, this version is as concise as the first +version of test-+ but expands into code that does the same +thing as the second version. And now any changes you want to make to +how test-+ behaves, you can make by changing check.

Fixing the Return Value

You can start with fixing test-+ so its return value indicates +whether all the test cases passed. Since check is responsible +for generating the code that ultimately runs the test cases, you just +need to change it to generate code that also keeps track of the +results.

As a first step, you can make a small change to report-result +so it returns the result of the test case it's reporting.

(defun report-result (result form)
+  (format t "~:[FAIL~;pass~] ... ~a~%" result form)
+  result)

Now that report-result returns the result of its test case, it +might seem you could just change the PROGN to an AND to +combine the results. Unfortunately, AND doesn't do quite what +you want in this case because of its short-circuiting behavior: as +soon as one test case fails, AND will skip the rest. On the +other hand, if you had a construct that worked like AND without +the short-circuiting, you could use it in the place of PROGN, +and you'd be done. Common Lisp doesn't provide such a construct, but +that's no reason you can't use it: it's a trivial matter to write a +macro to provide it yourself.

Leaving test cases aside for a moment, what you want is a +macro--let's call it combine-results--that will let you say +this:

(combine-results
+  (foo)
+  (bar)
+  (baz))

and have it mean something like this:

(let ((result t))
+  (unless (foo) (setf result nil))
+  (unless (bar) (setf result nil))
+  (unless (baz) (setf result nil))
+  result)

The only tricky bit to writing this macro is that you need to +introduce a variable--result in the previous code--in the +expansion. As you saw in the previous chapter, using a literal name +for variables in macro expansions can introduce a leak in your macro +abstraction, so you'll need to create a unique name. This is a job +for with-gensyms. You can define combine-results like +this:

(defmacro combine-results (&body forms)
+  (with-gensyms (result)
+    `(let ((,result t))
+      ,@(loop for f in forms collect `(unless ,f (setf ,result nil)))
+      ,result)))

Now you can fix check by simply changing the expansion to use +combine-results instead of PROGN.

(defmacro check (&body forms)
+  `(combine-results
+    ,@(loop for f in forms collect `(report-result ,f ',f))))

With that version of check, test-+ should emit the +results of its three test expressions and then return T to +indicate that everything passed.4

CL-USER> (test-+)
+pass ... (= (+ 1 2) 3)
+pass ... (= (+ 1 2 3) 6)
+pass ... (= (+ -1 -3) -4)
+T

And if you change one of the test cases so it fails,5 the final return value changes to NIL.

CL-USER> (test-+)
+pass ... (= (+ 1 2) 3)
+pass ... (= (+ 1 2 3) 6)
+FAIL ... (= (+ -1 -3) -5)
+NIL

Better Result Reporting

As long as you have only one test function, the current result +reporting is pretty clear. If a particular test case fails, all you +have to do is find the test case in the check form and figure +out why it's failing. But if you write a lot of tests, you'll +probably want to organize them somehow, rather than shoving them all +into one function. For instance, suppose you wanted to add some test +cases for the * function. You might write a new test function.

(defun test-* ()
+  (check
+    (= (* 2 2) 4)
+    (= (* 3 5) 15)))

Now that you have two test functions, you'll probably want another +function that runs all the tests. That's easy enough.

(defun test-arithmetic ()
+  (combine-results
+   (test-+)
+   (test-*)))

In this function you use combine-results instead of +check since both test-+ and test-* will take +care of reporting their own results. When you run +test-arithmetic, you'll get the following results:

CL-USER> (test-arithmetic)
+pass ... (= (+ 1 2) 3)
+pass ... (= (+ 1 2 3) 6)
+pass ... (= (+ -1 -3) -4)
+pass ... (= (* 2 2) 4)
+pass ... (= (* 3 5) 15)
+T

Now imagine that one of the test cases failed and you need to track +down the problem. With only five test cases and two test functions, +it won't be too hard to find the code of the failing test case. But +suppose you had 500 test cases spread across 20 functions. It might +be nice if the results told you what function each test case came +from.

Since the code that prints the results is centralized in +report-result, you need a way to pass information about what +test function you're in to report-result. You could add a +parameter to report-result to pass this information, but +check, which generates the calls to report-result, +doesn't know what function it's being called from, which means you'd +also have to change the way you call check, passing it an +argument that it simply passes onto report-result.

This is exactly the kind of problem dynamic variables were designed +to solve. If you create a dynamic variable that each test function +binds to the name of the function before calling check, then +report-result can use it without check having to know +anything about it.

Step one is to declare the variable at the top level.

(defvar *test-name* nil)

Now you need to make another tiny change to report-result to +include *test-name* in the FORMAT output.

(format t "~:[FAIL~;pass~] ... ~a: ~a~%" result *test-name* form)

With those changes, the test functions will still work but will +produce the following output because *test-name* is never +rebound:

CL-USER> (test-arithmetic)
+pass ... NIL: (= (+ 1 2) 3)
+pass ... NIL: (= (+ 1 2 3) 6)
+pass ... NIL: (= (+ -1 -3) -4)
+pass ... NIL: (= (* 2 2) 4)
+pass ... NIL: (= (* 3 5) 15)
+T

For the name to be reported properly, you need to change the two test +functions.

(defun test-+ ()
+  (let ((*test-name* 'test-+))
+    (check
+      (= (+ 1 2) 3)
+      (= (+ 1 2 3) 6)
+      (= (+ -1 -3) -4))))
+
+(defun test-* ()
+  (let ((*test-name* 'test-*))
+    (check
+      (= (* 2 2) 4)
+      (= (* 3 5) 15))))

Now the results are properly labeled.

CL-USER> (test-arithmetic)
+pass ... TEST-+: (= (+ 1 2) 3)
+pass ... TEST-+: (= (+ 1 2 3) 6)
+pass ... TEST-+: (= (+ -1 -3) -4)
+pass ... TEST-*: (= (* 2 2) 4)
+pass ... TEST-*: (= (* 3 5) 15)
+T

An Abstraction Emerges

In fixing the test functions, you've introduced several new bits of +duplication. Not only does each function have to include the name of +the function twice--once as the name in the DEFUN and once in +the binding of *test-name*--but the same three-line code +pattern is duplicated between the two functions. You could remove the +duplication simply on the grounds that duplication is bad. But if you +look more closely at the root cause of the duplication, you can learn +an important lesson about how to use macros.

The reason both these functions start the same way is because they're +both test functions. The duplication arises because, at the moment, +test function is only half an abstraction. The abstraction exists +in your mind, but in the code there's no way to express "this is a +test function" other than to write code that follows a particular +pattern.

Unfortunately, partial abstractions are a crummy tool for building +software. Because a half abstraction is expressed in code by a +manifestation of the pattern, you're guaranteed to have massive code +duplication with all the normal bad consequences that implies for +maintainability. More subtly, because the abstraction exists only in +the minds of programmers, there's no mechanism to make sure different +programmers (or even the same programmer working at different times) +actually understand the abstraction the same way. To make a complete +abstraction, you need a way to express "this is a test function" and +have all the code required by the pattern be generated for you. In +other words, you need a macro.

Because the pattern you're trying to capture is a DEFUN plus +some boilerplate code, you need to write a macro that will expand +into a DEFUN. You'll then use this macro, instead of a plain +DEFUN to define test functions, so it makes sense to call it +deftest.

(defmacro deftest (name parameters &body body)
+  `(defun ,name ,parameters
+    (let ((*test-name* ',name))
+      ,@body)))

With this macro you can rewrite test-+ as follows:

(deftest test-+ ()
+  (check
+    (= (+ 1 2) 3)
+    (= (+ 1 2 3) 6)
+    (= (+ -1 -3) -4)))

A Hierarchy of Tests

Now that you've established test functions as first-class citizens, +the question might arise, should test-arithmetic be a test +function? As things stand, it doesn't really matter--if you did +define it with deftest, its binding of *test-name* +would be shadowed by the bindings in test-+ and test-* +before any results are reported.

But now imagine you've got thousands of test cases to organize. The +first level of organization is provided by test functions such as +test-+ and test-* that directly call check. But +with thousands of test cases, you'll likely need other levels of +organization. Functions such as test-arithmetic can group +related test functions into test suites. Now suppose some low-level +test functions are called from multiple test suites. It's not unheard +of for a test case to pass in one context but fail in another. If +that happens, you'll probably want to know more than just what +low-level test function contains the test case.

If you define the test suite functions such as test-arithmetic +with deftest and make a small change to the *test-name* +bookkeeping, you can have results reported with a "fully qualified" +path to the test case, something like this:

pass ... (TEST-ARITHMETIC TEST-+): (= (+ 1 2) 3)

Because you've already abstracted the process of defining a test +function, you can change the bookkeeping details without modifying +the code of the test functions.6 To make *test-name* hold a list of test +function names instead of just the name of the most recently entered +test function, you just need to change this binding form:

(let ((*test-name* ',name))

to the following:

(let ((*test-name* (append *test-name* (list ',name))))

Since APPEND returns a new list made up of the elements of its +arguments, this version will bind *test-name* to a list +containing the old contents of *test-name* with the new name +tacked onto the end.7 When +each test function returns, the old value of *test-name* will +be restored.

Now you can redefine test-arithmetic with deftest +instead of DEFUN.

(deftest test-arithmetic ()
+  (combine-results
+   (test-+)
+   (test-*)))

The results now show exactly how you got to each test expression.

CL-USER> (test-arithmetic)
+pass ... (TEST-ARITHMETIC TEST-+): (= (+ 1 2) 3)
+pass ... (TEST-ARITHMETIC TEST-+): (= (+ 1 2 3) 6)
+pass ... (TEST-ARITHMETIC TEST-+): (= (+ -1 -3) -4)
+pass ... (TEST-ARITHMETIC TEST-*): (= (* 2 2) 4)
+pass ... (TEST-ARITHMETIC TEST-*): (= (* 3 5) 15)
+T

As your test suite grows, you can add new layers of test functions; +as long as they're defined with deftest, the results will be +reported correctly. For instance, the following:

(deftest test-math ()
+  (test-arithmetic))

would generate these results:

CL-USER> (test-math)
+pass ... (TEST-MATH TEST-ARITHMETIC TEST-+): (= (+ 1 2) 3)
+pass ... (TEST-MATH TEST-ARITHMETIC TEST-+): (= (+ 1 2 3) 6)
+pass ... (TEST-MATH TEST-ARITHMETIC TEST-+): (= (+ -1 -3) -4)
+pass ... (TEST-MATH TEST-ARITHMETIC TEST-*): (= (* 2 2) 4)
+pass ... (TEST-MATH TEST-ARITHMETIC TEST-*): (= (* 3 5) 15)
+T

Wrapping Up

You could keep going, adding more features to this test framework. +But as a framework for writing tests with a minimum of busywork and +easily running them from the REPL, this is a reasonable start. Here's +the complete code, all 26 lines of it:

(defvar *test-name* nil)
+
+(defmacro deftest (name parameters &body body)
+  "Define a test function. Within a test function we can call
+   other test functions or use 'check' to run individual test
+   cases."
+  `(defun ,name ,parameters
+    (let ((*test-name* (append *test-name* (list ',name))))
+      ,@body)))
+
+(defmacro check (&body forms)
+  "Run each expression in 'forms' as a test case."
+  `(combine-results
+    ,@(loop for f in forms collect `(report-result ,f ',f))))
+
+(defmacro combine-results (&body forms)
+  "Combine the results (as booleans) of evaluating 'forms' in order."
+  (with-gensyms (result)
+    `(let ((,result t))
+      ,@(loop for f in forms collect `(unless ,f (setf ,result nil)))
+      ,result)))
+
+(defun report-result (result form)
+  "Report the results of a single test case. Called by 'check'."
+  (format t "~:[FAIL~;pass~] ... ~a: ~a~%" result *test-name* form)
+  result)

It's worth reviewing how you got here because it's illustrative of +how programming in Lisp often goes.

You started by defining a simple version of your problem--how to +evaluate a bunch of boolean expressions and find out if they all +returned true. Just ANDing them together worked and was +syntactically clean but revealed the need for better result +reporting. So you wrote some really simpleminded code, chock-full of +duplication and error-prone idioms that reported the results the way +you wanted.

The next step was to see if you could refactor the second version +into something as clean as the former. You started with a standard +refactoring technique of extracting some code into a function, +report-result. Unfortunately, you could see that using +report-result was going to be tedious and error-prone since +you had to pass the test expression twice, once for the value and +once as quoted data. So you wrote the check macro to automate +the details of calling report-result correctly.

While writing check, you realized as long as you were +generating code, you could make a single call to check to +generate multiple calls to report-result, getting you back to +a version of test-+ about as concise as the original AND +version.

At that point you had the check API nailed down, which allowed +you to start mucking with how it worked on the inside. The next task +was to fix check so the code it generated would return a +boolean indicating whether all the test cases had passed. Rather than +immediately hacking away at check, you paused to indulge in a +little language design by fantasy. What if--you fantasized--there was +already a non-short-circuiting AND construct. Then fixing +check would be trivial. Returning from fantasyland you +realized there was no such construct but that you could write one in +a few lines. After writing combine-results, the fix to +check was indeed trivial.

At that point all that was left was to make a few more improvements +to the way you reported test results. Once you started making changes +to the test functions, you realized those functions represented a +special category of function that deserved its own abstraction. So +you wrote deftest to abstract the pattern of code that turns a +regular function into a test function.

With deftest providing an abstraction barrier between the test +definitions and the underlying machinery, you were able to enhance +the result reporting without touching the test functions.

Now, with the basics of functions, variables, and macros mastered, +and a little practical experience using them, you're ready to start +exploring Common Lisp's rich standard library of functions and data +types. +


1This is for illustrative +purposes only--obviously, writing test cases for built-in functions +such as + is a bit silly, since if such basic things aren't +working, the chances the tests will be running the way you expect is +pretty slim. On the other hand, most Common Lisps are implemented +largely in Common Lisp, so it's not crazy to imagine writing test +suites in Common Lisp to test the standard library functions.

2Side effects can include +such things as signaling errors; I'll discuss Common Lisp's error +handling system in Chapter 19. You may, after reading that chapter, +want to think about how to incorporate tests that check whether a +function does or does not signal a particular error in certain +situations.

3I'll discuss this and other FORMAT +directives in more detail in Chapter 18.

4If test-+ has been +compiled--which may happen implicitly in certain Lisp +implementations--you may need to reevaluate the definition of +test-+ to get the changed definition of check to affect +the behavior of test-+. Interpreted code, on the other hand, +typically expands macros anew each time the code is interpreted, +allowing the effects of macro redefinitions to be seen immediately.

5You have to +change the test to make it fail since you can't change the behavior +of +.

6Though, again, if the test +functions have been compiled, you'll have to recompile them after +changing the macro.

7As you'll see in Chapter 12, APPENDing +to the end of a list isn't the most efficient way to build a list. +But for now this is sufficient--as long as the test hierarchies +aren't too deep, it should be fine. And if it becomes a problem, all +you'll have to do is change the definition of deftest.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-parsing-binary-files.html b/clones/gigamonkeys.com/book/practical-parsing-binary-files.html new file mode 100644 index 00000000..13902f1a --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-parsing-binary-files.html @@ -0,0 +1,967 @@ +Practical: Parsing Binary Files

24. Practical: Parsing Binary Files

In this chapter I'll show you how to build a library that you can use +to write code for reading and writing binary files. You'll use this +library in Chapter 25 to write a parser for ID3 tags, the mechanism +used to store metadata such as artist and album names in MP3 files. +This library is also an example of how to use macros to extend the +language with new constructs, turning it into a special-purpose +language for solving a particular problem, in this case reading and +writing binary data. Because you'll develop the library a bit at a +time, including several partial versions, it may seem you're writing a +lot of code. But when all is said and done, the whole library is fewer +than 150 lines of code, and the longest macro is only 20 lines long.

Binary Files

At a sufficiently low level of abstraction, all files are "binary" in +the sense that they just contain a bunch of numbers encoded in binary +form. However, it's customary to distinguish between text files, +where all the numbers can be interpreted as characters representing +human-readable text, and binary files, which contain data that, +if interpreted as characters, yields nonprintable characters.1

Binary file formats are usually designed to be both compact and +efficient to parse--that's their main advantage over text-based +formats. To meet both those criteria, they're usually composed of +on-disk structures that are easily mapped to data structures that a +program might use to represent the same data in memory.2

The library will give you an easy way to define the mapping between +the on-disk structures defined by a binary file format and in-memory +Lisp objects. Using the library, it should be easy to write a program +that can read a binary file, translating it into Lisp objects that +you can manipulate, and then write back out to another properly +formatted binary file.

Binary Format Basics

The starting point for reading and writing binary files is to open the +file for reading or writing individual bytes. As I discussed in +Chapter 14, both OPEN and WITH-OPEN-FILE accept a keyword +argument, :element-type, that controls the basic unit of +transfer for the stream. When you're dealing with binary files, +you'll specify (unsigned-byte 8). An input stream opened with +such an :element-type will return an integer between 0 and 255 +each time it's passed to READ-BYTE. Conversely, you can write +bytes to an (unsigned-byte 8) output stream by passing numbers +between 0 and 255 to WRITE-BYTE.

Above the level of individual bytes, most binary formats use a +smallish number of primitive data types--numbers encoded in various +ways, textual strings, bit fields, and so on--which are then composed +into more complex structures. So your first task is to define a +framework for writing code to read and write the primitive data types +used by a given binary format.

To take a simple example, suppose you're dealing with a binary format +that uses an unsigned 16-bit integer as a primitive data type. To +read such an integer, you need to read the two bytes and then combine +them into a single number by multiplying one byte by 256, a.k.a. 2^8, +and adding it to the other byte. For instance, assuming the binary +format specifies that such 16-bit quantities are stored in +big-endian3 form, +with the most significant byte first, you can read such a number with +this function:

(defun read-u2 (in)
+  (+ (* (read-byte in) 256) (read-byte in)))

However, Common Lisp provides a more convenient way to perform this +kind of bit twiddling. The function LDB, whose name stands for +load byte, can be used to extract and set (with SETF) any number +of contiguous bits from an integer.4 The number of bits and their position within the +integer is specified with a byte specifier created with the +BYTE function. BYTE takes two arguments, the number of bits +to extract (or set) and the position of the rightmost bit where the +least significant bit is at position zero. LDB takes a byte +specifier and the integer from which to extract the bits and returns +the positive integer represented by the extracted bits. Thus, you can +extract the least significant octet of an integer like this:

(ldb (byte 8 0) #xabcd) ==> 205 ; 205 is #xcd

To get the next octet, you'd use a byte specifier of (byte 8 +8) like this:

(ldb (byte 8 8) #xabcd) ==> 171 ; 171 is #xab

You can use LDB with SETF to set the specified bits of an +integer stored in a SETFable place.

CL-USER> (defvar *num* 0)
+*NUM*
+CL-USER> (setf (ldb (byte 8 0) *num*) 128)
+128
+CL-USER> *num*
+128
+CL-USER> (setf (ldb (byte 8 8) *num*) 255)
+255
+CL-USER> *num*
+65408

Thus, you can also write read-u2 like this:5

(defun read-u2 (in)
+  (let ((u2 0))
+    (setf (ldb (byte 8 8) u2) (read-byte in))
+    (setf (ldb (byte 8 0) u2) (read-byte in))
+    u2))

To write a number out as a 16-bit integer, you need to extract the +individual 8-bit bytes and write them one at a time. To extract the +individual bytes, you just need to use LDB with the same byte +specifiers.

(defun write-u2 (out value)
+  (write-byte (ldb (byte 8 8) value) out)
+  (write-byte (ldb (byte 8 0) value) out))

Of course, you can also encode integers in many other ways--with +different numbers of bytes, with different endianness, and in signed +and unsigned format.

Strings in Binary Files

Textual strings are another kind of primitive data type you'll find +in many binary formats. When you read files one byte at a time, you +can't read and write strings directly--you need to decode and encode +them one byte at a time, just as you do with binary-encoded numbers. +And just as you can encode an integer in several ways, you can encode +a string in many ways. To start with, the binary format must specify +how individual characters are encoded.

To translate bytes to characters, you need to know both what +character code and what character encoding you're using. A +character code defines a mapping from positive integers to +characters. Each number in the mapping is called a code point. +For instance, ASCII is a character code that maps the numbers from +0-127 to particular characters used in the Latin alphabet. A +character encoding, on the other hand, defines how the code points +are represented as a sequence of bytes in a byte-oriented medium such +as a file. For codes that use eight or fewer bits, such as ASCII and +ISO-8859-1, the encoding is trivial--each numeric value is encoded as +a single byte.

Nearly as straightforward are pure double-byte encodings, such as +UCS-2, which map between 16-bit values and characters. The only +reason double-byte encodings can be more complex than single-byte +encodings is that you may also need to know whether the 16-bit values +are supposed to be encoded in big-endian or little-endian format.

Variable-width encodings use different numbers of octets for +different numeric values, making them more complex but allowing them +to be more compact in many cases. For instance, UTF-8, an encoding +designed for use with the Unicode character code, uses a single octet +to encode the values 0-127 while using up to four octets to encode +values up to 1,114,111.6

Since the code points from 0-127 map to the same characters in +Unicode as they do in ASCII, a UTF-8 encoding of text consisting only +of characters also in ASCII is the same as the ASCII encoding. On the +other hand, texts consisting mostly of characters requiring four +bytes in UTF-8 could be more compactly encoded in a straight +double-byte encoding.

Common Lisp provides two functions for translating between numeric +character codes and character objects: CODE-CHAR, which takes an +numeric code and returns as a character, and CHAR-CODE, which +takes a character and returns its numeric code. The language standard +doesn't specify what character encoding an implementation must use, +so there's no guarantee you can represent every character that can +possibly be encoded in a given file format as a Lisp character. +However, almost all contemporary Common Lisp implementations use +ASCII, ISO-8859-1, or Unicode as their native character code. Because +Unicode is a superset ofISO-8859-1, which is in turn a superset of +ASCII, if you're using a Unicode Lisp, CODE-CHAR and +CHAR-CODE can be used directly for translating any of those +three character codes.7

In addition to specifying a character encoding, a string encoding +must also specify how to encode the length of the string. Three +techniques are typically used in binary file formats.

The simplest is to not encode it but to let it be implicit in the +position of the string in some larger structure: a particular element +of a file may always be a string of a certain length, or a string may +be the last element of a variable-length data structure whose overall +size determines how many bytes are left to read as string data. Both +these techniques are used in ID3 tags, as you'll see in the next +chapter.

The other two techniques can be used to encode variable-length +strings without relying on context. One is to encode the length of +the string followed by the character data--the parser reads an +integer value (in some specified integer format) and then reads that +number of characters. Another is to write the character data followed +by a delimiter that can't appear in the string such as a null +character.

The different representations have different advantages and +disadvantages, but when you're dealing with already specified binary +formats, you won't have any control over which encoding is used. +However, none of the encodings is particularly more difficult to read +and write than any other. Here, as an example, is a function that +reads a null-terminated ASCII string, assuming your Lisp +implementation uses ASCII or one of its supersets such as ISO-8859-1 +or full Unicode as its native character encoding:

(defconstant +null+ (code-char 0))
+
+(defun read-null-terminated-ascii (in)
+  (with-output-to-string (s)
+    (loop for char = (code-char (read-byte in))
+          until (char= char +null+) do (write-char char s))))

The WITH-OUTPUT-TO-STRING macro, which I mentioned in Chapter 14, +is an easy way to build up a string when you don't know how long it'll +be. It creates a STRING-STREAM and binds it to the variable name +specified, s in this case. All characters written to the stream +are collected into a string, which is then returned as the value of +the WITH-OUTPUT-TO-STRING form.

To write a string back out, you just need to translate the characters +back to numeric values that can be written with WRITE-BYTE and +then write the null terminator after the string contents.

(defun write-null-terminated-ascii (string out)
+  (loop for char across string
+        do (write-byte (char-code char) out))
+  (write-byte (char-code +null+) out))

As these examples show, the main intellectual challenge--such as it +is--of reading and writing primitive elements of binary files is +understanding how exactly to interpret the bytes that appear in a +file and to map them to Lisp data types. If a binary file format is +well specified, this should be a straightforward proposition. +Actually writing functions to read and write a particular encoding +is, as they say, a simple matter of programming.

Now you can turn to the issue of reading and writing more complex +on-disk structures and how to map them to Lisp objects.

Composite Structures

Since binary formats are usually used to represent data in a way that +makes it easy to map to in-memory data structures, it should come as +no surprise that composite on-disk structures are usually defined in +ways similar to the way programming languages define in-memory +structures. Usually a composite on-disk structure will consist of a +number of named parts, each of which is itself either a primitive +type such as a number or a string, another composite structure, or +possibly a collection of such values.

For instance, an ID3 tag defined in the 2.2 version of the +specification consists of a header made up of a three-character +ISO-8859-1 string, which is always "ID3"; two one-byte unsigned +integers that specify the major version and revision of the +specification; eight bits worth of boolean flags; and four bytes that +encode the size of the tag in an encoding particular to the ID3 +specification. Following the header is a list of frames, each of +which has its own internal structure. After the frames are as many +null bytes as are necessary to pad the tag out to the size specified +in the header.

If you look at the world through the lens of object orientation, +composite structures look a lot like classes. For instance, you could +write a class to represent an ID3 tag.

(defclass id3-tag ()
+  ((identifier    :initarg :identifier    :accessor identifier)
+   (major-version :initarg :major-version :accessor major-version)
+   (revision      :initarg :revision      :accessor revision)
+   (flags         :initarg :flags         :accessor flags)
+   (size          :initarg :size          :accessor size)
+   (frames        :initarg :frames        :accessor frames)))

An instance of this class would make a perfect repository to hold the +data needed to represent an ID3 tag. You could then write functions +to read and write instances of this class. For example, assuming the +existence of certain other functions for reading the appropriate +primitive data types, a read-id3-tag function might look like +this:

(defun read-id3-tag (in)
+  (let ((tag (make-instance 'id3-tag)))
+    (with-slots (identifier major-version revision flags size frames) tag
+      (setf identifier    (read-iso-8859-1-string in :length 3))
+      (setf major-version (read-u1 in))
+      (setf revision      (read-u1 in))
+      (setf flags         (read-u1 in))
+      (setf size          (read-id3-encoded-size in))
+      (setf frames        (read-id3-frames in :tag-size size)))
+    tag))

The write-id3-tag function would be structured similarly--you'd +use the appropriate write-* functions to write out the values +stored in the slots of the id3-tag object.

It's not hard to see how you could write the appropriate classes to +represent all the composite data structures in a specification along +with read-foo and write-foo functions for each class and +for necessary primitive types. But it's also easy to tell that all the +reading and writing functions are going to be pretty similar, +differing only in the specifics of what types they read and the names +of the slots they store them in. It's particularly irksome when you +consider that in the ID3 specification it takes about four lines of +text to specify the structure of an ID3 tag, while you've already +written eighteen lines of code and haven't even written +write-id3-tag yet.

What you'd really like is a way to describe the structure of +something like an ID3 tag in a form that's as compressed as the +specification's pseudocode yet that can also be expanded into code +that defines the id3-tag class and the functions that +translate between bytes on disk and instances of the class. Sounds +like a job for a macro.

Designing the Macros

Since you already have a rough idea what code your macros will need +to generate, the next step, according to the process for writing a +macro I outlined in Chapter 8, is to switch perspectives and think +about what a call to the macro should look like. Since the goal is to +be able to write something as compressed as the pseudocode in the ID3 +specification, you can start there. The header of an ID3 tag is +specified like this:

ID3/file identifier      "ID3"
+ID3 version              $02 00
+ID3 flags                %xx000000
+ID3 size             4 * %0xxxxxxx

In the notation of the specification, this means the "file +identifier" slot of an ID3 tag is the string "ID3" in ISO-8859-1 +encoding. The version consists of two bytes, the first of which--for +this version of the specification--has the value 2 and the second of +which--again for this version of the specification--is 0. The flags +slot is eight bits, of which all but the first two are 0, and the +size consists of four bytes, each of which has a 0 in the most +significant bit.

Some information isn't captured by this pseudocode. For instance, +exactly how the four bytes that encode the size are to be interpreted +is described in a few lines of prose. Likewise, the spec describes in +prose how the frame and subsequent padding is stored after this +header. But most of what you need to know to be able to write code to +read and write an ID3 tag is specified by this pseudocode. Thus, you +ought to be able to write an s-expression version of this pseudocode +and have it expanded into the class and function definitions you'd +otherwise have to write by hand--something, perhaps, like this:

(define-binary-class id3-tag
+  ((file-identifier (iso-8859-1-string :length 3))
+   (major-version   u1)
+   (revision        u1)
+   (flags           u1)
+   (size            id3-tag-size)
+   (frames          (id3-frames :tag-size size))))

The basic idea is that this form defines a class id3-tag +similar to the way you could with DEFCLASS, but instead of +specifying things such as :initarg and :accessors, each +slot specification consists of the name of the +slot--file-identifier, major-version, and so on--and +information about how that slot is represented on disk. Since this is +just a bit of fantasizing, you don't have to worry about exactly how +the macro define-binary-class will know what to do with +expressions such as (iso-8859-1-string :length 3), u1, +id3-tag-size, and (id3-frames :tag-size size); as long +as each expression contains the information necessary to know how to +read and write a particular data encoding, you should be okay.

Making the Dream a Reality

Okay, enough fantasizing about good-looking code; now you need to get +to work writing define-binary-class--writing the code that +will turn that concise expression of what an ID3 tag looks like into +code that can represent one in memory, read one off disk, and write +it back out.

To start with, you should define a package for this library. Here's +the package file that comes with the version you can download from +the book's Web site:

(in-package :cl-user)
+
+(defpackage :com.gigamonkeys.binary-data
+  (:use :common-lisp :com.gigamonkeys.macro-utilities)
+  (:export :define-binary-class
+           :define-tagged-binary-class
+           :define-binary-type
+           :read-value
+           :write-value
+           :*in-progress-objects*
+           :parent-of-type
+           :current-binary-object
+           :+null+))

The COM.GIGAMONKEYS.MACRO-UTILITIES package contains the +with-gensyms and once-only macros from Chapter 8.

Since you already have a handwritten version of the code you want to +generate, it shouldn't be too hard to write such a macro. Just take +it in small pieces, starting with a version of +define-binary-class that generates just the DEFCLASS +form.

If you look back at the define-binary-class form, you'll see +that it takes two arguments, the name id3-tag and a list of +slot specifiers, each of which is itself a two-item list. From those +pieces you need to build the appropriate DEFCLASS form. Clearly, +the biggest difference between the define-binary-class form +and a proper DEFCLASS form is in the slot specifiers. A single +slot specifier from define-binary-class looks something like +this:

(major-version u1)

But that's not a legal slot specifier for a DEFCLASS. Instead, +you need something like this:

(major-version :initarg :major-version :accessor major-version)

Easy enough. First define a simple function to translate a symbol to +the corresponding keyword symbol.

(defun as-keyword (sym) (intern (string sym) :keyword))

Now define a function that takes a define-binary-class slot +specifier and returns a DEFCLASS slot specifier.

(defun slot->defclass-slot (spec)
+  (let ((name (first spec)))
+    `(,name :initarg ,(as-keyword name) :accessor ,name)))

You can test this function at the REPL after switching to your new +package with a call to IN-PACKAGE.

BINARY-DATA> (slot->defclass-slot '(major-version u1))
+(MAJOR-VERSION :INITARG :MAJOR-VERSION :ACCESSOR MAJOR-VERSION)

Looks good. Now the first version of define-binary-class is +trivial.

(defmacro define-binary-class (name slots)
+  `(defclass ,name ()
+     ,(mapcar #'slot->defclass-slot slots)))

This is simple template-style macro--define-binary-class +generates a DEFCLASS form by interpolating the name of the class +and a list of slot specifiers constructed by applying +slot->defclass-slot to each element of the list of slots +specifiers from the define-binary-class form.

To see exactly what code this macro generates, you can evaluate this +expression at the REPL.

(macroexpand-1 '(define-binary-class id3-tag
+  ((identifier      (iso-8859-1-string :length 3))
+   (major-version   u1)
+   (revision        u1)
+   (flags           u1)
+   (size            id3-tag-size)
+   (frames          (id3-frames :tag-size size)))))

The result, slightly reformatted here for better readability, should +look familiar since it's exactly the class definition you wrote by +hand earlier:

(defclass id3-tag ()
+  ((identifier      :initarg :identifier    :accessor identifier)
+   (major-version   :initarg :major-version :accessor major-version)
+   (revision        :initarg :revision      :accessor revision)
+   (flags           :initarg :flags         :accessor flags)
+   (size            :initarg :size          :accessor size)
+   (frames          :initarg :frames        :accessor frames)))

Reading Binary Objects

Next you need to make define-binary-class also generate a +function that can read an instance of the new class. Looking back at +the read-id3-tag function you wrote before, this seems a bit +trickier, as the read-id3-tag wasn't quite so regular--to read +each slot's value, you had to call a different function. Not to +mention, the name of the function, read-id3-tag, while derived +from the name of the class you're defining, isn't one of the +arguments to define-binary-class and thus isn't available to +be interpolated into a template the way the class name was.

You could deal with both of those problems by devising and following a +naming convention so the macro can figure out the name of the function +to call based on the name of the type in the slot specifier. However, +this would require define-binary-class to generate the name +read-id3-tag, which is possible but a bad idea. Macros that +create global definitions should generally use only names passed to +them by their callers; macros that generate names under the covers can +cause hard-to-predict--and hard-to-debug--name conflicts when the +generated names happen to be the same as names used +elsewhere.8

You can avoid both these inconveniences by noticing that all the +functions that read a particular type of value have the same +fundamental purpose, to read a value of a specific type from a +stream. Speaking colloquially, you might say they're all instances of +a single generic operation. And the colloquial use of the word +generic should lead you directly to the solution to your problem: +instead of defining a bunch of independent functions, all with +different names, you can define a single generic function, +read-value, with methods specialized to read different types +of values.

That is, instead of defining functions read-iso-8859-1-string +and read-u1, you can define read-value as a generic +function taking two required arguments, a type and a stream, and +possibly some keyword arguments.

(defgeneric read-value (type stream &key)
+  (:documentation "Read a value of the given type from the stream."))

By specifying &key without any actual keyword parameters, you +allow different methods to define their own &key parameters +without requiring them to do so. This does mean every method +specialized on read-value will have to include either +&key or an &rest parameter in its parameter list to be +compatible with the generic function.

Then you'll define methods that use EQL specializers to +specialize the type argument on the name of the type you want to +read.

(defmethod read-value ((type (eql 'iso-8859-1-string)) in &key length) ...)
+
+(defmethod read-value ((type (eql 'u1)) in &key) ...)

Then you can make define-binary-class generate a +read-value method specialized on the type name id3-tag, +and that method can be implemented in terms of calls to +read-value with the appropriate slot types as the first +argument. The code you want to generate is going to look like this:

(defmethod read-value ((type (eql 'id3-tag)) in &key)
+  (let ((object (make-instance 'id3-tag)))
+    (with-slots (identifier major-version revision flags size frames) object
+      (setf identifier    (read-value 'iso-8859-1-string in :length 3))
+      (setf major-version (read-value 'u1 in))
+      (setf revision      (read-value 'u1 in))
+      (setf flags         (read-value 'u1 in))
+      (setf size          (read-value 'id3-encoded-size in))
+      (setf frames        (read-value 'id3-frames in :tag-size size)))
+    object))

So, just as you needed a function to translate a +define-binary-class slot specifier to a DEFCLASS slot +specifier in order to generate the DEFCLASS form, now you need a +function that takes a define-binary-class slot specifier and +generates the appropriate SETF form, that is, something that +takes this:

(identifier (iso-8859-1-string :length 3))

and returns this:

(setf identifier (read-value 'iso-8859-1-string in :length 3))

However, there's a difference between this code and the DEFCLASS +slot specifier: it includes a reference to a variable in--the +method parameter from the read-value method--that wasn't +derived from the slot specifier. It doesn't have to be called +in, but whatever name you use has to be the same as the one +used in the method's parameter list and in the other calls to +read-value. For now you can dodge the issue of where that name +comes from by defining slot->read-value to take a second +argument of the name of the stream variable.

(defun slot->read-value (spec stream)
+  (destructuring-bind (name (type &rest args)) (normalize-slot-spec spec)
+    `(setf ,name (read-value ',type ,stream ,@args))))

The function normalize-slot-spec normalizes the second element +of the slot specifier, converting a symbol like u1 to the list +(u1) so the DESTRUCTURING-BIND can parse it. It looks like +this:

(defun normalize-slot-spec (spec)
+  (list (first spec) (mklist (second spec))))
+
+(defun mklist (x) (if (listp x) x (list x)))

You can test slot->read-value with each type of slot +specifier.

BINARY-DATA> (slot->read-value '(major-version u1) 'stream)
+(SETF MAJOR-VERSION (READ-VALUE 'U1 STREAM))
+BINARY-DATA> (slot->read-value '(identifier (iso-8859-1-string :length 3)) 'stream)
+(SETF IDENTIFIER (READ-VALUE 'ISO-8859-1-STRING STREAM :LENGTH 3))

With these functions you're ready to add read-value to +define-binary-class. If you take the handwritten +read-value method and strip out anything that's tied to a +particular class, you're left with this skeleton:

(defmethod read-value ((type (eql ...)) stream &key)
+  (let ((object (make-instance ...)))
+    (with-slots (...) object
+      ...
+    object)))

All you need to do is add this skeleton to the +define-binary-class template, replacing ellipses with code +that fills in the skeleton with the appropriate names and code. +You'll also want to replace the variables type, stream, +and object with gensymed names to avoid potential conflicts +with slot names,9 which you can do with the +with-gensyms macro from Chapter 8.

Also, because a macro must expand into a single form, you need to wrap +some form around the DEFCLASS and DEFMETHOD. PROGN is +the customary form to use for macros that expand into multiple +definitions because of the special treatment it gets from the file +compiler when appearing at the top level of a file, as I discussed in +Chapter 20.

So, you can change define-binary-class as follows:

(defmacro define-binary-class (name slots)
+  (with-gensyms (typevar objectvar streamvar)
+    `(progn
+       (defclass ,name ()
+         ,(mapcar #'slot->defclass-slot slots))
+
+       (defmethod read-value ((,typevar (eql ',name)) ,streamvar &key)
+         (let ((,objectvar (make-instance ',name)))
+           (with-slots ,(mapcar #'first slots) ,objectvar
+             ,@(mapcar #'(lambda (x) (slot->read-value x streamvar)) slots))
+           ,objectvar)))))

Writing Binary Objects

Generating code to write out an instance of a binary class will +proceed similarly. First you can define a write-value generic +function.

(defgeneric write-value (type stream value &key)
+  (:documentation "Write a value as the given type to the stream."))

Then you define a helper function that translates a +define-binary-class slot specifier into code that writes out +the slot using write-value. As with the +slot->read-value function, this helper function needs to take +the name of the stream variable as an argument.

(defun slot->write-value (spec stream)
+  (destructuring-bind (name (type &rest args)) (normalize-slot-spec spec)
+    `(write-value ',type ,stream ,name ,@args)))

Now you can add a write-value template to the +define-binary-class macro.

(defmacro define-binary-class (name slots)
+  (with-gensyms (typevar objectvar streamvar)
+    `(progn
+       (defclass ,name ()
+         ,(mapcar #'slot->defclass-slot slots))
+
+       (defmethod read-value ((,typevar (eql ',name)) ,streamvar &key)
+         (let ((,objectvar (make-instance ',name)))
+           (with-slots ,(mapcar #'first slots) ,objectvar
+             ,@(mapcar #'(lambda (x) (slot->read-value x streamvar)) slots))
+           ,objectvar))
+
+       (defmethod write-value ((,typevar (eql ',name)) ,streamvar ,objectvar &key)
+         (with-slots ,(mapcar #'first slots) ,objectvar
+           ,@(mapcar #'(lambda (x) (slot->write-value x streamvar)) slots))))))

Adding Inheritance and Tagged Structures

While this version of define-binary-class will handle +stand-alone structures, binary file formats often define on-disk +structures that would be natural to model with subclasses and +superclasses. So you might want to extend define-binary-class +to support inheritance.

A related technique used in many binary formats is to have several +on-disk structures whose exact type can be determined only by reading +some data that indicates how to parse the following bytes. For +instance, the frames that make up the bulk of an ID3 tag all share a +common header structure consisting of a string identifier and a +length. To read a frame, you need to read the identifier and use its +value to determine what kind of frame you're looking at and thus how +to parse the body of the frame.

The current define-binary-class macro has no way to handle +this kind of reading--you could use define-binary-class to +define a class to represent each kind of frame, but you'd have no way +to know what type of frame to read without reading at least the +identifier. And if other code reads the identifier in order to +determine what type to pass to read-value, then that will +break read-value since it's expecting to read all the data +that makes up the instance of the class it instantiates.

You can solve this problem by adding inheritance to +define-binary-class and then writing another macro, +define-tagged-binary-class, for defining "abstract" classes +that aren't instantiated directly but that can be specialized on by +read-value methods that know how to read enough data to +determine what kind of class to create.

The first step to adding inheritance to define-binary-class is +to add a parameter to the macro to accept a list of superclasses.

(defmacro define-binary-class (name (&rest superclasses) slots) ...

Then, in the DEFCLASS template, interpolate that value instead +of the empty list.

(defclass ,name ,superclasses
+  ...)

However, there's a bit more to it than that. You also need to change +the read-value and write-value methods so the methods +generated when defining a superclass can be used by the methods +generated as part of a subclass to read and write inherited slots.

The current way read-value works is particularly problematic +since it instantiates the object before filling it in--obviously, you +can't have the method responsible for reading the superclass's fields +instantiate one object while the subclass's method instantiates and +fills in a different object.

You can fix that problem by splitting read-value into two +parts--one responsible for instantiating the correct kind of object +and another responsible for filling slots in an existing object. On +the writing side it's a bit simpler, but you can use the same +technique.

So you'll define two new generic functions, read-object and +write-object, that will both take an existing object and a +stream. Methods on these generic functions will be responsible for +reading or writing the slots specific to the class of the object on +which they're specialized.

(defgeneric read-object (object stream)
+  (:method-combination progn :most-specific-last)
+  (:documentation "Fill in the slots of object from stream."))
+
+(defgeneric write-object (object stream)
+  (:method-combination progn :most-specific-last)
+  (:documentation "Write out the slots of object to the stream."))

Defining these generic functions to use the PROGN method +combination with the option :most-specific-last allows you to +define methods that specialize object on each binary class and +have them deal only with the slots actually defined in that class; +the PROGN method combination will combine all the applicable +methods so the method specialized on the least specific class in the +hierarchy runs first, reading or writing the slots defined in that +class, then the method specialized on next least specific subclass, +and so on. And since all the heavy lifting for a specific class is +now going to be done by read-object and write-object, +you don't even need to define specialized read-value and +write-value methods; you can define default methods that +assume the type argument is the name of a binary class.

(defmethod read-value ((type symbol) stream &key)
+  (let ((object (make-instance type)))
+    (read-object object stream)
+    object))
+
+(defmethod write-value ((type symbol) stream value &key)
+  (assert (typep value type))
+  (write-object value stream))

Note how you can use MAKE-INSTANCE as a generic object +factory--while you normally call MAKE-INSTANCE with a quoted +symbol as the first argument because you normally know exactly what +class you want to instantiate, you can use any expression that +evaluates to a class name such as, in this case, the type +parameter in the read-value method.

The actual changes to define-binary-class to define methods on +read-object and write-object rather than +read-value and write-value are fairly minor.

(defmacro define-binary-class (name superclasses slots)
+  (with-gensyms (objectvar streamvar)
+    `(progn
+       (defclass ,name ,superclasses
+         ,(mapcar #'slot->defclass-slot slots))
+
+       (defmethod read-object progn ((,objectvar ,name) ,streamvar)
+         (with-slots ,(mapcar #'first slots) ,objectvar
+           ,@(mapcar #'(lambda (x) (slot->read-value x streamvar)) slots)))
+
+       (defmethod write-object progn ((,objectvar ,name) ,streamvar)
+         (with-slots ,(mapcar #'first slots) ,objectvar
+           ,@(mapcar #'(lambda (x) (slot->write-value x streamvar)) slots))))))

Keeping Track of Inherited Slots

This definition will work for many purposes. However, it doesn't +handle one fairly common situation, namely, when you have a subclass +that needs to refer to inherited slots in its own slot +specifications. For instance, with the current definition of +define-binary-class, you can define a single class like this:

(define-binary-class generic-frame ()
+  ((id (iso-8859-1-string :length 3))
+   (size u3)
+   (data (raw-bytes :bytes size))))

The reference to size in the specification of data +works the way you'd expect because the expressions that read and +write the data slot are wrapped in a WITH-SLOTS that +lists all the object's slots. However, if you try to split that class +into two classes like this:

(define-binary-class frame ()
+  ((id (iso-8859-1-string :length 3))
+   (size u3)))
+
+(define-binary-class generic-frame (frame)
+  ((data (raw-bytes :bytes size))))

you'll get a compile-time warning when you compile the +generic-frame definition and a runtime error when you try to +use it because there will be no lexically apparent variable +size in the read-object and write-object methods +specialized on generic-frame.

What you need to do is keep track of the slots defined by each binary +class and then include inherited slots in the WITH-SLOTS forms +in the read-object and write-object methods.

The easiest way to keep track of information like this is to hang it +off the symbol that names the class. As I discussed in Chapter 21, +every symbol object has an associated property list, which can be +accessed via the functions SYMBOL-PLIST and GET. You can +associate arbitrary key/value pairs with a symbol by adding them to +its property list with SETF of GET. For instance, if the +binary class foo defines three slots--x, y, and +z--you can keep track of that fact by adding a slots +key to the symbol foo's property list with the value (x +y z) with this expression:

(setf (get 'foo 'slots) '(x y z))

You want this bookkeeping to happen as part of evaluating the +define-binary-class of foo. However, it's not clear +where to put the expression. If you evaluate it when you compute the +macro's expansion, it'll get evaluated when you compile the +define-binary-class form but not if you later load a file that +contains the resulting compiled code. On the other hand, if you +include the expression in the expansion, then it won't be +evaluated during compilation, which means if you compile a file with +several define-binary-class forms, none of the information +about what classes define what slots will be available until the +whole file is loaded, which is too late.

This is what the special operator EVAL-WHEN I discussed in +Chapter 20 is for. By wrapping a form in an EVAL-WHEN, you can +control whether it's evaluated at compile time, when the compiled +code is loaded, or both. For cases like this where you want to +squirrel away some information during the compilation of a macro form +that you also want to be available after the compiled form is loaded, +you should wrap it in an EVAL-WHEN like this:

(eval-when (:compile-toplevel :load-toplevel :execute)
+  (setf (get 'foo 'slots) '(x y z)))

and include the EVAL-WHEN in the expansion generated by the +macro. Thus, you can save both the slots and the direct superclasses +of a binary class by adding this form to the expansion generated by +define-binary-class:

(eval-when (:compile-toplevel :load-toplevel :execute)
+  (setf (get ',name 'slots) ',(mapcar #'first slots))
+  (setf (get ',name 'superclasses) ',superclasses))

Now you can define three helper functions for accessing this +information. The first simply returns the slots directly defined by a +binary class. It's a good idea to return a copy of the list since you +don't want other code to modify the list of slots after the binary +class has been defined.

(defun direct-slots (name)
+  (copy-list (get name 'slots)))

The next function returns the slots inherited from other binary +classes.

(defun inherited-slots (name)
+  (loop for super in (get name 'superclasses)
+        nconc (direct-slots super)
+        nconc (inherited-slots super)))

Finally, you can define a function that returns a list containing the +names of all directly defined and inherited slots.

(defun all-slots (name)
+  (nconc (direct-slots name) (inherited-slots name)))

When you're computing the expansion of a +define-generic-binary-class form, you want to generate a +WITH-SLOTS form that contains the names of all the slots defined +in the new class and all its superclasses. However, you can't use +all-slots while you're generating the expansion since the +information won't be available until after the expansion is compiled. +Instead, you should use the following function, which takes the list +of slot specifiers and superclasses passed to +define-generic-binary-class and uses them to compute the list +of all the new class's slots:

(defun new-class-all-slots (slots superclasses)
+  (nconc (mapcan #'all-slots superclasses) (mapcar #'first slots)))

With these functions defined, you can change +define-binary-class to store the information about the class +currently being defined and to use the already stored information +about the superclasses' slots to generate the WITH-SLOTS forms +you want like this:

(defmacro define-binary-class (name (&rest superclasses) slots)
+  (with-gensyms (objectvar streamvar)
+    `(progn
+       (eval-when (:compile-toplevel :load-toplevel :execute)
+         (setf (get ',name 'slots) ',(mapcar #'first slots))
+         (setf (get ',name 'superclasses) ',superclasses))
+
+       (defclass ,name ,superclasses
+         ,(mapcar #'slot->defclass-slot slots))
+
+       (defmethod read-object progn ((,objectvar ,name) ,streamvar)
+         (with-slots ,(new-class-all-slots slots superclasses) ,objectvar
+           ,@(mapcar #'(lambda (x) (slot->read-value x streamvar)) slots)))
+
+       (defmethod write-object progn ((,objectvar ,name) ,streamvar)
+         (with-slots ,(new-class-all-slots slots superclasses) ,objectvar
+           ,@(mapcar #'(lambda (x) (slot->write-value x streamvar)) slots))))))

Tagged Structures

With the ability to define binary classes that extend other binary +classes, you're ready to define a new macro for defining classes to +represent "tagged" structures. The strategy for reading tagged +structures will be to define a specialized read-value method +that knows how to read the values that make up the start of the +structure and then use those values to determine what subclass to +instantiate. It'll then make an instance of that class with +MAKE-INSTANCE, passing the already read values as initargs, and +pass the object to read-object, allowing the actual class of +the object to determine how the rest of the structure is read.

The new macro, define-tagged-binary-class, will look like +define-binary-class with the addition of a :dispatch +option used to specify a form that should evaluate to the name of a +binary class. The :dispatch form will be evaluated in a context +where the names of the slots defined by the tagged class are bound to +variables that hold the values read from the file. The class whose +name it returns must accept initargs corresponding to the slot names +defined by the tagged class. This is easily ensured if the +:dispatch form always evaluates to the name of a class that +subclasses the tagged class.

For instance, supposing you have a function, find-frame-class, +that will map a string identifier to a binary class representing a +particular kind of ID3 frame, you might define a tagged binary class, +id3-frame, like this:

(define-tagged-binary-class id3-frame ()
+  ((id   (iso-8859-1-string :length 3))
+   (size u3))
+  (:dispatch (find-frame-class id)))

The expansion of a define-tagged-binary-class will contain a +DEFCLASS and a write-object method just like the expansion +of define-binary-class, but instead of a read-object +method it'll contain a read-value method that looks like this:

(defmethod read-value ((type (eql 'id3-frame)) stream &key)
+  (let ((id (read-value 'iso-8859-1-string stream :length 3))
+        (size (read-value 'u3 stream)))
+    (let ((object (make-instance (find-frame-class id) :id id :size size)))
+      (read-object object stream)
+      object)))

Since the expansions of define-tagged-binary-class and +define-binary-class are going to be identical except for the +read method, you can factor out the common bits into a helper macro, +define-generic-binary-class, that accepts the read method as a +parameter and interpolates it.

(defmacro define-generic-binary-class (name (&rest superclasses) slots read-method)
+  (with-gensyms (objectvar streamvar)
+    `(progn
+       (eval-when (:compile-toplevel :load-toplevel :execute)
+         (setf (get ',name 'slots) ',(mapcar #'first slots))
+         (setf (get ',name 'superclasses) ',superclasses))
+
+       (defclass ,name ,superclasses
+         ,(mapcar #'slot->defclass-slot slots))
+
+       ,read-method
+
+       (defmethod write-object progn ((,objectvar ,name) ,streamvar)
+         (declare (ignorable ,streamvar))
+         (with-slots ,(new-class-all-slots slots superclasses) ,objectvar
+           ,@(mapcar #'(lambda (x) (slot->write-value x streamvar)) slots))))))

Now you can define both define-binary-class and +define-tagged-binary-class to expand into a call to +define-generic-binary-class. Here's a new version of +define-binary-class that generates the same code as the earlier +version when it's fully expanded:

(defmacro define-binary-class (name (&rest superclasses) slots)
+  (with-gensyms (objectvar streamvar)
+    `(define-generic-binary-class ,name ,superclasses ,slots
+       (defmethod read-object progn ((,objectvar ,name) ,streamvar)
+         (declare (ignorable ,streamvar))
+         (with-slots ,(new-class-all-slots slots superclasses) ,objectvar
+           ,@(mapcar #'(lambda (x) (slot->read-value x streamvar)) slots))))))

And here's define-tagged-binary-class along with two new +helper functions it uses:

(defmacro define-tagged-binary-class (name (&rest superclasses) slots &rest options)
+  (with-gensyms (typevar objectvar streamvar)
+    `(define-generic-binary-class ,name ,superclasses ,slots
+      (defmethod read-value ((,typevar (eql ',name)) ,streamvar &key)
+        (let* ,(mapcar #'(lambda (x) (slot->binding x streamvar)) slots)
+          (let ((,objectvar
+                 (make-instance 
+                  ,@(or (cdr (assoc :dispatch options))
+                        (error "Must supply :dispatch form."))
+                  ,@(mapcan #'slot->keyword-arg slots))))
+            (read-object ,objectvar ,streamvar)
+            ,objectvar))))))
+
+(defun slot->binding (spec stream)
+  (destructuring-bind (name (type &rest args)) (normalize-slot-spec spec)
+    `(,name (read-value ',type ,stream ,@args))))
+
+(defun slot->keyword-arg (spec)
+  (let ((name (first spec)))
+    `(,(as-keyword name) ,name)))

Primitive Binary Types

While define-binary-class and +define-tagged-binary-class make it easy to define composite +structures, you still have to write read-value and +write-value methods for primitive data types by hand. You +could decide to live with that, specifying that users of the library +need to write appropriate methods on read-value and +write-value to support the primitive types used by their +binary classes.

However, rather than having to document how to write a suitable +read-value/write-value pair, you can provide a macro to +do it automatically. This also has the advantage of making the +abstraction created by define-binary-class less leaky. +Currently, define-binary-class depends on having methods on +read-value and write-value defined in a particular way, +but that's really just an implementation detail. By defining a macro +that generates the read-value and write-value methods +for primitive types, you hide those details behind an abstraction you +control. If you decide later to change the implementation of +define-binary-class, you can change your +primitive-type-defining macro to meet the new requirements without +requiring any changes to code that uses the binary data library.

So you should define one last macro, define-binary-type, that +will generate read-value and write-value methods for +reading values represented by instances of existing classes, rather +than by classes defined with define-binary-class.

For a concrete example, consider a type used in the id3-tag +class, a fixed-length string encoded in ISO-8859-1 characters. I'll +assume, as I did earlier, that the native character encoding of your +Lisp is ISO-8859-1 or a superset, so you can use CODE-CHAR and +CHAR-CODE to translate bytes to characters and back.

As always, your goal is to write a macro that allows you to express +only the essential information needed to generate the required code. +In this case, there are four pieces of essential information: the +name of the type, iso-8859-1-string; the &key parameters +that should be accepted by the read-value and +write-value methods, length in this case; the code for +reading from a stream; and the code for writing to a stream. Here's +an expression that contains those four pieces of information:

(define-binary-type iso-8859-1-string (length)
+  (:reader (in)
+    (let ((string (make-string length)))
+      (dotimes (i length)
+        (setf (char string i) (code-char (read-byte in))))
+      string))
+  (:writer (out string)
+    (dotimes (i length)
+      (write-byte (char-code (char string i)) out))))

Now you just need a macro that can take apart this form and put it +back together in the form of two DEFMETHODs wrapped in a +PROGN. If you define the parameter list to +define-binary-type like this:

 (defmacro define-binary-type (name (&rest args) &body spec) ...

then within the macro the parameter spec will be a list +containing the reader and writer definitions. You can then use +ASSOC to extract the elements of spec using the tags +:reader and :writer and then use +DESTRUCTURING-BIND to take apart the REST of each +element.10

From there it's just a matter of interpolating the extracted values +into the backquoted templates of the read-value and +write-value methods.

(defmacro define-binary-type (name (&rest args) &body spec)
+  (with-gensyms (type)
+    `(progn
+      ,(destructuring-bind ((in) &body body) (rest (assoc :reader spec))
+        `(defmethod read-value ((,type (eql ',name)) ,in &key ,@args)
+          ,@body))
+      ,(destructuring-bind ((out value) &body body) (rest (assoc :writer spec))
+        `(defmethod write-value ((,type (eql ',name)) ,out ,value &key ,@args)
+          ,@body)))))

Note how the backquoted templates are nested: the outermost template +starts with the backquoted PROGN form. That template consists of +the symbol PROGN and two comma-unquoted DESTRUCTURING-BIND +expressions. Thus, the outer template is filled in by evaluating the +DESTRUCTURING-BIND expressions and interpolating their values. +Each DESTRUCTURING-BIND expression in turn contains another +backquoted template, which is used to generate one of the method +definitions to be interpolated in the outer template.

With this macro defined, the define-binary-type form given +previously expands to this code:

(progn
+  (defmethod read-value ((#:g1618 (eql 'iso-8859-1-string)) in &key length)
+    (let ((string (make-string length)))
+      (dotimes (i length)
+        (setf (char string i) (code-char (read-byte in))))
+      string))
+  (defmethod write-value ((#:g1618 (eql 'iso-8859-1-string)) out string &key length)
+    (dotimes (i length)
+      (write-byte (char-code (char string i)) out))))

Of course, now that you've got this nice macro for defining binary +types, it's tempting to make it do a bit more work. For now you +should just make one small enhancement that will turn out to be +pretty handy when you start using this library to deal with actual +formats such as ID3 tags.

ID3 tags, like many other binary formats, use lots of primitive types +that are minor variations on a theme, such as unsigned integers in +one-, two-, three-, and four-byte varieties. You could certainly +define each of those types with define-binary-type as it +stands. Or you could factor out the common algorithm for reading and +writing n-byte unsigned integers into helper functions.

But suppose you had already defined a binary type, +unsigned-integer, that accepts a :bytes parameter to +specify how many bytes to read and write. Using that type, you could +specify a slot representing a one-byte unsigned integer with a type +specifier of (unsigned-integer :bytes 1). But if a particular +binary format specifies lots of slots of that type, it'd be nice to +be able to easily define a new type--say, u1--that means the +same thing. As it turns out, it's easy to change +define-binary-type to support two forms, a long form +consisting of a :reader and :writer pair and a short +form that defines a new binary type in terms of an existing type. +Using a short form define-binary-type, you can define +u1 like this:

(define-binary-type u1 () (unsigned-integer :bytes 1))

which will expand to this:

(progn
+  (defmethod read-value ((#:g161887 (eql 'u1)) #:g161888 &key)
+    (read-value 'unsigned-integer #:g161888 :bytes 1))
+  (defmethod write-value ((#:g161887 (eql 'u1)) #:g161888 #:g161889 &key)
+    (write-value 'unsigned-integer #:g161888 #:g161889 :bytes 1)))

To support both long- and short-form define-binary-type calls, +you need to differentiate based on the value of the spec +argument. If spec is two items long, it represents a long-form +call, and the two items should be the :reader and +:writer specifications, which you extract as before. On the +other hand, if it's only one item long, the one item should be a type +specifier, which needs to be parsed differently. You can use +ECASE to switch on the LENGTH of spec and then parse +spec and generate an appropriate expansion for either the long +form or the short form.

(defmacro define-binary-type (name (&rest args) &body spec)
+  (ecase (length spec)
+    (1
+     (with-gensyms (type stream value)
+       (destructuring-bind (derived-from &rest derived-args) (mklist (first spec))
+         `(progn
+            (defmethod read-value ((,type (eql ',name)) ,stream &key ,@args)
+              (read-value ',derived-from ,stream ,@derived-args))
+            (defmethod write-value ((,type (eql ',name)) ,stream ,value &key ,@args)
+              (write-value ',derived-from ,stream ,value ,@derived-args))))))
+    (2
+     (with-gensyms (type)
+       `(progn
+          ,(destructuring-bind ((in) &body body) (rest (assoc :reader spec))
+             `(defmethod read-value ((,type (eql ',name)) ,in &key ,@args)
+                ,@body))
+          ,(destructuring-bind ((out value) &body body) (rest (assoc :writer spec))
+             `(defmethod write-value ((,type (eql ',name)) ,out ,value &key ,@args)
+                ,@body)))))))

The Current Object Stack

One last bit of functionality you'll need in the next chapter is a +way to get at the binary object being read or written while reading +and writing. More generally, when reading or writing nested composite +objects, it's useful to be able to get at any of the objects +currently being read or written. Thanks to dynamic variables and +:around methods, you can add this enhancement with about a +dozen lines of code. To start, you should define a dynamic variable +that will hold a stack of objects currently being read or written.

(defvar *in-progress-objects* nil)

Then you can define :around methods on read-object and +write-object that push the object being read or written onto +this variable before invoking CALL-NEXT-METHOD.

(defmethod read-object :around (object stream)
+  (declare (ignore stream))
+  (let ((*in-progress-objects* (cons object *in-progress-objects*)))
+    (call-next-method)))
+
+(defmethod write-object :around (object stream)
+  (declare (ignore stream))
+  (let ((*in-progress-objects* (cons object *in-progress-objects*)))
+    (call-next-method)))

Note how you rebind *in-progress-objects* to a list with a new +item on the front rather than assigning it a new value. This way, at +the end of the LET, after CALL-NEXT-METHOD returns, the old +value of *in-progress-objects* will be restored, effectively +popping the object of the stack.

With those two methods defined, you can provide two convenience +functions for getting at specific objects in the in-progress stack. +The function current-binary-object will return the head of the +stack, the object whose read-object or write-object +method was invoked most recently. The other, parent-of-type, +takes an argument that should be the name of a binary object class +and returns the most recently pushed object of that type, using the +TYPEP function that tests whether a given object is an instance +of a particular type.

(defun current-binary-object () (first *in-progress-objects*))
+
+(defun parent-of-type (type)
+  (find-if #'(lambda (x) (typep x type)) *in-progress-objects*))

These two functions can be used in any code that will be called +within the dynamic extent of a read-object or +write-object call. You'll see one example of how +current-binary-object can be used in the next +chapter.11

Now you have all the tools you need to tackle an ID3 parsing library, +so you're ready to move onto the next chapter where you'll do just +that. +


1In +ASCII, the first 32 characters are nonprinting control characters +originally used to control the behavior of a Teletype machine, +causing it to do such things as sound the bell, back up one +character, move to a new line, and move the carriage to the beginning +of the line. Of these 32 control characters, only three, the newline, +carriage return, and horizontal tab, are typically found in text +files.

2Some +binary file formats are in-memory data structures--on many +operating systems it's possible to map a file into memory, and +low-level languages such as C can then treat the region of memory +containing the contents of the file just like any other memory; data +written to that area of memory is saved to the underlying file when +it's unmapped. However, these formats are platform-dependent since +the in-memory representation of even such simple data types as +integers depends on the hardware on which the program is running. +Thus, any file format that's intended to be portable must define a +canonical representation for all the data types it uses that can be +mapped to the actual in-memory data representation on a particular +kind of machine or in a particular language.

3The term big-endian and its opposite, +little-endian, borrowed from Jonathan Swift's Gulliver's +Travels, refer to the way a multibyte number is represented in an +ordered sequence of bytes such as in memory or in a file. For +instance, the number 43981, or abcd in hex, represented as a +16-bit quantity, consists of two bytes, ab and cd. It +doesn't matter to a computer in what order these two bytes are stored +as long as everybody agrees. Of course, whenever there's an arbitrary +choice to be made between two equally good options, the one thing you +can be sure of is that everybody is not going to agree. For more than +you ever wanted to know about it, and to see where the terms +big-endian and little-endian were first applied in this +fashion, read "On Holy Wars and a Plea for Peace" by Danny Cohen, +available at +http://khavrinen.lcs.mit.edu/wollman/ien-137.txt.

4LDB and DPB, a +related function, were named after the DEC PDP-10 assembly functions +that did essentially the same thing. Both functions operate on +integers as if they were represented using twos-complement format, +regardless of the internal representation used by a particular Common +Lisp implementation.

5Common Lisp +also provides functions for shifting and masking the bits of integers +in a way that may be more familiar to C and Java programmers. For +instance, you could write read-u2 yet a third way, using those +functions, like this:

(defun read-u2 (in)
+  (logior (ash (read-byte in) 8) (read-byte in)))

which would be roughly equivalent to this Java method:

public int readU2 (InputStream in) throws IOException {
+  return (in.read() << 8) | (in.read());
+}

The names LOGIOR and ASH are short for LOGical Inclusive +OR and Arithmetic SHift. ASH shifts an integer a given +number of bits to the left when its second argument is positive or to +the right if the second argument is negative. LOGIOR combines +integers by logically oring each bit. Another function, +LOGAND, performs a bitwise and, which can be used to mask off +certain bits. However, for the kinds of bit twiddling you'll need to +do in this chapter and the next, LDB and BYTE will be both +more convenient and more idiomatic Common Lisp style.

6Originally, UTF-8 was designed to +represent a 31-bit character code and used up to six bytes per code +point. However, the maximum Unicode code point is #x10ffff, so +a UTF-8 encoding of Unicode requires at most four bytes per code +point.

7If you need to parse a file format that +uses other character codes, or if you need to parse files containing +arbitrary Unicode strings using a non-Unicode-Common-Lisp +implementation, you can always represent such strings in memory as +vectors of integer code points. They won't be Lisp strings, so you +won't be able to manipulate or compare them with the string +functions, but you'll still be able to do anything with them that you +can with arbitrary vectors.

8Unfortunately, the language itself doesn't always +provide a good model in this respect: the macro DEFSTRUCT, which +I don't discuss since it has largely been superseded by DEFCLASS, +generates functions with names that it generates based on the name of +the structure it's given. DEFSTRUCT's bad example leads many new +macro writers astray.

9Technically there's no possibility of +type or object conflicting with slot names--at worst +they'd be shadowed within the WITH-SLOTS form. But it doesn't +hurt anything to simply GENSYM all local variable names used +within a macro template.

10Using ASSOC to extract the :reader and +:writer elements of spec allows users of +define-binary-type to include the elements in either order; if +you required the :reader element to be always be first, you +could then have used (rest (first spec)) to extract the reader +and (rest (second spec)) to extract the writer. However, as +long as you require the :reader and :writer keywords to +improve the readability of define-binary-type forms, you might +as well use them to extract the correct data.

11The ID3 format doesn't require the +parent-of-type function since it's a relatively flat +structure. This function comes into its own when you need to parse a +format made up of many deeply nested structures whose parsing depends +on information stored in higher-level structures. For example, in the +Java class file format, the top-level class file structure contains a +constant pool that maps numeric values used in other +substructures within the class file to constant values that are +needed while parsing those substructures. If you were writing a class +file parser, you could use parent-of-type in the code that +reads and writes those substructures to get at the top-level class +file object and from there to the constant pool.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practical-web-programming-with-allegroserve.html b/clones/gigamonkeys.com/book/practical-web-programming-with-allegroserve.html new file mode 100644 index 00000000..7b8e59c7 --- /dev/null +++ b/clones/gigamonkeys.com/book/practical-web-programming-with-allegroserve.html @@ -0,0 +1,700 @@ +Practical: Web Programming with AllegroServe

26. Practical: Web Programming with AllegroServe

In this chapter you'll look at one way to develop Web-based programs +in Common Lisp, using the open-source AllegroServe Web server. This +isn't meant as a full introduction to AllegroServe. And I'm certainly +not going to cover anything more than a tiny corner of the larger +topic of Web programming. My goal here is to cover enough of the +basics of using AllegroServe that you'll be able, in Chapter 29, to +develop an application for browsing a library of MP3 files and +streaming them to an MP3 client. Similarly, this chapter will serve as +a brief introduction to Web programming for folks new to the topic.

A 30-Second Intro to Server-Side Web Programming

While Web programming today typically involves quite a number of +software frameworks and different protocols, the core bits of Web +programming haven't changed much since they were invented in the +early 1990s. For simple applications, such as the one you'll write in +Chapter 29, you need to understand only a few key concepts, so I'll +review them quickly here. Experienced Web programmers can skim or +skip the rest of this section.1

To start, you need to understand the roles the Web browser and the +Web server play in Web programming. While a modern browser comes with +a lot of bells and whistles, the core functionality of a Web browser +is to request Web pages from a Web server and then render them. +Typically those pages will be written in the Hypertext Markup +Language (HTML), which tells the browser how to render the page, +including where to insert inline images and links to other Web pages. +HTML consists of text marked up with tags that give the text +a structure that the browser uses when rendering the page. For +instance, a simple HTML document looks like this:

<html>
+  <head>
+  <title>Hello</title>
+  </head>
+  <body>
+  <p>Hello, world!</p>
+  <p>This is a picture: <img src="some-image.gif"></p>
+  <p>This is a <a href="another-page.html">link</a> to another page.</p>
+  </body>
+</html>

Figure 26-1 shows how the browser renders this page.

Figure 26-1. Sample Web page

The browser and server communicate using a protocol called the +Hypertext Transfer Protocol (HTTP). While you don't need to worry +about the details of the protocol, it's worth understanding that it +consists entirely of a sequence of requests initiated by the browser +and responses generated by the server. That is, the browser connects +to the Web server and sends a request that includes, at the least, +the desired URL and the version of HTTP that the browser speaks. The +browser can also include data in its request; that's how the browser +submits HTML forms to the server.

To reply to a request, the server sends a response made up of a set +of headers and a body. The headers contain information about the +body, such as what type of data it is (for instance, HTML, plain +text, or an image), and the body is the data itself, which is then +rendered by the browser. The server can also send an error response +telling the browser that its request couldn't be answered for some +reason.

And that's pretty much it. Once the browser has received the complete +response from the server, there's no communication between the +browser and the server until the next time the browser decides to +request a page from the server.2 This is the main constraint of Web +programming--there's no way for code running on the server to affect +what the user sees in their browser unless the browser issues a new +request to the server.3

Some Web pages, called static pages, are simply HTML files stored +on the Web server and served up when requested by the browser. +Dynamic pages, on the other hand, consist of HTML generated each +time the page is requested by a browser. For instance, a dynamic page +might be generated by querying a database and then constructing HTML +to represent the results of the query.4

When generating its response to a request, server-side code has four +main pieces of information to act on. The first piece of information +is the requested URL. Typically, however, the URL is used by the Web +server itself to determine what code is responsible for +generating the response. Next, if the URL contains a question mark, +everything after the question mark is considered to be a query +string, which is typically ignored by the Web server except that it +makes it available to the code generating the response. Most of the +time the query string contains a set of key/value pairs. The request +from the browser can also contain post data, which also usually +consists of key/value pairs. Post data is typically used to submit +HTML forms. The key/value pairs supplied in either the query string +or the post data are collectively called the query parameters.

Finally, in order to string together a sequence of individual +requests from the same browser, code running in the server can set +a cookie, sending a special header in its response to the browser +that contains a bit of opaque data called a cookie. After a +cookie is set by a particular server, the browser will send the +cookie with each request it sends to that server. The browser doesn't +care about the data in the cookie--it just echoes it back to the +server for the server-side code to interpret however it wants.

These are the primitive elements on top of which 99 percent of +server-side Web programming is built. The browser sends a request, +the server finds some code to handle the request and runs it, and the +code uses query parameters and cookies to determine what to do.

AllegroServe

You can serve Web content using Common Lisp in a number of ways; +there are at least three open-source Web servers written in Common +Lisp as well as plug-ins such as +mod_lisp5 +and Lisplets6 that allow +the Apache Web server or any Java Servlet container to delegate +requests to a Lisp server running in a separate process.

For this chapter, you'll use a version of the open-source Web server +AllegroServe, originally written by John Foderaro at Franz Inc.. +AllegroServe is included in the version of Allegro available from +Franz for use with this book. If you're not using Allegro, you can +use PortableAllegroServe, a friendly fork of the AllegroServe code +base, which includes an Allegro compatibility layer that allows +PortableAllegroServe to run on most Common Lisps. The code you'll +write in this chapter and in Chapter 29 should run in both vanilla +AllegroServe and PortableAllegroServe.

AllegroServe provides a programming model similar in spirit to Java +Servlets--each time a browser requests a page, AllegroServe parses +the request and looks up an object, called an entity, which +handles the request. Some entity classes provided as part of +AllegroServe know how to serve static content--either individual +files or the contents of a directory tree. Others, the ones I'll +spend most of this chapter discussing, run arbitrary Lisp code to +generate the response.7

But before I get to that, you need to know how to start AllegroServe +and set it up to serve a few files. The first step is to load the +AllegroServe code into your Lisp image. In Allegro, you can simply +type (require :aserve). In other Lisps (or in Allegro), you +can load PortableAllegroServe by loading the file INSTALL.lisp +at the top of the portableaserve directory tree. Loading +AllegroServe will create three new packages, NET.ASERVE, +NET.HTML.GENERATOR, and NET.ASERVE.CLIENT.8

After loading the server, you start it with the function start +in the NET.ASERVE package. To have easy access to the symbols +exported from NET.ASERVE, from COM.GIGAMONKEYS.HTML (a +package I'll discuss in a moment), and from the rest of Common Lisp, +you should create a new package to play in like this:

CL-USER> (defpackage :com.gigamonkeys.web
+            (:use :cl :net.aserve :com.gigamonkeys.html))
+#<The COM.GIGAMONKEYS.WEB package>

Now switch to that package with this IN-PACKAGE expression:

CL-USER> (in-package :com.gigamonkeys.web)
+#<The COM.GIGAMONKEYS.WEB package>
+WEB> 

Now you can use the exported names from NET.ASERVE without +qualification. The function start starts the server. It takes +quite a number of keyword parameters, but the only one you need to +pass is :port, which specifies the port to listen on. You +should probably use a high port such as 2001 instead of the default +port for HTTP servers, 80, because on Unix-derived operating systems +only the root user can listen on ports below 1024. To run +AllegroServe listening on port 80 on Unix, you'd need to start Lisp +as root and then use the :setuid and :setgid parameters +to tell start to switch its identity after opening the port. +You can start a server listening on port 2001 like this:

WEB> (start :port 2001)
+#<WSERVER port 2001 @ #x72511c72>

The server is now running in your Lisp. It's possible you'll get an +error that says something about "port already in use" when you try to +start the server. This means port 2001 is already in use by some +other server on your machine. In that case, the simplest fix is to +use a different port, supplying a different argument to start +and then using that value instead of 2001 in the URLs used throughout +this chapter.

You can continue to interact with Lisp via the REPL because +AllegroServe starts its own threads to handle requests from browsers. +This means, among other things, that you can use the REPL to get a +view into the guts of your server while it's running, which makes +debugging and testing a lot easier than if the server is a complete +black box.

Assuming you're running Lisp on the same machine as your browser, you +can check that the server is up and running by pointing your browser +at http://localhost:2001/. At this point you should get a +page-not-found error message in the browser since you haven't +published anything yet. But the error message will be from +AllegroServe; it'll say so at the bottom of the page. On the other +hand, if the browser displays an error dialog that says something +like "The connection was refused when attempting to contact +localhost:2001," it means either that the server isn't running or +that you started it with a different port than 2001.

Now you can publish some files. Suppose you have a file +hello.html in the directory /tmp/html with the following +contents:

<html>
+  <head>
+  <title>Hello</title>
+  </head>
+  <body>
+  <p>Hello, world!</p>
+  </body>
+</html>

You can publish it individually with the publish-file +function.

WEB> (publish-file :path "/hello.html" :file "/tmp/html/hello.html")
+#<NET.ASERVE::FILE-ENTITY @ #x725eddea>

The :path argument is the path that will appear in the URL +requested by the browser, while the :file argument is the name +of the file in the file system. After evaluating the +publish-file expression, you can point your browser to +http://localhost:2001/hello.html, and it should display a page +something like Figure 26-2.

Figure 26-2. http://localhost:2001/hello.html

You could also publish a whole directory tree of files using the +publish-directory function. First let's clear out the already +published entity with the following call to publish-file:

WEB> (publish-file :path "/hello.html" :remove t)
+NIL

Now you can publish the whole /tmp/html/ directory (and all +its subdirectories) with the publish-directory function.

WEB> (publish-directory :prefix "/" :destination "/tmp/html/")
+#<NET.ASERVE::DIRECTORY-ENTITY @ #x72625aa2>

In this case, the :prefix argument specifies the beginning of +the path part of URLs that should be handled by this entity. Thus, if +the server receives a request for +http://localhost:2001/foo/bar.html, the path is +/foo/bar.html, which starts with /. This path is then +translated to a filename by replacing the prefix, /, with the +destination, /tmp/html/. Thus, the URL +http://localhost:2001/hello.html will still be translated into +a request for the file /tmp/html/hello.html.

Generating Dynamic Content with AllegroServe

Publishing entities that generate dynamic content is nearly as simple +as publishing static content. The functions publish and +publish-prefix are the dynamic analogs of publish-file +and publish-directory. The basic idea of these two functions is +that you publish a function that will be called to generate the +response to a request for either a specific URL or any URL with a +given prefix. The function will be called with two arguments: an +object representing the request and the published entity. Most of +time you don't need to do anything with the entity object except to +pass it along to a couple macros I'll discuss in a moment. On the +other hand, you'll use the request object to obtain information +submitted by the browser--query parameters included in the URL or +data posted using an HTML form.

For a trivial example of using a function to generate dynamic +content, let's write a function that generates a page with a +different random number each time it's requested.

(defun random-number (request entity)
+  (with-http-response (request entity :content-type "text/html")
+    (with-http-body (request entity)
+      (format 
+       (request-reply-stream request)
+       "<html>~@
+        <head><title>Random</title></head>~@
+        <body>~@
+        <p>Random number: ~d</p>~@
+        </body>~@
+        </html>~@
+       "
+       (random 1000)))))

The macros with-http-response and with-http-body are +part of AllegroServe. The former starts the process of generating an +HTTP response and can be used, as here, to specify things such as the +type of content that will be returned. It also handles various parts +of HTTP such as dealing with If-Modified-Since requests. The +with-http-body actually sends the HTTP response headers and +then executes its body, which should contain code that generates the +content of the reply. Within with-http-response but before the +with-http-body, you can add or change HTTP headers to be sent +in the reply. The function request-reply-stream is also part +of AllegroServe and returns the stream to which you should write +output intended to be sent to the browser.

As this function shows, you can just use FORMAT to print HTML to +the stream returned by request-reply-stream. In the next +section, I'll show you more convenient ways to programmatically +generate HTML.9

Now you're ready to publish this function.

WEB> (publish :path "/random-number" :function 'random-number)
+#<COMPUTED-ENTITY @ #x7262bab2>

As it does in the publish-file function, the :path +argument specifies the path part of the URL that will result in this +function being invoked. The :function argument specifies +either the name or an actual function object. Using the name of a +function, as shown here, allows you to redefine the function later +without republishing and have AllegroServe use the new function +definition. After evaluating the call to publish, you can +point your browser at http:// localhost:2001/random-number to +get a page with a random number on it, as shown in Figure 26-3.

Figure 26-3. http://localhost:2001/random-number

Generating HTML

Although using FORMAT to emit HTML works fine for the simple +pages I've discussed so far, as you start building more elaborate +pages it'd be nice to have a more concise way to generate HTML. +Several libraries are available for generating HTML from an +s-expression representation including one, htmlgen, that's included +with AllegroServe. In this chapter you'll use a library called +FOO,10 which is loosely modeled on Franz's htmlgen and whose +implementation you'll look at in more detail in Chapters 30 and 31. +For now, however, you just need to know how to use FOO.

Generating HTML from within Lisp is quite natural since s-expressions +and HTML are essentially isomorphic. You can represent HTML elements +with s-expressions by treating each element in HTML as a list +"tagged" with an appropriate first element, such as a keyword symbol +of the same name as the HTML tag. Thus, the HTML <p>foo</p> is +represented by the s-expression (:p "foo"). Because HTML +elements nest the same way lists in s-expressions do, this scheme +extends to more complex HTML. For instance, this HTML:

<html>
+  <head>
+  <title>Hello</title>
+  </head>
+  <body>
+  <p>Hello, world!</p>
+  </body>
+</html>

could be represented with the following s-expression:

(:html
+  (:head (:title "Hello"))
+  (:body (:p "Hello, world!")))

HTML elements with attributes complicate things a bit but not in an +insurmountable way. FOO supports two ways of including attributes in +a tag. One is to simply follow the first item of the list with +keyword/value pairs. The first element that follows a keyword/value +pair that's not itself a keyword symbol marks the beginning of the +element's contents. Thus, you'd represent this HTML:

<a href="foo.html">This is a link</a>

with the following s-expression:

(:a :href "foo.html" "This is a link")

The other syntax FOO supports is to group the tag name and attributes +into their own list like this:

((:a :href "foo.html") "This is link.")

FOO can use the s-expression representation of HTML in two ways. The +function emit-html takes an HTML s-expression and outputs the +corresponding HTML.

WEB> (emit-html '(:html (:head (:title "Hello")) (:body (:p "Hello, world!"))))
+<html>
+  <head>
+    <title>Hello</title>
+  </head>
+  <body>
+    <p>Hello, world!</p>
+  </body>
+</html>
+T

However, emit-html isn't always the most efficient way to +generate HTML because its argument must be a complete s-expression +representation of the HTML to be generated. While it's easy to build +such a representation, it's not always particularly efficient. For +instance, suppose you wanted to make an HTML page containing a list +of 10,000 random numbers. You could build the s-expression using a +backquote template and then pass it to emit-html like this:

(emit-html
+  `(:html
+     (:head
+       (:title "Random numbers"))
+     (:body 
+       (:h1 "Random numbers")
+       (:p ,@(loop repeat 10000 collect (random 1000) collect " ")))))

However, this has to build a tree containing a 10,000-element list +before it can even start emitting HTML, and the whole s-expression +will become garbage as soon as the HTML is emitted. To avoid this +inefficiency, FOO also provides a macro html, which allows you +to embed bits of Lisp code in the middle of an HTML s-expression.

Literal values such as strings and numbers in the input to +html are interpolated into the output HTML. Likewise, symbols +are treated as variable references, and code is generated to emit +their value at runtime. Thus, both of these:

(html (:p "foo"))
+
+(let ((x "foo")) (html (:p x)))

will emit the following:

<p>foo</p>

List forms that don't start with a keyword symbol are assumed to be +code and are embedded in the generated code. Any values the embedded +code returns will be ignored, but the code can emit more HTML by +calling html itself. For instance, to emit the contents of a +list in HTML, you might write this:

(html (:ul (dolist (item (list 1 2 3)) (html (:li item)))))

which will emit the following HTML:

<ul>
+  <li>1</li>
+  <li>2</li>
+  <li>3</li>
+</ul>

If you want to emit the value of a list form, you must wrap it in the +pseudotag :print. Thus, this expression:

(html (:p (+ 1 2)))

generates this HTML after computing and discarding the value +3:

<p></p>

To emit the 3, you must write this:

(html (:p (:print (+ 1 2))))

Or you could compute the value and store it in a variable outside the +call to html like this:

(let ((x (+ 1 2))) (html (:p x)))

Thus, you can use the html macro to generate the list of +random numbers like this:

(html
+  (:html
+    (:head
+      (:title "Random numbers"))
+    (:body 
+      (:h1 "Random numbers")
+      (:p (loop repeat 10 do (html (:print (random 1000)) " "))))))

The macro version will be quite a bit more efficient than the +emit-html version. Not only do you never have to generate an +s-expression representing the whole page, also much of the work that +emit-html does at runtime to interpret the s-expression will be +done once, when the macro is expanded, rather than every time the code +is run.

You can control where the output generated by both html and +emit-html is sent with the macro with-html-output, +which is part of the FOO library. Thus, you can use the +with-html-output and html macros from FOO to rewrite +random-number like this:

(defun random-number (request entity)
+  (with-http-response (request entity :content-type "text/html")
+    (with-http-body (request entity)
+      (with-html-output ((request-reply-stream request))
+        (html
+          (:html
+            (:head (:title "Random"))
+            (:body
+              (:p "Random number: " (:print (random 1000))))))))))

HTML Macros

Another feature of FOO is that it allows you to define HTML "macros" +that can translate arbitrary forms into HTML s-expressions that the +html macro understands. For instance, suppose you frequently +find yourself writing pages of this form:

(:html
+  (:head (:title "Some title"))
+  (:body
+    (:h1 "Some title")
+    ... stuff ...))

You could define an HTML macro to capture that pattern like this:

(define-html-macro :standard-page ((&key title) &body body)
+  `(:html
+     (:head (:title ,title))
+     (:body
+      (:h1 ,title)
+      ,@body)))

Now you can use the "tag" :standard-page in your s-expression +HTML, and it'll be expanded before being interpreted or compiled. For +instance, the following:

(html (:standard-page (:title "Hello") (:p "Hello, world.")))

generates the following HTML:

<html>
+  <head>
+    <title>Hello</title>
+  </head>
+  <body>
+    <h1>Hello</h1>
+    <p>Hello, world.</p>
+  </body>
+</html>

Query Parameters

Of course, generating HTML output is only half of Web programming. +The other thing you need to do is get input from the user. As I +discussed in the "A 30-Second Intro to Server-Side Web Programming" +section, when a browser requests a page from a Web server, it can +send query parameters in the URL and post data, both of which act as +input to the server-side code.

AllegroServe, like most Web programming frameworks, takes care of +parsing both these sources of input for you. By the time your +published functions are called, all the key/value pairs from the +query string and/or post data have been decoded and placed into an +alist that you can retrieve from the request object with the function +request-query. The following function returns a page showing +all the query parameters it receives:

(defun show-query-params (request entity)
+  (with-http-response (request entity :content-type "text/html")
+    (with-http-body (request entity)
+      (with-html-output ((request-reply-stream request))
+        (html
+          (:standard-page
+           (:title "Query Parameters")
+           (if (request-query request)
+             (html 
+               (:table :border 1
+                       (loop for (k . v) in (request-query request)
+                          do (html (:tr (:td k) (:td v))))))
+             (html (:p "No query parameters.")))))))))
+
+(publish :path "/show-query-params" :function 'show-query-params)

If you give your browser a URL with a query string in it like the +following:

http://localhost:2001/show-query-params?foo=bar&baz=10

you should get back a page similar to the one shown in Figure 26-4.

Figure 26-4. http://localhost:2001/show-query-params?foo=bar&baz=10

To generate some post data, you need an HTML form. The following +function generates a simple form, which submits its data to +show-query-params:

(defun simple-form (request entity)
+  (with-http-response (request entity :content-type "text/html")
+    (with-http-body (request entity)
+      (let ((*html-output* (request-reply-stream request)))
+        (html
+          (:html
+            (:head (:title "Simple Form"))
+            (:body
+             (:form :method "POST" :action "/show-query-params"
+               (:table
+                (:tr (:td "Foo")
+                     (:td (:input :name "foo" :size 20)))
+                (:tr (:td "Password")
+                     (:td (:input :name "password" :type "password" :size 20))))
+               (:p (:input :name "submit" :type "submit" :value "Okay")
+                   (:input ::type "reset" :value "Reset"))))))))))
+
+(publish :path "/simple-form" :function 'simple-form)

Point your browser to http://localhost:2001/simple-form, and +you should see a page like the one in Figure 26-5.

If you fill in the form with the "abc" and "def" values, clicking the +Okay button should take you to a page like the one in Figure 26-6.

Figure 26-5. http://localhost:2001/simple-form

Figure 26-6. Result of submitting the simple form

However, most of the time you won't need to iterate over all the query +parameters; you'll want to pick out individual parameters. For +instance, you might want to modify random-number so the limit +value you pass to RANDOM can be supplied via a query parameter. +In that case, you use the function request-query-value, which +takes the request object and the name of the parameter whose value +you want and returns the value as a string or NIL if no such +parameter has been supplied. A parameterizable version of +random-number might look like this:

(defun random-number (request entity)
+  (with-http-response (request entity :content-type "text/html")
+    (with-http-body (request entity)
+      (let* ((*html-output* (request-reply-stream request))
+             (limit-string (or (request-query-value "limit" request) ""))
+             (limit (or (parse-integer limit-string :junk-allowed t) 1000)))
+        (html
+          (:html
+            (:head (:title "Random"))
+            (:body
+              (:p "Random number: " (:print (random limit))))))))))

Because request-query-value can return either NIL or an +empty string, you have to deal with both those cases when parsing the +parameter into a number to pass to RANDOM. You can deal with a +NIL value when you bind limit-string, binding it to +"" if there's no "limit" query parameter. Then you can use the +:junk-allowed argument to PARSE-INTEGER to ensure that it +returns either NIL (if it can't parse an integer from the string +given) or an integer. In the section "A Small Application Framework," +you'll develop some macros to make it easier to deal with grabbing +query parameters and converting them to various types.

Cookies

In AllegroServe you can send a Set-Cookie header that tells the +browser to save a cookie and send it along with subsequent requests +by calling the function set-cookie-header within the body of +with-http-response but before the call to +with-http-body. The first argument to the function is the +request object, and the remaining arguments are keyword arguments +used to set the various properties of the cookie. The only two you +must pass are the :name and :value arguments, both of +which should be strings. The other possible arguments that affect the +cookie sent to the browser are :expires, :path, +:domain, and :secure.

Of these, you need to worry only about :expires. It controls +how long the browser should save the cookie. If :expires is +NIL (the default), the browser will save the cookie only until +it exits. Other possible values are :never, which means the +cookie should be kept forever, or a universal time as returned by +GET-UNIVERSAL-TIME or ENCODE-UNIVERSAL-TIME. An +:expires of zero tells the client to immediately discard an +existing cookie.11

After you've set a cookie, you can use the function +get-cookie-values to get an alist containing one name/value +pair for each cookie sent by the browser. From that alist, you can +pick out individual cookie values using ASSOC and CDR.

The following function shows the names and values of all the cookies +sent by the browser:

(defun show-cookies (request entity)
+  (with-http-response (request entity :content-type "text/html")
+    (with-http-body (request entity)
+      (with-html-output ((request-reply-stream request))
+        (html
+          (:standard-page
+           (:title "Cookies")
+           (if (null (get-cookie-values request))
+             (html (:p "No cookies."))
+             (html 
+               (:table
+                 (loop for (key . value) in (get-cookie-values request)
+                    do (html (:tr (:td key) (:td value)))))))))))))
+
+(publish :path "/show-cookies" :function 'show-cookies)

The first time you load the page +http://localhost:2001/show-cookies it should say "No cookies" +as shown in Figure 26-7 since you haven't set any yet.

Figure 26-7. http://localhost:2001/show-cookies with no cookies

To set a cookie, you need another function, such as the following:

(defun set-cookie (request entity)
+  (with-http-response (request entity :content-type "text/html")
+    (set-cookie-header request :name "MyCookie" :value "A cookie value")
+    (with-http-body (request entity)
+      (with-html-output ((request-reply-stream request))
+        (html 
+          (:standard-page
+           (:title "Set Cookie")
+           (:p "Cookie set.")
+           (:p (:a :href "/show-cookies" "Look at cookie jar."))))))))
+
+(publish :path "/set-cookie" :function 'set-cookie)

If you enter the URL http://localhost:2001/set-cookie, your +browser should display a page like the one in Figure 26-8. +Additionally, the server will send a Set-Cookie header with a cookie +named "MyCookie" with "A cookie value" as its value. If you click the +link Look at cookie jar, you'll be taken to the +/show-cookies page where you'll see the new cookie, as shown +in Figure 26-9. Because you didn't specify an :expires +argument, the browser will continue to send the cookie with each +request until you quit the browser.

Figure 26-8. http://localhost:2001/set-cookie

Figure 26-9. http://localhost:2001/show-cookies after setting a cookie

A Small Application Framework

Although AllegroServe provides fairly straightforward access to all +the basic facilities you need to write server-side Web code (access +to query parameters from both the URL's query string and the post +data; the ability to set cookies and retrieve their values; and, of +course, the ability to generate the response sent back to the +browser), there's a fair bit of annoyingly repetitive code.

For instance, every HTML-generating function you write is going to +take the arguments request and entity and then will +contain calls to with-http-response, +with-http-response, and--if you're going to use FOO to +generate HTML--with-html-output. Then, in functions that need +to get at query parameters, there will be a bunch of calls to +request-query-value and then more code to convert the string +returned to whatever type you actually want. Finally, you need to +remember to publish the function.

To reduce the amount of boilerplate you have to write, you can write +a small framework on top of AllegroServe to make it easier to define +functions that handle requests for a particular URL.

The basic approach will be to define a macro, +define-url-function, that you'll use to define functions that +will automatically be published via publish. This macro will +expand into a DEFUN that contains the appropriate boilerplate as +well as code to publish the function under a URL of the same name. +It'll also take care of generating code to extract values from query +parameters and cookies and to bind them to variables declared in the +function's parameter list. Thus, the basic form of a +define-url-function definition is this:

(define-url-function name (request query-parameter*)
+  body)

where the body is the code to emit the HTML of the page. It'll be +wrapped in a call to FOO's html macro, so for simple pages it +might contain nothing but s-expression HTML.

Within the body, the query parameter variables will be bound to +values of query parameters with the same name or from a cookie. In +the simplest case, a query parameter's value will be the string taken +from the query parameter or post data field of the same name. If the +query parameter is specified with a list, you can also specify an +automatic type conversion, a default value, and whether to look for +and save the value of the parameter in a cookie. The complete syntax +for a query-parameter is as follows:

name | (name type [default-value] [stickiness])

The type must be a name recognized by define-url-function. +I'll discuss in a moment how to define new types. The +default-value must be a value of the given type. Finally, +stickiness, if supplied, indicates that the parameter's value +should be taken from an appropriately named cookie if no query +parameter is supplied and that a Set-Cookie header should be sent in +the response that saves the value in the cookie of the same name. +Thus, a sticky parameter, after being explicitly supplied a value via +a query parameter, will keep that value on subsequent requests of the +page even when no query parameter is supplied.

The name of the cookie used depends on the value of stickiness: +with a value of :global, the cookie will be named the same as +the parameter. Thus, different functions that use globally sticky +parameters with the same name will share the value. If stickiness +is :package, then the cookie name is constructed from the name +of the parameter and the package of the function's name; this allows +functions in the same package to share values but not have to worry +about stomping on parameters of functions in other packages. Finally, +a parameter with a stickiness value of :local will use a +cookie made from the name of the parameter, the package of the +function name, and the function name, making it unique to that +function.

For instance, you can use define-url-function to replace the +previous eleven-line definition of random-page with this +five-line version:

(define-url-function random-number (request (limit integer 1000))
+  (:html
+    (:head (:title "Random"))
+    (:body
+      (:p "Random number: " (:print (random limit))))))

If you wanted the limit argument to be sticky, you could change the +limit declaration to (limit integer 1000 :local).

The Implementation

I'll explain the implementation of define-url-function from the +top down. The macro itself looks like this:

(defmacro define-url-function (name (request &rest params) &body body)
+  (with-gensyms (entity)
+    (let ((params (mapcar #'normalize-param params)))
+      `(progn
+         (defun ,name (,request ,entity)
+           (with-http-response (,request ,entity :content-type "text/html")
+             (let* (,@(param-bindings name request params))
+               ,@(set-cookies-code name request params)
+               (with-http-body (,request ,entity)
+                 (with-html-output ((request-reply-stream ,request))
+                   (html ,@body))))))
+         (publish :path ,(format nil "/~(~a~)" name) :function ',name)))))

Let's take it bit by bit, starting with the first few lines.

(defmacro define-url-function (name (request &rest params) &body body)
+  (with-gensyms (entity)
+    (let ((params (mapcar #'normalize-param params)))

Up to here you're just getting ready to generate code. You +GENSYM a symbol to use later as the name of the entity parameter +in the DEFUN. Then you normalize the parameters, converting +plain symbols to list form using this function:

(defun normalize-param (param)
+  (etypecase param
+    (list param)
+    (symbol `(,param string nil nil))))

In other words, declaring a parameter with just a symbol is the same +as declaring a nonsticky, string parameter with no default value.

Then comes the PROGN. You must expand into a PROGN because +you need to generate code to do two things: define a function with +DEFUN and call publish. You should define the function +first so if there's an error in the definition, the function won't be +published. The first two lines of the DEFUN are just +boilerplate.

(defun ,name (,request ,entity)
+  (with-http-response (,request ,entity :content-type "text/html")  

Now you do the real work. The following two lines generate the +bindings for the parameters specified in define-url-function +other than request and the code that calls +set-cookie-header for the sticky parameters. Of course, the +real work is done by helper functions that you'll look at in a +moment.12

    (let* (,@(param-bindings name request params))
+      ,@(set-cookies-code name request params)

The rest is just more boilerplate, putting the body from the +define-url-function definition in the appropriate context of +with-http-body, with-html-output, and html +macros. Then comes the call to publish.

   (publish :path ,(format nil "/~(~a~)" name) :function ',name)

The expression (format nil "/~(~a~)" name) is evaluated at +macro expansion time, generating a string consisting of /, followed +by an all-lowercase version of the name of the function you're about +to define. That string becomes the :path argument to publish, +while the function name is interpolated as the :function +argument.

Now let's look at the helper functions used to generate the +DEFUN form. To generate parameter bindings, you need to loop +over the params and collect a snippet of code for each one, +generated by param-binding. That snippet will be a list +containing the name of the variable to bind and the code that will +compute the value of that variable. The exact form of code used to +compute the value will depend on the type of the parameter, whether +it's sticky, and the default value, if any. Because you already +normalized the params, you can use DESTRUCTURING-BIND to take +them apart in param-binding.

(defun param-bindings (function-name request params)
+  (loop for param in params
+     collect (param-binding function-name request param)))
+
+(defun param-binding (function-name request param)
+  (destructuring-bind (name type &optional default sticky) param
+    (let ((query-name (symbol->query-name name))
+          (cookie-name (symbol->cookie-name function-name name sticky)))
+      `(,name (or 
+               (string->type ',type (request-query-value ,query-name ,request))
+               ,@(if cookie-name
+                     (list `(string->type ',type (get-cookie-value ,request ,cookie-name))))
+               ,default)))))

The function string->type, which you use to convert strings +obtained from the query parameters and cookies to the desired type, is +a generic function with the following signature:

(defgeneric string->type (type value))

To make a particular name usable as a type name for a query +parameter, you just need to define a method on string->type. +You'll need to define at least a method specialized on the symbol +string since that's the default type. Of course, that's pretty +easy. Since browsers sometimes submit forms with empty strings to +indicate no value was supplied for a particular value, you'll want to +convert an empty string to NIL as this method does:

(defmethod string->type ((type (eql 'string)) value)
+  (and (plusp (length value)) value))

You can add conversions for other types needed by your application. +For instance, to make integer usable as a query parameter type +so you can handle the limit parameter of random-page, +you might define this method:

(defmethod string->type ((type (eql 'integer)) value)
+  (parse-integer (or value "") :junk-allowed t))

Another helper function used in the code generated by +param-binding is get-cookie-value, which is just a bit +of sugar around the get-cookie-values function provided by +AllegroServe. It looks like this:

(defun get-cookie-value (request name)
+  (cdr (assoc name (get-cookie-values request) :test #'string=)))

The functions that compute the query parameter and cookies names are +similarly straightforward.

(defun symbol->query-name (sym)
+  (string-downcase sym))
+
+(defun symbol->cookie-name (function-name sym sticky)
+  (let ((package-name (package-name (symbol-package function-name))))
+    (when sticky
+      (ecase sticky
+        (:global
+         (string-downcase sym))
+        (:package
+         (format nil "~(~a:~a~)" package-name sym))
+        (:local 
+         (format nil "~(~a:~a:~a~)" package-name function-name sym))))))

To generate the code that sets cookies for sticky parameters, you +again loop over the list of parameters, this time collecting a +snippet of code for each sticky param. You can use the when +and collect it LOOP forms to collect only the +non-NIL values returned by set-cookie-code.

(defun set-cookies-code (function-name request params)
+  (loop for param in params
+       when (set-cookie-code function-name request param) collect it))
+
+(defun set-cookie-code (function-name request param)
+  (destructuring-bind (name type &optional default sticky) param
+    (declare (ignore type default))
+    (if sticky
+      `(when ,name 
+         (set-cookie-header 
+          ,request
+          :name ,(symbol->cookie-name function-name name sticky)
+          :value (princ-to-string ,name))))))

One of the advantages of defining macros in terms of helper functions +like this is that it's easy to make sure the individual bits of code +you're generating look right. For instance, you can check that the +following set-cookie-code:

(set-cookie-code 'foo 'request '(x integer 20 :local))

generates something like this:

(WHEN X
+  (SET-COOKIE-HEADER REQUEST
+    :NAME "com.gigamonkeys.web:foo:x"
+    :VALUE (PRINC-TO-STRING X)))

Assuming this code will occur in a context where x is the name +of a variable, this looks good.

Once again, macros have allowed you to distill the code you need to +write down to its essence--in this case, the data you want to extract +from the request and the HTML you want to generate. That said, this +framework isn't meant to be the be-all and end-all of Web application +frameworks--it's just a little sugar to make it a bit easier to write +simple apps like the one you'll write in Chapter 29.

But before you can get to that, you need to write the guts of the +application for which the Chapter 29 application will be the user +interface. You'll start in the next chapter with a souped-up version +of the database you wrote in Chapter 3, this time to keep track of ID3 +data extracted from MP3 files.


1Readers new to Web programming +will probably need to supplement this introduction with a more +in-depth tutorial or two. You can find a good set of online tutorials +at http://www.jmarshall.com/easy/.

2Loading a single Web page may +actually involve multiple requests--to render the HTML of a page +containing inline images, the browser must request each image +individually and then insert each into the appropriate place in the +rendered HTML.

3Much of the complexity around Web +programming is a result of trying to work around this fundamental +limitation in order to provide a user experience that's more like the +interactivity provided by desktop applications.

4Unfortunately, +dynamic is somewhat overloaded in the Web world. The phrase +Dynamic HTML refers to HTML containing embedded code, usually in +the language JavaScript, that can be executed in the browser without +further communication with the Web server. Used with some discretion, +Dynamic HTML can improve the usability of a Web-based application +since, even with high-speed Internet connections, making a request to +a Web server, receiving the response, and rendering the new page can +take a noticeable amount of time. To further confuse things, +dynamically generated pages (in other words, generated on the server) +could also contain Dynamic HTML (code to be run on the client.) For +the purposes of this book, you'll stick to dynamically generating +plain old nondynamic HTML.

5http://www.fractalconcept.com/asp/html/mod_lisp.html

6http://lisplets.sourceforge.net/

7AllegroServe also provides a framework +called Webactions that's analogous to JSPs in the Java +world--instead of writing code that generates HTML, with Webactions +you write pages that are essentially HTML with a bit of magic foo +that turns into code to be run when the page is served. I won't cover +Webactions in this book.

8Loading +PortableAllegroServe will create some other packages for the +compatibility libraries, but the packages you'll care about are those +three.

9The ~@ followed by a newline tells +FORMAT to ignore whitespace after the newline, which allows you +to indent your code nicely without adding a bunch of whitespace to +the HTML. Since white-space is typically not significant in HTML, +this doesn't matter to the browser, but it makes the generated HTML +source look a bit nicer to humans.

10FOO is a recursive tautological acronym for FOO Outputs +Output.

11For information about the meaning of the other +parameters, see the AllegroServe documentation and RFC 2109, which +describes the cookie mechanism.

12You need to use LET* rather than a LET to +allow the default value forms for parameters to refer to parameters +that appear earlier in the parameter list. For example, you could +write this:

(define-url-function (request (x integer 10) (y integer (* 2 x))) ...)

and the value of y, if not explicitly supplied, would be twice +the value of x.

\ No newline at end of file diff --git a/clones/gigamonkeys.com/book/practicals-1.0.3.tar.gz b/clones/gigamonkeys.com/book/practicals-1.0.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7038cf1056d09e31347e56b4b8827808f63e357e GIT binary patch literal 204800 zcmV)DK*7HsiwFQG>0&|v1MEF(liN0u`K(`ol4~=RBPxpCZKjh#x} zrBY>xge1lk$q?j>XSdeB{kj_uf)pjq!r7U>P*k_q2 zM82iouIGQzk~R5%zT_E0 z_(HI0kgf)cXu(%$@~$FPV!S<7mDImeU045^nl|dsRJAoAst$P=`nd?w9Qq8x9`mwN zE*W5exHATUec*o!U?cKlM{jCci zdk(lPPghw1J#*++T@YXm;^CjA$glkNURK6evbbD<2N143wc^s!# zz=)#9h6=#757>a$z*eupvl8f*$esZoy8G-IC2y4t{ciXY62=FCgd!tLV; zTrWlbcc&MmT2ban&+Sn1OF{geN3lrwN>ImFQL*&XOe8+uhQR{|Oa-Pot(R#S0g6SG zCTyxW)>(l8R%|5gh+$O+FQnI_UF z9X1W!A+*;7I*K@yl>}Zbk%H>3qE3*;h%s86W_Q5g40QwAX*jiuE#2#uRFPfsxFkls z_QanhkD0eXetPb)6*w9*2uBEl|K-LpAnj;~!tUJyJC{+j_p2>BUsp+HEo)*nPdFXst z|Gy>v3)Ck3nV>zDWaK(*?$ouzO8kW zuD+oLm*9obZFfPG>BfqKr-lE;ZJ@+aAd&#E`R?WSbR!fp0M)06pnIN%;6EUAVOmqz zF-zy{h0!B+o~{5Sdk(WD1ujh%ehq{M3jRElKHTuSjj2`_HQ!j54{HFn=)Y#Gy!*sY zmtFcl8aea76PW*v&W2|P{ohNe>u>CXe&8J!&RKYJ-RQgkf=cZ>qsq10o6Mx81mXnMv^HZFKch%!ktKOw0< zt2)~P0h~0ZiAV~Zk9yverubdse09b~-)&N(5k^#vdN++AHtPSQkDUKMJ>>uQQMT}( zGB$o$L~&F^5C(oY`+w@#|M3~x|MBGPVE^|~w%Y%O1l-a7w?nDh|3;n4{x=?cy7vDU zgCd&)ZdZ9ksVG8UzAy9NB*qr=-<)D@@&~uj{|~kP2eIC9rT-@*)c?uxVg9$5avRO9 zXYz5yVIdNEy^BrHl)Rg-*&I{iea-vQt( zjiJ6Qa#SI;#zTVJ|CV6Z@JJI}SWDvT?MM&~o@Wu>hK#PoY8WUK)L6X!w-tZ|0x)o$ z@hl9S3V+*tWBX0y0eAqg-%s4+bAKHfr|mY}64qZd(%6Q!wFR{dZ62TDnv-3`z*IS1 z=oMYPbWvkUmVxc2g;DmoNG_v1O;%vy82ly>S)MKuy>bPXQXuQ09fZz23H=eHmb$Vn z(^w>nVu`C9joX)Cxtn)`C=USd=52`0i{hHqmh`5Y-_5#tv{)AYisuWU;-lj_c#bYG zOs^9BrSR0tWglCmZ&kL~|Gnk^j)#-V{zEJ{9G$`C!T#@~+$I0F9;}%>Af>)>pEtb^Y(r`ug9aPj{ZTzW(><{_B6uiQOl#{`dGJ=l{+Q`M-UX zE&ShG{5Kw*==I;TBEW0)6yFmuQi3-64&Jh%}T8iM!VF~$T zlr8#?yz%EbIOeM~e{+u@aQFJ}sh$791d!H$hll+CUdm2Izhmgyk!yY54B zPk8n#L{&CgtrEBc^>~J=RU5oYd>;`EC%bP`=q_OhG3F^UU|ySopza0WAb7B3&UO(P z|7)so#JDu12+aPG*B-EE2E_BBei;`EV>kIfM+gMK$@S*~gDu^L_2+>0yw}9B4tO2g zb5(%>2biq{IL^{E7CezXoB|762~a!m%`gC;G!I2i1MuogMhZ@CS;gyXGz*8OJH}Tg zF^~@jrgqgE5R{C!P;_U`+D4r&8XJPH_(P9t1BM}TCSiE^{+eYCI|tbmA)8$rAyk8P zUM!pb_QR8B&)$AFhVPTr2?OWF=g+6#Kf8E({_5w8|LwEq&tAUr?KKNifQrWz@gNXc z(SZ)afahUll)j=4@aGYe%e0I`^^)o};=wEJFP6OMs2%sb8ry(9D`@2cDg&+}!nF%J zv{c@lGuNp<9M za#U7QPTSiQwLt(0EtY8 z5*w{*LstynG`t!-R@9Ff(xb-JhDDy5&Yq}CtpXqudaMoFljIS-XJw&R)eH!TxRZqv z9F`( z+u^s{4yN^$X$fY5$re?Xt>IkIK+|>$6gd%g^@&)<71gpxc%q>)o8*dKMym*92T1~s z;Kjwy-#ztzc=r4$unrAA$^?(W5ZLk7eI_|^O z%bLYA_Pwrn+y!GSsn+MHSW{sYkUpbl8W6^7Q4JfHYE8_PHc*H{9#tC?;kH-99N1eM zwY#CaRR{^uapPH))A^tQRdrtJ`mE5M+pBl;t?tpH8U3Pwk}fF-e&7e{O#q5B zwW&96R!{ZBOl~5mI}bH(!X8n)EeiGAu(^(FeZ9}_=c_PiiM`EX<#UhCPD6~c{f5&i6Ry!kc0#{1tBUUL1_)Sw*@^~PD6f1BA z$)-(UZd^-*JbU`G17d<3({yW8Qqu((*k7MK{~t$pBDo2@jtQ7h!|kD7=-dm8E^D#2 zKA>Pr4oB^vQ>tjECO&SIq`%H-1eMmIJ<;b9(D~uw&sbki%Y>$1^C+lJa-jNpvP1P- z`>{+@+gh!n-=ql%N!29lxpL81*483nb~AddVw3d{NOdrLs|tDR**Gg&xyXb<6vL$! z*{e@n+&K?SR|aCBV?{8aRt$tPCQ?Vtot8NznR>G3PJm5Q2Bc7x3&*{bNe3xwT4xR*f_P3hS9;wJSGbwpYAr)x{rZy0#7gir-d&iU$usb>{Nv`I?cAgg%Rq6wM zQXLS?sn{%4CsTmq>NxVIBv}cvrE>MlbsifsfbOi;wd_DD%523E3>}GGjkzKh zHpl9>N>)8`UpMt^gAG+55?HgN7H4Be0Zj7LqZA0Iqey38QP3p5rH%K*(icUM5tyX|d#*hPGO11(f zQN9bSwn(><|INC%LH0Y5imqb(kid0)n)@jU`(`;eumRDBZm73il$+<`D=A4rW#*mn zstLXqbNJW7>Gj+gaf61{bqvDT1`MZOowUBCuf@o%T*pu$ys`4Sx@^;z`qnBNF*5VD z0yjJ9sTV{rd0FtJ06rFqDBWKHN+U~inZ8jk5+q0H1?W`?OR#xbCLv7#UL(vSoFK_E z%i;)p26Rp7CV)U51o}x6M_1-{TBIB6SxN_|atf$}^%2E98k{suP+<&em1xxQ~Xuj?e+kCO1Fh^po*^p0ri4AIy2H zEVDa}pxR6gKFSvU z@9+Ho6ZQW0$=P@^8cz=UzxP<~bpC(FSDl-k|4?lp*~7PN4(0Y`i~b{<@4NMr%Fg|t z!;#tlH346N`@e^W^Z)l#b}IT^5B;y2Hct9i#={)%4_BY=UeA|+9foDl{Jovvj|0BV zVGdxEvnHmj6|6x3W3-kS-$#8Ot`aeEB`2W3>ol5MU|1cLErpnd# zCm!ld#*)jWuTrp6n)E$5q7NOSk+5e+qy>+CgeV{4XG9whmgc?=J@l~*?BR;P#fQEO z(i}P*OnPfIU!~>)?S4p;OBv0tG1>99P-iEYTeMsZch$-X=&?kibID%5c=BVP{R962 z6Zp$dFMqjss-}DzT%7FQw zK>inOici!n+(9EHW=ZTVtfdx0bwch(-0MOqmuuBjSvforIVkOJ9JLvV`YdSiN+XjC zyqJdWPfkm#Z1)(@>MdYV)H3MGZ)?ySv-21ZRmx4(lk~(rxVvt&H zz-hSwrIz|P!f1H|gd7k4a=pY{`%H>s`LkWxgHy#tqd zRFf|f0)kUZgBVH02eMKMPk$XVEb(w(UeG%rDDKMFO*yC+?PSC~q|#R_0g`opz4klrc@~C@1Q<7YSOcgvsNvATnf-D4HSNgPbtX?LVF-HqxTk5~6s?O6EwJ-X{DK3^1ZLM@UqTgc*gyE__bVLK} zzLO-ZlD!L+CgHCx+YHWS9S|W(6up>965E{M8nGItNax{kXF7_!?#Z+waOy01TSK`4 zRZl;!1ilW&tHD7qf{tUyOVu$9j$qFnB{sd=BpHs|)T(IURBJ`S#nZb10AB_? z+rG)Hbx|8|R9l2`dsj@Y>Q30XW!$fO_CHVr7nAr5&k?(}R41qQ9hXtS+{d(ioLd&# zRW7w8W)=WD^BmBDklVi1flG;?hIIB5(FI&rxx##?5?D-Sk__X{RXPIdDgtuQpuqVk z6k;)8KPPs}YH^h^wh29%Hk&Uuv|d_)&@FXOPUA0{cWS_UPCx+sobhWRBd$ZGHpa5gQ<~NA+E)-Z z6pz@1pG$TijlLXjTi~^AuLSK+9`&>=Da@FPv1pxU5y)Py*d}&kkw;qgYJp zcNpyAW`vuo6Q)shA*q*Ect>M$rQ}o#@p^SP0Y5|0uM=>Mq}GO1OMZx^uh9g~wOO2Y zW2J4zm(=PZ(-^mqzb0o7ncLwS&J|_=RfBXI)V~6vf=*-Mov*3baZCKbkV4ZItwHip^j-eFz=WP~sOX=ZY7!Dh%36cM@GJDl8 zxn9fj*$5$2m3nO1TAhr1gAf%{)d&QHvhKv5*5rtYn#;q7JX~k8guB8cU4_B)(?*2RDUHN>W$m@ zP(=o7;MMLlz-f^S2wSVbWO{eL!{N`)DWsTgYvUclW1|4v}YIoFs^Sm1G zkz_BfAwW$UFGVOi;2ysm_r(FwtPMH+TE+L!JszWoYwYNT)iz(VKV?$Ceo}QX%)huA_lZQ>ru13?njszp^O}N;pS%ToXCXYocOM+*PL$NiBuX@#c zsJqo`dJ)`)Lx8JnZz~;)r8tD;`Zau8U!3Zznm*hH=JyiLl3F^L+zN073DGUp&%z!$ zwGf)2(R2cysd?6Q22~+npEx~A5{;~XK(F`JZKBCcInobqoae@?xYxT=zE;(csP|B_ zgD>ua8~fGPURT&Xa1LL7kRJdOJO@^EvpBPp&gXOOV5Ru!0cu^)PK_?G=!*nTaUHZ7 zd;p|(phNHG|5w+Ho?HL%x*-#B_#o`M{2X0L(B zQ9F39umjS+X}8-xDt=t%-(0!iuCzVhpPoX(N%PkLSEro3b3rVAf>~hMtcLG3q1S3= zb#sFD;AVhL;C`r$tGu?b9V9?8leeQf0d?vw7zQVW_Cdf7Ogl_-=Wk};=W=MJm03CM zVbr4z`#@4~p-jHe#rzFsX~9?MctdcMMxg4l1oO4Stbz04ex@!nSOG;{=ZF@BXFWx$ zPpKvJQn{5$Zq|Kj3Sz=pTrFguWL%CPKmRl-bLxkgE8PYP2Z2&iV@A&`Idgw{rJ__= zD5itbN3;s;#5QElQJ-RD^71(wVD%$=7bz&wM0dMZ?D!Fp!r)W$n)pT*(4Ql%e1?KeL_QHYPOX{f)*I#JI3r)0q3^&t8UCg@G z7kbaiMVzlo?)tXwLbu`GjTtkJM?fIXrFRwu8 z!bpAV@hI0D&nzcX#N!+MGE&GstVgvvVuql}pzemb=;<4oa-o1B9zqGQqga zt)ZB0ad^E|zP$R$Nn%caxXcq^aB!oiHEgC!wpr|QfuHI!I*S)n=Tc&bmTcWBvv1%E z(7oFtv)~7d9Fkm>T*w2gd;k_=^?2>AVNGj*}4m^S8h2z0KeDPu@nu-P?5j_9)$*1aGsW z==3*lf75MNA!0YADg_(v5acW}7{CD88C1gA5;#XLUKy%ya01D9doH9`+L8_#KZu5) z?hJofHCF{y*zg*;Cu=x3SHu{^$(*8?@iOppTy=xZcD+&Z_&^)I3UWN=y}nuEpsZI0NA>#Fz$g+Zr~O}}~d6sXF; z?PB=UTL%no6&)9j4_6JR7VXp=;^7X|_X?%c`Il(Nz`x%fg~J`F0o2E%Q;X`}?%L=w zE89}v+^XIdUI2n{u~yfJ;x#_I(V${gm;7fpzA~CH?+E@M%$ED__jADi%Vc7W;-5SJ zZ=9C-f3xIM{@;)I(<=XO6u)QwUkji)|8E4f)mi@EDE{^Oh1T=`M)CXS|JAOcA2Ic> z{_&pw{b{I8$r|3~>bNdFxSc*hH% z4xxGjINz67fb;Ozdj~vGa$%vfPthc_{{*IrJPtloxPZG9?^goSbE~vG|L+wBAmo3J zP5hre|05m$mqwrRzkigUwx`z(1Ar!*^%;~cBv;n0TM*I&_y=FC_RHlLpy`?yT9HyZ z7@igCEG}kRi9MjKJz76SuB)Js)&eW{ntlqJ@to}UQ8k#E4zO60a2LT0t(-&DCkOM=23N3 zCtEA(Y}~D=O*f!NY#0@+X&eVbALDETuU^uZrPp(1&GAbb0=ZoTU*nYmO}4DeDirFZ zgNe2s^i}vA6h4rsW!tBktFSYrX3N&ytRX$T^J7o%Dd`NGm;VU61D(7neHt7&+YlW6 zPIqsVi1T8$)b3C^U!ZnLrZ>zhM|v;==tW6uL!=gp2 z+V1%@dhR?r))Zw7jAm=p7h$tSPS4HV)855Pe3e=g4eZSqPUek-Mb5`kH>6g>tcouM|FQxnMxjUL9C7 zoUMP&puJhNpm+3&y5|e%5(KT^ZX^jr&kbq75U>hu*zPZj4FTvA9o9&Lr>lWfAccZE zA4jSF!g;vl0#*o0{|+z_jb?ArGwO0#yiz>2;)7Ku<;UVpG28E|rdAV;L?=18p@-L3 zAImr$+E4w3(6}6^h8yAOVfR=()I>DV}qdaL3!qR9Zlt?()RTUozy7_MRN=y&CM^p^R> zbe;!2@DIVoaSz!W2Yvcxp?D4I>dn>;eXobIhYm`^&Z|$*N5f{h9K^rFUO6|%b+&4k zpPd!+YZ4s%1_Mo+_7BK0EaK0#j|Z6>=&q5UfG-ShM{uuL~YwYd|X1HUP(7uxS2?;7UzYiw>XYh|gTS|uF_ z36ZiEe=0329JqUKnhp%~VP9bu{(L*2-qea;!5xaBoM6q@epve93BBX`?&-v)i=PU8 zlC%he>u)ifsXY*mR@2elYYs>^*pJ!KceWeWKiHm?X_wX&bH&r+bYJZZ1LU zj?f=b+(siG^_*ou%2P%pAMt#BwF6&cRGT;*91Q2QAi}3%AxoC+N4%PGz-{Z3c-H@q1m(NhgDUeGUp^WWIHo3;>Jr zLNF~(wHLGA83@^_+>biCW(sKsw(74rIp5-REOB?(j>@g>Vb2Lo9-yuWG=;%qqiazZ zQ@Z`_Hyenmrc2zYZ_xQi18mebI*WIiYXIw0(uUZOY{ewZ(Z!{5HKRu64QXQzgKyyX zPI4U>)ubt_vUY{5#h?S%tT{zbK!WEP4@shsLUXVx-t3Ib)~KiY^$zuy)^>mT;XeoL zKOZgsV}|yB$o~{)SpO4JLVdFTe1xBO$^Te2+O|mp$<2|v8N`ilb~@uUm;7D+|HLnD zHofMk#w%Z!yi?_|!}wL6HxjqX8`X=a@>S!lR(S(WW4{6q$^+-$dSWF%xBp*~SpUB; z9BTi+>{I^7kMh&b|1Wu8|G(t0|6kJJ|CjuFeLouf|C0Cj|8spkKAIb#_xz{7u>W8B z$^Y+T{2bW-#XNo$eTW3Wa{k|;_5VpmG3NhGKGFY=@pF*=YYcct((ksdQhohRN$}Oj zUoWM9@QoTP=ol1R{NcR%^a@N#cmKun{{a#JA3py{l!YTr{}tU=M?cj0 zf0Ix7e?Q8Pdxk%2KE(YGnhEA^a9X^^gk-LJ6ZdM`ub@OH#j>42x|Hb^WJ{PXpxO!e zkX)e)LC?6Rfd2}rp2}!e)Ro_+46FeLtU^HhR96)>xfO0!!RllSx;xCVFodL1)i<1E zA;tk=IiKPn*{jrDpL|?Mi?6?e$bUPs#Y!hM>`{$G<7K3$NS-9k7 z;oSR8q^7dE)$xErZ@Z;8oX$(&-qnUjl_Ua&@(JynIg|#bXO9QtaXJ}7tBOsJlf%}iZh3)SZKzt-+%1hV|YD+Qi@y1lDF$%j>z@?>^z`) zqMNh5uI;If<(R=&!_#}Y(1OB}3mSwtGzbsbA9$sm-9YjQ?wy*Qcwxo(2Lllctp;y{1 z7vRtpj4j~709gt;tq17aFF@5yjRs2X;yR=jU(ePo zgLTF!oA=C>VS_}}9Nih}?`#6LlKmb-_CMMW_vyG_&H!Occ%>en4GML@6{>1xv&6U) zJ#z@=@^SJdl;vW#gA$Yn0J#a8oR;XS0plNNnlre_H!mIcfA$UHjar`K^i-{J(>(h2 zozv5z@=j%xegQ={Xt<7i2agT0@eI26tVPc)=JLB`ZnVfv&s?`s-eC9P!g}4Ga3o<4ez1US$57kR11;{z9j5+$G3PW%M@E!|6_*0QD_wr+m}D&+fL_wE75~{cGeU zejR%lbfkII_Vd7OuC<*XQrYz2n>bKnHM+qekADZ zBsS%A0FjQ0H-U>^1A!U~3rP5-_^+QNV{|2d$gj>`7feB-Oy9q1j+%OgWmtXs9o4SPCs!ME`>W3$(xK|>HDvwf0s0alH>Mu@{ z^oH+aPCC$$7h4(7l~wom9@l#3m{%K2(r=_~K=qPFVhG=0aRBhDU0;C2t8;=LJoq%7 z@^wxCR`e$cF$as)>6!)$hpT)cX?!8J-q@tR zzl~$+-h2Fm8VY35z0gI?ILLGP?(4H$Q za%u+y#d;8i%TM41NJPrqh7K5$W0-@tnsztR3xg;fxni=T$<5W>yJ%e79w4Tn-D9*+GZKz{&Eb)Vu9bSCz<&hSz$u z995n($gbDWvO_^QED587g1s6J_Rh5ov>D)Gbr_EZbVUb&IR?2YnxR!g&g~0C64kTS z7kfU&$X>Z^v@ALXhz!vldkm%>xE(mJ4)vy=!4-F-997u_Ve1IIieO)tn-s2EMTI&i z*5K)=At6vo3C18Cm$-Gq+VkjlsZlM*+1JVRca3LkF>jLE>jT7hnU%!Q%n!x$edpqO zo&4gxSs~tr<{b{92H%g1el8UryzP5CtFuoT|XJ_kh0JQRcR-YP9Bs_JG zWTi3Q4IjE@mM#u*y4Ff6V!aNZLB<1`Q)o3(MsowNK<09taUK{a{f1-av@Pr(mJI40 z8Z3)bUBJ_?BdPF;-jOWx)!81L&sr$0T&K&nqjt2CHs%IkVb=dT5QjaegLA*EFNgDO z$)|jwPNLdN3##cQ^%KKOW-UDL^r|B@rD@z%vE2{>Eg1r5*J#Lwg|!sRM~MUHeW$!a z<6wGR2U;qQ9rEegLcZV@08Q4)W|oraCAb;5ZBg2=ef5S4BOy^#;Rxf!-QMT1DJ4*>aR<*N|P~%Aj;JHL?#k zuF62jHo2%&@ziy9KrM7mM6TL3-Jp&kvudHVhDj8;w0J<>!bF@(eoj51Ja{`lemf7| zj*o5(r{JxG(#2p9yv=!?sq1tNCjxxe2097{SG%_LY{po0RulH#>wNjLT2~en!fb_% zqFAG>YrKNOKxT9VwPdZz=gpbP%Bo{(HzUP&CM9!qYCN-?4$6&kInjEJvFe(!o#_W= zSbbLpYg~qE?|c!UT?vcX0dzQtgIRNhyy^y-?~xc3?xI*r)V4O*1|5A7s}FC)Wf* z->8MV(bEP5YZl-Gg8*sGgmwE(ZJ*zL2md_(-`9S?@YWZxvI`cIA^L=Re=lf3^ z8~(Y-?Jn(%`4H}H@TfV5lw#!ltF6sM(MuoP1=Nn+S@j4p{`m?(kb`dkqnQJj4pRSd z@C5e;9F2?8X_b6@!L+%|ufQ)DK)3?fw73E`5jsae&;IcBv-|(4RWfQr9z1{W_>s=Q zrQnvP}1}mLV>0Ie#5YMs8FMHd8HqX=(!0!jp3AR0{?QG1Ld3Z8bt>NwEUv zUZHA12UgC+t}t(&>5#OsWalVHWd>!)u(lD&b6g6bVGhME)*6_s1BK`~19&XODR#Rip;IGPEgNE}qPlho^mCt8+h3ndm6 zC-kNpp!LC-Y7RtKuW(;y(sPy_*0MsgT~-7M?xBVb$#yq(wJ8p^Drq%SIROVwg!T{s zhh#gm)I|1BGlxi5Qq1W*KilGP+mcFGs@E%OcA%9*o83B&tFuFm9I{+Cx+?O6J5iEk z_3N9bxH4br;DrLMQiioMbjG2+IvgSgB6hY!-%}t>sNv8+bUh5%)?ZS%p2dZ{nslUE~e8BK~ zv7N2e?{D`jc;UOvesxx$fYbecaXI*YeW@P*pZuqv)UO|kUA|Pm9~G~IyJyh+@p8V< z9X*B{O#ObM-+%h~*YIzCNsyivXJ&a`=TFqazJxBHVXRE9A>Q9_)&mRn?!|NgY$UdSzOfVe<9eonz=Xb_Ie)tc z)a`111{Z}^O}&W#9;_fGtFBC<$2nWf)vxc@3b$d+)XtgV1oxH;=;yoj_Oj4RwO(w^ zdgA!n%Jxj_?1^GGn%kYTe|B~o1!bHJ&4`{hor$LeegWv9B& z)pe5$;hXb~I)@PKQR0N^=@#w4|Jeg^fYrh{v%42?yXCMa_wuR2_Z=bKpURm$*6j1q-+`<2E>wVO)%0i1le9(=pdPZm?Vr?80uExZ1kaQumyJdFKmq1L3U zGg~hZXJER)=W5nV1LON#F=KiaI@KepN!W!Noni${7#yZ4**b&@yvC;reK7_~UG%%P z0b__L#L3Z-rd@$w16uhz_++!V&?9)VR;c~mX1zv?QVX`xf55>1k2(ZE z9`;jno)oUH^=lW?oOWlq)(yT^msdX502Mj}_T$s@tKIp9S`~ftX>T`$;!dyh8Te+e z(H&6JEYvsZoU7NDnzSjQK#`VZZipU|A)=Hz%lr2^U}ytI=F6?R(^sz)%_ze&2^mk- z$T2N2+N#X=1`J>$q42T6iQJ6sbF+%DGy_8z;dsn&F`ny~J0$oEGup2=iyhLkN06!D z5)Y#~fZLbmWPYtke}#S!adGI#_eK8d%H9rNFM(|`pY8#Nt2T0@$&{M4Vmmhw^=bhU z5QjkFlK%j)q-T3Xf#p_HvvYMi%6sVUYN6@=|G8Y7p**`tWu&2=pu`&{M?i zl;8QF9NugTo52Aao#;yQkn!U0YHc9nv%;%+K<)z{J^#yr{68Np|7#kBHvd-|>H2@+ zF#MGN=VSc5Oa51rz^k75)k>X0&REY&WnwE09TUXD>nBDQ+!{lfWQvrqY7KgQ32{m&t>#s;p^SH*krfI|J}VLGz;U(;ct-iwCADE>tMKgQ3O zCV9;%mXFb-a!Z+aE})Y0rgWo0E%0JhlD+I$x2E8_CFEJs)-@>k2nyq^R-PMu@_w@% zC|PQz0pcA1IdCYN9o1@0E|&GD?m)Ee_RuA!`h!9d7_5t3AA=wgIjWr0n_X z)@ALrTaArxH4LmOzJ|F3uy?&iwKMB$qu?uMYRRjez!!KZwkL%y|PV(U79Bh_+-?|UgUqQYz z%kcMnQ!-UeyKa}by65(B)eDkBXzpNKQIEol{zvC&&;+#KFH>AG(hAg;b_tw{x%sq= z!>gznJa-sTa043&bEiUm57XQVrM)(N{neO>4(R_hA}>~_n|w=^tlv=$DA<2eDE4La zfAL5?kHR?nr2qRUKL<5m6*bw14bXe?fan6aF9%Hrw`Xde4$kR3WjS|-TDWf* zI}3ZQqe1jD!qA1;2E(>oT};Ku|6& z8>d!*8ytY@9n8V8PBEiU8y-wt zyTKjj*~;W`ut-EaVYP+(usU@85B2U42qFb)Eo+CT!sgsKLN=#K+B|Z`=|2_f5HC&x zXMi5XfySgCn|tT-Ku{iN2XK>C;)phY$%OTVhNZ+185{rQD_SbL?>7tAkL*K{4W7?M zx3pM}@2CS;!HORdd+^Y^h*6UETdSaZ!N>qkx2Me zB28IYe+h5gkN@{(ss3 zD*wOi{r&%3>Gz|#0UkL2?s(pd0tn|n946ZTcNmREag6@|X*&FL{y)ag!SnB8z&lca z1`vI(%NKRwwkZii<#@awX&4@dKNo3e(qy5I3wY_f=u-I%=KP_Gi8rWeuT@$cJ>>Kl z2m9S(x!5gqWpT@L{=dKm{XhG2fc}59_^&wA{=dU`7^h(p1N|S4KGFY=^7Ah7UyMH2 z!@x=r*!9gVA2vDZ`oHC*sZ+*=0V%7|TUUQ|;>w>u)PCvp{XoS%mcell=ctehxD45NK<#pq}A|6s801oTN*W+yp-g zdXX|oYiD9g{=QkihQe7V`D|8fw@|B^9zcQTd~+6@=m+{E`rYaT|M1XcV1-&(xdXvG zun_QptNXSvf?lZ{#*F7pQ$R0}S^$hdbH8PQd=AAQ^=#Cwqd4#7;BpP#BO6E;km@fWTo5nRKAJ4W z1|ENG;gnxsd$Vk1%~J!S;TsFZ^PS#luxo12m`d83P^$xM{?c~f|62FqWTksWyVS4S z0_clAx}Uont9Ki6-=gw(U^bds=rL$Y5TY`_;(t7= z$kqWz0>147GhHWTG5^wJ$am(6200jPz^5FP5Vd^-oD(52qJDR^-syyTdV&?G0leUt z!gNwp+Yn#Xuefy$!8q|uANXz6IHA|ljQ)UeXi#SIuaFBOD?P~DL-c?r(?#e5{YKEs zFE5u@kYm;9*nOiP;IC>5#VQ7o@eT=Chn7y~PON_)oPfjUXE)pmYo;K&b})qoC&Aks z40qTBK6M*F*_FI!hP^^X!g{l%=sCUC}|!xcbx#}=YX zv_+pDUy~{r{U0=VbK&Sqn!xEi__G~y z+WH^;YT10hS{9I}7O0IG^bH%0KxJ{L{{oW{+k5!prFLziW_^2eH4Nl(vxc%o1Ji|m z>fChYRLmMR05M-VvuOljR<{AfR%ZjO0kCti8)G;n1Y0GnH;5H1p^$(R)a9J&4)mNY zfUVyY7wcCF^63D=^ASl%u(IxZY~_0Hyom`4ZXivvTV!RhJ_lD_!x}IekdvGr=eNVE zjO*6}d+EWWV$(2Xca7Z+s#p(i!8y6Sf|_kOOzgqAiA)R56zP?M;zOY0obDG(DCOYD zmb=-xc6P*#LMLTT*4IRx{FtZ;UbaHY>&I;F~&wv zSAuxD@T8Y9lbOXt8RKguV9;(7bl#5t$ zYE4pG{e646%v;`N4O>|5kJI}Z(ImQG%YOP*sjn)ASSF-B;x6EJSj-T4akT4G1wrS| zS1{+6dDxot{)pnbF9)-c1T?H#WeeTWGOov6SHl-+;-x9CyJ&s0J}$T#+a#P9Q!~S^ zv_^~|D zNAQx#QLoz_QIq-FI{7;U^^$;}t{g_#LaPBISY?3~IsmGlS+0 z&W7+In_mKHPoyP(LVn6RZqGT4CU$OWv6YJ^DJ< zFWz>UX6MVT;vb-(^&9oZu#|WxW#tFu=nvApRD0UK+iS;Ufrrs~!yk!$liB zx15|?^q~gH4zVA&qzmgfm0!{rO<8n=QqgrI^HjEQ`8`}y)s)t?JTVB!Ju#(b-=l>8 z*<`85D2hL;Fp=(viHUQ_-_|z? z2~h>hd{!KHg9>?qV*{ZU`shI6b?Xj}!1_>pqD)N#P1caiUY}76w(W&q1R6u_TX4k8 z@wu(L&~13Q-DbU0yoNbGW}t9%Do?O2ZlakY%bS6Mx{hVURb6?Mpf@vV-_=_UW@R5US zTzylaf=soDT1B7)mA9OVc@E3ppaUrN5Iq;N70@a{zg4TpL8iVsw(6i}&nWfHY zP+(khfaO@Az57~&Xylz$9!#5NrF*gygL^^CCm@$WXD&_5m#_0Hhvh)=Oiw&FN?ZMD z8aN?H?m{>hq8}HiP@;L$ov+)T;Z_s4R;%F7&|MH0Ab-ah$71Dts=b&GtiIb_C;r-$ zy*91ChE%~Uy)yvQ1;MZ+V%Ms*={aYu6{A@hq+tciuW5HbInw=m{2cKAa=m|k#{9p- zC{EG;FG)wEC>!edkI|?6A0OrCI{sfDhT~wo$HR3#4@@UDA2S#MQuUjG<(-N2Yu4EW zN5GF;Y#d^^b-fk!!%W*j_YbR=D z!msfgsC1!qSH|DKT(Q-~f~qskCL~%kcSW6B8uB&Ut=1)tgZZ>_FYi~oU}yvBtM!J7 zdtaE?XXoN&1&=XmIr!|wvHMW7&bo{0)6z%|U&2q6$K}EVc^h=>IkmxiyUo792ya_W-V`SZ zoEn3snjsZ43~YrGkRJ4J_ZvjS9{zT|Ahhf0-_CPFJIbm>g(>luE|EyD5f0L8SX5H~ z>%L^s5gjS9#9}2A2ag~tqSrxE;<5!e# z>(}!QuRL63^+LvAmte%mw{e3dpW8iPa|1eEH(f^O}bCCX9 z40uQK&)bWczifl@KCq8|y*a<0nIQ&xN*kX7h`)zE^qc)k`@`3AgIz~e1iJpgcD>)s z+G>l+b-jMFFi}f{HQKE`>4ewYG;H<10|))T`==HCe@_LFQ2#fIvasAOm2dQWj2KWM@cXW zQq^i$Z{<)mT_xit)M{LvEsLG5M^Z0Fq{~Zyeu@{Ms!Rhbnh_~(S9*#lmQa8y-_IB8 zTR%L3?rFyLsguR{a#N_87K6p?s;m-Xz&9+fF*IvS^y^&R3IqGnWzfUi_ zsVnHgyjq4vwXA6cBVFcK1K5hKoA=yQGuW^|FO646SqAXIy+3zZtm4bE>?!aWR%P^~x~>0dmR)uE z&)}$*uDw1acM-7pYOP3f5&kpie)aX!JGx9aRZy8O^Yii___ph79;xO(KxP|wv*|5$ z+WrZjyFXlkylS}=&53LpT4*N)Xu@4yoOjfXuYszWn+4u)7ER^xsDV1m*q|GBEtZy1 zF}OQ^EPtsJ_NZ20ei{R#qmq2wCEn4Rwx4V(wh!8hYn^{M#3HH1_h2j6Wro8#cwI(S_KkQ6G=u8|9< za(;RY2m+r6>cfD540ardvko>qO>We4PKz4ipCBX7s{&>PTzMW$^%w%!l4UVh1U;Vu z1#%h78zzmBy6_PSc*Cs0g?oGKI}^GFd~w!L&zGXO6&lYX90%PtU%9@06P*~^J zh(`)-;O&4`pt40~ReFF-?haKKxp}|vzS6EpJp!bMEe9Qs2caHueY@lT?Sg-=_#fF9lGdUXH#rckaqpD?nkGbJzq}cm}01j>X}56gZKglKXiNpDDne1%3i$BrH`QT+fE%;gmqC5K zok*KrO+Jv3XVBj?ALLNUA8#SBi%MDoKAIlbq#>ycD&12Fe zOTtCBnY-c_`PH--=u{NyZq`ujay8*7JK8o+#NyUEC{9lovjrR#cC5@^bUyo{2XSKm zOHWr7`KSBSQwVCQrAjQ8#f9aGZ>YnyU7UfRtj4PGyPwi!J}s6IN==wb{e%1lT}!9`DPlj@0e6tDx$Rn! zIJx6S?4jjBbmYrXJ@Oa(i zacs5SU>^@%)i(ooC>(CXfNXxa{c>(^@HHrA-)e_(ybCort{OwYhp2?ZL-cOz!3q1q<|VTn(#BrnB0g{xyGcA7 zZZdOe-qcxU-t4Lc_MT}r|2e#P`^MY+#+Qn7+wP}oZo55XTzv8DQt{jB_l*FdRm50> z1G8eW#MoF|Kk5YnO!fVyAL*VIT0=V6MZO#m6o~C0KEX*ILBkyO zX;?-H1z2q0>%hqKd}DH2z-wjp37 zO*n6t5A55PPCJ}}&7f@`*w@V?OZ`m>=$iH!lifNhtlr6dJ=+8E%h5jjE$}mtmdtIY zL^vl?8GrzyRz4zt$6Y>viage%%d4r|rxduYKvJ9Km6i<`=K50|K6>!5-UYvPdvsZP zx`IWuy>0eIusF5TrP(aD_ykPv`PLnio=1HMzH7V9P#(BTi_vOZoRiyeuwE6x{&Egk z4s2$*4hEzbz@#;d5H(z6DGIcztL)lEW&IVRiQ2}!EmeSONvF;LerDO)@!}4LVtD|K z&8vCw#sNv6Ey!V0NT=?%9@AMHH%s+gNB&BxZfis9SIz@Zh3_isX(ZKdswhr4USHIH z8KT$IOQvQrn6CHWRX|9)HK=0N$uN7!aA3-{gDq&2soC9H7%a}EeH?5(FL^|zRn7}csa!nG0~>xRS%@v6V{?fc9B9N_;xTK%^)jj;Y( zn2bic{_iLZKjnY;C_nEK|Kob;y?^nydKAxzqogj$M&*H~50xk8gtKdF+Lps zG49mkKgR#7;y=dkAOBH$#K?>aZE8r-%D+cFlqkD9LfA&R=K6>i5(k9l;8k9sJAJ-s#Hn8u)kaSMR zotj&{OD&5Nr~#O7>aS=^u=@(*!@*)WaJIX_CiQD&Y(M?9`Z+-Voqhi~?LSePhGqVz zQKIGlH2TEK)#>7FzbRZ==avgT zT^loo@jqF+Q?XxHau438iV5poP^L;$QUc_PqWsYc`bp3&TUu}4;HLIP&o^`9-s>9Y z%bv9w7PYUnq3LxzG_=z_6iQhvQU9t&=AL-f`kjZSdp1LJf^PVALe>^DaPU4Ur)D7$ z_{L4@Q$&WFy|M}d+nZ1!bTc&ZLTtWWqo6J)!2*21x8WANS;mhv1u22?4l+XOw@Mc1 zL?PpJe+JSXWJuZMm;43tCeycXq&VZBtqjH!d*ooqTW!-+T$C;Ev}MK=(A5v_pbd#v z4L#H4Ps`$1)dY-XJjJ1bo-_ln`PiT$yX zms5fUA?`1Aya468E^E*@xS5|818vg)j?4t<^vcYwWc#?O-zjv!o6d%9tYri3O|~V& zhzrCNRBb(3ohvU(1{#I>wX$RD>EDAMyrW*Z10QVtGJQ_URQ>9^KKw&zyK5zi^qd## z!S-sk%ikz^$7(p?OXjfK7m)?@t%qR{>!pd*NCtOs+yP8NPl@KCV_XXI2j=5KFSast z3fj7W-L-Ictg3yM}E*GnpAiFGs?sj*jsPuVJ z?Cb?=sbO$(4hGsTr>6!RdM7Xh1Jz;_4z>(PgzNr@X3*1-=4y~3h^1hw@9MF2%^Rij z9b#Gy`l-5j-9*WdZ1IH1CyIAHY->J==?#W{ndqq?^v0s@<(EZtco4@_tUw-@c zA8&i=ul{ZI&wqdZ_Fr%R+6@SFS-C*bR6=d1qso}dH(bwKSmnWAyNnTaX@q+W6vcs} zknTCamjDWI?q3t@`l?$Kgu2IFE&W`2!UeP)H z_UL!DI)1vwU|GrUWH%3vUj2;sm9r4#^js}mfOvvL#l-0LG|rfcftdchkEfUp3F4ux zxMaD@j^np&Dk@T$d8m-8FG3Bx0T{xncwf_HiDT5Q2lzaNxRt zdD9S1Fth=M33yUzNdq^$27SCkTwhQHTrJt#bMJ4?3b4DpdX?ktrT7PAKD$pIKYQK< z6(U-r%7bSH+B;dSK-wb#8^>X<{`19rUaZtdWbG?c@_~Sb@Byey+6Mp!>jQBD&QO}r z_}Xvx(~Ctp1pAT1le_b|+UKR^T0pa{2!btl3Wt@p13B!0VoNU=0%Fn8e&yU(4u)Cj zpmH{7PtBKug}L9W&ulh=6Vllj28;I52sSu=CFYsVF7nmla=%26)7(*%voncaVX7q% zmvTj`O-ve&+#e#>)*HC;Q-`i3Ig=jM?T^xR+Cm;pP#T(HD_hfpwQ3lqt?41Z z+Ovhi-L^F^LqWCP-+Tdz|6*QZnhjg(X{kA{+Esea#^HnVv+Y!4l@h@_L zROfTe*iimdk5Tgv(qGj0AP(t&54AAl9)D4d4Nm-fiZd{UT4UT}wmyFyc(Ep%&AKpFgx@c!#s-l9rB&k>q zaenn%v7E2v-@2c5gYGlU2P?i)v)kRfBpY3XDb#P(@-X&7r701IJYEX@JvA zaQu*{I#3fNmy)%CWvUT1z;cLZJw({TDGQ*MKOQEiBCu8R+B8!cLtnID_oNi;^mqK! zGHH;sInIH#lBGJk!80wILW-mW( zr-jZwbPfr7w&&)Atxtmz#!Z$6qXE&KIn>AzlZY+hQjDU*J~Ao{JHLR`6P3qxT1Rh{ zsnLC;#oH7Xbf6d1ecPbO&my8?O6>l5wIQ7a@s zB?Gq2aw4)z?&6(bS@)jFu5W6)xhL@;v*N;DUK)CQeyvl+BokGf@QM?Md(L z=50S9nE?ppoQ_4A`X0A_h_W)d@1|>Zx*4#5C`EaSsFTMJ0U{yg? zu5bI>+5YPfkC4gLyOpQcA#t`yGo{#5cP5?mrY(RSFcx0L?N<|J7#*9-M<6;_tETT| zT7i}?w$i=3fnp@0Df2AscGs!XKi$L2e-bdE7$C#h|v~k zk$KPT2dKw+V!etO)pO+}Q_+*ya1sM+;-DiymVq*x9VtM7%pQD|1Xim6;Y>nBlX+Q_ zxXjQiNWK6$OATRqb>fOt-QX{k!%z{d2h;ryVt|cN$(;)vr+)_BKx}JFJ@3{SWx{uA zi{=&H^shl}S!k7om9g-R{=oFJTCd!-AsqsavQ2w7&TF^lYg7WL&-JNB)OPbkr1ngc z^d0_Dvewl}Ubi)9mKz#Z=GRrzICzJdi%aX9z#?_e{1G4xXdnVK0HY$#H)lEwUsDkz z+h$bU(L^U)vpzJl{Bp6&m%0YAXqnncPe@gd3bCyI*P!?0PJ5KEk7MwQ)#`;>&1L`4xJBw^Q8-*x&3a#+fNm7QY_PcH3y5s zdUFzdHrGFmt&h?2YuZ$d`$`zoKAabW#wVfZ{ ztL8S?(--iM?PRblPIs!A?#evdEY8mDLk}zhr2B_}kU_p&oUKj*Fr*h7-E5=S!OeCz zn4K?{?hGr#eqCT^)AdsC%;mAsULV4xYOCh{FORua*^iYIn5hp8d5a%LZg4d@3ACnc zRt2S36CnN4XWsoel>dWP?Pt#a5vHS3{?F8_K>wpp{NKm{Po&YOVJ)N zTL?#<70{dF({{QrRq!g`EHJm~T6@vBG0XW%M_2)7bB`D3|)1^(usUNe4#YuH^@3Dbvvz3Tfn-js|T2(Hkve8c&NN7y^!@Hfn!nmr>SNpJ zr1Tu=Ros1@1*kkOTY^~&8#-RTZo}&1riPA#mfNuU*fy-z{p)FeIJ=#ct2+p)kNJMN zNoQ)M8>+iW*u-)mlhfaJc3xcM7_yIl-)snVuKBu`Ch=O3Y=f^KPVtCayiJVr&qNz* z*(=LD8;;)~u8Vdoq$Sxwu+?Wbv>~ovE2_%e78~}%h~m{Z?NM))W7=^ubiF&JV1>qL zm)2nmh-%b{gS&^Sqn58#3sZqllnVl#=9?TDg9-?Q;b4mOmf}-Ia@XFq6nxEkXKL}) zRs#ujkiZ!@j??p6?GV|~DB>F|=KW?9@?u`~(XHjX>N)AHyrp4(K3`843!9R?H>E2- z$+cYOVq@iaOUMSnF-j6LC1@1X*T4z0+Q?v-5m)=6d9+ci>JldDG>%3GirL+Edf`KJ#fV zn_j2|)hG^ld-IV!FxxO|R7f-MQ_B+y==k_=Y8_b_8dn&Q_P*;di#uV6Psfb%4c&_v_2* z5l&2toep#|RSMp1ovT-#15RHm^QjurZsU}NXI{%re3TnIV9U}36)=b%HQBMDMnakK zyj?AX+7M`sN^!GRDMwA$>`-;1v2bfk?7?(W<|3)Y8Qa*40Io`Phv?Drw1Sml7F5K- zUQD#wnjbCmArOa0!a>7wIzJ>Q)Ser`p{FiI(18uiXWlPhPAOw-ZBgVXDQ$UjOG*Xk;1^z3pr22)h% zLLP%$ol$3Vs0GXn)gdsS<{|0tX^Q#f32EjH$*xklx~GA@V9!7Xd!@2#BKHlWF8#;@Ljg88eLrOo6$Zvz1AJNo8GE9a+m4@a-*zs zlj6o4+!S{#z_W;5vlo1!{Fu zK`SoZsbATWSEedqdY=IM&vn3H87J7Z3AI3qo8>hmMO$Mq9~S*23P<`H}SU6Z2& zM9`TX%7JyF6 zSmK_;wP>Jr5_Y^q(3|-H_ieUV)yW)Me$=;X&P#V`BXx1S_)OqnoDkdU&apKr$#EIM zT6TS?m%wF|BnGJ#2wX-jSX8#Pbba>UIQ(Vnf5g$J`X3+T=fM6yy?^(cAMPLT-t6A9 z56S;Caq9oZG5CLGVf-oo`$zeCPUduQp4Z|yBtr*x$!)ORU+P5Erx@d2Y?M^5sLs7- z&jJj&KMtO+1JHsjb|Ad#Y*gg=ZE~+Sdwhc@wl*j2)&cwt{>3^8m?=C#IYYn^TpRI@ z0&ogH!bD-k#bO6vK`3;kM$K`jW2aMGObeagaX?y|)m-y7C^>@gs#pO&V_kI?d^;6A zpY6BXV%}L`VczXxUV!6}`lt@b4l+x`!{c9-C(pb6960}GXWqLH>HLpIW&MXJ8R_#s zj6R+JkMVQR|63<4eK*fD8 z9u~8K@eAJidqf?mR(5Z%E~e|{r8x#=*FkRzu0Rdnu$Auff#4<|?prh)6Xn(({Qj5}C>=3+wT}arpl6zeX$e zQTPAQ`QN^O>1X{Tod0Ar()#~l9IJnl4D~;s^1pnPpO*69ms$lv8ez?;dz4b8kAW?dpe3#>s|T*)lV+@ zR8k5L@Oe=7qTe^K89#eaAG24gesNW3y*fA(Ww3z^X$3HL1`Lk+R88)DsaB-y$M~W; z5{Cub{T+2>GESF{l#ts-^N^}9%TIZrs8@Pj;UzO%04KrgJJnEjK6tKY;*0Lv{6)8m z!21Vh{AD$1rL!|l%dLp#ZnK~5_BzQNvZZJ|wV33TSkvvKjj+3H;kf41bh=5Yq?Tmp;lDzsjHv)`tU(|Q@)DnxB(0_YFsrt5xZQbG}6U> zxm#Q=3q(R90K5Dwpvcp0v7fI8_+c^cn=-U^M75Elc&;Eg`01**>RYMabtGDBuRD|> zxFqrz{Izwv8Z>tn*8_S2K;7mw*o*n~AbtiADJ0CL)753|RZa?A)qX^#B)=z>y@IG; zR|CeFM zT8n)%*!9b2n&GEP@J+Sht1njd;BGz!Cq(%TylTGtfMIM;pa}ddxclTmO-<^|LS517 zP!;(F5`-QO*-pNptTH(QSC`@lfw*p?J-dKM_y---GLF1yRJ%1L#6%b2c7wuTrL$tS zy}H;2J$Eb=;jUz}6#=H921i&PVZPW<*^U!hk(0&gpm+l@#KDOY0txI(TKy3Kvm)L`f0rbL-h?Z9D4IwOL)~{ah<{;8n2%?Mgm(J{E6^nPQiX zAf+Atoyz3_mcb_PQWx1ufAcpDZ|wSY8PU83BB>>}5Pe-U_@Hp;&KBE#{`!2atAxV8 zY!A7)#45vogj>Swy(nxdawyjl04IXTXCy>&q>D?MB6#!tRa7wP|V!_m1@N zEo1sVL!nyr22ThuDIu_^&lamIvBSKF!WevTWKmsv$dB3YYE-=G{6<3)^WBN@knl}uLfsJa}m5anSpdtt~%g=+lR!@^xhzw422Nf)Pb{Ic+6J_^-VTP~?zqx%?GWhUTwW*?LhQ+HCqhZlq0erxu`M8nyoRU$ ztpWkj@AYN@A%&0^0?v$jAC8FIMiFr}ui6MuNK!*+fYPh&xpokRXqCX3vH=7)oegFA zfJdQr{@wgYb>cvYl3@P)$4ME~^sRNGF_Y^}i?hXQ1<=>0kc1!hq6E_Tt% zJKjO5^fO(Ux%oiUcFO_TwAOa$rDus3w2SRDA%n!G?vi_^piN2HXjPtFLRxpbCf8c} z4@lQEdr~SAY{Ge5E6so?Zp=~Yx!P1h=+aN-yqLYzkx>Tm&7vDX7E!8-;>tVDUb}Bq z-XW#3{{^de_P?@QpFweYyO{@Gt@y_|igNNfYj_tqw(?bSzxvQy$JtotQfm0xTubJo zOTnFI_6jnhfW82B`E;O@_BxH6XSNZ0rZ0eqJJY!c<#nd3;g`Xx!KG2Dl}}3BPhjVF zdD(YvnV{hoXnK_m)uOC#oG8gw$e;t2L35D%AUsWmtbowtM6l99wFiUu*8p#9T991H zC0vzmTnuRFwmfjx?pVpg@6mDn7+-q;nxlp+a@z`R?^niQcxz3f-5WrM*1OF-uA}YU zYtdcw`mW0rdh||is|`KN4#+xggZ=5LA!#OqmDzY^H zJE(niMp+$xuO_<2{TsS!`~4QwWFSw2>`VX^xL4W~Fwox@Z+1E##O2nN8sHO4yJ?rDhI$o3YXMifkqNC?u^)RU4!k4t+j$!`9Tu{elzK)|>Fq}E zgc>w}C7z*ys*s=rOQs}5k(tL1pn|auCTUNLInJaJ03C9Bc!QGa1oZ>Q0o0g4r?bj}9awvM&3<&$ z)0H-`-vMn_moBCtHy6XD+JnVZAti-WFEFbIDN0!2 zw600NO#>yqrsXJ!kbc}DTIQ?eAT7QBxWla7C@qIuV;Vp1u$|krJt4u%n7Brnc)%li z+1{Hi2#Pmu^oZ&fAK4K&mZ&y>eE^-*T#Z9+wvM$KV3mqEAazs2iPy+r+xoNDuYjnkP9Dhwj1AI3izr4~%+WofXZATC=|3amGql;coNfnS_ zp?u$Z?a@#`>_B9(aGar-Z++uH&tuz=aL5sRn%mVakWM@9l}H2rusirLU!Cp2PmP>; zDq20 zJEexGY=>#zFMD*h%p6BOKa<)~x9rXG%8r>A9SF`V^~QO*ZO(`*Sle??Mr8rjxNXq+ zn?4J;h6jpm58jaEt6{Q?iPhu9R@_C|GK|}u41g~mP(M5hsqV&Xr$IhkbnV%g?K0rV zc+~1<>cMg`TkHm9Xofy_POK5V3Dqe4Z`Q`+1>8Fr2ZP?rwHO%J>#B^0aXgpZ$P#qN zW8?7-zZ_2~paI0&l|?J1EhP436ao0l**6`gfZjbFIEsG>ZUT zZgdGIe9a^tD3PtMAvrT?^&Zm(pc|SP8GT(Zh z;B*ClD@bawci^$Am>6_joxw=wb8u&UrT$TUpNH7-d8Gb})qjclFIE3#>c0&L7~0o$ zxq$yxFV!*>yIjv!1BB_qAZhe-D75ruhhqXGrq0vfFrCFpTju#(f|Gm-0|#Qbx`F~= z>L>s!a57c@pRd(Fi!(Ki#ZCuS&%rSlyj$m|D`2H?6blH1)J4oxyO&cnre!|WF0tTK zs6PIW+K&7}4Sjn7#QtQfcnjE}jjn;S-A@tD7B+LICjTnmG)w{0K_A+U4K27{M;s9? zX1S0WVAFm>=?N%kuSkG8G2rh|_60pvu?(=QA-JMse0)(A9(Dl9Vsj9ek88$jrjiDx zQ(?pO&En_98e&7L4Vva)O76f2Zo7Vvb-&4~42D)Zh}?%>G(epNrle9RhFR{xA8p02 z40F+yH)$ngMO_`*&m5YzviYo~st-pYM-wp?!u(?i3n+(pO^s8@ek z;Y4*jwCFlIkdr0#GK7Q$y$a2xr!+!e#AAz4+OOXB-sW%nT?-DU>+C?;kPW&SxJmnN z9NM)#8fUF8*Y2%5-JpA?TU#%u!=AUtYlp42SbzW*;P#Df;H2L+KG6r!-(i89L@X0h z{wmOgVOR*&%f6a|(_wR*>5ckIRgks;yBvgSLK#2C7{3b^AnU+uqM-&oYib(?!35qf zASVZ&>ZVnLuRm0m(jr_d8klcGNe~)Oc*QGFvzzNO=BQV>>daZL9+g8EM&$tCLIl3k zEkj3t7J5?7pSSEGKe|(sGd`kn4K^WDz5he3!iVOu zQG5)H__%e0cMfK|=;>58wM-Xl#r$ptmhsuv1IgY!%*iSI7~DA0{d__ET zkA7DlClA+h*)CW0)x@=+eW|5{?j9w*W|m$0fE%lmta*16pU@VPP`x>;ZB{djR9;08 zs-oK&EiLj%Wfucn`vDdNuy4ZMRDojJTk{^a*5-KUj@9F>ckggZbr`F49fED+Znn^O zk9DqrRC;IOh)!Fr@nP9sjEbiUu}?V8`uUMI>4?2;qom&BQ2CD)Ekv&9&cM~V?Ao>D zjuGWSbe86bt&RJBlN#vgcYMK)xbmV63~Xupt~YeUHxFP*6}x&2z3NE8X8VyhP6r#e z+B)CPU4OUON>`SZY2rL|qh|<5_X)ffKQDAD`_G+CaX<}7 z=SFT9=*Xkq)RLXe>Tttt?H)6u{G!Wfmd{Z{(9O*iwNf8u3iy0+dWxt}zM|U9D{ZRL zaW$JruOiyReNj=`))e7*0XbhD#s`|!2a$t=QrWIY0qrZapr(iIc(F!ndL6wk^wO@A zlBj>ctJLsF--1e^OoH6Z7GaoxXlXm3rBNg!->ib}(_+3~&2w;+LYV7QZnr_R1b7|0 z&D&bZOx796yd_MSq=6bIXihB(qOXdLu8~!nxWg438n|`gafA;%o1Fub_|cVBh#0k* z69ygo)3{kp0N4qdoEgiOt_|cskE?a5hVymGbOL2G|MkZs56GU^YmCURrT95U*bqJi zgEEg@Y5bSYK=SG5m;5=9|EE%0=Y9H+^8cnuM)`k|EF3}or_rbUpC9R`n!a~A*l)oj zy>l=vFqLqjT);D(>Q>h?sK3gKj_78l$`j8UXJ`hro z*_etSiAz4Bm7Rq3KbC)7}M$=@R! zk%AmUwr*r)W#e4aQf-Ek(P2-O#Kwl;X%>0Ksg%S3)fOIe^lFzkzfPyY((# zf)7#|x8p$TyQWkU&Qc##C&zDp)2&5k zl^qA((N+B!YXgILTjm#rU!psZ35Gk*x90=5Ts6hash*@aoyEglg)AnpPL<6l-_>)t z4OvaVBgPHs+3qhi+Uhs7vzMMbe(9_)2D~fWfw7b;Q_gDG*D(4ATey=m<-4sDS!rz6 z&SZ}HdP}9C%x8;02z6TM8Jrh^UMS$YU@a=cBk#7FS`tnlcn`w#4@|EfvSt7vX87mX zZ)%DsvxZ;24HV%Cdbga1V0op-Hv@Hx*l+Q0RKweX;IkWdf)mJ^^VyBl#p&)G&$0db zSIma}Vn4O}f4P`$@{QuvKRW*xhGCWv|Cc4BPyFA<_&KouiW|7RoNWsAMWnuX_deS4 z|7omb0KNYs_5V-%|1o~r@Be%~dq*5-x&KNM2(wX`!2YM{C;9KA{9JGUr^RY^evxlp zZjWKR24OUaBC$gJLHRGv6l#F}Zy3i}93@Kd1Bo#Fr2qRUKZ-31PlDlbG|r-+7wRq1 zx#@OT?e!>lQf!v`jp1YzV0eUjdhg-j$&-6e@5494OtqnJG&>f-(8N@^nGAkka200mJo&^{GkKJtaX*JSZNroeA}+Nt1~%>o^*DW?h3A;}|EY1TpkrPYq&% zd#&D=Ao|vkVNaMMhGzoy#L*;bxicBzKC0o(Rv(I1};FyN+y(5uKS#AmZv2w%nOWpP4L-M2K133^5uqhD9IX1;UH#u($72@{Fp#>1ABBE~Zl$&@1Wts{qs_e?DD6p96FJ4QS+ zQ7F>KtmW+*+s8dHSmu`fS>-L^9|-w=TOS*xYxc}r73>$0{7H+TG)AEQzrur1e!Bu zxCRejZ}C&;XfU%9+6Lx?!lK4ZPWc=l3Yv>%Yw zD2c^OOMq<#At5Db%VS`E>=PMl{<!j!|E@nAoTd>{R;#nB_;KDyJMBHK~Mc#@oirl8CnJY|a zNsYm~)8|D#23#Y=1sNYH8Sf=5v;+@C&k)Yxww4+~0NagJ!gAR1l!U5LCm{L6B37Q9 zMIMiA<04-ub*8**oftmIfnacx@R-<=_&2;^ZTLl|YH*ucHdSxxw>`rn$-5W2dmfWv;Kc;d@@*ytvz}a@21=kg^G@!%dU=-153l z=6sI3T`wErd*SLvhOlhS4GAkAs@d1_R@5FJA#?Ic!E}AI@BSLAV&>#HH8e5ro(-5j z()uEEVEv+z+7hdovM*@^JGaT<^RQTH+BIWMNcLX^{6`aO9ZMRAZaG1M*U-$+0=vg& z?}2DEg;vIDeU@@Kq2&I;6rfOgYVfpVnfff7 z^hb#OIU$QxP=I$QlnPX8CD3kNa8jX6Q5m=)-@DDcGyRO_kmlj(dT-fe^iGh-;z(ii#cvf2f)ZKj`?}tlrs$Vn`m|3 zL+>_N>FkmuIIz&qc-6gx|I~Ob&fbC-Ogj;0E*2MH_5k3VT0*ux^6^&{F@uwnXs99C zC6aNS%i!enS44zUNNsWwr=HrnbiOQkSxqwGg9&6HQ-Y)Qp5RfRNXF-NX%)-bLjvOg z{E_cjOAS18Gh%(|S}53-si8#EPWD9fT12y|RF!7XJF8{>|Do1(k7V5ifEe1!@4KnG z%Nx$f1?(dG;W=16wH@=BA4o^RdchM-F?SxSB$*zN{>xpO9WZV6xb^-7&_QM`$7>}k zY>yvfPCGW-4v9W$+PEvwYpr_PFJ!eAye<8m?XeNo)JAX9E^UE*5HpRIHRL>97R!1; ztk&GKeYaNMTPIGw&Xy*GnYtQC%bL)Ux^qr-yR>qE7b?RGc>0y7{P%HtzTg1WG9!Ov z({Ctl`?S}IN$Y4nhN+~FKt1pB=~~?2b;TX7t?AfA5|q%y15UV_K|rCaWDCCas_dJS zT@18gKX?g(frv*m8vv8lM$ysjdjZa$0UIL>^K1vb=U3CNvVRfGYTIuJ3ITv_ z%d4_`hiYb)OzLLg!@6_lPE|gQb`KY(w7j=22a90u2;1FUI?h4QWDH?A*`rd@JQx zlM+;D)lE)L5=S^14}tHws(ozIL3afLw|i`piX?B0-?K9=C*^iVt)EFa zvqluW`|!l;QfXDoTXP)!Cww^NwS#2Zh+$v`tDz|>$KhQZ$OBzB%{S5F(iptb_oc-a? zI#)hlj^V3JO+yV|h8D#C-?Yf*q%Yi+_b;9x+)#rJp1+|klAx)x;?!Ra#Gbn({7Y3w z?hUdZ^~}3JlWG2t_MM9aF)qZlVvNhG^3qy16(mCHR~7Fp9+)pARakeCn179I`B1CR z?URQ(2+h)2D!oi!v~@RD^pIrZ&c>7*DSIM~2OvID3;9(=66Tf#QZdqj6q=$)`(6o= zxl;*`f}Hx^r|Ju^(dBdaJgX|NRaef|5Vw-4^mPyE_SeXBD6d5EAMM=L^-+V7k`}Pi zzpUzF{r^mx%K*I=mZt&PXYN*A4+QVqKTH{{F>}9E`7I}v{>vZw?7xJc?oUln*&98VjA+eexJ1sjr-M-qnWr&{YCKhJLDBzU)-0!pj6 zo4nzmTgrT<5A6O(yw%9bEA#J#{1u3}u+!6&mi0NkJ&|Fs9qTiG{+TZVPKmE@_o{x?fGNn8%zgDrerS$xOW&J;V|$9rNS z%|?R|)Guf-T3zK*F<>iQ`qzSr9;NvXhbSOfWpd%&&6LGT6y3FrSi_NLS~;MhHa$?n zF9m{?LT~na#&**-ZmJjBRVg2N^U;W9WN;->>uSb$=|~B!K_kq~M#g;VUl6nu=~S7> zQS8OstMqf!_biEnNNV;^(@TkCCl{K;#GngmxERS7FJkzhrGJ;umbdcL4g2K+P6EUJ zNoyxzb1gu259#^mOYrJ{hd)D@3=dGYgX9pGN?~CKxx;e$J^AIyK<)GP#ji{p6$ z7xNpIA63~luYFuw6UGK&_8N+}>(4tYUv`A%&q%GnmKD?OND^$+rIansjptWNo& zODVR}dly48WNT@v*g5WeD>ZpVt!R6oLqoCSihkX^I-cqGJ^N!bA7yV0*Z!VKA1Hsz zg}tkW`*EkZ!j^8OI@r?G=F|nhVk<0Pxrw|sif`$zG})kH=vdVO8j!|*YbHC={Iezzm%J8|`E%wimR_x3?mNP)Y&+rY0nNm7FyH%NDhxuDmvY&`CJCPSXQcuA-t0`;iVj zNTpDZ&ReYLt3mX1}l5bpK`_DFT%WQAnv82CAbH6IrekBSBsMmUp5j2auX;6WV; zpJa?H;2`L1bOVl>5M6Exni2ut$~K0f&qC=H+X^Q`00@Im7{9>*!z;16eo_|jEKFv< z$HSbB0niR_{xB!0dukORr_?9Yd@%)u9#3(7!j_J2#_OXnd%X5D^+~*}F!pTDmZtvx zYT7EmL0YBgb&_d#JJ?*RU}8B87<1^a$BwgX6Q%|>$E1&oeAOU>%{CuOu%h7OPk4H^ zIe)uoyjrU)FVst&HWa$7biJ2wR)>q^f6Bf2VF`*inAB=@)ryjx%dR{A-GmUisFXe= zO*xX#ch5GF|Q1b&w%_1t7q|IrAo-78U9N1O2FLAB_2A@ISWpzt8 z^CnJYRq~l}MNLjlNf8ky@v^}avedi=FtY#D=wX549lu`1{g!;i&@iA=P;H!YT<_PA zU2`!z^h^Wed8HB1+X!}+ZT;l@T=dNfIFMY7V(cx48K<+ATBZlm7DhgWNIm)B@E?r$YG=&#BljQ z80prsk;udx4a#Wc%kQ-cZQZu9xe>L2184TU%Wil^nHKELH|_f)GY=NB(EBSdg!+cB zG$UTCEqr5C;I}p6v6u7F%WvSU%$N?T%m3=3?xGEdxN}>p1D=Tq_}v2j4;(K*c?c`r zULt$ik9z1(Q8lOn;;SC-sSA}F{xYDPAP1|QYo^#gY7Uja_-4-7$B2fTvbzXxWhlQu z?LJu$^WaeHV`l)^HsCjrwO#Gb>ISP(O$lWoRsKFU<`+mkG&AaCczi2Hq0jfQ_5o=^ zHJ^M94jfuHDpI{~(K0hO5N#+(uO!@v;`cHb(aK|}x$VW+b_cW1{)l&>MqE&sr z+b}Bf#~V0Ut(n~|i_0)5WExRs11dzSg$!v&h8L~xp%arl<_%ofhn-zsIXxZhIaP zhEp=*iyf}f8!Y(-VM?vdShaND%@;OSUz1g8o0kQtqS}90UmY~Ey&px|QWxrIYOk=q zA5Ge_03G49LZlqd=BH6GO9!z5bIrgf3!7P%ll0{G$s-4%8gxAKDNgW+mv`i=47DT` zR%Jh{x)EWz|4Wno<=3R=z}An$@mSO566f?1e#C;~9`bbeDjUB5gth0b{@$gFHemFU zl5BrkyR|?$?T@!f;gZrjZjFun@;-E`OCmvVR?_P2K6bhKImrc!Xf+bEjNuTpn7ojt zRy*+*gB$2=$#Z|aDJ$*><=vR}gH=Y|>IBvoP8*G)jhe`I+bsPFrFc;jnA+A`^lV?f zMr5Ql_SFN(8lF|672kRx%$14h8H_TF3?IA3PmWV}`12)Z318Gxi2LPlWd9GWgP!K} zqqXH3p>$B&`JR2tVSC<{dWPndP`Y#WU$?f@9O2*U0u?trzFVWY|G*8FZ#DfDgU)NA zwukmzsF&N!d3tUiemnZAgKl(|bvgG_l|AWgbO4+xP3juU7lS_AwZM7D{u}$@R*+b` zUN7==k7~)hU74lh=Q&DL2_)Noi&iQOq>XrH1UmmazQ9`bEKRV2W72ug(l$wRcHVobihPkBYc+K(%a+|u-u+m% zCqn4LEpR=XLqwj(@oEj?q8BCgT~en;D1ccY3w$ViBOB2xk@Zb-7*XyatYqi3G^8A* zu+Y8QW_~fn^+1Ev&0Ty1R%2;%wBm!$0A#yQ6Gz?brOJ;Sy%Brd7_(mi+B=sPeO+8E zeTOK@v0qj!-EO6+S8ugU>dF%H46x-oUg$9?J02RlMjc@uf2c)`CqYL zS-+OGS*(%q_c+Wt8y)$F934O*Hs8n4r5#IZLdbv zxXzDZtL##6A!y~MBC^Z|LE#Q@p_8a3SZGpn?=Nv(?M^%h%~G^h#Ii(CH#IccXVyXY zioEus_K!|ZOHu4nJdZ~<6Z?b4OB@-5ziWS!oOmS>H9q_{S3~7&2b`m^r7^&xE^l1V zOmx8VaZeAu`6+Ud3gMUeFc7y`rm1C{GuVzO<>>Mi73-6e^`e3acjKpitCG~c*=aGp zTMxS!r?3Klp!DgoWb#)&UCwo=&ui0!)B;Gly1*ZtqxXw%saG^RPoi zXCn!9x*6*gn@?ep1c+~*pbaQ~H;f;Gc1m<}9iWFkxU3W3mJb)f!tRLx4wIGu)(?e^R*pr2-=y$ zk7BC7-`E_Aud(!}G(dBc-~J~;FYK4^jQtfjD!oV+*!(2{;GL7MiMXL7&{CbS9^S+yDV2aV!+9q#1Q$XIa#q~CS{931FPU#| zHTbDzQ;Ph3R9ii>djy#(VQY2y4&KL#z(1W9hJ*4eQVu~CnAK|dF6aBm_vTYEiVB|9 z6QN_v9;v3A_Kp^P)Q%?hYTck`wx)wQ&R?INg-XKWTe6>M?#bR>+$4;k75vrTTHidM zRzu$lmQ9d~Z&O6t*qOI)Vx~Wvd%xqw+sofeRtLUu097_-syPTUFUS>Vxr@xIjaXNv zk)KeO9=j=vy|o86&74_=-+@|AZ-;kvn0~uQt}XQU5EOI_Kci@fQNL!hY#QYI9I!Z& zmVLJGesPPkcX_y0U$#Z-^~RYDx-dntvx-rwgZ`|7RV(r&e$~W^>)d< zyUq`a)goDg)5IF*$E-^o;tt}V3SMeHZg^pPiUWCHQ7CVpan5|Cxy<2R!j&82b{WQg zBNc>BtT|Qrs`Tenc&tot%SXd0!RMWW<(q|BJ9(3V)xOTaubmEMXH>p&OsHB;-X+Zc z$J$V*u<9u8uuAz`OQ&efZ<{aAw%wLzW1VXE(IY^?qqv>}+?N)cQhY*_=)lC^nN2}Ns9X2~~q2WIJR2uwX5@NNcbG6-kX&aUh!dKa9Q^h108cpi9j zEfsw<8+m>k+IbdUkY^##aEBhM$&=hOSk6{er6!&+Dc|X)jB#WPwM;LVs%YfH^%&m^HGu41@HbUqU2GoinrWveLWOAmt*dS%BANw(-UvD zC61&SWgj=5u*f_MEa2kpYqI^4^#fuAX+WQkDq`$UGdc>J{MO~A6EoH?Z#IuJiYd9d z;J~tk@5tEbu;gp;GRb#`${$swYi5}#U%rV8jg6A;(iYkjtWz3R%XQod1@Qb=vj99p zY9uGe!c9rt#|o@)Vwt?Y@LfrqC2}Tf0%MpCvzHiEjqgEoiiPoW?6K`?jRDGQq&?8J z*f7=Cm_Y$;)?}h#7_QJO!*wD@wK5xXB_AUz7bROk9%p~nURXkr2Z5-+roOcDoFesn z`j*eQUSgMyTul`V&9B1Ta$dVzptfp-wTxr7`Ra$AlU9Ycg_jI&_1Nv(f&(>Z?w%-Q z&ONO&S<*74$!#^9ttfTDHv6zgb{>3v1V zm~X_INDRi7K)t5nj+(G+Guo+D|Z_S1;I!msyDMtJ@Ih{}50mSY27OFl0ay zHEs(p;;qH}m<|b?ci*m~6@kJ=FI zUm#Hho{PvXTgkN^FHOjOR>@(^f+>B@p$&PtY6+Tkmh%netz#ZcLtg+h-OYBUEDn^$ zGNBZtkx2I~wLq0UNVT|5wx3ba{n{5F!Cx6z=*1I`sbSYc`kgKHtkG-w%`VBW4+7Bl zl{2P0cp>6v2mhF6*%E$VTs$;&bi1tM{vou=AHd9NI$i3jv{05qL7~6%#I(zZg$MUS zoDf$s&2~-pxQ19x#)Jp?o>_}l4!0z1=tm2 zkpb586f}=+D2kQc08~#5+weiq%XP9eZk6qeC&hMRYOM2c29qPj5AyPmP|&S7B;5Ng zRT@sM^;gRXKd!O9MT`4f znTFY3-CNnO5Zq+!B=VvNe>(V(*s(uU!d~NgDsrsh;PS4{6ctN{mm3~@nXlPqFt}YT zdOkVyOcfIJiYOpDdHlvJ&&K}9fIfC#@$R1BE$0G_1ZcwLfQ5WF)|!+_z*1X_g75aX zMCRVP(A%OFo$cl2T&@Rl63p$k$ncu&7gW+|mXH0**mv=r2zuLEc*Wd% zSQCF97`0R2h6#^RFqdWqHI*bec<72H#anOt}M>g*e zk}_G}U=6x~+WTKxj~qkPD|rW$erF}QvCZD7cW#Y@>OSXt#}E9V1a&YJi?4W~gWhol z4ok~=8}NO+64jnRRGvZ9GCJd9@gyCsbo;;L?H>@>N>GYqEo?4qYwAzU78i==_iSX+ zLEa>4B(!?^RA8ZB)Chjd&FY45LruGNYHN}39Mb*MlC^#oRjY@Df_o5Lxg2etdl5Eg z(O%hadKZgKBJiLXC5iG`(ScEE5oH;NR~zrP=1oPAXy?CiC*FdO?f-5?X3Kk40*zLs zkQ=|{i>|+0yD^ylRY2#En4T?r1>!w)uYzb2!5=Sli4syVzceN0^itzw5D%bxNQ5PT<~l_2<(M1Zak)YQiBy*i zE<9MrzaLMdu;(pXpHs@_CE0X674!bSqUc(_R-zD^I-&TUS1CDrAZXYHRlI&k_Xs59 z3FM7FPG9PnIX!AZ`S{3nCblsCkD@llG3n{$d&yW7OFwxA!5Z#4tSddH%L7Vx3tY2a zs{wPA8~%gmq0S;hrbL?57=lX52*NjQE_%7`j|taSrn1I8>f9hvD0KckkD z@(Uprdx2u{QwJng$7agXQd4HGbZDAeCQD^RmlF>4A{&o)8^fiiU_D+<0Jg2e~*fS;b!4h8Aan|r3LZ((}w#>&vbK=`Z`1KHTl;EZL1Fl zijvM=oEApGpyA{K5i}(bJ`Xy|zJ|2Tde31_Taml!*5PY}b5A4mZbh?hr7Tc2Xb^%ERW}_BXnY~!^l{NGQnVp@0t=L-qEnIgqqw-Qd3ZC3n zsHc|IWy>W7HG4&vj96|Hn0ZU)$gX{-k>xS3DMuyd3gRK}hR!Sts1%l43GF{AR9CAG zD{88B7%oZWjz5W>1mDr08hdMKlF6oFPA)xq+oEaS$ggpzuaA)IG`ZBUq=ec54&A zy(-e)M9`NGXJbYQ^K~CGq#YN|4K7wcq881fde~Y7g$3fRLbiX2B(qO{K;$6zxZbFY zsvL1x*L*ok*5c6_xJw)?hG*J6op!P}_`2;{sNVescc@$HYDILc@&2muF;u}#>Pro! z=qFCj*;Y@mx8nB(_&k7}>uxBM{e#ga$%LL50MBIx%Nf_O`8!D7ebRO)5AN@C8##EN z@HTFoL|2V&I9Oc-ApSMqCt7tUjhC3vC)nHqzvoOpybIwxam^R)c(o{E`RBwZz)vc6 z0C&1atHu52U585ha7{`wy$e!5dH)PhoV}IosZB47c)|tL2n>ckA3yA>bJC2A=49Nv zy#G9*_2Lpyh*5I?QAyIv#2FG8{VWt+nMDtsSq5x868O1K?05^wBwV+dhlV{Ba%q&B z^n$tf{n5CmO-JT9bai+68i_5YNo8rJ&bXAD)cp6?ntqpI#RTV&2twQp z$!u;ybdN-3V+7_cC5k&8Ng$ehOv13E6X%Ra-7koK*GuP4#RL=057nZH zbd;sCq*dKMS?fn`9$i#H|thgoeG+ZMfSKkW3h=1;Qs>brRV00Mo zR59c7p;AsFwbsz&v@R~y(CYwDv!s$7d08MI>)sQ$^)vo6UVWjIgK5)sWQ^)JqgcFj zT|B~t>!A6Oum^3ux7zW(koVD{R`z|BvOHe zvBJ^a2W}nWFmp~i4*7A!1D+<}#nS)KiN@L?F3Tn+Xe%3@(C03om(r6|$Z+Rw5>)X; zs66T>JfKC)rVBi1ve*#Ws(fsmAU8%XFXsTZuz5^gm}1(mgK(az8-&s0>6&rXL5UhlW)XE~;N z|LmJ&7F5fcZWH*+TEK3l=?go_TVv+UDbY}cAAiK$N7ig0!Dx=D@QfmDc{Xuy3ikSktYYU8tU67t^@G>W;CCd^4ZHD_L-GwITYaEVQhFe z_dlJY0=zMF)x~c9PPa3_K@>2&f$vHe(m}I`)Qho;qc0hOIrXxFqlXJMwHgGf&}sN? zUO0<(=H(}>IKLo&50VqBG1RO^+d3|ea+j)F+UjsDI`g_-!Cvo`PQRMP-D=_8Yc?bW zED+AR5VRongJpndPoXa;FYRjiX^uq%MTKHgd6Os4J#RQU%o} z)v*JzHDc^lLFAE)hn9;70-Z*j6Lk;Rz62PE-X5a%zl$$QbJp^9e$`kJyrL(RQTW3M z2xH>IL%dnW*AJh)!n55M-ye?I&mFdut9N=)c{v5fNhM%QWYEJMuslJ~2{ym#*jy== zi9z_UB$O{Od<;WL*NZl<`gu#I3V#c>?1ju7w|9KAKG;=&TQdAU}(R zMSd35$*lKir&h*_b!LiGQ3A!48eV0@CYB zr}TXRSRttmpI(Pew`!l4u5W)Iju=feaxf3?Vc-9m9Y)D+fhl-n10Y-Tx& zd2~|SQ4LDU7bM9RC9>9pjk#d7uC|hC_d6Z8H0N7}WW|;&$ETLP)hu*_&ms0e*ME2O zd|j3`GwHhKsHtNrG@z67I$wJ|lMENd90Dm!DPEJqf0d^-UK31OMXXdIWR z@~$Te<1}C`;Wu1hQ@aLoI5$yx>0Y>TApvm?8r~PpPj*#zi>i#Jd-d6> zYS=C|Bx;h8~5_e zdzIF=6d3#&m;8nuI;EpF58rU!Zz~mE?ErLYJK0~{D5wz-C#%f@* zNtyVTK=28;c%=T`s^n!_af5`^S8M&f;OJ1m_5^)V*S4#32y95fr<9*cUYwG7(@$^@ zbjvfiT5RBAg8r)r(hx2vGM@s7pPwGjrb(ljWm@oO!b?Hn(rg>95I3Zgl!Z7_e2i@;eLtAK3K$=ly$xq;cxVM^F=)GsLj;tTTHDh8Trx( z4s;^r#WNYuWmq&%&}V1W?Tq}k4|UP()Iz$#neIWqBe0E(NpMH^Z-|k`vapIU=uaYu zr21Ep7R^px5Bj96G;m+LlM{`5d41mTp8(n8CAwx2FX{6N0e{BnheFCo!Vf~s`Vd|( zBcQr#Pxdb5Oejf-XC!F~w z*w$YrOTK+yc3}^P_!tVC0`neRjd>7u?~GJ@B@ySc^+vl52BKP*snTP=JrVHd!I<4H zi`#wDitI1cuy4}V-HSh|VsgPWFGXFL$1$&~-0t{r?zrRAelo@ zs5t0RWu_kh;qfwa>KN^;e;H_HxI~>Ps!(Zv?R*xn`6ZxA8L7;ZN(8EgXW3o}ex61I zTu+Pkd?Nc)@oA$J%^4;K5$~`XZI)W}f}In=c3TFr26X@iNc?;M!~Pq&)v11U(Wsx> zihIFUPPxW$9|#Eh*CSApJtyx^gg``zgw;HURU>^R*`mF>E$RX}y@?`~c7uZ~4# zh~SB3t9Gv}JSVwEM8|RBfznD_-Naf8`ljqcSI7uLm6pT~Le6}gc<|nD#w7$-`SC+T znw{uZ7NOTli8COuBD>l_xIf!}j5w)QdHr@PHB;f^ze;(#BG@?bBLjH`B_PfClmN|TeG1hFj!ciXpTWUi9 zw~GYMGw(ly<@hWv0|vVgx&i~LKtCTT%jR2o!sD@e9HxMYC zB(tT%i87m9{8|5ZV%eLsss|ov7uZ8m=|6m$4*+F9XZ=v;!dVnE``*$XdhF(9e=R(yDJe0%;n3j~)L zfGH0?G(i((3wKSQ$aI375}X1K<~x1OWSvsVPrupZel>tGWCvyqEQBd|wxt-dN8K%( z^%=@Wp=;aXApKS2woa*p5h~bEAhV~!7l2ogmI5)b&s))FaF{mXuU<-^-F}q9bLmZ? zF4e>#Dd;ufEC61aUSb0OKxJ6^dq>8xIOuQIiU1b&wkep2k-1x27*h2jiQC7*kpt5s zawU6@Beh2Q#(#UW$XafUJ3;cR=>Xmu1jvrvI#GmS#hT$+eI4EHY(JCfsfCgY>XfX#0{7cU7yiC^vUr9eJx`fVu3hD|LlN9+r*^yTSNtn z8LBH5FTKM83y5f|=RU#XGe{UWR#9?7^|_DOl!00iF1jt^{RMlOTm;7zdAVzQE62^Z z&^J>s?YP9`=MW)_n_*-BRbF6>wiq5}@4F@n;J9NoaqMb8C6AX?RMQ zd@*ik-g|EBo|dtqBSYn9f6)%o@o}4&$CsQtYj}E@EQn75)I6j9{G4?bTg&g*^_*k> zwTXb!fIoBH3#F{wfhL`zXh|mHd`yd4f#bH#;LEjx(nlt|*e}5Bl6F#Xwo?HeyU6}K z0M1W-t!V+Y`!Zu0Nmv~@t!1OX-`U#Y+5}E!Uu>ZhpEEZz8>k3zsrU)`fLB`P{YUxd zjpaWyw{%1R>+_b+0Azva7boN;m(up#UrNMq&8O=QIO`hkF^Fp4AHLi#^<;+*PS@s! zK3C8{c5?8_G@Q3ha&MS#+8DtkJc`@em3U;rGH@wejycTC&tlM!vdl#)H4X-ayeM`c z2V!YN)n;ZU)57wslw8Mlaq$XZ`z{%TlKuY}5oxLiv(KV?c&1zNte;Vdv~)X!V0OpbKFpbBiz zb+5~KyEM%ezQP+1WUJ05gO^f!*vQ}>aBeb?&*jEFZyDKNml>wi|4b2zF z91)Z8>ifZcki;TZW2NNMRjsdF*F#=Bfvzua@^4A=!&HsYXa>6w#gOw@*46Q$X&!PO zc`}4x^1^MH*Pr_$-|3Zn&G3AXBuwU-a5gfx%Nx*?V9%1#s=#Ny2$>v8F(p5tF2H3@ zpY9{cRg;yi(**|U+9wHjZd$;?gXLm@D1|*mIrb}5e+49j18vp*aV=e3lod?(O_ur2 zs{+-z5zQIvV|U}TMSpxS|1+m@2RF}e|0MqwOL$flFv;zL$bvBn;!>x$YLu?|%8&<} zqyxf(+yV@VBvoVHxUrw>?tV`aM|(EuC)wtv%NDV=oT^WFG@mVgwhxufQ&%1 z2@wVFU_)LBTzzQpYC@mpI8O5uORSJqh*odanS7w)PlwhiXhdB&DmqR%`GJGx z?ELDOn|022@hEy^Q%&So7e(hyts;9=aQ$27Vue#A8NK;i3EaHUzC8;Z7TSEKXlgsn z-gBQEx}kNaMExJGu3_4vDlgBW`p|X1Pa+;P#Tr;*jUvTC%D+Yk+O~ z-039Z_1O8zVp$W>8_;^n!7oN6Vd-pgOckFIX!k-!LHjuyOBsLqgV4p%r!S=)gId>7 z`oZVZ?e+iJ3*zJ!q7Sx4>?!|<<)1og{V%Y7Lw4;AAvqwMrRIuIt(agFziS;y@avT%B7<(|lzr8h`(Y8a zRjAd-3W~caa=2tz^T}bsaqjfp;X7$g;RG$cnV?=t3v#*OyN>)ON+8AIONl)ziu#io zo@1z9?JD>l|Iy#o1Ea6rfF7ffn?)S>pc~KWKa5}4=8l&x9?6_X3AW4R3yw=#Ei3L^ zg0UD`(Vo~-=j@Z#@lIeJl;{m@VJi@7Bvy|QlxK}THQeO?lzH;X;ruI4-Px~U5vGqeISGEL40xBz#sTqY*UvX5h=&fG3~pX}eHQ z?ALyR=5On_Pvv^1>yyN7vThFE!VGpO%^5uTY$rRJE}odG=t{V*s#!G{^<|0$3kj9L zUA7{&{1py$DNd~=H3mQ3-_KFmMQ_}vn;}Hgj2O2c99U=F3zc<|5fCX$4Dh<%Db(jV$d_{QGY8&%7_^#w2ZOh8<^PH#X~&e;r-jQxy6>5%R|cBh{)CM79Did%301Y1vQ4H zqPAePV+B_Fv94g70CboBe@KV%6>|zGm__S z%yJw5phuXZtdLC-&G)qlO+pI9N=i9ZIC_HSCU_wW!35MQ_+ufd#qV>ef2WKu#h<3c% z7kPL9YZ-~u+-V6UrCY;v)q!eva*`l+A%KRIPQiZ^f5SjjzjnPKQ#niBZS`6~a}IfD zAZz|JQ7e!ABlQXER4u6tGAns80PGepl&Vjh`Tgo!=#%$>IPvc-TEQ2G{s(D5mcKWK zaxSN0&i9coDddPz3N+nMQqc=5^kFz>Q(~$qE9sk~#G8GfDURQp8yP_|EVnKv;Ok!WkWzOWHFTiLbM)P^|H!%@AMPGnXBsq6S z-dtU^S)++2mH3{-o0p9_+ok9WFc#gWlf5JoILS;`oSVm@|pTO-8=^ zniW7v(HCGemPDjv>`R&(voWTmIunZ~dsA0)j+A@>GD-2OgHKxV;gs8dA}U_h!S+Dp z>qyy_M3H^$Gx{(kdrI;Ai6m-9am#!sDft2 z*&{Cpz#&prKe6gd==Jeo5Gl34!}s_YNN>&Uh;21#S`#&hOh@Zt~e~G0T_RL3pe{-&!uFn|!k z!R6&_Q>ZT@^~HQWyR}%&i#NyTyNl(2T;m5Mlq}2s1BN@wlFIL4429UD{|JZCP|4(3 z7DoS}ek-E*AHncCoxJPMe!I&zLGT}H5sS@%_oVOtm;QY9|NG|gz2|>^azFU~`410+ zCx7_*;e&fYcW~?0pW=JBZhiCo8~h?U9tO`h`D&{%EnnWcb^lTKPUkDYg*!n<{ZZue zJDni->Y~`?!TD}?IVk>Tzj$@KdvCqk6|3Fg`PF674QBZ1c6V32+1-NXUk0=De6uZf zw-?*>U_4GIgRrYXDYRY|cMSFhgWz(#+2zw^q49h$TVGt}y9IpS6leRT+Q;I}<)+wf z;V=ZJ>rHTPeQ~i~1rHb7%dc)BH~_reU8zPpH6R+tY`fK6s@B0jg3Ek9U#!kf(#tnr z2Ge}@@@%u-ujZ=5<$81SSuuqF1^-g-=jv?$Fqo?owaH;^PJ-2XReXtGAH(13o#}cr zFE%IP<(pu;UM}Xr>+{8~^3uuq`c<)!UX{KlC_(vNP`)@_s;Q_K1L_ptC|@0_H~&@n zjt|Pb@zpK8f@=S7;l6jiny%+p!SqZo(QQ2>czPavxb0K0pr7S>_VR!BYk>dNbaUtP z)pUFLCH(c(d3@*Ybh`tJrrwU#+qUn;R;``wzTRDcWbcai+EFu^od@UnHrSmP>f7aV z{aT?$a9ZTMy=r`-hO}S8z?O?U4|dSeSJOMr)Lt)k=X$uc zQ>78`IJmdpY}BXa)e&^CJ`KJpX2r!+?IaM{@;-pkUaU9uj$y89kqU)5#YMhS7lZ}_ z)4=skkH?B2?9>2`f^B|v)N#Mcjzb0c`1tswAE+f!V_m6ZuZA>JLsExJoprSxt9g)L zUM|&56MU6-&Ns#B?JkgwlUui5zkYqJhP7BOua4EwZq4#tzFeQ((nE@Fb?^M2;`DS= zTm|2%i)y~SvHj{+ey4MqU#$1rAXALyV0yJHg5_Fm)YEV8LGZge(XiF3_no5St7Eod zr}=h=8}#5bfYn$m)ne14PH& zI=HwBUar=!)hHEmEC89dYF>Ir)Rt~{!CLL%rUGl*$u${kF~`|b;r{Vqu4AoYBg;Y%;fcY^Kz>(Nqt+WqcJOPeXofB z=GkR2yY=lxT}dTt)4g-|(X$7dIxQCp_hGuQWF0uDs;OE+Sm}Iqr4Hq*g`N{o2Q_4v z(<&%7oApNH_x60fU(VrVD<)0NMJ=})afu!m`C{3<15<*(fUKy|Qit}80_~X=3In$L z*-WAE>0TWRb?Iz(X7{R;$)R3s<*UT%D|Jir#X40t{7-tJE;sA>ezx1*%9qPRU4I(O z@8aK8vaFDymmNoe+Jt-=sK?)_{?=>t?P~u9%6sSi#{Og+>nXN#*a%UtZgd~*c*En# z?3&}-UR_Mptv}n+@Kn=clLzDDR1-^Iv-#p|p}JU7s~_^&LUp-4ukU$s9IFFxv4(M} z*B(C$CW`J4)JKM%7L%2vbNr@x#Oupqbum-DF4sS)Yn6I`te*Z*u0a?dCuMK{6@*Hf zQHb}BU2dnUzxtX#`?~CKjQw3_)n^N}&c#MgV5_n089l16paP{I>>}neX(KsQxPQZBe6+%VMV*>&s3P#*XItI*$|s2)Er%Q$JXoEf7&ysf%1) z4_k#r<@cA0@dYl*+Y>m%Ht8@K~?4d3&p_nV0TLZ`Gi7 zwvQ(dA3S$DIdWc9m%-p7-_6wM&Fgm`J{ClBx5yMM4@t}yFzy{$I9`{e24Cy%Q=s!O+QJ6{iA;kJ0aV$*LP)B9=;v&|Y$ z!Fm3wz!L_SEFH6s!cToW=uNZ7hFF)^iiH3M4DbzjfMU76giE$WX2R0DiorPw9t89C z>c$Rx(%8DVfW24SGtjsNtOVzg6drVd$-fF##cTB@9uCEWnRd}k@cn}uip|@p!KhK6E)++%b9L;S<3C+c7yHJa#q?DC9CTe&EE%5wmm0y5T zO6`gka#X|l9!`jcrcV^eJqj~`BSKD82@IOjz#Gfr4K!Em+N*`)?qKp-fYD>25h%fB zttQg3Oj-bghZ(AYIwF!VKozR#@E>@nFl0swJNYTpe#8B83mTTiJL!L z?KKOxU7zk==bPe|5>IDa{8#HG71IQNo2vqrb_K$pR$Db#jY3-osZNCOz%7!I6z_J^ll(_ucxmTN>Ej}z1Vg@{MOhp zxH9A2l5mBLz5+I1&-Q@A#ayF+8o-0#LP?E8QgVGpX8Jl&OQ(+Q4z@@UC=kK)(E}vb zx71c0UWJdla}dvilYSHS<<0WA;>D0#(i@;SOZBOO8sIgmpN4}*aK3`+UYTB>WB@ARwzx7&4U&ofGs0l={4fCKP6{&f?$~UmOc+<}E zru&X&wNhg8dUgz}rHJI@}l=CgCv=DEWEr<#4Z2Tu$JUn*YxRP9)R znl(k_?tDYNfqc2y&Gx&KuWrFBcY+!dXu3KDPQ_~Uj}_N(eD+iKPOI0U_4$x7*uV=cy=oal1>}-Ytkn_!mG!?c7)ErB=qe%Dq>31EXZ15oZ?ZU<8(%Q&}J?K@#z*hOkSi>(+tT|Q~sa*%KNIy8PM z!ef(mfU$25Lu!x_oJXzOHcYGeTLDvC_DFvav7#=lR32WV{XkQ)1{m-~8#s+j6+OI0 z`vDNaMj!)JILeT~L^pufREvvpMQ=8Kd-E_vb#D)*7w5E>8#}$5{0jlj%^Y-|1GteC zBHXlKs*exD(AU`jY?gWwb}an)VJK)P*UAJ-Sj$Ik+AdbF*2t|if#Kh_fvCvtE`QSm z&Hd)Okm%I;0n!WChU=ht^S4!qU)^fr9u)tw(+Kq~{?T~vqgDq*H&-Rq`0Ay)vVnC$ z>zHCFc2}-J&&D!vBfFg+vS*-vS9TJF(*{eK}nIx-I; z`=Hp(j&1MtyHT;~iWk~#KyVJ=Bg|8E2PVKd$gdac`Qmg@u1_7vVg*tk5dD=}s|U^} z#k*hbP!_i{c;~Sy`SK+irPL~GxN3BG$povlV&q;aE>4?lmGH7%%(e6ijRrZ`ol(}- zpQpvSx}*IQ()MexV1V_HqykjS>iwM))&FDINfRW42W1>fJ(|V`1&~z zi!Wbn@VD8?`MTHwd<|G54XLsl!R5=#^SpcKPoRWEQLO^|bp`fsOVn#T1{Jg8lk$U% zvD0ETJ6G}#{JO|DFZD_GEh#7!yLV8x=ya)M*X_R83S*q^;bQ+<{i`=oT}Nu0FYJkJ z=DU>?FnbBOt$qdInsB;AWtWe#vn~2h{}yRc4IU^l^tT?6;0m%;A`YyO`Lh7M^Oe@= zfLcJwtxB>!NTfCetgM>+Q~aZm@{rlh+T89v3}zKFq|R{B+!9vk?#x<;FO1aH!QnJZ zZYZu9>B|x14hv%3&tkVeD>OckB6|U+47C@ieMC=(zzEFhxa%|Lm66|Da1E4z*O{S1 zgw<)PVQHr}Fs>}Y2Zp{-xVR}gCDl3AI6?E@oo}>4^AArSqDG;ExOI3egU^?{FA4nT zXS*-$*boJKs)u3)-bN+qKi-w!!w81QljEUYem&UZ{&8@(T(NuK-+lDm{fCdgQzX>< ziTdAdNk5OZA_2`ZH#XYV*=YSMri*-~6+B7;*B>+}ZOqYnQqZ|h6~rs81Vc+jb?eC1 zvUP#Y&K4j;-P#uUW_JEJ`^x3=w=at;b^PYr+h)N&$CuWt+klhX&uQ&$E42HZ^x(HO zUu_z6aG=J><7nF470|8`FSlrbug-irA^X_xi&u+P=jnP|tfs~0%;L|cxIx|u=tR^x z)oPsvqp(7Yg*GIfX)BsGyIO0S9$7hzAM%}Azt_R<3nkLeudH6R$t+(K)9u_W<*of@ zd8~f_7RIu@1^#EC3AZSB>+KgYGYWh&Eo~xU+SS~y2%qt#lyRf)uNrt0&+-g%ru)R{8 z#s#`Op<`=s+N4LT4Cmsdn(`?&?cVv}_b1=n|MuCRpFO|-gB}hnt~?){2iH`pgAF7t zpDPXpEC#zZ8dg?Cp;!<#vcK=QyI{Wp1k^_Y@ONQMD?r|0c4V3`^X|+S;1IRm0B4wQ zb_kNZHo#U1jmb7#kc-FWf=Ev9;^hh19|yErc(d6R2kQffYlp3Us%|mf~(kKwZMC9avnw zb~vktkMDkCMyw|cgTSv~7}}g|zF%)F1br~Uh?*-#ju1(W30C|JHNS8Vf$z)ZrnuAT zX`=>=9Ow&B-5b5Gp-A1Js|^GSruuWgTd2FRi$-Gg$Fg{%I38k#sy|(=@Y<-CNFs&{ zRDIHRoXt-CWgNUb?TuMVLogoQ1LvtxHU{1Na?$M*l=(X78BEaY)w@uqd7v1Db3MHi z{V)8}*lqpi1iWI^RMlE{`~9*}Ph$cAQcu6SrI*sN!h^x|A@?^Tv@$ovldIi1umCvR zO{b?ly0o43C;-0;_3yoheS7ZI+9{#8SeXN0eb&~~zpJC8@nZ|85tXAFrNPYr#D($= z8iWCgtjwtr177Fq+OcS%dJ6tw(BQ}*!4aUq5hB2m-u@%p=p$#Fk7$#R%oZP68)L&( z9??b~scrn%@tbjW8r%si=K`PY^7fvhx`+<T8?sp{< z>9Kxv@0dTymT`y&)}{oP0X}F|AO`qbwK)H?2bF>j!%)IafG&UP1DQS51O0}2qK?T% zNiUi+*K)@tYBf9L1LI?@_=>`4l*n}pMzdI*u1ls~kO}3u@RS%=l#Kvt= z)0(kpdMEg5ai@nGC{jfAzuN8Ye4bxieyKR{uWqRiiac&X)wnHml*g-L05T@|J}kkg zqdy~sbslI>4kgLqC&hPaX93mzt6PgZ!EF$FpnE%-1?uoBuKX~$;O=ZzT<*YApGI18 z@l7uK#x#$LLVY|pg~C>l;*6Jv@z?=3Wf*|f!kuc4XtC|o0c%{-@^zq=X1Z3_gyQJV z_UJ{T1jN8$qwo}TTrI=mV*945XR!J0tQKCTLR?FT7v;#ww9XLsK5xL1I_Q_1V-0j&PkZvM9}*K_?zT~Fv@ zfdf~kx`U5hbL3(*Tkf?yYw*H4upl$0Pqq>}knrxLoRuM)#GuZpu=e<+oGT-Vo8 z=RjS$*cjJaJ3iz~bvEc?RMg7x!$8*+hmP)ySv+_8;hg@h{7YYe9s*tbaQ#X1SvNK)bFSM-k+yfwK$XbZV{@ zM1^Cwvloy40Tkh1mg$F2a~)ij&p;dAH|p6JZ~hTwaclT72H+8Iz7cPssjRRZs0sn z*A)=>b+F8Tx>Bsj6dYTM!hip(`(*)6`Fi}-(7E#OhVvM%@Rdq_z;cFp_8!PonpmVXX^LRD(nfBx%VX>5uy=m1A}fhurd3iJ7# zf*eqeMaH1Ic;C5NE80;q>8!Usj^yh4c0D5(j;{|es7Jy1`Zf3h9U-eqee5_kuK0ru zN6%CKM$R7;{J}7e?crF@cKOm>K=s%?OX1gcN7WHh+{jD`@J@pcYcTtZeIMLoHtS{M zv3t#@@h3jWEr0NgKbUhE-|#o4{K41!!CemH|2Ca=tFTm*G2ayEsAg~!FRo_`Fb){* zeR!N54@+K23-Q!oTg9Ch|JiUPjnA+;{&@6_H=fTZeD~qQ$A239=N}$FfAHu#*C?#e zQ8hRYe$dnvcm_CtdOYCn8PqHac*ib_SHLuHip=GaZe9XtKCt#*6K6)k@Fd+<5sD2a04lUtx?xX}vE^rV8ipKEFQzhyF+R zpO$2IXPG_=DF+AVJGd^ow3^SgZy* z!z)&zlUp$auE5f>j_$#&4!}KKY`}A$&MFvW$`>gP(Dea^lM4zM?ZUpU$$Y@>RM^M+ z+V!8rAkDSf>jy)b%g(e}ZVP|s5V-(jUM|#&z+%}U=a$hT34zHxM;)z;Q!lC6fTRsd z4AtSw0yGplwsf&2-}dcZNmTHny17YDMr;6(F%)14%TNCJ_<>dFszKHSr=W0rBfL=V z|MC9QKR^Fo5pFLmx-sVKot_H#5|gW#j+MSbZLng^U~j=r(li+olFSh z(h)NLjeYj~?$hUkyN~XD|M)52y8Dm5Vc(dQ{^9XA_aEMW_H5A9y!KKZj=O6OuMHkO z9z44Lr-u(7-M<#P|M!9Q`~MCt{M|zf|9_>0|LI*8{@&eZ_mv#^?Ea%?51v2xs(@t?fclP?iRF{a2ozk)`NXqKJyNba>&d}f#>L(Xx z5LRn52*70xwm2u9gx9fC3sHk-e}44*?tcyLKYjYx<#zNo?pI57)#KJ_?GkLd$tr@X zf2X4+_x=hq6wq^oSkt5QPQHD3_q%7oKfwFNAP%s4|GH__0I$LJWOj+Y=G^nZ$`apV z-mvQiW}gmnZi_9(1F5O#y{Nrx)w(1Y!Tf2%J9WRm76C{`i2Ddzjt9O9D# z41t6Q(hgeFjCy0SyFp`8vH(UQgXQqJUtOqY_y6+`_aEK6k87nk;d1eT8D@)iQRJZC z?rg!B1oE_68YlR}$&%qbRZRMp_#wTV+Wgre@#HwT|0V~;(MeDn(q}JD)qiXFukUP0 zNh>;ZBpk$WkKO5d-Nc}ne!hG9_zzFo&3jRiWbFv8N@>6IoMOa*(`BxB{NA=G5MBCu z`|C&BT{Jx0X8RUf=P)Z&TC85e+ABVjas#>SzK%iz^?=oEGHP^U=d88QX2MJ?uTT$X z-R?eoe*fvCyU!myesnFYS#|Q#|Fs!&oYTe;sG||60bShTeD-3h{>#;WKOM%HS~OGz zai;&w|M}A))cN`;uo?kP9$dQ3v^(AfaR&qfpkoOzB2mXN7aRvAZDM`6Gb87qV71p7 zmM}ShwnShr+IFSGXSDB&dsH0zmSg8wZ#s^dBd}(UzLAnlY& zjKVLjitT_Q+dt{6)tY}}7V5psM4#O^g8vgTu^cuWp+&B!W}MnpXs}MhQ`waICOccB zbz>#IFOZ)BRK{zN4!9D7bDcg&vaY9^*u#HgZ1sed%eXeB#YZ>j|8K#AsO6I z1jOHRdC4d>0Lx`=c>qwWY=f4wVm);#JvnlUAz8)MD*+)~0oQT)PVH-~Z;%kPzbj^9Mjl{;9>m+GEq_ z#lm8%Ap#fqn`_Vj&V5v2x>%$wmewE%hNLr{|7p%zm)$p#hbAEE2JUPxz}K5ncS+*` zH%R^0qX!RNoakVx56o83U@ND*VH=%$WR0vq+mn>5JF>_X{g(y@c`Yc-$xd6O#Rb9^ zJ?#^yjyvQ5Q-2so(O_}fW{LTN^cA689|gtn*|Cu$ddvxF3CU_u=D5_k&jVlp>YnRj@+Ulp0NwahtC1dN|HgAa4=}gs&Ix`5mjfI?NxO?yS zYWKgr|5P)#=K9n3b{qOoeX}wR>%3r2wtfonA_JRp4#t`DY1&+DHN`!~vMC9zTgp@q z9y&|wnj}z*ZdCT*hX`Da*4rCesJ8iRch2WY-tx7%a^RKOzFVHXuh;XdTT%A6v*r44 zr@$h7W;*$slC?qj-GM-Ba~hQoOAl^$h}8+X1MD;s+a}tnr=w)F&A^Dlr4Vd`3Gt5x z8Mo9>{`2I)qd(q%`ux7D2<;f&e6cGo8n|*~EGlzy-?U7abBkEz<`J1EN^PeO_tT8c z5i**jL)ScL$DlhBUKEiVq1#_iKziu zwA5r)<+B&xsQQ@Y5Oh2sgSmSyD!izD%M}i#Tq?Y$4tj{Z98Zp z*A%-{@aTbc5GUY*Xi}uwXcYw8;BUFWXye-L(1VF7oX<6DZFD#er%9erf_*hxcOj|I(n!;`d9{I+zfigC;a3Dmx}o9Zcnk;H@p2#gUG1Zd9^oz!-RJ8DFm?` zhS!_+`x>BaR?&dwF2K)TsFwwRAO+0&|A>#$e|g3k2WeompK6FR7^9oyX{~S0J70bo z_*!GD;5EkBfv=LHgO7htd7uuCF9&1IRGVaGdVKC&JMP?#62HOL1%W}8mQ#O2x0!l# z*6(|#yMvq)9Un_6eQ4nU++2v<#@bs?&>6D>kae6 z=>k9BC5FDys4{KLz=RGt$iP+IWU6!nds9rlV&itFK~FRMEn)WI7(z%=&w(Vu@PZM+yLP!|ZyHBnis@}kgpuQ7fF zSH%tq^Y_HktPCwXp_K!iIdm9rPQTz-=%Z^I6`Q^e>FX&`CUs-&SHZ>Ap!Ba-BTy`A zaIsinNZ*gW6ZFA%-#JoW2dl+0ID(fIupcU#Hvo-jR!6VkMt)NbuG%LY-C_R_sfH;D zaHn51z?}x62X46*8ZKlH?)8jwUa#sV7ToBaSUXyNGf-XiDde#?UqgsdU}9!&^x!H9 zy6|7F|H{>WZ^{VC-lcjE-q%4U1fL>p3`_{-RY>3O4E6uiK=pqxPS1+AS-QriU-UKT zgEZ?0NP>HaU>(Z!Ha(Q+4M~lTJgpKJA00bDYK+@o9yrdgfllBXR5RaMle8nI5JLe+ z0-Jb8jjsL9cwy6i>_G(fK#LDO8*#l`s{^jMy5IzYNu7_yn_{-#6@(K9kori+(W>80 zcTQNX6MGKj5h#CdLnyONueMMttE)?}oFe8vL&($6P`8W*nriNLk979bu)C&g0 z9u&E=#R4;f>7>dVbC@*mpwEeW{!Vlh{2*V=&Vk6QzSMfI=JcQpL^fyYAZ{z9zVj^! zMVrEeMuGDvx@!kIA*rGBnpJhkylM<<-ys7#tXiJfOUD+#I|s>*+`4ZA~g83yg3;@vHSP9$P# zF=^O`*j3Nou?9x>gPKr<t!{ zKpv5udLC4t>ds%U6}D{v)8@r$Z6w`Ndyk?#><6^A3Ul)3)nkH$S~5FQ3D&o@~EW=V$bbaQtozyx|)J_TF<}xPUJh-DxRU3UpA0&O{ou2 z>4%u;yG`v3a2Ycs4YC@LrmEF(b#geO*} zm%;Cy%jF(jSb$VQPtG8F4Yn+hra@=ByDL3)Z0h*>Qek*t!P=1!2X%t(U;cag*PAGAAvMu|beqptrDYGA_M6)(u}y4F z?fV`8d9I~D-w`?_T{*|clYM&XNj;4R>6PN8Q7nDOBh^rH7|a`=$WU45h}Q9rRo7^J-|qX9iD zVY6FJ3(9yx+!WY&jHT(@N0^-Ck9VIoT9(yw_h36)K`K0lwfOdt^Xe~T=PyMpll^So zFB!#})nQ?(06JD7hee-4aj(J%f@sGnF^sR!ap(COZBbfU)RilBg$}12%YpR|@vr0K zWA$Oxceim`Sh0#}HC;bW7gpZ_!#~_FSAA;_vKgFKYnSyFjwP1d0#c5NpU}?NAqB?# zH~{HcBR?T)<;!kwdQA< zZ$jrfeH)el87+CATd~u0E6QX^?_tBG*mMO1J+$JY3o4+e601QH+nrk#Bspm*{`Q}} zsrql$?|(tQV#di0{x_p%Cp5`mNBpC{TKwJgJJiFh3bgWRTKPn8;+5MxEl?aCm{hZ! zXk~5XHiv|UhFJr(wHs0|E>6`pRQK5!hx|*{6BbS1shPWEp2Y$Y0sd>f6nf-*H}ii^ z`G96KHkyz|qcboo3Pmq!)u|S8=`?5^bum8)-crCEE>^#kJUj!_s?nwXxA)l%)D0T9 zDxJ1X*Axn_3T-y1PT<9h*I)Esyx4wG`D^}<@F@D1`gC0Xko>D(neex2-(Lp*R}uI; zh{EGAIu0kv(5$C}y6!NcQtP}J>{koOIFT<0y6W0c|F1S=wOd`?i(>6`KiwdVCee5t zCBvcB%U(l|?j{B+D}zj(vLF<5?`Wq=<&>kFvZ|@zAj?hPdw z!#iECn{^Fl=3vuusWOryioE?zJzuk* zCq1!iuN^b7e!$|@LdW1tuY#Y7&AQ5gmOs7ImT20<*%u) znpx#gD=hyR4)OZeB0+Ba=a`l>S8g+l}v;3ueG3Wttc z#r~oMH^hu8TUSus?zT>Cfye{NH3du{WF46Y6S6AcNbuc0nI z{hQvfzk#~c=Je3si;$}HyGrshZ>!7R;t}k>3?;><|Y;fxJ zgwCJO26AdNwH1o(*e^PD`$f>&eqpmrnggRj#g%aWTEB1Ma-P4mfDm0e6fJ_*bCzZj{`Ecaz-fQusSa?m>g(&Nj}-@Euu(4}JwQ zyvbzp%P=(!JWY)TzoWYUfa2PboT9qwpS+hP3xG8NJqU@yX<8r?}*S;WTBs3kv)~+^?`*K^@ z=bc^{1xmogu7X>oClFU|U&9lqs$!Z}t37`J2hNh@Hs1VCZOsRby>R;T#mW)|4U_x{ zOJ^M|yq4;?&iWA1A!h;kc+;i3Fjm>z8sQBw>=+G)rhU$M4Q*B8e-u2jreotO;AFlz zKo)}oWU+HS)#f2z9cP14{{R{U#r3QIeu7|@G{}O9mM;9wUc7jHv)*zT#QJ|pFw*}U z2Vsc+_j;_o8=`U@gRivs2XtT)(3q(PTI+3f%HmD+3{;)POqB7j(e0~w-5as0Yy7TS z0cgfA_^h6GQAnjfeu6*z_;oF(NK%|nO{w{J!yjElU9YjdkhX)%V6C1G_AByXQV-q* z&wij2_yNdWbJCtl9iEQCM}||z-??;9WF(GHz7bI!fEAv)V`Mtl?NL)>NMF9Oi7hM< zrYe=kL1hely&K11zju1l8JV;rx#oOzlA1Mme_8I^Nno&r;O+e-$d+~K%Z^2(ggXHJ zU|W@EI@YtyCXXLf7eK3~F@a8Xy=(BBL>gcjX}JsGc~7_!;ftrW0EX zOciK#(jfR^PXQ_Gi{dr-!(0}#{c-^muQ<;k%fbeW%20d9 zYAFjl(SLpUf%*teYByfBUz*tA{!U=`Po^iclle(;a(Z%ha$?yDz>JytZw^&nVMOY` zvunT!PVlM@HNaXY*98;ValI#?xH7@_0u>Iy1M1LnX%sueK(*(eD$WGP9lm^Wh@YZY zF!js<-byF!+`K9Vy1olWd#S&d%k6d8sNnhLszGz?y9YXAeAhv9LyaS=^K6>w!eX(d z6C{qVdQ~~=RJ*8zmy9DbtIr76BT2DZU2SqcI5()9it2^lnQEeAo4`mHnI@HIrO}Vg z4XzVmXC1-G8L9&R#{0t0t=hH;{G%#(tC^**|MBQwjs173+5^{{)phZ&dhPREgzfj% z#2WlUp8pG*NhsesJLObF(j%W+gNn&|3YGHI2{w$OWupvy3a}Pdz?x}n1+F$4AMc5F z`~;Z;A@?sl(6Z41vFcpd?0{HxQe+N@$3gEf2oVB?i(?S4I!4*h&gw>b zHxYHtVFd?{kB^&Ps#G9zi9kaqIs>6U#IWY5S|3Iw7QJ~4xl2{u{XIf@qU72`VT=9a zpi+)}TUgog-DIwSvS(NmAf{de*cV6&zg?`LI96qK58roMNq~#3Evm*kxY*WGLzGDg zNz?GE*i4nccA;eCGP!<-Rg|jh!AAfx0RrTq|8=AhWzi!;<|5dMsYU{R8aGVzKEj0n?s*UdCnqxZP%XXtz8LwIj zypg)jAk;&b>cMwZnXQC=R{q=~e+`7c&Y)u0y4*T5w zl-}LCR@3W}30M>NXu$TU$afzItn`n``Lp#f#9}A9lFLF4d3I zD|(Fn&*cC&*Pp55FE3ua84m~Q-_z5-mbp66jg^Ab^hV7G+6hBDYB`y*;HP^JQ>zB! z!E~{+I`DN+YiMshtPbB9bidzsKpw(Gizo!-vm3NH8Uk&vVixZ|x(Ai{piK4sZw61EK6v!}?$;0R zA9p-oXk7GRQTN-=3&>^trDCt2eZJl*GIsvu29hkV6e0V3vA^DpKVElJJ`04K8 z{|*O}zrA=dIIbNI0D@Diorga>eQ3Ti{P!nZzXq=V=I6xqa`Odbhh0RxKJJu%Ycz89 z{zG8#Zvcyb6AhpJ#^AB~u*!b}n5_Q#{x^ur@P=yo8;i||i0A9qitkumeXz|H_mn~E zSL3^_Gk$NNPR1*BrI%5{!@idTb6%xU4fTe6|M*XXAMQT-vv`~Sqj&tpZ~Ol`#N+AH zsczbT93LP5OI?=mTmAJ9{plzD>0kPW7hs?#V)rlI;D%lOE>w5kTE6cuF@9FP{3XRd z{}P!;Km8@aKe4m_JvVmekBaJmMryCiiavYr!;^>i2lwtieE6)EVqYM6ACu~7RIQ<2 z%lj31`r!w-O}f1fLu6D?d`Z4t8eRSzA)ZS+wa3ZY_<{x?z(p)JRd z&b0~7!NkjL1HGR^=Llq<9py^ARM&Kj%J zzu_$0P^Y_3o<4r^*mY~{fY7-$Iah&rq06;8ptfi-Ss!<^a}(Ii%HADHYzq3g^?rA` z*IHb?-xr1o4{WKms*_aHy47@!Wm>ATcu2p)Rqa*n8|9V9E)-O+>HQCXxcAVJ%Wo1+-0XY?g=t_3?mhnDhsTcw4<9^xGWf%@`%ewp90g%^ zD++1Vp$gmZ)!6#i~k%ft`f(jA_y_Z1JgWeZG9IS$uicFZeW!1wgAG)bE%NjbNqdn}Rn^cyO_1WJXwPlJCX z<56-yi_(ADIWmGqXHXNV-fvH!Al`3r@WEe9fYM(vlgA0pOjDb`Q1^nR}cP;mwg;F8!bLDRRejo^lQ5h}R#e-(r2UCx$pO!^;Wc?IexXuW-}~LF`%7bo`Ze68fN{@1=7s87<_=$! zodXwT%_iM&QFfXx${JJCd{L6N8Z4#8YgoG_qb2iz4%@|)z*e_67l4V`>RD{2!=!!* zrGuW4yOhO#0h6utG|&!u8kui4esxo4?{CCBow>-y1;biw5CaPBXhBP-wgz%xg0Flh zpJ~5wt^ao<#kHuilP$ETzpp} zvls?$087x_P!uqD&TAT@&{p$*dZe3TS-gVMY8b%PspEectz}9VvLcue#_*gKjeGZ5 zzj9_>o2xqDKU5PlX(m&8-?`fs4~YQ zyynd43V^x{9h88D5`c@-qhOm~9pQGPBFuVf=;bp$fDIFVJykQ^9`E*pX|Y)@R>$+= z7TnplW7;T|-C#k$4$XP9U)i`uTLGfj z`btotKayPlOWW=}L{2}711NC_X%P=7!{Qe&zR^0j=Zd6I=O*<5obuD4XDbC(3zw9Q zI~~|;UF{oqlG`X{504YYSZuGhyW)brv)>GdVdwrbztl0~@D+SBJQ=G0haI)O>ltj5+ z)puYV$Kz`)e>VB%u3mlt3{zcP&HZdfKm(@2DK}~*3soh=Znqm3L>6n zFDb2$Pa{(XHh}{dlnVCc!)ec0sgp67UYt`P=>|1!H~G^8?9?BiP(64QIu%>DPH`s} z2`j{)d$8n_PKUnUbWEBK2+&f%&>7aqb9gOk6y8z|Z_w+XLh_IXq#P{HE{-89?%-ni z>iBeX>+P~oP59`O^uE+<1d3Y3#V3ufe^>&^n$d33IY~8 z($BWx##@rCkBFvTOsC;YGT9g3CBv&O6lzg+IkPCXw9h(~VG!Y>tIpV;ds+gqebq6Y z7K%J040Ml1ginAGWH-Z-hHztfBe>S6e55Mstq@RJU@KVKa*8E>s#5Ku=7dWo|8=Zv zQJJC^`;w}OlhZxWh!6&<%HXD8UcxA1T?B(t*UV}l5JlmZ@yUi6-b+j>R(YIzcP>>- zFTdiyxPCgoAi~tVk)|GqlOvGzO5P=wALpc2(tv6N7ogm&Ujc%3jjs2OX}qnasazT8f&R>*b5bg>RDHFt5 zUCE39Q9!Q0s77@My0|$Jm7I?v+rAeeMCM@$NE)0cyx-w0!4DL9UHGmlu1irwHJGQA zP))1UmR^%I-)3y1O=gNp6@P}%0xxn-}uNR_XBa$cJ*@;fn1de4DO<1nCrxq^K zUy`tyDUW}s%9^VvAgz1n&o*+@@4B|IsQS2=2crNew&D?qbtC$%>1Fc1<9oMtbaeWj z+(SAiZ#PZG1DRIyRwJ#W&e>yC6Ycf8(0s#=@WRj&bkrgDA44Hl!TetLfY6wC<8I(j z=T6+0XUm}^wX{QgQbxhVuWG)F2Q;I(*oy@vjp>ZUE+XfpOAmxIbYMYf1<1R@fySH^ z8}eGFhPXK@j8z@%&RhzFdfmTp*h?+th{y3qp!A^`C%zx_`U4`0?Um z(;}G}IDLR&SA;fmm~A#@^MxyJT0m;!?;J*{jax0qF2zKRc#jnS6L5Jj7+Uc1^s(FS zc2B#8+k-@T5V=tzj~18M#40qf`hNI-j>gkJ1FK;QMC`j}jxWR_l-n^%^xpA?3^5EB zXGv$~u)z(Z3myZ^!Q_)rR3#uD|0)mo_`QO!W5Ty{^8M*S3oWVEQcD!ODEA32A|3pP zGH*z%l9u7&8*?Mgh|*gS5HLS$DVU&ujb2w1eXB+V_wqE~ zn^Wfmy3!-ktohB!rjQ0pZ<>VH=P$8^TxePCUy1gQGz5{)1@%(6JC-Nk^^cWQmhB@zk*3-cL(G@J>;%aAHu%Mf8) zOG#OrVnQK|R*}V2CjQ-=AOXOpgi0a#MpEu$s=`__dK6LQtw^X<3@J!fO1?zc&0&j> z`s$n#0(k@X8_OL4qJFip|u z=T7d(tHtQ? z#W|(PqpOg(H{tOTUR??CNd{EW#6)6xdSk*8Igx9rAX(d3q~xtf#c=6^p8iz<+~x$8 z|ADw&oY5%>M(6P{I+>XpAjWAkXb*38a36W|u7VLVu4Q9eU%lbaaJ64Og_ldE*8*K5 z)E;Z zC%gY3Cf#Y2J@LWyWgVuxX?V9SRxW>1Sw6`05i6hm~XvY1e|_|fP^I+ zcxv<}`6WpUoY=#x)3sfGrNJI?r8_*Rq8TbWY;%FOYw^?sOlVzz3#bZZuPCgRH6zz6 zl>GczKxXZcbLF!MOt96#%xRr<1c?~jpwdt(Tdx-QA`jRS1L2vFK)Spq@dBxm_)>z6 z36${c#Edv-Y}5!JvRtYn%ACW6Ma}VdxYv;KBto9M=AiHdU7qNH8zzBXaNS4L}e6l z`jbXx0Yl%Ds3@|;8s4!=s^cwTfbj^!V5rioRLQcZ7lwd|#<>1jiHtfKE9En^AgQJ1 zw5Xb#D}u7n_i#oVBit{nbtJn2IQye3L4rIvOIl;;)+F)cA0FvZb~O96=oLzKyf_s!B*ixJ-Gqd>AJ(ig3{$+~69JT(a%;uKb- z-diS0D#@dpoOo8}t#021EZa1&qm+29eR62N#FMbgLR7>_jIe<2Fc@$_2$P&7<|Nc8 zI^UKo)+CkcFt?=bxvk0@WtI>tlyo^AAix$Lxe2K7f`bW=Lsa77!qH1Z5=gB+w0)ov z8&UgDt`Ssr6t+y1b~5VGE-Oe{WkxBvEy>-J?lK}-csRR7FGBW!Ex1+=c;+%r6FgWW zF?HM-CN81!H_%0~68a+nVDy5s2Yt(9;(+ueqg>j1u+{1<*n-?)`a*2q~X) zGoc*n(C!Hb3VWPXINz46Y26hh39N)Wm z$GGCX3LJaZ=P>KuLscksgl`$X8VQ1DD8AzAyaUP6nF_a`|62$LYQzfF`XcSnFc>>u z13ke6qV5p+VUDhlnlN&$7FjAb?VJ`Qn*gNXio$MU->7EXy?>R}XAtjGWYEZJhsiZ! zt%hL&5?y(uer}O2TkX0Olp0?`A7&?{j8GFxBv2sF1*JmNQ{qoH6V*d;PTYnvD?GW_ zNG4@iwNLek@?jdrO_}AyszPdylQs{36!{s`wseMz3Hhtp1+nD&0OsjT0#p7)e-OqU ze{ee|Z%*AeouhucOP)J%{|<8sm8Po0XRo4p4dUSN9`hLZb4KoZv7)V&CPxNPoG0{8 z0^O4f5B~d`mFj}t6$dnSUh7o>iXY-Y5Czaa42Hh?F6AILN(v_%HcD<>Zj{nm)U#Wp zH^>aEcgJrM!o8G$rjr+1Gs(tGRvtbt5K1EhdnesY8i0o(XR3xuSA)q)^3`c8>`jC z7D=Bv+x99cfegM01o?ft(>*jPvX#PNlTn_;<;}$0{$lv$@or0BJ9PlJo@~SpPSt)D zX0ge0piq}hO)o@K zEv8~o)|h$e_?il{kBJ{r!x+txJ4ZJt9G40`-0HGcIDzX?c!?Ta zolpLXByLi%3RxkxdAcx#5*1Q}IuOo=rGYn{lX1cFqSj-Okskn$VlTOdgZzX6ti;Vr z@rTqrz&H^DE_KzcxVPQD&{a5`V4(Z7Hu2|ArvVU!F^DBkB`t7=K($6sx9jy?_Y|br zOMmvX4$uAz5jRA-t@#bgZ>0PWC&I8LO$69o`PEpI4C5>btk}plZcs3bY1!z*2iRN- zVamjzEElK|6A@(|xvkIq8!mR`=&%?78ds@Ps^n-MVz{F6WKJvXj*zH@v+JkjS8{Y% z$tBt_tg_jqEXU*V$EFDGa76^BC{-)Lj5CynH_fBiISM_J%b!g7wWl|*+^7C9P+O&b zsqqlf5MHRQOm7ei_b&sC^R#Y<~t65nVjFz8^ZG2aDmoB#R-7W? z_}k`T`%Ujduiri46h5R z# zuiwNURuLaBkt$RDB0A{5>$Y2mZKaK8!tYWH;7~fRvRQ>(^yspP;04a}?t}msENTfk-EUbBzNj@Y3L2t+2z&Y(9&b$vM!|)bG5E_e9fP}Zw;1{2)asZ>T zqrohgO1LAIQ%vY|B+V1@LWHyUKbOG7Hh)$}(jf;DY~vUW9TJP?bopcYK6**cK^=zE zD`fc4o^K_&~-9?7L5CikJK*caQf<*e1ig-UO5(AS-#OmRojT`yQ#r5c(cZR~XvA7O< z;)(n&+=2H$fB)0Q<%V+RFYPcbQ;-%TGmi2=Bc5=9RvC=2MiYD~hXTjgM3E$S$RW+j76Plf z+12ZyvbEMi+E#&FSw>35<6w-=l@X%KpZ=i{tJw30ZS{daAJhaGcJUfGxT>)W+LQh5 z7vj>f0>V>|EivF#<%u4b3a)1WsHk=whSwvXf2h%`!^s3`+OIX(>gCNwfpkKk3_Mhz_A0pJ;A|#h zG4Mu%aOzv&#bmgsuETE#7p@$CeCZF7dWuk5uaNbFFFIMI{5Vg^4i7UqT zu6G0590}G5{^oMj8Hm@|-C6mdzV}C?E$8%GQ9IfTD1|I978YM~I?i9w;fuo-ej+*7 zh?Kp(xz~CHu_AG)Nw2vGp=5eK;#tFKdd3nF&i^>p+fYNa)jn{p`i6r`+i< z%ZHHoD8Q`%P2M>j!-zqSlq0+0**@B`k!2M$rmhR8pMbLioF+oEqsj;J+%$#@Q@fam98_eEldgEDuevb=dC7Ctc ztu@>?26z=NFVHRPVTn6&Iuk2#=h4}_*2(#CyW2T9GXo}Jy+eP1#6?OQo{@J@6k`(n zUnyrLTgVCy6HHPfbz>=wQP&xb zFnrejUc%gNtVXZ#ld(7ZNP!h<6RpgBWhF}*`arrk%!0V&KMWHnT^d~~|GcInTpCHi zohdS~Xj($`D%}c!;do2xZB;pvjM+YlARfEqje|)rUW^@fq$g&TRO(R)%TbD%3s=m= zq$X}WDrbmUW6+U@1s%-dIm6u_ar_vILnV<2o$kmj_DK*@#S(dY%Q0ku5@pa)AcBJ! zPf3_7?7edQ!A&T1pie6m@9*`ky?<8u=jNXVKRzva#xp3D^h=v*F9`e4Kavt;Z4X96 z(2&U3C~cQAW;7Tt1|!FX+Y>V+t)_ylQDYZ%^f6V^XXWo_!9`7ckvE# zGJBV##_$AbG@W{FZ*T8~Q)$%caWvSXEh6DfXScSu145~w_L`Y)I@`6q?YjDgy4=Pt zclVy{EbH>c_I7%g*i3hciYPuou)`?bbOp6pyaHmBdo)O_a3`zjzQF!aC|sTYK!Y$khxem zG~NaSjBVnih#vDwY2K7%JXIH1gLl(F`?W$utUN1mcjnyaGXguF3I?+{UngyE|_3f;QX1CH` z6-Ch6=F|0e9VlnkM4o4F!S?>D*!hr2?mT?)HA+9baXZ88g{_R)3K- z$wuZRpFiK;Ul}b6%rbM5J6XgiZ<70a1t)3D@F5g48z*8Or)c_iPQ>=ON7H&g#H?w!OV7!F<>>cb@HJ0dp@)LTjwT1FtyG zY@(St%{<<1x8R6SvwtGpD(eDOu!AbFVOUUu~Y5+m}g@ za;CZ6*e?i8HAiGS9zv3~_n&3a_eQqHX#d%E(QRLOrkNb)-dY^zcH#SS)tP2qIM1>~ zwmhD*-dN*eFE-O`t}}D%^CtSDps1l{2}J(y+y8vX-q)XH(xxnpA>Ouy_x|yw`l7L$ zMW42_rwYtxQEk^6bIqD+J@cC1&QZ+m?G@$c*O+S-(!I!JoN}kSpFh>VhQWmVzOJ^M zu{U-8?hI~bm2ft!YhTu&7^}>@RI?T^CIsu)<6f z&16tBiA|%nxBntv6nzwmTA@W&A7vk3G_usG+u4W;LQTFX`#3apjdf;H)od9vn~Q(( z;uk{K2d^`mu4bxpv-KwpkQskby1EX&W>eO^tR+6n<{zKem$*Ybn6f_RnQT1EW`Qzy zar;F*U*vo^ZGFV^xcefL?Br0_onM1rbJ^yqo!#BX-^)i@X%_FY zyO+ffr=Z~|}tQpsLvNklw9c%l=% zz#ndjv=leN#K-)Dlp4&#B&@^5fJ^oTSHS=it7G+;C@Y^jCCDcycvW+YLdJ%lsQB~z zW`#JLXkuw?h%CzV?qJWvCiqUWey9j0g0Jg0uDAMUwq1nKN-w? zPIbb$ATjwf)}8Zo;ocICgz%tDycGZCVTQ5UkOO`%F&JzjbBvH%y*Hwy2N>8!x#vs5 z#U7VMKJZV?R9lw;hv#Apw=8XjKKGO$#S;O8E=8GgeF%&so{Lv%s`i>lv%sYiIkB-r zl|-Cdg!BL-2q-_x7^~V+rx=3lT!-PXByvfr2tV!457%~m+ih&S+uODI-MswDo6wrH z$3F%BQ8JK{NN<7Zx4Eu;Ml5YI@PP}tUwfF@ffIl%Ff6cWBrd0c5qWG7N~KXS4rnGo z36gOeGGz|jNf^>eo5G(pp8M_;kmpmx5rOY0=m%HYcz07khJ!A(>Xm( zqrST*@Sf^+=u+fXltnzh4Tp+iqRTNLUe{PT}qG z$ab8a6{&j4DO-)&@j(rQNX`P2h4$S8T;z zbLXK*`5l=p-2SP{wL^MYji;kPQPJMnQKxUcSkiBD*yYThj=X^{TTp&ax7$8DY8|w# zmRP^vskS z>WWrTvR1(vtznWb-6yKf9WMowD7chP;iz-m>09;gsK$kY37ix6a(v@5m7b}6+dS{J z-PgzO+~ZdN;9a}hGy4!J;SvGic*9_HI{*M}|Vq;u4CjF0=_)IGwSsF*}!3}2NTr`~jub9J6z^0JXPz8rd( zVRh~LRd)^7bdTyTigbkPiJrFyBMa}NL3_OG#fuzR@9{xx=A z@BdQ!7i(Q`@9JAG_UlXbPG*?gfbFaP>wx~Iz22c|yg57+yOqGP3SVH=d_+SUgmKpR z-!FyBE91kXlsepy}{kz$n@%%@>(a6 z6RE|7sK!#!#22~DRRS`j4&Ig%)IbctUd&uZm2aBfKQ61Ab}A^HJ<)zS?bYNAFekwk z3cjHb`B~TmmZ}4Y=M6x7k|lk0Az@Chr86GM!c7?bKMzY9u9%-*Bz5OvCj^QuSbx@=?Po$FfQNZOi zLI{4$A3Q>K5$hJBE=o*RBsf!5jX6bTxR|RPU?=`9wvrRanz$?{>m3-Nq^j#p(IA(A zsw@xq*+vmnBrWp=B? z@^M$z5fb=$o$XIc>3pP&ax!euanhpm8?1l{TU_&!(?Bg#GRbgTot{O zpIrK|Sm*=gOHpTbT$AauXv?u=YsmSv2)-%ZA{<8dMwT)KS<3HuFALbJGa3P5MQH*y zO_w_aSl>5G2V7^D^qW+{c_NDLNnsS^qD0;~^F!8Wa3NlyCk9DgCvK&bMn-aMqi{4q zj;<$6cTyq>K-xzS6>C@>H#b)rCdIV#oh_u&2B`DMA4gfK(m;Y7e2gVcg-@IiM69b( zc$=2-&b~8{wz2LO@5;%Rx?ZBAw3YX)N-~r_lq(z$;V2l8 zPD>p5l6mAgm!?5>=DOB9s?7=Ctc66SWV$=ppBqZO#yPN4^54}=SrxVQQdkv=@lNkd zB{KU{fUlsYMOHYQI89NL)Af05EHG7d%9qIQ^jqDx z?S85Br)}&$Cdhgq#8$*$WO1sN>dwm&{tEv9Z^1vI^-fA_d68!I(TMf2o7P8x9_Taq zTLXLAE7+5{Al;YljCo3p37!s7jU^M$DJRX0HyXJ}e;>6hsA2IkaNXaL?DlCoJ(fW%h}zcIqSS@b)Hz z%ZX+jjFA&3#w-HilI&!|00az`P%6X{YmyR(1WtcKV?~p%2TUC`pDidQe9WQ(U@<>< zfe84z#$G144B`{glL?&MVH# z>7x4Q4}bo;?3JB6K*VSJ`%Vq<_oefcAo}zrYzK-ke`su!3U%--rvsxx#0-guT=Q%q zY>8J?Knpprkz}T60on7vU1faKSd9ETCDTNUOQYHsP=y6oD`2B# z06$uuOg=4>-q!>WpZwR;MKm)3Rx16$bG~*qF4~(LFG~!YM#;hJ2|vS+*^}#==EZk^ z@GjaI-t|-;eNBa98wZOmKR|U14IwFRMh#!cagB5`2p!}O8}&}qEn&^J3nY@&)hLSyilo%i zsEba4b{VH#PKWVd(&}Pw!~eFtR9KWH7|Q7oh-KjiVKIVhJeG-HehTLj83Nems|AZR+ZlLse{pf2hc_PVtevkI+1X)0_6WY_6&rgW_;At~hoOZ^WDjrSe7EmxS$)=*Ne`B-*3=Z$P}*vWmV6R~k`YThz)`g#l9Q zDYZ-S`23i}H z#Y`{m%@okWb0ZR2p!t>i_(c?Ni6xBy@kJ_mxY)gk!21+qK+WleTUiBkgGgS*cUD!ljr)uH4K*A< zlPv^TsW1{{e3YtDmY1`;Q&sh_4|!auTVgcf7lXaTLOh{-i8)n#^CkTbZ~wtFUS{7w zaSs9bMjpT#c_mn@WVpF-GTn7ODv2!4@$efbDL$@$2W6?fH9--?X6BO>r~InxD|3#} zclTK?opNO+EN($wj;u>!N6k*}Ojpi|MmTwpnm|;V({U-0N3}=hCvWI+-8o^}8I4RA zQ0&e~8ZK$`FdQ)cu*P2)dPJqhNvZSt7&)EE$0<Qv6qMzbFaN!hUWTtkOpC`uK-r9VnkD3UIkMy=r$hB)xW z{xv!-w)htS=D@1UhlVj@8+rk%yS&AGF@{T~Uf)eMM_tXl$=}En1+4543lcsR0}T*8 z)L6`*Ah`oJH@BZ?F-4R0Q@IDk7(RVgtK%nJiDAlCEw6+%!c*u*>#RfL2~TXkn%Mzg z3TJ>MlBS|tu`sZkp4D7-i_^}J5RX6(R?9(R!6nN{|4HUOB*E;APh5rY%&wqPhdeQH zVzRvmw*m+UETv9}V+s0V9pq`-!RwpY#OI^Qt9&UQrhU`g&G^1tBv6yxo5V{A4R@>lMCMo+)j$*nWH*E3ft@iq5URM#YzepR{K){ zQMB)q{Q(Wb=8+ahnT^oov#Vne6rv)d9|>iU#~nJ}8266qj$+j}GVZgQ!=xnQmZOj# zqnNGKahX8^wJPz6!|;~O=H`lKQbop95-D`$UXgfh0#zmb?lJy@D?RBl8Z7^p%#vXh zyLPJbA7W<^m?^@Bh%40uL7U8C^s4mLD0tPkj-fb!k|iMuVVn};M_r6paDifnFu(FE z9mC*=&m!Y|NkVWHV0l4cCd4nyiDXV7?V?@%{$bzjsS9_IYmqn?L_@M*4Q|4ZRF0V- zo8}1PLTNl++fJj5vE&%S8U++B&A{WKk#xPo6(H9(jCr6jYN(3h zfDvk&|F!roK_oh(Y3Ar;r7i?83{^a7+t4w%r4&Y07Pud#o~w!%DFI6>Jm2cT*{=P_N7Cc2?~Y^C*1K)%93d7#e&8;bib}65aw1T@$Zs%AiUj z=txzRSY{xu*$!#YZ+!1lfId-^Xd28I*K`SaQc(ARtsDDKB^MfJt+~=`lBXIBqT0k? z)coOsi;@k)nHL}=5Ki)6s-0YZb%@`Az&1w;n;VIC?S}&@jZS-uM&ghD?AiV{NcGbt#MqhKN5{6!~q6S?g&@lHgG6eIDbk-DAHzd7MK}CtJV%lSm{l76T zfM?AP&m~bhQ}9IqAxjm*ZlyxKIP@kDWjos9v4oxw1E`Y3_Fg2*d}E@_GW{y^x8vuj*iLiV3dXPZ5Vul<%asz zsR)^s;e6VzBT7FilShEI5h5~+$Rpo7U>;4=2qSi9 zVT7_BIjy2gG0|QC?M-+q1i`CW;L{RBXuJ#kpgr%CUuuz;9o3UG#{?Ru?>ARmwiEs32qqYLctThzcD*POFp4zF+>XY7#0 zBsfR_LjUPiaK~=7ss^l5$jT5+cI;GpDVKn+TrcjaS{|aqZ+y9!U6)vV1sX6zIly%89Y}BExf*7C4=cT5wqqnb8pl2cy94k5dtPJw`&`uK zGn~`8LNs-DI`t>Vc*oNU{_qaCGk?}}$f!LE2ObD>pQ4#R)nyBj`U6h-cXZaaKB2Ct zv4eV?y{GkU_`lP5-rU)1?(L%5%xT|Eoj+jbnQA}XS^3rL*1@+<|I|7D;JiCMZlAT@ zwn<0>QhgZ??}1i7#TQ?F@%i}$pDFT87&{%gjat37^K=w|`~c@TQfT0!R%Ykv!MoPU z+xF4v+m*+_93K1o`(L0l)U*9v>)(34vEOLazi8AkIYVO~{`dlZ-EQoB;naVD^(LML znx!4*izx~fIqxm|{y+5j-q5`5l<;J`^=HQ3?-b3eor~l4nRZgqlIX!XDPda^I zXu}10V~10+Q-|J=oZL$#v%_t(!#BYl-f0Um;@o(^x3SXD@?xvNy+SHrwtoY?siB{q z*=a*`+Hkk`Sf$97K9Pm`~M5Z&e_br_2+Eb`(LbA`r7v6tUF z^GtU+e@dw*409OAf!bU2KA8FFU5oBrPSaRrz4oHEtJ*f6+n8{2+C6R^b^aG~6Lj69 zPOoo*@euj1Zg`0X#8{U*s>}KdyGvUTb6e*>m|eo|0;|wn%;%cPao*zmU*ALbu~D}5 zDEp;jWSeY$0K`OnNyod6_0 z!B)h+b1Ko|8u+NWl->P1kF?R>{?#81Jukijxovf~v0H*G+Mfj^IgF&7O%o_f^;hZj z;u^Uj{E*ZX-Uub0Q~|klaBzNneni0Tx4M1z438p-@IKi9PdZ1|Y@SOP)L*zebr21h zYsInN`oKPW&hy%y2~l`shNg?tjl&T5>(MCIU0rq8*e|t)%nB#8eZ_lxR(m0OeC9TG zY_yW6!aC---}i$X09~w~=Vm`A{;kvN9G@Mv-GkQAQBSF}l#N*+flew>!K@Nhu_k}= zDFEt5Zz>I#^wG^g#zAdVgY${z`Vq?KgTLL}?cMyfb`@Ryk0BVoqGg0WiW?}oB&dN+c`UHcTIqI zQMfz^k(yG7ZXe`YFLKYkzX4x8Ll$4oADCAaD1>w8^gg{0C;iqBZoAt(?b7sFWSUDPmkCDB&eX+P*ce_rKpDcuK35ZOn zjHDUlYCgbQfYk0&p>Uu0*Q}tG_!6N>@Y*p6+BLSH?loy>$*=H(r z+Q0@`jr}|4IQZMly9uhLV-6>F-T<|I-8&>pFph~m*)t}(zk|0BFjzceY4n{e#+Q@@ zirbl^_5OdCUNlFo&x;@lS#E`14duBo_=+z2Ws(^a$T?@!qk~X9GjnX+P&h*h?6JcRpKM_6Dr}=B-WvGn@6OxqN$a>R2`Ww%Q%9H!-8VqkXowlN ze}K{Oki0=Is&7s`GR^%us~O+xXi7RbvOsNXO?rb67}vv^^Q||cyG>&~A&5ovlh**= z0%)EGhW=}ZSOceha#&SyRVIn{1w2jnMj61$t~JtmP`Dd0?_peY9EiArWM6Yor*>@hpVK-m$&)R&l6={X%VJLuw zUOarN@P=_O{hI(e7kZ10!2WQh#oIG_CT8>;Sr$I;wy&#GuGFeO{GsfWTdxm(C_7C) z*}GMu3zcXJG=p!tesGB(3C178Dq6LW0|c0W@PJ63k#dagQ&!~4s{zjDVf)Ql>)_kg z+qPOk8^~_tkjfH6ivkvZX(NqDf4J>~3FQQ=)$~op?r&*#)E@I}0DygzO}dAvq*wyKC^D|ELDZ{UG+`9?1?&xpKGmrvF1(!M|# zm5*9Il+MZJ5hqk<2Qj?4B8+NA&-Y6og<=^*yuoz$47QoECK7vg8~_+yOEm_AqF)3^ z*?KghSM6?-CvbAw2Zja#)IGEOFYwF5)AuLnTw%j(Tfq!C+t(bzVDF`kb*3#PhFJ~W z)iZTeV|ZaTsGALrkh$Ly?&Mph<2a@Dz=R)gKe)HE0Qpu9pr(Ayl>1|Ht#crw$1bHO zExq;U&MY7hyy^Vlo}KoT7@>2U!eHef8ke1`k#`+gp7lZ^gtsWtI=n6Qgol@5CaO@* z*{Y08l6d0-Pdgk6_XH!kO{wRT1Dh~4i8}~R;33S8-ecoVqzRC^3%^XIn_mi9RVd^n zLCm7E<{s=Co7Q-dD)%d~UtQkD+S%&I(e8LSwH1!wOQHjECB)WaM~Lj~NLwv+CWCMW z_W_9>p90Evbp_joCyu1fh{P8Y)Hye@Adv`94LMd*kW!Jf7Oa8cPo-ZkdF}}_pq5Ec zCnATiAtteQ8?lzhj%U8KV7#Nw7_^XlyVjR~58D+kFpJ3q(-0Ai8CE7VZIW!B$ZP{@ z)t-gi=>}?Gg^n+wD+Rc-qXL;$gDY_;h{M3Zwh0XZT%J(5Yj3;QXmvf>wpg>lVA9kJ zh!AF<+h(5))`7EVOROm}&93%S#Kc{L(Si;j4xDfwv#$Pzx`CkYdg+jT5;5O6a;iAB z@LT6+TMi&()BHv@3GMnO^<8Pb5?({wYO+OZ- zp@RP1a0bvXGG_g+nvy>=G}<@E9&uZbD7PaneG?5bCyk+Zuk&pBj<)IB(@gOqaAIBr z)l!)zUv}oVb{hSmKNxv4!3hsAvjCG}q#;5Ms7U8^7z>ji8H}T%J-~DMB6Wvcs!|U< z0Yt&KNtFc4xgwMq*Y7_HXto1ORv3z zx?VyZs5d1Ykv5;wzuJ!Z`C0ENZvW>ScAYWu?f>=NMt%Q_M!m7U|7>q}XL}pofA*|i z|7`#NH6Bh!GWTtQ;s`~#PW^`7U1ahX2>~|X{f*KvK(Z6g?rTP-IC8NP3a!XF2|j|n zJO&o07X+Wekq0u*yANmW?&0ad7V4}@UkNWEEEy0^Fv0J%Hu2{e3x*Q)Q)y^^1lEXOU!2zL?s#bTtUXnDL(}+;^yf* z)Sgg^VJla~%ao)*giA^fQch6k8C4)K(G;qV4`^+Cfl%{Aa8wCT8Rx;X*Z`@C9CLQ8 z=ze?|j)DO*8hANze;dj}fNzuynvD9?r4l9bD^6(x>?VvqBO;Fe;j?@0N;vXgVnzf? z?1Dc1u1$hauY6G!5s5X_8%D98MXe{fJBX)Fd^$y>d^0~F& zltoMi7y^2VJ&_L5=l~*EL!$@!Mu3yP#K8fb`mpO}4##jTC+t~r9D-V$athu+Uhf7a z3Ylm_3m-ziPAY0qE`$U+op05qB=G+mkeuhz$2*A3k*~s;89Gax+eCVlqOk8XriQnZ z66rK)T@9HC1NVd`yrB*#VYhtDaR^wYip$r? zY#pyA{;1;oG7qv$J1hwXQBtdu4Z#ue5HfkQ$PgoG0VRAP4ieD?;en$9s`Zdx=E#)8 zH}K)%8rd%si!RYIq3nDzHLeGe+^x!oO?;%0MH*z;#T*@dD>Ahor$+JsHQ2;KA$ZXF z1c0Ohsg-;s*GG&lCGkOnRVk(;s8umhiwal=HilG0q+v$=JV2I`0!156Wq*Hr%X#*q zzD41OjoqCWRS}4W`W_MO?yJkq!e9U+deCw}t>|B7V3JPC4v?bwQaBb04}B?Z0K{bB z^TIVda(z^qP7iH%Tx>}oB5cZ)7mP|$8qxtUoXFwHMVF}L7W{Suqa)xbUDlI}zIVwd z0ghhC>L#8shwSN!KpW^7L8N^V8F5@y5mzWLuYWZc^Z8l#DbD{(NpbZta{2$pv)$ci zJIMb(+uLdE?Sd>&->&b~8=v|AU*mcC@}=W$y3R2$=}iZ7V!U*EbfGt$gVW>V(-W6J zJY!9kuCnpcd5y`3oJJixC}BrMVhWTSE=CjV$zX!U)9pQ{-e}f$oArGon1H&a{BCyu zeq`~;3BxRiz=mkbnI~d!YTWD~oZeGWIk=~*4(Tq?Yi7$ioYkE6aE#K-dx}gzrjP5- zAy0z|HnCa*b<%~opx)_nL3g9HdZRxSn;OYO0hmv?&oJaV+7f2!nM#U}-B4n3kyBxd zi?sQ(aX|J`6~v>;Z^LBssS508&2}!>j|l8sEMsUA=QVT zSn73-EuX^faH5K_2WS-l^;6B&ZqPPTb7M(jt^IeMp3^&h(|_Lr{t|va>z;n!Icy&~ zuRl1bLTsJ)-<@`yjaCo7-Edkbhw$GAr~SiOx83Wt52+V;0WA_8Xa@asTPOWaySL?Z zP7aRF(f?=5d41k@PEPv{nQq{<{^=HVFPc#=x~X&e#yM_xQGM5Mz3v=!`X6ZIH=X_o zjOx6B0b9;ltK07!oFBEi&e?hQ?6lXWZg3%oo!-Gwt8?5wtT`|Z7}{xn-#+Q1XVlS= zxv1P7-l zz4mt?*Y)8`?xuCzdJD^`EP(_7{ouUYKE@fs($VLw-|3(Cc|mVaPY-)IK(F2XzH`v- zy>yOFdjzEOUK^-DtKXstKsNxP9_`2L^IivGMLm!&SNHr3y@IOFyVLhr{l__ILGwcb z?CA;ZD!}Em`vE&fm=N5zcx&FZ`{>jOpoCTSyDbC>nx78(#;Z7P{{VwPe805YH`Yt7 zPug#fI&a%22W@=g6nlE#>9wn{Rh=GMusS^a`xcCSP9VS?g4yw}9bSb*(=FOdr}M^X z9e&@zC5Q%q0=;*jfOtQal_g$HC?4?Q=4*& zGB2R9EG5T~>%jekbO^0!C2dW^>w^qz!aczyddEr+`j`^lurgoB8l3JNJ};S0&q9Ba zOy!1m>O~nBdQnE}*k$M$E{{=(Mme@i_LZi`KDcEi8{cainLXo$pjsg%I|@NNrp}Z_4?-Q%_AdiQiAL z5K89P6s?{8HS1RB^tm*P%vYa$*;IvaoXX8$)VvDrCX2DFCRnvs7hF#`JA+<5z5qm4 zprg)|D@t!0M_Oq}$=N;T$V8oxCkYNX^5>g?oSW8GxzkO1?~GMdIMuFep>qXJODt)| z((UGsT;-HoA&+I3tNG4_#!n7l&n5%N#$z@%U$1Pk3ehE|+qv2UFM2 zq}3#?6%HZ@XX%I%-}S^6rcumF1cP}}xrL6?ESEF+;q{b-(MIQNNrZ)PS_bA?sGu?W zXKO7)jnglSzt%oB#sxBe%p>!_@}Oh#`#K_Y0+R45gvD*qj05&`8ec5<4(LOA zEX_$r0%!SBMBiJJe<6;BlJ-u>WQ?+e5_8xyo(w^AVP1n?RFNk#crE6lL^*k!as5@! zOQzL1vCEjd!Q<~u1~=iXDw8~;*>O&}EZO`Dtd2LiCwMI;BM@>-BoXlP=RcY2VfKQ4 zHQX2(=9GP$d>;kLfc`U3UZkLkf9p=!ce1KGNI!C-eeBDW=6T0nbdq=_)(fE$eInZ> zfI_T|I*G_c%}V5NF3v3X;bv&xl{GBMO#7ZI14M5DxK#aq!whaU2_iG%G_o zB(Qj;Jm(6(=_;Q@F)kx#)#Uwfnm#LbRhTHo14Pnt-)*0@`yHHDY(zm%7Ffg}n839` z>QfxPp4$ECn>W37tn=hLj9z6hRiaZNf&lRlD-^HBNg2MtM-yn%H2y8YS0DU%3U+;# zDFR!bY0o1*FJJ9X@TH9K1X2wh!I2cryb8*6(7Q zQ$~TKdMll!JSt!MH-8q&_-dmIc#E%l%m$w9M;CgId~b$vI#P{-ik%>_73OAjz#(LqFMzy{uUBFF(aYSVRI&z^8ib&&{Q5B*J ztDIrHX-MudDILiOg+gQ}rM-5(-URyYo}3?Vaxm`yw!5e9QTya={~djr02!yWzM3c$ z5}+O6C++Axr6J`+*Buhc-FMbv))GVkAn-cJhKxup}`aB#T%BR#R>jO=zT$ ztxYR7X2*1Zbo}JmT(V?gS3sss64}Mh&ep<;5OPE-)CaND zgJ6zU8JWh*c^C#bVu%Cz`I3r0N6SiX`>LdZ7W4ieu>U z@)nu2OP3BPPJzswh$H)wPK=j}ylK+kCGP`F$e@O9w{l}6>m>1pE$=3a(G?dBd#*0; zhHicudf6GVxmvz#Y!a{xtg+V11_VH?*1}1!ze^jSpj>>`>9SbtQEb_=_u?GdlJ|wQ zE=YCh$(K25O>)G+q>dEXY}3=FjhC7dxJk1q*gMx`?;hQT8+#tdq#Ju4$-*0Z9>d@p zdone!zXLV?S}6Njjh}p0Mj|Zuqk@NKrrI`b=%%VvQXJGx9@+&_6X-k{0+ueZsWh7i z#;C}anA+k(d(ag8X_FFYS7Yv1TsoC+ajrctRZN6v9LfTVNcB(Zu{;ww{Z{vFyDzgN z5Z}f5eJ}}}NS!uE$M6y*nMa0-1mv1?3hd@$fF+2Pi_#T_mXM}55_OAt7NRl`HQ$QY z3l^W!K(`^B&>8050zsG4cHt|kZdgQdm<5NqZDq2PcqE}FwS?k&sx2qP*=9@Sx1)kNgEPo{bl{vNd$v?)mD5>+q$ zY{1@89_zNXL&+6aour~i7{J2;O)EG*F`A^iJXvT{^dJ* zql@LhVlJ{W_UAEQT`^Ha&9byaqwRm9j zPOIU-I{W{5?^7v5(*DXbcpQ8vE=A&e3d@fFt|-Lv&{rb8C3G!h8s=48&Si*mmlkwo zd`1_?C}B=#k3?dSWkpQWtiRUvZa+!K2^CRKUBNqPC8RncS4#Ws z)QB#i9=kFa4ri)q`jp8g#S%+B{f%Krt}a(j1yF^=1-UyxwGc|{b_7sp#e^&Vnh<#^ z15d~zRa}Ak-56N*CG}_(N&%&Wh?&dj_n3hF@%APhaZOj}k7h9d_}xhr{DiMaM1-YG z+0rOjgi}38M+}NsB&JizF2p!$esr#L6$E3yRxatYBzu`ECyq}hK>kwUxnp7lD#*g5 zDh<%_t7a?1y8@prd!bwZLyI&#S9nzlri%%!hHfV5tCJ}zuP4m#xH%+$_1>Zz*p%V) zx6f{rk1$mMWf#UMA1SLxi%Yp%Al}DC8=3c{B+WsQFfviNld@II&QO^k4rZuS6-^Sn z=vM<(5A@qgu^orU#cq|U;B)|{JT#yH%V|x5)<%vrX2s&3q@L$Y$ChJI$idnQsEQFU4Y`$ z+4w{`tx^fq$Qxe{J>!0tV9h!(fpObpO|mU zbf#eh2aUIuTBFJmBqC*JSYRFc#61*xXLiU-TYZUE&yl>^r9K^)lz0JVhT83GLd_Y~ z7A>Xw;|stRy|_w*5YF<83qJ?ZLoTn9q8#9N7L(v7xY@AGaiYH z|0Vr$-7=@JrRT6^Okyj3!HQE$*DMo&_z@QuEix2aD|4Q7F;i2M^W2&zwGC=2aSNMX ziTxgFC#*FakG(pQledVVrq28?l`Z?O-xAcL$T}52Q0!&NGNcQmTE9h5)n=;wo1Gmn8jEy8c#M;{^IKgDQt^c9x z+F&|#Ozc*rwN_6uA--0z=g2@7>JMpy(Dc4V8odI=I zW3ZDbPIy9&mu5ox2eC2#&7J-?o|gX>zWG8vzy-Q<@0uY-4V2t#U)sc}+O5?Y7H*UX z>DNc62j5c3r3tn0?=Z2-rvOA(0dT5{#O?l45gQd~=UAx#-}>(q9wjBr1DMJYpMMts z3@pKa8)gmj&8`1lnQx(I>wl!~VVU%%9)QQl_dXecXK7VzJ@Rh8CsESP=mv3hBZ`+s z(Ron^WVa{5VEi(p4|PUVjP97!Xf&%~NO+w!l?jso zQOY8mq=N4+xch={&GSJA_C)%*p?QGvpNfXdsj_CqM3Vv+8QN#!0``BaxJw&%CAJ;FDU5bhHlsM{qgm@`dC zOK18YAh^j*Bk?Uyaa1rs1F$wuu#-=^fGCMDiF`yrlRW_3H2%U`CB{D}c4JLFaA31L}QEEMFVPf1g=;=FawVg<=Pg4J_r0O{~eXP2u zPavL2w)YBuz_e+ax@+Sg;Di*1nKCDglw(Z~a}E_uMKt9!&u{=+M@Jv<3(E@L~F zQ}0US%az_YbrcD8{dK4bQMH;XwMYgrM{X%5nXN1st|_M!lT;GQ)n88xq3)CHC z)=v?x$~2cNa5yo6qqL5|;n)I4DMR4k80IXI!?8q;(t09?BSenUBa0lw*<%%sNOCQh zfpN%I6)ch}#3{$cgZ)?3_6mrR@pHHskMBz|ESWQ12o)f5tfh2$CDV5Jmx|T~WYB>G z&Zd(2)VC69(zLg-&y&0|%^TA=MM}SsP9|J0(l#GKF;Ed#m`bQ;eLd3JbVK*BroHB0 zLQ}qPb#0x6GA^L4#2(bPgrIo4l(3W@pvh2#rIf455QN2T^~5~?-P9T>W}H%%|3SVP zCq}MH^va`YNYZcU6eEpPi>F!^a@`1Y)*#vyWBa&3^&IOV#B5wzDPr;yc?|7x8b*&v z$d(Z<8egni(WNwAb~UYd+~}Oa*2P$_94&Fo9{sqc=!cWW2M|Zm{8uHBk76Ick~V0I zP#QMyQgItNM^XJ}TeVX;PkBL<9>96(3!-FQ5U}eVtkdmMQrco1DBTXFwK-6IJCxSA z9o97Rr!ljScROfmpL$OeIKXK(D#Jck@P5e|sEENj?M_q{-`k8f3fB#Zh(tm%(rNq=-J`eRzqAJ2OJNS1S9HDAIEEwI?*NVAHoF+Qt# zqW`|5)yiE}6N6|9-g;i33WG8bMWnc`lEO?ta)Uy7u}UXF>sr$ZjM(oFfq5eDV78bW zL&I!0oo(l&DtV)5`NdsIy||Z&b##{!DHG&c6H`l2DR^5JLek0vO$QkJo*2`5a$LwA zk*(I8R!V2)OTLO8;#cyVkgbDP!1>sAH-3=6aVg<%T-4zhZYFEqD|j1cx*Gq#|M&lr zKE!F^F~-Q2`fF`*ZS7E+M~b2O{RGcsQ$HO}kRC)sLR!g6B>sAmz0uMmYrc+qM8;)&Q5!*&om4W#z?|p1icW+`W}Tw z-k`Zos^v_evAAgn2Pn6vPO()|4x;Q1qlQqoY6a#bRQ2?eJva?5mDI*a4^T`(1o(4H zCD@O=+3enV@3A{vF#kp<@+i}V|I>)EN}qUkE8!1~_)x70DXnv`4GFH>d!3FnwuidY4;rM#1XptKjtMHCQ{;f?vr1h!kYEnc8E{3}pu zUAd7o-BMeR1JN-sD30D`-Z5Ng=G9es^)=>W8C*#PU6tRp!-$wrm+R{!+y`+wlMLsKv@}gel`-lj}+o@XDB|*M0W3z%KQs0eFDo{M7 z0j8@UQ0WOL0cCH9dR-_wGG6vaK>h_T72qcj)-!e&+d$2SF5W5Nj-*}0ZHYgA?SYNs!58;X-d5GX*Qrfv3RuMe>R^7<|1f zu-$|Lx8>Zv5i%TK#|ac^)$#Dt3h5W7&PX5>*}lAo{xM;S*%WEQ$6y+}TJH>TglOn1YraCh1ZgwYl9|l7ot0QqHDatZW^uYtUxS|sNE}sezxGSo^ zg}a3U_Qj>cbR8%bCZf*MQL#H8%hKh$g$uv0-khZ<1N3Ute+m5aG)t>DxyKNMMW zMC8=!4!yqsM9(SGM}=3n;-sl%rHS{#03FAwPLuD$f{0wf6zzO%Vh($GXI7;=oxhRE zdGOe=Wfbe+AppQxItCP0Ui`WX)*y2-7r(T(v;&j_v`YS|_8cNfzwlvMbF<`DDYzGF zWFfeLrUhH;U5@Qd!S>d{Sf5NJo^_BtK06a_3qy07g7fR5X}lfCmc;qW&eM;BKm?<< zU`b9+ZnZv9Pd0>DWzsflU)38nV#W4Oy=8oevKv;GV!9mCw84 zzG4uF+fS8sj#N!kj9dgrTmn*`?_MHb~1RSr-P%XG7mrc><4eGIkSJ1(gkqfl=;`Gh_%Y?D%MtH?6lT@T}(c@ z%6yS?v8n>z!(gaNRT@}A$z-S=eOmGaqZci2a171;_%h6{J;}@)3*IT1k3sV$;^#32 zmCBQgKLSt2DaV(*_!oGQOEkKL-rs=tDcxqV*DtVpZ}2e!M&%|^+f^GHD-7PLLs(X2 zWfJ0BJl7D_@|4>)e^S&_)e6OF}b!i_$Xc2T2>h%j*QG{Y41Jms4kNQK^>M1 z?HX_K^9VDc(b!sAvTq-@h5{!I91V@(9Kj$Pk;6koqOKxVEgOY+9wT6+oo1zE>Gb{u ztn^}%yL{u*-y7Sk^K%(MkY_A*CuefF_^i$4inXP2x}x6)a=Q%Obva&porTz4IqkJr zUK%BfDi-8-#RMMC^NNmg`Cf?`zX zJrw4I@p&9>SoE|SM~qJfSG*ECO#KvPiRH_yu*I^?3aqhglFJ^`OKY&m_&khFrjb`* zmGN1hUFOk})UN=qOih>Y%K{t)d1jtW4&Q9-N;dDD9R6X9vtDOql5tOD-3{riv%K@I zQBv+f!>*CwOKp5DWpQ2>!{uhM1m;sT;7s|d~Vnd}eEKAv%gye<ATN`Ly`a?LgfKD09-m(lWUxE~T4o3ypu`ualu1^Hl z*Q*rKr!bI<$k}4aQzP6_xNVEoa4%Y}`{g0B9xQSd766SR8ib|5@Kl1kUlltF*Y;M? zm0565uGCo^iaGNf9r`M_p|kRZ=sfM($c^c&3av=y&DQ}_LQ-(O#a%2pqa{SButOZBAinCnt0)Wkvrj%dE&kqA zDT}*c6kuF{vOiN2(98RnN<>ulvUMUgoiacr9TPb$lw@pWJ}bpDpDFXy?F|O^VePQg z?(l6?WJD#{c-*kbTxM0sNI9F4aZT!HNIl3mmed=CRH1^e?^`)>l>pVyzoZ#+a}2$< zs;dH9{FyoAcm*Ic{?y52k zr;0LEEnC0Um}KJBo1&J{QZrj!6eE=uKIU4KbDks$F4x7a@;pv9&6RJU#3K-O?e^=I z>rH#&w?%;`fkaICVhhT|Ak>~(+%nmK%`0sAG|(uA!K>`HPS;-25LBoeNm;I(iI1vu zxJZ__Q~XXPH6Z#Cv$i@9#}@f4t%8&G#A!o;wktP@;T`7Hh&7=Iw4AL?pj1o%ld=_o zk|ZV>_Nw``YyZwwR5L9TKvB$EA!Xy*Ng9hEm){vT*q`0&3ITTRGI^g{!R3xs%U+~1 zVL8>v-Hg>DNjypz${qCcE@?l7EhS!0c9n7qnt*j6^6G<%^3yUXKp6L+a7`%p9HB7qq!3ej6~(@OC# z`6I~$jK$ts-hc_->MW|ehR`xRIB2~yx}0Wt#tHd>4$dLDonu@vj}Im zC{?M<@<)ncAhHCTEvNaq{pPgWcEz7C-)8F#mTaI895-%v4jpj-6tXisB?fz!;V0j5 z@k2*Cew|RpJVTCBXo(iLlPbOr1E*pd;b!N`IqSB2?e6z&_n_5l+u7+%7L-fVGF_2$ zm(AzoQH5*(o5}I-Es}F6L{uWToalFwjA_pH5_(JAg*mAJUB(ferMr~nvlSADy-I2#`NUHcncygrugIFMOC0+{ zSUY^y$;kciWZWytNBDf^{MP0CEUn&WuJ1F~_nGVa%=P`7a(%IE!x#mmFGQ*MHG+ed zB?V67qS82%II&(i3-HqXwVAm{t?y&gO@Bcy!d20E%(KcaAI`8U*YMobtY)Ev>+IM5 zB@8NZN54rXmD#>k7*&G8>dY!WYcs4V;itwPdDB^lm_=q}!NLOn_0hZbBceDiCJ~;)_O{%T4?&;ZSPu_p}6Ec0)oTD(DVmT+a{GGK9zHPm2 z^XvYdKUiRqPhFU^_u=^U>5;CIN!O3?Hj~_xQJSFUoa&s_qSB|ZDeA(+SQC=#PI~i_ zNZd}z=#lEXos(Ysq}SP^)Sj|R37E$G= zJ5@(4B`|4A!v+%@Zppuv`K2I<#q;mV23F_18R9E9pz^b5NZum&8)G&x)8z~gR1;Yd z{LKms66ST|lT>BQ7Hz4FP*2RA$4#tVq!{PM$wnd%)s}hGGh*LJwWAS;=RsKLB;w)a zV^-v=iWqieU#>!odn8WoHdOo;R@wlXt_r;Z#rW2np%1-t7W#varFcZUS?-v212;>u zmX(SsrYko|{L9vCn`WgQEqtAd&g14{zr4V|P+nNRMi|!;t+2wp2%XuM6%< z&VEY{>Zs->d?jQ{%bRA7r*|hCvY&5|-`@@Lc-O|N_rzKk!!LdlEV~F&sgFn~vXy`; zHCd0O#tyv`quUA9r98G~)pvb36)0FKnZT`iEKm7wQt{V=C1FgMi1tOvVCc<;S_fcK z779d56ssyxatyKW2Ej1H8I71TUFEN|Ix%oGF(?%y1}x&IW%{V3(Dr4dUB@n4VzNN? zSW+N?i&GG0=Hg&LXIG)b^kN>EVgqVUe}=i}Nuv@>IC{P$bXix6k%K+M1x7u1K+NYV zwE+X-H;u=Y8$g+n$Q#YO%Ns9zEMs~cEe#9RvKvmBe|57sOy217pQJ8YHu$mZ7-Pf; zR;5DMw@&Vq-#5Lyq{Az^r!!|MZY(vRB&zWl4U3DyG9#9Gt{^#EeU!VJ<^FtQ?FT1`AN{_4AKeA*=joD9R-}CLG|d8P3d4GPc9Q12bC!)3lL?g}|-=%r5^f$WSb0FJHFw zhIs{Z8V3y_fC9bqqw{mG%&%8tGl-oXxHd7j{IU}xUR#3KS}m2=TWr3fjo24LyCzJ3 z+4fZIGo%g)b)Zg2?sW4{A554OA zHD`e$b?F7Lv1Crxtewyt;6Dmi#H{B|`R70W+;e{Z>gSg~{~w&7|M~mR&Hwo`{PIuu zp!upSk=GnWj`8J^F_ahkD41X&OS2PeDd_4LpHNE;jja`PfH=-|87qcUK9xm?e19B? zx+}`>)fp}*@*S^bhXUmzrvqY-s7t3VTJ*|CsY~r|2B7|g!R6SE6AlJIL59*%cy=!= zK+Fc9VuSAfAIoa{vKZlYdEmlaVmgCJCGOW@5EIg3X%z-BQ(7!p4B~H_FIt_)75Jaz zTFu;$oKuDHtYBJ2%m{(k04HP1OtAQ;|MT3xwcP*xbKQOMqn%6fr$q>Fj{UhueMHiK zJmyql`-@0N5uQl-JM2SbdH{R_nDJ?Rf*Bpz5Gg0B(}c+~Q?ib#0;_2wNnf9sA?1y{ zxcFlxiB7lntpeXoN~Pu^kYL2vmkhdm$m0aRD{IfJ6IJ2xUtE0iq_+9Z#YNSmBwXqYB*_BZ zjGNfOAFBU=9-CH=R+qeZikP+u(x1L-!@ZIEp4@Ibn=dvHT?+y=82R2r&egbP6xXEI zgW6m{xDK!pP!pJKt%gbPL~A5Q>iQsz6eL>QLLzTv2?-dmSKqN44^T1qqfJau`-gt} zJ~!kUMpG@pWZdw|CGJ-aEV`fHgpoMd3fN`6>^4^RAC>>@_7 zxbiuJFnVNq^+?nzHPAfPI!O>7oH8Mcl;q)@7#&crQBLg?33esZrfxBJD>Tm&G*0u-j6K}Z&xP`027T~r7Qz@>4|^q>Msm^ zNBNM3R+F-3Fg9Ii<$_Pz?_Ev~-S4*BJVhFK*+dwzhunac^%Gg44+XXOU!K2vi?#*yQs@XuBK210_IFd{wIIrG})a>{V8m+ z0y_mvQWmtag)6GUza}uMr7wO9&lF{?U;ww8+o;uRJ5NW!<;+8q$J2pKMcAlq!x!q$ zIkMMYG%P$uy-~04@9%$6hv(V;uJtcGJG=G97x2n%W4pe$_w3mh_3iD({Gba5_PT322dBr!rzb9dc*cqg z`1Hs<@3p%xo!4Fje>Upao?LAH@Xq&!{;cUdT|~2|qY$v_>EKfYSC2xTBo=LbavHUL zXB+naDg1xC?lc4U^0Z8 z(DdUu_GW_+CW@B~dHQoTi|PF=xV`}{Yf#03w_O~4%Q*zn-yV+9ALG3r%>Pz%oEBV{ z^e(bEwxAczazg*z^aDkUzjnKU~ZPtSh^O+Zj!a=s3E?Tp$oQ{5M?8sT;GL z^%fDdsXrSBa}=P}O2`d$ZaFY1J!wSUU_%fHn>;ti*^JGP9Q4J+2C&u4=>X3lV?Ee& zeIP+2x^b|GYA_&I^B_`+MLoF6`m1LK!vez?j1|1oW&@)du#vNY1rHY@ikT*)rlBUb z`h-*;dSWu^?=T$DP2$Nde2RKs3QPbN)Sm@F7FBb#8%ob%E=jDl|E|+>dZ%yt?_1rr z1HYejPrvVg6yd!70AIG9)_MQkY1i3k_2AnLr*(1&|9t>q16}-k?L+DXUg#X39d)1? z^wVvf^gHd|meV;oI66P1ppVz*edpw~4+r+R(}&mkr(4v$Xhyy0rq1ab=eXTHcn5#B zUU!Z<{SP$qn@;}(Ms?o6fGw;b(eE6bAGNy9*?ITuwAZF?a3P1C-oa6;bKE|JGtoJL zp`G^k7>Ut)hdG*!g}rXWoLaAs+T7{M2kPUn(`_I0aRvIf1FEOpI@)r2XYGRy{?h)T z4fAhxKWrfg4o**c?eEU9=yvOfyJ;PhM^$ABBmn3K=Ut8!fu;A(U-$Z*{&}Al^!D`h zu!jR+NJZzM-FxXAo%RSwK-ho`wE8WY0CWQo>d}6@KJRr9R@6i1q~Gp#&(Hdu)03+6 z?({tX1LoU;=7$8>(-YcNfXiw319prsA-Hex*1T)OcU=S}tg_#2AxKbGJ?I;+;<)|O zZr@lhwLWRTJ?gw|pB%LDjZ^IDeW%y1!d7*9DDHN6`1dUs`naVgG&$%00nv-fi48bgLh&JYRn1>Ww!IAX_IxP&&X&tktX8Tip77@1fqXM z%w#Ze^Lr2+ry%#Scc{na(8rWXk&6Z+{Q~oJ!~%vB)+SV%S14qabq7)TH^arP|E$aZ z@tzbLV;TRqx0~Sqp6xY0^MAj_^RMOq7>kGnd|reF{LH$2X5BusZl77V&#c>nShqOi z1=Md=l`P%N8{<{yY+9t+y+nV7VK5^{+xtyq?y$rZbTq#qjbD>~qMK9`>x}Sk7&wXt zG}RRln71nri#90)EDv5kJTA_ zj!;O-BlRe}t{$m3={f#blM`j^9}RlIGICAqNA6j;)#M?lHw}tOA8YXctEhhIS;GJC z?d|Ug{(osz(-rVnZoW>yd?{*f4tdN5_XW0V=*oC0ISKWR=*q6j5%8 z^cCwu$!z~-HlbDIKVEqa3Fb;;c^icAqt#)zSZ_vA6%(|L0eE){_6u z&JMcmwFN)}jY$04-ecFFM*V4H*J*4wck9ia7jg0LozL|lIdqZZutZlPHhCUi`y>SD zqJ9(|Ma{+eTip)yS(N-NN`4k4KZ}x|MaiY2q;QQXama8mcHj*Pj^1SHZu4vPo9q9y z@J2=~q<%%jeQ$H1aRVcb8~pn={=QA|ghv=n%fa1WtBCF~@bEImP?jzcVkN)2$;A|@ z+(n~=k=`eV4UvtNUf4EX*mn4Z?V58E&V5CKXZ}V6G^j+WsE~dQZv4SVDslnz=*E*N ziYV_r(iZkd;F_PK5fH`SLH--HI?@U7JDD3wEmWX5Z&||)hIc^NU9$t)9MQ|A55%4N zQZv=9xAR+X>(<+9H`Gyn8kI?Pmb4G;P+id_XY4 zR0Kk-ky4HK5kAElMoK-q#i!YY+nLJ`k+&(2mzdB)v$zVl(bku zg`wdLpR|AIyKhc(u`O9gmWne$n}LtP_9@B_&J6%F2#2ZrTfvkc@L$#3V@mC(1UW)x z516v=I41)j6ebnC(t@5$4C<*s;U&F9pPFy6*UE1Q`I_;R7_ed-uYUtm-Cj;AL2W!k@*E?NlAgB zoQK)JF>)*uh}oe!fq5I`ji^clOG5hh_=a(LVIhWFJL6GRDAkZ8&ejny$|o)4lS?Xv zDrPK~8IRDOFdYEpc(Ngq)*?9yLBd;_j*1RuawXha&3aikVzkIwv&^6J5{r1>%GJit zCf$M&mbx-(j7gBl_S|+TzoURd9y9r(QxX#`tk!=0|#@&>?Xp$RH(jU2-$XyAHkvJn#L`Cy( z=DQ*b6|6l4i8Pik!KTbZBHot>l6k5`{uE9Qx2aP@Z4$iAFCsvl`%9m{=dZKwY~2}Z z(nVM4lU4{V$*qaO;zfamHhcr~&P~+&6S-1VwF&5g@j@`T1`@0DNSi~0D1x3wrv%HR zkhTE1vz{j#aRji-L)aTGH_)1w@jfh!QY-?eBjgEhFh_>ayqsf8%_CoFbI2lLV*D9g zZ{tgG2twdDa?a1yETHUz!Nl%^YR=sfoyGbbv`%wIB0c?R=vp|Mg}2E~QEg*roR8o+ z{Rq@fNA_65moJUAp|aV63+66UlRd3?|F~$}RX3knO%g{t zWr10wM3QJcl#~it9#i{#q#Rb&gQz7XyGTHiRzyd^LYj$l zz*2ir?Gtcx=8Jk5CQD7oK%saAD5EjSCmX>K%csuov+nlT1?8B77}YZ?vi$GV=w8!y z`7M3v(zi{a?4Ub1B5Gu;e2dxofh}doK@CS7_Be;8?1Ywf3*->Al?WQ!{HC(HR}d^5caEHa?gNR^eSgSF6e=W zAO?2xN(Pu@pAj*9)*<1q^G^wNd+To~VvKSm-ar#7l}1`BU0oXQd!e(a8d$jsG8Se$ z7;RsH!0qbqQTru+-K-LDGEmmuMY9JD(T5#e8@lNy_un15Sf28$7;I9UXR>KW60&O& z5lUT&N%!G9(s`0A7Da30Fctk70DQ(ZV&XLd&*#Aij-aRzI1gndVWDcGsu8G!0yu9} zFsr$HaMbGc+)ua<jDTdL)2g(1KE`8k&Tjz;EA8K-`mot?9opH?Zm%L5gD-wrWu7n zVr{Af@CTB zh;g|Eevm2Ijl+m=lxr07IZ6yoN)IYrO<8M3o+fGb$5?lcf<{}w)X(Dl)f}w*e*5wa_A#N~QA4p8rM;8xy zqB6^^Z+A1F-8%u`84?*j<*4qy*NCQpYzoz!aaS>bxW-IFO1v`XH1FWWVF-fTPb4`AA(cDphb8kq9g9CnVAZ40PVcT?KbAcdER(olN8#>;tcaIe3 z;PmACcDFCf0AU9Hl%}$7+RdziWz*1lAZbimJv)51{wMc3$s!DY5yty1d3hrlX{1zS zb&QQmC2W}+hlQgx*d)=&E2?zknPhZ#*FF zT8xkN0{li4T$=R5<{p6JPw+koGKi6qZbgj)zG6-f+b%iancZG4GWsB5BRj&nZo+?r zP0^9B%&6%bgcqLlG!dr83f1MX$)KcI^h$O&RNfWa+=mPHL&ZysfM~3Rs&%CHq3Jko zA(o1`4~2!N{ev3=&!(-hHoAe)g*@kzNfG|u;3>exHI&}2fF9MC_PuTN0T@Se1Q)5m z^!HRePB~CeCw-@kh@4gw3y}%^`^4izzU0X^Jn;wolhP1pr8B>5gPsg1W~<6H(iqw$Vxypu&}vvwd0 z_;9`begIw^W*Oi@Hcq|CfO|Y(Wh`AYHw1vp6|8XBc*p*KjOf8cYG|Tcn!~N0+2_Q8xL8s7#?X zmvq9z30<*hdnS*eNg8d09xmbgo3V#3fFwm99G@Q?Ij+3cXXsOaqF4q)5kl{?i3~Jh ze?wwUh`qzg(^zU(dGDq7VgiAj97eQ!;qr+fxI`@)Zsb)K!z>)<;=Gnw42x&SKn*gw z(ONO&VbMGgV5KVdrz8f2#^KuT6w#F04KM!^Cq8Fi8E-;jC_*<4=hs9;3?n0rph7~@ zxX5R@LCR7iE1@Rcxi#Cp2H8_mRii@^Zk5#i5_`wYvB7)_&9c<(;~?3ZZexZ?hhJNd zPinw`f{CfJdO}KjOjChrCfG#B7Ba!abp2!~i0g}&83ZbgFKwg1ziRgJiLW~ELKp~} zi7wc=ILE7@dGg*Tr<;MD<}1qiRzx3gMRW4TouiA?LATxNx82@B>*NF-{ZLgHqghDu zq#r5K+C^ZO@~p_t^<1mcth;I2b#ckY?9#N2X`jWLF}%Yo*Mv>h$BD)tgQ@tL?04p< zt+D2LGcz3M(MR0)Qjf-HX8w(Dn?Ol#=MsRh>Yw^3mqQRmoQ;n2UMF3Ap2MYKT^34H zTt+%Hle?4ffHED@ILH^3Y(VyewI1Ufu;QXnlE9FtBALg#5g-%}@L11Ma0W^DsF#T; z#1-ix;fbw4&h?GU2A8HG_6{bEQieN?pf*nB%bfNpTvX}|%pOx3p`sz68=H*I2*OSD zpcMg1XQ#bQvwQ|v5CnAQO>s}}6DNPe<;EC$Rt(Rw;&*Gu|~KlK7T&l5@9HeV(! z?Y7w?_1ONq9?{PS^z#9I&;kAWG0)~NdMtt8h#vvZIB{sx2FVFuBj0r)!J$P&NMDl6 zi}zw8Ky2>=;b0xpfIRqIB@a>&fSBOm{r?)javIelTm^y(^H2B@idCt0+T^_-@8lPu zGD&C@7B0quOEL) zq_V`$M?#i*nacp~0-c;8_Du}<UPR@Fz|^ zGp?fLfe_0^%O0rkI7J{#&ac8@O#QkZY?Pg2b0$FBreoW-ZQIGjwr$&)n0IWO6Wiv* zw(W_rd3N8e-Fj=kY*l~hKhV|P=XD;(n#IEK1>~{KBgI*A1q-tQfr_yNJ*SHR!d5?q zPyB>EmFhUI|2+jsv_2E|o5y8mHA;{!%SLQIo@XQWS2NtDcoH%iA2RqfYqGylZeX}( z<2q<;9)qx=AM zNu3N+Ac>TiSygv)&7LuF9g>#MG~YG#F9i{g0h{Hzp>{JCY5?Ol`2qESMvaA3CgdGG z37Gdbsq#=Kvi=f`5(M@KE;Lvqm(_emLBpj6fHS%QZ}L=I1fIlwW-|k`45XLmxXsi zsdLfIuKaag=E>c_f9aY<$pgF;Db2FN`#13eyKIeXY!SvpH8he!YWA7^l)Ma+}DNgQYf)X(5$G+*MBa&*F{W_EusuD2#6j%A_! zvqL;-X!_7EhugWF*F#%DAwkK9ziz(EiIF|~Rw*ov{wb#3nVRQyAJqo+)LHg6)I9?A zt>CI9g;WMcUs65Bd;uv&rH=OnQBvS4WEx2Ar*TZSIn9;@0yEsW`{M4HF*KqXOMBKq zDCJBLnP^Z7QJH>tN-j$?=o+T^CZ3V#^d?S;ki^T7@Cp6R)z$N*|4ImY_pPtn?uflc z8d32|_;9@LiCV-sbA#XWm;OU>Mdja$LkusJq3SED`corV?KO3Uo(I7-21BM#$X;}HpnqIz|T(H;3q zXCtZtdZ~23VpU-^%N8BMKWGfW zbV*J6?9WM3Izre-A@AW#;e4#LA+zP*l+~QWL&$@F{~ZdfB)#h@T)XhM|7`sGy`5d* zZh_*uYyg##?|_4PYRI`ZIw->9^MbBUypylFJeD)1CEjI55W>i=bY#X* z2bFxm*`k-^Gu}*2p42aKQ=E-`;A+=0W|zM-3rJ^U>KWmdi5!47%)d0O!0UWEb|jkv zxueFxO5+UO+8N=5pF5%j)XhBDV)ViwLN_3cAqY)i$RJQ#?m)#*Yf;0${eM-;0q>?$ zJ1etX%ye^GcVC^+6CJ>MOf(pmWZ;L9D&Je+;#Hs{e55V`7vD%_de;1 zI*b!ef@t42_?L>rav^`lgD+CxPP6xo^~?`8zKaQT>e$m*&=ZDB7ZR}{4w0*5x@*es-%&DdQnW1p1OuV(G=NaaaGayoG~%vh zx(w(8({jcs9nd1c^x!7)bf5%Ypf3Yw#sI0Pj89T%&FDw3j})b7>g|c-Sk-Fdp(V27 z6q+OVj;n$;IyWr@xydro{7f3tY&W0+mWrtX4*5 z%6oe0)4G*s#1O}o5XQB@v5>KtsBjlV%b*Sox7wYI4~tiU39c{Eo6?f?Goe`Q&o*d1 z{CQ|uIH_K8(pHlxQJZo!KqFEw(KQZ@kkLa$>KU2;P3X5WrVrlwu#+J2+8;4r_u{cI zMOG_+RI%Xb&WcZYpy2W&*5n&n`Y9KlU}6Kk9-l(|BIkGFrkS%^JP%aZkN3VBhTS43 z&>g}N!{K8-hrO=@@N$)S7@NOvSI*A$vW79u06R2MLN$mbfu8hT0xJY0D(yD)vJu;e zvC+TmO%N(HWRWc_Kv*QuZb5exbaut(|R#|uSml-b;>$N7Ow_>w3$vYWqA2^1)_)QG&K zc=xY`7qHE7WRI_>D7bz>S1|(?s1hUy@*@Isj~40&Z$y!+L|k;X${AoB_M&b&gi&mbngwJu{ZKHfml>| z&5O8sOyKO4e1ft0W5|r#&sYM&Z>y55-mZDiJ`$ETwN}PxBn|e7DH{gybPf(J7l2|ks%9hu3u06 zbTggSj>S#H0jdtP-Sb|FZR8qziR;6sl6k7Yh6cCeboU$v-G!VQGpkHkY9invXsp5y zNk@VY`*wr`KGfB%ukjM#)69TFWC^tNYn$#s-Ad|1IwP4A zxhHe^aDuO{0YGEETgS{#qM&w`I}_zBE8m{3JwA%Hr5em!gzF61-FrwjfJ-N}WgO(h zbHifMcsf!Tqblpr6j53cPWg{%)G(tV*H}R%IZTwdtcnI6lt}$b66v}SjBi`_%A0v0 z*K%g8!QG_?C`upf?pT$!VfF~gff{zSt)Z)tx0xYfGrZCkOI~Va`x2!BK0gVJGNJLU z!G3BeyF*N6WC>c54Z;Thx@*9Q6vayA7Fvx#qZr=X!;)@^;^;K}Zm0EQz?Rrn*!-l6 zOCV_fp-F2_$0n!x$DQlEqqCP@&I;%Zf%ylBD&N@}VwmG##H~Fgri!?GJ*`2Ow3Hk+ zOO^+ruIDTi^Mh3yr5Huk`=>8B9vf$+IekIl(l(+#p^24a&H~!7+{rm;idtX0kA?m! zctki}+Jw<~f7d_64UWWIzz850OpQFR*GP6wCNz?^Usl_sD7saZQCf}^%T8We zLXO~f-F_6zZU(OhxUJPPz1Io;(kkN=Gw@u=n(p$^WQUs4&0Elg)+Kn@M5$d=G19yP z4fkeqE+c+@;kjFfj(f7z)Rl-JLd?kQ+&@00jsW|{c8GvSx*qLHJ1qH?Oo&hwWV5CR z^~@n}84DYPLgR*kQk3dN=f6=>8gN|#mTHk-q*7G)m&_i}Ldp%1{r-Uuow z`)6*6BdVEP>^SncA2ZLVKrgR=dRN$`%Ad7Qrj~9AAhm+b(c%5xaOb52f_6PChR6T? zCCepp5G8$sp=6e4N{LsB{kI|1BEAyTpntFPpZTEY?6LJ|tT2^j1fNFxtQCl)U>Qh0 zkss4S`(bsYd$6?I+0(Y-am0rNN5yzR8Z?RCIdoxD_J~;xfd@!cFrEilI9@jZiC5{oooKtyKJ@E&Ai-27qXGVxC-}6r1}ur4XSn zC6cZ<4N{mT>KBJajeXtKQ|DESYD?A}BeZ1vyw6Xrr2@+jsE0IoQwM+JF1M67slF|WDO@FAs63U^O@8j&By$p-q4qxj)<&G<`;H9AK zU2IjMAFm_WR;L5G)3No0d+mJ*t_z%2jUfuK?W3AuM==sH?O@tmcnBl*NTvt$Eu(u| z(2V;;k4Vv=z^*vgQ25%0zGJV6Ux5|_FxTAnh;qMRa!zEDOh|VJUfwmx)Oy}5=n4t9 zR6g@C%=gg_B5q~F2DOf&m<_euRd3Y_|a^RIbHtll0cU3#C z^ml|FWM|;Ka))&-BJdP#5$l0c4Sw0`P58($!pP&J&xj6NBFG*fIAYDHbRsF4~C4m z#(A(OPjp~$5g59`?QaoLG8OE$D<+`R$+)uN4{lp%=T`yh3Lxw9~G7m({Aqf8qPiyZT?F z|1;M?=v}SGwZC46bww%5jAUrwm=~I)a<^S$oGtAf*HPQJ=f3JmDWUc_{t&1XezCIv zjmOAoaKpI=$Qqnkdn)-)TeX(o43H6_iaO5~6xw1P%NNrdVe_LErbwx)0mSAmIo{`M zOe>I_gHDnaM5If`LSlAXCY0)PK~74Q$15ladxbrDLNn0UuNPqgGw5CK*)XhDwA_}} zkNOPXpFu*;=zQ>MzQ$%JnTF-cFI)M7w+T5_w@(s7+Stxg1^7^WAtF#9O2&VHXFR2w2FHv{)9@b{}M}nson$jfCp%L zl_q8|i&=s0Rd5x;@b9Nls;IFUbN>LNe22n86x`{vGAJX4B};ZP7ol89xmM7t>h-6W zo7^$$QQ!j=xPoVaVV1!YT3KF^De2y?%z`GnRzzldkq+$vBSC&AR6<^Z*pPABm$NOi zas;W?D1p|}6Mpa|ashenH`Y}ZH1gjT%+|`lSIWBe7z;>MG(Q#=u?ia}Vx$sBl^Lh| zBDSer`C^A#n4!+XAB5cDXj2jZcUvW2Jd}({_L$mtXUa2AOvg#)A^R_?-Tc1ze42v9 zz1Mmi@U*xGmsUvblKa^V9SeBJ6LrcpGfg_AAHolEg`c>ggNd%du`i?`9{IFY07sSd zDbtY;**AS@7^QX1_uU)k_O&CSc5Tg3p_{mNU>Huy2pONno%nNVSdRFM%|1H2W!_I9 zN0)n?GqWEH&6LSF88h;ux;kD70l|^t6PX#VG=pW@OjMS`$;evr?GZxz zJ4xIrHJ7onQe*RGX53>>;YRR#QznJJe?5QmR%4iDOl=&QrxTF|(&9fpzuAH_Ex#-i zP4zS(CQ9cyo(}^2vQ17(&;6!&U3bKJFNP$sg?@HDF1VF!D*rN~+>F*XS*2qJm>{7bQTICTSaVF&&1$B{raIrg z$8sc7$`_Hwa6-)qbu+@lT5WAT$OtU9Jrn&Hk}MNhSSWh0rQ-qiUF*qkkDTB*0g z^o<)^+hcIk4_bi;pYzS!#?3e%up(k;x)gZw(`Gb?j8W{#$9!G*K@x-TQTFg_(?_YNt^lL738YI^tatGZM8`7sPbO6jH6P)g2v z!RkDoZg|(Eua`hpo$lRJALZ~}Zckh$p1V+-{TDe!7V(~s;dNZum-I?q5v&H^L-(&% zY|3EX`5`fwpk)>gSyw@p(Z2>ABM4mjDqfi|le>W$O`)7<5yfp)ydl~!*vSelQ8Gmi z1I;TL-!8==bZVAxMzk$R58IsNi{5@@oD{D5KylMe+m(Xujz+1T$pj?Q6+Z?He3}fA z^S3kdFI3%%)%Q{tu{K(Ep}K6rLM{Sh@XWdw26^MA^1_s%AcJLhEKusdB!ozE)$b`_ zJBbp-;QHn*1& zAJMD26E`yS1GynEk+Y9rwzQaa+&c6ouW2^&l&v*G(@bn3a0eDs!e2Gf*q5unuzCPF zb7Q?>@U6tHxu5N`0Hd6awz&BYrjWgR?v}2DRA3p_Hh^u`a;#CP0EW3(Dyi@$?qskV zFt%h0ZCNyKfecM`N2Mf(cIA3LEu{F^s%=^eEgH)V_Ss6JGntYM_dm!RZ9Vy=&v^6j zDZMLEjeygSPueNwOpKIa7}1$Sypl6EY3ws&@3F44B3HvPNajqwOj zdwYsd4DMO+Cv95Xc5UVCTNFRw}5D3HB#n)9)=RRoCLD)0gLvo`W<;n%-fhX$u7WdMJ_~B!l52- z+&;?e7kRkwMrN)2#CV_+%y0Y1shLUnbZxI%wyCq3$$*Zww$J*hF_o~LMm@<44vN&2 zM0n9=&6b8H-TCyN&1^n`XRaBZAZ>lalu%(_$ihRCfSEA%AiS8p{Pxh= zxQQ`ZpL2QmmI&rcTLyPp&(v(`n^0-HB8J`T*pf*s;1LPSX+{k$Mj~-jm#itElNow>PdJ>W%utW?W)IU_w z%^%mi$l4x~St_gIfbIJDACl;Wrao^A^v>~3y-1A8<#j(Xs zsmPp_Ig*|zxCvZyFw2N`P4nKH03*zm`P~FUgSfLwl*1LxQUCpMJ~!zT?#fq5X^vw5DU2cnZGIW)WdUR-0t@I8OB|-v?q_PX!o&IUV&+D* zE0#K>SWHO}v^G_44SiWNXJ25bs_oH<>(Ug4h{%0#*WH)lZ1k!&Z=9fABR_0^g>QG_d^go?6T=VqJuIvGrv z8xt_$5DAgN`niFdfu5(Kdsb4JJ%*B)?5uJnA#x}+k%B>@A=PY=T*(5iD129@)ftP1 z$T`?nFpweRN)DAXbDZvNbZh_^iH>)y$XHpO04BUZZ6`-#0Hk`q`kC!0F6WSC`!ln4 zxn5JsMv8%`m=Y&81%@=UOYI+qJ9@$UVultnFblVFb{Z^){%e3z6pfPKtXX0ah)KL6 z?I6B}@#umQscq)% z=8E4AL*ctecidkdCJp(}X$3-@~^GqlfsemPqCOT#nlbu3YEa{u4TrG?fN zxKA+ntlK!7Ms>J_VAXQpf#jP*J??MUF-U!2)TdbPlFuXK$U0cp;CjtDxi%~#k_JoW zLJ+Ars48y}NsVpi0|B#Nq%EeG~%%WFbYN zcCbjBg;?q?Z`(Sh(=UPF;&Sg$%3CP2Wp(~CkYV7f$vV{eCdt8vux8m!(nHe6=INl) zlm3~|r>5xzk>M#Bom&3p69P~stD+5!QQv_xr-rU*$g>)oeo1y4aAlH+Wq`}gVyX1MAZ&??T4ct`WiQL_Tqq6F>YE9&urn02(7@D|e zTgxE&{yWF;GY&J0?n^`Au2tdrj#MowTQNs9TQl9Fui90oE`q`{v9tE54<5lhT0a(V zkIFRHO8q6XS1I$i1hYU1ND4cZz)8#stuLCYnMOoa*?WPT`n|x))T|un6hSmfZ1kzk zgq$+hKFU{qH!Yrr*4?RfV}VUc{)AKZnkWdIjvNCATn{37>d1WZ1_o zc`i_at|}WnIG8c`C2fw{rKI`+jXp*>$pqR_OHf{N?4%iM__~F_jXX`<*mR5ayV@^< zkL|oOSxrpRR;8*H_uRPPN$goTL2sS}uBHEUV}2_mQ)g=66>XQVJU>78mJdGI2CTec z2H0I*2h5dowmj!uU0vHc1Ssv;+umII|M&(0=%WPH8*DB=)tGcNvXgGJo$qh~#-P;p ztXda1K9>dV^T!!|9{xgNxiFVy)s#GEAPfG2*TRtEVmk)Hxg+rR%^fLUZPHU?eAmyd?Ri=za?fO#lM zByQ53iw!a5!+Oz~Vw{bI$3N>QM>L#*3k$_%!Fq4hezIjEtPT6YCefvXye<7+WLq3k z&r3KLRgjgj8bo5S+5O~e4^=So;6g@_5*1+LEs|o_=oH?NnvNxpYzB#5{_iCiycWcq z6~f)gmIa=hUfwGn+!_Mk&b=miguPxw`S9}A&9gz9&jtE(eYPTfSCx~;SeMOfg02ujojP90oG(b6 zSGlqPkRl!j!#<3L(a)LwSEZ_p>>Q83@;-Lw5SY%ZXZU!{Jfl~GnV<`S1pre1Gv02G znj%scqq+^IvgL~+4iE49pf|2d*9}NN-Jq{4pgxcV?*B&*CNS^toLe&_;im)Bx;@}b z^NR>rNRaEMCEh9Q&*S#%g?{gX;LStuc5W`glVhNM=eytk>A{?Ib0`L>_llzi+5?I3 zum7}sx)BDVyifn*GQWQPLDg6D+{o{c`ds5R<-ZaGKRy0-N8fc`{|v+@m4&+2>0-ZG zztzJOhOWBw(1AiReB*`mJ5a-G4OqXzy(n3xylR!qX+^_=bjUVVxZ&+~M{lWI5JfH+ z9PD-IUp)Z>*(6TK|6boylVaN{>~`gGU{ce9Oe4Ypf_dZt(SwSCycxnUJUcN2p+g2Z zok*)Fn-Y5m=kMBPZWisaCXuU=q5aDEv^{_I7!== znRr&lG9AY;wXMltWRy`38l^_2uAl)aFs?v#YT!s8v<}RforREVIJ_(|>Bin?IwSbN zP6$c>A`@{oAriRbh|yP7F4B~jdFtA&9(l(OZcd&0!$eEwg^g0K`Q$o|)#A0}bP zqSy5}OGjT7o+os8XRt&nl7Km2AhZ5RzEpPr!fEq*B>F|^k~Piz6Ip5SA4X<3Qsa8p zFyR5b6$Nl>O&L;YYk9L9B@UCT@UkW_Hd`sL?PB|}Mw^wtgUWqsiBz)*_GW^KDkx>a z;>^Ml+m=Yh;X}>7ibGeFdY%k(Lpm4E$Efvg*xn9DX7bI2at(wYU@-79Ct*pIB z4_ADZ3|vU95gnkRWNffRQXCWg8C`AomiJOgf>PJA`&2NN0N0=%H!c7_?t?)$*ST{m zo}zJ4miE=eyuZu!2bcP;D%t$2u&ko{&3b<$B%mw$nN;^3bn|o${i)zrcBl3IV8hqj z@g-S=ToKTME50b`C({WF&nZ>G8X8U41}D+~kvl(ewz0%kHciV3V&yW@-6U8iv2hTA-PxgCSfj?l;(rN^U#{*4=N#cATs=u_kn3)FhmvDpty- z*@u_@8#jRM$QIdqsL};>o5#e#xi00Ost87oLpkc=YWS3m(6h#N^|7j@`(+~Zf{GUR zm|X6vs3F{maz9B3mMNV_k-oV>P`|IML6yIHm*4-jJ`1BbdCb$P!S&L1spQt6y$Cu6 zv}+nXp&$W^8m6w9(;t-CAX=NF4Fn7&8q-HGS!adlm--s8UX z^ZaJKF9*^5oxO``(jR0kv59J*ElN=FNfEgS5u1t+8R!0;)W4DZgFVkME!BTd=qK3&vQXPM?*I;Zi;r#wcBSN3_*p z;OTL3Rw&FmqN^&U|6V5M6*;yPz}Wxu&U*(zV|%{?v{^`|Le0$e!9l*w z?7Pc$YDQHhH-}a)d!4ZMjhcpv9^o5kOj*1jCG9P|&L07#ji6}efL7R4IvQzG{=Psk z6F`0b+mbSctX=Z^=vL-YMy($V%-8@5?h}9ZUk@Qbr&=MqL~U_&bpEeKWYMtLTU8x+ zjBYKDN7=)1dq*N4TLJ`g-88wdOAkk<+_)ZTd5wr9K(HPwabjOfHM&6-Xa>h^&!5xFbwB9Cs!lBQMi%7_n@%2fB*v_G~622xQ|lfhI`aA3UY zQhV+{NDY*>^&wAGFuza{b`y3S_rv4+T_=t;XiAubZY)L^5OkT`=?;8H0YNXAvd)s~ z-u(-GdHbPh62ROX7!$gGtS7k*$IdBn-&MnAb$U{yd@v1Y#<^1*a&A7#$Ck~E z@L_S|F2OIF!9a{8!X~Bw#Sn013*%(er|Br94kjHx#w_ztlM+B}pVd9w4tP=t5q&!z zwpc815*Om|wFYrJ_`aU4j8y08(nWK2!BBOxz|ev*E^#!%h?M4V_~C^Tof)Jdf~6(~ z=U#KkgB!?C>q$4|Goj0Pj#0AGD-stQSr(V)&3q^bw?!zry@XYn@C+J8l!w@6p72S_ z!!p#wY|IogW;q9wOv#7DoNsInD5))Rg+$6N?{(^w&O(^A#sQHx8>5U4JEBhb4%mz^ zNfUOruWg@llgSi8C(gNJXQ`y)Tx!D+I+q5EJE-SOOr{yX zlipysn8C{8`!vQ2EI>dmq?{a&C<2lS@!pc6QRA9wmaM(52t-0oy{L!_Ply*I(f}ff z@}}i?_qqFvR>KeW{C`k^T=Z1tg&HgCGuDRf%@`Xh>F*p`M3_joyz!`d0p09>&l-FN zy`35GL(F@8ska7`!?D-x+LKHA|3WEaG6>a5^y_e@g^tZROa3#6eDHY-AaD-w@bFOk zc>en8IsfoG$qOm-m_wZ~8!K{)j*p0n&uWz)y72}l`$D!J`nlo0A8bE(*W zN|8hk5pf>q^%oRbV7}z)63R5e9436Lktrc4&H>r0y8CT|Xw^@W)!%?4-G47Oqc0Oime~Ym zG0xO05^d#6cgfdCX)m78kI!_Qsm%rFAI&fc%=9@K+ZEQr4lstBUwo+5Ua2tz%U`*_ zXoC}d^O!VBfH@QkcA~kgBTr&|S&_8`p~M(NC_h8@2&0-sJA8NlzS{AbJ%A2~q(xEa zkMcvug-1gb>$u$S9)ne|u?5lx@*3Dr)bO4>-bVg(a@4Y5+H-MbyyE>!uWaY~hrhFa zoiS%5J-j(H2oN0n0E~QsqjqM7qN@4EY7A3~q`hfXnxN23U?rAFO&p^)1lLN3*4(GI z9Riu|_QKU2lW|)5=D(;vqiFqs$)v5lqyJtm9wD&_{NP}YcYQo~lo;nW@48w5tBom2 z_tBG~#s!jRc}f$9oVaGjV5g6o$DC-f(}YHW2r0owg8fP%O)FeyB-CWnddt0L>HT}S z$;uH;P5C+Hc~BQUF1aH53Im@GLLCbN3zMPmXD6)ht1pMvKG6Yf+%^$^IlQ zMqw<_xuTXmR8t`M?rT%Li6c42+++7#?|Ed?*2jqHVh9WHov<0oa+D!?C+K@z=n(|G zQYI&=9785m!-zO`^c@zCPYQl+b2il*Z@>*m-W-yAI~S)i;=Jo8XtSHV0QxYcTa>72 zDHN)!NiHhv`3Xadz?Ho)yJ6(QbBEI6en%r9yk8Za0b>r$FN1X;uknK$4Xo;*eh0I$ z2@`~_0$aH&3e-*&F51ZdsItw%cq1g=6glEdx72~X3i>!fgHhBiTm`eC2w<`4?mNhy zMkv20e<4hY)J(dfDVCBuN1%bEae;L072V=QUL`r6tg%K<;Y6r&wm}>kjs1Q@=dGaO zY9|$n^~5Lr0m-=r`QpICP>HIbQ z5;)IXsu5EY?K}erVa1kHpr1Ta-mu5+Ptk)&UO(3O3Qe4bZR@an!G&U`8zF1#|gpX0^xC`?_}6N70-n@U*^m^~Estt*GB zTD0^M@b)(UTdtQl-se3j6CWG@`ty=cqlEY%R_`-8C&MA@J}#Zw6}blQTBU&e*e=bN zO#8+z2c4|5{enxW%3jL(r__VF&1IxVGUJ`fo{71=i9!O0fv&fz1RR#W!*;S&J^Tn2I4YD zR>+T<9tQ7pkNE07@D0pF4GN`Z*8Jer?lggs5y)8s*$AbapJxyi$G$#)uqnn zqf}apFf>z&oCF>f8tc#7qp>Ti}q&F#Rk{iSkj6;0eYc{;#ot} z;n%`uBqzp9F)lz5LAQ3357++m>CUugrhl%J!09n3mibIlRS{(b0kBdC^Ygv~mLhR! zuS)wfSYO`_fq8dWc%zr8Bgov#Ti-ab|IGT}qt2dTV31*u=e44~@$2E2to{fF!U6nW zXV!$peXZ(0;C0JZ{}6ca`&#G5PWu(EjCgBc*Fat98{$p9WjAx@q`-z($)}N~2r?|l zhv!xrY#A!?aWaT1U(c1|uj>0CmQn z*>931BnN~u{i9%>RhB-i?j5YpsK7DV+-V+}%6g~%W61y_>LX*y*e*9{2!Ry5`l7W&Rx|> zd0R46OQ~SKR@a<}D?@a@nKS8P!!{^j!a$~-vy#xrsvbb%xk21rQw`R0LkHPFlH2zw zF>9fqsT)$$VXgDig0Z9`bpva(Ir?20#W~Y>hRn0xty3ADX1eD8`V(lkq=C>8KX1Q@ z9J(>A>$KOXfE!!z43t}{pvlk3j%BUgJ2gal-6b?-cVAa~hiEmXt(SQwv<>CU=)XqL zwUd;Ex`nS-GA0LdjDVVK!VRKnX2vF(&~nV9F*0 z48LbfVpcc9D`Ofdz7aN3b+@U*%np0*n@L9jA%dp?Sl5hyQ+=+Qb=eeEWW_<6^1L4Y z6@%y87iIdJCY2~e7%Y3@5(Uv!&f<+sP2Dw&H+fn7Tcm_xgN?B)5)GA`8#^@ZG8lc@ zo3e4-II$w;ITXrTh!fRxjdLlCi2r;cHip5T86-$VPLq{p@#Vk}DoX-|r7^d{@K?U@ zxtppM40`mF6n)Vw1rOPTiFtUi1s&+kx(PFY{<~ox?A9y+hY5YdAh1u7D>0 z7Z2cPiR^u_1wm+#0Xn>d)c#m0v@=?Fq`kx;!;BlySApg5vblN?9vO1sam0yH5m+lX zsdkfD4PJS_iBzhYx%^8VVwJt`9x^9dpSVhFP!c94jv{b?{_c_9lbPxeLwbs0QtVw_ zoK{|c^xCGWePT3=NE*qrl5;J0xsP))9psSWb=8n57&(lN+SC}noY{uhk z$MY0Juu-JCK>9GgHd`SmO`E%*Y3-|EN8rbA+A&%dZue}PMDB)fN%1jJkr1MwoDS@a z(rs^E1!WLyFi!#JKc>M~CjgDg%l0?jS$pkLn`=tH01(gB&@_!;(%z1-N3U-S1115JI{>w=s#-8F==>77RGx{ zQx!!B?lB!eeXK?E&k`l}X9Rx+8EX)Fll9nGIxWdMUPjLMacwYSld0LNmjhb0!%=tW z)+MaQz64$^7M#TDzH-8?uCk@8P412{dL|q|SYmyXc^dTbzZ)}r(diwj)^FE?T--;- zkJkmN@UF|@-A8Dg4gOH57U4d;7;P6Cva$F?7PQaz1BW1HuM9bdQtau!xK|1^UFeZc zU$+m<#I%xfG{=34s{NUCt!q2bu}YT6^f!{&0LM&napG4D)s+p2v3a$4qBAXF+^dt& zBMIh7NqRW2`@ky4Sb`wcow}4nyBLs@*fp)~3#25hR>XO16^r49#^lJGI7VuE^%CiuM#@>I89}u975YVHKn^ZQ-bVG8 zRkEHSmd=NPOmvs>&gwCuRne*UDK&kMD;JhD@QNRWaGJQ~}J!|KF|BIdqB0>ck9G;;_Otjt7VWG{m8ZdWSLNxa4*y zr%VjjNkevq)gsC3p}0-?It8{;a%jR6kv+0ay0VY(N!Z!swx!G&?3AfCN6EN{?M5{u zCN;E$a0=#5*sp@n#j<#$WZXDqr=&CGGi)g~2tg zi_YP#I>mlo%5qoKVr<)!4ZlUP6<8Dg2{o_Tto`VqzQxKU4AxrC(0p`KfmEg4LWP|a zz`>BX3vk!4Av9EH)L!(&CA^E91ZFo+-wCDr$c_g)@4Agxqj&kF;Alv|_N;ZZ3~dVU z;n;WWx5+Dc-*%4h&339gvU+Rg;e`fsR^{u)2^d*@id}os_CUIQZW?(#bJl_;pu4(~ zQhZa=Gh%#?Ng4ditO_P+_8QaOKGEE@CUT!(?2jVJ>FiqqX#kC$?ol`u+)$E(OS&Vd zgZ)^JANjnySP_yVZ)==;QtiPO-p*K!?T0wi_Njv2+hR>07Gyhamjn-)xB{s^N(x^J zIAmEc-Gp7|G6TQZ5@8qx5dkbxpsTSR)KmOr^*k%Kp-fCHa>Zg?P@O#>NfJbqL@C4f zC|9CNn}h-TuKdkCb@Dh8zs-|1z);dK5Y!YM80&5&)1OIMr~)zL(=sVc88i%Mj*OS! z_SsO(;5M^G`eexn-~=2H9X668BpwO^=uNZfv_=qW27*F~QFI-YE)ss-O!oCO(U|TG zGbMMWHGcn9mVe1u9Z5dm`IzLaUU-q_;wPt~DO=*=ly9>^yczp2jrhN)oe-ek(V3-; z&Qzp-s*X_!^I^U&vO7bU%aaJpQSwn4@{!bZ)-sif_oQUnR>$j8Ch7|v5yQ}y z#5`9Zf6>X5lLbb&pzR(djGBw;TY9XXWT}kLui=NC(W?E z+6Dt);kGO!fGES5L1`3Z$OI%`=*jgmV7AW@pX$=8W?@T(*jHS1i8;=_- zs?SnI6O#!vdNsM4&_CC>MLQC$ngGt*GCUrM<6w|*UL|)OLfN>wWuFq9hfPJ4-+-D`!ywVFJ(xBN#KKB>9 zw9GFA%9-5@5LQD#U`U@pM=_hW5si>@7kM}=<-Gwo1B(#!q7o|n#$cqx_sl9 z>+UjWoK;VL$OPqh%2@}tUN^`n)qNy@*rLn~Qp!^-W73!+f2_UF%}>oxZ%Q!%kO@SO z@>N)CF`|Z9L)G=x zTm-u!eaMH#;1}@D1g~>XrzmAN`eJmRNO9-^F^`flCdQ_9SIXyO*Vx8}O{i)pGD1Pz zK@U||3sg}=)ebU1+NzsozfBtD^=(e}LUPfpJ?{(m1uwj1UTOP%qlS;hMq0)%A%J5X zB#c19kxoqBr&>)bSJI$HXFUNvfciT8FQ}0~GZoa7o6nd!kF_+7cA=27Aeb`DV-HU# z$^w@o>O4D$-k>}U8Ro}c9==46>?uZrjzDAqE>55%lxPo=m{brEkk$mg)R$2MpP5m} zH9iuQolJ};7{UNGP)0GwRa6T^izC(!*(8|`p$)7S7eH;YDyntcR?OJaIp=uQRUz}t zCErEsi4Vw)@g-(L&8xS>)%4QJufc3&4Zz8T=J6^#tG(@Xia0RcU)SjtLb;p5+v`^w zX-W1xt0;{e(4qB4CYGTb;DumFoDxQ3k=l`MY4MxQ8j92HCu|HWbK-#@-Cy}%0>?LEVD^R{5jAz;pvGc5hD zusP-;ZLm!8+N*BM@2m>~xHFQ&-%>$*{`>#tFse$v{a_f`9?D?S*!~xWaij%wqvyG) z2madw=WiBo=X6fT0U~IbAE(=wVxd3cz!`t1t~!L8?VqcG_$~SqM|GF=!8;Jo=4XGV zZ=Go;ZB0v{o#7^(WCJ731O1L!S{cc{N-0v#b>&^_n1SJ#3q|fUytn}LnUOh+@JEnl z6ydW)cpXLvf-2EliHx^KCnm`oFe072-~w0dh$BqlDz4E$BhFRF%fJ7XGBc7G#ZgL( z$Qmi<`s_12Gl)*%Q~igtc#8nflp1uchOJx%X|cDSi4FHFty-|k>@S1_yCJE?50Z-k zq9->YGc0rU997xxG*TME918)1CX2YmH!70pbOyI*nH7kqG_z_e->&$0BymXl{f39X z%;T-}yJyLc_x4@u`SE?m=zZ4f6S&8gx8~uibD_3z?!3PhSN`G<>Fa&BDS+z-XWsop z{11fDHSTX5&n(>AS)rg?XKU!vO56-0FQr3k_J45}DKGy&IE!?>|A(`P`O?AR76QwC z`G^pwopbO+oE

4R_Vl>yY=Dv)#Eo2WbDZVwbLR@lPp>m;Y7B56`{hDny`G=-VC0 zFz5`=j=Q_@NfU%cqwY7t=1qqDE_uu+X&fu?Ga*qWb`|i*q)l?ynK!3+=JHi7v zqqFXZm2UsCfbA3TZhn6L%RL|=_nsTPCLhL}q6GqAXe#7{|3|{yheG}nFl+U?cq_YY z=k!1t_WA0}ek1_-c#CwxIC5Y4_r)PofIZW1XL{JZ)JEt3R(tBC2a~Sbxx#yl)o|MU zvTAjxPSgIO1rfMywX;PDxD0vneX^T+mM3T1!`i?oB4@K=^w5Y| zZblb9t!KVoQl!4DkPPN=_5>3djY|7~DkN@7gQjb8?KBna_fU0RkY)@^4@m_@(H3ee zG>|)gAg$B<|3nfNL8(w&I~}Qm)h=bt?OeLIJL~L$wm9=r8`TKxQVmVXSN%nsESo+P za9X)09YE@)gG%eRO1Oh3#I0N}U8>$!t$0ZE_JtCD{YVCo(_sD&0CGT$zdAzpqYqTZ z2{v^@=x0OP8)STdyF2R~wcR)H1Mk-ZjBA`YN64FT^vmUp#77sXZR^nNgq(x#1AjyX zdhu8eb%;BfgKs@eIRNAX>Kd1*>4~g;z|A#iMN!x?(Hm?1B9_y#nMLDF5W0PWK0LfNlVP7II;AC7L*L&l;WKz0HzFTYz9zX z6U3-{Dg6gawV$7&PjUHQQuWn!0QvI&extFw2l9X8*&axBJ9{YqH}>{+Kg<8W#oj(o_5J3~^SBa#tDP{#o}d&A5;Aw?@wLNgyhR=u zZ#o?XD2RvBlieRuH^fGvb=i+Ct^07a=#sV+Hzrs8xbCpw*>6ACZd{2Cvu}Kb-&``n+ zx-y(6U%?5$pZ%_LQT8s%uVNovijU}z0sQgm72JTO^mZ97L|rjTqdr8{%wm9EWTkM5 zg?4cn@c(Z6ZTp8>S*E3dyXGbw>iw;tyEyzuP>?|v=!Oy;MPDlVfO8iwPv}VO$0(dYJ%jSJSU+h z!la#2S{GuZ)l5rA?CTJh?Zs+Aq7u!ViUI(-yjz_mBs{WO#-=$K=CqPAFQ_h@Jv^S6;Jns)_fr z0OV%2P%YI?B^u}EPDsK#Paem&vnQ7qC!5%yykRD=V*_rq&S-hVrbTC^CK}OkiMPTZ z3iv8MNN7YCg?)nY#b!FpZj(jd#K0To>XuU+ZY77$ zIne@k@s>-ejkS#8#KxZ25>iumj8sZfbf}y$i;dG_FsA4WY_3X><;zz%z-*&k@5rosXSUr{TUJOtx=TQ#fs>%OUwJ|Ijg-8i2P!+X98Fc|eY1fvY5h{_ z?2UP=Hxmm`a7%|SH`fh_7*QMvea6d1_cd*A(m5fJzooz=`b|X6=nyVBS9WzmF| zACt|Y(DVMZd+5GCJwG`FLEnJUFht$XjrQ193$R4WYY%5EY7R$+Wcj<3Ee|-=lqp>b zpoErZIkWK-za*^ghFa0T7vbrmW)=s?WA>v52!-(-ipz#NC-U1C>MmSVe4M=P>4Mf$ zm&@gYg*c-HWG*2@r4J&KYPgl=S4GKd%DR9|YcN;0J&L~8xaBzBb)IR8+c15ig;cuOuiv&8NkW|zJpnTZ-wsYnn z8-;VWoXo(pL>HE&A7~uf?Jh^Y>&<4~y*t(Y6ybEa(Tx|O{d~ljioV@OFPYIy z%(y1cVfx!78Pafxl`fyBdYZumxD8CA7GjAo^!6w?0jn3Oe4ul_Q9M7B(S->wr&zq8 zXsP!s?#vK>ViYZ>?x8@0IDiXGi_^Cxun{nI;wS}0fqr5D$(SayYa)-vD$`6mGD`vu zF+Yb~LC%}3)Qc8ZS0qeP-6nnDnU>_8X`>&hw;e8g8HIEU+i~3b@Vf1`4i3(b&*9R} zsSrs%Ma1wZ=7lIA-?KJTlHUu>cv(C>UVQ*3{8>o3XkTbc^t7sR4k1*e-d!50EH0(Y zOFr|7wOEeJl~wSP@3Z996@|$5QNnQMx{CEhr5shlIZ>V)P@u>`j_KY2qAO4(@iYk; z@W(oB=d-oQv235L0kwK3$d6>Oj1QVip-c;N6||Z9wZPy)GfUxjoxGI~&wv_WFYWr&;*<$)8G z6(>0vy+l8k{&hg1lvh-e4U5Y7`Hf<{OX0ghKJklLG%a?<1+Qz}GMZeQTJB{}3jJPb z@~hwVHWe;Hw~e-In5Z&mzuM5Esk*yX8Zk$Z%V|_>jP#pz_316OimfoWWERhWlM(O< zXB#Q%BJ%GvbSbeF8I(U&Bvn6l72p(>;tn{m##5b38AmQd`i%;^_q>sR98S7+GQ z;m%W7@pvoV8iqAP)lxV!kWKY6zst(^Tpj%q2L-Bke0m~Eh_f{|ymDG-);VdRAEdZ0 zk&_j!T=4GLy!E(fGFL}7jKJX}-N38X&J~PPoft&9-=Y@!IDtuXX~2foG;+cA8@0~H z)|qRhjla9pR-2&mMNGB{$p5=qZcTnMgEO@0VxCDi)!6x4vh1QavoZ(v`mJu?<;k`W z-7{5^1S`A8&4Dzc4c(e;DK=}#U=*AL-yhLB98NqeYVHDQbQ4yw--Y>D)>!Oo92e!C zgyQ9*JoCNLMVUV?F(8E%7LgzKY=Z?Rtl6weY?BUViz+QE9IQE=t5WC0?X|yyeMLj> zY{42{8AZyQEs~5i|F_*eb&uL7Z~O1`^iVle`kOxsr97{)lqPJ@$-P%r=#2f>yB}On zLgL-TmkG0V0#EY|*Hmvhg%}7>T1M$idvr-yt22z!@@ADrPuLKfHBh*NZy9j;+NmU9 zB|9;$3iMG#&dP+o>R(y|$e-Yr!i~MFDsj3q??lP*Fa6joC`~?Q z4ZISCSt#eO;F)Iew^Mj6LWo>0OBDY|VuSYNTLLAU7g`H8Z0k+-ZSWfgt0m}c;%$T3 zkZ&)ay~QTTU)SE@TYoeXF>1G%=nl^W3Nu_)2swP9keEV|L+82V1+RWOT0}6RaWDzS zi?KPGyfsVCK)+mM$$}k{zpS}w*|QPd79h@w_cGbA$DNMRae*UGe+aViU}T=kj?@kk zUD9`^tKKNKZ;A`dnpqY%oXYuHb>$p0KQf?l>V+#sb(AjTxQdjR1Xg{hP5PJ}LHi(( ze1eclbR$89O8X4q2nU*)Zx~X_vRN3cazVbBu4Qeb6vDX8!?sTj#r^KK&VP6y2aDAQ znfG_S#a)trRT>6MHSxRVW=TO2lEz5-Lo$-iL2v_V6jhm-ECFl|X)cqiyGK9-AmeQA*^H zM!xZopVC@1c1Nk=uK z@P@`WSzMVi!{QM1wOMhHh#za}@M}HbOA+cvI~dFt#9jjYh~w_L?>qf>vH7B)i!2lJ zp9nvKB>N+zgA#!r#2xK~lbzw!z?g$wDDOMAT3#izg_uzwvGs9D9&N9tPB0CODO-VU zDk%*RZdu1ap}4(LTj8W>P^m1%Tw7y-3;r}qe{niG&Ugj z@}+HXr)5@xNmVX1kUJ|#(hR!#01zGbnnW-%JSx>Awh9D!D&!BU1-abQ>2^ zrzgcbT2n?g?8Vo#l7-!Q6whhrAn%1*XRIf*zg z5x>mPk=4Gr;KpJbA>LLfO++3RV+a#>gXU0~`xD|4-^poQqO};6=JS%XSCMZ&Da1`K zL6{M(ma*F}etpEZJcY2Dtz)L=)!aA8C8IKtggotRenoZjwY}~oKI7r{=ySCRkiC+J;wmP{)98N5j4JO-mpc(EWN4F2d}O^wHbBGRlrq6 zSR*tIgmLPjJDDrxPx3rVJ*uv6EHY{^TsLBxXZ;8@4C|+Dw-WO$s@)R06aQ8ys`GX# zMX#Mu%<7kyDMT#$V{m1FflSk7V=v9XN+g6zm1B0{P3~DW6ot-}HEOi^-7ESebH}H=v5Tp7Z45grVe!e2vH^pdVgnkV%pG#>PVS(n&(usXGk~ zyTSyONNG8vm|Gg5G~sP(#w&)0SJHpvbr(Taz>lQcK5O?o+zES($R*|Khtk}95(nF$ zC*jo<05_p<`7J8IS5|mC359oQslpo(2)%%?h#0;_f=p!99n*~wv4H|9zg6UzgpWu` z7TcTKMDC@bEx;HV)Ix^rkaFwCxvP>mf7JOn7!F57GAXZ_QtDN-TyGpXrHPIqMnXMk z>#QBSELHpxwCEs{U)elHx41ar72Xg=yqr?Hk~_)i8`q%zXJ#| z8!Sj)2FwiTCIpYfA%;`S|LPsloSU?d;i+28eRmv8L@EL%7ebq-KL0%sgj|alITIig z#Ee5IJ*v>xpmcEF1$y3hk2@zo+|e(rqKIsbRiO^v=3# z#C-LU)!zCBHLr=O%NbcCWxF$39adAA=@i&xIxFSFs;Hk3p%R{*zH7Miw%Ts4JPx=b2GklD9F3xNU~wQ z;CLC%P^sfG!B>r!zMn<3mo`jW;AX0$6iIXKHp|FE%+_^rhcc1dq{!A*FXBn4U5IHs%&sV+19Y>vn8%*}nI8UW^zvU_ z%VO8Kik{g+1|$bFT2lnKG%QwHJ)F){;P#WTm$wQ z7G2qWT7U6$r|#5WH20o2cefu<1NL*3md{mMK38e^T&3l6m6n1fVC@Qx$igN|xsXn2 z5)3|4!B+S}6nH_66e-|5_&&PvhID@2U_1?HbC=Y=&`CHRhroA2_wd)q8($7R_$7k3 zM!wYUKWS>SZUw7!I!|2DGfqQ~^Q3vTm@j}YF}meO{vD2rug`p-1+FORX=>77;#7AQ zD}Z6T?r?HHw!eqvlg(wxYuI=46L%iU_}o~pAqY4udZST#TjPt& z##rfNZhypuVnua`oUdHyKkaJ|9fiXv=PTT(*q}cxLX?o;N^?=diM8Go#cN6SfeR2i zfLnGm_7c`}y&T_&HP52>_a5FUE{+6nh<(ZYZ6aN}{34iq3i+DPekUvCd)oIYemJSG zrNNO@3GVeQTudVu?%`nqV`49%g5$}TStq+J%lMUJC%ep_>Qe}BmaXGehVNVbw%a>s zot(70mR+$77gDe7_PcHP{=>=X$%kY6`@{AdpvmsC*Rb#8CvN{##>T{YJ*C+sKRs^s z58kyiKX+Tb^bX;MOmAy^k=eKh_j%v`h!y7DHr$j4?VPV%=s)f27Tjw<+H<}_Ha#}z zcju?DO~>ti%SD@Pto0^0XKU^0VcVtKcr*4ATtM#Y<9A}s-Cq2AnD6O(7e@j(#J(g< za^coJjUx$t(K-44^nh&1+3x^y^jkj^`(A9u($~`92(W8+-M8J-^Ru4&8d#nL#>8GC zvqX`L(-j#t*1RUyx(%%oY}Umna(5IV3~s;82&Kt@K{afOK(BsQ^!x`ttLT5Q0R8IP zpJn==ooCy7yI;U7yN&Jo-hRD~`k(E3(P-{GYwqkP ztN;33x_8Dww62!uF#uA9F!^`zhAXQ4dP0l-lALo%$lxrD@l3;IT@|=Yjw`5Th{zB+ zM0JbMD0r7xr-wZB2ts01Sx>lHGa`TWY{sMlVG}NOgBjhfy^&Rl*y&IOL@$aKV^ev= zbB$2d0ZcU3JESf~sOfNInv^-5;g2H0R(L!4T-W%s#_Y4k?6bz~v&QTfu4}xQI3#ML zh4_vG1Ag0HW#u!Eyt>3Kigy*dUw=hVcvUOWElt!-P^lU42jW}DedSz~D;MRj=u&=l zQLbKOxFj17wD_jEMw_qJX>&F5uA^7$4EOaKZT@SWDXufnSL=*~8wCi!E!Jvnv{|YB zSHvB;^YEiTc~xT1d$BdhA`#alolymgrIKH8$q`mAy*X-O3YGUpBDt@$Quh_IC>6#{ zl*G~T;+6G6)uFLV@ppoV^4%e)5!^W+{d)}fh=A!tzELnA2Ioj_(;NeV%5F*CpO=KgYE{7oRJ_qJzLNOhPwo((f>B`7;p;rres*t%Q90Bpcx&V6L$k8rDw( z&JX#_h;!S;dm-kG_%qxCDqLp9It&0r?13$~+jx7RMaT*%kGz4nuYFJpwh_E zW%mLE7-T`9^dCoyA!>s#{0zN7f%0Ga3?<*2WY)Eyv>*UL4C6JD+T(fIqF;rQ2P5k< z>vjtgVK4xfoPZhjH((V5O1J)H&MZc-W(v}dM-bs(8-$n}g8IAJz1%MbAOGvWvIrE= z*eiJr88=WNdZtMdix~d_gzR^8rek|#ob6b?t%``gGB~!4iovrj<%UiEZV--^lzfP{ zxF$b{!GVzhwSj)*PbgtT$f%m^f!0l$<~XiD76ZHn?O2&+h?w+D`6X=} zJJK6rSFT8LvRo}2+6E)7R7O9O!AxYbzVUVPf00DXvLK{%!0BfMNTG4gGS?)DBCb=& zgG$jX7OQT4vI;QOO7BD=OF*T+b(Fj?S|mJGn%veJY_bqcpsDXu}_c{pB$H_ID!DpuKc`PIU+& z*#Ufic<;haPUfG@0R}K~tOCYMXdIAsf`7>0zM}7ftH7TrJ+Sf7Qf2VlcHjN(9BqSd zI_>TfO>pyVx7|Mc;OYo;=c{o582HuLyNfA?S*0sDFG2e=q_m2`9_hK;%mdzYCgtb5 z&7Qq^xlLgIFqI}}AP%tVidLB7IlB#A6V`h0q?1B;DTe%8m7~4)Lj?NII z^b>ztdkf#q6Y!7N2N&gUF3L9265%uvS0M!)0D-@RGBhWdA8T}9 zVqwQg!Eq3OnkT0xZsMC5j+@lY`YVa?B!A>6Jt`9rn#if!{M9}YBq^vbCCXw}B>ekp z{gw0N;+sUe5fpyRNmfx0Pt1so>xqW(Sv#Z!=hv(bHO^!1iQhZM0}L|p9ls-N*J#ea ziB|bUnLQ&8+V)o|#Q2IObe&a}d}>`Jg%nu8h|{1rYFpbaWP6z_$;eB)y;Lhf&%<)V zu9Xwk&IKE1&IB?8{I8_jTfIsvZ!CYaQB8r7A!1!r72BSPoEb6a}$_)lzn07%$a@s&fuSi%WdL zotnl}weNzaS;Wks3q^X8y={tAH1s1=b;3irLBw$_Q^rifn5iSFOR^OfLxDE3Iu^F` zM1tpNx-?&YtTUV>U-OhUrzv|)WSceXG{okettmCu6HiBPyp?@a5qz0|SamXtxVbY) zN#@JwkO|d{FIJmcVn+)>R5E0=o{R;FO&bic{OdBzFzWFZ#-h~nycw_NkYr;i#gRAT zVT36-Ck2@$c9A7BtIUfoPvY|Qijl$m*2S{ z!CLn%@+ZU4@VTGjpq3?R2s;VN8ibVp;D0a5|4>orBz_6Qh9Rm z4{IWm@K(6P$+X6l!Bus{RS0E_fajoNUSQfx$w5OF2NoirN?K|aIdzeC(1bP5&Bw}o zi{_iOOR5zl6}>Obiq{LwMCA=dxq87$Axu$-BHJt?qL4z&E_mvg7BkjXo9B!$`aC6q zvASY{LM~>>bD4);JSF)~)_G~S{(FkN1mHaT%BvrXA4Rz|ZF9ZOTnq>+D#XemlHu+aAZ&)&axw{0{1 z!tnL)_IjT0z^d6-DBF@noou;rTsv{EX5VenJ4x>zBBz^@=va*`xsu%2IdrY(lfN$p z2ND25ij*K*N`{GTi3EWk1~Y>JFc_rt#8AyQuqo*sbdezCtcP@fR&wypYYaFr)mQ?*6^krRJk?PkVwBw zm58y}T`{LB#r65DIjZn-><=ffi$S;;(b%eEHZKaXDa3~3XmF&gv#D~Egpn{GjQz0NbOn`==+ht25#>g2wiDDW{JSd!8 zU$RK{^t22yFI|AD-1T1h&+*C;{~;I;z^Sr)ImlTC#DCb`-A#)B+1&M-{~|YPyUj|) z^BOe%L#>JNA8zCN`YRf%q0=AI2Hx2C+L6ze_W$k=Zus_nB9kH(0e6->gKp}+V2u0B zVk0@QZ3N*Ca)=h;FuuBR_-@+m$h-rW8nJP1GCG^SBOSyx$>rS`0t5_Uar-CIA@(nw z@BR0|V4F`Hh^_M6`QztdpQ5AZ*^;*(`4^pWzXv6q4Bvpef0FTsaT{H zq?x;;aSu{GJaB4N=BL1JJaD|~u1Ls|M#V(;N#Rqcd_dm#hTr+*K-7LYK@45^qVnE` z;qByNVbaxs1_GK*3Aw&87g&+*v!;_#eA>`*W3^|G;UWA`5WLwX%9(H_pkl?`cker8 z$Nh6e29x)l``aX8k=(dnybr0An#-?$+W54wagVU`AHcE^qisAr`Ss-=&rkNbed>A) z2RN7ukYBm?{vdBWcvys-U;q_z)gKNS6+#KXK$rd$hKtZ3f6zNT%kaThz<7`F8B*OMd#4DPxRuxbAQ+$+-DLAXY&LpZ%@+R7W)m%uU@CU z3bRFjNauW+v*@Q~p^)aaTiz_baasD}y`8q#uI?zU8|k-$@ZLA(=a8W&c_$?eX9*~p zFvY#<&LkzVstV0%WThx^WnsrX{JKaAC`95XlZjNG000<-QZfU3GM_qJV$A$X?^4d> zpJg_5SY@|3&*^;c3ULzo5an<-inNg4!GL`K(JlaXQ4g*v?p>4Q!QcKsq$%(mza<^j z1o%S~K@&ZAP&j$|n4|#^ZFrgF_{^I$`PZ3%vAAwRm9| zaI0iPB2>W@BvPfEh^wyCh=eET`BZOGEZ3WSVaRZgkh;<#bkUJ;yx&co644>|=e?o*bh?CyQz0JoD5 zP52Zsx&+9%FSQHbwgoRMW+POH#e^o78ijMOf2wkc5qp$aYGvJ4m1%Q7i5tR1ML{~5 zJBsaLXtw1a|K%9}htW*)9sx2V{$mY3tLJ}Iy!ncM{f+DrCNh2QgYMpv!YMmB*zH92ef}kEtu-4J_!e^(tbDp2GdE<{eP&aX2G!b!rdNqyi1qzo%*Bz6N;c~=6!O;D5Eb8x%kA9%K z2zIcO&xady4G>N{els39F6^blZ$&{RCa0gxX(i6RKQQ9M%R6#WRPLM$lumhDKGr-+ma85DZdMXOQ*(D zO*#}yr=$Tbf*N$*`D56%zwcbZ8Pc@Bp}U&D`f5Yk#LHcU{<`XS-#X_IjfWn2OPY;( zM_i3BM-Z(-v=s~#_`#~~nGdWJUuiU7|9%_XII%P8VT6+M620h%rv&4hOv%}JD0_M( z^v4&lxP5eW-5>O6uP=7kUh&PhUn*|{gg$*^Plv-TG zy_sAQTL0$}Q6j+v{7m~pqW1bd@L3=RX4Ha;P`bUVi;Ei~xlH3K?g(tsiEePFd)Q#% zpR~}RL}y)uE3AG#EzK}|IAZe%F41#TH-wIzz-dJ53N{M2v(YnI;p}pCUz&SHdJ6(( z$8k%EkeK&s(Fq?>-E=kVPbVc}zL%JfA@h@Bx}9is4k#290g#?&4(gO>)9E=ldXd+J z&ZFN+TL5||WMEP{Amde`>dj?ICuA5^bfn{!Cr*P5kc+5X=mtQ=frTGF#NtT+@o0{G zGbm@%jnE;K+X17ovcZ#6U3TXZ6K&!YWVsLS1Y}GiUXrQ{{V`Wkf0C})NC@{VX+Mk0 zk3(~lJ+_2bD`5@7ZzK6|>q(mPrVRfrhcCT4Q@g;-*8zDmgKMemjYhYVMil=u=jN`^ zhj&6WYQ9&)EVOXD`oUwl@)G7RJ>ShSN^!zYn)G}{m?-9o3zeN?7aWlMFaEl7-{mu` z&ev`ce&&G1k<5M%CNeX!MJ5WSaWRd(#YHpjPwar2nSe>lWOJV@1ZF5WXYqJ9UvEiD z>Ed#qAFWXuUkyv4{wWkFDUGk2^ggwyIRdI=*k{NQ1ky4<3skP3OK#tP5tJ!E26v0#`u#WFp-lkLAq>ny7|aJklGye}`&q7b<|2cbEj*Sr`$k?!Tlh1F5c zgWfUc5YkLTA!ww7OXm19Hat>a&+;M-drG=Qoq$nh;im-MV5$X>KUN1I#OxYKug-oc z4ZUE%fSYFWdmt@*mC}V7Nn!$mN&vr_RF!)dDYDKVp5g|#Y)spyh1j-D7aeEv4SHYQ}j zOhoPJpx_7KXL4(F_2%4xVIXA_7_rkei0_{Ka8i1D^y3NJzDHL>iFrF3Ps`4;;oyd( z+4z9~`Go?3G%p_gu#nl|Ai zV(^Zdhg{l~;hf`H7vHhQB596$jFl%>{b?2(UCu?!3k^ZSVIZCJ{hx<@I%Pb$x&%qg z^LDk-D8>k{p5DA5!BftHPP&wCk_!uAYDHIz0 zJ|dEvXoE?q63ke>){vM3eV*{{%;Hl^jtG*RL6{~v59)nMtes2Pn)mhnw5%xA6EcFf zoH+MggSiiZP?`8RlM!jjzx$IbpV-_)@;hQdX99CZkA5(`O0Cdv{T(*JUcGrkv<{oJ z`#(Q9Kl%`~Lw}QvY8z)4IaZ(flO zpmT9vqQTOM0lLYyVbT}{54mcFP<<}Mrnro>aqjuPcu6@k2;-KFz~W|e^k>QaMshB6 zExtP)f?Pltlo7E)=EwyG6zrT{Hb?>QtNhteYB+8OItm|#1NpNMAjp_&9%2lMruWH+ zX2SQ{<fs#(1P4 zvno73*HwjW17gk=KC08ddXCEUe6(rbl$6bUMdsp+K7j6Rkmly{5UB9azXP!+oZw^D zDM;oU8Wx1r)U4k1i&;bIN;2^rF7cf82z-jt5d@!M(J46)g~?x=4O&?ZBTYn1JyL2o zicnfR<8n{9^2BmEa3cFX*E-Zfttu|Lb^m!0w(CDHvP|X0uE_SDV?`|scZiFvyGhbT zBqE?2n4??wVa7HG0wJJEUi1dbDI2hu(^z%@bn2K6Ct!Mw4=nP%9#$U)$3rrJ?@JWP zK?{)=O#3T2rE0LmeE7TpvqeLQJij@XUE$JX(N?yGcwH%%F3P<5$WN}~Vf<}Fn!}5T zb-Vq~(Y|9*xWmi!ww!)Zu4^c}8EU<7MeV69U0vz%xl`U0^-ZdAra@e$AzY3D+^mr` zPsO@4zDh58Hq~27vqI9^RW7tN%WH%+zFM?IOVbE2I(*Z;n3xSB(WB0?hhnS;yhP2I zA(7;esb~)S&i#Lm?iZY-GQ}04j}10yAH`>YqBvGb-5j^+*yF^uW7ZEnJNrN$h_VrK zrh%w5EdS@<|J1)da@>E8iu?b3_~+l`=|4yReER2qXAmXRwCW5s;4U(P)+{l}qdA{L zbHcUMF_8U1&@x6r^9+O76=SJ==b!ERcfeS($J;jbKjzPvpC`E|Hngetiv_`98M>6v z@04?g#7=@cq8am{B*~7b{>#a(;73)H7S32#<)QsvmNpJ&2I%aR4qa zlYj*q6fa-WL#>D&@TZYfL-$kOaKl0!cb|F2!7~R#!q#T`%9itGOQY#FY&}gC6q(_oK$GkzS8xX>|KlI-Q zPP^cD+68eAZ+LhKDV01S51@-{7f6zFky214pd97hK*;X-s1LpMU?4|{KZ|3IPrfI1V-m}7R!HX=`S9es;29Xe-Dfbs)X|!Rom(sO z3cq92r<_mHk|gp-AX9?y2+Kr+b3tHSTwO?T_?`3~A}vu0*CY{+X6Fwa@=AwbADzjw zggRpXT1U+8%s`xy$b<-zCnDN-xnF#1!FqyGSqA~XM}aK z%o{<}EWjum5ls4tu*FDMJNojZqIF^qXK0R4=j47d!6(LjLtSx*c!@rqj9ekahXEw*t2w!3G{hiOB*dd z`u^y-^XP}87cVxXi77hebQyHPGo1;?FVCJoE}m&&_Jh`u^m3F?C}9rO9Xxg)}}dKkS~5 z5|kT(a;fMyxMAXNE}zK>(iA>DFsxnRA!{g{c0nI}M^0xlBKdY=TZFR}nGz>R9IKBUoWKEP=49Is>-g@mj2C+@q}jiAb78M_8=??dA6%^2R|gOi-{4!CYt;B6_t8 zTId+iy29G2{N(p+p z!h`TnG04%)BphMq&4M{WU|=668SaA}k>qS3uer}EVE&4p`Taraiu>_%(3A#71<&I9 zlgL?&nD~53Xd{{uin7*N_pCoin4LV6r_N(hL?f!iAB9r{p}{q|x#)~yQv@b*5rb`9 z5~tpX_m@1YPgnDlVM#wE45(e}7Lz5V9N24(!PY~yV zDYgl9LIkJq%n}S!O#t-Eli64Z_^9qwq>rwqBhn-Hse2@xAboi?HVy%+)h|=f28TiDDP#7j4&0$b#3O zH{B%37s5w_UMal!`BNljdjHHfe8rBBVDl4<0uatT2%P^M!L9~AGy9@g-gr)fN5cf> z+u#Of9GqS-q%k7d(jm~*?GKA$l>rJ0dm{+7F`aC%ZKGtg@#c!fUSUsxU5= zIWW#<67gKV%)tJzg0v|d_9%{>FFQD5J%VRpNT@6ls7nUPFDX;+>O{N%n^G-l(mMKR ztX}lkR7GWWTbt~bGfsh`&UY%`jDVCBCc=n0;b?YP%QOXy*2kJ=>r&p1_BMo{jQNC5 z4e&)6S6za&EcMqS7kSBBUV0@3H4W(#{AEN+?i&gVcMnO?TBRJr$28Ye>5{gONT1De z7CkpW68mt>h{RK+j5J_;Vx9eAaA@Fj80}2N^g2B}QZxoj$_82*a_Nx{n;ioHftuK$ zjDEkb&%eblnLpSWmMMu76G)ToD#uCpB@&nzA)F3(RSpR6i}zE>Ep0-HJ|>C|_Y#Q1 zNtGQbQ~kX};ohxqLe{iFdxJ;_l7UPbg;zL4fv4{EEO3F}w3w&Xz zLu`~PO?OA`xY0+mCJ!IyfhuR3sxMU^U-hdIkD4Tn5L#xYrjMKLCR1KVl~Nz`x`U}6 z(PINJHuFq>OWDj{gY--yH%`f;GyRpgPo=@lQl>yEFOI{JR-F6H7V#H0j$0J9XNqM=?`w4P7n-fChx|uAEw84B!G;E>yplo{!J$kTl9y)HMm*~$ooOL z%wuPKcQvMN3&RizTV52?1?01sF?jUs>HnNOr)N&`*i9my3JlW*5Ko0}Hj=_hQMU(n zFbymr@UR}PU)*#`4;}Y#-`^x(iic4cn|Bc3+M(yloQ+^7hJUjyUL#3Ax}9S9GQ9t> zQ``(6@Qipg5+cJe5`G6tkBsrdO&8oyrDnmK5(LC3N|Q+OWD?b5PviZ2!sHN*w@&1MRI>Eq+5#QSf1M~PsFf|L>CY%)XsMDeYzO%dRbWK~zsev!=q zsY)5zAkoxi(f&noQCTkCe-xP>NpzJAH-;1CJ-Xs|~}!6FGhI&t=?TNxR2^4ELB zilvndXv|Q0#2!0qd?WN$>XL!#FzA&cM&$fQi1zh;ci>-idVa`)sftZ&bf!qfVZisp zg`6z!#yFndrQx#=953`<(!tC5y9#C5-nV#qUH7TYk*fBTen>28@V_AteWAoq2ki}q zAE(JSHC+v%k;$NrwBtEUKny82onKw}!;)Z!p4i&4t>ghm16=s9)gzFSjv#U^<0|Nh z857YRbLpfLFw-fPGTu<=C5&7CH^vvCxy=8@6X@z1F3rTJ#EwP6q0|qvkCji)t_u9A zQ+Pl#fB3=M_C6IDoy5ID0@56b}ccDF=oA@uA`js&@z%t1&jIndJ)!2 z=}oyW`D@^$s(l*@~J0T(&uA~GGNzOL7Q!@qznk+~R%sld= zJ!#Zq)d(3dwx7fJ(9M@514Nwq72AUbhxh3=h{(j<3?E78*l8N+t!gwZ3>{peWua^D zWYfZwYqD*ji|Wi3YT!eNMIQ`DS8vFlGr|d!UDyg8U%j{i_0b8YP-zx@o7lYU?d}z6 z^&x3>cF+7)w~^ay${U7-Re33N z2IJ(i)e=lFW_^WPQ{7wba@S(g(@`xeZE%7jD@Ln~&uF7%He_3o;=wPewoEX>Wa?!y z#MJC3iqQJXINHos`yGe5hukMI+SHmn4A;+5=^EAF=4TYb(Mn#6cey; zCPElZoOrcjhRp`+(+rT(W|a-8jkCwIP^VfOqt4&`(bZ(Ywo0&5Qo=Y!CbkSuLE*Pk zOpXoOmzq}IjEiN(q+UR)O-e5tQ&_R}=UHMptH+I(p!T{M%E;N5Deva&&$PN3`?L&* z4SgGoIi&uL^K2yxH!e0Y5p{mid_=4VjLkdf{Tnx|ODqPLyqGzjmWXxpg?Ds3G?{w( z5+l*O&_!!w8~~ud=_EIe4qN)^*$W=50R|-D(vld)^rvO#MZhBgKKt&w7bh<_L|iN$ z&0Nk&UN@k-t*EOPi^}7lox!k2%7jL-lp|-!3s>w|7YM~xU|wm;AP7d5EHEF@gLL3U z&-Ehx5p_6|NisTvmkZO;Wr?2eQc#Md&J{1S&^-}K{oWPQ}Eg% zDD)_A%D@;{nhn(0!8aqP7fiYVG4)`0JY24XvQ41nGY#V+_O?AZjz~#L~LfuWS=w&YZ=ZP%}EqqumUS= z7U4|Tzqkl`eSZoIATYu3Zltm$V@ZDMCF6BDn~8rB=m8bw`6`*RiSt&x3NUpgS1Ed= z9)X#4J}XzNs&=1BG;NZL!%LptqBB@*5=@)N5;cvLAGZ-D2(d{mJ%VL4sg+nj+^m!f z&}O)@63uLO#)vl@={k)mG;P{xT_%r6jaVcjqeUz{E~szfIr$+KrAxx0RpD+)T2Gsa zlFEqI%9W`UxC|3jrpD2&XiY;U7)Yk%aTC(e=@{+mY-O5X$Wm%T#3Z#;Z!2f6W*dCb zT*FP=YCbG(2$x*LbA??(qkg7BOPv6W$>^<31;#dbt2B&-hltlq9jfTvE>*UMZ3;r( zBT-ifn?4O}l&)wOyH3p8p4yYjkDdRU=lo}(#7f|keMLI`jORe7p8xDsYxQ04UnEK0 zt5zD#O66abYHhdb;rY+EaoxfB&t^7a=RjBB#N_%8`AC5`>}H>8*E5}D=G4BT22@M*BD zDLcNn$Aee;lW<28B`1-3s-qzcC2XJwcb9-sE_{tHCuKaO8V{+)L#pwRYCNQRd52U} z%g`tKoJd*sti)qKUJhXP_upchAXvJCsqc72=ikBb@BVl+q;pi{GuUilKr4~ad>=N|Mtfdn9_hVR*2PJqTk<*`>NgfKlYWlI;}D9q1ml}haDC|yAttWF$i%4t*Z<}Fuehf z6=__^DneTXgI~Nzn?{~i+Lr1P-DG6pyPR3C0;W9MnWnhjP>m@@@?f6JT*A_q;E-c7 z(4BJ2U6@BOFBp)~8J(}ePoi#BKudHS z0?gY{dO9z|jzi`K2?Yt0<+P(!VmbeC@^qW`NGhK!3cFq1}ktNZn3=a==+mL|5YM7?m1g1fb{{&Xv}D$XeMDKe{CvBtUOB-R4f?y z1m@vIrc@gKFANH059ZJzKQ?h14PB*^c%(6;VWLQwo?=1>yr{%y*sIFt*jdXFI*X-( zXquH|0&PE;eiI&7FoodA)Y=7(A|3Xa_3l4Dd0HY}?8}JAQ6A<)J*g4Px4KQ0^Ib)i z`Q#-;VxH0njdT`*u5^1_j$3jz`OQtbCNGZC%(4vuwolO6J1sf7Xs_^V+Fyn@oEfn8$YSph*w-6{8)V&9oc#Gv@1}5fx~d2zR4On+j0?=+y=V#6dFG&S`KtVdvsp4T)tUmQ3jx zg8YOO6Y0j`2^m2+iytH01IHi`dS#epQ=+GBrSmwOp;HTDdWx@8(Jr zFFaZ_3d@bwB*g*cywYEQACggqLwz9U%~Ob=O@c&pNc4!380-x(aAHFNss}^!o_GE< z0EKJBzchBfSO})|7bWRu>C*#0izJbA(q3Rhda=F8hI*WXLfs`E90q9|c;Q^lK z#E=Ea3+K*RWDP#IEs40CN1{12!~T&xfP`8Zot0$d43|nl@MNRSZ62G@fitnW(=_M$ zn-2+`FfSwAT}$Z8$Vw-X)I%lt)npo`s@E6O#UyqPQ&{PaL^fL1D?3loCpMoZpNeA& zIwc7~TGT5kSs2zPG0d(TS}@V4xR1YCMwNkp+Ttl)zoVUU5HruHi)=(wIFCVck&uGm z&=oS6BPbbjjMg4B*i7f~%t zs6KTTi4UV48a6a;_J*e+v9O{dG=f2rsHYo5Wia{EiCXyF4vNlNH>MO}P0pcMdVD<; zUNILO7H$Y+IwSUzn?7xxtPYt|81urEP;RorWj0er8MX>Pm{o2<$*d8KC(X}K$vLay z3f!EM(8yu`No+i2u;f$}_eI+f4ziVQpsSk_u$WRi$^T&Tg%*Ug|?3SIx% z>Aw@PIQR7A*Ozo>i&0{}zE7PRp1k}msXt-?K0|AkHwgb;@~^ntB*}@4P|4tGdXvy+ zX%<8n$yv_d{N^0ZCd_yhy=u%eoXHmba8#mZ$1F=8?ecZA%Zcf@F$878@%qZ~p-i&r zt`~?#2vbiK7-$+9*oL;|?iFSGJ)42feG`vfmVP{X`3O90bZ10HXEMT*1M*m23sljT3pPfi~HRyz8bZp-7(!dC&6KMm#2XzZsL@nYmp_pFGTdP@C7 zWHzFbKtIqK3?4%*5L?eC0j&~syYT6>*-*}cPg4L*JYo93fn99x{2Sq%$n0|11t@J5 zlry2zYBb1+KOTbvCY_8UoskG2FC=#2@StUzgrnsg+{1nL`YpVX|1cg0-L&onpD%JEEnk0Bl5PUa2iODAjbnU!gQw3y;9js zCfy`=HRh3MhR!CJg-6eR28Xp5n{pP?9IM!W^cJGMQ!kUyb>v-e|8E#{`Sh%K-S`H`QLvJ!7x%u7WmWBGrsdlrXF8@bc2#Ga@5vLgXP0$nO9@`27KND!^hBVYwKI z3Cv3)Lp~sX$H5tGC!hh>0h7&;kl7}!*>c>hywdYfHYsaroyK+NL7P%@kkqyRhRqHU zvt>dQ*1&LJoLqy;@#u{=V_Gq{#K$tAOKUUfluW5iDkP)^Qj^*!Dv)me=^hS+nxMP%@L8dM7NO; zb42I(B&(G>)P<3GGnC2RJ5U_W<#!VTcBmKid5MR0VN4DO?XfwG4n0wBJ0%x76U>je z2Lz5kg>5Lp(W)-2a__h6jnZUm6vESt&^;C*y6psj~kBv$h((2ddKR1?gS`oPxl5-wAh~R z4Y@PNJ>8kO^Gn;hvFM&|+uN#@X)$_urP$?5%m5%fje5Zr>B03@_%6{2l5HBzQqCb{ zKwuSVHYd~mfP58W7d@z2+gXt3^_zHT$_zUXv=>+)-1N0%eSIGb8+J}Mc{BiAYeU02MfBHaIC z4-0OsS%IxJb2eSp?KSBG3fy4xIS(Yhs7*FcpFJ&oaT{%-@z@$~eTgr;=snHMMWZis z>x-nwt@ytwUT6I13{y6eqgvc$PSZyTS{oh^tzvW`!=(W#t$Bd?X*Lv5? z?Yi`+lv5{zth@E7`eG@rJsKyh^L7|byRL}8O&*sBjlto;+6@nId(7%@kJ07hOWPuo zfB0&90BdImYi(c6Lc`dM16d10+0294+4JA-KCDPAaoNK?$hPK}(?mwHn-)2MEZ$mp(hA+e}A^h>lQ@U~s>%Y`Nju?bO)_&%?;DQ)eMRe<#V)KgTu{!wwXwg;k-?e*y`giU4}Ck*4!boO##@Zbp1o zFn~UV5ltHqvH{G)18LVn>Pb_~gd4Kc`ljc^Kzlp(?wQ$%Q7zFTFo0wYORv3CM zxF3e)VcHZ!FTN3IJ1*VQMH^+v-R}rtLZ7TNHnY~F2gOqnIrBAz9_#P)rcZET%A%XJ z9t5Z4?N7;rqoN-vLt{t7^VpbsGeoG_H!N?4Q2HIQ_cP~)h*|p_WX+dn${IXjWBVLn z*vqHL7$x|YRFJR9)!A9U%bF4PAB=`wG3rQmYt;5NDAQSUY+^{-zMySf$h2i4ZL>m_ zZ3;OyDCBmecXOCVMoXXeL76uvBz~5rU{BZ`FY-D(7>d#=*jbP|Zu@Mvoa=JZx?5$g-_tkyc`q zGjHrL&!eTPi^ZYnD6)W1TFbaKB-^GC^L7w1N{TXO+Y#v8D__KqWy8Y_Ftemb+M7lZ z*nIKw`ID#r*>wDFcQoz+9_EBVZR6PNG_`$u{T?5hT*8tTADAqAsx>aU(YmKP5Q{5~ zyaLRZgAO7|4Tn{;Tz-VbFUxLPlT!B&{czC|94<=Ql&;_NId(mh9vvSt)7HF+W`5R> z7(e4S8dD#g*g+~gZ06cqLpfc|B-gGQ^A;Lwn`h?PHnTuuW!p2eVRZ5`m5Sb8cRaL| z#(LQYbGPB~!{?sTXI^Ld^vK1nldG286lMpTtYcpqTOeToKfgO)l!4TUW|ux_+614z zC>P1OZ)P0p`F#6kO_;{k+oJS*y)jf@Gglj}_<=3#1-7sc7%rMBZ!NTFDhyhaQx_9L z?xU6Xx?$g8=;=jz!$6A8k(dYD6YP)am+PX2ZNHIH{KiZz1`Hs zhw>0noiMkb&|}KW#;PpkT{O1gGd9y>%<{@K54@7W?JIe{Ggbqz<{8bE9^)o}IAf%d z`%~6DY1vqCA6wXW48ov2d-~$#(bJdt-Nv%`j4kRgX2n}F)uY;0&?#9T8cBqJg#Q^rFk4U zls>_=N+MqXfHVP}XFFz!bcMcA(wODZbJB;Oh)$epBtDk|c9k@&U`J(7 zco-Uz$C_-O=}7e`RI?D8z-d|Ls;rUbtdhnG=4_7)0eok|oK1F};eU+6e>s)qR9U^QzyNccf00%W#wqD$ zJzvx78`7VaHcQTrWEi*a{P5((Pv1B%Zip_p-Y5O=k3T+pT4FbUB13%t4N3Fphtf|! z5u@}Q=a_WD`;J$E3^pL6d*26sFBtDTJ6DtO&R|5?YNz}6gosecObQ!q|LqXosyfw5 zrM}};cPcHX(%P@q_G`ON(Ca%V*O$({4Vv}$^t1#R7qa)mNkwiY^Qj7A{RYI?C4Z^$ zJG~Lu7-B)v317zvGkH$x1Vs?L2Gj|Z3WH|w0T^A4y8*q^=@0$!4fUp< zY%}A9faamnXf_w4UjK}UEM&4xv0et_i~f|Lb;ua-?|x7AMLio02BUW{IRnNjU$cX3 z;6-BS?=x(Uv#H^uo~j%e9pqnJ(WuzeL6uS-1`Om8rwq@=0aL2q4YrxNN1A!c{3}J_ zVXTV?8APxi`27pQ7RhKxsS<4j8dBlj758spBNzcA1ePCAm`4Q6;g#-qpo<%=fV zf%Q4M&4Kh7!MIN}Y502B8nhYd>r$0?U0;6x^90IeLELkk3CofA&959-lmR zj(;N$Pn@HlUw;4WxpV*M1$lbkIePk-{QTye{QA@LlNT>e9@AV%f+s)z^urVK8p-GR z(bJbtPF`#~Po6&d;pfLsp8jXsIsW;j^YqzEBI7?kc}bGJe6~%q=daORqF0?~-#I^? zJb&~(`FeExFD{(Cy##q;pn;Z)6dU;diLUkW&;&@ z{N%->AC8{ zoIHJW0x6zBPQN^PaZ)5r^@O1O4`d6)|8hji{+W^hT8N-yAD^&V2sYiOZRtGu&N+Jg zKTn_v`~|`SFP?CAp=5mYJ#PZS?JlwPE?GC?e7!Gvgraj;1 z{WuztVbu4d@#Jze(!Ee7fj_2eARy|bDnXan5Ji5bTZy|Dg#Nn1f@Qudqi*+V9DskX z*dBP*;hPVBI(kWZoTp{yCETWEFoB-%!^WcZ`4=xqH%>Qlf}H|BM!d8QpBlyBE5zL+ zHcy^DhLoGIn#Myvm7T|Aj64Jj-A&ROwKpOF3^3~075l3;~XP+puI5vwJf>fYeNpv#U+G7zL^CjOaE z{orAmkvhFyToHV9M;B$Na*@Ybn*@RL;Cwp0+~3)G_wHS(|K_56HSGUgx)}UjJ{#}+ zGYClc^Vbfe{LYXlJ#VjkKD`(`q}y(p-!2%=0~!$RYDk^1HVJlFXeP{+OKe%Cr_q?Z zr?2Jy>1(xv(!D!kvbl^^kjQsG)~Cg1b~qz&4Uwddgpy2pzE6v&&faUfPgt`Wbt;L; zD8a*X9*W#x*n}kvx&{HxJ{&W7`oBm$Xg>!odnJE7_HSSThzvqYVb50@5Y;x_-1uMr z>wf_ZwqVZso%@WQ{1IPXF7YHz=q+V#1hI+`b%wG2n{A|(C+dxyq!0tTS7|vb){WDT zSC`aPTkC~rmkx)gksj1BSPHD+Q?i8)I77xjcPAK30{A-{aXc?6tH?bwkuI)oj_wtiFy z`k*3|tPR|__@-!scxu6zbUq1uJ?Pe&A=_e80@Za%eM|)NYELwI{JdE;i>4`jCr+@X zCs8PTDDQ`q87ka*#m>Lo@S{ymQcPXgR>09idTCqo`BhKE*wr2sq!;^6-D!_O~% zVi`zD^^<_#1^1}~3>;y?o%(+H;mOmJ(u@Ck^3zWz&mHPkz`Z}1c=f0Jq~DF%dKG|1 zG)h#is$ylEp>qyQL#iclgcv8v-5=kF$~Po}3y>RqR(9P;)B3`TkD0Ve2l(RA(bK2g zA*OQ!$GQysF0{yf_vrEe96fz>Qu^*`>G8>TPo6$uvu-?$(B!H=rNavDWX)ZaH=?&d zZLw%Sez=Zc?1Uu@On=bv7Z63N=6$K2rKn6wyZcgiO9y(4@kpa_(z>0&sQZ?#VhCDO z4~WnoQ4V6jRktGsPLmLCbTD+}bw@@)E(~qXU}l5AI-%<_VY3PgIAjd=H#SkV8S>pG zt3fI`hDFKm*(PtI$~#YLu)_`3L2&2jIJDPh9bVnoUP+o@YNTAlvV8y zD*1n~-AdgtHT6mBlxRXDjPCe~wkHQbm$HCKF2^I--)N*UYavEz&Q5eh;GXkS7r%2`{mZ?*9#Q>?hy-boBh_$CH;Q&%bd*%`Zp&;dDE431tVMpD`^M z&x8s5;6{w-FJQgKu!X^myV=F=#JMl#1RJ{(e}|0bO3Y@VMTB3BDJR78zv%=l4NI@y zGUrcPOyo{Knk9p6#_9y&h7ajTzc^bM+sOU9KV}3bhTVDpY|3Yq1Sbm~8}p#<3REbe z6q)TZOU05>8kLv}AcRCAEzXj2#)N(|!xSXEE9I48))Ks!&E#YJC-ybMW(*#^2jp}J zzF{S9Sn9R8@UNqwVe--7!fiz^F~Mq4XlJU2=5cfpysk>GavQ1pfp~t*MQaWfLRL`)xLH5(5 z#u>B{-CRe7IhM)nZKwnAM2@LenaCP!3&f^kp2mJ}(&-b1)`F1%Y^)_Wt_Yhu!SyA9KZ$KY3wbH( z4OBLw1)71H>TBpN7S50NBboCt5fF465$|)-h&^p)P)J^!RQksD$cx5w8Y;7DL?L1( z0HT@5Ar4v4JYx_g=*Y-m_}ssofE&!!VC49TqY*wI2K9nYC$7Zh#Z}34;^!>K=B_wwbZ-&V4A6e|FC( zy~xI?$uUW&sT-|_CvH|%LfM?b6oNmLxt3re4{2;yGNw+*1gwRZCu|!&ou%rZ$$Tgn z8?rSV<;(K$!Pf{}g92rHC>zRy?hYr&m}Qob4Gc<5k8Xi;faEIY#OWR~GEhlJlTs)I z;gJWG`m6Ewr5j%pS`s$+(c#`3801{V{J@nJGhj=TF&Sw|j$?FoMu=>{!J`_o=i$7l zK}FK?3~kHX)d>UT#?&rRqx7s*WxmRgO*l3PEndmYk4|`1e;Ste2;*rZ2I?Q8-pkH$L}$wiC&mi7csD`kv$isFuyov#R7qNmr0x=~a2K!M z-LW|ZQ(tE|Q3jfD6vlAoqZg(qSa=OKO~^x2Bx-J$qufy?Du?!UA2{+rC~ZbTfF>dk zP1}^7efQmqlb6(10GG&M$R1Dm3!Q6(&T_QdFckQ;plRX+o8x zWJkj{Vzd}*HK;~{UZKRxqFbV-(#Frm9I0b<(nkE0xpST^wQmxq^1}^nrdXBvM&!&R zAQl>OW(6}`5)aOqgS%xR6LRU4oinFOyoqLHHNz&K`EqO>Omm7)KYA+6hDMQBEvne0 zs&-`-3F#F%JY+gw=4Q-;g?MsaCQ|utF*dp*=2;Wg5kubeflVHR*k!?9W)FPk7&j+m zBbF}d0*A0DSd<}7KX!-!T^>y8QT@R<@O#FNgRe8m!{E`#*rAEp6gUK91Y5=Uoc*TM z;nRMZ)KEXONzQ_@3Z1r=20EnBx8n5CR5oJa-mhBa7rLWsC+irITWKTDhjE2M9cc&poom1 zGFD8JiOGFk4ofP#fn9v2*C|tEW;=2{tz71M9eg;{bzVDZpAW?;-#~9 z*=~@p@6$P}%eYTDk1D{t_yx11mC7AP(vr-cQ`XWlB{@6GjKkWr1>ktf9GOP8OvaS6 zMg&e4=Zze$2a?mkm*`k6;;89iyhT8FK^|>eN;ql-Zyg>@l&EbUZPO1Ub+lbEd9e{X z`GsLei)H6$qff28rA3?FVjEha2FlEzbDywJ`c%+Bonco44;t+bV>!{|a2t`dN+cqk zJ$m-^F}ycrdaXy=hYxPJdC}{ioe{&5JR|u{Xef$s3`;VhBV4eJBxf&rL<@J5j$Y@q zWXE8@wuo<{T%u^eH=`@Mm63+bhw?k49z-%%-N~5Scu87M37s>;7LDTR!&=~zr!P*P zzbwfpArQwmq+^t_=tg1RXk1%LB1+B>J>RMcfI{Cj=`d=Tc8W5AsWVtqb0980Y}yRB zAGvJbh^F~;rDYg2hrGZhxTwQw7)K>x4lf=_M$SbED#K+y{^XA1sgT37i-KWNgWb0kIR7~?KRGwa0m0r@vpFSfn)^*6Rl<2_ z@1mp5vP{)Q)5qe~*+Kic?hyWRq7?uPKVAHsdWED+;frjh??%$nkK;qUMmGHqy5LMd z4b6Z*mtIibbRXugv&3;GC#=+E3z3aD#ZS;LoQLH{oY85@+1Ws>{%|vq?1nVD0$-vZ zo;~|%7VW~GnbRQy4XCBZPL?n5!2u;bJ7WL}Eo5u4S*;Ij z4@=L7t-OjT_hi64l8#M)Dj8hq;nuUR-GPPmY(RuL|h@y1Gt?Kv~$-ZgL zyFWTUD3mt~j;p$pGf(n_6BM`UFeko6vnT>RP82w7SE$K9GtFd|v(T;gTQ}LWndnvw za(!QVq8VgsWtrPaeedm<*5-3m1<e=FEy_{cW~fBBg+)H=5pPdf$%eojSj|)amPQq&-4Xd>R_F4cv_0 z@pT2hX+zE>a!gg#&o*p&6YhLGRJML>CG{nMc;CKQX_Dk|83y*;)7gtoU1#Zw>AIJ} z-@)8vrgf01rKc+9Ik%?HU1!AsBhM&wJ;$6eIpe|1BtcU~o|4Sv5;RrJ>9M7EBWStB zD$4*Ag(-_LC3}Z_BhDudIm)=h!_ZsahAO@b)oY+!vX7!5pKLo)k=FvgS)tnUBt)%q zlG9I|SHhT5#-Rou$`I>A&VtvmM~3A$BR(u2@GvHKsD8e99ig1m?gR*quDO!`0h`7$s{vDE2=etma+%+ktUInMu*BLwCuBmMj@&-0qKe~~2h zD*3$IsKEJOjf#iof8EA)`{#ejY(x(L^IGfxF!H}zb-ca(MrGe?>IZUH6cvKf2)%DHNj_QJ}Q^O29gWx(C?_B!h352;GU35ll^Tgi}u8WKc zh@Ber=$uLEa+9A|RruvR-~l;_ie#^{ShRGs*@sPc>_t$iLAg+rLa9@OzB3vP0%Fg` zN+@Om4Kp^;pg?FD5hq!yfQUC%fQj?MOFEk$g}b9cd#}delsynfPtr0V|MJE!P$hrx z&cA`>M?#!n++|ZYzViZv`-E?xH&jqN4~XLsJ5xBeaPwb<6Ll-7GFO=ZzG=|i+mdUTZm z8pJXhUJ*L-n3*v&3eqsxoKBF@0u>BH*o# z5hskXPZ+0C@^wq*iob*IbfiL|LpTLwO3=v}Q0ZWPNqDs=$vR=%S7e7 z+BD9R$KhNCUdU^Ely2ndqz`eMqc@`Bp>(;zbi)nj)<+PwcA|y6Z5OCpJJ^&#uU(L% zv+})@isAyxv2)cQOjDRzl&Vxu+Y6KiNrn)u#L=^m*zOYHcyhBrSMB8BvT?{x7RWj} zjcrn*{$`EUJ9m&@b7WtIWr+fM8w8imbPS8agh1z`cjOQ0w>AVV{|>~lMH9Bv*$H5c zKbU~pzi#)JD4r``T<+G)1iCoJE~tI7E=c;|$M znzMOE>T$*5+HcTcJ6C6Cl;ThOZ;4?$z$Y1g|JzR|&mTW~L{mzK-4RuD zF&dU&q+T8d(;YHM`jb$6=bSXbm<+FW9&Ye3PSWvsh)Fq^lzbQ-3ZaYw39!dRUZ|T9bO_hXnh-An z=Z1t*g}O^dm85>uOJ~A!N)vlX2a0$I^V;{bM7@%(!q>BWFQkHaPZJ)K#;`>v)v?XV zA#EXy($yt-jS&MxhVN61V!FQ>!bykpk=Vo78xsvOnT)zgbx&`E@QQX%n*u@H^^_N0 z(v^Mw7uuAVEPnnn(&m3_)mm-0*`V{kUZqy4c;tSy(rDCh{`WR6*K-Q(0_e%VuKJ`~ z?~Ea;@Y(2^*p>(XI6H*cLIRk7`tP5gJo+!^`1!M6 zo&pt@Ndi-GrdDgD%Yxqa0Igq$^902OUYfQ%W9rBS}mwz3-4=J`u;2e?^TO`Sc+9$vBp}PI)`sPD@yYcDruMd^&=BJ}$ z^5@fgMy?#`4T?JfjKoZdDXdV$LyBk=p+=OyS|rIpljRbn#)z_FRLMe?<9T5s z$wZmulBU7?s#PLP0vbiPBqgyzlqOd$D@BzoWLYv@c7=Y4mvX22#Rx~!F9~U^&}A=~ zE_bVVGjPn3S*Ddjnw6tXHsaW$PPLLooz){xM*3JJke5oJ6{JvB5?Q2CHJwJQNTkeE zvPh=d3^J`Gow5_kBBdg8dBys(Y#rKid$ejJ9E-0GX%f)rqw(btr5O#!SBNZ$cw$5H zC6Z=W8kDaTagq_mhvv&9(4IUxUo8q{CDGDp)QX1bt3#h8II)5H(&$pFNF((XqD(TN z_-K8J)KRSGm7-4yB!juLOd3@cV`sI9l$lD)CsQqnOe;yJ?1ZvUsd_r4R+CgYXl0dH zjg%S14_9k`BMs55Eq&Eh--{I>iy4c_J+7{KNvst5EcmOsm&fX$_h(_BVIQul z*^^SEbUSVptCL)p6f^6u6`uS~tWT3qhlHSCyX0H(gSTDfsFWM#$qQYrQXL8(;>q)B z(Or&jQHTbVc7akuVSb1S&C`miZ-D|D5u$P$71on4R0e<% zV{0(lEeK9SXAd49k}ibKSHSt!uyK_eU5lZVGg1_=avwM{ycVy+9v2;PEy@Q{MyfE$ z_pMN0xcMx|8Zu6i{f67D=xw`TISG`JN{nlMkz-g!c;mLTe$$}!^Pw_od<(!#DnBQ( z1a)r#oI&5`!?qk<-!$p^oJ3oao^KlTd@f{5((%ny9iI>3UFi2_s(#NaFt?@KnuHH-(|DJuc3%d!`LPp2r`$8@Dixp40WQu3 zyIjXF4pGNw6C~I5RtOm*rA3^L5T_NO9W%o>!&2fcF3k6b|N4Lp-qi&|v9$49T&8FaKsDDv`SAM76KJE5`Qwlr! zYU)Aho3brrX+Jnq%5&rD=(swTa8V_EIybIU9oMNPTvTm$=f>65adj=>qH4Z3H?E$J zt7i!pRqnyuxB?wlUxvt~n%y&)P zB4>QtCb(BIYNafYmZgonO3TEVSs2!r1lyOBkwFTiOs6ZrF)mROi5|Y>Arz<6jx9|DPEY zNuh$GH|&6-P%0tyE2Y-y);&gj_Sr!FiX;jZThX1UHuCZT@gyLgEg)2LRr3Ly2HnjE zWLE;RYYPaqvG(!-*^_|m*#biCu~t4HEeS}=77(ggy_~AmlXa_SOS!VG>12qJ7mSL= z8XVyonh#FG?6t=>PX};xg2=GE3Eyab?4!wsi0-oiI{R*?hE!$t^Fr!tkop!Ov2DUv zm!rI(_$v~u@Qxi|RGD61Ux(aDKFb^teKnwi_atcSs~ucbj*BR_`kc_bBUduJM^QDQm?A;xGYf?EbBa1lzZEZ4v4cg@SEV(}iLY zw96F>wlU2bX_Ewl?IF_yV^MZnmT2(pVV&+*mw$~9{L8d0_wUPow|wvKFTr52 z4X4lz12`@Z&h;7%_npb;BA^G<@w!k~BZFJf%=aZp-?tSen)a{X`Q%pr42tfJhWDql zfa>XuG-12!D$$VGebsLF{Lg-nGu5Quog(_ZE$Lo2)sn|F) zJIH8vc}9=foCg_sQ(o4AZ*FvRA!M{~Jed>MiG=C|Fr8RHM0=wB{W&4+@5>?uG8Nuh z2o>#K8fTT-zE^!z+23!~s==HPwOr(hU;T+|PP|Y}b~!IPz2IzqeuTGWHx~Hj7Q&kg zA*5Z%(eTC@!HJb{-sGG(l{{n#qF~Q#V5Pl8<$buRIk!f9Z{E=Cv7K~p=Fj;}V$Pn> zM(yirWdRm2=U$atZ+zA1^e5*Fwja;MTprb}WqPt;G+#&z0hi?b!P~BVDkgv7LzK+P z4IL*dSz<16!-cgzSY{KeUGwl4+Y)zF_NwH6tz5Z_8b+l{wUlp?nnE?{U{S2P&Q;k) z)Rg49yVfL^nb+79*uc0+CSBm zu6b3idDU9Y`MhqaTfY3OG+t>6L@1RhhUlhSpq~~Wk+2P`lk2z91lLMaMnx)7M}I&l zB<36!q7Svc(n`~XA(WRy_zgmbo00`OP?NFbcL)mxf2}krLXhT8j~bVoWj}JF z-Q?w*y6~H14yA3f&pk5IJalIzDDqC+QeK8i5x`R8(r6+G#LJYP_B5}_x z01Fk^mqKYiN--)`8I>yQMxTmNeX_miME{i5tv-IqT%o$C5D|_wtQ4R&SF903* zI(_dfg8CH!Q|tvFuQ{qS0XF`?4EIchD>iO%wDYY~FtlPhz9$iuU~#*>BBfzSR^_I7 z1-+-BEQANm7w9j4zSv3(CJS6uCcIw`k@BU1Q_6AtGcanO8ky#Y@kL#hr!wcj?+`=U z!U`(e;eS*U3_o{AdZZ=Q+n(AiPg1^TX1o%jEIJGcnPbG}OkZZK}^xd9nqk`L!@-~AIlymbfe1^K`iq_d<<82O1( zRR>w=w%Cb4f58uR1uW2C@I%s(-}D#!(02;-*F~&I){=XPH9p)AYjU_B*5z%uj)^?qRLN`Xk*#Q*Alko*e(f^wf%sv&b=JVp`vG zH@Au(KOF461yCK^wk}K{XprCz!QI^n?ry;$xVr~;cf!Km-64VC?(S~E-N{?*o$Pb| z|LweY@2NVs?yI_0RMTtq?4CWxH^v;_7`^6bD|}Cweg)4@Cpj8ROPr6DPx}sG%4%PY z?H=4{3`ri&i*Am-6=*qNG)|HE`8lJIJ{f?JWl$O%M4O>a_Kf;;sKT>V2MXedBtnK% z=${>B>3!9LCufA$cy|k}>k5?}-H8ToTWm^8jD_ZIq6XQR05&+oh!u1t(PUG|UrJzV zYPLlWYUkn}>JQ#>X1^}iJ&X31u3Vgv|11eCznCHxRxI&VPJT%&HOdEwXgAFy1GCgT zZ_~YEVz78a@;Ec5e5vZUh7@v6EDS3!J{HUQJaWrn;%64bk~NUUG}4}ox*r0|jo;g% zob?MNkT`a;$Qm!g>LyM=&NxsxQN?DINu@>6$P{%S%~7j4jMN3>mtR<-QA@s`2)4H( zZKj5lmRdIgt-)D=YdB;Ew7Apsrxf1kogn*wie8+P5bsC6(v1)DS8O$fJV_6qJ)w@A zJ;6A=PmByNtoCLnT;zLJ!#TnC!Z_`argAwzg+A%fjfe}T{yaQgi0?N4<=pRi4`#=6 z4{@x+OZBTMIrw>WaC_?lfghBvq7F(9ntYEoe==p5ryzwTn1P@%l?J_F&Y})VzI7$3 z1%&{bn+RN0?OTo%qaEuJ-Dg2Xf}n=M#}=l~d`vwgj6YVWcSgY#j6F5THELY=m?V%- zGz8`ghYWx(E1%j7o$sJfNkEvxJi#$<`ShBs-s=$DxErit`8qULu{dUA-x(zBaq3G) z$A!wQYDbFxC({@g>QdTTKY~p7K7qncSfvYg9f<31&+N(Lo(a__RYfoolRxw7T*PV}48 z1AS#`^^q&94MJ@w+WJT`o-E_4j&(x|k~j|7N${_1mGRJT-1Twe+}p6Q^RmYMHL0Z0 zB1ff?PqRoiDsv_ui}$Ym~nd@DrqC}y7#$34|}XT{xY!_SYq+dDqyim1tnI(k<8 zP`BWj_uZuo4PV6S@JqgF!;)%6+GJUFP4|s%`gbqI4E{YCw1LSO-{oUb{38A4gjm?4 zcpofUBijSCqwdQ2OF#=RFy z63wsDpmlTcbE@Zd&|*CWvDK~Bu#Kxsbi7ScaS_8>!6TWsk`KM}mg@bY)N3a%zTF)Z zuYNjk=*e;JbaMZm8d2U!(Az?DbLzcBUCkhJJH7Qj-%!~`Y!o6{{EGaP%!!h}Y@}wq zP_X&?vp)(87LaL;5JSPcg7*Q>p*sJvm&j&{JH-XD!?a6w7VNf2V`7R{JYKGpLrZ}A z2$vu8OXiI(NPomO6KuG;|HvcRQH7ECqR`qLRZ26c%7 zwQ~{SMxX}N37rz8S*3E4Mu=G{n)2YZ?pbwY>h_G_7M(J2vtbFTzJMgag~)HaH$}L( zwD0r%DOH6!RVcr9737XjE$1s^245RT)h^aVfd>tc)VHf`&DiBOLSN;|WNvs~BTpQ? zK7n}Bqo21)eYTl6IUAm5nppbId}Xz)1h#u{ythG!Ap=cH)|d{_sXb=j^XgUq(xox6 zLJ7T=8Te%ytj+~o#A}G9JeN9m2A3-7#TnMXLsk}-iuIaroxv2VP0}VU9>;A&!?iIC zylKl0gTf3xq|1!54}%Ajhvw`zb#HmsH*4wnae>ua$ItsaFh0Kf^vdq}GcU@P_8zJs z*!H=uTZc(v!}h1EX0g`l=a^5dAe(gE_bAv3)dix1qYxCP6)W1(qsROM$L|!KSj|=0 z5P6VuF~+ym?VR)BHOE7>cH<#>9G^yZMDgSW+e{6(01+KdxRmW-*6J1K!IaQq2oZ7! z7y3sIE-2A^^8%lpjrDn%{dk8W0g_i8YBxr<0yt(exz{c}W*0d=d=BY|$9P-_<)rP6 z%g^;}&EyYH>zy_T>{ZjabEnD`(TER47vr`Imd;?uoE7ilUp1BAP?DTK9EKlDl(@h( zxO}gSKVp?e&3}8NW$c3!nzH4I_-u9BCbMx>$JCs9Eh^}>1`FCYi{EP7NYVS9pQ`Z; z2G&5Kd&4hi)yk`8l{OxeR^d$XJQLJV)vSdvoF6F1?%R(C`QxO+=5cP5$n4{M42i|1so99$)&zMi5GS zPcPhr=NC^Sz-z(2?TV6dW{~I*xN+Ll9v$b@oOQTPL``SEK?=-p$5k1K=dD!!y($Yf zUQ!g9@^P2WxoU~xIPuvw;;Tr?BN6;IP8&QPIx7$=ly|Pq^ZLJ_;203s3u*q4R)0%M<-D3H1;6zx|L^HH?=wu%L%Nc1Tz ziOs;byB!f>7bb~Scu7yfy=JnF$VE%uiAD#$l{^*|%cwc4+q`kx)MXSu-V#H<`B48( z9nI`h(5t%9hEAWwH4##a{_98E%4@0#EVzo;IyKjjNK&*^K7`nt>8=mV%gmZyScX4-v1>P*O6b~C0Wu~zl=nG3Q zD~~G)b4XB9H`@V<%~@<4zp{$8X<_G*r&AH66OuUD&kbkckf5SzakMl|?R#SQ-(xf7 zQDc=liu#S)Xx&!3U?98R7kNiHqs<}f#s4~b`I zY>$B+kXO(fPjD~$tmV-?m#hh~?5I~7B+-4xg8T6Fs&-XSp&?7w1@hju>YcV`&T;Qt z@Hz%%X~F5Y?Owq$`>QFe?64}KxY3mXmW1$5k;8QPOq;pj&K|BLGUMSPtr(=B2zCph zKZY{ajY0Fqfk6cQqXWYThq(`JPf7m&Hr}yr7u0Ca7FIENZdCzpVTr??$`rw$r?XS( z06Saq&v<|ZEl2%`;0+pJ-p$VVLD|)AW+)qp!q&i-2su6{w{xu9rq^)hZ`|kNxX|g4)!UhIsbhj&|Qh(0-vHc<@jHN3mj9+MsrwN>nxtpM$0jKdt`WcAbik2_QwHr;2s~g#`INsJm3Ut+*1ZqiXhPbcP|#-! zTE_Wxy8FAFV3wIa>E{HMJ6~t(+e5?)DBH5LO(V))Jf^ z77sWP4{YV|ZrLz8UCSIP7H)w6jD`0=1MLxDJN734RX_kTF(HTl1b|Zw2mt)do^AyE z%nJbRe+K}k+V241RC}?<%KsPuen0?pBN$Tu+X8?wa`%x4eX9|u%ew*g)yNl3uf!r# z!=C-I#GX%w-|3#^FCJOHw;4QvGKa(%b1g%q!g>Ts_;o}g3{b^0ZC`)-L&dj&5{AMO z9s5(lZW=%dugvUOMy&iH;l;m`u$#v3BnY2AL_L%5vY5iec(_?D21#0(S@~BZ zZSdUHaySK)(S*0MF-R>OhdXjVPahdb+C!jWTi@mN^EU6E0|Ri2 z&*tbKYpH?UODlZ5n|-$w9O%#hzD_fxVW<>9lBtOLv(ct9|NYUzJK-};=ra_Gs+3ME z_+Lj#Jwj-E?2tW=nV=d~!g)YoP|8s^`wWy{q!1>N+Z6*HDfQb(18%8%|d z-@zzHdPOL`M~ZF9Uyl-GAbR?2!`ylbnUZ|}x}EvU_^>7Cn_J&XxWZwht#Cp@89k2X zcWqkZ$|B|H_Ug%E-j&_0@h{poLa`ajs)&?E%LqTWyE75G3QG< z);R$da)ATtn4U45pN<|I4vDL>sz09@Duowf7$?=xhQ`=hW6rM-S{OXk>AD}DPMSpE zwz^=l;G4D1ZkuKSIhPtuM%}pg@+u;i)>$K!&-pS!B z_79(Z1GRhlJ4_H5uRPPe3cku9W)gr&+6cUnE-V=|8FJ;+%ooW^MP;Gf#@yRc9KdgL zsgui9-gJ$*5%v=DSB7rVmE?)8Ha$Tzg~A$q6~PI-JFik7dC^VJHT3}HxxQPf(c6s8 zTd)Etx&F*palr-&MbbtUJ$%-Iu7SbVPG9EEipk}HN5&^>%&0BPK(Q>b13CyTP(l;X zVNy4%ps_JMw=wagrI}fj;|mSs`uFxfu-HUG8iE=MltH|lo*nz1Bo1+z((wy*Ze@iioN;kdD&$=;}%SHFz{hN_s9hP!X%27nc#@gkU06bkv|yk6vVYLbiL z7=4Co;E~EW4i&6O8uFK@*VMrWUJv-I!yUR*Z3>h4NstmXD}Q%6Gsy)iO_rK#);A8k zl**WO)%5l8DIrBg;SdRkgz)rqWw2crIZ`>&DKp*PFkHG9ox&V1Q|Jv7CCbV@eM15s zB_hCfWRb9r-s8ZZcb7*cjnfPioJAX&MHH?lR#{aiI$h3=;4oWDs^ho^Mi+E9NcUO| zGlR(-dOp6quWbb@__n6EXkn>6&VKjeN zNRg)z@OsnQJtwSs6`$9Df~O!B(34P;vRRI??rE1A{E0q`)=VGd1aDKUUyN%3H?L8%Rv85y3t7Zqg-0r3-&9WC~;=O#xcM>b=5ksJDpJj3@?iZ;9L zQ{@zH17dx5*|Sod>IY8WeB{iWc$`Qeg4nbkiA(P@he2LY^|I1aM!Y?N_->46>o zFFk0A`i&ldMTvCucT5AQyK-U_!~!Me??B@j@gn?1iH7r0z9UTG17|s)eNc!16(154 zzd(u^bR%Az@Gp~XRPkZ-Va!qiU zxN@eR`x3}O$Jcs9ixuFDAA>SP%nwhy2Mh1yE{181wV3fCYy}wj8E&cJKvG*oUkng# znQ~Zcqi>PdB0eM`3Hrq_mH+Bmtso}`W~7o2$}3-Hy?vS(!)p;+EB@*El)(Lv1GV7Y zDjj?I;{py}H!!7ZS(hr1VzguxR=NnjyM}KJNwSJ(5&!5I>%m;IYFE5}hl#BDPfR8Oe_@h7<6pq?&zO|`r!gt}S1~b_{u7f) zz`qfbNq|%N8<|(#LwFV_HI7J3+*m;QlFi%3;{GXLoWr_P%@Y1({$#n5KfKqAS2GZ5kiezGi>Q4)M~*^8hr-_b5t)_oae#>%05CE8hfiL^ zLHK(|K^%|bnU%XXF1DASR>t_)@fp65xy>OjM9}%6GUjO3_o%8=**mleEZ|Okk*x|N>AU_`3-gqnbm9Bn5*L!H0CtDp&&Kq@ z$iKYZ63;JhCxY}FZ`Z?_wp;r@tmnUm^*F5;9&)FoLvA{?yS|u&VTF3hFHZo}bx_5a zuZJ87^A)H#sxqcx)glm+bKOMB| z|A7E4{zZVkga1;AtKSo#r=JAKnC~A1=mC1v^PdUO^?#ZGUH_{Ds3zl20%XkhZzMp* zeE&m${)-6EA4Y)8bG2rM6#kO_{_*o+sbKFFcsil`xILu|!Cipw=D_^unIg4SW1Yk_ zMeQ4ZFc_{lFmgj<2S*!TfRwWcWD=M_OWNR>@X6ZuVh{V8&6_?^;{x~7{2H)|+Qn7v z*^qM_$Za35Nm}-oRV9ULhwUQW)iR;r2!2RY-G<>gg3ikZ17*9N4fIf`T+z#bZ+N zG*5J8wfx>`zE72dm4oG#1OwSUej(T|VLwwW`*}SAwxRyEA?OS7{zo`Jvrk``cHpbX z&rk!2-EEQ91sf#-l&`o`s)6XA^6kC;J&!Ig&iTnHWR8Dv3eub3aS9+`VgJym9v9%k ztN_z5N5Q4ztAtL;#jN(FnMZdF@zlnZn zUa`V-54-^%Ih*s3fNeX6jmjql0RE9DVDI(&`=A4wBtVCp0vNhCn;MtEw*4DY6bBB> z3hkKJkn5vUKr7&i^D7ajU%}MEO^qU*OdD_C_Fh|T!qK^eFE1ZpW8?CS@^El!hP3A7 zI_hYcb<9rfdGETmTKULbpie-i8pzr!Th+KeL&?H#x21VWhMZZz=fMP(3h7<4{EVh# zc(?3I55Mqd*ufGBBwV&L;+ty}@<771;(Y-3lW;Ky{a$zAfytLY(=P`&zX+Ej{BH@D z1jRsPZUnzx;pqF9T5_bGHB`Amv@+&2n0QD;+DDnEY zDZ$>KDZx?Of20H>k<&N-IVFfw@SjZy;uQRgDM4Vm>5r7)sO`TIs}b9UCR%oI6ejmd z`Jox{p;Hs$_gbk2z2Z(kkU9sX|u9bkCCLUKvOiQJBmYc68LL#M`7$w4p;A0Hp33-q zql|9Y(>cd_lGM)eTCdX&<~4Uyr6b>!jhQIu-&eF|PW#~KetBzf7r()8gy^l?!~{4B zU&-RCRw>6Yf&GxLUTUL}gAzP(G^ z%wgkIYB106g#0|AimVO*7gW8~%F6SYh2P=S<;4Qsf)V5)GwBnQn+ji`v@-jGGaOZ) z*@@C5xFa3IQPB4&jj6(u$Gl+dBzn^KLxvs$>de0XCaT+M(SF@31}4*qPCGkZ*5HzY zP3ubc#*5%h4%BgC=A6;D5=fxqtj zF>CvbZ%4=4q0HguS)*vq>jr)0FAJ<67Gw%_HY^4L{i7T`vdBZWs(&J5Ijp z#K~K}j1!U^Q!a?&PPl5S@cUKEMRegJL$&4bM~B&(C57rGMn$c>CYsRMV)4>w=&5tH zEET3I0SLK4-GF9!&l)*$A4IGkScC*v1Z!D>DS%PW5U9zA@FsJ!AF$quDTW+cKjUf>&{|R32<$>7=gpP&yT#p)wF>kb-q?!mDEwWQ@*dON;_XrJnpP%*7X& z-D^kmD!7kiA={q^H+{U09lGeW0T16D?;PT6 z9Fsj3$TF^VzBES;04?TWiv@W-p9PZ93-Yd)vO%P2;-<)`kLwdI2sUmC|4HX8}e zr)7{&VhSaf)5x2sUJO>WJ)NloB3!Q|i`<(Xqsopdfj@P9Yb|~iY&AbFSli&{{3#9r z!?nGT8jw&saGfAk(4aM&-+OT1dyum!+Vm|XiP&bGhHI@@WZ-3yI@9TrsRz1`lJyEW ziMfcx2-r0mxyG!KQh%>I7di+$Z_0N z)+&l4J%ChKWy>(9hv39BuI;GP#j^fuE1GN_PciJlb|tndaTT?qr3rdl$#fX9dUK{^ zQ#(RgTB7rKY+q}Y&n+6XRsz?^i9A2BYXQBfrCMo;9(N&Ib)7i*oOcoouGN}4*$w7MZ^oE%eDq1ze*C1ZHC zWHF}u`)S$3$TTd4r!8g4x@HjIdPAYjswfDxOK@nEA6AgDpY4aif{EE;zbZo?+-Q%S ze2vdaK0n0$8d<-$at@o23P)K5SfUHo%noX@a!95kyVLE1MhaB+qjM@2W|_F;w(-P| zAS9n2IKg>yX8?F-KqnTQx@t*~9lC#0(yr{p9=#xCq(>!8`dN~Ro5e90@ZW zZoSFSCd&x_&hGY2z6#sPrH+K&k}9*FNNF*ovi@UZz2&PCRZ4=&<{#qSBEWJHdkw_? z6P-}RZKjZ9)5ZAT7vX*=l0$7!>7r!7K~0OI=r|0*bFz+DHuSEmXX_YI1#em7AZbBE z^tMJeQxP|tLaIb`Vj1}yNt>>C{-qgrkOQ(r1 zgEEvA{Gcc|qadfkLl+pkQsX}nmVa7)fQo9EqYxt(YrW(2tYW!qT~=4K8!-1}pjfYD zz#+_Ua*U+C#N?Lp8e}Fu&{Ahs1<^puYF+vDoSd4CaM7I7dlf(ll$|PgQ!GYKWM1`d z|AW)b7aQ~A^rXU4=y&H+wFxOJ^%Ils@(luawg{eOXfu-g6#N)BAY4H^#a!ffQt#=t@BTzA3hr8n-6ogzxOg zuXKl{YzKtOe)&R~`(qg!66M#JhLMo6VXj`b>i4TwovJ<2hc$@X*q@3*mMc30YGuPA zbnq!VRHHo^rIn~k`09JOl^2eLpKO?icDngBXG^C;EIp|Lj+%+u7t2gOGwM9J6BE>R5L7v(eSC7&{{)&i6aQ; zlE+V0wN67Yt(($-o6|wyTbTuB$?tk`YVa)@Gzx5%oWWHo3#~tWo+-$V0jpMFZGNEbR+Ja5e+mX z$uiy?Y5pymW2@j;TVBsma?yMDoSbO1Xf~~CVlOyMTnf^jm^}DYOVTO+OF@)-m?X0u zwT^G~aCo@5ca)Jd@8KrD)5y}sZS|qa&$Yfs&h+#bBa?=WVxfvYVn1{UUV{z6>XRTi z?+__u!63Blg{QVG7%7>xmOWwM-|8F^hB2qV#n`ZP!my4wSF`Rq5NyZ_XsWVqXngFb z$7@Z4oLD3|Bb-jP-p!s^%!@Il8v#w$p!LE0{OY-$Ni@-VScGOZ{niOD-g=mPzEyxR zvVsk``V08WovtZb=Rv)K8LJ!KLrX70gaM5#&8`zH9w)VQLeXw#Q7?l$#Cap37}v1O z7TVSL)x{EtFhi3<@!KvLVKem{{vB0ontJHLu^~jqqEixjp;Y{>j?S{B%g~*2T|qhu z?@{S9Yf@hHq*Bssch-9QS!`+WEkg1L`m*(<1e+1Ki6t5Nw;5v~>3W~eyCf^0v6h6- z$Pqph!G+TdMp;fW$&ro|Yvbtwv_bV0D)$_!0`tsr2i?adPOOuR0W3tOM(rQ4W~br` zC!;^94*hEb@3uEUo4Xj`&=PHhK5-<_tR>d)X5Y#AF0>l*^1|B_Z)_Co-j$yZVQ=@< z6L)3?@XI|cg#Z1^Vhb85&-a{vH2B-I{ykqRXX>Etse<1t`*{98vCERF1GlFNc0cXy z`TxK!)RTW3ckz2Azd{IkIL~CW=pz&X++fbPj_+gpp~?TOxPF83>R_173?2! zy34%Th;hdgBDgV&RCWFmxXFTRJ$rVIQ?ac?C6n+)(Xp7NK;5|*u3*8TxJAZsw5UE+ zJpj*r!(*D(Ww7O@ssAOAmpjLS8Tb&!rN7oT7eZzdfJ`|IOTtV0X&GOc)nPU{ z%{;MIQMrpm``2Rs*v$lg`A{xAQ76`nCO%8JuTHE5yjY9_O>8;1G`OWOR*8Umi2$HP zV4*|+t5iU}Q~*#auuv+1RVFauI#x)GYwD0~)rTN1x{$Vqbq-wXoL?cZD7ZN}L$;s! zXL{cVJxr&u#qB{Z<9A363*)9b?6m%n#dL66Z6xjezm1bo2jA!M8X zalIUg1wRvJ|zR*>-LqD;RSM>yS3Z<1X}emZU*jp? z6knUYHKLg1Z{DAitNI7DnkN=*umI zqGI@5xmikD_hIN`8L9XXN|n5xr;2_;5m`-4H$=>wL_B;ziKxr%v0h9dR3?5nuSDo< zJc(lu;lL+0tgF=LE=)LFC>(oMEDpssCa4bRgGk9^#PMVcM9?pb`g*~e4IimO#W5w7 zV~(3n0}QB1l3TQE4?gt|N!J^Qba|efN3w6=uxKTDo?Z>Jw%&`lqh$^jhZi zH9UlFJWr-6W&)xjvk;1aD$IJ+nRl&%Tu%y#bJMy0oQb%M9ldpfUIuHhW4R`8KGPOR<)my)``>~KP@9Q zMy>U(a*H#p?#_J-^Wn}ex8ie6?vwae09~8gbSkFuLWM5q1G7%xA+CMC5?8u_uj(D6 z;mK#FWtJMd7Mk6`R>P0R8r(I;YssaBD6LhHMTQ&A;h&jDsMKK27j(}kynyu|X-7pn z-|pnp7qH{Yp4AcsvvBb1x_aecM z5_t~}R{43WUcPT$JAny_9Uughg4rz|lkiVPiJoj&H>u@(j&3<@GW1ZiqfhHoO^pC4 zU!O_bul6INo8tTmuuo?ZlV@Bx<73INPYpgy95=nzY2%mN7=pB^c+7$~Hu(CT_z9jB z@#+N{@Ipgplo=hh{E1S~(r^ZFRYF=R$qS}wi4ij&l2{pFaKcENZ3e%=?&_!l^9cn^ zcwezOjdRR<@vrxue11F!8o{!W0xN^g;aBE6WG;nVkbahV=wy>|rY8)L65T3$c99rp zvJK3&VC=xrf~YCfEHNOdiM7N0(&nN6IVDyYGgjaGmO2;>d-{wn5T=AHkGemxAZ;lg zGora<1r4jUvpfzvqFUYXjr8)ILV9>l%hyCR3=K0@EShJZw1^HkJZxp_VpyB00AURq zrwB{sgmoqBin7a^{p#!w3L16cmI<#SoxU`Ya8rAjmR6ZDrZ1GSsGt-wlL5Aw(V~Ql z*;F9dCC#YI;%>(QRsxn?|3-S zm}8;AXvUf`oqJe^&Aj2mJWavbfzdK6@{k>%RhxzN$%1(h_&Oh&qQzl<)Ba`Ju#Gv) zh*5}FLNUkA1J?J(Ta$7)pP*zgZ4fd;M@dEUK3JT>vIY`CGqsuaZy1~rDiZji5@kiU zuF#ws8L8`Z1@nAG?rKR!lnp;*81`0kHF|Ta?WE8fBYOhxY|eV@E`=lwuVCu39)=oD zoxVdIj?UOuIwYAf@4Ij4!!d4}+_KGfh*%E@sYFhwc7|?Dgk|S$pvUjDq7L||$jJe2 zY?QyOhBce-Ull$<`OhH zYUJ09ZgHwgGIR+)XY$zDA!i!obQsn4W;AysIQlEmd$3)F+dBH(L@6GHA?|oCv=oin zGwGVxEK^#25~-`lq*X?0&B7)_g;%s?dVpz6xHumxiIzD*mBF!MWTI86Ne$)Z(b2=O zR@(69^rem>-K5!$2uzw(pTLmV*&#yLGthkJ1)&xSfzQ5bWA7%9aZh5amUK+ZclqU6ya*rSD9 z`UZMNSVe8--4P~1e{ORlwt8Kxw|J#hoPq`Zg)Orf7%68f+1&mdvkBjd8pPXuu>_+W zc)fl9238lLk-IPs7rJPltb0b_%PJ6;>jmS?kfaSV&T@Zj1ji)*IH`}U>vAF+li7Xj zUijn#dz?s`{SoFz5HmrBET4-9CfB2p3dXvZaUF`56#y6jH_Jw`!WCX82Cr`-LWpP8AhaJ|6dV0AhxL7l1U3ZK} zL4m$*3WA>*Z+I;!%M?$8SU^JB;@c#b{Pj@7gB@x6u6U6vZ~hcHDd(ie11zt)p0rV8 z0>ns0cUfB?;_gsks@^K;ZtzB}bzSviz1gO^`J!9+rd^iA=?`7(xBxDn6DPGt)cf}M zsN<`uMs+imIurGpcU{@0sIc!F>~hxp5ZLpWnBLk^sO>p7yj|9TLey{@@hi+Bj7@3E zd&7{5i4Ftv!_IwUvD8L+d)TLsDbzCVh$fIn^vJ1&|AweN$V4`FPUAx+BuHn?WLeZ{ zgXWS2`d+@o1rZpGIxL+Kr9igwEsC12r{-refJGbQx6NsbL1jzxX_8e76;}w$gyK=L z{T{LUx5~^(Ped0ZTzeIOclU( zd3?-zsNGV&0dzxhJ$FKK(cu@MTnnD|I77r0c{!;ZN75SQdOB>yr=lx*VSPEc0Znw- z-M$D)ZAHlcm;}qPTDRC%yNJxW=JB*fFvpb<8f|_qm=r11#H0}ucyDJa9lLTXh9@=G zyW!`AO)25Ybh_V-k)h^_`ONLrI2p8!KnzY05WLnu>)8tOKH8xVU0!3tyyv@E<7z5` zD?cT4hh9OtQk=bEx@NA*G_!*lPlO7{UqjLU~z}tb_sQ4gE;!55!82S_P&&gILg{eIXe0lzF7-36&5CmvzZ3>?Z6mu+a6)v7l34#QCKPHIwnZ_VQ9G2U&!wMFb~hw9O_{28FB{+zCqy1(wq zEr+OyHdu;aRBJ`UsoZ`?yhI3v#dS?N`=W8JB>^wqa>2TR3jcAWz$S7J;Aw~~d}yCq zekfK6`l%2fh4gsAM~uryGzxq^k{1u14FR7gpO<(e%tyXUT7vFY9~^G+x*{v4eTfvU zcr+? z!yX&Ut#VEs_&87woZ~o=r#+|8TETZ%=Xgw@n>P`cGvs*nPoR=NN;~xD4*`!$m%cT9 zwmZ`Y2a0xnTqCE}JKfZ0)xI&SRr(-PP1;}K_xHVsx0-3KR*-3p9!um=HK_&;023n} z&E{z(OXglOYG&M_=8{$90E@}z27K-1Hm`dM<_=_4q9Z!t8I4d8`9|)M8>2`z(`MnO zw4+A!va8T=2$LuQzFcz;@y2;imvf08i#@UT*z9Up43!bb3ZJ-Nbq&gAV3kBAF<=*Z z7tHk5C}$Xe#pxC`3P0gvHzlVV(DO^z%6(}c;wVTkqh|9tY+jsQ_d7-DhHP*S*N;0| zW}SFM{RoCkHO#y-&uea9e^kF#aaXNk$yVQBl30_D``~?)-x^72M`LDZSsXggY0`r# zX2vS1^iEpXr%~4#jjbsL4&S;LcBdt|6XL4-G}*J61lF+|AwGT(Bka=v^|UlYU_@85 z4sn~r790BUX^ZPrc4Q4TG{qHX+iROD` z)6tY2M2)3rP)SYvc*~P^KFoslK5#06gW2Lt%;l{t(UEjgAC*y{Rj>*P4bnSKKwxxU}0`bAuB>s z#7m-aRYYNM6yLQY{d`v6Cvhdth7ew!Tnd->soEfZj92>Qe{KAAmU`D9nBY9N`J0|} z0Tl(ieJNO;wU18K3YJJ){e53d11#sc2IFG5hfU0VWAIS`kUflZ{+8b_&cCTaq}0Z$ zBIw97U%)QTL-5)Ty(>#NyW}n6O@u!-FHU(x3S-3vvG7X2f<~%er`>8qviP3gG%nlF zZS5W^PmkTjCzvA zXqT8z7qrfgKi=h2@Qz`IAdudBL_=S;qXo=$bqC23fS`45_%XNyG!8O&RD=6cL?YC^ z6^igF#C$)6@|H#8-8Fmg5mYy8P?cp*RT=1feLyZr^c1hSTIvGXt6qkT0D)EdbNY*- z-HM&z$)ZmaloBUuMO1u)w19%a*8|*d8U|&vnGlaTDLPG4t=8eVSV~FaJkco0iZ~98 zit~1oglYr76=a41-i6R0WwLaB-x(SWu}!WconwhMhsY#0J0g)g;3Q};4OiP}Nh_|4 z?c)K9{%FPP37aBQTswqBu8e#zDuaQT`{^iH+?32zeSsoclmXJkZ4{>6jJsZxgp3k1 zUULx8lsLNsThJpha5o)sYGi2qE}18kg*{gykJP6a8i2`Z3ZIoI*K71SD~?IDz-TQ3 zPzO-pu}woo7B}7TC?+arnk{>~GRSOCO|mWd_ucJh!UMy%W%1`VQ)ls)Tj!y+of!Ke*A3@u&q?sM`{ ztgUc&LdC7EUp|0LXMURTc4J1HWh7DcGF^Ghn zo(2?o-p0>WC~v^D=u7I^TTiw)y;_cF$-WlEd0OmhuN}69$2o`RTvdQN(%NZpi}%A5 z?Wx3T8B&}k7mc3w(Lrg7jk@SV;ae6x&vWIsyO$%vc@l3N6LSvlq)7Iy&%gN`c5nsS zSUyY{#Z{_JC#RRAcuafqKH;qw>fmijOQwNVg^iUaG^*8}bUfQ;E~%MWyb{x}aC!J0BCUO(_-ph1(uRt<&gZfkT>Inrd0KQ*rtL%yK!z`W>KmlA{kqSZvhalFlykXzhUqcVd+K z_q~(ss4G~rLwE)DieGF56t<7e3IVl&p^rpV$?K?N9j6;X8A~>6U^nG5Wk(q!J$WAYORO%FBRs5C)#1~waExVu$%4&AKF1ur%tJS`$I5I3}wHl8UIONRqBZH zCYG26?Nj#z1#b%tg>D2~W*|GmOy+TqIE*a^tnOxmJ>pED`W(}kqh2laRNeS{da|W= zQ03cD*XR!wVTN{o86VL-SwOZb0J(Zm9J8?~N7pt!k8D$*FtalHt-& zqu!)VMoN0=;z8ZKx5b-LVO#K+03!fLcKFgf0GXOE!6iY^ycW6<(+ zEO->BB6es*dTrorG2T=@aJj^e95NovvbAKGJO0HK_hr81{ zg0&MVFrS4dwPx$pY|qrZko>wGzH^3j>9+DqlVWbO4`actnXZ(ia0=C|X06?GWdm|? z<6;R0ok}b%RnvToOg(n1W&moJdPzMxWnPd~i?vk)4k?MMl`cRf2MmUkRm43MC_TvH@d$p1m!r(cx`;k z3YmNsUQ3PWiR8mzw+<%R)_g5!%xTw5bng8aAmrJ$8$PnvE9u4kHN>a}0Uya;ujDqy z^RtEU8L6}^tQfj5Vcqz~hbC}}QDH!Rk1PaI?}LWtMOQ(OE&WbzBS))u!wAF zgc@1cI%sgSK*Y2&bUH9w-BNvP=b=cUbKDNB$mfF{2i)nA~^D=^qbD z%ijCkSMXZy64fwmSOt5A3Xz&TcQMZO;G^-uN9U5pdAJYMU*dw}x3goaCaYLQ^jo+z zljg3=SKoxH8t=YszgFL9SFKpyppZX3s+Z)ms$UeA+3qR`yzd&6gZ#8W)Sx?el+fZ- zJLv5jw(io)lC_du*iXkgAD!N##6d1ljPTQwM0px zLq_fRu=|_o5+*!{FwaQyew4nDp1JO+kF8H6HiRckz41tnL>a}~wB1FXQI_DG17Jee zMg=;DAR(?d{|lNxWxvm+$g!EW%s)R*PDcqjvA)FVbbC%X-|su_;dQa&bc^IB)pg1p zlfGsd$jvA2xb)-Vg2J~7IRwO_P#qPkM2?1-HCwERPI3X&klu@uJE4GDRDg39714nl zyH1bfT)HljM@3#z{6S)Y&Y9l8^p>kVUZ|Dpq5%SX;Aw7VYH4eqF5BQzWLAp!l5qvJ zV8i6(Tak|QBRW#`vqed+c^+9o`A9|i$Qnwn zkgT9Qeq;=@xVJ0Jk;hgV?6J8Js(da+VQhy(wmN(&XvAoF> z(BVb$`GUhrEPkw%vwO zhF(Mcshv7fP5HU}n4wcT1~l@dC(>RcOcdu;+}`$4EG$Y zVh-Q3*W%Nm(KJK;tP{qpt*Xx72Yl9onY282?dC1=IopgUO~lO&a7m+LwvkV2^*Qk+ zwS7aI_M5+f5;&l#O#{wP;DiGB#O3vM)P@g4b}q}0Pna3*8*4(clG>7fbIG5@Ct3M+ zxnp}+kC%s)YcgwCk5sxwP1vgNiCB9@9VZs$32u30k6Vn4+2Y4j97#roU;IdNJ9NF` z(Z^%9x)Hl;D&t62Ek|~?LbmwH6~~L?>&W5BI+ntdwJLRGA$1Y@8COMHY)f3nLIZV- zrvSDpYD9_GB%?!`4a6PT61!rRdqyuA#W%)Q>r=JaSq$0|&N6ASopYT<^)1?9lnY54BJGADI_&QJgKG@YHNR?W^|Fz9o{d9dTaOK4wq$ z1cxtn@Cp~(WdJq?^lh{%^a62eROM_YEd}#@%3RDsRwrw#k0AE3t0DTPo(M%&p5rBfCt@-8f5PtY&NsS1tM<2^jJ>oFmb0W*V`b9Hfyu;*7`6lIVi*e=7)z(053SF}~HUxe>P*oMvH z-^Om5W&=e=ve_Noa|_Y4MF_)o8Xo^}^t}VW7DXLqB%zk>xrON2La1pUb`0b=wm|DJ zBN=sc&n+C=p>>UO$oJ5Q3)4ExNaYZ5k8+3&TGvCqw!tA`MrI*ugbiy$h>qhzBp23{ z+rx&$exFjYC3;%7YjMi+GF(3ZhQ67!TY~?X8|J;Te zVH+6J)yVw(uknv`&ldkTswFsF{`tiRA?JSK}=`!I`*53-2fOv|azw%E7Q?rj51lTE3(%g*Nv|aVdz~a<%iyF|j4;`tEQ>I^B4AZMJgVxk1chqj zt`yCSl;4rTB(Y6b4d=zaT7gs*f}a8smf(1%jvxb?We7Ff_^R~-hl;_(=H^`bt>IO0DSBi4aQ^k?vU$w-(>NP^z@nj5HLmN*R934q<372DBy_uMuTJ z#1UykwV+nw93=fvD0YMmI5dkzRqdWZT*GYSaW=nU=X9SI+fE!7G#&JZZ!CePc`Xrn z)8OR20Ah1_283Id~=@S_-zhMKfS7Do$Usxsci#VBISS2%oO*_{Y7U}##r}GQDbf!Jti=&r6 zKYx7mnxkLxj-_eSXBm>W*=dpa8OQINXrnCmv#{AV#GLQ6eq;&d zBN^o*iqeL(^W#n*+d}!H=Zgg|88t^b4%dNn*Y%pKnuoH-Epr`%R^>0f?FON^) ziyPir3_b0?-UpqrzuXGYBBVOJhbk<702HYK?c09$FFL`bzuY?TLZn*!4z>8*MlINC z&!fjnmf}aopys4}+Kc_VWG?>ow}jHg0psoVP@N`Z_lmFKjPVOTgD2f%*-2+jlV=-C ziUQ$P*p~6d04B^}lFZpi!hgRo4M-jv$;DK89iSv>rj*AqfEWhkNjO=m-Zsydh7UNs z-&>=1EyQXS?h+Bx&fqPbsJ4VS%xp=B8-neuP}dmgh?F8N0$3{REKV1t#9i67fat1r z+dC|NsDBc{-9)BL3mC4MOvg;NwGrg*CjzRn_ilwvIH1OII5}E z%rbzaSUg$_`*ZVavzBi3ETvvaB(BdejFtl?2~A^`@w6m3NqCww4XkAWNWgRQzRoJf6Ym(zl792F;l8|^}vs^}sERQBstzT!u zacw>ai{!$z=ykT*n2&)Wx$pq_*V$-tosdgI=QVzgZ^wLu@6ssSjNuUV*}P@G=UX%L zK+&*R1j8ejbn?N80kR3H6@yg%;C%u_@HZ16TUglsObttIyUx+Tr>q3B2FWwD*oVsY zC(&r^^X<3WUNy$oTLRP8ZS(bBO&9l>SQ6CW9#?~ZWzXragq#|NmYYqYrM6kq#7v&V zOx_(a)29%vPdPbBDQf$gQ9zUJYyb7FR8see!k`^ zAgKx@z3fnW#+LRfn&x^Vf!cmf8l&rz1YcM*ckRG=QgDJXG0fS*M0yvccoLU3GblhntB*f`y zhY^B&Fyc_QYnGIs*qbawZBF{Z*0?juG$!Ja^G^e+XhH1J|J~Sl-P01b_rtD7hp*cv=Y zYPUN+`GL&%$C-M|TD_>+D*1Vkl$H>nj38+;B)N!ES`t-umF-%j?3)P6jTwr(`ATVP zs(-?8-kI_;pQcOlYB5~7GD|p{m-OEijSG(nm5*6w^y3UJRPypPKFW|+$-D~dvHcsR ze85VH$ZA?!9!DfQ&d`%f^wVy<$6h2nz93B zyZw%#cxPh1Wym_)MG^7ZFRc7uOgtu)Z_RLIJ1*|9{FX}pl=2hgmG8oELd&z=o-oT3 zKA7@x6wA}GW_j{W7bOYF3xVW?xl>h;l(zk50Ln*@W zi@@-U3Byt-$u>dUF$Pa-i*yVLx|eTwh@_jmKM~`8`tdgPFW(GNlF__~(7Z6CS(fJG zTO?KmO(Wh?v(Y5!Vzv>&i@2vJxW_mLxD7_M~WU1u(RsoGIQNLP+W~H7U{yrkZlPL zALO%7aX55y#$M4Ziuwt9u3zM5F_I6nMN!%=wpg|HG#q}h<8~Pm_A%okDn&DY#5#_K zZ<*?JBqg=g**$0Yl~=#FxRVfkFgM=v z@KhD$;rd%2J3LT7`AEZH1O>f0o4tFwjwmYf%isR0;%F%r0=n}O_xyFkwq)oxF>N(GiqSAo{aW}z}* zHdugp_lMpgABm0pvGBpn3h3A;-whYY~R7Pp9fDI zjx{v9Vbg^y1!KTsz}Sg>PHMQAnk$%OGe0P*bI<#K3Z3hB&ff%Qz3yrMPpWyP?*?e+ z;w}Y7zgZ$yE8_ErTHTLg%*sC}viUNGu40!$q&0~OD0aCv=bvZmORg?$SQBD@gLLfn zN5a@e)?G#4a*S*i$E0s_aKTG(lhB5WUHC04CKLMnplVvv2^=nIvZ4%(-pJnR0lLEc zg2>U;jp(*?bX#|Wu8~N)EuD5-xzNEldSP@;?q}7D^eXtJ_D(n1J>jSt-Y@}_p9tTp zo<(!A71R9;(w2^KD;cBO3yAD#?t4iz$dkWL1EqwPLD3ZXChPD^W;J6$_f;z~ZS49* zm+0W4+Y9HH#P=LlER`9U;_1vKI~*KS%!AAGa81fDy+11b{>Lf*P${+k;Da0E6BA;{ zPKM0BTj9_u-=)zx54X^`oh}&zz6#Dyi*G)b&-vaQ{jQO+=W=&=bK(es|>ui=n2 z4=GjjW6J~{FQ39q!54Pf!l(+X{JfrSuV=3`$St8X#mT@8FTWUGOxGD6m_##SW_{LA zI{o=vb{fcb+p8o3g@?uoWf`qCxO_j0j@CC5)VEE}ne5E>$OwQJSA%K)au7K0M&sVZ z8J#)P;Cc!e%}-_!Qf4l;|K;kubaig8Fq&OLc~pU`Ic+;Pfp0E8UaX-wQ*KhL=H zvy@F~Rk1&(s~G;>qBtFuf6ln{78?IHXjHAlp%METMxg>-^z}{vDjsR18~GSgjegA7 zn=Fn)U#QFiWEsmlReo$w9w6puUsb;2r$ZM-B*y~U;$$Ft*lt(Fsp;xHV`X_Z3N!c} zw&d5bpz5lP3~)cxJ{bU$yLlk9dv1aLSzx7z;}*deuSw?D9rCwB{)X_|?b=7u$+WAa z{jT}?u71;KjHvm^Lq+=4<$vh_d_KnG`1#42KBW!$1y`rTe;eyj{7~gcc>_MFM-_4f>e!DCnC;m0;!p4 zqmt$}0o7GNENoxD5XSAhH6U@7IU7r|bT))Rn4@AzS?wCK3Uiu~kyR2gRi=!L?g^9K zP^0CwRZC+UMvWQFVypC~rs^08X0fWZ(sk`t=CWJ9MX6M-Q}zelz<09V=0sv|W7p`ga?p8WB`+>1(<#+<*HdJK|it0OA47z zrOZxml}vlFfhKH#XGSR90YAeAvW7$0VUM!|dAuAXRKq;IPd<_OkC!v5Z zHa0U<_qc)!jbf%>7~J5D5_&79-)7@a!4zY)N3YZVgGxL>W(|jCX64sZ}ZlJckmP z!x>1peqJ1iXJ#2s;~8%jX{-UNCILFs5zU~HCHbzg{Wy;viwPbcuK~b_fDIZ9l2*b& zzgdD3uIvi)UJka#$U0fZAPkokexlkroSX|o zEztfVinX8tlH1Q->rwR_jfdn&3yihpPzySu`0(h&26@DUAsK)DM-Q~Xmr!`51w)&W zceG}scPx=hxZeE+ocg;I*MPg}nB4DJ+GUJeYHUNzuSYrH#L-v-6AtrFLU!U&78omu zFbk$uiz%mq5WmGRQPutZlmBB1vOv|P5@kU{M&6Tf(QlSWRntlJTA|hJti%$z(oE}- z+~|QDcmwdr4Mwq9!c<4ii)mmHw?QZu7Pui@_j1*1!^rWP`am=c+aP#U#BInp99%_s~@ZSI=o{?H&&|#5iJT|Whvr8CIPjf zG^#aSi^=g0#AI3&@F1flN%;*Xw2tTEJC2Ph{U3h%{wO`%0qg9{@eXvrkeiH{eYe!S zyi52#Iobj9*NKNah|%?Xxs&+b8bW5CfA`&gghiFG&z!b=!bbC$sZ4THdRY41l^-ky zn)V{0owGP%#q^<;5B**EKa1)h+O<5lOWxLO!D3WcjfeKh zbt6Ij1akUzi8)hv_|78%?{Giye~bgNrOi~0g>?Yix%4PYHDJ~xPgT_P@!30hcx-EW zjPHLE&5{s+0-z^Fph#hEMck>%|M~mU&)-`si{_S4997jn{`|wsCqMmg;{5XL`QsPc z&Tl72=F$zN#!53~CN+ur*p?kquf*n4!cZ5Kp`ut9GiFrycV-S39?w5X$AQtl!adq{ zjuRtY0Kj;t3k@gBLINsoxWX=83};mzi*-V`lgu-|cA8QjLGU;iY&ggQU1T4mE)Iuv z7m|-9BAeDY|7I$y2&vLS{IM-9}vNT0=h=J_NEEgSL6w*s4j`whm+9=&f5t$3ok7 zd!#q%EC`Y1q2Q!pjVwf(uJHrJ5^=_1=0VACSt4m873zoTrx;jvFFV|Voe0o1wrwpL zDr{7ZgXMQ~QP&#c-PwraJR9E5gV`GE(vIb9H0t={aCA$)7C*Y=PEmv!lJ6K`viBvB z;s&8B{DJS}cbH~AsI7GBHn(>T{J`(tjkNKz+EO7K7((2>BhX$t=*D)_KxcmUjv!ZO zLpIP^+`bcK(M<2$2sjfvH|~_3)B8CJ&Pe7t*x4GH8zu|K?S2fv`LFuvFm6Z~9%i+A z$jEL1N^``jZ|Q5dyj47;XRh;)1~3MfMH>@xY@cH}MDpsjUwVH^dV+TQb&*BQ*6taw zl_h9pKxP;hp_VY`D?$v{br~jsy=qCdbnp{Hj;NP}JAL7hAaYariWb}GS zy7*6=TG4kCONE!rS<+3n5ItN7?`}oov0OM4Hbd0-Np_ZqkWfZdrS!t2PAaFC)S~X8 z>%pW%Q7%ipdADs_PiTb&fhW+Zk=P!K5-O?0X53^w+;`84?g;)9Gqnib0-^Dm@GPGh zdq#2^@gE-Ku#nxDUn0S=b$V2dA4iu9N!NTBTunVrE>l(s zIf-NCqO88^hFQVKTcZ!#P?-zJa&S~v1P4E3$dBZ$TrO_^ini^r(rW z;xs&mGN8i@h^*le=Lm($59~;o2PL*6(KS38u;I25V^^V?ElYT>se>$jsBJesF=XuX zOgNVOR{4Q(VaQ$5F>DbYy5^k({cP+Tu9e=ChSasuXR;lkG9KzXD`ASh=fJh-$<8%? zR-A^bs{`xaJ~FoBv@1p5{&-C=bohaB^s}iKScqiV8E~_GrQJEGlVqOpe2-^t$}ESk>--3| z<6Jyr=D#}In`tSpdR$kRn0SOPWhE{kdU*4tuynoB&{lLL(%j&8=aM^^gCQj#@(>dy1RU~gIrM;L46w!_u?OSdmZ>YSrNjHNJ>cKgy4czNHu#bv6XHajJWr?Eqv;ig4mo z#}`LYlY8y?ZDA` zt)2uf3FF;CZN#8D91Q%uxw$Di6zw&IYka06o-P+J?Wd3Be){miSFgIg(`d1jeKXMU zIH~t%yZ3q>d6hhCrtnrmu6rz3QvF!Iul&xbk~Q2g<_>Q!VI8y1cJ{^4xzOz?@S;1n zijVEs>-PMvg0I_C!11r9zLmbYgcb5S+p;Hd3#|3}hn>UX<~_0W%fII07q-RDFO}xW zmb{jbYfV_T9rDv9Kazo4BpQg=v*hDN@pb1OKQlgl-&Ej6XQR8J7`+`~^cFUl>&*Nl zt|x<5kY24L% zo&gj2B*T)v&PKLj4_YftM$5&nd-zp35>9a=3)^o%*ITeL5aqk>Rve_42C@@F*~tU5 z!*F)20IjYI(8T^jD7<8KCxa51(mWH@`vQ43(z}c-YG*ke2H)HkYG&6fLfkE;n)w$K zpk-K9eA}A9a$P*65WwMy;*oEpV^V0px0GC4##}?%$v19`etef#$gUcsyFlcb5QU`A zOnHi^V1eD)1}(QU@Xw2(CEIQjByfwOAzzC{v8lxP$bgmQC;=8X+=5FoGE^@gY^vuV zOPin}iL6uTS4$0FmmA&++5|yl`>L!rsMelJiOrCQtg}!;iMwX5-AXCb@azuwcF)AO zi^E|VdTTTj6Qt23)Pd`79TtHlJYV2a@0sUtm1(ljp`qX}u;RcmQf)aJ2KxeI zyZvr!zqm!Q@y`ZK@P>qmeRZYVi=k3X&3mv#=ruhtiGYf}&1gqkYvj9oYtW1>4dd$& z5XHkM0p(jW5z3;)_gpP6e~)iE5s`x2SA_TWPq+5>i4_WL$ds$$wy7K%`68k;3xuIP znw!>ax7GE{{`>v?eOr*F?Br!H`K~Lz7VK1m>EGb`Cal40IL)$my6JYeifo5;^xZ^e z`mRi9xWV_gFD!O!^Hx_9JAbp-VS0&vGELl@Ma+g42={KS1BW(04-VZGB;U71^Zf+% zvv+GHwN_i|TDqcl41irgDU-oPdeGAz><0Ol2#W z>N+!V77`Px>`P{bl5Q`CD{h!Sgx#beo3k&uaM^&xW-cJwrt9~D;?>!?TXc)p67gQW zc8jDPKawFP{kREZ%Pm1o^HbBnGggM$8EKD*Ubj)bU5)B~yZt*2r$hecvKCvW<+xe7 zDGP8)ZY@J@9iCe!OK#Q{WE&M}p)4zqrQq-kINoy{CMUCH;ZUX>UV~_|z#!$1Zn604 zb-Vq`AE&_ie(8Os)GD2B@_WU@;+AlI$o0^M?0cMxmn)5+X_+$QWg1k zJC&q;>xzAbmgqj$sd+35Oit84%y5y1G=4mnsS?^P=0PL=$sRVsI_dKD}( zqiYYW)Sqq6^r|JlQ}(L$#@*IE!XedLzG)QXg>#qF|^U$urx3!kd<_+#a2@JB)oY6&&i zTDcl*CDefRWP{6dzY|R5m72qc<;^0jbi+(t@8i4coA+XOsp*MH{-j)G>r%PxF1Ah+ z*;;IGbujGphi?Fqy?R7>O0|%0x`pWBVs&7BqciqN3yz(^X!ypNOvj`kXL{~Wo!%&z z4DU}JQn>T3KRtIw!+;))b{re-<4HhL4E^zq)A2i_(a@O;{kMTLIrqnJoe|)HTzD;MhEz`W-NUcKr^VLO1ei>*D zVIrTA?x_ivAsx#ng}Ei!w)|GB1^e2=otp=+y}kB{upW6*ERts;aCGc}ffy_|NzCat zJMzgk>wDFjUC3dEOF~`cs7X&`7d6W;p>1o%wuPNZnnW z=SEUH+rggN+RaQnMoLO#GyW`F*;eVc%dyuR&1GO`*)9qDUM7t+H+G$0l{Rmsw>e}C zJMW>8SmD~k+i&%HCB4-bN59N=ug~a-7Du1f@+|(q1K&9x2WJN`z;U8M-~<0vyFEGG zf@k#8<^lWTgxA;3S)W)FB7+SF9PME4{yrIHJLZeOGa;tNfQ*C2#3s4w48U#~O#_kx z4C3L)<3sRAc0Q6UUsD*xVwgeyjHM>_&DF5C?OgcN?zwYy2}a8>xSp~bq=1bC3^E#; z(>5Oi^oivY%WZP$cY}?c{sbbTAXOBqh$u@_hytTCk|Z+nBT07VpU2?hQMbw0M*NP!;BTZJu zI%(#!PO#;Wo7dVh*_HU6SMPxTon@zBJ0tJsv_yVjfnGI!$OLMM z{7{ecLncUR{167a3Nr;~5pttg-gFNS$nB!=AW?26vB;UKN$pgetJ3bZ9hBE9%xh~n zcO{$_vFdo?mNm?KDGYFE#Cv!bEYM10fq8H)iwSlsvzTCBv`a(mC9}Ym3F}sN1`q|& za;hn9I7dNCqepE<3(kpknPSW%;+osg$Z%UZ#8_#?Mp`S*Q`FMhu{o<9=S90T#Jg-a zzTS-OcBkl;H;a)kC;M))iDD{P+;EjB&ACV3Fh!Ci=~eq_EJu_dEH}bQCllduV8n zah;Pm*9vt+hBUuAr}cGCVqY(b+6{&$C%OGjQvI4nUb-jcXWDMPJZ{=Ga??yaOXH_K zGe6A&l)_OhGe>10`L#Jm7C$!56SH$n;)<50VWj--fG1j-hRKFzSsc;QHB2Tr*UO`h zuA#CvRuVVq8YW|YiM-S_@lurAt#Z89PNK}9P7+vv4V5=V2ib1_H~G>&VO?bS&6MY+T+K~ul~fKH%!4PPf^5Qb zQ#2&a;+k_-_{CU1r5!izHRGN_@*IE?YS=Q>Fv{&V>&7BGYIU0d#at^EFHxygNSugR z@~v6*RB{)mmbTjqmH-*Zv}E5cQL~mz107zj+Sk)-pC#|5)|)A%SJ$UeIQ9R21xT2t z3%{9wy%HLb;i6wH!D6cEdJa%Y4WS$@<$v8BU0ejiDaoo_E^mCOe%b+-Bg1{QjA^3w z;}HU_l%PZ&x3#v~^pwLc#Vmk&}>a|rvYcl~zo*Po$1;~pNAH~%Vjd(5HgzZUzIoSu~Rw1FGgGmRi;Yq=(^7{EEBGRP)byLgkKC9l2@cE(r*@O_^;@? z9Q)mAzv~YsC9hm5*LDW|&e$LKgUL>JP`bSAjsx!Q4E@_VIYBKf5j`Od}U>b~5(#?9l zrq_-kz}60R6E!@b_g`xFzkBv8z5fe~4Cvg9uAH|JUd!){uBN7J4%5=V{QkuG@1LJM z`Y-4B`Lkc1LiUFn8#{Wb0JFb>I6(`wr|n^T+&*jj?Vw%R_1f39PWv7)xDLDi_04-m zUOi#!8%V-ZKt7u!!6Es)b@|u$L+z8_`B2^dbba%ozTNnA`PYZacJtHGG5Pc9eV8Fh zO%jjCeusP{*X3VF@88dUmi}8hnZ~+&(g$q zhHPgiOqNu$B`Rd*jh)vJO}6;K+pbC)sT(m;^hLQB-KON>S#`D!Kl&`Q!!FCL(`A3c zzv6>0ZtxGj_}huD@Evi5X$^_VErvlrxO)VL9f6_4A8mf@#Gd(KDd8ty{V0F-MOOaD z&Zd>D+FifhJ!*GfwYwkM-F=o-`?})MpWqwXwy%g)ecJ5>r<_No;l7m4|DU~UZEhP^ zvY*$r`yUX+wL?l4O@Q)C*S2COnXT+*XJ(UBWj2C5MTwNHu}nImJeFS{?k~T4@FJ*~%BJdAI|3hXYf7EqV#klfH<(0{+C$BYm-H_K!dEJuNZF${M zsdQr3HT_(ucghha&`NtKNJ;fl>f$_>G(<4ZAFS^7n25pTFy}F zckc|DO4XE_#&^+UHIJUPD)uwWsn~n|`R9w#HFtWW0e9eBx#M@Zb8)(wy2od5s9H=& z2_eWpL<%hCisXyAS@QZafpHC|fTFwa$FSdDBbOnG!Z08{>BRjws*@x>3olQ?K`4cO z^s%(;b%j_EM?Vaa+-mZ`uXe>dQCIau-8KHh+`C~Q@2};xURSo&b-g-eFWq{5$77)p zBth7f^g(n*;(kDq;YC-)xYv3FIW`33`G~n=@`HwD3Gl(gDk#aOOcPrFgYfwzxCNxmFw-)n!c9k+)Ck z#vI+8)sA!ixjIn6WOSNYl8PEtovW%M#fQ?I^YF7HeNkCu+OouzSCMmBQUT1SVJ%|X zrq;@iukUTQYRHaPZ95$ksQM0ys6(zvRZR(qR&%m$RSk@dJ-=-Qp>1Pk6WCU0n{FF~ zivJ7@I|y$_TB4gtbhQRBtWID{9d@?xlkFfoNK2qplz`OJ)r=xJfwsFt=cV&17cY&? zc_}Nf1Y0h_gsi_gWxJuPME!OsFX@1<-sbQ(9TX%PoLsd1L3>P`)QS4SiqLFSfyV7f z<}S>u@tm~7<6e}gAO81kjA}gTNCuYB5owc-O;)pT7zOtFNFyiX4nRc6$`l)k-yxeN zxd`<>C+%j3v;v}zRZ})1nnhD2$XZHk2-FnULUW4N46G2%4dTS=S-%V7)aqMjATs9; zk9E@f{j`6kY@wbeZq(D{je4q}QD35>$uC_BDU*tvqt#o>E>{{iYj>@Rc6CR5)hbu)+ndH(<4%bAWqzr6dcvNr z1vH_9CRP&_9j+)HjqjkOVsuQUo=j&FG`=te{QmYGzZ82c>$yRGYkS8X3;OM`;BUX> zgUY*xz4!txBR6VvOJ2miFcr*Fq$Tn5^NJ}YjjvL|55$7(R(w!=&*IbuH1CdoN=<7| zExu$BLgEwU>OU3GL2384)wW^0mh^)#UF#U8Z(BVZwric*oKg%R9QkV!~gbwQBa)14EI`N_DZ}SXOF|y z8_&?6vT@r?`$3ACzeMlVb%Bwq7nm7?SsaKvG0ztvLc-Ay;}#~j zavrTmA}#$q8=^%6q(i8hJczrIm|&r^aw>bf<(Q)T+Hd(|RGtJa>h;-??VC*i(Ny^< zyWsET_=acX)Z)G+C(!Uc<=b?|qxLq&1RD2~Xe<<&Cm|*fb%LR==JH{S++rSMt%xWh zexH<&w%sZpb-Nf9UAke}Eh0s@;2NHev&a`Gv&)3r;+95gj2Sb@@B=cRl zT`3U_Wj6dU5=!Jxj);=YsOM5^I-OkAsr=iU^Nl1&g%cLk)?Ae+2qTaBFh88cTQLX!+Oq4qh ztU!h7KT6XF<2mVG4CG6g;#2=>P3#NxRn__AJRJ05W&aPx(q23?%YXc)j}r0bY|EF0 zZ7K_xt|n2O*1UQ$7OZyu_*CZ@Gjn~kX8Yq*(zxa1q8-F%elJ>?+h@lTJ}eU!-g_>> zsqUwY;Q`8B$+>CV8D3v?eiqZ;&F^oDCeGQ>6)W| zm9I-jdj-+Xlg*LVglZS+;$*UcR2P4)T35b>QT#NZtp5Z#4TRD^&9%rw7EiCL(jq-Q zbI?EQ80gpdCZg}}KDdd`jA}6p<6Tv-7Z0w?kKQ+u2S0Wh$zrnh0E%B2{GT>idw}~! zYY(hEFCJKVitbX355@RU82tas_^@#ERjh&hm8IPwTR6y1`aLY$vKwjjq)*NU@deg5 zkKX8>-jcL{iMG_A93-~Ap zPHJDWXT^<0$rxTbaFh~WQb`>7y@)g&v3!%Ut+I9UnJ$y&rS)V_2(HH$dna)+T#xt8 z`+g@}KOdY0dlwhZ)z!KmfF$dkz2o*eFYyvC2}U=%h!czXrli) z+4r$#{8+-u%DQRhnHBw<{N%UE{{uugy#?=saBYOSh)!HHOVc@=Y7W_uC}l3lOt`-k%5s9*Tq*h%E5BUQYTto}rP z79$>L<4m7k7JhSfQ47EM9sK6)6Y9^xIhM4dQaU)G!;O6x`kQ(+a+BkW>Dcmn)x~6~ z==4i+cqEf0`K|k6d%Q5{r8ztbgMRGu^Z^m*wy%47r%l6%)ESa0=HTk0

  • ^TSF)t`(~K>iK}F#Ui5&X2Q10qFVF)TW4Zms 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 literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/practicals-1.0.3.zip b/clones/gigamonkeys.com/book/practicals-1.0.3.zip new file mode 100644 index 0000000000000000000000000000000000000000..fe93823ff49238e7c39106ba4932e5debee023fe GIT binary patch literal 239354 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 literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/programming-in-the-large-packages-and-symbols.html b/clones/gigamonkeys.com/book/programming-in-the-large-packages-and-symbols.html new file mode 100644 index 00000000..80266884 --- /dev/null +++ b/clones/gigamonkeys.com/book/programming-in-the-large-packages-and-symbols.html @@ -0,0 +1,547 @@ +Programming in the Large: Packages and Symbols

    21. Programming in the Large: Packages and Symbols

    In Chapter 4 I discussed how the Lisp reader translates textual names +into objects to be passed to the evaluator, representing them with a +kind of object called a symbol. It turns out that having a +built-in data type specifically for representing names is quite handy +for a lot of kinds of programming.1 +That, however, isn't the topic of this chapter. In this chapter I'll +discuss one of the more immediate and practical aspects of dealing +with names: how to avoid name conflicts between independently +developed pieces of code.

    Suppose, for instance, you're writing a program and decide to use a +third-party library. You don't want to have to know the name of every +function, variable, class, or macro used in the internals of that +library in order to avoid conflicts between those names and the names +you use in your program. You'd like for most of the names in the +library and the names in your program to be considered distinct even +if they happen to have the same textual representation. At the same +time, you'd like certain names defined in the library to be readily +accessible--the names that make up its public API, which you'll want +to use in your program.

    In Common Lisp, this namespace problem boils down to a question of +controlling how the reader translates textual names into symbols: if +you want two occurrences of the same name to be considered the same +by the evaluator, you need to make sure the reader uses the same +symbol to represent each name. Conversely, if you want two names to +be considered distinct, even if they happen to have the same textual +name, you need the reader to create different symbols to represent +each name.

    How the Reader Uses Packages

    In Chapter 4 I discussed briefly how the Lisp reader translates names +into symbols, but I glossed over most of the details--now it's time +to take a closer look at what actually happens.

    I'll start by describing the syntax of names understood by the reader +and how that syntax relates to packages. For the moment you can think +of a package as a table that maps strings to symbols. As you'll see +in the next section, the actual mapping is slightly more flexible +than a simple lookup table but not in ways that matter much to the +reader. Each package also has a name, which can be used to find the +package using the function FIND-PACKAGE.

    The two key functions that the reader uses to access the +name-to-symbol mappings in a package are FIND-SYMBOL and +INTERN. Both these functions take a string and, optionally, a +package. If not supplied, the package argument defaults to the value +of the global variable *PACKAGE*, also called the current +package.

    FIND-SYMBOL looks in the package for a symbol with the given +string for a name and returns it, or NIL if no symbol is found. +INTERN also will return an existing symbol; otherwise it creates +a new symbol with the string as its name and adds it to the package.

    Most names you use are unqualified, names that contain no colons. +When the reader reads such a name, it translates it to a symbol by +converting any unescaped letters to uppercase and passing the +resulting string to INTERN. Thus, each time the reader reads the +same name in the same package, it'll get the same symbol object. This +is important because the evaluator uses the object identity of +symbols to determine which function, variable, or other program +element a given symbol refers to. Thus, the reason an expression such +as (hello-world) results in calling a particular +hello-world function is because the reader returns the same +symbol when it reads the function call as it did when it read the +DEFUN form that defined the function.

    A name containing either a single colon or a double colon is a +package-qualified name. When the reader reads a package-qualified +name, it splits the name on the colon(s) and uses the first part as +the name of a package and the second part as the name of the symbol. +The reader looks up the appropriate package and uses it to translate +the symbol name to a symbol object.

    A name containing only a single colon must refer to an external +symbol--one the package exports for public use. If the named +package doesn't contain a symbol with a given name, or if it does but +it hasn't been exported, the reader signals an error. A double-colon +name can refer to any symbol from the named package, though it's +usually a bad idea--the set of exported symbols defines a package's +public interface, and if you don't respect the package author's +decision about what names to make public and which ones to keep +private, you're asking for trouble down the road. On the other hand, +sometimes a package author will neglect to export a symbol that +really ought to be public. In that case, a double-colon name lets you +get work done without having to wait for the next version of the +package to be released.

    Two other bits of symbol syntax the reader understands are those for +keyword symbols and uninterned symbols. Keyword symbols are written +with names starting with a colon. Such symbols are interned in the +package named KEYWORD and automatically exported. Additionally, +when the reader interns a symbol in the KEYWORD, it also defines +a constant variable with the symbol as both its name and value. This +is why you can use keywords in argument lists without quoting +them--when they appear in a value position, they evaluate to +themselves. Thus:

    (eql ':foo :foo) ==> T

    The names of keyword symbols, like all symbols, are converted to all +uppercase by the reader before they're interned. The name doesn't +include the leading colon.

    (symbol-name :foo) ==> "FOO"

    Uninterned symbols are written with a leading #:. These names +(minus the #:) are converted to uppercase as normal and then +translated into symbols, but the symbols aren't interned in any +package; each time the reader reads a #: name, it creates a +new symbol. Thus:

    (eql '#:foo '#:foo) ==> NIL

    You'll rarely, if ever, write this syntax yourself, but will +sometimes see it when you print an s-expression containing symbols +returned by the function GENSYM.

    (gensym) ==> #:G3128

    A Bit of Package and Symbol Vocabulary

    As I mentioned previously, the mapping from names to symbols +implemented by a package is slightly more flexible than a simple +lookup table. At its core, every package contains a name-to-symbol +lookup table, but a symbol can be made accessible via an unqualified +name in a given package in other ways. To talk sensibly about these +other mechanisms, you'll need a little bit of vocabulary.

    To start with, all the symbols that can be found in a given package +using FIND-SYMBOL are said to be accessible in that package. +In other words, the accessible symbols in a package are those that +can be referred to with unqualified names when the package is +current.

    A symbol can be accessible in two ways. The first is for the +package's name-to-symbol table to contain an entry for the symbol, in +which case the symbol is said to be present in the package. When +the reader interns a new symbol in a package, it's added to the +package's name-to-symbol table. The package in which a symbol is +first interned is called the symbol's home package.

    The other way a symbol can be accessible in a package is if the +package inherits it. A package inherits symbols from other +packages by using the other packages. Only external symbols +in the used packages are inherited. A symbol is made external in a +package by exporting it. In addition to causing it to be +inherited by using packages, exporting a symbol also--as you saw in +the previous section--makes it possible to refer to the symbol using +a single-colon qualified name.

    To keep the mappings from names to symbols deterministic, the package +system allows only one symbol to be accessible in a given package for +each name. That is, a package can't have a present symbol and an +inherited symbol with the same name or inherit two different symbols, +from different packages, with the same name. However, you can resolve +conflicts by making one of the accessible symbols a shadowing +symbol, which makes the other symbols of the same name inaccessible. +In addition to its name-to-symbol table, each package maintains a +list of shadowing symbols.

    An existing symbol can be imported into another package by adding +it to the package's name-to-symbol table. Thus, the same symbol can +be present in multiple packages. Sometimes you'll import symbols +simply because you want them to be accessible in the importing +package without using their home package. Other times you'll import a +symbol because only present symbols can be exported or be shadowing +symbols. For instance, if a package needs to use two packages that +have external symbols of the same name, one of the symbols must be +imported into the using package in order to be added to its shadowing +list and make the other symbol inaccessible.

    Finally, a present symbol can be uninterned from a package, which +causes it to be removed from the name-to-symbol table and, if it's a +shadowing symbol, from the shadowing list. You might unintern a +symbol from a package to resolve a conflict between the symbol and an +external symbol from a package you want to use. A symbol that isn't +present in any package is called an uninterned symbol, can no +longer be read by the reader, and will be printed using the +#:foo syntax.

    Three Standard Packages

    In the next section I'll show you how to define your own packages, +including how to make one package use another and how to export, +shadow, and import symbols. But first let's look at a few packages +you've been using already. When you first start Lisp, the value of +*PACKAGE* is typically the COMMON-LISP-USER package, also +known as CL-USER.2 +CL-USER uses the package COMMON-LISP, which exports all +the names defined by the language standard. Thus, when you type an +expression at the REPL, all the names of standard functions, macros, +variables, and so on, will be translated to the symbols exported from +COMMON-LISP, and all other names will be interned in the +COMMON-LISP-USER package. For example, the name *PACKAGE* +is exported from COMMON-LISP--if you want to see the value of +*PACKAGE*, you can type this:

    CL-USER> *package*
    +#<The COMMON-LISP-USER package>

    because COMMON-LISP-USER uses COMMON-LISP. Or you can +use a package-qualified name.

    CL-USER> common-lisp:*package*
    +#<The COMMON-LISP-USER package>

    You can even use COMMON-LISP's nickname, CL.

    CL-USER> cl:*package*
    +#<The COMMON-LISP-USER package>

    But *X* isn't a symbol in COMMON-LISP, so you if type +this:

    CL-USER> (defvar *x* 10)
    +*X*

    the reader reads DEFVAR as the symbol from the +COMMON-LISP package and *X* as a symbol in +COMMON-LISP-USER.

    The REPL can't start in the COMMON-LISP package because you're +not allowed to intern new symbols in it; COMMON-LISP-USER +serves as a "scratch" package where you can create your own names +while still having easy access to all the symbols in +COMMON-LISP.3 Typically, all packages you'll define will also use +COMMON-LISP, so you don't have to write things like this:

    (cl:defun (x) (cl:+ x 2))

    The third standard package is the KEYWORD package, the package +the Lisp reader uses to intern names starting with colon. Thus, you +can also refer to any keyword symbol with an explicit package +qualification of keyword like this:

    CL-USER> :a
    +:A
    +CL-USER> keyword:a
    +:A
    +CL-USER> (eql :a keyword:a)
    +T

    Defining Your Own Packages

    Working in COMMON-LISP-USER is fine for experiments at the +REPL, but once you start writing actual programs you'll want to +define new packages so different programs loaded into the same Lisp +environment don't stomp on each other's names. And when you write +libraries that you intend to use in different contexts, you'll want +to define separate packages and then export the symbols that make up +the libraries' public APIs.

    However, before you start defining packages, it's important to +understand one thing about what packages do not do. Packages +don't provide direct control over who can call what function or +access what variable. They provide you with basic control over +namespaces by controlling how the reader translates textual names +into symbol objects, but it isn't until later, in the evaluator, that +the symbol is interpreted as the name of a function or variable or +whatever else. Thus, it doesn't make sense to talk about exporting a +function or a variable from a package. You can export symbols to make +certain names easier to refer to, but the package system doesn't +allow you to restrict how those names are used.4

    With that in mind, you can start looking at how to define packages +and tie them together. You define new packages with the macro +DEFPACKAGE, which allows you to not only create the package but +to specify what packages it uses, what symbols it exports, and what +symbols it imports from other packages and to resolve conflicts by +creating shadowing symbols.5

    I'll describe the various options in terms of how you might use +packages while writing a program that organizes e-mail messages into +a searchable database. The program is purely hypothetical, as are the +libraries I'll refer to--the point is to look at how the packages +used in such a program might be structured.

    The first package you'd need is one to provide a namespace for the +application--you want to be able to name your functions, variables, +and so on, without having to worry about name collisions with +unrelated code. So you'd define a new package with DEFPACKAGE.

    If the application is simple enough to be written with no libraries +beyond the facilities provided by the language itself, you could +define a simple package like this:

    (defpackage :com.gigamonkeys.email-db
    +  (:use :common-lisp))

    This defines a package, named COM.GIGAMONKEYS.EMAIL-DB, that +inherits all the symbols exported by the COMMON-LISP +package.6

    You actually have several choices of how to represent the names of +packages and, as you'll see, the names of symbols in a +DEFPACKAGE. Packages and symbols are named with strings. However, +in a DEFPACKAGE form, you can specify the names of packages and +symbols with string designators. A string designator is either a +string, which designates itself; a symbol, which designates its name; +or a character, which designates a one-character string containing +just the character. Using keyword symbols, as in the previous +DEFPACKAGE, is a common style that allows you to write the names +in lowercase--the reader will convert the names to uppercase for you. +You could also write the DEFPACKAGE with strings, but then you +have to write them in all uppercase, because the true names of most +symbols and packages are in fact uppercase because of the case +conversion performed by the reader.7

    (defpackage "COM.GIGAMONKEYS.EMAIL-DB"
    +  (:use "COMMON-LISP"))

    You could also use nonkeyword symbols--the names in DEFPACKAGE +aren't evaluated--but then the very act of reading the +DEFPACKAGE form would cause those symbols to be interned in the +current package, which at the very least will pollute that namespace +and may also cause problems later if you try to use the +package.8

    To read code in this package, you need to make it the current package +with the IN-PACKAGE macro:

    (in-package :com.gigamonkeys.email-db)

    If you type this expression at the REPL, it will change the value of +*PACKAGE*, affecting how the REPL reads subsequent expressions, +until you change it with another call to IN-PACKAGE. Similarly, +if you include an IN-PACKAGE in a file that's loaded with +LOAD or compiled with COMPILE-FILE, it will change the +package, affecting the way subsequent expressions in the file are +read.9

    With the current package set to the COM.GIGAMONKEYS.EMAIL-DB +package, other than names inherited from the COMMON-LISP +package, you can use any name you want for whatever purpose you want. +Thus, you could define a new hello-world function that could +coexist with the hello-world function previously defined in +COMMON-LISP-USER. Here's the behavior of the existing +function:

    CL-USER> (hello-world)
    +hello, world
    +NIL

    Now you can switch to the new package using IN-PACKAGE.10 Notice how the prompt changes--the exact +form is determined by the development environment, but in SLIME the +default prompt consists of an abbreviated version of the package +name.

    CL-USER> (in-package :com.gigamonkeys.email-db)
    +#<The COM.GIGAMONKEYS.EMAIL-DB package>
    +EMAIL-DB> 

    You can define a new hello-world in this package:

    EMAIL-DB> (defun hello-world () (format t "hello from EMAIL-DB package~%"))
    +HELLO-WORLD

    And test it, like this:

    EMAIL-DB> (hello-world)
    +hello from EMAIL-DB package
    +NIL

    Now switch back to CL-USER.

    EMAIL-DB> (in-package :cl-user)
    +#<The COMMON-LISP-USER package>
    +CL-USER> 

    And the old function is undisturbed.

    CL-USER> (hello-world)
    +hello, world
    +NIL

    Packaging Reusable Libraries

    While working on the e-mail database, you might write several +functions related to storing and retrieving text that don't have +anything in particular to do with e-mail. You might realize that +those functions could be useful in other programs and decide to +repackage them as a library. You should define a new package, but +this time you'll export certain names to make them available to other +packages.

    (defpackage :com.gigamonkeys.text-db
    +  (:use :common-lisp)
    +  (:export :open-db   
    +           :save
    +           :store))

    Again, you use the COMMON-LISP package, because you'll need +access to standard functions within COM.GIGAMONKEYS.TEXT-DB. +The :export clause specifies names that will be external in +COM.GIGAMONKEYS.TEXT-DB and thus accessible in packages that +:use it. Therefore, after you've defined this package, you can +change the definition of the main application package to the +following:

    (defpackage :com.gigamonkeys.email-db
    +  (:use :common-lisp :com.gigamonkeys.text-db))

    Now code written in COM.GIGAMONKEYS.EMAIL-DB can use +unqualified names to refer to the exported symbols from both +COMMON-LISP and COM.GIGAMONKEYS.TEXT-DB. All other names +will continue to be interned directly in the +COM.GIGAMONKEYS.EMAIL-DB package.

    Importing Individual Names

    Now suppose you find a third-party library of functions for +manipulating e-mail messages. The names used in the library's API are +exported from the package COM.ACME.EMAIL, so you could +:use that package to get easy access to those names. But +suppose you need to use only one function from this library, and +other exported symbols conflict with names you already use (or plan +to use) in our own code.11 In this case, you can import the one +symbol you need with an :import-from clause in the +DEFPACKAGE. For instance, if the name of the function you want +to use is parse-email-address, you can change the +DEFPACKAGE to this:

    (defpackage :com.gigamonkeys.email-db
    +  (:use :common-lisp :com.gigamonkeys.text-db)
    +  (:import-from :com.acme.email :parse-email-address))

    Now anywhere the name parse-email-address appears in code read +in the COM.GIGAMONKEYS.EMAIL-DB package, it will be read as +the symbol from COM.ACME.EMAIL. If you need to import more +than one symbol from a single package, you can include multiple names +after the package name in a single :import-from clause. A +DEFPACKAGE can also include multiple :import-from clauses +in order to import symbols from different packages.

    Occasionally you'll run into the opposite situation--a package may +export a bunch of names you want to use and a few you don't. Rather +than listing all the symbols you do want to use in an +:import-from clause, you can instead :use the package +and then list the names you don't want to inherit in a +:shadow clause. For instance, suppose the COM.ACME.TEXT +package exports a bunch of names of functions and classes used in +text processing. Further suppose that most of these functions and +classes are ones you'll want to use in your code, but one of the +names, build-index, conflicts with a name you've already used. +You can make the build-index from COM.ACME.TEXT +inaccessible by shadowing it.

    (defpackage :com.gigamonkeys.email-db
    +  (:use
    +   :common-lisp
    +   :com.gigamonkeys.text-db
    +   :com.acme.text)
    +  (:import-from :com.acme.email :parse-email-address)
    +  (:shadow :build-index))

    The :shadow clause causes a new symbol named +BUILD-INDEX to be created and added directly to +COM.GIGAMONKEYS.EMAIL-DB's name-to-symbol map. Now if the +reader reads the name BUILD-INDEX, it will translate it to the +symbol in COM.GIGAMONKEYS.EMAIL-DB's map, rather than the one +that would otherwise be inherited from COM.ACME.TEXT. The new +symbol is also added to a shadowing symbols list that's part of +the COM.GIGAMONKEYS.EMAIL-DB package, so if you later use +another package that also exports a BUILD-INDEX symbol, the +package system will know there's no conflict--that you want the +symbol from COM.GIGAMONKEYS.EMAIL-DB to be used rather than +any other symbols with the same name inherited from other packages.

    A similar situation can arise if you want to use two packages that +export the same name. In this case the reader won't know which +inherited name to use when it reads the textual name. In such +situations you must resolve the ambiguity by shadowing the +conflicting names. If you don't need to use the name from either +package, you could shadow the name with a :shadow clause, +creating a new symbol with the same name in your package. But if you +actually want to use one of the inherited symbols, then you need to +resolve the ambiguity with a :shadowing-import-from clause. +Like an :import-from clause, a :shadowing-import-from +clause consists of a package name followed by the names to import +from that package. For instance, if COM.ACME.TEXT exports a +name SAVE that conflicts with the name exported from +COM.GIGAMONKEYS.TEXT-DB, you could resolve the ambiguity with +the following DEFPACKAGE:

    (defpackage :com.gigamonkeys.email-db
    +  (:use
    +   :common-lisp
    +   :com.gigamonkeys.text-db
    +   :com.acme.text)
    +  (:import-from :com.acme.email :parse-email-address)
    +  (:shadow :build-index)
    +  (:shadowing-import-from :com.gigamonkeys.text-db :save))

    Packaging Mechanics

    That covers the basics of how to use packages to manage namespaces in +several common situations. However, another level of how to use +packages is worth discussing--the raw mechanics of how to organize +code that uses different packages. In this section I'll discuss a few +rules of thumb about how to organize code--where to put your +DEFPACKAGE forms relative to the code that uses your packages +via IN-PACKAGE.

    Because packages are used by the reader, a package must be defined +before you can LOAD or COMPILE-FILE a file that contains an +IN-PACKAGE expression switching to that package. Packages also +must be defined before other DEFPACKAGE forms can refer to them. +For instance, if you're going to :use +COM.GIGAMONKEYS.TEXT-DB in COM.GIGAMONKEYS.EMAIL-DB, +then COM.GIGAMONKEYS.TEXT-DB's DEFPACKAGE must be +evaluated before the DEFPACKAGE of +COM.GIGAMONKEYS.EMAIL-DB.

    The best first step toward making sure packages exist when they need +to is to put all your DEFPACKAGEs in files separate from the +code that needs to be read in those packages. Some folks like to +create a foo-package.lisp file for each individual package, +and others create a single packages.lisp that contains all the +DEFPACKAGE forms for a group of related packages. Either +approach is reasonable, though the one-file-per-package approach also +requires that you arrange to load the individual files in the right +order according to the interpackage dependencies.

    Either way, once all the DEFPACKAGE forms have been separated +from the code that will be read in the packages they define, you can +arrange to LOAD the files containing the DEFPACKAGEs before +you compile or load any of the other files. For simple programs you +can do this by hand: simply LOAD the file or files containing +the DEFPACKAGE forms, possibly compiling them with +COMPILE-FILE first. Then LOAD the files that use those +packages, again optionally compiling them first with +COMPILE-FILE. Note, however, that the packages don't exist until +you LOAD the package definitions, either the source or the files +produced by COMPILE-FILE. Thus, if you're compiling everything, +you must still LOAD all the package definitions before you can +COMPILE-FILE any files to be read in the packages.

    Doing these steps by hand will get tedious after a while. For simple +programs you can automate the steps by writing a file, +load.lisp, that contains the appropriate LOAD and +COMPILE-FILE calls in the right order. Then you can just +LOAD that file. For more complex programs you'll want to use a +system definition facility to manage loading and compiling files +in the right order.12

    The other key rule of thumb is that each file should contain exactly +one IN-PACKAGE form, and it should be the first form in the file +other than comments. Files containing DEFPACKAGE forms should +start with (in-package "COMMON-LISP-USER"), and all other +files should contain an IN-PACKAGE of one of your packages.

    If you violate this rule and switch packages in the middle of a file, +you'll confuse human readers who don't notice the second +IN-PACKAGE. Also, many Lisp development environments, +particularly Emacs-based ones such as SLIME, look for an +IN-PACKAGE to determine the package they should use when +communicating with Common Lisp. Multiple IN-PACKAGE forms per +file may confuse these tools as well.

    On the other hand, it's fine to have multiple files read in the same +package, each with an identical IN-PACKAGE form. It's just a +matter of how you like to organize your code.

    The other bit of packaging mechanics has to do with how to name +packages. Package names live in a flat namespace--package names are +just strings, and different packages must have textually distinct +names. Thus, you have to consider the possibility of conflicts +between package names. If you're using only packages you developed +yourself, then you can probably get away with using short names for +your packages. But if you're planning to use third-party libraries or +to publish your code for use by other programmers, then you need to +follow a naming convention that will minimize the possibility of name +collisions between different packages. Many Lispers these days are +adopting Java-style names, like the ones used in this chapter, +consisting of a reversed Internet domain name followed by a dot and a +descriptive string.

    Package Gotchas

    Once you're familiar with packages, you won't spend a bunch of time +thinking about them. There's just not that much to them. However, a +couple of gotchas that bite most new Lisp programmers make the +package system seem more complicated and unfriendly than it really +is.

    The number-one gotcha arises most commonly when playing around at the +REPL. You'll be looking at some library that defines certain +interesting functions. You'll try to call one of the functions like +this:

    CL-USER> (foo)

    and get dropped into the debugger with this error:

    attempt to call `FOO' which is an undefined function.
    +   [Condition of type UNDEFINED-FUNCTION]
    +
    +Restarts:
    +  0: [TRY-AGAIN] Try calling FOO again.
    +  1: [RETURN-VALUE] Return a value instead of calling FOO.
    +  2: [USE-VALUE] Try calling a function other than FOO.
    +  3: [STORE-VALUE] Setf the symbol-function of FOO and call it again.
    +  4: [ABORT] Abort handling SLIME request.
    +  5: [ABORT] Abort entirely from this (lisp) process.

    Ah, of course--you forgot to use the library's package. So you quit +the debugger and try to USE-PACKAGE the library's package in +order to get access to the name FOO so you can call the +function.

    CL-USER> (use-package :foolib)

    But that drops you back into the debugger with this error message:

    Using package `FOOLIB' results in name conflicts for these symbols: FOO
    +   [Condition of type PACKAGE-ERROR]
    +
    +Restarts:
    +  0: [CONTINUE] Unintern the conflicting symbols from the `COMMON-LISP-USER' package.
    +  1: [ABORT] Abort handling SLIME request.
    +  2: [ABORT] Abort entirely from this (lisp) process.

    Huh? The problem is the first time you called foo, the reader +read the name foo and interned it in CL-USER before the +evaluator got hold of it and discovered that this newly interned +symbol isn't the name of a function. This new symbol then conflicts +with the symbol of the same name exported from the FOOLIB +package. If you had remembered to USE-PACKAGE FOOLIB +before you tried to call foo, the reader would have read +foo as the inherited symbol and not interned a foo +symbol in CL-USER.

    However, all isn't lost, because the first restart offered by the +debugger will patch things up in just the right way: it will unintern +the foo symbol from COMMON-LISP-USER, putting the +CL-USER package back to the state it was in before you called +foo, allowing the USE-PACKAGE to proceed and allowing for +the inherited foo to be available in CL-USER.

    This kind of problem can also occur when loading and compiling files. +For instance, if you defined a package, MY-APP, for code that +was going to use functions with names from the FOOLIB package, +but forgot to :use FOOLIB, when you compile the files +with an (in-package :my-app) in them, the reader will intern +new symbols in MY-APP for the names that were supposed to be +read as symbols from FOOLIB. When you try to run the compiled +code, you'll get undefined function errors. If you then try to +redefine the MY-APP package to :use FOOLIB, +you'll get the conflicting symbols error. The solution is the same: +select the restart to unintern the conflicting symbols from +MY-APP. You'll then need to recompile the code in the +MY-APP package so it will refer to the inherited names.

    The next gotcha is essentially the reverse of the first gotcha. In +this case, you'd have defined a package--again, let's say it's +MY-APP--that uses another package, say, FOOLIB. Now you +start writing code in the MY-APP package. Although you used +FOOLIB in order to be able to refer to the foo +function, FOOLIB may export other symbols as well. If you use +one of those exported symbols--say, bar--as the name of a +function in your own code, Lisp won't complain. Instead, the name of +your function will be the symbol exported by FOOLIB, which +will clobber the definition of bar from FOOLIB.

    This gotcha is more insidious because it doesn't cause an error--from +the evaluator's point of view it's just being asked to associate a +new function with an old name, something that's perfectly legal. It's +suspect only because the code doing the redefining was read with a +different value for *PACKAGE* than the name's package. But the +evaluator doesn't necessarily know that. However, in most Lisps +you'll get an warning about "redefining BAR, originally defined +in?". You should heed those warnings. If you clobber a definition +from a library, you can restore it by reloading the library code with +LOAD.13

    The last package-related gotcha is, by comparison, quite trivial, but +it bites most Lisp programmers at least a few times: you define a +package that uses COMMON-LISP and maybe a few libraries. Then +at the REPL you change to that package to play around. Then you decide +to quit Lisp altogether and try to call (quit). However, +quit isn't a name from the COMMON-LISP package--it's +defined by the implementation in some implementation-specific package +that happens to be used by COMMON-LISP-USER. The solution is +simple--change packages back to CL-USER to quit. Or use the +SLIME REPL shortcut quit, which will also save you from having +to remember that in certain Common Lisp implementations the function +to quit is exit, not quit.

    You're almost done with your tour of Common Lisp. In the next chapter +I'll discuss the details of the extended LOOP macro. After that, +the rest of the book is devoted to "practicals": a spam filter, a +library for parsing binary files, and various parts of a streaming +MP3 server with a Web interface. +


    1The kind of programming that +relies on a symbol data type is called, appropriately enough, +symbolic computation. It's typically contrasted to numeric +programming. An example of a primarily symbolic program that all +programmers should be familiar with is a compiler--it treats the text +of a program as symbolic data and translates it into a new form.

    2Every package has one official name and +zero or more nicknames that can be used anywhere you need to use +the package name, such as in package-qualified names or to refer to +the package in a DEFPACKAGE or IN-PACKAGE form.

    3COMMON-LISP-USER is also allowed to +provide access to symbols exported by other implementation-defined +packages. While this is intended as a convenience for the user--it +makes implementation-specific functionality readily accessible--it +can also cause confusion for new Lispers: Lisp will complain about an +attempt to redefine some name that isn't listed in the language +standard. To see what packages COMMON-LISP-USER inherits +symbols from in a particular implementation, evaluate this expression +at the REPL:

    (mapcar #'package-name (package-use-list :cl-user))

    And to find out what package a symbol came from originally, evaluate +this:

    (package-name (symbol-package 'some-symbol))

    with some-symbol replaced by the symbol in question. For instance:

    (package-name (symbol-package 'car)) ==> "COMMON-LISP"
    +(package-name (symbol-package 'foo)) ==> "COMMON-LISP-USER"

    Symbols inherited from implementation-defined packages will return +some other value.

    4This is +different from the Java package system, which provides a namespace +for classes but is also involved in Java's access control mechanism. +The non-Lisp language with a package system most like Common Lisp's +packages is Perl.

    5All the manipulations performed by +DEFPACKAGE can also be performed with functions that man- +ipulate package objects. However, since a package generally needs to +be fully defined before it can be used, those functions are rarely +used. Also, DEFPACKAGE takes care of performing all the package +manipulations in the right order--for instance, DEFPACKAGE adds +symbols to the shadowing list before it tries to use the used +packages.

    6In many Lisp implementations the :use clause is +optional if you want only to :use COMMON-LISP--if it's +omitted, the package will automatically inherit names from an +implementation-defined list of packages that will usually include +COMMON-LISP. However, your code will be more portable if you +always explicitly specify the packages you want to :use. Those +who are averse to typing can use the package's nickname and write +(:use :cl).

    7Using keywords instead of +strings has another advantage--Allegro provides a "modern mode" Lisp +in which the reader does no case conversion of names and in which, +instead of a COMMON-LISP package with uppercase names, provides a +common-lisp package with lowercase names. Strictly speaking, +this Lisp isn't a conforming Common Lisp since all the names in the +standard are defined to be uppercase. But if you write your +DEFPACKAGE forms using keyword symbols, they will work both in +Common Lisp and in this near relative.

    8Some folks, instead of keywords, use uninterned +symbols, using the #: syntax.

    (defpackage #:com.gigamonkeys.email-db
    +  (:use #:common-lisp))

    This saves a tiny bit of memory by not interning any symbols in the +keyword package--the symbol can become garbage after DEFPACKAGE +(or the code it expands into) is done with it. However, the difference +is so slight that it really boils down to a matter of aesthetics.

    9The reason to use IN-PACKAGE instead of just +SETFing *PACKAGE* is that IN-PACKAGE expands into code +that will run when the file is compiled by COMPILE-FILE as well +as when the file is loaded, changing the way the reader reads the +rest of the file during compilation.

    10In +the REPL buffer in SLIME you can also change packages with a REPL +shortcut. Type a comma, and then enter change-package at the +Command: prompt.

    11During development, if you try to +:use a package that exports a symbol with the same name as a +symbol already interned in the using package, Lisp will signal an +error and typically offer you a restart that will unintern the +offending symbol from the using package. For more on this, see the +section "Package Gotchas."

    12The code for the "Practical" chapters, +available from this book's Web site, uses the ASDF system definition +library. ASDF stands for Another System Definition Facility.

    13Some Common Lisp implementations, such as Allegro and +SBCL, provide a facility for "locking" the symbols in a particular +package so they can be used in defining forms such as DEFUN, +DEFVAR, and DEFCLASS only when their home package is the +current package.

    \ No newline at end of file diff --git a/clones/gigamonkeys.com/book/screenshots/hello-world.jpg b/clones/gigamonkeys.com/book/screenshots/hello-world.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fabe9185bd87bc06da638685e76d0cfeba634b0 GIT binary patch literal 15455 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 ezMFgdHrB^|! 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 RrN&t=#9ubZk}hA({trrFh=BkA literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/screenshots/show-cookies-no-cookies.jpg b/clones/gigamonkeys.com/book/screenshots/show-cookies-no-cookies.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3410db41f29d54101a937552e416dd9f521bb4ad GIT binary patch literal 15603 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 JsrcT^{4c!XF4F)2 literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/screenshots/show-query-params-2.jpg b/clones/gigamonkeys.com/book/screenshots/show-query-params-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c9bc24be492413e9bd96f6f8e6dfd2112c555bb GIT binary patch literal 18633 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 pK>#;KZHi}&6~EH-bvISzD} literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/screenshots/simple-form.jpg b/clones/gigamonkeys.com/book/screenshots/simple-form.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67451156914dea9e2121962f06c66a40cb96e757 GIT binary patch literal 17393 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 literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/small-cover.gif b/clones/gigamonkeys.com/book/small-cover.gif new file mode 100644 index 0000000000000000000000000000000000000000..570e7cb0a7bc6db0ca3cb0b8e0e5e6cd14f6ac3c GIT binary patch literal 6738 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 literal 0 HcmV?d00001 diff --git a/clones/gigamonkeys.com/book/style.css b/clones/gigamonkeys.com/book/style.css new file mode 100644 index 00000000..b2e0c8fd --- /dev/null +++ b/clones/gigamonkeys.com/book/style.css @@ -0,0 +1,106 @@ +body { + width: 700px; + margin: .5in auto; + font-size: 18px; + font-family: serif; +} + +p { line-height: 1.5; } +sup { font-size: 9pt; } +blockquote { line-height: 1.5; font-size: 90%; } +h1, h2, h3, h4, h5, h6 { font-family: Helvetica; } +li { padding-top: 6pt; } +dt { font-weight: bold; font-family: monospace; padding-top: 12pt; padding-bottom: 3pt; } +div.notes { font-size: 10pt; } +.shaded { background: #dddddd; } +pre { margin-left: .25in; font-size: 14px; } + +div.table-caption +{ + font-family: sans-serif; + font-style: italic; + font-size: 9pt; +} + +div.figure-caption +{ + font-family: sans-serif; + font-style: italic; + font-size: 9pt; +} + +table.book-table +{ + margin: 12pt auto; + border: thin dotted black; + width: 80%; +} +.book-table td { + padding: 2pt; + font-size: 80%; + border-bottom: thin dotted black; +} + +div.summary { + font-size: 12pt; + font-family: sans-serif; + font-style: italic; + padding-top: 6pt; +} +div.copyright { + font-size: 10pt; + font-family: serif; + font-style: italic; + text-align: right; + padding-top: 24pt; + clear: both; +} + +code { white-space: nowrap; } + +span.annotation { + display: none; +} + +span.review { + display: none; +} + + +img.figure { + display: block; + margin: auto; +} + +div.summary-float { + float: right; + width: .75in; + margin-right: -1in; + font-size: 8pt; + font-family: sans-serif; + font-style: italic; + color:#ff0000; +} + +div.sidebarhead { + font-size: 10pt; + font-weight: bold; + text-align: center; + font-family: sans-serif; + border: solid thin black; + background-color: #xff0000; + padding: 1em; + margin: 0in .5in; +} + +div.sidebar { + font-size: 9pt; + font-family: sans-serif; + border: solid thin black; + padding: 1em; + margin: 0in .5in; +} + +img.floater { float: left; margin: 0pt 12pt 0pt 6pt; } + +ol.toc li { margin-top: 0.5em; } diff --git a/clones/gigamonkeys.com/book/syntax-and-semantics.html b/clones/gigamonkeys.com/book/syntax-and-semantics.html new file mode 100644 index 00000000..68c06c63 --- /dev/null +++ b/clones/gigamonkeys.com/book/syntax-and-semantics.html @@ -0,0 +1,559 @@ +Syntax and Semantics

    4. Syntax and Semantics

    After that whirlwind tour, we'll settle down for a few chapters to +take a more systematic look at the features you've used so far. I'll +start with an overview of the basic elements of Lisp's syntax and +semantics, which means, of course, that I must first address that +burning question. . .

    What's with All the Parentheses?

    Lisp's syntax is quite a bit different from the syntax of languages +descended from Algol. The two most immediately obvious +characteristics are the extensive use of parentheses and prefix +notation. For whatever reason, a lot of folks are put off by this +syntax. Lisp's detractors tend to describe the syntax as "weird" and +"annoying." Lisp, they say, must stand for Lots of Irritating +Superfluous Parentheses. Lisp folks, on the other hand, tend to +consider Lisp's syntax one of its great virtues. How is it that +what's so off-putting to one group is a source of delight to another?

    I can't really make the complete case for Lisp's syntax until I've +explained Lisp's macros a bit more thoroughly, but I can start with +an historical tidbit that suggests it may be worth keeping an open +mind: when John McCarthy first invented Lisp, he intended to +implement a more Algol-like syntax, which he called +M-expressions. However, he never got around to it. He explained +why not in his article "History of +Lisp."1

    The project of defining M-expressions precisely and compiling them +or at least translating them into S-expressions was neither +finalized nor explicitly abandoned. It just receded into the +indefinite future, and a new generation of programmers appeared who +preferred [S-expressions] to any FORTRAN-like or ALGOL-like +notation that could be devised.

    In other words, the people who have actually used Lisp over the past +45 years have liked the syntax and have found that it makes the +language more powerful. In the next few chapters, you'll begin to see +why.

    Breaking Open the Black Box

    Before we look at the specifics of Lisp's syntax and semantics, it's +worth taking a moment to look at how they're defined and how this +differs from many other languages.

    In most programming languages, the language processor--whether an +interpreter or a compiler--operates as a black box: you shove a +sequence of characters representing the text of a program into the +black box, and it--depending on whether it's an interpreter or a +compiler--either executes the behaviors indicated or produces a +compiled version of the program that will execute the behaviors when +it's run.

    Inside the black box, of course, language processors are usually +divided into subsystems that are each responsible for one part of the +task of translating a program text into behavior or object code. A +typical division is to split the processor into three phases, each of +which feeds into the next: a lexical analyzer breaks up the stream of +characters into tokens and feeds them to a parser that builds a tree +representing the expressions in the program, according to the +language's grammar. This tree--called an abstract syntax tree--is +then fed to an evaluator that either interprets it directly or +compiles it into some other language such as machine code. Because +the language processor is a black box, the data structures used by +the processor, such as the tokens and abstract syntax trees, are of +interest only to the language implementer.

    In Common Lisp things are sliced up a bit differently, with +consequences for both the implementer and for how the language is +defined. Instead of a single black box that goes from text to program +behavior in one step, Common Lisp defines two black boxes, one +that translates text into Lisp objects and another that implements +the semantics of the language in terms of those objects. The first +box is called the reader, and the second is called the +evaluator.2

    Each black box defines one level of syntax. The reader defines how +strings of characters can be translated into Lisp objects called +s-expressions.3 Since the s-expression syntax includes syntax for lists +of arbitrary objects, including other lists, s-expressions can +represent arbitrary tree expressions, much like the abstract syntax +tree generated by the parsers for non-Lisp languages.

    The evaluator then defines a syntax of Lisp forms that can be +built out of s-expressions. Not all s-expressions are legal Lisp +forms any more than all sequences of characters are legal +s-expressions. For instance, both (foo 1 2) and ("foo" 1 +2) are s-expressions, but only the former can be a Lisp form since a +list that starts with a string has no meaning as a Lisp form.

    This split of the black box has a couple of consequences. One is that +you can use s-expressions, as you saw in Chapter 3, as an +externalizable data format for data other than source code, using +READ to read it and PRINT to print it.4 The other consequence is that since the semantics of the +language are defined in terms of trees of objects rather than strings +of characters, it's easier to generate code within the language than +it would be if you had to generate code as text. Generating code +completely from scratch is only marginally easier--building up lists +vs. building up strings is about the same amount of work. The real +win, however, is that you can generate code by manipulating existing +data. This is the basis for Lisp's macros, which I'll discuss in much +more detail in future chapters. For now I'll focus on the two levels +of syntax defined by Common Lisp: the syntax of s-expressions +understood by the reader and the syntax of Lisp forms understood by +the evaluator.

    S-expressions

    The basic elements of s-expressions are lists and atoms. +Lists are delimited by parentheses and can contain any number of +whitespace-separated elements. Atoms are everything else.5 The elements of lists are themselves s-expressions +(in other words, atoms or nested lists). Comments--which aren't, +technically speaking, s-expressions--start with a semicolon, extend +to the end of a line, and are treated essentially like whitespace.

    And that's pretty much it. Since lists are syntactically so trivial, +the only remaining syntactic rules you need to know are those +governing the form of different kinds of atoms. In this section I'll +describe the rules for the most commonly used kinds of atoms: +numbers, strings, and names. After that, I'll cover how s-expressions +composed of these elements can be evaluated as Lisp forms.

    Numbers are fairly straightforward: any sequence of digits--possibly +prefaced with a sign (+ or -), containing a decimal +point (.) or a solidus (/), or ending with an exponent +marker--is read as a number. For example:

    123       ; the integer one hundred twenty-three
    +3/7       ; the ratio three-sevenths
    +1.0       ; the floating-point number one in default precision
    +1.0e0     ; another way to write the same floating-point number
    +1.0d0     ; the floating-point number one in "double" precision
    +1.0e-4    ; the floating-point equivalent to one-ten-thousandth
    ++42       ; the integer forty-two
    +-42       ; the integer negative forty-two
    +-1/4      ; the ratio negative one-quarter
    +-2/8      ; another way to write negative one-quarter
    +246/2     ; another way to write the integer one hundred twenty-three

    These different forms represent different kinds of numbers: integers, +ratios, and floating point. Lisp also supports complex numbers, which +have their own notation and which I'll discuss in Chapter 10.

    As some of these examples suggest, you can notate the same number in +many ways. But regardless of how you write them, all +rationals--integers and ratios--are represented internally in +"simplified" form. In other words, the objects that represent -2/8 or +246/2 aren't distinct from the objects that represent -1/4 and 123. +Similarly, 1.0 and 1.0e0 are just different ways of +writing the same number. On the other hand, 1.0, 1.0d0, +and 1 can all denote different objects because the different +floating-point representations and integers are different types. +We'll save the details about the characteristics of different kinds +of numbers for Chapter 10.

    Strings literals, as you saw in the previous chapter, are enclosed in +double quotes. Within a string a backslash (\) escapes the +next character, causing it to be included in the string regardless of +what it is. The only two characters that must be escaped within a +string are double quotes and the backslash itself. All other +characters can be included in a string literal without escaping, +regardless of their meaning outside a string. Some example string +literals are as follows:

    "foo"     ; the string containing the characters f, o, and o.
    +"fo\o"    ; the same string
    +"fo\\o"   ; the string containing the characters f, o, \, and o.
    +"fo\"o"   ; the string containing the characters f, o, ", and o.

    Names used in Lisp programs, such as FORMAT and +hello-world, and *db* are represented by objects called +symbols. The reader knows nothing about how a given name is going +to be used--whether it's the name of a variable, a function, or +something else. It just reads a sequence of characters and builds an +object to represent the name.6 Almost any +character can appear in a name. Whitespace characters can't, though, +because the elements of lists are separated by whitespace. Digits can +appear in names as long as the name as a whole can't be interpreted +as a number. Similarly, names can contain periods, but the reader +can't read a name that consists only of periods. Ten characters that +serve other syntactic purposes can't appear in names: open and close +parentheses, double and single quotes, backtick, comma, colon, +semicolon, backslash, and vertical bar. And even those characters +can, if you're willing to escape them by preceding the character +to be escaped with a backslash or by surrounding the part of the name +containing characters that need escaping with vertical bars.

    Two important characteristics of the way the reader translates names +to symbol objects have to do with how it treats the case of letters +in names and how it ensures that the same name is always read as the +same symbol. While reading names, the reader converts all unescaped +characters in a name to their uppercase equivalents. Thus, the reader +will read foo, Foo, and FOO as the same symbol: +FOO. However, \f\o\o and |foo| will both be +read as foo, which is a different object than the symbol +FOO. This is why when you define a function at the REPL and it +prints the name of the function, it's been converted to uppercase. +Standard style, these days, is to write code in all lowercase and let +the reader change names to uppercase.7

    To ensure that the same textual name is always read as the same +symbol, the reader interns symbols--after it has read the name +and converted it to all uppercase, the reader looks in a table called +a package for an existing symbol with the same name. If it can't +find one, it creates a new symbol and adds it to the table. +Otherwise, it returns the symbol already in the table. Thus, anywhere +the same name appears in any s-expression, the same object will be +used to represent it.8

    Because names can contain many more characters in Lisp than they can +in Algol-derived languages, certain naming conventions are distinct +to Lisp, such as the use of hyphenated names like hello-world. +Another important convention is that global variables are given names +that start and end with *. Similarly, constants are given +names starting and ending in +. And some programmers will name +particularly low-level functions with names that start with % +or even %%. The names defined in the language standard use +only the alphabetic characters (A-Z) plus *, +, +-, /, 1, 2, <, =, >, +and &.

    The syntax for lists, numbers, strings, and symbols can describe a +good percentage of Lisp programs. Other rules describe notations for +literal vectors, individual characters, and arrays, which I'll cover +when I talk about the associated data types in Chapters 10 and 11. +For now the key thing to understand is how you can combine numbers, +strings, and symbols with parentheses-delimited lists to build +s-expressions representing arbitrary trees of objects. Some simple +examples look like this:

    x             ; the symbol X
    +()            ; the empty list
    +(1 2 3)       ; a list of three numbers
    +("foo" "bar") ; a list of two strings
    +(x y z)       ; a list of three symbols
    +(x 1 "foo")   ; a list of a symbol, a number, and a string
    +(+ (* 2 3) 4) ; a list of a symbol, a list, and a number.

    An only slightly more complex example is the following four-item list +that contains two symbols, the empty list, and another list, itself +containing two symbols and a string:

    (defun hello-world ()
    +  (format t "hello, world"))

    S-expressions As Lisp Forms

    After the reader has translated a bunch of text into s-expressions, +the s-expressions can then be evaluated as Lisp code. Or some of them +can--not every s-expressions that the reader can read can necessarily +be evaluated as Lisp code. Common Lisp's evaluation rule defines a +second level of syntax that determines which s-expressions can be +treated as Lisp forms.9 The syntactic rules at this level are quite +simple. Any atom--any nonlist or the empty list--is a legal Lisp form +as is any list that has a symbol as its first element.10

    Of course, the interesting thing about Lisp forms isn't their syntax +but how they're evaluated. For purposes of discussion, you can think +of the evaluator as a function that takes as an argument a +syntactically well-formed Lisp form and returns a value, which we can +call the value of the form. Of course, when the evaluator is a +compiler, this is a bit of a simplification--in that case, the +evaluator is given an expression and generates code that will compute +the appropriate value when it's run. But this simplification lets me +describe the semantics of Common Lisp in terms of how the different +kinds of Lisp forms are evaluated by this notional function.

    The simplest Lisp forms, atoms, can be divided into two categories: +symbols and everything else. A symbol, evaluated as a form, is +considered the name of a variable and evaluates to the current value +of the variable.11 I'll discuss in Chapter 6 how variables get +their values in the first place. You should also note that certain +"variables" are that old oxymoron of programming: "constant +variables." For instance, the symbol PI names a constant +variable whose value is the best possible floating-point +approximation to the mathematical constant pi.

    All other atoms--numbers and strings are the kinds you've seen so +far--are self-evaluating objects. This means when such an +expression is passed to the notional evaluation function, it's simply +returned. You saw examples of self-evaluating objects in Chapter 2 +when you typed 10 and "hello, world" at the REPL.

    It's also possible for symbols to be self-evaluating in the sense +that the variables they name can be assigned the value of the symbol +itself. Two important constants that are defined this way are T +and NIL, the canonical true and false values. I'll discuss their +role as booleans in the section "Truth, Falsehood, and Equality."

    Another class of self-evaluating symbols are the keyword +symbols--symbols whose names start with :. When the reader +interns such a name, it automatically defines a constant variable +with the name and with the symbol as the value.

    Things get more interesting when we consider how lists are evaluated. +All legal list forms start with a symbol, but three kinds of list +forms are evaluated in three quite different ways. To determine what +kind of form a given list is, the evaluator must determine whether +the symbol that starts the list is the name of a function, a macro, +or a special operator. If the symbol hasn't been defined yet--as may +be the case if you're compiling code that contains references to +functions that will be defined later--it's assumed to be a function +name.12 I'll refer to the three kinds of forms as function call +forms, macro forms, and special forms.

    Function Calls

    The evaluation rule for function call forms is simple: evaluate the +remaining elements of the list as Lisp forms and pass the resulting +values to the named function. This rule obviously places some +additional syntactic constraints on a function call form: all the +elements of the list after the first must themselves be well-formed +Lisp forms. In other words, the basic syntax of a function call form +is as follows, where each of the arguments is itself a Lisp form:

    (function-name argument*)

    Thus, the following expression is evaluated by first evaluating +1, then evaluating 2, and then passing the resulting +values to the + function, which returns 3:

    (+ 1 2)

    A more complex expression such as the following is evaluated in +similar fashion except that evaluating the arguments (+ 1 2) +and (- 3 4) entails first evaluating their arguments and +applying the appropriate functions to them:

    (* (+ 1 2) (- 3 4))

    Eventually, the values 3 and -1 are passed to the * function, +which returns -3.

    As these examples show, functions are used for many of the things +that require special syntax in other languages. This helps keep +Lisp's syntax regular.

    Special Operators

    That said, not all operations can be defined as functions. Because +all the arguments to a function are evaluated before the function is +called, there's no way to write a function that behaves like the +IF operator you used in Chapter 3. To see why, consider this +form:

    (if x (format t "yes") (format t "no"))

    If IF were a function, the evaluator would evaluate the argument +expressions from left to right. The symbol x would be +evaluated as a variable yielding some value; then (format t +"yes") would be evaluated as a function call, yielding NIL +after printing "yes" to standard output. Then (format t "no") +would be evaluated, printing "no" and also yielding NIL. Only +after all three expressions were evaluated would the resulting values +be passed to IF, too late for it to control which of the two +FORMAT expressions gets evaluated.

    To solve this problem, Common Lisp defines a couple dozen so-called +special operators, IF being one, that do things that functions +can't do. There are 25 in all, but only a small handful are used +directly in day-to-day programming.13

    When the first element of a list is a symbol naming a special +operator, the rest of the expressions are evaluated according to the +rule for that operator.

    The rule for IF is pretty easy: evaluate the first expression. +If it evaluates to non-NIL, then evaluate the next expression +and return its value. Otherwise, return the value of evaluating the +third expression or NIL if the third expression is omitted. In +other words, the basic form of an IF expression is as follows:

    (if test-form then-form [ else-form ])

    The test-form will always be evaluated and then one or the other +of the then-form or else-form.

    An even simpler special operator is QUOTE, which takes a single +expression as its "argument" and simply returns it, unevaluated. For +instance, the following evaluates to the list (+ 1 2), not the +value 3:

    (quote (+ 1 2))

    There's nothing special about this list; you can manipulate it just +like any list you could create with the LIST +function.14

    QUOTE is used commonly enough that a special syntax for it is +built into the reader. Instead of writing the following:

    (quote (+ 1 2))

    you can write this:

    '(+ 1 2)

    This syntax is a small extension of the s-expression syntax +understood by the reader. From the point of view of the evaluator, +both those expressions will look the same: a list whose first element +is the symbol QUOTE and whose second element is the list +(+ 1 2).15

    In general, the special operators implement features of the language +that require some special processing by the evaluator. For instance, +several special operators manipulate the environment in which other +forms will be evaluated. One of these, which I'll discuss in detail +in Chapter 6, is LET, which is used to create new variable +bindings. The following form evaluates to 10 because the second +x is evaluated in an environment where it's the name of a +variable established by the LET with the value 10:

    (let ((x 10)) x)

    Macros

    While special operators extend the syntax of Common Lisp beyond what +can be expressed with just function calls, the set of special +operators is fixed by the language standard. Macros, on the other +hand, give users of the language a way to extend its syntax. As you +saw in Chapter 3, a macro is a function that takes s-expressions as +arguments and returns a Lisp form that's then evaluated in place of +the macro form. The evaluation of a macro form proceeds in two +phases: First, the elements of the macro form are passed, +unevaluated, to the macro function. Second, the form returned by the +macro function--called its expansion--is evaluated according to +the normal evaluation rules.

    It's important to keep the two phases of evaluating a macro form +clear in your mind. It's easy to lose track when you're typing +expressions at the REPL because the two phases happen one after +another and the value of the second phase is immediately returned. +But when Lisp code is compiled, the two phases happen at completely +different times, so it's important to keep clear what's happening +when. For instance, when you compile a whole file of source code with +the function COMPILE-FILE, all the macro forms in the file are +recursively expanded until the code consists of nothing but function +call forms and special forms. This macroless code is then compiled +into a FASL file that the LOAD function knows how to load. The +compiled code, however, isn't executed until the file is loaded. +Because macros generate their expansion at compile time, they can do +relatively large amounts of work generating their expansion without +having to pay for it when the file is loaded or the functions defined +in the file are called.

    Since the evaluator doesn't evaluate the elements of the macro form +before passing them to the macro function, they don't need to be +well-formed Lisp forms. Each macro assigns a meaning to the +s-expressions in the macro form by virtue of how it uses them to +generate its expansion. In other words, each macro defines its own +local syntax. For instance, the backwards macro from Chapter 3 +defines a syntax in which an expression is a legal backwards +form if it's a list that's the reverse of a legal Lisp form.

    I'll talk quite a bit more about macros throughout this book. For now +the important thing for you to realize is that macros--while +syntactically similar to function calls--serve quite a different +purpose, providing a hook into the compiler.16

    Truth, Falsehood, and Equality

    Two last bits of basic knowledge you need to get under your belt are +Common Lisp's notion of truth and falsehood and what it means for two +Lisp objects to be "equal." Truth and falsehood are--in this +realm--straightforward: the symbol NIL is the only false value, +and everything else is true. The symbol T is the canonical true +value and can be used when you need to return a non-NIL value +and don't have anything else handy. The only tricky thing about +NIL is that it's the only object that's both an atom and a list: +in addition to falsehood, it's also used to represent the empty +list.17 This equivalence between NIL and the empty list is +built into the reader: if the reader sees (), it reads it as +the symbol NIL. They're completely interchangeable. And because +NIL, as I mentioned previously, is the name of a constant +variable with the symbol NIL as its value, the expressions +nil, (), 'nil, and '() all evaluate to +the same thing--the unquoted forms are evaluated as a reference to +the constant variable whose value is the symbol NIL, but in the +quoted forms the QUOTE special operator evaluates to the symbol +directly. For the same reason, both t and 't will +evaluate to the same thing: the symbol T.

    Using phrases such as "the same thing" of course begs the question of +what it means for two values to be "the same." As you'll see in +future chapters, Common Lisp provides a number of type-specific +equality predicates: = is used to compare numbers, CHAR= to +compare characters, and so on. In this section I'll discuss the four +"generic" equality predicates--functions that can be passed any two +Lisp objects and will return true if they're equivalent and false +otherwise. They are, in order of discrimination, EQ, EQL, +EQUAL, and EQUALP.

    EQ tests for "object identity"--two objects are EQ if +they're identical. Unfortunately, the object identity of numbers and +characters depends on how those data types are implemented in a +particular Lisp. Thus, EQ may consider two numbers or two +characters with the same value to be equivalent, or it may not. +Implementations have enough leeway that the expression (eq 3 +3) can legally evaluate to either true or false. More to the point, +(eq x x) can evaluate to either true or false if the value of +x happens to be a number or character.

    Thus, you should never use EQ to compare values that may be +numbers or characters. It may seem to work in a predictable way for +certain values in a particular implementation, but you have no +guarantee that it will work the same way if you switch +implementations. And switching implementations may mean simply +upgrading your implementation to a new version--if your Lisp +implementer changes how they represent numbers or characters, the +behavior of EQ could very well change as well.

    Thus, Common Lisp defines EQL to behave like EQ except that +it also is guaranteed to consider two objects of the same class +representing the same numeric or character value to be equivalent. +Thus, (eql 1 1) is guaranteed to be true. And (eql 1 +1.0) is guaranteed to be false since the integer value 1 and the +floating-point value are instances of different classes.

    There are two schools of thought about when to use EQ and when +to use EQL: The "use EQ when possible" camp argues you +should use EQ when you know you aren't going to be com-paring +numbers or characters because (a) it's a way to indicate that you +aren't going to be comparing numbers or characters and (b) it will be +marginally more efficient since EQ doesn't have to check whether +its arguments are numbers or characters.

    The "always use EQL" camp says you should never use EQ +because (a) the potential gain in clarity is lost because every time +someone reading your code--including you--sees an EQ, they have +to stop and check whether it's being used correctly (in other words, +that it's never going to be called upon to compare numbers or +characters) and (b) that the efficiency difference between EQ +and EQL is in the noise compared to real performance +bottlenecks.

    The code in this book is written in the "always use EQL" +style.18

    The other two equality predicates, EQUAL and EQUALP, are +general in the sense that they can operate on all types of objects, +but they're much less fundamental than EQ or EQL. They each +define a slightly less discriminating notion of equivalence than +EQL, allowing different objects to be considered equivalent. +There's nothing special about the particular notions of equivalence +these functions implement except that they've been found to be handy +by Lisp programmers in the past. If these predicates don't suit your +needs, you can always define your own predicate function that +compares different types of objects in the way you need.

    EQUAL loosens the discrimination of EQL to consider lists +equivalent if they have the same structure and contents, recursively, +according to EQUAL. EQUAL also considers strings equivalent +if they contain the same characters. It also defines a looser +definition of equivalence than EQL for bit vectors and +pathnames, two data types I'll discuss in future chapters. For all +other types, it falls back on EQL.

    EQUALP is similar to EQUAL except it's even less +discriminating. It considers two strings equivalent if they contain +the same characters, ignoring differences in case. It also considers +two characters equivalent if they differ only in case. Numbers are +equivalent under EQUALP if they represent the same mathematical +value. Thus, (equalp 1 1.0) is true. Lists with EQUALP +elements are EQUALP; likewise, arrays with EQUALP elements +are EQUALP. As with EQUAL, there are a few other data types +that I haven't covered yet for which EQUALP can consider two +objects equivalent that neither EQL nor EQUAL will. For all +other data types, EQUALP falls back on EQL.

    Formatting Lisp Code

    While code formatting is, strictly speaking, neither a syntactic nor +a semantic matter, proper formatting is important to reading and +writing code fluently and idiomatically. The key to formatting Lisp +code is to indent it properly. The indentation should reflect the +structure of the code so that you don't need to count parentheses to +see what goes with what. In general, each new level of nesting gets +indented a bit more, and, if line breaks are necessary, items at the +same level of nesting are lined up. Thus, a function call that needs +to be broken up across multiple lines might be written like this:

    (some-function arg-with-a-long-name
    +               another-arg-with-an-even-longer-name)

    Macro and special forms that implement control constructs are +typically indented a little differently: the "body" elements are +indented two spaces relative to the opening parenthesis of the form. +Thus:

    (defun print-list (list)
    +  (dolist (i list)
    +    (format t "item: ~a~%" i)))

    However, you don't need to worry too much about these rules because a +proper Lisp environment such as SLIME will take care of it for you. +In fact, one of the advantages of Lisp's regular syntax is that it's +fairly easy for software such as editors to know how to indent it. +Since the indentation is supposed to reflect the structure of the +code and the structure is marked by parentheses, it's easy to let the +editor indent your code for you.

    In SLIME, hitting Tab at the beginning of each line will cause it to +be indented appropriately, or you can re-indent a whole expression by +positioning the cursor on the opening parenthesis and typing +C-M-q. Or you can re-indent the whole body of a function from +anywhere within it by typing C-c M-q.

    Indeed, experienced Lisp programmers tend to rely on their editor +handling indenting automatically, not just to make their code look +nice but to detect typos: once you get used to how code is supposed +to be indented, a misplaced parenthesis will be instantly +recognizable by the weird indentation your editor gives you. For +example, suppose you were writing a function that was supposed to +look like this:

    (defun foo ()
    +  (if (test)
    +    (do-one-thing)
    +    (do-another-thing)))

    Now suppose you accidentally left off the closing parenthesis after +test. Because you don't bother counting parentheses, you quite +likely would have added an extra parenthesis at the end of the +DEFUN form, giving you this code:

    (defun foo ()
    +  (if (test
    +    (do-one-thing)
    +    (do-another-thing))))

    However, if you had been indenting by hitting Tab at the beginning of +each line, you wouldn't have code like that. Instead you'd have this:

    (defun foo ()
    +  (if (test
    +       (do-one-thing)
    +       (do-another-thing))))

    Seeing the then and else clauses indented way out under the condition +rather than just indented slightly relative to the IF shows you +immediately that something is awry.

    Another important formatting rule is that closing parentheses are +always put on the same line as the last element of the list they're +closing. That is, don't write this:

    (defun foo ()
    +  (dotimes (i 10)
    +    (format t "~d. hello~%" i)
    +  )
    +)

    but instead write this:

    (defun foo ()
    +  (dotimes (i 10)
    +    (format t "~d. hello~%" i)))

    The string of )))s at the end may seem forbidding, but as long +your code is properly indented the parentheses should fade away--no +need to give them undue prominence by spreading them across several +lines.

    Finally, comments should be prefaced with one to four semicolons +depending on the scope of the comment as follows:

    ;;;; Four semicolons are used for a file header comment.
    +
    +;;; A comment with three semicolons will usually be a paragraph
    +;;; comment that applies to a large section of code that follows,
    +
    +(defun foo (x)
    +  (dotimes (i x)
    +    ;; Two semicolons indicate this comment applies to the code
    +    ;; that follows. Note that this comment is indented the same
    +    ;; as the code that follows.
    +    (some-function-call)
    +    (another i)              ; this comment applies to this line only
    +    (and-another)            ; and this is for this line
    +    (baz)))

    Now you're ready to start looking in greater detail at the major +building blocks of Lisp programs, functions, variables, and macros. +Up next: functions. +


    1http://www-formal.stanford.edu/jmc/history/lisp/node3.html

    2Lisp implementers, like implementers of any +language, have many ways they can implement an evaluator, ranging +from a "pure" interpreter that interprets the objects given to the +evaluator directly to a compiler that translates the objects into +machine code that it then runs. In the middle are implementations +that compile the input into an intermediate form such as bytecodes +for a virtual machine and then interprets the bytecodes. Most Common +Lisp implementations these days use some form of compilation even +when evaluating code at run time.

    3Sometimes the phrase s-expression refers +to the textual representation and sometimes to the objects that +result from reading the textual representation. Usually either it's +clear from context which is meant or the distinction isn't that +important.

    4Not all Lisp +objects can be written out in a way that can be read back in. But +anything you can READ can be printed back out "readably" with +PRINT.

    5The +empty list, (), which can also be written NIL, is both an +atom and a list.

    6In fact, as you'll see later, +names aren't intrinsically tied to any one kind of thing. You can use +the same name, depending on context, to refer to both a variable and +a function, not to mention several other possibilities.

    7The case-converting +behavior of the reader can, in fact, be customized, but understanding +when and how to change it requires a much deeper discussion of the +relation between names, symbols, and other program elements than I'm +ready to get into just yet.

    8I'll discuss the relation between symbols +and packages in more detail in Chapter 21.

    9Of course, other levels of correctness +exist in Lisp, as in other languages. For instance, the s-expression +that results from reading (foo 1 2) is syntactically +well-formed but can be evaluated only if foo is the name of a +function or macro.

    10One other +rarely used kind of Lisp form is a list whose first element is a +lambda form. I'll discuss this kind of form in Chapter 5.

    11One other possibility exists--it's possible to +define symbol macros that are evaluated slightly differently. We +won't worry about them.

    12In Common Lisp a symbol can name both an +operator--function, macro, or special operator--and a variable. This +is one of the major differences between Common Lisp and Scheme. The +difference is sometimes described as Common Lisp being a Lisp-2 vs. +Scheme being a Lisp-1--a Lisp-2 has two namespaces, one for operators +and one for variables, but a Lisp-1 uses a single namespace. Both +choices have advantages, and partisans can debate endlessly which is +better.

    13The others provide useful, +but somewhat esoteric, features. I'll discuss them as the features +they support come up.

    14Well, one difference exists--literal objects such as +quoted lists, but also including double-quoted strings, literal +arrays, and vectors (whose syntax you'll see later), must not be +modified. Consequently, any lists you plan to manipulate you should +create with LIST.

    15This syntax is an example of a reader macro. +Reader macros modify the syntax the reader uses to translate text +into Lisp objects. It is, in fact, possible to define your own reader +macros, but that's a rarely used facility of the language. When most +Lispers talk about "extending the syntax" of the language, they're +talking about regular macros, as I'll discuss in a moment.

    16People without +experience using Lisp's macros or, worse yet, bearing the scars of C +preprocessor-inflicted wounds, tend to get nervous when they realize +that macro calls look like regular function calls. This turns out not +to be a problem in practice for several reasons. One is that macro +forms are usually formatted differently than function calls. For +instance, you write the following:

    (dolist (x foo)
    +  (print x))

    rather than this:

    (dolist (x foo) (print x))

    or

    (dolist (x foo)
    +       (print x))

    the way you would if DOLIST was a function. A good Lisp +environment will automatically format macro calls correctly, even for +user-defined macros.

    And even if a DOLIST form was written on a single line, there are +several clues that it's a macro: For one, the expression (x +foo) is meaningful by itself only if x is the name of a +function or macro. Combine that with the later occurrence of x +as a variable, and it's pretty suggestive that DOLIST is a macro +that's creating a binding for a variable named x. Naming +conventions also help--looping constructs, which are invariably +macros--are frequently given names starting with do.

    17Using the empty list as false is a reflection of Lisp's +heritage as a list-processing language much as the use of the integer +0 as false in C is a reflection of its heritage as a bit-twiddling +language. Not all Lisps handle boolean values the same way. Another +of the many subtle differences upon which a good Common Lisp vs. +Scheme flame war can rage for days is Scheme's use of a distinct +false value #f, which isn't the same value as either the +symbol nil or the empty list, which are also distinct from +each other.

    18Even the language standard is a bit ambivalent about which +of EQ or EQL should be preferred. Object identity is +defined by EQ, but the standard defines the phrase the +same when talking about objects to mean EQL unless another +predicate is explicitly mentioned. Thus, if you want to be 100 percent +technically correct, you can say that (- 3 2) and (- 4 +3) evaluate to "the same" object but not that they evaluate to +"identical" objects. This is, admittedly, a bit of an +angels-on-pinheads kind of issue.

    \ No newline at end of file diff --git a/clones/gigamonkeys.com/book/the-special-operators.html b/clones/gigamonkeys.com/book/the-special-operators.html new file mode 100644 index 00000000..709ce9c5 --- /dev/null +++ b/clones/gigamonkeys.com/book/the-special-operators.html @@ -0,0 +1,732 @@ +The Special Operators

    20. The Special Operators

    In a way, the most impressive aspect of the condition system covered +in the previous chapter is that if it wasn't already part of the +language, it could be written entirely as a user-level library. This +is possible because Common Lisp's special operators--while none +touches directly on signaling or handling conditions--provide enough +access to the underlying machinery of the language to be able to do +things such as control the unwinding of the stack.

    In previous chapters I've discussed the most frequently used special +operators, but it's worth being familiar with the others for two +reasons. First, some of the infrequently used special operators are +used infrequently simply because whatever need they address doesn't +arise that often. It's good to be familiar with these special +operators so when one of them is called for, you'll at least know it +exists. Second, because the 25 special operators--along with the +basic rule for evaluating function calls and the built-in data +types--provide the foundation for the rest of the language, a passing +familiarity with them will help you understand how the language +works.

    In this chapter, I'll discuss all the special operators, some briefly +and some at length, so you can see how they fit together. I'll point +out which ones you can expect to use directly in your own code, which +ones serve as the basis for other constructs that you use all the +time, and which ones you'll rarely use directly but which can be +handy in macro-generated code.

    Controlling Evaluation

    The first category of special operators contains the three operators +that provide basic control over the evaluation of forms. They're +QUOTE, IF, and PROGN, and I've discussed them all +already. However, it's worth noting how each of these special +operators provides one fundamental kind of control over the +evaluation of one or more forms. QUOTE prevents evaluation +altogether and allows you to get at s-expressions as data. IF +provides the fundamental boolean choice operation from which all +other conditional execution constructs can be built.1 And +PROGN provides the ability to sequence a number of forms.

    Manipulating the Lexical Environment

    The largest class of special operators contains the operators that +manipulate and access the lexical environment. LET and +LET*, which I've already discussed, are examples of special +operators that manipulate the lexical environment since they can +introduce new lexical bindings for variables. Any construct, such as +a DO or DOTIMES, that binds lexical variables will have to +expand into a LET or LET*.2 The SETQ special operator is one that +accesses the lexical environment since it can be used to set +variables whose bindings were created by LET and LET*.

    Variables, however, aren't the only thing that can be named within a +lexical scope. While most functions are defined globally with +DEFUN, it's also possible to create local functions with the +special operators FLET and LABELS, local macros with +MACROLET, and a special kind of macro, called a symbol +macro, with SYMBOL-MACROLET.

    Much like LET allows you to introduce a lexical variable whose +scope is the body of the LET, FLET and LABELS let you +define a function that can be referred to only within the scope of +the FLET or LABELS form. These special operators are handy +when you need a local function that's a bit too complex to define +inline as a LAMBDA expression or that you need to use more than +once. Both have the same basic form, which looks like this:

    (flet (function-definition*)
    +  body-form*)

    and like this:

    (labels (function-definition*)
    +  body-form*)

    where each function-definition has the following form:

    (name (parameter*) form*)

    The difference between FLET and LABELS is that the names of +the functions defined with FLET can be used only in the body of +the FLET, while the names introduced by LABELS can be used +immediately, including in the bodies of the functions defined by the +LABELS. Thus, LABELS can define recursive functions, while +FLET can't. It might seem limiting that FLET can't be used +to define recursive functions, but Common Lisp provides both +FLET and LABELS because sometimes it's useful to be able to +write local functions that can call another function of the same +name, either a globally defined function or a local function from an +enclosing scope.

    Within the body of a FLET or LABELS, you can use the names +of the functions defined just like any other function, including with +the FUNCTION special operator. Since you can use FUNCTION +to get the function object representing a function defined with +FLET or LABELS, and since a FLET or LABELS can be +in the scope of other binding forms such as LETs, these +functions can be closures.

    Because the local functions can refer to variables from the enclosing +scope, they can often be written to take fewer parameters than the +equivalent helper functions. This is particularly handy when you need +to pass a function that takes a single argument as a functional +parameter. For example, in the following function, which you'll see +again in Chapter 25, the FLETed function, count-version, +takes a single argument, as required by walk-directory, but +can also use the variable versions, introduced by the +enclosing LET:

    (defun count-versions (dir)
    +  (let ((versions (mapcar #'(lambda (x) (cons x 0)) '(2 3 4))))
    +    (flet ((count-version (file)
    +             (incf (cdr (assoc (major-version (read-id3 file)) versions)))))
    +      (walk-directory dir #'count-version :test #'mp3-p))
    +    versions))

    This function could also be written using an anonymous function in +the place of the FLETed count-version, but giving the +function a meaningful name makes it a bit easier to read.

    And when a helper function needs to recurse, an anonymous function +just won't do.3 When +you don't want to define a recursive helper function as a global +function, you can use LABELS. For example, the following +function, collect-leaves, uses the recursive helper function +walk to walk a tree and gather all the atoms in the tree into +a list, which collect-leaves then returns (after reversing +it):

    (defun collect-leaves (tree)
    +  (let ((leaves ()))
    +    (labels ((walk (tree)
    +               (cond
    +                 ((null tree))
    +                 ((atom tree) (push tree leaves))
    +                 (t (walk (car tree))
    +                    (walk (cdr tree))))))
    +      (walk tree))
    +    (nreverse leaves)))

    Notice again how, within the walk function, you can refer to +the variable, leaves, introduced by the enclosing LET.

    FLET and LABELS are also useful operations to use in macro +expansions--a macro can expand into code that contains a FLET or +LABELS to create functions that can be used within the body of +the macro. This technique can be used either to introduce functions +that the user of the macro will call or simply as a way of organizing +the code generated by the macro. This, for instance, is how a +function such as CALL-NEXT-METHOD, which can be used only within +a method definition, might be defined.

    A near relative to FLET and LABELS is the special operator +MACROLET, which you can use to define local macros. Local macros +work just like global macros defined with DEFMACRO except +without cluttering the global namespace. When a MACROLET form is +evaluated, the body forms are evaluated with the local macro +definitions in effect and possibly shadowing global function and +macro definitions or local definitions from enclosing forms. Like +FLET and LABELS, MACROLET can be used directly, but +it's also a handy target for macro-generated code--by wrapping some +user-supplied code in a MACROLET, a macro can provide constructs +that can be used only within that code or can shadow a globally +defined macro. You'll see an example of this latter use of +MACROLET in Chapter 31.

    Finally, one last macro-defining special operator is +SYMBOL-MACROLET, which defines a special kind of macro called, +appropriately enough, a symbol macro. Symbol macros are like +regular macros except they can't take arguments and are referred to +with a plain symbol rather than a list form. In other words, after +you've defined a symbol macro with a particular name, any use of that +symbol in a value position will be expanded and the resulting form +evaluated in its place. This is how macros such as WITH-SLOTS +and WITH-ACCESSORS are able to define "variables" that access +the state of a particular object under the covers. For instance, the +following WITH-SLOTS form:

    (with-slots (x y z) foo (list x y z)))

    might expand into this code that uses SYMBOL-MACROLET:

    (let ((#:g149 foo))
    +  (symbol-macrolet
    +      ((x (slot-value #:g149 'x))
    +       (y (slot-value #:g149 'y))
    +       (z (slot-value #:g149 'z)))
    +    (list x y z)))

    When the expression (list x y z) is evaluated, the symbols +x, y, and z will be replaced with their +expansions, such as (slot-value #:g149 'x).4

    Symbol macros are most often local, defined with +SYMBOL-MACROLET, but Common Lisp also provides a macro +DEFINE-SYMBOL-MACRO that defines a global symbol macro. A symbol +macro defined with SYMBOL-MACROLET shadows other symbol macros +of the same name defined with DEFINE-SYMBOL-MACRO or enclosing +SYMBOL-MACROLET forms.

    Local Flow of Control

    The next four special operators I'll discuss also create and use +names in the lexical environment but for the purposes of altering the +flow of control rather than defining new functions and macros. I've +mentioned all four of these special operators in passing because they +provide the underlying mechanisms used by other language features. +They're BLOCK, RETURN-FROM, TAGBODY, and GO. The +first two, BLOCK and RETURN-FROM, are used together to +write code that returns immediately from a section of code--I +discussed RETURN-FROM in Chapter 5 as a way to return +immediately from a function, but it's more general than that. The +other two, TAGBODY and GO, provide a quite low-level goto +construct that's the basis for all the higher-level looping +constructs you've already seen.

    The basic skeleton of a BLOCK form is this:

    (block name
    +  form*)

    The name is a symbol, and the forms are Lisp forms. The forms +are evaluated in order, and the value of the last form is returned as +the value of the BLOCK unless a RETURN-FROM is used to +return from the block early. A RETURN-FROM form, as you saw in +Chapter 5, consists of the name of the block to return from and, +optionally, a form that provides a value to return. When a +RETURN-FROM is evaluated, it causes the named BLOCK to +return immediately. If RETURN-FROM is called with a return value +form, the BLOCK will return the resulting value; otherwise, the +BLOCK evaluates to NIL.

    A BLOCK name can be any symbol, which includes NIL. Many of +the standard control construct macros, such as DO, DOTIMES, +and DOLIST, generate an expansion consisting of a BLOCK +named NIL. This allows you to use the RETURN macro, which +is a bit of syntactic sugar for (return-from nil ...), to +break out of such loops. Thus, the following loop will print at most +ten random numbers, stopping as soon as it gets a number greater than +50:

    (dotimes (i 10)
    +  (let ((answer (random 100)))
    +    (print answer)
    +    (if (> answer 50) (return))))

    Function-defining macros such as DEFUN, FLET, and +LABELS, on the other hand, wrap their bodies in a BLOCK +with the same name as the function. That's why you can use +RETURN-FROM to return from a function.

    TAGBODY and GO have a similar relationship to each other as +BLOCK and RETURN-FROM: a TAGBODY form defines a +context in which names are defined that can be used by GO. The +skeleton of a TAGBODY is as follows:

    (tagbody
    +  tag-or-compound-form*)

    where each tag-or-compound-form is either a symbol, called a +tag, or a nonempty list form. The list forms are evaluated in +order and the tags ignored, except as I'll discuss in a moment. After +the last form of the TAGBODY is evaluated, the TAGBODY +returns NIL. Anywhere within the lexical scope of the +TAGBODY you can use the GO special operator to jump +immediately to any of the tags, and evaluation will resume with the +form following the tag. For instance, you can write a trivial +infinite loop with TAGBODY and GO like this:

    (tagbody
    + top
    +   (print 'hello)
    +   (go top))

    Note that while the tag names must appear at the top level of the +TAGBODY, not nested within other forms, the GO special +operator can appear anywhere within the scope of the TAGBODY. +This means you could write a loop that loops a random number of times +like this:

    (tagbody
    + top
    +   (print 'hello)
    +   (when (plusp (random 10)) (go top)))

    An even sillier example of TAGBODY, which shows you can have +multiple tags in a single TAGBODY, looks like this:

    (tagbody
    + a (print 'a) (if (zerop (random 2)) (go c))
    + b (print 'b) (if (zerop (random 2)) (go a))
    + c (print 'c) (if (zerop (random 2)) (go b)))

    This form will jump around randomly printing as, bs, and +cs until eventually the last RANDOM expression returns 1 and +the control falls off the end of the TAGBODY.

    TAGBODY is rarely used directly since it's almost always easier +to write iterative constructs in terms of the existing looping +macros. It's handy, however, for translating algorithms written in +other languages into Common Lisp, either automatically or manually. +An example of an automatic translation tool is the FORTRAN-to-Common +Lisp translator, f2cl, that translates FORTRAN source code into +Common Lisp in order to make various FORTRAN libraries available to +Common Lisp programmers. Since many FORTRAN libraries were written +before the structured programming revolution, they're full of gotos. +The f2cl compiler can simply translate those gotos to GOs within +appropriate TAGBODYs.5

    Similarly, TAGBODY and GO can be handy when translating +algorithms described in prose or by flowcharts--for instance, in +Donald Knuth's classic series The Art of Computer Programming, he +describes algorithms using a "recipe" format: step 1, do this; step +2, do that; step 3, go back to step 2; and so on. For example, on +page 142 of The Art of Computer Programming, Volume 2: +Seminumerical Algorithms, Third Edition (Addison-Wesley, 1998), he +describes Algorithm S, which you'll use in Chapter 27, in this form:

    Algorithm S (Selection sampling technique). To select n records at +random from a set of N, where 0 < n <= N.
    S1. [Initialize.] Set t <-- 0, m <-- 0. (During this algorithm, m +represents the number of records selected so far, and t is the total +number of input records that we have dealt with.)
    S2. [Generate U.] Generate a random number U, uniformly distributed +between zero and one.
    S3. [Test.] If (N - t)U >= n - m, go to step S5.
    S4. [Select.] Select the next record for the sample, and increase m +and t by 1. If m < n, go to step S2; otherwise the sample is +complete and the algorithm terminates.
    S5. [Skip.] Skip the next record (do not include it in the sample), +increase t by 1, and go back to step S2.

    This description can be easily translated into a Common Lisp +function, after renaming a few variables, as follows:

    (defun algorithm-s (n max) ; max is N in Knuth's algorithm
    +  (let (seen               ; t in Knuth's algorithm
    +        selected           ; m in Knuth's algorithm
    +        u                  ; U in Knuth's algorithm
    +        (records ()))      ; the list where we save the records selected
    +    (tagbody
    +     s1
    +       (setf seen 0)
    +       (setf selected 0)
    +     s2
    +       (setf u (random 1.0))
    +     s3
    +       (when (>= (* (- max seen) u) (- n selected)) (go s5))
    +     s4
    +       (push seen records)
    +       (incf selected)
    +       (incf seen)
    +       (if (< selected n)
    +           (go s2)
    +           (return-from algorithm-s (nreverse records)))
    +     s5
    +       (incf seen)
    +       (go s2))))

    It's not the prettiest code, but it's easy to verify that it's a +faithful translation of Knuth's algorithm. But, this code, unlike +Knuth's prose description, can be run and tested. Then you can start +refactoring, checking after each change that the function still +works.6

    After pushing the pieces around a bit, you might end up with something +like this:

    (defun algorithm-s (n max)
    +  (loop for seen from 0
    +     when (< (* (- max seen) (random 1.0)) n)
    +     collect seen and do (decf n)
    +     until (zerop n)))

    While it may not be immediately obvious that this code correctly +implements Algorithm S, if you got here via a series of functions +that all behave identically to the original literal translation of +Knuth's recipe, you'd have good reason to believe it's correct.

    Unwinding the Stack

    Another aspect of the language that special operators give you +control over is the behavior of the call stack. For instance, while +you normally use BLOCK and TAGBODY to manage the flow of +control within a single function, you can also use them, in +conjunction with closures, to force an immediate nonlocal return from +a function further down on the stack. That's because BLOCK names +and TAGBODY tags can be closed over by any code within the +lexical scope of the BLOCK or TAGBODY. For example, +consider this function:

    (defun foo ()
    +  (format t "Entering foo~%")
    +  (block a
    +    (format t " Entering BLOCK~%")
    +    (bar #'(lambda () (return-from a)))
    +    (format t " Leaving BLOCK~%"))
    +  (format t "Leaving foo~%"))

    The anonymous function passed to bar uses RETURN-FROM to +return from the BLOCK. But that RETURN-FROM doesn't get +evaluated until the anonymous function is invoked with FUNCALL +or APPLY. Now suppose bar looks like this:

    (defun bar (fn)
    +  (format t "  Entering bar~%")
    +  (baz fn)
    +  (format t "  Leaving bar~%"))

    Still, the anonymous function isn't invoked. Now look at baz.

    (defun baz (fn)
    +  (format t "   Entering baz~%")
    +  (funcall fn)
    +  (format t "   Leaving baz~%"))

    Finally the function is invoked. But what does it mean to +RETURN-FROM a block that's several layers up on the call stack? +Turns out it works fine--the stack is unwound back to the frame where +the BLOCK was established and control returns from the +BLOCK. The FORMAT expressions in foo, bar, +and baz show this:

    CL-USER> (foo)
    +Entering foo
    + Entering BLOCK
    +  Entering bar
    +   Entering baz
    +Leaving foo
    +NIL

    Note that the only "Leaving . . ." message that prints is the one +that appears after the BLOCK in foo.

    Because the names of blocks are lexically scoped, a RETURN-FROM +always returns from the smallest enclosing BLOCK in the lexical +environment where the RETURN-FROM form appears even if the +RETURN-FROM is executed in a different dynamic context. For +instance, bar could also contain a BLOCK named a, +like this:

    (defun bar (fn)
    +  (format t "  Entering bar~%")
    +  (block a (baz fn))
    +  (format t "  Leaving bar~%"))

    This extra BLOCK won't change the behavior of foo at +all--the name a is resolved lexically, at compile time, not +dynamically, so the intervening block has no effect on the +RETURN-FROM. Conversely, the name of a BLOCK can be used +only by RETURN-FROMs appearing within the lexical scope of the +BLOCK; there's no way for code outside the block to return from +the block except by invoking a closure that closes over a +RETURN-FROM from the lexical scope of the BLOCK.

    TAGBODY and GO work the same way, in this regard, as +BLOCK and RETURN-FROM. When you invoke a closure that +contains a GO form, if the GO is evaluated, the stack will +unwind back to the appropriate TAGBODY and then jump to the +specified tag.

    BLOCK names and TAGBODY tags, however, differ from lexical +variable bindings in one important way. As I discussed in Chapter 6, +lexical bindings have indefinite extent, meaning the bindings can +stick around even after the binding form has returned. BLOCKs +and TAGBODYs, on the other hand, have dynamic extent--you can +RETURN-FROM a BLOCK or GO to a TAGBODY tag only +while the BLOCK or TAGBODY is on the call stack. In other +words, a closure that captures a block name or TAGBODY tag can +be passed down the stack to be invoked later, but it can't be +returned up the stack. If you invoke a closure that tries to +RETURN-FROM a BLOCK, after the BLOCK itself has +returned, you'll get an error. Likewise, trying to GO to a +TAGBODY that no longer exists will cause an error.7

    It's unlikely you'll need to use BLOCK and TAGBODY yourself +for this kind of stack unwinding. But you'll likely be using them +indirectly whenever you use the condition system, so understanding +how they work should help you understand better what exactly, for +instance, invoking a restart is doing.8

    CATCH and THROW are another pair of special operators that +can force the stack to unwind. You'll use these operators even less +often than the others mentioned so far--they're holdovers from +earlier Lisp dialects that didn't have Common Lisp's condition +system. They definitely shouldn't be confused with +try/catch and try/except constructs from +languages such as Java and Python.

    CATCH and THROW are the dynamic counterparts of BLOCK +and RETURN-FROM. That is, you wrap CATCH around a body of +code and then use THROW to cause the CATCH form to return +immediately with a specified value. The difference is that the +association between a CATCH and THROW is established +dynamically--instead of a lexically scoped name, the label for a +CATCH is an object, called a catch tag, and any THROW +evaluated within the dynamic extent of the CATCH that throws +that object will unwind the stack back to the CATCH form and +cause it to return immediately. Thus, you can write a version of the +foo, bar, and baz functions from before using +CATCH and THROW instead of BLOCK and RETURN-FROM +like this:

    (defparameter *obj* (cons nil nil)) ; i.e. some arbitrary object
    +
    +(defun foo ()
    +  (format t "Entering foo~%")
    +  (catch *obj*
    +    (format t " Entering CATCH~%")
    +    (bar)
    +    (format t " Leaving CATCH~%"))
    +  (format t "Leaving foo~%"))
    +
    +(defun bar ()
    +  (format t "  Entering bar~%")
    +  (baz)
    +  (format t "  Leaving bar~%"))
    +
    +(defun baz ()
    +  (format t "   Entering baz~%")
    +  (throw *obj* nil)
    +  (format t "   Leaving baz~%"))

    Notice how it isn't necessary to pass a closure down the +stack--baz can call THROW directly. The result is quite +similar to the earlier version.

    CL-USER> (foo)
    +Entering foo
    + Entering CATCH
    +  Entering bar
    +   Entering baz
    +Leaving foo
    +NIL

    However, CATCH and THROW are almost too dynamic. In +both the CATCH and the THROW, the tag form is evaluated, +which means their values are both determined at runtime. Thus, if +some code in bar reassigned or rebound *obj*, the +THROW in baz wouldn't throw to the same CATCH. This +makes CATCH and THROW much harder to reason about than +BLOCK and RETURN-FROM. The only advantage, which the +version of foo, bar, and baz that use CATCH +and THROW demonstrates, is there's no need to pass down a +closure in order for low-level code to return from a CATCH--any +code that runs within the dynamic extent of a CATCH can cause it +to return by throwing the right object.

    In older Lisp dialects that didn't have anything like Common Lisp's +condition system, CATCH and THROW were used for error +handling. However, to keep them manageable, the catch tags were +usually just quoted symbols, so you could tell by looking at a +CATCH and a THROW whether they would hook up at runtime. In +Common Lisp you'll rarely have any call to use CATCH and +THROW since the condition system is so much more flexible.

    The last special operator related to controlling the stack is another +one I've mentioned in passing before--UNWIND-PROTECT. +UNWIND-PROTECT lets you control what happens as the stack +unwinds--to make sure that certain code always runs regardless of how +control leaves the scope of the UNWIND-PROTECT, whether by a +normal return, by a restart being invoked, or by any of the ways +discussed in this section.9 The +basic skeleton of UNWIND-PROTECT looks like this:

    (unwind-protect protected-form
    +  cleanup-form*)

    The single protected-form is evaluated, and then, regardless of +how it returns, the cleanup-forms are evaluated. If the +protected-form returns normally, then whatever it returns is +returned from the UNWIND-PROTECT after the cleanup forms run. +The cleanup forms are evaluated in the same dynamic environment as +the UNWIND-PROTECT, so the same dynamic variable bindings, +restarts, and condition handlers will be visible to code in cleanup +forms as were visible just before the UNWIND-PROTECT.

    You'll occasionally use UNWIND-PROTECT directly. More often +you'll use it as the basis for WITH- style macros, similar to +WITH-OPEN-FILE, that evaluate any number of body forms in a +context where they have access to some resource that needs to be +cleaned up after they're done, regardless of whether they return +normally or bail via a restart or other nonlocal exit. For example, +if you were writing a database library that defined functions +open-connection and close-connection, you might write a +macro like this:10

    (defmacro with-database-connection ((var &rest open-args) &body body)
    +  `(let ((,var (open-connection ,@open-args)))
    +    (unwind-protect (progn ,@body)
    +      (close-connection ,var))))

    which lets you write code like this:

    (with-database-connection (conn :host "foo" :user "scott" :password "tiger")
    +  (do-stuff conn)
    +  (do-more-stuff conn))

    and not have to worry about closing the database connection, since +the UNWIND-PROTECT will make sure it gets closed no matter what +happens in the body of the with-database-connection form.

    Multiple Values

    Another feature of Common Lisp that I've mentioned in passing--in +Chapter 11, when I discussed GETHASH--is the ability for a +single form to return multiple values. I'll discuss it in greater +detail now. It is, however, slightly misplaced in a chapter on +special operators since the ability to return multiple values isn't +provided by just one or two special operators but is deeply +integrated into the language. The operators you'll most often use +when dealing with multiple values are macros and functions, not +special operators. But it is the case that the basic ability to get +at multiple return values is provided by a special operator, +MULTIPLE-VALUE-CALL, upon which the more commonly used +MULTIPLE-VALUE-BIND macro is built.

    The key thing to understand about multiple values is that returning +multiple values is quite different from returning a list--if a form +returns multiple values, unless you do something specific to capture +the multiple values, all but the primary value will be silently +discarded. To see the distinction, consider the function +GETHASH, which returns two values: the value found in the hash +table and a boolean that's NIL when no value was found. If it +returned those two values in a list, every time you called +GETHASH you'd have to take apart the list to get at the actual +value, regardless of whether you cared about the second return value. +Suppose you have a hash table, *h*, that contains numeric +values. If GETHASH returned a list, you couldn't write something +like this:

    (+ (gethash 'a *h*) (gethash 'b *h*))

    because + expects its arguments to be numbers, not lists. But +because the multiple value mechanism silently discards the secondary +return value when it's not wanted, this form works fine.

    There are two aspects to using multiple values--returning multiple +values and getting at the nonprimary values returned by forms that +return multiple values. The starting points for returning multiple +values are the functions VALUES and VALUES-LIST. These are +regular functions, not special operators, so their arguments are +passed in the normal way. VALUES takes a variable number of +arguments and returns them as multiple values; VALUES-LIST takes +a single list and returns its elements as multiple values. In other +words:

    (values-list x) === (apply #'values x)

    The mechanism by which multiple values are returned is implementation +dependent just like the mechanism for passing arguments into +functions is. Almost all language constructs that return the value of +some subform will "pass through" multiple values, returning all the +values returned by the subform. Thus, a function that returns the +result of calling VALUES or VALUES-LIST will itself return +multiple values--and so will another function whose result comes from +calling the first function. And so on.11

    But when a form is evaluated in a value position, only the primary +value will be used, which is why the previous addition form works the +way you'd expect. The special operator MULTIPLE-VALUE-CALL +provides the mechanism for getting your hands on the multiple values +returned by a form. MULTIPLE-VALUE-CALL is similar to +FUNCALL except that while FUNCALL is a regular function +and, therefore, can see and pass on only the primary values passed to +it, MULTIPLE-VALUE-CALL passes, to the function returned by its +first subform, all the values returned by the remaining subforms.

    (funcall #'+ (values 1 2) (values 3 4))             ==> 4
    +(multiple-value-call #'+ (values 1 2) (values 3 4)) ==> 10

    However, it's fairly rare that you'll simply want to pass all the +values returned by a function onto another function. More likely, +you'll want to stash the multiple values in different variables and +then do something with them. The MULTIPLE-VALUE-BIND macro, which +you saw in Chapter 11, is the most frequently used operator for +accepting multiple return values. Its skeleton looks like this:

    (multiple-value-bind (variable*) values-form
    +  body-form*)

    The values-form is evaluated, and the multiple values it returns +are bound to the variables. Then the body-forms are evaluated +with those bindings in effect. Thus:

    (multiple-value-bind (x y) (values 1 2)
    +  (+ x y)) ==> 3

    Another macro, MULTIPLE-VALUE-LIST, is even simpler--it takes a +single form, evaluates it, and collects the resulting multiple values +into a list. In other words, it's the inverse of VALUES-LIST.

    CL-USER> (multiple-value-list (values 1 2))
    +(1 2)
    +CL-USER> (values-list (multiple-value-list (values 1 2)))
    +1
    +2

    However, if you find yourself using MULTIPLE-VALUE-LIST a lot, +it may be a sign that some function should be returning a list to +start with rather than multiple values.

    Finally, if you want to assign multiple values returned by a form to +existing variables, you can use VALUES as a SETFable place. +For example:

    CL-USER> (defparameter *x* nil)
    +*X*
    +CL-USER> (defparameter *y* nil)
    +*Y*
    +CL-USER> (setf (values *x* *y*) (floor (/ 57 34)))
    +1
    +23/34
    +CL-USER> *x*
    +1
    +CL-USER> *y*
    +23/34

    EVAL-WHEN

    A special operator you'll need to understand in order to write +certain kinds of macros is EVAL-WHEN. For some reason, Lisp +books often treat EVAL-WHEN as a wizards-only topic. But the +only prerequisite to understanding EVAL-WHEN is an understanding +of how the two functions LOAD and COMPILE-FILE interact. +And understanding EVAL-WHEN will be important as you start +writing certain kinds of more sophisticated macros, such as the ones +you'll write in Chapters 24 and 31.

    I've touched briefly on the relation between LOAD and +COMPILE-FILE in previous chapters, but it's worth reviewing +again here. The job of LOAD is to load a file and evaluate all +the top-level forms it contains. The job of COMPILE-FILE is to +compile a source file into a FASL file, which can then be loaded with +LOAD such that (load "foo.lisp") and (load +"foo.fasl") are essentially equivalent.

    Because LOAD evaluates each form before reading the next, the +side effects of evaluating forms earlier in the file can affect how +forms later in the form are read and evaluated. For instance, +evaluating an IN-PACKAGE form changes the value of +*PACKAGE*, which will affect the way subsequent forms are +read.12 Similarly, a DEFMACRO form early in a file can define a +macro that can then be used by code later in the file.13

    COMPILE-FILE, on the other hand, normally doesn't evaluate the +forms it's compiling; it's when the FASL is loaded that the forms--or +their compiled equivalents--will be evaluated. However, +COMPILE-FILE must evaluate some forms, such as IN-PACKAGE +and DEFMACRO forms, in order to keep the behavior of (load +"foo.lisp") and (load "foo.fasl") consistent.

    So how do macros such as IN-PACKAGE and DEFMACRO work when +processed by COMPILE-FILE? In some pre-Common Lisp versions of +Lisp, the file compiler simply knew it should evaluate certain macros +in addition to compiling them. Common Lisp avoided the need for such +kludges by borrowing the EVAL-WHEN special operator from Maclisp. +This operator, as its name suggests, allows you to control when +specific bits of code are evaluated. The skeleton of an EVAL-WHEN +form looks like this:

    (eval-when (situation*)
    +  body-form*)

    There are three possible situations--:compile-toplevel, +:load-toplevel, and :execute--and which ones you specify +controls when the body-forms will be evaluated. An EVAL-WHEN +with multiple situations is equivalent to several EVAL-WHEN +forms, one per situation, each with the same body code. To explain the +meaning of the three situations, I'll need to explain a bit about how +COMPILE-FILE, which is also referred to as the file compiler, +goes about compiling a file.

    To explain how COMPILE-FILE compiles EVAL-WHEN forms, I +need to introduce a distinction between compiling top-level forms +and compiling non-top-level forms. A top-level form is, roughly +speaking, one that will be compiled into code that will be run when +the FASL is loaded. Thus, all forms that appear directly at the top +level of a source file are compiled as top-level forms. Similarly, +any forms appearing directly in a top-level PROGN are compiled +as top-level forms since the PROGN itself doesn't do +anything--it just groups together its subforms, which will be run +when the FASL is loaded.14 Similarly, forms appearing +directly in a MACROLET or SYMBOL-MACROLET are compiled as +top-level forms because after the compiler has expanded the local +macros or symbol macros, there will be no remnant of the +MACROLET or SYMBOL-MACROLET in the compiled code. Finally, +the expansion of a top-level macro form will be compiled as a +top-level form.

    Thus, a DEFUN appearing at the top level of a source file is a +top-level form--the code that defines the function and associates it +with its name will run when the FASL is loaded--but the forms within +the body of the function, which won't run until the function is +called, aren't top-level forms. Most forms are compiled the same when +compiled as top-level and non-top-level forms, but the semantics of an +EVAL-WHEN depend on whether it's being compiled as a top- level +form, compiled as a non-top-level form, or simply evaluated, combined +with what situations are listed in its situation list.

    The situations :compile-toplevel and :load-toplevel +control the meaning of an EVAL-WHEN compiled as a top-level +form. When :compile-toplevel is present, the file compiler +will evaluate the subforms at compile time. When +:load-toplevel is present, it will compile the subforms as +top-level forms. If neither of these situations is present in a +top-level EVAL-WHEN, the compiler ignores it.

    When an EVAL-WHEN is compiled as a non-top-level form, it's +either compiled like a PROGN, if the :execute situation +is specified, or ignored. Similarly, an evaluated +EVAL-WHEN--which includes top-level EVAL-WHENs in a source +file processed by LOAD and EVAL-WHENs evaluated at compile +time because they appear as subforms of a top-level EVAL-WHEN +with the :compile-toplevel situation--is treated like a +PROGN if :execute is present and ignored otherwise.

    Thus, a macro such as IN-PACKAGE can have the necessary effect +at both compile time and when loading from source by expanding into +an EVAL-WHEN like the following:

    (eval-when (:compile-toplevel :load-toplevel :execute)
    +  (setf *package* (find-package "PACKAGE-NAME")))

    *PACKAGE* will be set at compile time because of the +:compile-toplevel situation, set when the FASL is loaded +because of :load-toplevel, and set when the source is loaded +because of the :execute.

    There are two ways you're most likely to use EVAL-WHEN. One is +if you want to write macros that need to save some information at +compile time to be used when generating the expansion of other macro +forms in the same file. This typically arises with definitional +macros where a definition early in a file can affect the code +generated for a definition later in the same file. You'll write this +kind of macro in Chapter 24.

    The other time you might need EVAL-WHEN is if you want to put +the definition of a macro and helper functions it uses in the same +file as code that uses the macro. DEFMACRO already includes an +EVAL-WHEN in its expansion so the macro definition is +immediately available to be used later in the file. But DEFUN +normally doesn't make function definitions available at compile time. +But if you use a macro in the same file as it's defined in, you need +the macro and any functions it uses to be defined. If you wrap +the DEFUNs of any helper functions used by the macro in an +EVAL-WHEN with :compile-toplevel, the definitions will be +available when the macro's expansion function runs. You'll probably +want to include :load-toplevel and :execute as well +since the macros will also need the function definitions after the +file is compiled and loaded or if you load the source instead of +compiling.

    Other Special Operators

    The four remaining special operators, LOCALLY, THE, +LOAD-TIME-VALUE, and PROGV, all allow you to get at parts +of the underlying language that can't be accessed any other way. +LOCALLY and THE are part of Common Lisp's declaration +system, which is used to communicate things to the compiler that don't +affect the meaning of your code but that may help the compiler +generate better code--faster, clearer error messages, and so +on.15 I'll +discuss declarations briefly in Chapter 32.

    The other two, LOAD-TIME-VALUE and PROGV, are infrequently +used, and explaining the reason why you might ever want to use +them would take longer than explaining what they do. So I'll just +tell you what they do so you know they're there. Someday you'll hit +on one of those rare times when they're just the thing, and then +you'll be ready.

    LOAD-TIME-VALUE is used, as its name suggests, to create a value +that's determined at load time. When the file compiler compiles code +that contains a LOAD-TIME-VALUE form, it arranges to evaluate +the first subform once, when the FASL is loaded, and for the code +containing the LOAD-TIME-VALUE form to refer to that value. In +other words, instead of writing this:

    (defvar *loaded-at* (get-universal-time))
    +
    +(defun when-loaded () *loaded-at*)

    you can write the following:

    (defun when-loaded () (load-time-value (get-universal-time)))

    In code not processed by COMPILE-FILE, LOAD-TIME-VALUE is +evaluated once when the code is compiled, which may be when you +explicitly compile a function with COMPILE or earlier because of +implicit compilation performed by the implementation in the course of +evaluating the code. In uncompiled code, LOAD-TIME-VALUE +evaluates its form each time it's evaluated.

    Finally, PROGV creates new dynamic bindings for variables whose +names are determined at runtime. This is mostly useful for +implementing embedded interpreters for languages with dynamically +scoped variables. The basic skeleton is as follows:

    (progv symbols-list values-list
    +  body-form*)

    where symbols-list is a form that evaluates to a list of symbols +and values-list is a form that evaluates to a list of values. +Each symbol is dynamically bound to the corresponding value, and then +the body-forms are evaluated. The difference between PROGV +and LET is that because symbols-list is evaluated at +runtime, the names of the variables to bind can be determined +dynamically. As I say, this isn't something you need to do often.

    And that's it for special operators. In the next chapter, I'll get +back to hard-nosed practical topics and show you how to use Common +Lisp's package system to take control of your namespaces so you can +write libraries and applications that can coexist without stomping on +each other's names. +


    1Of course, +if IF wasn't a special operator but some other conditional form, +such as COND, was, you could build IF as a macro. Indeed, +in many Lisp dialects, starting with McCarthy's original Lisp, +COND was the primitive conditional evaluation operator.

    2Well, technically those +constructs could also expand into a LAMBDA expression since, as +I mentioned in Chapter 6, LET could be defined--and was in some +earlier Lisps--as a macro that expands into an invocation of an +anonymous function.

    3Surprising as it may seem, it actually is +possible to make anonymous functions recurse. However, you must use a +rather esoteric mechanism known as the Y combinator. But the Y +combinator is an interesting theoretical result, not a practical +programming tool, so is well outside the scope of this book.

    4It's not +required that WITH-SLOTS be implemented with +SYMBOL-MACROLET--in some implementations, WITH-SLOTS may +walk the code provided and generate an expansion with x, +y, and z already replaced with the appropriate +SLOT-VALUE forms. You can see how your implementation does it by +evaluating this form:

    (macroexpand-1 '(with-slots (x y z) obj (list x y z)))

    However, walking the body is much easier for the Lisp implementation +to do than for user code; to replace x, y, and z +only when they appear in value positions requires a code walker that +understands the syntax of all special operators and that recursively +expands all macro forms in order to determine whether their expansions +include the symbols in value positions. The Lisp implementation +obviously has such a code walker at its disposal, but it's one of the +few parts of Lisp that's not exposed to users of the language.

    5One version of f2cl is available as +part of the Common Lisp Open Code Collection (CLOCC): +http://clocc.sourceforge.net/. By contrast, consider the +tricks the authors of f2j, a FORTRAN-to-Java translator, have to +play. Although the Java Virtual Machine (JVM) has a goto instruction, +it's not directly exposed in Java. So to compile FORTRAN gotos, they +first compile the FORTRAN code into legal Java source with calls to a +dummy class to represent the labels and gotos. Then they compile the +source with a regular Java compiler and postprocess the byte codes to +translate the dummy calls into JVM-level byte codes. Clever, but what +a pain.

    6Since this algorithm depends on values returned by +RANDOM, you may want to test it with a consistent random seed, +which you can get by binding *RANDOM-STATE* to the value of +(make-random-state nil) around each call to +algorithm-s. For instance, you can do a basic sanity check of +algorithm-s by evaluating this:

    (let ((*random-state* (make-random-state nil))) (algorithm-s 10 200))

    If your refactorings are all valid, this expression should evaluate to +the same list each time.

    7This is +a pretty reasonable restriction--it's not entirely clear what it'd +mean to return from a form that has already returned--unless, of +course, you're a Scheme programmer. Scheme supports +continuations, a language construct that makes it possible to +return from the same function call more than once. But for a variety +of reasons, few, if any, languages other than Scheme support this +kind of continuation.

    8If you're the kind of +person who likes to know how things work all the way down to the +bits, it may be instructive to think about how you might implement +the condition system's macros using BLOCK, TAGBODY, +closures, and dynamic variables.

    9UNWIND-PROTECT is essentially +equivalent to try/finally constructs in Java and Python.

    10And indeed, CLSQL, the multi-Lisp, +multidatabase SQL interface library, provides a similar macro called +with-database. CLSQL's home page is at +http://clsql.b9.com.

    11A small handful of macros +don't pass through extra return values of the forms they evaluate. In +particular, the PROG1 macro, which evaluates a number of forms +like a PROGN before returning the value of the first form, +returns that form's primary value only. Likewise, PROG2, which +returns the value of the second of its subforms, returns only the +primary value. The special operator MULTIPLE-VALUE-PROG1 is a +variant of PROG1 that returns all the values returned by the +first form. It's a minor wart that PROG1 doesn't already behave +like MULTIPLE-VALUE-PROG1, but neither is used often enough that +it matters much. The OR and COND macros are also not always +transparent to multiple values, returning only the primary value of +certain subforms.

    12The reason loading a file with an IN-PACKAGE form in +it has no effect on the value of *PACKAGE* after LOAD +returns is because LOAD binds *PACKAGE* to its current +value before doing anything else. In other words, something +equivalent to the following LET is wrapped around the rest of +the code in LOAD:

    (let ((*package* *package*)) ...)

    Any assignment to *PACKAGE* will be to the new binding, and the +old binding will be restored when LOAD returns. It also binds the +variable *READTABLE*, which I haven't discussed, in the same +way.

    13In some +implementations, you may be able to get away with evaluating +DEFUNs that use undefined macros in the function body as long as +the macros are defined before the function is actually called. But +that works, if at all, only when LOADing the definitions from +source, not when compiling with COMPILE-FILE, so in general macro +definitions must be evaluated before they're used.

    14By contrast, the subforms in a +top-level LET aren't compiled as top-level forms because they're +not run directly when the FASL is loaded. They will run, but it's in +the runtime context of the bindings established by the LET. +Theoretically, a LET that binds no variables could be treated +like a PROGN, but it's not--the forms appearing in a LET +are never treated as top-level forms.

    15The one declaration that has an effect on the semantics of a +program is the SPECIAL declaration mentioned in Chapter 6.

    \ No newline at end of file diff --git a/clones/gigamonkeys.com/book/they-called-it-lisp-for-a-reason-list-processing.html b/clones/gigamonkeys.com/book/they-called-it-lisp-for-a-reason-list-processing.html new file mode 100644 index 00000000..38913bb7 --- /dev/null +++ b/clones/gigamonkeys.com/book/they-called-it-lisp-for-a-reason-list-processing.html @@ -0,0 +1,453 @@ +They Called It LISP for a Reason: List Processing

    12. They Called It LISP for a Reason: List Processing

    Lists play an important role in Lisp--for reasons both historical and +practical. Historically, lists were Lisp's original composite data +type, though it has been decades since they were its only such +data type. These days, a Common Lisp programmer is as likely to use a +vector, a hash table, or a user-defined class or structure as to use a +list.

    Practically speaking, lists remain in the language because they're an +excellent solution to certain problems. One such problem--how to +represent code as data in order to support code-transforming and +code-generating macros--is particular to Lisp, which may explain why +other languages don't feel the lack of Lisp-style lists. More +generally, lists are an excellent data structure for representing any +kind of heterogeneous and/or hierarchical data. They're also quite +lightweight and support a functional style of programming that's +another important part of Lisp's heritage.

    Thus, you need to understand lists on their own terms; as you gain a +better understanding of how lists work, you'll be in a better +position to appreciate when you should and shouldn't use them.

    "There Is No List"

    Spoon Boy: Do not try and bend the list. That's impossible. +Instead . . . only try to realize the truth.
    Neo: What truth?
    Spoon Boy: There is no list.
    Neo: There is no list?
    Spoon Boy: Then you'll see that it is not the list that bends; +it is only yourself.1

    The key to understanding lists is to understand that they're largely +an illusion built on top of objects that are instances of a more +primitive data type. Those simpler objects are pairs of values called +cons cells, after the function CONS used to create them.

    CONS takes two arguments and returns a new cons cell containing +the two values.2 These values can be references to any kind of object. +Unless the second value is NIL or another cons cell, a cons is +printed as the two values in parentheses separated by a dot, a +so-called dotted pair.

    (cons 1 2) ==> (1 . 2)

    The two values in a cons cell are called the CAR and the +CDR after the names of the functions used to access them. At the +dawn of time, these names were mnemonic, at least to the folks +implementing the first Lisp on an IBM 704. But even then they were +just lifted from the assembly mnemonics used to implement the +operations. However, it's not all bad that these names are somewhat +meaningless--when considering individual cons cells, it's best to +think of them simply as an arbitrary pair of values without any +particular semantics. Thus:

    (car (cons 1 2)) ==> 1
    +(cdr (cons 1 2)) ==> 2

    Both CAR and CDR are also SETFable places--given an +existing cons cell, it's possible to assign a new value to either of +its values.3

    (defparameter *cons* (cons 1 2))
    +*cons*                 ==> (1 . 2)
    +(setf (car *cons*) 10) ==> 10
    +*cons*                 ==> (10 . 2)
    +(setf (cdr *cons*) 20) ==> 20
    +*cons*                 ==> (10 . 20)

    Because the values in a cons cell can be references to any kind of +object, you can build larger structures out of cons cells by linking +them together. Lists are built by linking together cons cells in a +chain. The elements of the list are held in the CARs of the cons +cells while the links to subsequent cons cells are held in the +CDRs. The last cell in the chain has a CDR of NIL, +which--as I mentioned in Chapter 4--represents the empty list as +well as the boolean value false.

    This arrangement is by no means unique to Lisp; it's called a +singly linked list. However, few languages outside the Lisp +family provide such extensive support for this humble data type.

    So when I say a particular value is a list, what I really mean is +it's either NIL or a reference to a cons cell. The CAR of +the cons cell is the first item of the list, and the CDR is a +reference to another list, that is, another cons cell or NIL, +containing the remaining elements. The Lisp printer understands this +convention and prints such chains of cons cells as parenthesized +lists rather than as dotted pairs.

    (cons 1 nil)                   ==> (1)
    +(cons 1 (cons 2 nil))          ==> (1 2)
    +(cons 1 (cons 2 (cons 3 nil))) ==> (1 2 3)

    When talking about structures built out of cons cells, a few diagrams +can be a big help. Box-and-arrow diagrams represent cons cells as a +pair of boxes like this:

    The box on the left represents the CAR, and the box on the right +is the CDR. The values stored in a particular cons cell are +either drawn in the appropriate box or represented by an arrow from +the box to a representation of the referenced value.4 For instance, the +list (1 2 3), which consists of three cons cells linked +together by their CDRs, would be diagrammed like this:

    However, most of the time you work with lists you won't have to deal +with individual cons cells--the functions that create and manipulate +lists take care of that for you. For example, the LIST function +builds a cons cells under the covers for you and links them together; +the following LIST expressions are equivalent to the previous +CONS expressions:

    (list 1)     ==> (1)
    +(list 1 2)   ==> (1 2)
    +(list 1 2 3) ==> (1 2 3)

    Similarly, when you're thinking in terms of lists, you don't have to +use the meaningless names CAR and CDR; FIRST and +REST are synonyms for CAR and CDR that you should use +when you're dealing with cons cells as lists.

    (defparameter *list* (list 1 2 3 4))
    +(first *list*)        ==> 1
    +(rest *list*)         ==> (2 3 4)
    +(first (rest *list*)) ==> 2

    Because cons cells can hold any kind of values, so can lists. And a +single list can hold objects of different types.

    (list "foo" (list 1 2) 10) ==> ("foo" (1 2) 10)

    The structure of that list would look like this:

    Because lists can have other lists as elements, you can also use them +to represent trees of arbitrary depth and complexity. As such, they +make excellent representations for any heterogeneous, hierarchical +data. Lisp-based XML processors, for instance, usually represent XML +documents internally as lists. Another obvious example of +tree-structured data is Lisp code itself. In Chapters 30 and 31 +you'll write an HTML generation library that uses lists of lists to +represent the HTML to be generated. I'll talk more next chapter about +using cons cells to represent other data structures.

    Common Lisp provides quite a large library of functions for +manipulating lists. In the sections "List-Manipulation Functions" and +"Mapping," you'll look at some of the more important of these +functions. However, they will be easier to understand in the context +of a few ideas borrowed from functional programming.

    Functional Programming and Lists

    The essence of functional programming is that programs are built +entirely of functions with no side effects that compute their results +based solely on the values of their arguments. The advantage of the +functional style is that it makes programs easier to understand. +Eliminating side effects eliminates almost all possibilities for +action at a distance. And since the result of a function is +determined only by the values of its arguments, its behavior is +easier to understand and test. For instance, when you see an +expression such as (+ 3 4), you know the result is uniquely +determined by the definition of the + function and the values +3 and 4. You don't have to worry about what may have +happened earlier in the execution of the program since there's +nothing that can change the result of evaluating that expression.

    Functions that deal with numbers are naturally functional since +numbers are immutable. A list, on the other hand, can be mutated, as +you've just seen, by SETFing the CARs and CDRs of the +cons cells that make up its backbone. However, lists can be treated +as a functional data type if you consider their value to be +determined by the elements they contain. Thus, any list of the form +(1 2 3 4) is functionally equivalent to any other list +containing those four values, regardless of what cons cells are +actually used to represent the list. And any function that takes a +list as an argument and returns a value based solely on the contents +of the list can likewise be considered functional. For instance, the +REVERSE sequence function, given the list (1 2 3 4), +always returns a list (4 3 2 1). Different calls to +REVERSE with functionally equivalent lists as the argument will +return functionally equivalent result lists. Another aspect of +functional programming, which I'll discuss in the section "Mapping," +is the use of higher-order functions: functions that treat other +functions as data, taking them as arguments or returning them as +results.

    Most of Common Lisp's list-manipulation functions are written in a +functional style. I'll discuss later how to mix functional and other +coding styles, but first you should understand a few subtleties of +the functional style as applied to lists.

    The reason most list functions are written functionally is it allows +them to return results that share cons cells with their arguments. To +take a concrete example, the function APPEND takes any number of +list arguments and returns a new list containing the elements of all +its arguments. For instance:

    (append (list 1 2) (list 3 4)) ==> (1 2 3 4)

    From a functional point of view, APPEND's job is to return the +list (1 2 3 4) without modifying any of the cons cells in the +lists (1 2) and (3 4). One obvious way to achieve that +goal is to create a completely new list consisting of four new cons +cells. However, that's more work than is necessary. Instead, +APPEND actually makes only two new cons cells to hold the values +1 and 2, linking them together and pointing the +CDR of the second cons cell at the head of the last argument, +the list (3 4). It then returns the cons cell containing the +1. None of the original cons cells has been modified, and the +result is indeed the list (1 2 3 4). The only wrinkle is that +the list returned by APPEND shares some cons cells with the list +(3 4). The resulting structure looks like this:

    In general, APPEND must copy all but its last argument, but it +can always return a result that shares structure with the last +argument.

    Other functions take similar advantage of lists' ability to share +structure. Some, like APPEND, are specified to always return +results that share structure in a particular way. Others are simply +allowed to return shared structure at the discretion of the +implementation.

    "Destructive" Operations

    If Common Lisp were a purely functional language, that would be the +end of the story. However, because it's possible to modify a cons +cell after it has been created by SETFing its CAR or +CDR, you need to think a bit about how side effects and +structure sharing mix.

    Because of Lisp's functional heritage, operations that modify +existing objects are called destructive--in functional +programming, changing an object's state "destroys" it since it no +longer represents the same value. However, using the same term to +describe all state-modifying operations leads to a certain amount of +confusion since there are two very different kinds of destructive +operations, for-side-effect operations and recycling +operations.5

    For-side-effect operations are those used specifically for their side +effects. All uses of SETF are destructive in this sense, as are +functions that use SETF under the covers to change the state of +an existing object such as VECTOR-PUSH or VECTOR-POP. But +it's a bit unfair to describe these operations as +destructive--they're not intended to be used in code written in a +functional style, so they shouldn't be described using functional +terminology. However, if you mix nonfunctional, for-side-effect +operations with functions that return structure-sharing results, then +you need to be careful not to inadvertently modify the shared +structure. For instance, consider these three definitions:

    (defparameter *list-1* (list 1 2))
    +(defparameter *list-2* (list 3 4))
    +(defparameter *list-3* (append *list-1* *list-2*))

    After evaluating these forms, you have three lists, but +*list-3* and *list-2* share structure just like the +lists in the previous diagram.

    *list-1*                  ==> (1 2)
    +*list-2*                  ==> (3 4)
    +*list-3*                  ==> (1 2 3 4)

    Now consider what happens when you modify *list-2*.

    (setf (first *list-2*) 0) ==> 0
    +*list-2*                  ==> (0 4)     ; as expected
    +*list-3*                  ==> (1 2 0 4) ; maybe not what you wanted

    The change to *list-2* also changes *list-3* because of +the shared structure: the first cons cell in *list-2* is also +the third cons cell in *list-3*. SETFing the FIRST +of *list-2* changes the value in the CAR of that cons +cell, affecting both lists.

    On the other hand, the other kind of destructive operations, +recycling operations, are intended to be used in functional code. +They use side effects only as an optimization. In particular, they +reuse certain cons cells from their arguments when building their +result. However, unlike functions such as APPEND that reuse cons +cells by including them, unmodified, in the list they return, +recycling functions reuse cons cells as raw material, modifying the +CAR and CDR as necessary to build the desired result. Thus, +recycling functions can be used safely only when the original lists +aren't going to be needed after the call to the recycling function.

    To see how a recycling function works, let's compare REVERSE, +the nondestructive function that returns a reversed version of a +sequence, to NREVERSE, a recycling version of the same function. +Because REVERSE doesn't modify its argument, it must allocate a +new cons cell for each element in the list being reversed. But +suppose you write something like this:

    (setf *list* (reverse *list*))

    By assigning the result of REVERSE back to *list*, you've +removed the reference to the original value of *list*. +Assuming the cons cells in the original list aren't referenced +anywhere else, they're now eligible to be garbage collected. However, +in many Lisp implementations it'd be more efficient to immediately +reuse the existing cons cells rather than allocating new ones and +letting the old ones become garbage.

    NREVERSE allows you to do exactly that. The N stands for +non-consing, meaning it doesn't need to allocate any new cons +cells. The exact side effects of NREVERSE are intentionally not +specified--it's allowed to modify any CAR or CDR of any +cons cell in the list--but a typical implementation might walk down +the list changing the CDR of each cons cell to point to the +previous cons cell, eventually returning the cons cell that was +previously the last cons cell in the old list and is now the head of +the reversed list. No new cons cells need to be allocated, and no +garbage is created.

    Most recycling functions, like NREVERSE, have nondestructive +counterparts that compute the same result. In general, the recycling +functions have names that are the same as their non-destructive +counterparts except with a leading N. However, not all do, +including several of the more commonly used recycling functions such +as NCONC, the recycling version of APPEND, and DELETE, +DELETE-IF, DELETE-IF-NOT, and DELETE-DUPLICATES, the +recycling versions of the REMOVE family of sequence functions.

    In general, you use recycling functions in the same way you use their +nondestructive counterparts except it's safe to use them only when +you know the arguments aren't going to be used after the function +returns. The side effects of most recycling functions aren't +specified tightly enough to be relied upon.

    However, the waters are further muddied by a handful of recycling +functions with specified side effects that can be relied upon. +They are NCONC, the recycling version of APPEND, and +NSUBSTITUTE and its -IF and -IF-NOT variants, the +recycling versions of the sequence functions SUBSTITUTE and +friends.

    Like APPEND, NCONC returns a concatenation of its list +arguments, but it builds its result in the following way: for each +nonempty list it's passed, NCONC sets the CDR of the list's +last cons cell to point to the first cons cell of the next nonempty +list. It then returns the first list, which is now the head of the +spliced-together result. Thus:

    (defparameter *x* (list 1 2 3))
    +
    +(nconc *x* (list 4 5 6)) ==> (1 2 3 4 5 6)
    +
    +*x* ==> (1 2 3 4 5 6)

    NSUBSTITUTE and variants can be relied on to walk down the list +structure of the list argument and to SETF the CARs of any +cons cells holding the old value to the new value and to otherwise +leave the list intact. It then returns the original list, which now +has the same value as would've been computed by SUBSTITUTE. +6

    The key thing to remember about NCONC and NSUBSTITUTE is +that they're the exceptions to the rule that you can't rely on the +side effects of recycling functions. It's perfectly acceptable--and +arguably good style--to ignore the reliability of their side effects +and use them, like any other recycling function, only for the value +they return.

    Combining Recycling with Shared Structure

    Although you can use recycling functions whenever the arguments to +the recycling function won't be used after the function call, it's +worth noting that each recycling function is a loaded gun pointed +footward: if you accidentally use a recycling function on an argument +that is used later, you're liable to lose some toes.

    To make matters worse, shared structure and recycling functions tend +to work at cross-purposes. Nondestructive list functions return +lists that share structure under the assumption that cons cells are +never modified, but recycling functions work by violating that +assumption. Or, put another way, sharing structure is based on the +premise that you don't care exactly what cons cells make up a list +while using recycling functions requires that you know exactly what +cons cells are referenced from where.

    In practice, recycling functions tend to be used in a few idiomatic +ways. By far the most common recycling idiom is to build up a list to +be returned from a function by "consing" onto the front of a list, +usually by PUSHing elements onto a list stored in a local +variable and then returning the result of NREVERSEing +it.7

    This is an efficient way to build a list because each PUSH has +to create only one cons cell and modify a local variable and the +NREVERSE just has to zip down the list reassigning the +CDRs. Because the list is created entirely within the function, +there's no danger any code outside the function has a reference to +any of its cons cells. Here's a function that uses this idiom to +build a list of the first n numbers, starting at zero:8

    (defun upto (max)
    +  (let ((result nil))
    +    (dotimes (i max)
    +      (push i result))
    +    (nreverse result)))
    +
    +(upto 10) ==> (0 1 2 3 4 5 6 7 8 9)

    The next most common recycling idiom9 is to +immediately reassign the value returned by the recycling function +back to the place containing the potentially recycled value. For +instance, you'll often see expressions like the following, using +DELETE, the recycling version of REMOVE:

    (setf foo (delete nil foo))

    This sets the value of foo to its old value except with all +the NILs removed. However, even this idiom must be used with +some care--if foo shares structure with lists referenced +elsewhere, using DELETE instead of REMOVE can destroy the +structure of those other lists. For example, consider the two lists +*list-2* and *list-3* from earlier that share their +last two cons cells.

    *list-2* ==> (0 4)
    +*list-3* ==> (1 2 0 4)

    You can delete 4 from *list-3* like this:

    (setf *list-3* (delete 4 *list-3*)) ==> (1 2 0)

    However, DELETE will likely perform the necessary deletion by +setting the CDR of the third cons cell to NIL, +disconnecting the fourth cons cell, the one holding the 4, +from the list. Because the third cons cell of *list-3* is also +the first cons cell in *list-2*, the following modifies +*list-2* as well:

    *list-2* ==> (0)

    If you had used REMOVE instead of DELETE, it would've built +a list containing the values 1, 2, and 0, +creating new cons cells as necessary rather than modifying any of the +cons cells in *list-3*. In that case, *list-2* wouldn't +have been affected.

    The PUSH/NREVERSE and SETF/DELETE idioms probably +account for 80 percent of the uses of recycling functions. Other uses +are possible but require keeping careful track of which functions +return shared structure and which do not.

    In general, when manipulating lists, it's best to write your own code +in a functional style--your functions should depend only on the +contents of their list arguments and shouldn't modify them. Following +that rule will, of course, rule out using any destructive functions, +recycling or otherwise. Once you have your code working, if profiling +shows you need to optimize, you can replace nondestructive list +operations with their recycling counterparts but only if you're +certain the argument lists aren't referenced from anywhere else.

    One last gotcha to watch out for is that the sorting functions +SORT, STABLE-SORT, and MERGE mentioned in Chapter 11 +are also recycling functions when applied to lists.10 However, these functions don't have nondestructive +counterparts, so if you need to sort a list without destroying it, +you need to pass the sorting function a copy made with +COPY-LIST. In either case you need to be sure to save the result +of the sorting function because the original argument is likely to be +in tatters. For instance:

    CL-USER> (defparameter *list* (list 4 3 2 1))
    +*LIST*
    +CL-USER> (sort *list* #'<)
    +(1 2 3 4)                      ; looks good
    +CL-USER> *list*
    +(4)                            ; whoops!

    List-Manipulation Functions

    With that background out of the way, you're ready to look at the +library of functions Common Lisp provides for manipulating lists.

    You've already seen the basic functions for getting at the elements +of a list: FIRST and REST. Although you can get at any +element of a list by combining enough calls to REST (to move +down the list) with a FIRST (to extract the element), that can +be a bit tedious. So Common Lisp provides functions named for the +other ordinals from SECOND to TENTH that return the +appropriate element. More generally, the function NTH takes two +arguments, an index and a list, and returns the nth (zero-based) +element of the list. Similarly, NTHCDR takes an index and a list +and returns the result of calling CDR n times. (Thus, +(nthcdr 0 ...) simply returns the original list, and +(nthcdr 1 ...) is equivalent to REST.) Note, however, +that none of these functions is any more efficient, in terms of work +done by the computer, than the equivalent combinations of FIRSTs +and RESTs--there's no way to get to the nth element of a +list without following n CDR references.11

    The 28 composite CAR/CDR functions are another family of +functions you may see used from time to time. Each function is named +by placing a sequence of up to four As and Ds between a +C and R, with each A representing a call to +CAR and each D a call to CDR. Thus:

    (caar list) === (car (car list))
    +(cadr list) === (car (cdr list))
    +(cadadr list) === (car (cdr (car (cdr list))))

    Note, however, that many of these functions make sense only when +applied to lists that contain other lists. For instance, CAAR +extracts the CAR of the CAR of the list it's given; thus, +the list it's passed must contain another list as its first element. +In other words, these are really functions on trees rather than +lists:

    (caar (list 1 2 3))                  ==> error
    +(caar (list (list 1 2) 3))           ==> 1
    +(cadr (list (list 1 2) (list 3 4)))  ==> (3 4)
    +(caadr (list (list 1 2) (list 3 4))) ==> 3

    These functions aren't used as often now as in the old days. And even +the most die-hard old-school Lisp hackers tend to avoid the longer +combinations. However, they're used quite a bit in older Lisp code, +so it's worth at least understanding how they work.12

    The FIRST-TENTH and CAR, CADR, and so on, +functions can also be used as SETFable places if you're using +lists nonfunctionally.

    Table 12-1 summarizes some other list functions that I won't cover in +detail.

    Table 12-1. Other List Functions

    FunctionDescription
    LASTReturns the last cons cell in a list. With an integer, argument +returns the last n cons cells.
    BUTLASTReturns a copy of the list, excluding the last cons cell. With an +integer argument, excludes the last n cells.
    NBUTLASTThe recycling version of BUTLAST; may modify and return the +argument list but has no reliable side effects.
    LDIFFReturns a copy of a list up to a given cons cell.
    TAILPReturns true if a given object is a cons cell that's part of the +structure of a list.
    LIST*Builds a list to hold all but the last of its arguments and then +makes the last argument the CDR of the last cell in the list. In +other words, a cross between LIST and APPEND.
    MAKE-LISTBuilds an n item list. The initial elements of the list are +NIL or the value specified with the :initial-element +keyword argument.
    REVAPPENDCombination of REVERSE and APPEND; reverses first +argument as with REVERSE and then appends the second argument.
    NRECONCRecycling version of REVAPPEND; reverses first argument as if +by NREVERSE and then appends the second argument. No reliable +side effects.
    CONSPPredicate to test whether an object is a cons cell.
    ATOMPredicate to test whether an object is not a cons cell.
    LISTPPredicate to test whether an object is either a cons cell or +NIL.
    NULLPredicate to test whether an object is NIL. Functionally +equivalent to NOT but stylistically preferable when testing for +an empty list as opposed to boolean false.

    Mapping

    Another important aspect of the functional style is the use of +higher-order functions, functions that take other functions as +arguments or return functions as values. You saw several examples of +higher-order functions, such as MAP, in the previous chapter. +Although MAP can be used with both lists and vectors (that is, +with any kind of sequence), Common Lisp also provides six mapping +functions specifically for lists. The differences between the six +functions have to do with how they build up their result and whether +they apply the function to the elements of the list or to the cons +cells of the list structure.

    MAPCAR is the function most like MAP. Because it always +returns a list, it doesn't require the result-type argument MAP +does. Instead, its first argument is the function to apply, and +subsequent arguments are the lists whose elements will provide the +arguments to the function. Otherwise, it behaves like MAP: the +function is applied to successive elements of the list arguments, +taking one element from each list per application of the function. +The results of each function call are collected into a new list. For +example:

    (mapcar #'(lambda (x) (* 2 x)) (list 1 2 3)) ==> (2 4 6)
    +(mapcar #'+ (list 1 2 3) (list 10 20 30)) ==> (11 22 33)

    MAPLIST is just like MAPCAR except instead of passing the +elements of the list to the function, it passes the actual cons +cells.13 Thus, the function has access not only to the value of +each element of the list (via the CAR of the cons cell) but also +to the rest of the list (via the CDR).

    MAPCAN and MAPCON work like MAPCAR and MAPLIST +except for the way they build up their result. While MAPCAR and +MAPLIST build a completely new list to hold the results of the +function calls, MAPCAN and MAPCON build their result by +splicing together the results--which must be lists--as if by +NCONC. Thus, each function invocation can provide any number of +elements to be included in the result.14 MAPCAN, like MAPCAR, passes the elements of the list to +the mapped function while MAPCON, like MAPLIST, passes the +cons cells.

    Finally, the functions MAPC and MAPL are control constructs +disguised as functions--they simply return their first list argument, +so they're useful only when the side effects of the mapped function +do something interesting. MAPC is the cousin of MAPCAR and +MAPCAN while MAPL is in the MAPLIST/MAPCON +family.

    Other Structures

    While cons cells and lists are typically considered to be synonymous, +that's not quite right--as I mentioned earlier, you can use lists of +lists to represent trees. Just as the functions discussed in this +chapter allow you to treat structures built out of cons cells as +lists, other functions allow you to use cons cells to represent +trees, sets, and two kinds of key/value maps. I'll discuss some of +those functions in the next chapter. +


    1Adapted from The Matrix + (http://us.imdb.com/Quotes?0133093)

    2CONS was originally short for the verb +construct.

    3When the place given to SETF is a CAR or +CDR, it expands into a call to the function RPLACA or +RPLACD; some old-school Lispers--the same ones who still use +SETQ--will still use RPLACA and RPLACD directly, but +modern style is to use SETF of CAR or CDR.

    4Typically, +simple objects such as numbers are drawn within the appropriate box, +and more complex objects will be drawn outside the box with an arrow +from the box indicating the reference. This actually corresponds well +with how many Common Lisp implementations work--although all objects +are conceptually stored by reference, certain simple immutable +objects can be stored directly in a cons cell.

    5The phrase for-side-effect is used in the +language standard, but recycling is my own invention; most Lisp +literature simply uses the term destructive for both kinds of +operations, leading to the confusion I'm trying to dispel.

    6The string functions NSTRING-CAPITALIZE, +NSTRING-DOWNCASE, and NSTRING-UPCASE are similar--they +return the same results as their N-less counterparts but are +specified to modify their string argument in place.

    7For example, in an examination of all uses of recycling +functions in the Common Lisp Open Code Collection (CLOCC), a diverse +set of libraries written by various authors, instances of the +PUSH/NREVERSE idiom accounted for nearly half of all uses +of recycling functions.

    8There +are, of course, other ways to do this same thing. The extended +LOOP macro, for instance, makes it particularly easy and likely +generates code that's even more efficient than the PUSH/ +NREVERSE version.

    9This idiom accounts for 30 +percent of uses of recycling in the CLOCC code base.

    10SORT +and STABLE-SORT can be used as for-side-effect operations on +vectors, but since they still return the sorted vector, you should +ignore that fact and use them for return values for the sake of +consistency.

    11NTH is +roughly equivalent to the sequence function ELT but works only +with lists. Also, confusingly, NTH takes the index as the first +argument, the opposite of ELT. Another difference is that +ELT will signal an error if you try to access an element at an +index greater than or equal to the length of the list, but NTH +will return NIL.

    12In +particular, they used to be used to extract the various parts of +expressions passed to macros before the invention of destructuring +parameter lists. For example, you could take apart the following +expression:

    (when (> x 10) (print x))

    Like this:

    ;; the condition
    +(cadr '(when (> x 10) (print x))) ==> (> X 10)
    ;; the body, as a list
    +(cddr '(when (> x 10) (print x))) ==> ((PRINT X))

    13Thus, MAPLIST is the more primitive of the two +functions--if you had only MAPLIST, you could build MAPCAR +on top of it, but you couldn't build MAPLIST on top of +MAPCAR.

    14In Lisp dialects that +didn't have filtering functions like REMOVE, the idiomatic way +to filter a list was with MAPCAN.

    (mapcan #'(lambda (x) (if (= x 10) nil (list x)))  list) === (remove 10 list)
    \ No newline at end of file diff --git a/clones/gigamonkeys.com/book/variables.html b/clones/gigamonkeys.com/book/variables.html new file mode 100644 index 00000000..67e60ff0 --- /dev/null +++ b/clones/gigamonkeys.com/book/variables.html @@ -0,0 +1,531 @@ +Variables

    6. Variables

    The next basic building block we need to look at are variables. +Common Lisp supports two kinds of variables: lexical and +dynamic.1 These two +types correspond roughly to "local" and "global" variables in other +languages. However, the correspondence is only approximate. On one +hand, some languages' "local" variables are in fact much like Common +Lisp's dynamic variables.2 And on the other, +some languages' local variables are lexically scoped without +providing all the capabilities provided by Common Lisp's lexical +variables. In particular, not all languages that provide lexically +scoped variables support closures.

    To make matters a bit more confusing, many of the forms that deal +with variables can be used with both lexical and dynamic variables. +So I'll start by discussing a few aspects of Lisp's variables that +apply to both kinds and then cover the specific characteristics of +lexical and dynamic variables. Then I'll discuss Common Lisp's +general-purpose assignment operator, SETF, which is used to +assign new values to variables and just about every other place that +can hold a value.

    Variable Basics

    As in other languages, in Common Lisp variables are named places that +can hold a value. However, in Common Lisp, variables aren't typed the +way they are in languages such as Java or C++. That is, you don't +need to declare the type of object that each variable can hold. +Instead, a variable can hold values of any type and the values carry +type information that can be used to check types at runtime. Thus, +Common Lisp is dynamically typed--type errors are detected +dynamically. For instance, if you pass something other than a number +to the + function, Common Lisp will signal a type error. On the +other hand, Common Lisp is a strongly typed language in the +sense that all type errors will be detected--there's no way to treat +an object as an instance of a class that it's not.3

    All values in Common Lisp are, conceptually at least, references to +objects.4 +Consequently, assigning a variable a new value changes what +object the variable refers to but has no effect on the previously +referenced object. However, if a variable holds a reference to a +mutable object, you can use that reference to modify the object, and +the modification will be visible to any code that has a reference to +the same object.

    One way to introduce new variables you've already used is to define +function parameters. As you saw in the previous chapter, when you +define a function with DEFUN, the parameter list defines the +variables that will hold the function's arguments when it's called. +For example, this function defines three variables--x, +y, and z--to hold its arguments.

    (defun foo (x y z) (+ x y z))

    Each time a function is called, Lisp creates new bindings to hold +the arguments passed by the function's caller. A binding is the +runtime manifestation of a variable. A single variable--the thing +you can point to in the program's source code--can have many +different bindings during a run of the program. A single variable can +even have multiple bindings at the same time; parameters to a +recursive function, for example, are rebound for each call to the +function.

    As with all Common Lisp variables, function parameters hold object +references.5 Thus, you +can assign a new value to a function parameter within the body of the +function, and it will not affect the bindings created for another +call to the same function. But if the object passed to a function is +mutable and you change it in the function, the changes will be +visible to the caller since both the caller and the callee will be +referencing the same object.

    Another form that introduces new variables is the LET special +operator. The skeleton of a LET form looks like this:

    (let (variable*)
    +  body-form*)

    where each variable is a variable initialization form. Each +initialization form is either a list containing a variable name and +an initial value form or--as a shorthand for initializing the +variable to NIL--a plain variable name. The following LET +form, for example, binds the three variables x, y, and +z with initial values 10, 20, and NIL:

    (let ((x 10) (y 20) z)
    +  ...)

    When the LET form is evaluated, all the initial value forms are +first evaluated. Then new bindings are created and initialized to the +appropriate initial values before the body forms are executed. Within +the body of the LET, the variable names refer to the newly +created bindings. After the LET, the names refer to whatever, if +anything, they referred to before the LET.

    The value of the last expression in the body is returned as the value +of the LET expression. Like function parameters, variables +introduced with LET are rebound each time the LET is +entered.6

    The scope of function parameters and LET variables--the area +of the program where the variable name can be used to refer to the +variable's binding--is delimited by the form that introduces the +variable. This form--the function definition or the LET--is +called the binding form. As you'll see in a bit, the two types of +variables--lexical and dynamic--use two slightly different scoping +mechanisms, but in both cases the scope is delimited by the binding +form.

    If you nest binding forms that introduce variables with the same +name, then the bindings of the innermost variable shadows the +outer bindings. For instance, when the following function is called, +a binding is created for the parameter x to hold the +function's argument. Then the first LET creates a new binding +with the initial value 2, and the inner LET creates yet another +binding, this one with the initial value 3. The bars on the right +mark the scope of each binding.

    (defun foo (x)
    +  (format t "Parameter: ~a~%" x)      ; |<------ x is argument 
    +  (let ((x 2))                        ; |
    +    (format t "Outer LET: ~a~%" x)    ; | |<---- x is 2
    +    (let ((x 3))                      ; | |
    +      (format t "Inner LET: ~a~%" x)) ; | | |<-- x is 3
    +    (format t "Outer LET: ~a~%" x))   ; | |
    +  (format t "Parameter: ~a~%" x))     ; |

    Each reference to x will refer to the binding with the +smallest enclosing scope. Once control leaves the scope of one +binding form, the binding from the immediately enclosing scope is +unshadowed and x refers to it instead. Thus, calling +foo results in this output:

    CL-USER> (foo 1)
    +Parameter: 1
    +Outer LET: 2
    +Inner LET: 3
    +Outer LET: 2
    +Parameter: 1
    +NIL

    In future chapters I'll discuss other constructs that also serve as +binding forms--any construct that introduces a new variable name +that's usable only within the construct is a binding form.

    For instance, in Chapter 7 you'll meet the DOTIMES loop, a basic +counting loop. It introduces a variable that holds the value of a +counter that's incremented each time through the loop. The following +loop, for example, which prints the numbers from 0 to 9, binds the +variable x:

    (dotimes (x 10) (format t "~d " x))

    Another binding form is a variant of LET, LET*. The +difference is that in a LET, the variable names can be used only +in the body of the LET--the part of the LET after the +variables list--but in a LET*, the initial value forms for each +variable can refer to variables introduced earlier in the variables +list. Thus, you can write the following:

    (let* ((x 10)
    +       (y (+ x 10)))
    +  (list x y))

    but not this:

    (let ((x 10)
    +      (y (+ x 10)))
    +  (list x y))

    However, you could achieve the same result with nested LETs.

    (let ((x 10))
    +  (let ((y (+ x 10)))
    +    (list x y)))

    Lexical Variables and Closures

    By default all binding forms in Common Lisp introduce lexically +scoped variables. Lexically scoped variables can be referred to only +by code that's textually within the binding form. Lexical scoping +should be familiar to anyone who has programmed in Java, C, Perl, or +Python since they all provide lexically scoped "local" variables. For +that matter, Algol programmers should also feel right at home, as +Algol first introduced lexical scoping in the 1960s.

    However, Common Lisp's lexical variables are lexical variables with a +twist, at least compared to the original Algol model. The twist is +provided by the combination of lexical scoping with nested functions. +By the rules of lexical scoping, only code textually within the +binding form can refer to a lexical variable. But what happens when +an anonymous function contains a reference to a lexical variable from +an enclosing scope? For instance, in this expression:

    (let ((count 0)) #'(lambda () (setf count (1+ count))))

    the reference to count inside the LAMBDA form should be +legal according to the rules of lexical scoping. Yet the anonymous +function containing the reference will be returned as the value of +the LET form and can be invoked, via FUNCALL, by code +that's not in the scope of the LET. So what happens? As it +turns out, when count is a lexical variable, it just works. +The binding of count created when the flow of control entered +the LET form will stick around for as long as needed, in this +case for as long as someone holds onto a reference to the function +object returned by the LET form. The anonymous function is +called a closure because it "closes over" the binding created by +the LET.

    The key thing to understand about closures is that it's the binding, +not the value of the variable, that's captured. Thus, a closure can +not only access the value of the variables it closes over but can +also assign new values that will persist between calls to the +closure. For instance, you can capture the closure created by the +previous expression in a global variable like this:

    (defparameter *fn* (let ((count 0)) #'(lambda () (setf count (1+ count)))))

    Then each time you invoke it, the value of count will increase by +one.

    CL-USER> (funcall *fn*)
    +1
    +CL-USER> (funcall *fn*)
    +2
    +CL-USER> (funcall *fn*)
    +3

    A single closure can close over many variable bindings simply by +referring to them. Or multiple closures can capture the same binding. +For instance, the following expression returns a list of three +closures, one that increments the value of the closed over +count binding, one that decrements it, and one that returns +the current value:

    (let ((count 0))
    +  (list
    +   #'(lambda () (incf count))
    +   #'(lambda () (decf count))
    +   #'(lambda () count)))

    Dynamic, a.k.a. Special, Variables

    Lexically scoped bindings help keep code understandable by limiting +the scope, literally, in which a given name has meaning. This is why +most modern languages use lexical scoping for local variables. +Sometimes, however, you really want a global variable--a variable +that you can refer to from anywhere in your program. While it's true +that indiscriminate use of global variables can turn code into +spaghetti nearly as quickly as unrestrained use of goto, +global variables do have legitimate uses and exist in one form or +another in almost every programming language.7 And as you'll see +in a moment, Lisp's version of global variables, dynamic variables, +are both more useful and more manageable.

    Common Lisp provides two ways to create global variables: DEFVAR +and DEFPARAMETER. Both forms take a variable name, an initial +value, and an optional documentation string. After it has been +DEFVARed or DEFPARAMETERed, the name can be used anywhere +to refer to the current binding of the global variable. As you've +seen in previous chapters, global variables are conventionally named +with names that start and end with *. You'll see later in this +section why it's quite important to follow that naming convention. +Examples of DEFVAR and DEFPARAMETER look like this:

    +(defvar *count* 0
    +  "Count of widgets made so far.")
    +
    +(defparameter *gap-tolerance* 0.001
    +  "Tolerance to be allowed in widget gaps.")

    The difference between the two forms is that DEFPARAMETER always +assigns the initial value to the named variable while DEFVAR +does so only if the variable is undefined. A DEFVAR form can +also be used with no initial value to define a global variable +without giving it a value. Such a variable is said to be unbound.

    Practically speaking, you should use DEFVAR to define variables +that will contain data you'd want to keep even if you made a change +to the source code that uses the variable. For instance, suppose the +two variables defined previously are part of an application for +controlling a widget factory. It's appropriate to define the +*count* variable with DEFVAR because the number of +widgets made so far isn't invalidated just because you make some +changes to the widget-making code.8

    On the other hand, the variable *gap-tolerance* presumably has +some effect on the behavior of the widget-making code itself. If you +decide you need a tighter or looser tolerance and change the value in +the DEFPARAMETER form, you'd like the change to take effect when +you recompile and reload the file.

    After defining a variable with DEFVAR or DEFPARAMETER, you +can refer to it from anywhere. For instance, you might define this +function to increment the count of widgets made:

    (defun increment-widget-count () (incf *count*))

    The advantage of global variables is that you don't have to pass them +around. Most languages store the standard input and output streams in +global variables for exactly this reason--you never know when you're +going to want to print something to standard out, and you don't want +every function to have to accept and pass on arguments containing +those streams just in case someone further down the line needs them.

    However, once a value, such as the standard output stream, is stored +in a global variable and you have written code that references that +global variable, it's tempting to try to temporarily modify the +behavior of that code by changing the variable's value.

    For instance, suppose you're working on a program that contains some +low-level logging functions that print to the stream in the global +variable *standard-output*. Now suppose that in part of the +program you want to capture all the output generated by those +functions into a file. You might open a file and assign the resulting +stream to *standard-output*. Now the low-level functions will +send their output to the file.

    This works fine until you forget to set *standard-output* back +to the original stream when you're done. If you forget to reset +*standard-output*, all the other code in the program that uses +*standard-output* will also send its output to the +file.9

    What you really want, it seems, is a way to wrap a piece of code in +something that says, "All code below here--all the functions it +calls, all the functions they call, and so on, down to the +lowest-level functions--should use this value for the global +variable *standard-output*." Then when the high-level function +returns, the old value of *standard-output* should be +automatically restored.

    It turns out that that's exactly what Common Lisp's other kind of +variable--dynamic variables--let you do. When you bind a dynamic +variable--for example, with a LET variable or a function +parameter--the binding that's created on entry to the binding form +replaces the global binding for the duration of the binding form. +Unlike a lexical binding, which can be referenced by code only within +the lexical scope of the binding form, a dynamic binding can be +referenced by any code that's invoked during the execution of the +binding form.10 And it +turns out that all global variables are, in fact, dynamic variables.

    Thus, if you want to temporarily redefine *standard-output*, +the way to do it is simply to rebind it, say, with a LET.

    (let ((*standard-output* *some-other-stream*))
    +  (stuff))

    In any code that runs as a result of the call to stuff, +references to *standard-output* will use the binding +established by the LET. And when stuff returns and +control leaves the LET, the new binding of +*standard-output* will go away and subsequent references to +*standard-output* will see the binding that was current before +the LET. At any given time, the most recently established +binding shadows all other bindings. Conceptually, each new binding +for a given dynamic variable is pushed onto a stack of bindings for +that variable, and references to the variable always use the most +recent binding. As binding forms return, the bindings they created +are popped off the stack, exposing previous bindings.11

    A simple example shows how this works.

    (defvar *x* 10)
    +(defun foo () (format t "X: ~d~%" *x*))

    The DEFVAR creates a global binding for the variable *x* +with the value 10. The reference to *x* in foo will +look up the current binding dynamically. If you call foo from +the top level, the global binding created by the DEFVAR is the +only binding available, so it prints 10.

    CL-USER> (foo)
    +X: 10
    +NIL

    But you can use LET to create a new binding that temporarily +shadows the global binding, and foo will print a different +value.

    CL-USER> (let ((*x* 20)) (foo))
    +X: 20
    +NIL

    Now call foo again, with no LET, and it again sees the +global binding.

    CL-USER> (foo)
    +X: 10
    +NIL

    Now define another function.

    (defun bar ()
    +  (foo)
    +  (let ((*x* 20)) (foo))
    +  (foo))

    Note that the middle call to foo is wrapped in a LET that +binds *x* to the new value 20. When you run bar, you +get this result:

    CL-USER> (bar)
    +X: 10
    +X: 20
    +X: 10
    +NIL

    As you can see, the first call to foo sees the global binding, +with its value of 10. The middle call, however, sees the new binding, +with the value 20. But after the LET, foo once again sees +the global binding.

    As with lexical bindings, assigning a new value affects only the +current binding. To see this, you can redefine foo to include +an assignment to *x*.

    (defun foo ()
    +  (format t "Before assignment~18tX: ~d~%" *x*)
    +  (setf *x* (+ 1 *x*))
    +  (format t "After assignment~18tX: ~d~%" *x*))

    Now foo prints the value of *x*, increments it, and +prints it again. If you just run foo, you'll see this:

    CL-USER> (foo)
    +Before assignment X: 10
    +After assignment  X: 11
    +NIL

    Not too surprising. Now run bar.

    CL-USER> (bar)
    +Before assignment X: 11
    +After assignment  X: 12
    +Before assignment X: 20
    +After assignment  X: 21
    +Before assignment X: 12
    +After assignment  X: 13
    +NIL

    Notice that *x* started at 11--the earlier call to foo +really did change the global value. The first call to foo from +bar increments the global binding to 12. The middle call +doesn't see the global binding because of the LET. Then the last +call can see the global binding again and increments it from 12 to +13.

    So how does this work? How does LET know that when it binds +*x* it's supposed to create a dynamic binding rather than a +normal lexical binding? It knows because the name has been declared +special.12 The name of every variable defined +with DEFVAR and DEFPARAMETER is automatically declared +globally special. This means whenever you use such a name in a +binding form--in a LET or as a function parameter or any other +construct that creates a new variable binding--the binding that's +created will be a dynamic binding. This is why the *naming* +*convention* is so important--it'd be bad news if you used a +name for what you thought was a lexical variable and that variable +happened to be globally special. On the one hand, code you call could +change the value of the binding out from under you; on the other, you +might be shadowing a binding established by code higher up on the +stack. If you always name global variables according to the * +naming convention, you'll never accidentally use a dynamic binding +where you intend to establish a lexical binding.

    It's also possible to declare a name locally special. If, in a +binding form, you declare a name special, then the binding created +for that variable will be dynamic rather than lexical. Other code can +locally declare a name special in order to refer to the dynamic +binding. However, locally special variables are relatively rare, so +you needn't worry about them.13

    Dynamic bindings make global variables much more manageable, but it's +important to notice they still allow action at a distance. Binding a +global variable has two at a distance effects--it can change the +behavior of downstream code, and it also opens the possibility that +downstream code will assign a new value to a binding established +higher up on the stack. You should use dynamic variables only when +you need to take advantage of one or both of these characteristics.

    Constants

    One other kind of variable I haven't mentioned at all is the +oxymoronic "constant variable." All constants are global and are +defined with DEFCONSTANT. The basic form of DEFCONSTANT is +like DEFPARAMETER.

    (defconstant name initial-value-form [ documentation-string ])

    As with DEFVAR and DEFPARAMETER, DEFCONSTANT has a +global effect on the name used--thereafter the name can be used only +to refer to the constant; it can't be used as a function parameter or +rebound with any other binding form. Thus, many Lisp programmers +follow a naming convention of using names starting and ending with ++ for constants. This convention is somewhat less universally +followed than the *-naming convention for globally special +names but is a good idea for the same reason.14

    Another thing to note about DEFCONSTANT is that while the +language allows you to redefine a constant by reevaluating a +DEFCONSTANT with a different initial-value-form, what exactly +happens after the redefinition isn't defined. In practice, most +implementations will require you to reevaluate any code that refers +to the constant in order to see the new value since the old value may +well have been inlined. Consequently, it's a good idea to use +DEFCONSTANT only to define things that are really constant, +such as the value of NIL. For things you might ever want to change, +you should use DEFPARAMETER instead.

    Assignment

    Once you've created a binding, you can do two things with it: get the +current value and set it to a new value. As you saw in Chapter 4, a +symbol evaluates to the value of the variable it names, so you can +get the current value simply by referring to the variable. To assign +a new value to a binding, you use the SETF macro, Common Lisp's +general-purpose assignment operator. The basic form of SETF is +as follows:

    (setf place value)

    Because SETF is a macro, it can examine the form of the +place it's assigning to and expand into appropriate lower-level +operations to manipulate that place. When the place is a variable, it +expands into a call to the special operator SETQ, which, as a +special operator, has access to both lexical and dynamic +bindings.15 For instance, to assign the value 10 to the variable +x, you can write this:

    (setf x 10)

    As I discussed earlier, assigning a new value to a binding has no +effect on any other bindings of that variable. And it doesn't have +any effect on the value that was stored in the binding prior to the +assignment. Thus, the SETF in this function:

    (defun foo (x) (setf x 10))

    will have no effect on any value outside of foo. The binding +that was created when foo was called is set to 10, immediately +replacing whatever value was passed as an argument. In particular, a +form such as the following:

    (let ((y 20))
    +  (foo y)
    +  (print y))

    will print 20, not 10, as it's the value of y that's passed to +foo where it's briefly the value of the variable x +before the SETF gives x a new value.

    SETF can also assign to multiple places in sequence. For +instance, instead of the following:

    (setf x 1)
    +(setf y 2)

    you can write this:

    (setf x 1 y 2)

    SETF returns the newly assigned value, so you can also nest +calls to SETF as in the following expression, which assigns both +x and y the same random value:

    (setf x (setf y (random 10))) 

    Generalized Assignment

    Variable bindings, of course, aren't the only places that can hold +values. Common Lisp supports composite data structures such as +arrays, hash tables, and lists, as well as user-defined data +structures, all of which consist of multiple places that can each +hold a value.

    I'll cover those data structures in future chapters, but while we're +on the topic of assignment, you should note that SETF can assign +any place a value. As I cover the different composite data +structures, I'll point out which functions can serve as +"SETFable places." The short version, however, is if you need to +assign a value to a place, SETF is almost certainly the tool to +use. It's even possible to extend SETF to allow it to assign to +user-defined places though I won't cover that.16

    In this regard SETF is no different from the = assignment +operator in most C-derived languages. In those languages, the += operator assigns new values to variables, array elements, +and fields of classes. In languages such as Perl and Python that +support hash tables as a built-in data type, = can also set +the values of individual hash table entries. Table 6-1 summarizes the +various ways = is used in those languages.

    Table 6-1. Assignment with = in Other Languages

    Assigning to ...Java, C, C++PerlPython
    ... variablex = 10;$x = 10;x = 10
    ... array elementa[0] = 10;$a[0] = 10;a[0] = 10
    ... hash table entry--$hash{'key'} = 10;hash['key'] = 10
    ... field in objecto.field = 10;$o->{'field'} = 10;o.field = 10

    SETF works the same way--the first "argument" to SETF is a +place to store the value, and the second argument provides the value. +As with the = operator in these languages, you use the same +form to express the place as you'd normally use to fetch the +value.17 Thus, the Lisp equivalents of the assignments in Table +6-1--given that AREF is the array access function, GETHASH +does a hash table lookup, and field might be a function that +accesses a slot named field of a user-defined object--are as +follows:

    Simple variable:    (setf x 10) 
    +Array:              (setf (aref a 0) 10)
    +Hash table:         (setf (gethash 'key hash) 10)
    +Slot named 'field': (setf (field o) 10)

    Note that SETFing a place that's part of a larger object has the +same semantics as SETFing a variable: the place is modified +without any effect on the object that was previously stored in the +place. Again, this is similar to how = behaves in Java, Perl, +and Python.18

    Other Ways to Modify Places

    While all assignments can be expressed with SETF, certain +patterns involving assigning a new value based on the current value +are sufficiently common to warrant their own operators. For instance, +while you could increment a number with SETF, like this:

    (setf x (+ x 1))

    or decrement it with this:

    (setf x (- x 1))

    it's a bit tedious, compared to the C-style ++x and +--x. Instead, you can use the macros INCF and DECF, +which increment and decrement a place by a certain amount that +defaults to 1.

    (incf x)    === (setf x (+ x 1))
    +(decf x)    === (setf x (- x 1))
    +(incf x 10) === (setf x (+ x 10))

    INCF and DECF are examples of a kind of macro called +modify macros. Modify macros are macros built on top of SETF +that modify places by assigning a new value based on the current +value of the place. The main benefit of modify macros is that they're +more concise than the same modification written out using SETF. +Additionally, modify macros are defined in a way that makes them safe +to use with places where the place expression must be evaluated only +once. A silly example is this expression, which increments the value +of an arbitrary element of an array:

    (incf (aref *array* (random (length *array*))))

    A naive translation of that into a SETF expression might look +like this:

    (setf (aref *array* (random (length *array*)))
    +      (1+ (aref *array* (random (length *array*)))))

    However, that doesn't work because the two calls to RANDOM won't +necessarily return the same value--this expression will likely grab +the value of one element of the array, increment it, and then store +it back as the new value of a different element. The INCF +expression, however, does the right thing because it knows how to +take apart this expression:

    (aref *array* (random (length *array*)))

    to pull out the parts that could possibly have side effects to make +sure they're evaluated only once. In this case, it would probably +expand into something more or less equivalent to this:

    (let ((tmp (random (length *array*))))
    +  (setf (aref *array* tmp) (1+ (aref *array* tmp))))

    In general, modify macros are guaranteed to evaluate both their +arguments and the subforms of the place form exactly once each, in +left-to-right order.

    The macro PUSH, which you used in the mini-database to add +elements to the *db* variable, is another modify macro. You'll +take a closer look at how it and its counterparts POP and +PUSHNEW work in Chapter 12 when I talk about how lists are +represented in Lisp.

    Finally, two slightly esoteric but useful modify macros are +ROTATEF and SHIFTF. ROTATEF rotates values between +places. For instance, if you have two variables, a and +b, this call:

    (rotatef a b)

    swaps the values of the two variables and returns NIL. Since +a and b are variables and you don't have to worry about +side effects, the previous ROTATEF expression is equivalent to +this:

    (let ((tmp a)) (setf a b b tmp) nil)

    With other kinds of places, the equivalent expression using SETF +would be quite a bit more complex.

    SHIFTF is similar except instead of rotating values it shifts +them to the left--the last argument provides a value that's moved to +the second-to-last argument while the rest of the values are moved +one to the left. The original value of the first argument is simply +returned. Thus, the following:

    (shiftf a b 10)

    is equivalent--again, since you don't have to worry about side +effects--to this:

    (let ((tmp a)) (setf a b b 10) tmp)

    Both ROTATEF and SHIFTF can be used with any number of +arguments and, like all modify macros, are guaranteed to evaluate +them exactly once, in left to right order.

    With the basics of Common Lisp's functions and variables under your +belt, now you're ready to move onto the feature that continues to +differentiate Lisp from other languages: macros. +


    1Dynamic variables are also sometimes called special +variables for reasons you'll see later in this chapter. It's +important to be aware of this synonym, as some folks (and Lisp +implementations) use one term while others use the other.

    2Early Lisps tended to use dynamic +variables for local variables, at least when interpreted. Elisp, the +Lisp dialect used in Emacs, is a bit of a throwback in this respect, +continuing to support only dynamic variables. Other languages have +recapitulated this transition from dynamic to lexical +variables--Perl's local variables, for instance, are dynamic +while its my variables, introduced in Perl 5, are lexical. +Python never had true dynamic variables but only introduced true +lexical scoping in version 2.2. (Python's lexical variables are still +somewhat limited compared to Lisp's because of the conflation of +assignment and binding in the language's syntax.)

    3Actually, +it's not quite true to say that all type errors will always be +detected--it's possible to use optional declarations to tell the +compiler that certain variables will always contain objects of a +particular type and to turn off runtime type checking in certain +regions of code. However, declarations of this sort are used to +optimize code after it has been developed and debugged, not during +normal development.

    4As an optimization certain kinds of objects, such as +integers below a certain size and characters, may be represented +directly in memory where other objects would be represented by a +pointer to the actual object. However, since integers and characters +are immutable, it doesn't matter that there may be multiple copies of +"the same" object in different variables. This is the root of the +difference between EQ and EQL discussed in Chapter 4.

    5In compiler-writer terms Common Lisp functions are +"pass-by-value." However, the values that are passed are references +to objects. This is similar to how Java and Python work.

    6The variables in LET forms and function parameters +are created by exactly the same mechanism. In fact, in some Lisp +dialects--though not Common Lisp--LET is simply a macro that +expands into a call to an anonymous function. That is, in those +dialects, the following:

    (let ((x 10)) (format t "~a" x))

    is a macro form that expands into this:

    ((lambda (x) (format t "~a" x)) 10)

    7Java disguises +global variables as public static fields, C uses extern +variables, and Python's module-level and Perl's package-level +variables can likewise be accessed from anywhere.

    8If you specifically want to +reset a DEFVARed variable, you can either set it directly with +SETF or make it unbound using MAKUNBOUND and then +reevaluate the DEFVAR form.

    9The strategy of temporarily reassigning *standard-output* +also breaks if the system is multithreaded--if there are multiple +threads of control trying to print to different streams at the same +time, they'll all try to set the global variable to the stream they +want to use, stomping all over each other. You could use a lock to +control access to the global variable, but then you're not really +getting the benefit of multiple concurrent threads, since whatever +thread is printing has to lock out all the other threads until it's +done even if they want to print to a different stream.

    10The technical term for the interval during which +references may be made to a binding is its extent. Thus, +scope and extent are complementary notions--scope refers to +space while extent refers to time. Lexical variables have lexical +scope but indefinite extent, meaning they stick around for an +indefinite interval, determined by how long they're needed. Dynamic +variables, by contrast, have indefinite scope since they can be +referred to from anywhere but dynamic extent. To further confuse +matters, the combination of indefinite scope and dynamic extent is +frequently referred to by the misnomer dynamic scope.

    11Though the +standard doesn't specify how to incorporate multithreading into +Common Lisp, implementations that provide multithreading follow the +practice established on the Lisp machines and create dynamic bindings +on a per-thread basis. A reference to a global variable will find the +binding most recently established in the current thread, or the +global binding.

    12This is why dynamic variables are also sometimes +called special variables.

    13If you must know, you can look up +DECLARE, SPECIAL, and LOCALLY in the HyperSpec.

    14Several key +constants defined by the language itself don't follow this +convention--not least of which are T and NIL. This is +occasionally annoying when one wants to use t as a local +variable name. Another is PI, which holds the best long-float +approximation of the mathematical constant pi.

    15Some old-school Lispers prefer to use SETQ with +variables, but modern style tends to use SETF for all +assignments.

    16Look up +DEFSETF, DEFINE-SETF-EXPANDER for more information.

    17The prevalence of Algol-derived syntax for assignment +with the "place" on the left side of the = and the new value +on the right side has spawned the terminology lvalue, short for +"left value," meaning something that can be assigned to, and +rvalue, meaning something that provides a value. A compiler +hacker would say, "SETF treats its first argument as an +lvalue."

    18C programmers may want to think of variables and +other places as holding a pointer to the real object; assigning to a +variable simply changes what object it points to while assigning to a +part of a composite object is similar to indirecting through the +pointer to the actual object. C++ programmers should note that the +behavior of = in C++ when dealing with objects--namely, a +memberwise copy--is quite idiosyncratic.

    \ No newline at end of file diff --git a/clones/lispcookbook.github.io/cl-cookbook/AppendixA.jpg b/clones/lispcookbook.github.io/cl-cookbook/AppendixA.jpg new file mode 100644 index 0000000000000000000000000000000000000000..487d84fe075827e2b54e2182b3cdd86fb3c62766 GIT binary patch literal 8061 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�)BQhe& ziViMGcI>rrh%Xg}+QPbZ?l4HE zG_7Da`w=wF-&2Ey?ImCOtKCan(+d@<8{VDdeP6jWYH8>Z9~Wcz@m=)<`oT_OacqX5 zE&8>l1d{PyiFSCWMAXxa4h2oy`I4`KwJj?t%1t3++!khRrZ1x6Za_HB8qxCkrA-*W zZ;*xMmkj%>UCtMEF+HBitnkN!do|+DZ^A|$3+`8*&NT_uRV#%i*wg#Aml&tyK5y7L zC6TlHoV(8Rf}8NARoRKFk5XH8EI+ufHl{w2``=>g$~c==45CejKqqh(u-8G%^O1XPPUz75`+qEs}*44Lg`#^+)B7 zVpx|Lx8j7czRr`gPUk!g^3qqeU48kFP8~}cGmETfKhNDLVxKShs7<#&{_DlFb6aXP zbqA|#S9W7+M(!6cumPV8raDU~fY!CJq`Igv%9 zN15YxH@RpfzufigN*A+s_}p`>XsvC%iWrt`nAwuIQ+j8UUQTc0@|XLCz4@v0enh{D z4Wj%u-`Zyr`JSt+mg37yZO^p~Ep+V+O$_6+&ZyXZN%&fVrvQ>!Drk#sr|s`S*bcGo zIUL#QQoz58UZL-p{PE1cxy}9L$&<3YydAeM+gq^-HYU~k^^})1ZXwDkfV<0>~gkC>Xb9X~ryM!biaVJdwp z3w%soH=c5HbF0_qK4=a^DKQ@|n!8n(kszvIn$JJNC4A+|8+KmawFjSy4`;L-f%!H* z>vamBuT{)0mSQhYv5!tFiq90&j_tpDIn`=XEzlDw5pHXBR-E@;?XsHq!n%qcVUYjc z>NIm7=4pUyao)9E;>Or|ASvAw> z9;xJ9Eng=qdk40MKJC2oYDCat^zH2nz8n>g(u3?fXG0E4r=%R;aX$LtJO1qVUa6sZ z=aEvijOvV!hnaO1^=4O`1#3q`m(#jm6Wu@NAK(@_E%8F%?`5@Rt6iO?e)Lg6tAtCC zhiAMa@v*HsvQeCQTo|W~dtS?oGdxW{KU{DnFw@?7$BNHIt%@ovL6=)2`eP?k>-xVd zMSdyg{t@lA;-b`L;-Rm3vHjruiTZAY;*&2DbQkONFO_lC=mt$92x(2aWr=1{5u9({ zHNXE>usukh3eW3VLYdc%d^@hFPyB zc{a9%Xj?(|@^q|KT$4(%l(HE7Io42>+|7yaF0LWIXF1e6n3^xdMOW$i946sNn^UNV z4?9|Q5w5E3eCF3+uzv{p|Nend%wmG<34UIx6|kIb;W=N@6eoEL7X5D@?hbzSioq5k J8Nd%7{{t)0e;EJ( literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/AppendixB.jpg b/clones/lispcookbook.github.io/cl-cookbook/AppendixB.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93b4da2f36750375815fee22577f4d2b5a39aa25 GIT binary patch literal 8152 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 + + + + Multidimensional arrays + + + + + + + + + + + + + + +

    The Common Lisp Cookbook – Multidimensional arrays

    +
    + + + + +
    +
    + +
    +
    + +
    +
    Table of Contents
    +
      +
      +
      + +
      +

      The Common Lisp Cookbook – Multidimensional arrays

      + + +

      + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

      +

      + 📕 Get the EPUB and PDF +

      + + +
      Common Lisp has native support for multidimensional arrays, with some +special treatment for 1-D arrays, called vectors. Arrays can be +generalised and contain any type (element-type t), or they +can be specialised to contain specific types such as single-float +or integer. A good place to start is +Practical Common Lisp Chapter 11, Collections by +Peter Seibel.

      + +

      A quick reference to some common operations on arrays is given in the +section on Arrays and vectors.

      + +

      Some libraries available on Quicklisp for manipulating arrays:

      + +
        +
      • array-operations defines +functions generate, permute, displace, flatten, split, +combine, reshape. It also defines each, for element-wise +operations. This library is not maintained by the original author, +but there is an actively maintained fork.
      • +
      • cmu-infix includes +array indexing syntax for multidimensional arrays.
      • +
      • lla is a library for linear algebra, calling BLAS and LAPACK +libraries. It differs from most CL linear algebra packages in using +intuitive function names, and can operate on native arrays as well as +CLOS objects.
      • +
      + +

      This page covers what can be done with the built-in multidimensional +arrays, but there are limitations. In particular:

      + +
        +
      • Interoperability with foreign language arrays, for example when +calling libraries such as BLAS, LAPACK or GSL.
      • +
      • Extending arithmetic and other mathematical operators to handle +arrays, for example so that (+ a b) works +when a and/or b are arrays.
      • +
      + +

      Both of these problems can be solved by using CLOS to define an +extended array class, with native arrays as a special case. +Some libraries available through +quicklisp which take this approach +are:

      + +
        +
      • matlisp, some of which is +described in sections below.
      • +
      • MGL-MAT, which has a manual +and provides bindings to BLAS and CUDA. This is used in a machine +learning library MGL.
      • +
      • cl-ana, a data analysis +package with a manual, which includes operations on arrays.
      • +
      • Antik, used in +GSLL, a binding to the GNU +Scientific Library.
      • +
      + +

      A relatively new but actively developed package is +MAGICL, which provides +wrappers around BLAS and LAPACK libraries. At the time of writing this +package is not on Quicklisp, and only works under SBCL and CCL. It +seems to be particularly focused on complex arrays, but not +exclusively. +To install, clone the repository in your quicklisp local-projects +directory e.g. under Linux/Unix:

      + +
      $ cd ~/quicklisp/local-projects
      +$ git clone https://github.com/rigetticomputing/magicl.git
      +
      + +

      Instructions for installing dependencies (BLAS, LAPACK and Expokit) +are given on the github web pages. +Low-level routines wrap foreign functions, so have the Fortran names +e.g magicl.lapack-cffi::%zgetrf. Higher-level interfaces to some of +these functions also exist, see the +source directory and documentation.

      + +

      Taking this further, domain specific languages have been built on Common +Lisp, which can be used for numerical calculations with arrays. +At the time of writing the most widely used and supported of these are:

      + + + +

      CLASP is a project +which aims to ease interoperability of Common Lisp with other +languages (particularly C++), by using LLVM. +One of the main applications of this project is to numerical/scientific +computing.

      + +

      Creating

      + +

      The function CLHS: make-array +can create arrays filled with a single value

      + +
      * (defparameter *my-array* (make-array '(3 2) :initial-element 1.0))
      +*MY-ARRAY*
      +* *my-array*
      +#2A((1.0 1.0) (1.0 1.0) (1.0 1.0))
      +
      + +

      More complicated array values can be generated by first making an +array, and then iterating over the elements to fill in the values (see +section below on element access).

      + +

      The array-operations +library provides generate, a convenient +function for creating arrays which wraps this iteration.

      + +
      * (ql:quickload :array-operations)
      +To load "array-operations":
      +  Load 1 ASDF system:
      +    array-operations
      +; Loading "array-operations"
      +
      +(:ARRAY-OPERATIONS)
      +
      +* (aops:generate #'identity 7 :position)
      +#(0 1 2 3 4 5 6)
      +
      + +

      Note that the nickname for array-operations is aops. The +generate function can also iterate over the array subscripts by +passing the key :subscripts. See the +github repository for +more examples.

      + +

      Random numbers

      + +

      To create an 3x3 array containing random numbers drawn from a uniform +distribution, generate can be used to call the CL +random function:

      + +
      * (aops:generate (lambda () (random 1.0)) '(3 3))
      +#2A((0.99292254 0.929777 0.93538976)
      +    (0.31522608 0.45167792 0.9411855)
      +    (0.96221936 0.9143338 0.21972346))
      +
      + +

      An array of Gaussian (normal) random numbers with mean of zero and +standard deviation of one, using the +alexandria package:

      + +
      * (ql:quickload :alexandria)
      +To load "alexandria":
      +  Load 1 ASDF system:
      +    alexandria
      +; Loading "alexandria"
      +
      +(:ALEXANDRIA)
      +
      +* (aops:generate #'alexandria:gaussian-random 4)
      +#(0.5522547885338768d0 -1.2564808468164517d0 0.9488161476129733d0
      +  -0.10372852118266523d0)
      +
      + +

      Note that this is not particularly efficient: It requires a function +call for each element, and although gaussian-random returns +two random numbers, only one of them is used.

      + +

      For more efficient implementations, and a wider range of probability +distributions, there are packages available on Quicklisp. See +CLiki for a list.

      + +

      Accessing elements

      + +

      To access the individual elements of an array there are the aref +and row-major-aref functions.

      + +

      The aref function takes the same number of index arguments as the +array has dimensions. Indexing is from 0 and row-major as in C, but +not Fortran.

      +
      * (defparameter *a* #(1 2 3 4))
      +*A*
      +* (aref *a* 0)
      +1
      +* (aref *a* 3)
      +4
      +* (defparameter *b* #2A((1 2 3) (4 5 6)))
      +*B*
      +* (aref *b* 1 0)
      +4
      +* (aref *b* 0 2)
      +3
      +
      + +

      The range of these indices can be found using +array-dimensions:

      + +
      * (array-dimensions *a*)
      +(4)
      +* (array-dimensions *b*)
      +(2 3)
      +
      + +

      or the rank of the array can be found, and then the size of each +dimension queried:

      +
      * (array-rank *a*)
      +1
      +* (array-dimension *a* 0)
      +4
      +* (array-rank *b*)
      +2
      +* (array-dimension *b* 0)
      +2
      +* (array-dimension *b* 1)
      +3
      +
      + +

      To loop over an array nested loops can be used, such as

      +
      * (defparameter a #2A((1 2 3) (4 5 6)))
      +A
      +* (destructuring-bind (n m) (array-dimensions a)
      +    (loop for i from 0 below n do
      +      (loop for j from 0 below m do
      +        (format t "a[~a ~a] = ~a~%" i j (aref a i j)))))
      +
      +a[0 0] = 1
      +a[0 1] = 2
      +a[0 2] = 3
      +a[1 0] = 4
      +a[1 1] = 5
      +a[1 2] = 6
      +NIL
      +
      + +

      A utility macro which does this for multiple dimensions is nested-loop:

      + +
      (defmacro nested-loop (syms dimensions &body body)
      +  "Iterates over a multidimensional range of indices.
      +
      +   SYMS must be a list of symbols, with the first symbol
      +   corresponding to the outermost loop.
      +
      +   DIMENSIONS will be evaluated, and must be a list of
      +   dimension sizes, of the same length as SYMS.
      +
      +   Example:
      +    (nested-loop (i j) '(10 20) (format t '~a ~a~%' i j))
      +
      +  "
      +  (unless syms (return-from nested-loop `(progn ,@body))) ; No symbols
      +
      +  ;; Generate gensyms for dimension sizes
      +  (let* ((rank (length syms))
      +         (syms-rev (reverse syms)) ; Reverse, since starting with innermost
      +         (dims-rev (loop for i from 0 below rank collecting (gensym))) ; innermost dimension first
      +         (result `(progn ,@body))) ; Start with innermost expression
      +    ;; Wrap previous result inside a loop for each dimension
      +    (loop for sym in syms-rev for dim in dims-rev do
      +         (unless (symbolp sym) (error "~S is not a symbol. First argument to nested-loop must be a list of symbols" sym))
      +         (setf result
      +               `(loop for ,sym from 0 below ,dim do
      +                     ,result)))
      +    ;; Add checking of rank and dimension types, and get dimensions into gensym list
      +    (let ((dims (gensym)))
      +      `(let ((,dims ,dimensions))
      +         (unless (= (length ,dims) ,rank) (error "Incorrect number of dimensions: Expected ~a but got ~a" ,rank (length ,dims)))
      +         (dolist (dim ,dims)
      +           (unless (integerp dim) (error "Dimensions must be integers: ~S" dim)))
      +         (destructuring-bind ,(reverse dims-rev) ,dims ; Dimensions reversed so that innermost is last
      +           ,result)))))
      +
      +
      + +

      so that the contents of a 2D array can be printed using

      +
      * (defparameter a #2A((1 2 3) (4 5 6)))
      +A
      +* (nested-loop (i j) (array-dimensions a)
      +      (format t "a[~a ~a] = ~a~%" i j (aref a i j)))
      +
      +a[0 0] = 1
      +a[0 1] = 2
      +a[0 2] = 3
      +a[1 0] = 4
      +a[1 1] = 5
      +a[1 2] = 6
      +NIL
      +
      + +

      [Note: This macro is available in this fork of array-operations, but +not Quicklisp]

      + +

      Row major indexing

      + +

      In some cases, particularly element-wise operations, the number of +dimensions does not matter. To write code which is independent of the +number of dimensions, array element access can be done using a +single flattened index via +row-major-aref. +The array size is given by array-total-size, with the flattened +index starting at 0.

      + +
      * (defparameter a #2A((1 2 3) (4 5 6)))
      +A
      +* (array-total-size a)
      +6
      +* (loop for i from 0 below (array-total-size a) do
      +     (setf (row-major-aref a i) (+ 2.0 (row-major-aref a i))))
      +NIL
      +* a
      +#2A((3.0 4.0 5.0) (6.0 7.0 8.0))
      +
      + +

      Infix syntax

      + +

      The cmu-infix library +provides some different syntax which can make mathematical expressions +easier to read:

      + +
      * (ql:quickload :cmu-infix)
      +To load "cmu-infix":
      +  Load 1 ASDF system:
      +    cmu-infix
      +; Loading "cmu-infix"
      +
      +(:CMU-INFIX)
      +
      +* (named-readtables:in-readtable cmu-infix:syntax)
      +(("COMMON-LISP-USER" . #<NAMED-READTABLE CMU-INFIX:SYNTAX {10030158B3}>)
      + ...)
      +
      +* (defparameter arr (make-array '(3 2) :initial-element 1.0))
      +ARR
      +
      +* #i(arr[0 1] = 2.0)
      +2.0
      +
      +* arr
      +#2A((1.0 2.0) (1.0 1.0) (1.0 1.0))
      +
      + +

      A matrix-matrix multiply operation can be implemented as:

      +
      (let ((A #2A((1 2) (3 4)))
      +      (B #2A((5 6) (7 8)))
      +      (result (make-array '(2 2) :initial-element 0.0)))
      +
      +     (loop for i from 0 to 1 do
      +           (loop for j from 0 to 1 do
      +                 (loop for k from 0 to 1 do
      +                       #i(result[i j] += A[i k] * B[k j]))))
      +      result)
      +
      +

      See the section below on linear algebra, for alternative +matrix-multiply implementations.

      + +

      Element-wise operations

      + +

      To multiply two arrays of numbers of the same size, pass a function +to each in the array-operations library:

      + +
      * (aops:each #'* #(1 2 3) #(2 3 4))
      +#(2 6 12)
      +
      + +

      For improved efficiency there is the aops:each* function, which +takes a type as first argument to specialise the result array.

      + +

      To add a constant to all elements of an array:

      + +
      * (defparameter *a* #(1 2 3 4))
      +*A*
      +* (aops:each (lambda (it) (+ 42 it)) *a*)
      +#(43 44 45 46)
      +* *a*
      +#(1 2 3 4)
      +
      + +

      Note that each is not destructive, but makes a new array. +All arguments to each must be arrays of the same size, +so (aops:each #'+ 42 *a*) is not valid.

      + +

      Vectorising expressions

      + +

      An alternative approach to the each function above, is to use a +macro to iterate over all elements of an array:

      + +
      (defmacro vectorize (variables &body body)
      +  ;; Check that variables is a list of only symbols
      +  (dolist (var variables)
      +    (if (not (symbolp var))
      +        (error "~S is not a symbol" var)))
      +
      +    ;; Get the size of the first variable, and create a new array
      +    ;; of the same type for the result
      +    `(let ((size (array-total-size ,(first variables)))  ; Total array size (same for all variables)
      +           (result (make-array (array-dimensions ,(first variables)) ; Returned array
      +                               :element-type (array-element-type ,(first variables)))))
      +       ;; Check that all variables have the same sizeo
      +       ,@(mapcar (lambda (var) `(if (not (equal (array-dimensions ,(first variables))
      +                                                (array-dimensions ,var)))
      +                                    (error "~S and ~S have different dimensions" ',(first variables) ',var)))
      +              (rest variables))
      +
      +       (dotimes (indx size)
      +         ;; Locally redefine variables to be scalars at a given index
      +         (let ,(mapcar (lambda (var) (list var `(row-major-aref ,var indx))) variables)
      +           ;; User-supplied function body now evaluated for each index in turn
      +           (setf (row-major-aref result indx) (progn ,@body))))
      +       result))
      +
      + +

      [Note: Expanded versions of this macro are available in this +fork of array-operations, but +not Quicklisp]

      + +

      This can be used as:

      +
      * (defparameter *a* #(1 2 3 4))
      +*A*
      +* (vectorize (*a*) (* 2 *a*))
      +#(2 4 6 8)
      +
      + +

      Inside the body of the expression (second form in vectorize +expression) the symbol *a* is bound to a single element. +This means that the built-in mathematical functions can be used:

      + +
      * (defparameter a #(1 2 3 4))
      +A
      +* (defparameter b #(2 3 4 5))
      +B
      +* (vectorize (a b) (* a (sin b)))
      +#(0.9092974 0.28224 -2.2704074 -3.8356972)
      +
      + +

      and combined with cmu-infix

      +
      * (vectorize (a b) #i(a * sin(b)) )
      +#(0.9092974 0.28224 -2.2704074 -3.8356972)
      +
      + +

      Calling BLAS

      + +

      Several packages provide wrappers around BLAS, for fast matrix manipulation.

      + +

      The lla package in quicklisp includes +calls to some functions:

      + +

      Scale an array

      + +

      scaling by a constant factor:

      + +
      * (defparameter a #(1 2 3))
      +* (lla:scal! 2.0 a)
      +* a
      +#(2.0d0 4.0d0 6.0d0)
      +
      + +

      AXPY

      + +

      This calculates a * x + y where a is a constant, x and y are arrays. +The lla:axpy! function is destructive, modifying the last argument (y).

      + +
      * (defparameter x #(1 2 3))
      +A
      +* (defparameter y #(2 3 4))
      +B
      +* (lla:axpy! 0.5 x y)
      +#(2.5d0 4.0d0 5.5d0)
      +* x
      +#(1.0d0 2.0d0 3.0d0)
      +* y
      +#(2.5d0 4.0d0 5.5d0)
      +
      +

      If the y array is complex, then this operation calls the complex +number versions of these operators:

      + +
      * (defparameter x #(1 2 3))
      +* (defparameter y (make-array 3 :element-type '(complex double-float)
      +                                :initial-element #C(1d0 1d0)))
      +* y
      +#(#C(1.0d0 1.0d0) #C(1.0d0 1.0d0) #C(1.0d0 1.0d0))
      +
      +* (lla:axpy! #C(0.5 0.5) a b)
      +#(#C(1.5d0 1.5d0) #C(2.0d0 2.0d0) #C(2.5d0 2.5d0))
      +
      + +

      Dot product

      + +

      The dot product of two vectors:

      + +
      * (defparameter x #(1 2 3))
      +* (defparameter y #(2 3 4))
      +* (lla:dot x y)
      +20.0d0
      +
      + +

      Reductions

      + +

      The reduce function operates +on sequences, including vectors (1D arrays), but not on +multidimensional arrays. +To get around this, multidimensional arrays can be displaced to create +a 1D vector. +Displaced arrays share storage with the original array, so this is a +fast operation which does not require copying data:

      + +
      * (defparameter a #2A((1 2) (3 4)))
      +A
      +* (reduce #'max (make-array (array-total-size a) :displaced-to a))
      +4
      +
      + +

      The array-operations package contains flatten, which returns a +displaced array i.e doesn’t copy data:

      + +
      * (reduce #'max (aops:flatten a))
      +
      + +

      An SBCL extension, +array-storage-vector +provides an efficient but not portable way to achieve the same thing:

      + +
      * (reduce #'max (array-storage-vector a))
      +4
      +
      + +

      More complex reductions are sometimes needed, for example finding the +maximum absolute difference between two arrays. Using the above +methods we could do:

      + +
      * (defparameter a #2A((1 2) (3 4)))
      +A
      +* (defparameter b #2A((1 3) (5 4)))
      +B
      +* (reduce #'max (aops:flatten
      +                  (aops:each
      +                    (lambda (a b) (abs (- a b))) a b)))
      +2
      +
      + +

      This involves allocating an array to hold the intermediate result, +which for large arrays could be inefficient. Similarly to vectorize +defined above, a macro which does not allocate can be defined as:

      + +
      (defmacro vectorize-reduce (fn variables &body body)
      +  "Performs a reduction using FN over all elements in a vectorized expression
      +   on array VARIABLES.
      +
      +   VARIABLES must be a list of symbols bound to arrays.
      +   Each array must have the same dimensions. These are
      +   checked at compile and run-time respectively.
      +  "
      +  ;; Check that variables is a list of only symbols
      +  (dolist (var variables)
      +    (if (not (symbolp var))
      +        (error "~S is not a symbol" var)))
      +
      +  (let ((size (gensym)) ; Total array size (same for all variables)
      +        (result (gensym)) ; Returned value
      +        (indx (gensym)))  ; Index inside loop from 0 to size
      +
      +    ;; Get the size of the first variable
      +    `(let ((,size (array-total-size ,(first variables))))
      +       ;; Check that all variables have the same size
      +       ,@(mapcar (lambda (var) `(if (not (equal (array-dimensions ,(first variables))
      +                                                (array-dimensions ,var)))
      +                                    (error "~S and ~S have different dimensions" ',(first variables) ',var)))
      +              (rest variables))
      +
      +       ;; Apply FN with the first two elements (or fewer if size < 2)
      +       (let ((,result (apply ,fn (loop for ,indx below (min ,size 2) collecting
      +                                      (let ,(map 'list (lambda (var) (list var `(row-major-aref ,var ,indx))) variables)
      +                                        (progn ,@body))))))
      +
      +         ;; Loop over the remaining indices
      +         (loop for ,indx from 2 below ,size do
      +            ;; Locally redefine variables to be scalars at a given index
      +              (let ,(mapcar (lambda (var) (list var `(row-major-aref ,var ,indx))) variables)
      +                ;; User-supplied function body now evaluated for each index in turn
      +                (setf ,result (funcall ,fn ,result (progn ,@body)))))
      +         ,result))))
      +
      +
      +

      [Note: This macro is available in this fork +of array-operations, but not Quicklisp]

      + +

      Using this macro, the maximum value in an array A (of any shape) is:

      + +
      * (vectorize-reduce #'max (a) a)
      +
      + +

      The maximum absolute difference between two arrays A and B, of any +shape as long as they have the same shape, is:

      + +
      * (vectorize-reduce #'max (a b) (abs (- a b)))
      +
      + +

      Linear algebra

      + +

      Several packages provide bindings to BLAS and LAPACK libraries, +including:

      + + + +

      A longer list of available packages is on CLiki’s linear algebra page.

      + +

      In the examples below the lla package is loaded:

      + +
      * (ql:quickload :lla)
      +
      +To load "lla":
      +  Load 1 ASDF system:
      +    lla
      +; Loading "lla"
      +.
      +(:LLA)
      +
      + +

      Matrix multiplication

      + +

      The lla function mm performs +vector-vector, matrix-vector and matrix-matrix +multiplication.

      + +

      Vector dot product

      + +

      Note that one vector is treated as a row vector, and the other as +column:

      + +
      * (lla:mm #(1 2 3) #(2 3 4))
      +20
      +
      + +

      Matrix-vector product

      + +
      * (lla:mm #2A((1 1 1) (2 2 2) (3 3 3))  #(2 3 4))
      +#(9.0d0 18.0d0 27.0d0)
      +
      +

      which has performed the sum over j of A[i j] * x[j]

      + +

      Matrix-matrix multiply

      + +
      * (lla:mm #2A((1 2 3) (1 2 3) (1 2 3))  #2A((2 3 4) (2 3 4) (2 3 4)))
      +#2A((12.0d0 18.0d0 24.0d0) (12.0d0 18.0d0 24.0d0) (12.0d0 18.0d0 24.0d0))
      +
      +

      which summed over j in A[i j] * B[j k]

      + +

      Note that the type of the returned arrays are simple arrays, +specialised to element type double-float

      + +
      * (type-of (lla:mm #2A((1 0 0) (0 1 0) (0 0 1)) #(1 2 3)))
      +(SIMPLE-ARRAY DOUBLE-FLOAT (3))
      +
      + +

      Outer product

      + +

      The array-operations +package contains a generalised outer product +function:

      + +
      * (ql:quickload :array-operations)
      +To load "array-operations":
      +  Load 1 ASDF system:
      +    array-operations
      +; Loading "array-operations"
      +
      +(:ARRAY-OPERATIONS)
      +* (aops:outer #'* #(1 2 3) #(2 3 4))
      +#2A((2 3 4) (4 6 8) (6 9 12))
      +
      +

      which has created a new 2D array A[i j] = B[i] * C[j]. This outer +function can take an arbitrary number of inputs, and inputs with +multiple dimensions.

      + +

      Matrix inverse

      + +

      The direct inverse of a dense matrix can be calculated with invert

      + +
      * (lla:invert #2A((1 0 0) (0 1 0) (0 0 1)))
      +#2A((1.0d0 0.0d0 -0.0d0) (0.0d0 1.0d0 -0.0d0) (0.0d0 0.0d0 1.0d0))
      +
      +

      e.g

      + +
      * (defparameter a #2A((1 2 3) (0 2 1) (1 3 2)))
      +A
      +* (defparameter b (lla:invert a))
      +B
      +* (lla:mm a b)
      +#2A((1.0d0 2.220446049250313d-16 0.0d0)
      +    (0.0d0 1.0d0 0.0d0)
      +    (0.0d0 1.1102230246251565d-16 0.9999999999999998d0))
      +
      + +

      Calculating the direct inverse is generally not advisable, +particularly for large matrices. Instead the +LU decomposition can be +calculated and used for multiple inversions.

      + +
      * (defparameter a #2A((1 2 3) (0 2 1) (1 3 2)))
      +A
      +* (defparameter b (lla:mm a #(1 2 3)))
      +B
      +* (lla:solve (lla:lu a) b)
      +#(1.0d0 2.0d0 3.0d0)
      +
      + +

      Singular value decomposition

      + +

      The svd function calculates the singular value decomposition +of a given matrix, returning an object with slots for the three returned +matrices:

      + +
      * (defparameter a #2A((1 2 3) (0 2 1) (1 3 2)))
      +A
      +* (defparameter a-svd (lla:svd a))
      +A-SVD
      +* a-svd
      +#S(LLA:SVD
      +   :U #2A((-0.6494608633564334d0 0.7205486773948702d0 0.24292013188045855d0)
      +          (-0.3744175632000917d0 -0.5810891192666799d0 0.7225973455785591d0)
      +          (-0.6618248071322363d0 -0.3783451320875919d0 -0.6471807210432038d0))
      +   :D #S(CL-NUM-UTILS.MATRIX:DIAGONAL-MATRIX
      +         :ELEMENTS #(5.593122609997059d0 1.2364443401235103d0
      +                     0.43380279311714376d0))
      +   :VT #2A((-0.2344460799312531d0 -0.7211054639318696d0 -0.6519524104506949d0)
      +           (0.2767642134809678d0 -0.6924017945853318d0 0.6663192365460215d0)
      +           (-0.9318994611765425d0 -0.02422116311440764d0 0.3619070730398283d0)))
      +
      + +

      The diagonal matrix (singular values) and vectors can be accessed with +functions:

      + +
      (lla:svd-u a-svd)
      +#2A((-0.6494608633564334d0 0.7205486773948702d0 0.24292013188045855d0)
      +    (-0.3744175632000917d0 -0.5810891192666799d0 0.7225973455785591d0)
      +    (-0.6618248071322363d0 -0.3783451320875919d0 -0.6471807210432038d0))
      +
      +* (lla:svd-d a-svd)
      +#S(CL-NUM-UTILS.MATRIX:DIAGONAL-MATRIX
      +   :ELEMENTS #(5.593122609997059d0 1.2364443401235103d0 0.43380279311714376d0))
      +
      +* (lla:svd-vt a-svd)
      +#2A((-0.2344460799312531d0 -0.7211054639318696d0 -0.6519524104506949d0)
      +    (0.2767642134809678d0 -0.6924017945853318d0 0.6663192365460215d0)
      +    (-0.9318994611765425d0 -0.02422116311440764d0 0.3619070730398283d0))
      +
      + +

      Matlisp

      + +

      The Matlisp scientific +computation library provides high performance operations on arrays, +including wrappers around BLAS and LAPACK functions. +It can be loaded using quicklisp:

      + +
      * (ql:quickload :matlisp)
      +
      + +

      The nickname for matlisp is m. To avoid typing matlisp: or +m: in front of each symbol, you can define your own package which +uses matlisp +(See the PCL section on packages):

      + +
      * (defpackage :my-new-code
      +     (:use :common-lisp :matlisp))
      +#<PACKAGE "MY-NEW-CODE">
      +
      +* (in-package :my-new-code)
      +
      + +

      and to use the #i infix reader (note the same name as for +cmu-infix), run:

      + +
      * (named-readtables:in-readtable :infix-dispatch-table)
      +
      + +

      Creating tensors

      + +
      * (matlisp:zeros '(2 2))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 2)
      +  0.000    0.000
      +  0.000    0.000
      +>
      +
      + +

      Note that by default matrix storage types are double-float. +To create a complex array using zeros, ones and eye, specify the type:

      + +
      * (matlisp:zeros '(2 2) '((complex double-float)))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: (COMPLEX DOUBLE-FLOAT)>| #(2 2)
      +  0.000    0.000
      +  0.000    0.000
      +>
      +
      + +

      As well as zeros and ones there is eye which creates an identity +matrix:

      + +
      * (matlisp:eye '(3 3) '((complex double-float)))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: (COMPLEX DOUBLE-FLOAT)>| #(3 3)
      +  1.000    0.000    0.000
      +  0.000    1.000    0.000
      +  0.000    0.000    1.000
      +>
      +
      + +

      Ranges

      + +

      To generate 1D arrays there are the range and linspace functions:

      + +
      * (matlisp:range 1 10)
      +#<|<SIMPLE-DENSE-TENSOR: (INTEGER 0 4611686018427387903)>| #(9)
      + 1   2   3   4   5   6   7   8   9
      +>
      +
      + +

      The range function rounds down it’s final argument to an integer:

      + +
      * (matlisp:range 1 -3.5)
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: SINGLE-FLOAT>| #(5)
      + 1.000   0.000   -1.000  -2.000  -3.000
      +>
      +* (matlisp:range 1 3.3)
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: SINGLE-FLOAT>| #(3)
      + 1.000   2.000   3.000
      +>
      +
      + +

      Linspace is a bit more general, and the values returned include the +end point.

      + +
      * (matlisp:linspace 1 10)
      +#<|<SIMPLE-DENSE-TENSOR: (INTEGER 0 4611686018427387903)>| #(10)
      + 1   2   3   4   5   6   7   8   9   10
      +>
      +
      + +
      * (matlisp:linspace 0 (* 2 pi) 5)
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(5)
      + 0.000   1.571   3.142   4.712   6.283
      +>
      +
      + +

      Currently linspace requires real inputs, and doesn’t work with complex numbers.

      + +

      Random numbers

      + +
      * (matlisp:random-uniform '(2 2))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 2)
      +  0.7287       0.9480
      +  2.6703E-2    0.1834
      +>
      +
      + +
      (matlisp:random-normal '(2 2))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 2)
      +  0.3536    -1.291
      + -0.3877    -1.371
      +>
      +
      + +

      There are functions for other distributions, including +random-exponential, random-beta, random-gamma and +random-pareto.

      + +

      Reader macros

      + +

      The #d and #e reader macros provide a way to create double-float +and single-float tensors:

      + +
      * #d[1,2,3]
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(3)
      + 1.000   2.000   3.000
      +>
      +
      +* #d[[1,2,3],[4,5,6]]
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 3)
      +  1.000    2.000    3.000
      +  4.000    5.000    6.000
      +>
      +
      + +

      Note that the comma separators are needed.

      + +

      Tensors from arrays

      + +

      Common lisp arrays can be converted to Matlisp tensors by copying:

      + +
      * (copy #2A((1 2 3)
      +            (4 5 6))
      +        '#.(tensor 'double-float))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 3)
      +  1.000    2.000    3.000
      +  4.000    5.000    6.000
      +>
      +
      + +

      Instances of the tensor class can also be created, specifying the +dimensions. The internal storage of tensor objects is a 1D array +(simple-vector) in a slot store.

      + +

      For example, to create a double-float type tensor:

      + +
      (make-instance (tensor 'double-float)
      +    :dimensions  (coerce '(2) '(simple-array index-type (*)))
      +    :store (make-array 2 :element-type 'double-float))
      +
      + +

      Arrays from tensors

      + +

      The array store can be accessed using slots:

      + +
      * (defparameter vec (m:range 0 5))
      +* vec
      +#<|<SIMPLE-DENSE-TENSOR: (INTEGER 0 4611686018427387903)>| #(5)
      + 0   1   2   3   4
      +>
      +* (slot-value vec 'm:store)
      +#(0 1 2 3 4)
      +
      + +

      Multidimensional tensors are also stored in 1D arrays, and are stored +in column-major order rather than the row-major ordering used for +common lisp arrays. A displaced array will therefore be +transposed.

      + +

      The contents of a tensor can be copied into an array

      + +
      * (let ((tens (m:ones '(2 3))))
      +    (m:copy tens 'array))
      +#2A((1.0d0 1.0d0 1.0d0) (1.0d0 1.0d0 1.0d0))
      +
      + +

      or a list:

      + +
      * (m:copy (m:ones '(2 3)) 'cons)
      +((1.0d0 1.0d0 1.0d0) (1.0d0 1.0d0 1.0d0))
      +
      + +

      Element access

      + +

      The ref function is the equivalent of aref for standard CL +arrays, and is also setf-able:

      + +
      * (defparameter a (matlisp:ones '(2 3)))
      +
      +* (setf (ref a 1 1) 2.0)
      +2.0d0
      +* a
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 3)
      +  1.000    1.000    1.000
      +  1.000    2.000    1.000
      +>
      +
      + +

      Element-wise operations

      + +

      The matlisp-user package, loaded when matlisp is loaded, contains +functions for operating element-wise on tensors.

      + +
      * (matlisp-user:* 2 (ones '(2 3)))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 3)
      +  2.000    2.000    2.000
      +  2.000    2.000    2.000
      +>
      +
      + +

      This includes arithmetic operators ‘+’, ‘-‘, ‘*’, ‘/’ and ‘expt’, but +also sqrt,sin,cos,tan, hyperbolic functions, and their inverses. +The #i reader macro recognises many of these, and uses the +matlisp-user functions:

      + +
      * (let ((a (ones '(2 2)))
      +        (b (random-normal '(2 2))))
      +     #i( 2 * a + b ))
      +#<|<BLAS-MIXIN SIMPLE-DENSE-TENSOR: DOUBLE-FLOAT>| #(2 2)
      +  0.9684    3.250
      +  1.593     1.508
      +>
      +
      +* (let ((a (ones '(2 2)))
      +        (b (random-normal '(2 2))))
      +     (macroexpand-1 '#i( 2 * a + b )))
      +(MATLISP-USER:+ (MATLISP-USER:* 2 A) B)
      +
      + + +

      + Page source: arrays.md +

      +
      + + + + + +
      +
      +
      + © 2002–2021 the Common Lisp Cookbook Project +
      + +
      +
      T
      O
      C
      +
      + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/atom-slime.png b/clones/lispcookbook.github.io/cl-cookbook/assets/atom-slime.png new file mode 100644 index 0000000000000000000000000000000000000000..f97c877eb4c780e1d2148d95334a629963d9ea6d GIT binary patch literal 432969 zcmbTd2UHVX+b#@96QrmV6$LC<=qjN%K|z|R5JC?{YUsU%DxxA_qj!;(&>@u2L3#(1 z&_WTU6M9QX^2g`>&iTIMd)7MZ{aK4iGMPQIXU|=(>$>l}d;UzFh3N_t6%`eW#?!|y zsi>G~si^3c8R;o|pgpewsHo0eaZpu#uA!>R|J=jX*1^e!it6dRco2i3UJqA>$xFtw zBJ9-nvZWpc#Lq;BdX=63OqKnbol(%o>qRRf%c}K#N$A~LE@dvx@^8X4hsg4*Z$;5` zJc6#DsgO9KS-Dv$Us9UPa(~ERdR;QL@<@gN`>SkCs#kk^kuSm&`(OXKbz9@yQww?i zGf$K)%lBw!K7F#J>a{2P`ukqv|4e$Hdkd}9MTXz?to3)I`uOy%p0xjl)7vhKMAuxZd>vaQ8m2fKdo(pNW+l?=z-DpR@Oij8AeoLg{*E15fyh6qF`M96P z=gNm1{?PH1q4}NbGiS>g0HwJv>W~JuDpxm z+OBMCSNkQbyG$SVYjawjyz(Md-&|Szhg)v8I@6f-FB|!hhjb0KZf`mHalL&XSg-9g zf|GDOijFrqo@hw(sGLdyFR=?$w*IW#Q`>7R8W&zQU1JaYo!>><6I4#?Vy-fNmw^>C z1n#6>a62i#IW1m`4Em-P6isLJ>E_|MkBfoD*P_Ak)`swv7qb~bwJoo_TX=2DRBqUu zmivaEc3-+Ib(O)gh5MNLHhXIVjfXP*ocE#BVLQ0u6IBb1%18Rz7LUgd*UpPwn{T(1 zxJw(N@`KLbI#_Y^h3MT-yqLA|#Mp)Jn(EBod6VbP{+Ot}jSH)vx7=Q(OBKO=sQ-Y! z)FfWJt5`{)PNw~0$^lCRR~QrWjjF`^uYrb+3qnL{L^Tz43C8L_XUUPEZ_&vU&! z6PNo!t;lxw{c9z0yYL?6b2)S$UM134AI411b$&#g!9~=ol0M1}wgAEeT-YA&bShZ7 zus$a!sE%B!aYdZEE1q57+Pgd=lq4kmq3r49z=uuN21;r>#1gfu<5490cOqS^*30F3 zhH~g|0L^Wm3y?P1vV{xs)fafRKy52dFJ8JNi?h1^>_noGL-;)cFkF-?&ZP3 zL?_1CtF2eBi-{;?uCg?Do7#$JIs?KSAkGVnp^F4jLQsR{)8;A0g(2UksM}` zE-FGJMEf%VOpUM2RXbLgz1Ytr$#=Hwi)-~?-s`wgc1xJ^q7`%5g`%tQA8Tc{$0el} zRz-Y-w-?=I2Y-mn(o0~$l0JA%0`?a9-uQ`g?##EQ>=FA;2{GdfBAM0i4OHcH>U9ZO z%Am5Bj0SUeh4l-b+dp4<;a7M!-~Rhbv9xOW^K#RjvR^hG!2&V@)&gLGgi)GYrd(@H zsju|$tG$xF=X)o5h2oFy)d(r+T`#-@KZd*MC%`rgWQup+#*VP8G^Jxic+$TVFAhrJ#S^5Cj;gp&z!4`BPZPf_s>{gdKiA$=mYA5>WB3Yx(iiZ{&5Sj zCihEROowWZ))r8WKkL>6)(+M%Kb0KB0jGcm0JNio8S=zo05w^R$_5k^=Ugig8J;PE8rOrPvKMl{WLKImzkZe}YKBow z%&#{;`i}F=yE2xV+%f$_zWwU(*eLVp#nsKx^`AVWQX_FFvC&dYvz_vNH_4{}L)T$j zaf=1zZV87&);7~nK)OQu&E3PY5D&FiAW-M*IEnIEnrOU7FmfVv0TxR}_0BUrqqNM`8 z8^+l#*bnQ5jja8C-2P7EBIcRA(heLE;hk{6yDldwD0yA-iR6G}sq=vIL^WqMXw%+@ z+J|{FWy5^JWZZMJW@^?eOHSLzaA|mHyJMv1#fstb`0}fjuNzgU)i;$e&+mJh%gmy* z+A(2wX56m;0_d5_^jX)@K)hK z-Y6qJgRSvggS2^IV@5!#zn$OKQShqu=FNSXwY?b(%D2fC&bP$90{VqnE&au}-rPYB z4h>c|R(5Vt&QhJ5Zb9>_Jhva7%;IUCY~7eknG0jj|9EoUPNgt=B-=!V?@e;l+4ht> zIbT$7m!<|uP2Wx9o4G`NBm5@%$#k^DyZ)F{XC`;e#jo%0>3(ziw)7-DE>C^v!wff3 zwDXRwcYnI!nBfa2lQgU8s@jy=qn+R#o1I^;-<{pNC@SE1d-p=>=cgL(8i8Nv^YOY^ zafEM5d(|%oOn$0%ra~k1&C-XW%UyPYgRchU)3l$)>dqvdCUdsJUa{oS<~!+JwjfkU zRe;?Zq}OGjroJwhj~rlujz(*h5=T|u4$#$%)!(Z`dGHL^4E#gZhijL&9^QNae-Ksq zt8%TfXQF4K>satqo0NPtJ#9h;OT+xATsdt$rT)6F@+HCP)Tl+BAxJMMQazpZQ{l>; zkqDZ&@b}?tmA`DSWfaS&D%D%Zo}_VlW^mDSkREVn_GL^->blPS@@HEL9GXQ?8GWqC za?WmT%ViGarW1vkYa6B29Ut9T|5ov>M(bCigc!;kX}_A2NfQDSF}TacHEXz3?bPKF zB;)G8%v8^r3JMaL|7t3X5ET(4HhgZ}{WT=1+^4!Ud#|)3nboeOLDQ6tf5}zcbY50By|gEzkI zb#!XQCSH-fDjQ3}Z4*YGbq&7hdzP4rG)1P=-|@~|+1Zfs?%3+BgSUdj%$S?eP=!PM z0MD4qTUQSk#rk;fb<}3~l&UWmR$yABF5j#4vk$M zi}5Zikf!VR&u(g*=wb5#Lr$59eY$;bg-m?IQRH05^N^j)-Vhh41Aey~Y#!o$?$){e zrVCA1f*W^ZI#XdahptofHyO5?`+}wRn-(KFqt@aE`G!K?llQ&s(RQQDI^g~$i4YcI zfUk6*pJB^|itp;w=OiTnoS_&X)$oP+3F?`JyG#{?M1A&&^cU}2LfR_iQuOC~a(kIW z$DdHWZhhG6GyZ`;ug%=!G=wJh|IZ;_5QQ6tI?wr4T|I300iqJ3;x`nT`1$$eJzm+$zI?3qU&AS% z6mHmidAZ4oiTV2aiuyhjb@i|lyDuXnBPRYp?7;&O$`K--{w`jYej+ZOH~)2#|8<_n zHlEfV4sKo!t}gt4&TDDq>g}a)_PK+fjg#SH2WJ}>Ps%kEA4oqCm;YzLzkT)Jm;4_?jsAP+eM#~EW9a|* z>c57{i~YHU|8YzITCachQWi{+NnY%KFTNtvHi`Wz<#}9nc&w{Wd8PUDaHy!x@KZK- z|Mg0Fee17xYuIC?8`(C3Z@mK4kyMN;3-OJn!dEU3i`Lsfx;l(ZC5w@}6A1T~cH6M0$F< zNadcw$8@=x3__hRZe!zgDS3QQss27MytoosO8}WTBOnGQvl&mS7j9cS)em$|+FGkk zmW4r!K}RlXs#Mgp?8^VyCajv%P!H(r$t8>^d}uorqLgMymU2!IG3TlIoY5$3Fg?&4 za9CydqJM48%0OTLReAbgt)dG8fFldSjVjv?vB3}JEHLR#(dF$}ZEvo)E}~L&jdPcg z91SCXDAj+skq%2DC~@tPIgW`IomT^Yfys8d%`yX;0r4hV6&^x@q8^vQ-1MTN)#HP9 z=6t2_lIjfa^$mu4S3C9CsSZa+$D%xBo+9H1!T<2O|IF0uZD@F_09Lc;`}ZHXz$GOg zGP%LV8yje%afCB~Gqp0Yx`wR9@1y|xHox!8Zd=a5yn(b~a*J-|FaG0Ir>1?$eD~6H zqq=WBxel}`Hq`8b)g&YdUEH8)Ez#WO>dN4rb)90_OjPHyUq_c{HPUz9_>WhUKU6u2 zd4FZ1-KF-(ArOa6HkfYw`To78aP`7{r8uzn8k7UCYgU zFtbiZI#Qrpwe=m(>VL8AfUgC9>{!^zOMLbJ?=jRW3v*Sb@&yf=2OW6|t-f$9m*d3; zp2~rzknM764F9Qt|CufS!>|ydFARIS-G^>$i0d#9AZ{MhtJ1%!zU6uS|KGayr!@Zv z4(_{&hI?dnD4x8sZLmA~%(}&K?LYLte-<;WpB4?ojK`HUO!eYf%g2{1731ux4f~eg z4<%W8yEamkW72~0$MlXJ=$&4HKfp$iE<2Glt%qz*FAsE}zWQZ1g zoq)+V$&Fb7{H!hdj4#jb+;j@}CVz2x@B{Je2f;qmZ|1DFR~5NC_pxiQw2 z1YcV#s+G1i;HhDPS6oAuRs}cq33GWa*#AEw0Y^d0*~D3EC__xy_{Na!vON3M%!6c< z0_iQPk<=`i)zBYsAP87T4@}GX9!w(;wkTA!?SP|6tyMhdX6+ZwYi=Jq)M6bI+s}jV zW7qO@t0%?GtEr({MMYIn>)>}C@1su-7ZBbhA%JSf16h;W@15@%wyd65$5k1gjQgz4 zcER(e%ra*oWW)W6`29@>1ud=O9|xtit)=J_R4u94tZ~vYp$MUX-?HjrC5JidqZNq| zZd%Fk|1-Qj|40J>01g*l9vL@oDIXb+6Gd8ysBdVS;CjI6fy&7&0_V!qmnd58-e_Q0 z7dW8({|MJv&*`2uI943+$o5)Q+79+Q@Jo~8xQmvWdL)Z{#e@or#DzSrPkEWRx&BIq zZ|hY$)eRWcb!x`CWlt#_I*wVtlp<)rlYLTIw)iS>@irwPB^PxL#aw`W1{2HCzYHpN z&KgKqHA`;J=78mGnls%~Ct7d@xKpd1;OtBfJv~hNEYq?bGi;;F`dQf-hAk7Nn9RQ) zA+fhbli}l<*!9VWjf85GFwbK^K*Sz)+Orr2S1E8IM;fb(doP&j<34V}BGD-$@}j z&uz1K@GzDH?w^PI9cl<|tmlRV^Ms~a}8q|rdn@9TfN4{M! zSZq39KoYy?4hQy*L#3scnywb0p>OI^Q%CDddaFf@Y|aR2Vgs;k{xhU4GHIx!9w*Bq zVgJ!Agm`dyO9%OzOVrffF3tT7LEAU|TF`duA#p22X~Fw}^&U<0>2I;k$|1$dcNgzW zQU*?*(xm&v#wn4;6GY7%Q=O}m*`$TGj}NC@3B0c59b7n*A1Q2G%||nVd2IA|X(j!( z=bkmx)NLC76s>`5$wH!KS4~G`zQE$+<0sypzgg7KAdgyPa;f?Ra0)=m1kB0*Bxf?NDwyq1$p8NST9syvgP?P$yPjBK^ zIRI2OD!0fMQQBwVnt~1)92V^S^3Eh<1(ljR1R3heD&QX%Qjr|^q>{ijlNDHCg!{y4 zZne{Kp@BqD&;m=A;~2sjYyF2ZG9Hj z1&LDg-YEX^C8K51szKlDkM75wkAXl$vAO(g=TV_gX%7!6Z+@u{li=JfjP+pV5-xi< zBtOOw&L+FUFSkFex)-0PcUUh(7d|ArE=>3pEw({f(;PNhp{qe_h4}$TLZuC(YB5(( z8~3G`(>%3XTXJG$dk?WSZcS%}95KTB7awY;N)G5=duXej2w%D8JzDq8Gq2F##S65Q|8~Id)Bzb3%@FT zLn>_Ucw@rAw}(!0G|~v$RlV-6GHl>Fv6^11KfvHjWXm;PUv>jtv#om$87U31z7J}> z&Mnep^#(?ltUMQ#sAw5Oh*c zIc!cHMnCQWs;@yeN}4afY{Uk=2LYiABmrc2v*5nThB-S1$vqZtVdy?zVPq>M2T0K(3K51eZ5MXqUi?C$XCjgtF*d3P~;G`GU*vIWo0t)ra#5l zW$kC7q}|}vDVs#IqQIj!&BawumYLns%>>wsG`}j5cH*Ebpm{KWrZqWzxNzfvi3hRH z(X=(vI##ArxAt%n;=D4Py*~6c-}ds5C^fI7Zoqq~G=vCOI2@;xGhBn(gLl7VN=OApJ!8w(hnBtSy5{Tj zlN(qHoCEU7kL*m?=fs>g&$mYrV6`cvSuzPjE^er*`YBpF7yd!faM=E)fAAd{%9PhB zdB|KX@Oy7R@;3Z^wXxk>Hltajs>chJSUeGH zk|Z3b#1rDuMw?72s##31%4+v4c#yS9uh?XMRB&C}CZ6&)Z%GW>E zqt78O9EHsox_@H!s7u_%AxcW8*3Ai>@#`K(3!!k&+Y4$$ka!p>b~FgAoZhWIBhuR z4Dw_tRiuvTZrEJ^V2Qp@vPd1tH2L)=8Z4;P`Q1a4l~zbv#v+t(i2R->zTKbv(0TN` zMjo4Ffpg;l`Y;-Ndc&b4_OjCeKq`}_Rf#Y$*d!WdD&nATX&idOEH*2I->~qYH)fRf`XBmW z%zOow`tp_CzKxyxzY*70!fqR`ru=>@_R#}LimF>*Y_Pv7ZH+g=!BcNp)a!l6_e)F+ z(`SsdjGcGO)as?CFAT6reR$4Z z?JQJd4HAy9)R-0f8Fv;6v(wKM$-h-jOX0D_*Z@lJ3RlK|Cp7V z5jO!(ETx%lCl+RR{`ThFFZQg#P8ZX(%>OPkzfj-StVmU~@A_%UyLHxzo2tZpO#gmu zHx?9c5gEmKtHdQqw=^djFsP$P*SHWcc%3~6>n&+N%wJE!uTL$9R&uTjhRx{%l_^f+ z6P{nu=hSnsyw*$E^=yDHJmMphxcupM`{A%E+sO;2LYHRZp`}OEG?xm$G!VEPN}P*e z!&{GzL9H`j@7L?@nCa13nh609{v3~pV3oa#Ei!Wnl3;HbQY74hg-RhRDVZjAb?5w* zusQx#k$>m?!vMP2#uWq5b;GbZT@!A`>MlM6iR_0CVDSi>Vz)qrzERcUWnJ)EpYhU? zP}&HVXvnFtCDE8vbxBvAVb$*cjB5EnD4HE56dz^1S?kaUGvTW^fVvoZKE>jzih1%C z0bV^r*#uEHxVzA@7@`Bp`jE%-b>`R2xca4OyDtVxR>Z}8DG`(sU{>r%l`QoEmbv{~ zcUI@%UIR1i(ZNt-dENNQHM4+^*W`-4i3AVGxxWeN@F9&NdxKBe!HUrmIHU{PX9}fm zP-zvw9k>*SG;WyVk@Jq+_)T0}Q_2z!@1C-uX5`&oT)*?ksxbkhD+D9;rL1p1urbP+;73xb*`sI7_Vn~Jn`S1c+IYEtW#-MHPx zENR_&F7=^ZESo~i<%gY=Xf4L`;MLQl;t}UvypWL4CIVw#={pO>iVaIbhCKpg8#TpLjaC8iDxynYrr(6K`p9KKn%oKfjJn_U_UX|*k(2SJ)7?Ije5xW8 z2|s5J3Ah^kTL`QXSR$ar%K6x7&Ar4Mc4K*CqSASy!Uo+O5;A2G!Qym!yd&wBMW_c~ z6p1%WQWztm5Kn;C>(h7c%=j&^G#?w7INLCpz=+#XO4^re`+q);<575q5L3VA{S|Bn z<72|YZj@FNH(f*OM}$S7P5|R^tj6!J6f#$|{w-RxB2E$CZE|{8(~NMz?w_j+?)xd= z-=iG|G|Vf6lq@AnI;SY?{J0o=2tC4LB(Yw4eDz{E9ByCV;l zw7^F$Ba@DrNp%iejYlpLBGV&#Dfn-Y_xSV19^?xDSjMn9GoOhLFY~pe)#Lq@k(*9d zjZE8#SQux4F>+0rgUADjtAo$Kruvg%gEr z!}e>~5>uN>!hYqk%(5+3s(CJCsOE)Drg2db2nzlwMJx>#AUW_q(Np>v1m;jwL= zqIf*>)I8T;6An9Mr-bQhKt%C06k2P3F)DE>*su`HJy(2I41@IoGT=%u8z~s9{yLhd z*Ih%|NZ0m?WlktuvIrLBs|@=0oV00k|jZ6eo8Ml`t4i zxLWHRje*GiD+6g>`Gvp#V67w-eI*Jea;ES=4dL9-%tPOiZ%=|v-QCOCjNe@5zys$1 zGG0eV&1CFtos?Hh=Y$yZhCkDM9jV@|o=Ry$uF^n8PR6jhGv=SPK9kqMWX*oq@UOb% z;FFqsr&!P~zH%b7gq@MK6&$&yzxuFB-24b&K9&l}hUKc{Gd;Rp<1{EGQreZtn=jj? z2S{g-#Rv)tUeRHVYhU7BKAH__R=}_1ytC2L)C`i=xw)Stz3}1Ts6h^k+6y_6sn5i8 zS#MZ~uw$M6W<{SUgk#CI@SWoDHXKasg>HZAc4<1XT_5Y>1izJtl=IdZb>27rG+-^{ zf3TWne1(y;_(gXE(@a8u4^Eadw<1D&rW^{j466mY1ck?b0*)vibr^S9VJL`9n5~Im zQydq|TR0{WwxWO%NUTf!<_5)ypM5YXw~G8jVKixfT)cRNp2Ij(+Wl7meah8AqEkl1 z=Niu`=b96?A1n92o|+zvYKcwok+vE598o9wOC-q|Q@uH3&L|Xz2MeF1Miaf1ZwyEp zPhsM^Cuv0oYZ0>Qe9$VgMKmtz54bsLA>-<|a1jX0pxsTZ@2s<~!ogR{V{jq4v*!sM ziKQ;TWoK0U_4ek*X3gv&-#J-I)ENu@_-Lw;646f?-cbU8cu3Pqng%E1;9(F((irKa zRq}$#V%_%+^mz5NmgvY*kXE&Rs0pEPZFVH#G)W^PFROIWA#x!{XZdT%S>xsW%wWgn z;|?*W_2Qb?!A|JkSd?8kYm7;|0nZD+Bt31F8GO2m54rE~sK&baG&yGDx1i4c%FIV| zZ#XmLT#Ye!pY5Sy&t%#4#*@4yS1g;33CN}rU4%G}$Dnol4wvCd6(g!}5i}MU_&h|P zwHp9^vXV&D#ua3ml5g(6F!OM|iqG@qz>;@hj;S)3V$WqIDeZ3D(p%qWRj~OdxVR4r zR~W+0lz2V?kPFqEcrJP#d~Q>rrW+6?yH4^?#~z_fD%US*{ado8rh#LMs+((>S{nls zG0iR*h}%&Gmh+4xkXh8d9oI?T7Td(KHQqA#4OWW7Nokk5*D%o%Fgq-Jg@R?^s3qU^ z(F#0IYj3=eQ#eg)qbA~UrO4}CeWT~`YRv@f7Tz(7iCn0X-lhY?`OQairO#6YsaY?Hw?qNDK3rbFq;Bpotq=KxAXWGc zuh*x#AbUU^@)V|avFqMzX}}HcusNr}nlfi#nL(}|T};im6*J#$eQ%A(V~(ewVYBP# zMK0bb9fd()`tBs86c8E8*)$bQ*mT~WYbCkkDei}dA(?&%?H6>pR^?WX1&K_6BLxop zUdC%j!cZJOd=!C;&)`@OdQPV+C-*i}cj33C*Jm#}O-mmQxO~dfTw)r#CtSpocfBlm z^M89aT9(t;yeX)zbep%>DlH}&J@MH(_XIU+=E-T?^y|IQDTB_pRyBn@j#_kGu3!y* z?#KPEs|%R?_vJm0Hv7byr$Il^e!w}Df9djVvr4|8?MESS&%G2#iBai$Z|S2-f7ab} zhvQE$Smo_inT_%;UK6qH$kd3QLgIhhpa zUthf9toUcaGH-r9(;6VZ-jq?}6+{VnHmI))j$(t)H*+JT_oB=W!uHVmg1w5w$a~2!~ zMg`}OZ86b?M_jG>H;(&JjOJo#n$zz(M%t;uJCg;Ls@Qr5oQNc!vG-P99U018gB*LD zg&?KNOT`6V93(#NKr5 zF;z+8SUlI%X4qn#iG0HlPn6Ng8yri)w+re&E$-ByX~WGjA?uD#9e0>FS2wp@-7^jU zQo*RgVlPm#W(gposNvgab1X*7rty2Jr^D@be^$jTI5%ORkv2g2Zdb z8xug|AQ9S#_F_Sr_1{fPM}0{D1Tiz)uCD{G?)-+-s*%sUc$}He2r=fDvg)#Gyg8wW z2856%lv?EH}&b%>XNh<_jx?>ZQk zu(_jY9wJE?<}?wj?sOtd?hM7BgIR3%&RHlJn|D1s1%i&iGcaK;El>Q1ATR2J(&V!5{Rb zZvoWC7%~zyPb{D;#+!l^v~Se%_+nhwUY#vLoxsEAs&(;ti zALsrJ&^;5&Qr^Zw7>rAIn+$%b)Zb3l3 zOQ;7-r^r=Yh}O>^USsd4s~mO4@YBu+EiUeQ_r3(ta_ayQdw2fhD5cYEw&o|6oE0z2 z9>*_pD8Gp8wATZ+u`j-q)&zsD88cc#58z+`othrvd9wZ(hwQoRMg8lQ`hDtM0E8(_ zxva@UZeM3Ug`%dbfs%KFJ^X~svNV|AyibMA`BP|NzA5PT&Gti0EiEGGqq?evu{tCc zWY~=UGC=Z*RCYrOW?g5$%Mc<)i4n?e< zVUrh6&Khy^46^`U3O>U6LJxlG=_(*bD&}MJAc}xweSQ7c8eIQCtTxS2pf`Ho4Lha? ztMIA1mnLJ=`*mgI2Ne2I4Hb)O1Jo8mf(l+1mz9Q(!qAy8Gp~^+ha>8IM*IGEK$Li# z@h2YREy7@OLi_OE+7W9wQw;^?vcsVhufFI69Rq-ob529PbqL!D?UEN1{o{a|&8!A^ zR(cXwyTD4e{7#`sxg$}Z+RCw>LkdKS5b*4%T?TGR)A};&Z)g#!ta$dSXREV;jNkVT zMbe6OV`750kmAu*9;3;zB6Z&*mlT8Fq)5OUlVYr{*5n7xo!4CS#9~6W!#d0fy@oId z>~L*2HNtW=`h1SzHE=G+VJU&Qn7s(0M&PREz!!+F#ykNu=B$t?ly9nE23v%K6f+C+ zo#1*50N=VBAC0#+zL@wEjrAFQphYlaJFFdMVzHRCQa`}NpbtcWczL=r) z&JJuZph$^X*r;keR>WkbS#2`Lu{yHss|wu2rS5mYUX-R6j6MnW+1AkF*N=DAP7@En z0#bDW_J-tlcQWk%2n0!uBgIV)Pveyj4$!ccy4Ac?{OZU@qnyZ;+OeM=g*2^92Wi3h zRYgAuixw*IS);IC``o#e+p2zA;GJT@mQ~{dkAl*D#jS?D3zdc8d4f0dAxwxuM-O|; zz}-)JFm%cSCpvSJ^x7hAFw)Ey3jiKnSjf}O#0i<+R;wBbZJG>rdPBX%j@JRwNoeay znehC9&U%~>pj(UqStl=$g5R_`?Kv~_?1ihgrL~WwF+r5bU4->tP7gj0G{y#QH9|Ru z^;7$PT=S(W{#W;OT?7i8Yr0SpFPzNY|= z{4ckVrRZ`#fuxgVC>>!DQjr(sW?QA{X=s2svHyK4u2YkUgmodG6-GkbZexzm-&8x+ zoDXj0P~r_ab+6xQA_(IfzCDV&2&k5A6p_HicO$DxaFj4b#O!<8tsUQUDP>IvaDVQuD`*(S-aVSY5*XP~oq9egp>_QKzq zqzpF&r^Ln+oh-(wr`kQ~AY5 z@hbMtm+S_u-@SCeF$xs<44k}YGK){h6p?wA7iykYT=@GXT{yxV=%(*&9qIIwBV2z@ z6KcRH^7o|+)>;F@#W8%JD!@l^l7EK?Hh)u|FWs()Fg>@x0-BvUk z^HSjAyba3zIo!4&j$JU_b1&c1ksUDww>QcW0|lAkox{$EDUXscNQJP;4k&4)d*b z)(vO3ca=l(+xrRQ8rUMG4MFb1VNJH?9)(}KuBlcHq)H9p8johwa=cxd56~vTlx*sz zhdJJEC?AlV8XpSDAQ9iVl^m>NhB&HOME-@{+pL9X!%=q>wwfp^>R|-mY0Kek2zhwm zF~H(lvx1p`DMCMNZqf65E~XPL3@1tW#*E5STs2h|Juf5U&kMvRyh{lmWzx=v%tsj0 zhL4@S&-<5jL`^FTZ+RV!D|=6U)0mG@G~kyz&weR)5r+Q=kr1FhKs-OqwsN~_abEmc zO+c5(AHn#Zrz)@Sq7P&+#*3Z(H_;m-ct?A7+Kaa!|i+E9BeTR4( z7XP)_Wt|*ZPioRUUq=QFf*qNA*~*bG)=xAyhjySEK@Y@?8A(~?x28V1DYa|U+1NO?zv z8>Ue0i=zZY`S0vM=UO9BxwliBGURCk0M?AwfP;fyDY~tB6P0#SOdL@kC$b(z1a&+c zNYtR{))anR?EAYn{%|XVJf)w!{YTZY%q&x&3lBM6;7e6$%#JL3rU!mf>d)!(a^>EY zQT^?gP#w%7^msn%&h4m8fvAWJ7kTK7JsaBamDtP#+Hjk1AaFGi*tVe8gub31IIfQ3C}oApZb_i9 z;Y4uo1Opea^`S(h0_UV&5@0f=f_bm{RR}`c)3P3&a`#+8%QU4o2g;7Ds2GLn8O19N zrsTPKc~Bt%am5zHU;n@;%I(Y?fiZc1v|86Zgs8EGRvfT)$Z6=twlq*7~X9;G^m^tl|oj>Jyt82mY-EnT(y{0>{ zltKaEJ|L}&l0*W3rF>2r7k8roxG4&Jvw?l(D+x^Dz$b2cK87h%WU!z)rQ>hQC$mJH zFR5MHbE*G+WSJHPsV8wSm|`P?YmT@px&9v47|{osae;`XjA#`B z3dYKa=KFV!t4@<|>R)=W_Hf*aPls4AUtF;fz?Z7fhcxpjj~REX8ZFRR1=dV10`9Ou z^l$^!kN4VHZhrOf-kKaBy~+cU@hZ`APst2@KX!G_{V*6T`&=_vF_K!_QVgz1H99-> zhE&AO#Jc{{ce+{4(gHi;S2Nrn$7MKBjWKFCN-BG7P?K4bYbyWSz8|6;#G{Ab1KVFrBUmRME5tG#1HbU2!?qF3r3noMSQo4=qd3 z8+$-mQ^bN`;!=^y_L#1cbI3^_SlIYUWpMNW`JAONojZ{Fff;kFWTYmiw$Ac1JB-(Q#@`XYX_r z6#idGs_GW|bU4BGJ8 zJf?abg!Z5mP|@snlg2uwU{O;V^jk=$*rm~7-aSc!VzZWX+`u0FWfVp7p1;%MKoL}R zG6qsAArh7KUwTNk7pfsK@9_JSI@5%C&`!q>hV%QDRKT0Mz)b|jPs+$TG6)IwtAcS5 z?1*M|vG-Xb%K3JepedY_-r)E-H3(>C02oX6otbz>vE)UdA+SX4|f_?%> z$#xm{BLi}V)Ge>gOQw~=U`1=a*)|s#n-*f_HYk-dtv^sw<_3`8kT_b7I^l~=4_3>bcGPN&(sUt)NIK#3(Z$UK{U&t6(^90|Kry!YBw?R5ji<=G z>gUo2Y>VTwqEh}**kE0xmSRKa8%`o7U|+~}1+2=)gI}uW+00*$V#7KvtYzSiO)9;k zLE~vi=OWw6N&o`2IeHm0N%jeu6(k%SY&ovM=`Xshfp&>yh($$*G-SRa(pM!>#N0{_ z=xn(hXGC5{xBZ&_yCHh`G95=}EyO>U#dDq?c(jQlt>%`S)35(74{vJvRmw9T(JVR+ zpDSfM#V0ofX>4+pyWqS%;!_JW5V$C@+Z*U?SW5@apbyr)9mLJ32n*5}q-k|+CRURt zeSvF)u}sn;?4l4d&7aw_h?4oIqHr%o3VU1T;X}ad;`%pOvkPMxDGs0qi~x4L(1{Ob zVD;id`-r@*c^@6UnV0IKsqepk@k{XQ(#PZ_sb+`#i~z^cuL&$~HUXSmkb!?`rMoih z)25uyuN6j%BD)pwD>wBxH=bwT$DXHD>)0;NyQcFH2}in8>j4X6>8{+SZegXS#CAT? zFa?z~A0$8=ANyUcrr0aGuzBa+xV$fJ`amT-c|7vqJ5r~nxyP~|QsN$R@tUMlV~2_L zw|Jd&Srq7{L5s1a$~8F1+`j{49z(xryf;2to#N@J!S6?DtMEY^*(D1~3!Ppm$()Qe zhM28kDo8_KU4keCen4t=pYQ8%T~6;PVXK*p7xJ=BVWy3O$}E0V)h53LM52b|_q3Jn zoya`C*;bc1;Q2AZm7;y-t;+)eZotPbqNhbCD1E3gur>#?>&6lrTMCAemgTk@tSOVp zJ=mBSQxaR11de$o#DXY<+fV3cDZdLW&#_;2b`1EB1DNq2PuOK5C_~0VhLz{tfeq-b z=K<3~L064o6c^wc{Nz+ZNdS^xAo?bh29#|B0bgjh=A$Eh5hu_XBW?Z#tE+zpO-3)< zuy-XYZbq}&qU`dy2VoYedv)IRYY%t;-B64p1nV3D-p4HCT`$tgc z!->;K17h@Ee_$BSZfo2lw>+8jqEQ&F>MB6_SwdmlDt^h%L+NKRJ3aaag_C#M zL5h~(prrU1R!Z-W4}NlJqbhC?VV;9G{Ga_^BT-@4P1)s|rOI5Nh1;O<@r)c}lo*%V zUjk@WBOQlra@DssqK3um5FPX7QKWlfE(B1o@!yB_X>(4T=K^jzA zNDr%A3?I!2#(35QtQHIYFb+y!#_*bz%iB?+MO3&!U!quzb({iPU*P_vL6M=QuHwme zGEYkr0k_^Ps@Q+A%@B6AFw0=J38(twlMkgUb1HV;e?@vc|kNt6~{*OX8ZTB;m_Y*xV8MabM}@p^I+p0m4{gW0 zKi!0~i)*vRwNv2U!O2b+-%+K|&!nqu%)!+)PM)zEmyX1pd@hgd4lJ&;(Y6!{IIf85i8DIFdM)0BJF z{c*9xxLS0A7w(0bUhMi%5|ND$^sqZf8V$-(i`jjIS#-F9_V=fh7gZ=r+rd?atMk82kZt-p`sN3^fuwo-V1J`G~tj;$8JR; zea9`MewfZ*Nm~VwD8Zv<3%V8f?st2rV4%?VqAu@!fAwd(qn_n7NT#FPHIdBR`0Zvv z)qG}J2#KO!eO2s{W<4?*1#S(0b;?r#zHFuP%+$ zaIHkB;j!xRwNhBGF|}v-Yw8$0rGxWihc=vN$Bp6Nh{~?=+;^edCYjXj9vqB5a;E#E zO3p3TY(^)_6nqqNjFN-AOOP-66i{EBy=o={0A04|2#>7Z4vaFymdwKV5_2-k{f8!7 z=t8P{AC3*)RUl$Xnubc8(WkUd#i|S;c`F|5Oxc+TQ1NU}fK9!`&O-_$=+oioW4QsneqDXF23w%)Pk&gCfe}Tb?E5O;KpP z+mrZ^15ON+5Udb6L-C&V2n3RkMLm}}*})vDQ?KG~V`J0QX6HeN{-^E`OewK$)HD-| z4c3oz<8P^&tSgoU{Q=U^VofVTXM|o~G-h14pWUyCqll%$tcu5Tk6YF#5D!52mb2`N zLO_+7dk3fGNRdnXVG2{UL&pSfX&K4s=uYODR^Ms&D21bGPlt$n57Y_%Pqkcs#CZNO zFy|Cq)0C_6E{}bi(obs#?g7Oz**G`sbiP}?(tQ{NFDW^UJ0ID=k)XHz{JIZ-j?A&I z2hdB8hAq`&eWp$v@aHMQFimTUI;V&CAnd}{6K=D`qZbRPJe|}fzMDdzl6^2JGl<3h zk5G*AX@IRjS$%_O3Di+OwE#(wuF>nU1}c8%fXUE zkMR8cly-^Fl0|6^>CYVu7C0P%&ub`c?)RgE?+n-FE#wF1!*EwhS_jM)GDArIWJ3_Y zDJI)}p%Xok}5c-naw^3$<#WLv1M!rNkHumnB}ycr1vS8Rr8c!WEohc=cx4J zJ)z2L6xvs<&g=gp#7(2i^I#37&&YM@-;1m< z{d1NFhPm&(_tn?$`t9e+hC8tbYlJ8IGhTNDK9_@UM#DyCUCj!%#?)R+eDY`=5O?ImfUW+K0*?jLHb+uU#|>);O%_^mkXB%)`G_^TglVRQhg?!^#uo1LcC1 zsX}Da<7s7=4^Q|*6)&=1r5M*I+do2tG79Dp&C6P^Bgp^Qr{39&R;1 zm7&X|(ccc|LDvtLTkL1!rFx>JM!!qmkF1At^~Bz$9RUoSEA^qGVR_cOxNP_Afz)vv z=0s!9jWQjR{!h_(-zl|nCM^=+Cp^cV{z!!^;y*ar`XXval=_QSJs7I8FF~! zsLC@p#V5_LsXW?s;9BX5*y($!${&=q;xuFP?qiyRz3DbUALsWhOT>>TpuHb)Giyo9 zHFS9?VE*&Yy$7p9T~{_RGZFYf*$B4WEMwzR(2uba1=3nCuA>zNdr$}pwz?IFDX#{S zSq*Y=pW1@lwXJ(6(9o7opd^lFE6p#=!tyo!^7a?)VU|Wle70FmR`Z@!Mp87C+FIYy zC2wq|X0y60*?sXA{L5BB^T%wrZ1iqw=&e1 zLa`T)vKoaZX?*dgEnSLvAB$7#y;R+Zxw6yv_a~`$t)n?B`gC&3t6vz5^0h_z zr6q90AG{^)Ni?IsOrm$tS$yn@m9TC!nH`;1JchTHi`ebg=ARet*IL{?B@Rk1gDoi) zkG`kE40mk?L%i#vZu@>V&Rz~vngINMw^+H7>_I&F%9i*Hs zJhX4qX;LM{DyCc#3iz_Kovm>>vzpDHz31nc&}>(V;?U}N^xeSQyj-&L!+8%gTH~u~ z(?jfH$@dC#r0bJFPQ4apo))s*o(>Og7SHa?XpEM8i~*4r^k%<<*}$AUd-4j>+t{m5 zqc>ISFC$^<*qV!L!+9l`5K_lP+qvVZM*0^VVy1hzc`{2Ki(YtZj~W$+EW{6IFBzfl zzSViI6UwMX6Kw3$=@D3a7iYgS`uXwUDG z)+cR(+N$VaMZUId00uo4aNX4RO&WGK8qvTmjFrdbr&RqQKM`e`c~f-W2{x}fy1 zd;+#7hI;IE7^B7ZZ2UuerwPc;D*C8-V7uAZ)<=3e6+A0XqjZ&K*jFFxZ*gdkjAjq5 z**2LRT$Vmd%JVp+y}?aRsi!e9iFWEysT>ZNA`?v>@TYiqHr~mQD}KZ`*rv^=(lOET+5Wd%utnu8 zz0%6jKHAC4vdPHCW!KMLt@*yyy;43FzeJ-IJ~D>_b7!VODLK0zX#8Od`4V+lQws|V zE7fD!zdX3UITnk#r7kTfCDaayPi3z&Xmo9_iNqt7YE{BCrsc2fs@R+LDSw7f#S&)cMnL7 z%AZN2T|8o7lW4VCm$cwKL{45_ua?#Fn;S5}slb@}C!g6r#pWe1O>^d+9p7Vj@V&r6 zX;QY30E4G&a87&L$~yIl>G4h(8vJ@yS79C4qlfb6%*op_GI#L5wk9}Q&M`6R!ZkC^ zw?1?iy+%O77x+KBpI_6lNv_5fKdq{x+_H2yXd11|St562ogNRTW6uw+dS38_1)5u3 zpS@3BavS?4DgNf-X4Q8(vKxl5w4>GBcJD)-i=lKeC&5+NIc16DZ>q?R3`Tnf=?!fr zTFJ(~Tw;e&DC{OZeLu0cE$V^q-)fN;{G70u^}RCosD*}2wi-}A3E0R%c;c_W744r(uwC?K56NcFer)R; zj2ccZKh5!f*2*~Lg)ONy1<$uO$rh{lTxr{)3-6E7FDS|JPpck3HS?&2X<*+QggXr# z6?Uz+|A>s!fOSW0I6kt>T%Ei@m8WO2NO*&{W+Ew^H zY$JfGWVOis{S)smVT0DFA;|dnw2CwY(%H*cH9n256*M3ozPefjGMxo1b&ky)(DWs+`f5iOa7bNTKH` zTX}P22u40U!O*D^sb54wa@VeK2PjL~h+6jY)vytpuMaA_ma3HS1EggpcG>7(|e?}7D*vh_DKH&2Z z2SPUPXX#7$zow(8e$^OSkYrnTLB^nI6ry8rdJ05G>bgvoG+Y;9@=8)@XT zVvg11?>IT8@pp0gOSt*h|Mladvmf4~1|98(ocqi4p+wM4x+_sr|NA#$q3}yc_Ubvl zehX35C!X?= zHU6097&Wn&U^hIRV1|a$e3gcLQaUQ^PyTsaKzPOV@7C+zaj7PUhobd40xgkctKo7$$tLegnQ-lBP0xLGYG- zl0w0wvZUP)J2@X!@Te<*A|{4jHo+|ycuF%C0yH{U!v2+g_p1w7GBmLfe?8iNZxDE= zUiP18N3ODI^c7<0X6@@Y$r$uo5{%|H3oXH9RVY~71WJ;B!Ed%%bbnp&@8;!PmnD|S1b%IcS4#XOV1u}x zK9t4>d+OKAN^mWb0J@pj7GOyGyfFr=tgOsv+TkH6i#lM+qPP-3tjPUlu>_Xa>97Qe zXb2MN<+L#}_|J=xAcrbd{$ygOmhhkDdv6|vS;&)rEo82;BnCQPa=s8S_Ok8nx{M)W z`fBp8g($USK}mAKLXe`n>jHm#1QqmTc5+4!+izAxK;4NDoYV40tbPd`zgZQJ_sci1 zpbQW|wnWr&n}%TW%?n{D&7%ug{WCLA2wCF;OESXtFz^J52gSGltnA|wv+q(27T6#l z!(U423#e#1)?>uHj|3Uno68DNi0iLQy_>XOvBAN*`n_o90>8tLnxhn#$TUaNJ9`qxUc(>reOlw7DYb z`+Vr$HGr4gIT-DC1d1Gd{@qm$=A2LxB-kKHfzEaMKYh1EJuZdUG3l@;_@I}l&n_l7 zUAFgo`u-&_A=E@d;88tLO)aha@oAn1o57oom;(Fq>iH?S?$P(2(!LYEh}Be8Vy67Z z9fHn3o}J~@r>Q)<^Z#iD!%^D9F}O`f9w*EEV5wifpG(noaRvq&#*8Mr2Gtc3k3m7)i*@MAbqzP|JXiAnT|w2$6kr1e*3 zN#7q=aYXmCjyJ#1(EBowSflGV(HJ`}lyEMwC6u(sKw{MZBq{>dmn<5w#q$;z2q*V* zwXQj#wY);uj@hY1wPLzIYuz)h!WmVrqJd6Y2-19(m zJmdVC6v6$>Z?;Jj+Iyd44a22`EB)JD=(ETsqortkv9${flc1N{OzwhHXlM&hrhhKs za;_kjOYQ1Vl2q^%Ns-lc-ajiL)T>Pkx+zTqPK50IL{iRAWQUU8pC^3zj`?xGy&EFWS$=#D>1=wvf)^pz){f^_6#6?^JC|Bc)UM`Ge|D%A-2RGIe za~BPqg0OI@hcGP-d`g0u_}tJIUy=gBi?OKRP>v3NHi5pjcKNi(TTFaaUHmUiJbGGU z2c6dj_7EYeNB+;xz<8@Fl1zLEJ}p6_qUNwaco&lJ^JSbz8a}wW`c=ihmvQ7yv2q_Q zgZq3L`_UW$5+88DGD?Bv`YW*Gzg9IL(O4P5RXmM;O$hDHcp+o-+rKiL`&T8|*Y#jk zY<{3}a6g-1vc`2wv*hk|j9D!HmsuQp*b_qg&JoD4AhWsuKkn3TpF6K4;WxXDiJ_O2 zB1ti39h>RgtQQhLpOU7*$JV43s3L@_3>)7BV)x+OmPiV$0()LX2pl-M?C@X6!TxIv z;1yxex5E7Z*Qicg$!V*{jImY(=hg}-u)fZK<<9wD!d`@`LYHIFuB)r-|2`VIDgKLJ zTg+I16e)c6A@w!p(3eQg550Fzs(?UZR?&}?UE9mO?HX{atxc2=0+tKs(u+6yz9a}b zF9(i1ghub$pN||)Q@GWtnCtZwiq!-+?qb6n36kL4q_jSiZxy92ft;B9{HPu0 zIv*3TKrp9ZA2}xb$5ZekJ=}L_C^kgDB7*jgT#{?R9CgTzb9ve&e1ZbDJ+Tp_^W;4P z8LBD&PNe?#mc4M~rDL8~BRGbtSLWUrsr~S;_;#VaBn3KO08HwMsLL(|a0B$`1_Yt6 zhlk})BSBM15W<6c^9M6X^R58PQ}r-vk4nP-&rubJUU92QQS9eA2VX`1S&PP4;A#z2 z{uM8{z8Ry1j4OfjPUtT-`O{uqgggfRY0k%d0i8uKX)ULXQGb%`b7T0Z53*10cLJzb z1giEnCisuIS}<#jAv;fKx~QMI5cnkmW7vC(kzEp);eS>Onk6h$rG)*K4{(5jw%Mfl zhIQkc4QCfU*Yfz`fW9HiqQgTUP(;`Q$YV*%b>VMdimSvB9}i<)IZ1z?+Hd`n0KlPL zPu*u2@3P?y8KnY(S$b~wDZQme#juX(L3HFBLMr;V9@f8KjYY)In<-I|rc(5JO>-le zp<5VenN}$C^P9ClssW^1Q0$5<9(E8*n4JrJ@pZ6b0M|>U?jE?3gQ16%pgoV4^yOqz zyrthegK!D9)HVQq^M|7>O>e9;^|kuFztLZOra;Ln2DBn};PsSn68dIf%ZfilA2qwouZ=xSw@YBaT57TU(48N8bAq5GIb10`LNLc^* z+3(J<=0c9D_BO@4O;UWtn3K}!)$agB-M`y zt0~y65`=F_k0cr*05hr-OQrAGX;NW~6AswHr^4rIIMEw_pZ@C*Cf_Ne?>znE%AFYf z@f%J-dR8u$i2;13DZix@9=?Z|3+6}Mt50_Ymq zO*~A3gDtUvI86n9HVJri$8UD{X)y<|Xldt%e&j~7!iz--4!zQJa_m1)xW+*zLCf1^ zra>IUS2)@>ivgFBzUZ|bc!V+^yoZgr%V)P=vt~YAk@(;~__E(6lK0oJe{Tr%44T4O#)7kOyDUHC0-_-JPpYWE*gl$RBvjJCaj61%^h;ib%HVQ$2zU%8PNF~Dg zRhk4f@JIC6sUr`tnke1xjq+g~F#>sS2qCNcv%GU)W)rqgNPwg89!>L`D!&d1r4Sql z5nQ|}34Ua(CyoWx{VjD7zoqWNNM5hc%VlaTXla?mu8t@1AYZSxto>$Z@Bfz~Um-vc zvPhh(@x^4wIuA&*8=cwvuHOVHHpr5s3SNNJLZus*5JX*|JhcA7yzQUu7bd=Z{v4~x z*L~3dvyU7#)-<{Z&y78J!kzD<npL}lnf0X@LhWEi=cnn#S2&)4EBBVp0-4!$O*$5_A5x#-kK#wPbcV$u|a?sc^-a! zdu;`V7R!yBnp<0a(8rGf29NmQRy((!`%Zl!7)G602@f|R=d;xvr*s1tM%&}vTiW{i zwz&Gil)`))wMtK^FXqEG=DM}3LnI6gl6sQS?k2B0I~DSPx(A^8FXnryh4s3Mdr$(H z`%#EmHkIfODAHr5_lnKC)&b>8ev;$<7^p{7XqLE)I}8mC?N2)PF&^`K9okO-3QOXH zh%3?6=vtst>oaGk6~PpDn|sC2ye0swB;4{zqxFD49*AD)FD+|p-KhI4EzuBef zG)enchI)O&QJ0z|VaR;NKdUFEnm3aB5WV=-{aYUAbDR`1K(in9PWx%-4-uUeB|&BfIkGGc4SnfG0_n!NqL8J**rc z-5EBS@$IJ+hnH(x`qyauW_vwzCHpKYXISe2g(nOShu<`}O!TRy^tAQyhV=o;4EV^D zi{g3<7**fc?&4CMRHXt#?Re{Us$T9Jz!rw0(ODU9M>aYXHpG=^D$zY-bbl6^INV3H z0vcJ`y|OfwQP1_b@>k6;09fTXp7eh5j4bU8&^6wydc6T$uC|_Dob`<_&XRr|5zG_d zWDaCRYmQfQ^hbrg%X(#aE!~y?uTDwDv`0?=%4LOZ40ydu&|o447QzZ zKl#n_&v*@5bjOZ8<*yjGX2-N9Z~xCd;>3YCPIZOOQDWqO^Q29=z^3nPuYlay3E=xG zW~xS5kG?%7f=-`3zohTHJr?W&CTX_Hl=-Jh`vo>jF`?7`o`ubS(0!@d%^K#hDQ+(b z|JmsG=Dgfs%=uffkwp^{+XXx#0Sku{4jOqC0B11ajlJeGT;uAlNM?EJazl<3O2v;z zT-d&w(b%eInPmRUt+s!fRGr2RumWjomGy2lNPYz^AZ6X(l0$qi_%am2|Dzox9CsNh zel)LP^g+!1b;D7Q-T3{+OjP{eA|KiHnLm&F(u;WLK>z>G!d za`-)1$YUUYdAv1%m^^rG-4!fd40OIW{K<@z*2C+gzE=TwcyV!YtH9-PBVcV&2_@2h z2&jOT@Q_xbLnby(eU*VrW7RF+S>Q>Gg;S3|tCEjkDqC2Em2P4X!$UeoaCYrnxvE6A zi)%SDBe{B}9=tpTz0~}b)qF%FpSJnZ( z*vQVnp9EUJnw_IWS}~-cps)^_baHP0uq$h;tLwr1(}j8^7O21<*-sCm3T%@PP$^r& z!066|(xC0^{J>OM)n?g2e+R+#`>oX!n9&Gw(={MW|BwTv6=wk zT49Fh;p_{TbYjk4X*RJu9x+s<`Dsg&)u34M%<2AZ>V4(u?o2g$_=rJ+IUta#+uIVS zxoZV5ho7vQ?dp$Sfi9)v8um+IiZ2NtOd2h4=*ExUxgB~XcAIVJqHJeo1fuVfK^$Q@Zw8~!2%ld znsUCHj6rA#{@V>YQe|k?4VWrYBYH;g^VtYadJJ6ms3QmX3)car#^uO7CVhOUwUSXW zTG!k>{mg*vZn)odVh|ZV*|i1v{vX_#p9OZkcRPeV>*ly1fYJRD+is_?AG|{8^v;|d zw|B@Re#oZjDhO+zM=j)fnEtBW@i7k~c-@|yAF*XIBccxqqN01>BKCi_ z>@6AVb_~PpOaW`#W!n4;104uJ@d9Ss-~i=rmE(!(WG@)yte6acCJI5W>HW4Ptg2){ za>p5s+Q1k{VgYJQ3)SPClS8GqpOXgxld%Gzhh$>5<&nL zNVsbI#}xJgAgQk}no-jhG_!5Hf{b`r`(bVDCDO4h`Ri-_DUcFInH}#>$g65IE(MbN`ae1wm?*%x~yoieJlKZB>YcgI{R}8{8l=ME6X11pOBJ@*9@u z2Q&$|O;7X?!mojq>vf=5#{RQ)&w{v!F3W1)wKr?KjMVUVduRzG!kkibxud%xjX+HN zT7eB)V!WF}1aD)Bh-gQUH6j29*NUZYTb?}q=dg6FtR59oaDK;h{;NB=|m zV_-BZESvPCj_tB5sNQE0*veN+o5 zA@@I%?SO<*8iYD#MrX%deAeIETSZnbV|wEnpS)(H4UEC0$WDotre?Lz)zTjRvp_Jq z!#kDA+QzM4*}mtPm!hpnQu5*9>-0qKq4p?toly|(5Jz0TPVp2t5>?=(pLRan=~#V% zKYhTY7|l^OUFYdpl2<-Ha4m+pAbaflQyMqG&1^rtg<8;LJbp!vDBRwT&f~S+1!l7l z4EFWUaI&%%fuX{$Vkh?2v9@Cnq)y&ra}45@^KogrJJ-%DP*mZw=+>PuzNC{c+U3aC z&&vNU2%f83)STpKM70HMWDf>t&aVODxflZ%J(CDgk6pQ|Ht%z=k!KL-2?^i8b-=?xK z5lB6_>j%-hLwobW=SH1|FPj^iNpVSINn;zy?rZKJ9sMgjtUVJePU~DY9%o#;Z<9@V zKk;M`{~o*{61;x1($CW>F2*F?L1yo( zK-Nbd>!AVNfjjKxk=j*CFO7p!01&cIZKLm__>j&fI>YnPNR794h6+5bh;>SH3>}RS zW&crI2#v9u)8^YskV1cG;Jsb2do*~cp7+>!$qxPybwW&~cyf^RrOd343l#W^+|l1j zV>)Iw%WQm0`fk|N+3elwGRy7XnaHSOYRx! zECTqvvZJ*E=iVLF5{sV6!3ZvP&&e)LXh?JAK^wKNZm*5Vr+`g7(KS$2Zr(q;Jwfd| z=2?}U1*-_jGHN)~o9?3N({7$KPJC(XZ4tu>TilZaEb{Oft)23Q<5l*ZrYqF3si|}s zM!-*M45llRp=zhT2s8HwCijb1^wm`7$D@;n%Hgo3+Xe@|X9vCkT=F(E0NIu#5(B93 z8_v8;SNWeBKOPfW5w^+E&f~dl3WjfNmfU+eD-CK~Hmw8FJDoMa^nr4n$KIqe%4@$S z4iJwXS$7caBH3lN$M7oidtun3<2?Vn~bjrp&G?`zrI&!wOhpbQv+BiL94U`Lha3nl>s ziFny-JCXB39=le(p>+sW<|L=^F+f{5*~7z0?YZu-0}3AQBLL+i-UDzqb8wUnAkoHB zjb0xudJ)X#8Lg2LK%BxC!Bj`_Zpmp15az&-_tuvB=nA>iG>ccju%I0SFM~pOW3}rR z;=1VW9n>YnhEzu6sOw64j38b9bvXnWH}X_SjIeD3v)^#QD{^=1C-{*K_SpV(xi2Fj zKII60ma53Fk8whK!Ov|s40EW*0c04)`)vNZRZ!CtTDRtxyxoAk;)jJ5X7Zt=jmpz) zVkJK_9~kOlW)IB061cC)6IeA24~pBRpr_wolP&@-%ZeiaO`~-0>}su0uRs`-oSmXF zYWck~Vsv{fZehq-+ySwaLS)#}HsIyRN0YcslFat1_GP^T$UD>l^J>oxnC&L?G`+*J zqmIS6q9L{LHJ~h5m)J%_ewy?_u8_&yJo<)@hB%SCGXBQ z$m|Wd&3+1@6prsr5*AD#I$P{Tw}v@6846fUT8|)jJ$;sV0tkul#ZTSx^(yV3bQY;$ z^+m&6xMFIF^F7^!iD?hP=&*Au`9goAg2biEyZDwmCNQD|CK@?o`Brr@xz=e=5TW?= z)V3>92z&&i2zS4VxAr~58ml(SD<2u(dZRWfEC4(A z;#xsO=uUPJ)4J30*M9fw_FZ!2k&iG#o1U)^#+FigkHZ(YHw z)@_eE_MTOE)lPm*;;+Vr8G|ir^B*OBV!|t~)CVGG>M3y;_c96S5#@J=jyz7q7h_Gk zeNdYT!we~dGNF70b^Gx;->wR?^7Zp(cFrJB8+AJ&Vyi5UlMZcyeI)VA2Zi3fs(jHE zC8ijjP`i}$^4L zeAi27NbyULVwi3**DPtSgDGG5X625`lBZ$j?OqFD(0c%e-r8l%eM#!IX%#-LK=hPM zI_)2oUgEt3be+#6aqMICwM8w>(tG`O7J{GO1+?b`GK3>b!emv*k6ag_O;u?k?%QTN z7}g7R<3VNE*m62qlsw-KPZ4{d2Qy)pavjWnt`tIektNkSt_tIFtu>z*n zM9tXW!{7f5+zD`pUgj-SN=VTu+1IGNi^Ysq_s4j5T!}47(T~1{6z5cD>9F;g2BU%Y zm};glg2`fYyq(RO!9=-)fbG4li1q&Tu4ru~MJk+L-+C$NLXxez-lz=wb~L4D^nC5OQva(G0(Jn7WRx4qBxt( zyOj13OR-XvC=a!}0ym#~_5I2j;6gfq26hIKYV5G~^~2Uf?T`I>m4VE}-U9i0jUH`RA;DzX+VG+p>Y-V2 zB!^@nU9Wy^`{HKUAh_`WKZQiE^}en0a+%y zDeWQP_v8aEMW4mh)aZfXAnqdPx=psP0*gGq)j%sCCW9<#{b1y}zR@myi@WY#hl0MU z8zbxLM+h7L3h64MdO0;{Qp@s|YY}39J=B(=f*T92{!yY%p~_<~yVqug(e*X99p%>XuHrJ^qeHcNmPTShvXGFNYW{$QpbNu@1kj>WV2NW*4vyrW-ceXPJfu}(3H(G%q7uqn41{32q_IP1CbQQh0pK6Gs>FMp8NKUJ;< zHI>eEOVpgcmu=j)nBmr;9Q%xQYNTgUv>RCy^(9WMML^KXnxQ??lB&{cK6ER9duPZL|TK3+nfZdwnlc{nIT#w&a8lga$wWRuebELxo6lw#1@hVa zYwHtUJ3T%1`+G&lABIWqFlKU;ir*32ADv_T_<7K_HB&PT$^HnZf&Q&Uj7-ag@kDqaT5!@6d$R{+?(u+UD1^K1^F;|mNj2NdWP%abI99%q^H^FDI zyF55)t7x!FIsk%%BG=?ptBuk@6($W@UBc9Y>Qx19>bzYLX0C&Iu>Gi^HEg?$2wP$J z_`RLROZWl@!TYQ$`e$qJMz*e%dZ_7J1&8Ms-Ps_w^>p?@v{&)=gbOT zg#$Ufw1}8ceY=`Hwz6$E-a&fTWs7$Mghff-pWSp0A{%))Ad0C`1O?y9;pEJ8iJQ(9 z6v6aCWWEdb2eMN`?7?7g`#G0lEJKax*~yN@#`sL#oO1lV`$XQWBLzzvgMm_!-1V_b zQs4HwO6xrB?9u}k{T!!)3w6g+rSUAUM(cBY$k)hF39+Xw(u4OOnUvapr%QvrJ7xGF zQ>>r;u}BkHo#OX#1Tj^uCtsf5rnsNc02_OfTaUF=Di2)J6t(X!gh+h^pP=V<2Z zYp6zX@Qe|%w0(LFujv$}Mr>B?vhhQyR^5nYW$W$nF&LC*C#-5ni-HKdZq9Fg8ZCI; z)})KmL@QVVu$aBAwBD{a?dWH%pJkraL@*gByxfz0OL@omIWen_uj53SjU|&(tZ{jH zpZ%u5`@RkDec?^O$4*&^0Kp{B(wJOR$3RD#3^v`*a_gbaM3>d9UIrF^JA)k5Mw}%G zWk`K3Q;hVpoJO0jkSkj#MR(q&tqel@h>Xav=~Q{6_U|)Kv^N|pRrZltZ<(>*Uh84= zKsc_YZ9P*JIjwAC)T`qeOUZ#Y1)4P!ppzF=+)&~uitH`*D`U`>P4w)rMxW}4-k4sW zL4Iz{=NmAA)Jo3~-z=Q=Q)m+kQ1mbQo}p6c(W~w*Z=>Gr*|M$Z%J-$ld)X&=E52=g z5|a@fIIKVJD&jk)rY{Q(F)4V&{D=JWw}k+=-(A9|Ft_F}Opb_pkEF$7kA3t>-JWSE z$M%-4vosiPZW|ES+3p~er68=7z{)Zzze>^F|H=sJ67;S+heZ-3T+dt?4OU-|;Sl#i zrE&)G$6D5Hq^GE@TFBPo!EGa7m6A^aT{8hA)gl;cQM}2hz^wI(U|m~9ZSNaZfO|){ zl%=%NHr_O*lQZUfb}8Jzgb1hUxJgI+t4g9kf0c^(_G-Oc2Deia=%Co9f88S#V!SbF z-*QdGYzUM~I$SX~YUmZ41?XHs|4d-}QA8Jpp-%8)`3g`FALvzu<6fR-z2TXp!;^;k zfR^FUNhy3+)mKR{8I*2*zxDPljA*K(uuPHq;C`w3* z9+_u0OntQ3bytmS4!gnl9+cMT`?IFSy!WSleWNS#YPDoiNp2`kIWp+L0cksH+G9m~ z?T<#ju;bk^T62gIPCdBC%|6IsURU{8j%m)yHc`x5##m%yAU$ZzYiHk(YD~AopP<&b zNm7=_b!{ZQ3!wiJY7!Wu!xg5zUE_((zlsW&wHuSy-4pmO)y7smGkGlKeCx*dA0lD2 zF$clNTbO=fN`_r+{0E^>3BK? zi(?h%_rH88#mWI$qd>z)5jDv!UbeBz;Y6rZfz1U4Xzv1={07qCYj`!Os9~R5K=>C$ zWn?_RUA?Pr-(1alv14a@-gL)ZJ&^7d5g{Kw`*cdRy5kJILL6TnjCtJ;v})oUTz+J- z`&KJ<6pf5-;lw|RWsx7pOhnbK?TR{rixe1zhFCn#2vEZ}g2_7@f|I_vH$;VLC?gX2 zed`5B6&mw%b5YxQ{4+|299fcGw`oV=TTj{Zsd&8HnvZQV>Ox>%!ZvOvv;xL(?^1g`;@Dm>B)9f`qY?>{G_l6|Rp-!qK623#IZy*cxEV{F zP8c_Fx)}(L3)t8S*{PzLZq&H5SAR&wTYK%5p5#hp{R&^aRj*G9n#^M!NUYXfbtf{k zhP(gS{`#1T8P`FqkC_;HcW|nwv6!yY9*={B_V8%Qs8sFqu zN+u#CYJVf**^k#TMFs(@l`-tJ0x_6;Pawim*LyRxIUnbCd}bIotH|{)3efA)Af)XM z%7a#eT6X$+a$2b17nR%bn;j|fQiq48p^Q<2QE?2tz8eh<-q#bB3=Z~Tc8p%bn2Vj< z!5m%f4qy->6K2h^>=asg&*UU_(oR3^+$Xm4cE=@7iY)rRWa0RS09eJ03oO<45^A${ zN5yf6v%+mpaJ{hQ?fkfHy1q12Y$vy*8}L{!eS;melCU3x4uP+89? zdgAYaK78x_@6aY8Bgul+X|o8tleo9HgojnQ^v;xWs#k<-=m0r6Eu^h%DU<&{)GtY} z{F3k~ZL)`~NPy@!mat;WN?+ElAwWvgqU3*k168o^=93@gi5;VYziRXYV*>y>JXy2R znTS9N_KU5`;EKO`Z)bQ%yVRz`nYy@1GC+_`b9J;=j8fYZr*{$|wK8l9>V^Y~6EY3I zdk41X$mJmha@-F}!m^1ldeEyC7YL+BNZ-x~Z_QV$z>#LR4+IA0;A%<-yR9f4!zYY> z7QHS^l0P%mm|?7r{*FmL9K&m_jQkl9`PHk|UAm+d8hU%(iLf9t%5<+ciNN;6N4n$0LwB8oeoyirw$nvv7c43QY{6j zJnrs9L27sR)%(3GZ+xe*({tw~p~>J%9B*axfl5c9el-ATWH1^=t7|RUOYg&k_OjL; zo9Xlu{b%*3`2jCpNR&szel`1){MBj+Vp~J+z582_^EAr|C^D5UlLtm-b-)nTAUs_e zFUzU9rTfZ%R+%3j7frBiK{VvRts`mAwKXFp`4e29WmP^(_v_{D3jE0haIx&N)N7ZD z5>c+2Bkf_He~UK4l>V2PRa#4QG(#0zU?IEjW)W&r#%_* z;e3pso9TG z+|1bs0wnuQfzJvY&Z-S)xPHBQO1pJ0f}#Vn_tg zBb93ag>Z*?f|__Ll8r9cQ^jqC%-b0=j;zGebJQ2Hobj}C zVhDaqZA6j8Z$PVy)dA?$mv5}er62nVP3>-XMRbF^$+nVwfE9_|oO-csDINJ;t1+Jh zNszm*Q0=_ng*Gn83<06qb{fl$hb|NW$|l5FoJm((cr4M!dvEEsEqMJI%OAYBJk~y0 zrbt4VAEffgKr_Q>kj$vNqv$1e zQI-6h)=0j=WY05hM_LH`vtl}ynk>g96+Wbs%geODb^eM|HN#iZl>&H8Rke18Zr`O< zr$-#$(YGv@KW1?w8OQrfEAY*^N$mr_*MI4Kac z8KYZq8lRMYtscB1EiGY}`<@OIK; z%PL>iP9Q)|CHHJTa}cD1D8BOUsh7Do6{+xk53ex%8i_mG6g3QBc8DE27-QUqMm@KD zSo5$Lj(97aSS-6;Ci?$Knd5I<3wzbq5vJn9|aZc z14F%h9nloWUcrE3hy9+|yMr=>^}WJk*56qDSaMfzn*e85T-D(Z6E!rT{3&fVI}WpG zIcR-wg;MheX*;Rft1Hd zq$Dp(+aiXnHBj#BVQdqPcZUY4e^r5mf-lfvt5I-atQ|zpW*tN*ww)i#%h@Sk8m?28 z%L#PQM;z;DHkhktbc*nEG=J6uWhd{nr_;w*tFwTlyC4;PU3v4&bx&1y^;~)5h4whf zX;CmsjWAu1{Bs{X%2GrtCxXjwU6W52hYO5mCb+f~4tLVzjp{t$DR(A-n93WZiu?|j zhtN5_ICxDUnJ*)5;Xw%#gzz;0MzuI_fjYxFs&eD%d7KQ2u~pkY@6nZs0nlNu>qYP3 zU4xBI&=+}e1)r;IjmqcniDQ-MNS%tEX-75zg>_$Lk!f)98F6|ss6|a?Mf4whavBr^ z+>c7?M9je%5k{;&8q(G748q(xgh*y^z1tT+)HtHLS^ygT@$~Bxo&y1I6LagwsiVtL z2WytQ+6hVnKte3@>o$c7d}54T;xrnRw%>GCL7UW8a8@t=sZoiEdRgR+XF(mwL;10+ zDpXsmiw;{>?XouP+}Vfe%Ld>Hp!2RipVo$L{LZm67wqh1ftBvu02 z@OJYWIz~QH$(-N@lJuw=KEbyy=g~o3S834`uT66^eA?ePrOcwo8WZmdtN)_*JwXiT zqgzf+QIAn6(G3%(;_(32;pzT~9l{=1n2KW=4u0Juf?D61W(4;|xTN0o6kZQB3zLs9 z+;?GBcWilet#-pnd$I3qpxiOf(K_$({T>3;@fwKdpiS8mFg}kN{+ZkuI<#{XgiD1; zhx}e<$}jd$Et01B$2~?%ECsKBo7EqQK`5F2f%}`4tQxFFBmQl5nYc~iDZa-m%)*00!@BNNc2|t~ni1Jhcr7sJSP4+$SV<&C}cr_uCmlU~oX=i8OISnB+C38RA z_MQAOKrq=trn>4B!KFN|s5G~Zk#6l*1p0Lz&W@mO>*=iMD$TQ*t5;GxSWvV17-j18 z&~CzjRT&CO>``jp?&#nuF^sSkn0G~wJ#C(wwC(Xhp>w3Z4LbSH0@}LK{S`+;!v%wW z^m|lu3R~(`Uw3~xNKOx+aJ;uw$KN9NN-+umjqUiRN~^4E0~ygOI5I+H-6y-! zF@LCozIg*#e{q)5xYWcX&)f#J?CS?aj0`m<^GQ~LsLcwDxqc`$*mmUdyaEsdWY-03!)8(yP6JA5s8R=b0>)M|c-R)9-XTJ%2&9s$l(%DdB=Ia4h0 zgvhDu^0K%g#aDA(XdpFpap;8(=1?AX?UPya-1g!mVb}fgu99a+^ankjAa%C>10){T z9glQ-t0h6^m#0;rC6>3lUtVzl(vG`<%`x(iYu$G+HE_?9z0cq{fuK zh*Y<-oaytWY0}arMQ!*{mMFB!T=TwH*x>2~*Syk5g1|OEYxLv1Bo@(dw=cFk zNTzWzI~{o0orynvNu86;{WTXh0dni)6|efiEVodGam8+Z-%ZB1!wI+yDv!Ql&+sS> z?SobHlLx)O^lP{*G;)EAeg!3+_RfU5df%rVlNw@?zM7LYr>u6JnW1~JK;xB~nw>l~ zLLsvw0X~8T)b6jrZY?VO4$fOeOeJP9EbauS+>d?o*Z`QdWxeFAhs&t`ey@T?qCFf& zXrLKU>6zCyR30foI+A0}x}~*+Y^#Ls6#y z29HUCmtj>^2;=@GI>i!LjJhP&gDL`564Vu9?WQnF?8>d$SkmarGuN^PITXinOI1E- zpuD-P@(sCP8WtphY@l+?=HK6ISPfHlXaPDo8t$X+7KK|e$h8zN_tBOFnGu8Fnanm3wLd~Q=sB!p1BxRBMy#}*5iXPil0 zFqRIdhbz61B!qZ3r)py2WcoPrrzfExAX;TBt4?QXB2%x0HZUHVOn?rA-GKA^xY8=C zzjgflr?p{$xsOpukIoOL%U*1g;e{6sED!|*Jod{}%2_2K9}WtQrddd+4hPw(_IXVq z5J05qft5y@0D_g3Q_6C}`BhA{_U!KN$y%OMWU=Y^kd*tMCDRrMN)X#if)atp4463Z zO#q#HpcBklg<-1nc$L$q8x44qQ~rzf_}w}9n`6o7{}zTFLbY&mpAwkN_fo7 zNe?Y2z|9VLW^M&7%ZfbFmlECP&N=d(iKdu9>{+O0)BVES`zF+75?XVS^6S{T=T!@0 zcS6Jcizze_=#YI&lZe0QN3+5>V%1j;9yPz7+5?$qHjK9vF6<|-Atq(-n-p05X9OMZ z_j*)zev6t%(1z7CK{*RTkRW(+#lMJU$DkF{mC5>ChKaANTI@xp)~(HfjL=u)Z5Vco zpnA>G576*US)1ONUXfpUYCel8QAx*}AU3i)i2!zc-=C+&gD|;4urn}VY@}x<)J$m! z^a8!y7%w|4J*Rgi8p~@HvE2xoj-v4Cb+j!FSs)a;FBR5@>25m-606$qSS{k86(HDJ zdO=XpAqikJm0g#N_WkWmhHrI}KZATzGCf2(?&Qlx|J=#y-FYHz$MR7<{kNF*~)0^{t)p8v2>#pKUlrIy`~)bd>$1n_2c*WLm*S%7Nsk_$ zKDMiiEuIfVUWd4!XjW{tgGSKK&Zw=b7-1w8FZ3tt1kf>#Q1WWzAL02j3IE2-Xbq%i zsSJmCJ3vtMgB>Cnj@#cPyl%>pi)2(w@h4l2d-VBQrLy~i@and#toLNH_dtlU*M0nu z?a|-dOoT2GK&tR{6C`<Sv#-ZMUuD;*VccR}^}s&fhV{muw1mw#`>~9)Xn`DFqLzirn5>iKQ)>mnQ*RD| ze=flD&SE{XSz(tiv+P(Af!bBIGNH79BCR6)EeOOwh;j@}-<7Chus8#-&H_v$Ke+Sj z7GXB=y>@xA{E&+Y8!!ws8C!c|w>Yer!C_P~3fcgWTctVDCzzvqx*MRBr$erDv5B4L z9SO?j!D=?zQMs^e8m|l2sAseH>Ba1 z)5A25CPrd;3h{_ak}8PPcBa67z3R2Tx5u+yiw5msbB?9v)476rHUY@KWb1{dBQmCc z5~L1rtfcf&8!mpG17PS<&7r}^-Y(lWhw+;Y7HIbZDpt!ZDr6@Cgwm6uFxhE(CBD~C zCP660aes9j6$AOjsvP%xXVh-6z2pbdBT4!y_;Os;u;!&G?QcXe0H1k^%?}Sx(~j-Vy=_N1d8!Q3fHS`W2u4LO zT+TA>V5p@-2-OW;v7#n+5L2({SZ-<9K=ay+UhS`IEH=a_|H z+TiAFm;~HIBkr3ItQsT*Vm_nO1+Iq`k~ksOc@<(hGaX9F3pRpT@@?Y>c|a?!wHzZh z5U#u|5I2k8U4|QVbLJh1Oaq`B)wvEU$bjm{S~Q|+zO1qx|K(5Q5?vM-5RPC-X#_*g zR8pv-qJYG=t2KR@*`k?ahcC>%?&w{7_}0=#eYzL6SxPaE;~7eO;x;vpCnbS*!J*ab zg0sjrx%aolI?mgC^BDAClwfj5@b<>8qNR3>^T?&;veW zTkE3p#F8?<1yR^iu-qxjB-*V)+cN=xuqw(5>^@x!q*;v*djlO>pykG((Z{0XWQbT2 zhbq-1a%}pi!T-=|{$OQN@^qwzHlzzeCnAI(k3mCpEu?`so8w_A+kj+nc`hxlnAY zoi=JU*&l}5T9pL8Q_TA9*jqMYMPM6^ejiN?;6KIImENQ{8Ur)8u}!d45J5EKAqMNN zm%|^ISpaHJ9jv_t`1HlUEeX%0x%ZRHjL(k#8f4{&`}$3x!t>6K=A{FFp8$}ZgVzg? z_0>!d{DX##Ko9i>t(tLwRyyEHZ?2l%i2#gIxdIey$%_u=?)?z{+?oT`-MY*39zW-+ zFumyk8wHL~AC9}?r#fjIA9>8r{W#2VXsLgtLH1p#i3wtyz*A|XLPN_^Ak~-&VPq>Y z8SO(`rfi7^{Ak#9QtxM%b0S(F;;pE90>mJ8CDM#VGcLggrk~`o4Lz@)Q=4X!rKNM*1_05TD<}lT{S35p!+SEn5Ka4;#GjrAl{3I0FM(@K@8k}O(~*L% zL}?`WDWc#xluXGTQ++fiu>@)&d+h*IxyGExT9qN2^ea`X?)9cYyZ%Qk0Y=XmkfoQ! zavyyAXQB?2xQF%aFyMw;vuw6ep`e{i_mrzrVk|goaxJkEWI&+}ZBF9uD~q*T(Pd+8 zku^?-=<3^j$zsCOITJPjEgl2FsqK?*D(?Fw0)<#^^%Rno+#vAf(c$iIu;%!SI@u17zVzb2;xeKkgWQMP@MQj|!%M&WtV4>rsjYdw!ue@vSP z;{xb0YcOHnL8!DS*d25X#U>*aIweB#?lH1Y)3oQrNOAq8C^|m?%EN6Dj663&tZ_Bh z3L+YhmQ51B#M}i9Q`^aJ59a`OMI%WR-sD9*rx|a9ABe6FdVH++2Zt%bZJ2?7Dv(E^ zs_dwcAQi(p`S77cmM#?{L8_E&z-GHS(e~z>1<)5Z8I>79XTh;80R)C9*^HFA2%rl; zh)bvt*y;&Mk$Q80cr4nu__Rsnp9MPuPRwXepK}>LBFD%2RIPNoG&F}nqq4KmVVHBG z#8|n%)}`&e77i)IiyT7jSG}fqu!R%g1oj6~pM! z`3|EdL6dYR*fQ52LS1`i#Ycjs=7p~I4Kzl+kbT|_a5520ms1h?*@7C=CgrnV#CitZ zOaLxal*i@7Ni)i~cC^H}t*6Gmahe{i`WoT_t4*fNYT7kjFr_|BgWi)TQ*oiL^s=H5 z`-P73@U>Inhwi{tU*G@!8c)Cro%W@8{$?3SQuGUNJPkz8ej|t45OPV`R7pEpvrc3m z$!t(ad6iqB3(Hw7OBMK>qD^VmJ%&*h(3e#{T^{x^qxBOEs@^ouZ9Ca`*#EHscrJHlEtt z9r3Sq-0lD5R;|AS&fvT$(0(=cV@A|TJ=GyYdHa&3ws{g15PI?L(9%nBCy6f?R7CoV z+fiF}TLy+wocjvaKt+RqUkwEOYC*DEHwF9@NS`r?4L^`TmTNmO-K~2*0{EU%d93yx za#9R-)B(xqs?vFW8cj|{A87H=1NDemtU2S;gP0hQv(F9GK7$a zq#e+`f%mnaMen+c1L(5eMyuc`L3U@0R;?%ldLN zxz}wnbgA>W6)Z8t+e{^2J6NxX3$Fkruts{F0vTI*g%-U$pGfS(r5O2u1(6ic1UlCG z!^L!(nu&azKmTM71jdI{H0j-$0!EneO|m~;I%w~9je7;N&pQCbiSoHpA`<3!Fw?wJ z?iPWq8oRhfz~jM<<|Iv}lg!Y3<$X5wVX$E6kTMWdk>SO15wDdm2Eh81{$w%TOGa}I z-S%pS-GC`9OexS7CB&e#@Q%%PqcS|MK3IJlp%}Wr1~+4+96Hz1fszVr_i(t7zf(u# zrS|wi>D#IUdz?Q|Q=qb6C}t{HmNs1iphEXP0>rIU#Zr2>T2dn$wkIeCIy{`rzZ`=B zz12;QxW7HHQGXtXG|rRoTkOP3f_R^K7TvD1?>wovSC}BGYO|U-g)pn_j_yV?&*9^; zJC+aKd1AT8{R_>PgVnPJrrT>zy2ICZL+$~Z57hI0_OB(UH$v)oVi%$hddK26^e)v+ zg!Ei`EJG>gW)DtP*(tHyZKdXg17g``DV){R;;h2p>cnZm1cDa7TXW2%NJ! zsuEDIyA%q3YI|dMURY%POjC;*X?aEl2xDzrM8kHLTK7>=Ng&kCA^UN}E_=bdpJQEN zdugnus+{k%4mZc|EM#ugX_@)@`gS&YYDEM5VTQ-HY@Mr%$Uu%fb-~_T#B8L4@j$u} zXya2llo^u{qT&Xd&5@QRAmbp%{RRwFkOZ0JSY6PSUb?R_}AB$(=i4O)rD$zr;9U(?u-z4sw91&do&2?h?~?( z#s(hhQa+U!FdELSAs+zkwtWmL+bL0|a8cL&!SB%I11%$RW7;4+TENEwe6zP#frL%lPvkvUv%LqXV`AC@4mcV26K)I z$)@ZzYl;(l1PZ;EHhn_$Se`e84;5><7bTkcl~GB0mz@am&(8gnSpUe}&~od0|;M_b4t@^hEh06ewXR{m|BPYxCj_zw|=t#Ypl4*C<5(vi6n)f zKHZ^&h?)58eIF9%FI+}p?%@d@zwZ*C@bC^4qCIf38gdQCBkz&fw2oe|2hda{RZ0I=mBgSWSqy6RPYx}o#uH4o;ZAsbe z6Wx>H7Eu{M#7$cQpBN_9x;$w$A4r#f102me2cB#%aNKRrC72`&gVTt`Th&amTU7Wt zdTp@?MFP1RgVRdl=oAI(%|`S~`xzkK@_fxLwO11wL9GP6Q4 zMf%i>57ZdhjJ;`~TgHlth{Ere8pu7K@a4hb=ldDA9eOqrG8MB%ho>%O=d7tor4qw5 z%hpqE$RQH`VDeWfYvZP4#?Kl}i2ya9Ukp!-0i=!@lMl<-=nv3fMTKYnSm%jr3SYjh z5e+VL#;SsV-CxUx!t`(gz%<95&uuL!L^mQ=z^X?d6xJs_p0G0z=x|tlrOG-A9a8}f z?@ky>C5Mv<2N!CJWYOO@doRvUU%iXDRJG@3fG7*rRp^UYUO}Z1T@03|QdZfCvec(s z)F;^zcZQ7T&#lx!6Wyk%Bp47Fs74IBO)Z5E;fIrRViLeg0)*!H)<}=jHa_p^KK>YR za@Tit|9YTp3>WzdI%zD6CsyFPE1KoD)Budi`%9v;jKpe+HnkUOiDB13Q5ERWdAcE7 zG8LL8c$n`bHC}4EQ8V#!ah!j`dcOGIVj?Dx&%m_8;F`I$Tf$UX9AgZ!4{?^M6o*nv z;+$_SgSZcEq+bHt=(NA7F^7*>y7i1Y?qlLG)ulKnZ%GQjYKXvhCGh`cA29B_R5cc# zB<6As>Jr4+Qm za+7-%{RRNYv6Ob}Y+B6fK7bDFx(b7VhjYBQL8;{>7)Yc=(kD0LA;-G+c(w_H_|Mrh zmG+G8SrgQT_BX+QL9GgxKEA_)Wu6u;AY(2bjAPfZf8LaTpzqz46r6xNN+~^hjfwO2|E8fDWHR zkq%_n&IauE{|sy4iR`>l3{1qPYgfqAtdWbuWmm$~?~LBB-DrvtZ%sa?fZWT}+^D+1 z`J090FK^0XHqmNQWoj=n_Qp>AaN`yT#wEO~F09Yi+SMMS$qC)D>lqdd0kgO&W4a4nPP?8) zF35TUI9!(Y-_Q{n{AZKNG{3>+76mgBP}Wcc!_+a)BZ~RMok&fMK)GnRg4!rV`T$m({gqlfWo-g zC@Zn^hf~i&@ZeLb%3&>_jki0hekO=S3y5ob&tf^7?P`qMN*A3uNN>I}_xtV04v_vz zuPQ39;+*;yhJlHVd2nRm^0*6Ap++UW888Ly)PA|k@hW%Zyl&azU=IDNok3HQl42O| zG6ecC-%i;oYuSc_E=~)hNPN_WNDbEt`$^NXsSl27sI0PmoHRn~@J6+-Zy8 zUO!54-tebl{@4oJI#bwqHCW5N0Gjx%srYE8qYj+nHU};G3`^6V)Umu3Uw-hI{kJ+$ z*0cQ~W*7hka?F^sw$El&$h2d5l&BlXJ>+2bw`|vuGuWp7)9qRLI8)RHmy=w0(wCiS z(B=;Y52%N1tD~MFa{j}C$}UwS zq;XTq^*8iBkq$Xz*!W$h3TC>VN)3NfaMJ-9WEp1Wn>`JOr#k%o85t|8ogx&|A7taW zzsz${kaj*>C+Vv$LDZfK%bwUr-fZ^i8F_DGPKom#Oeg{q@BZi>6!#`89KPuXb(*Ux z7s21HbB{j2EIFplv!ueZ2VoR*;h;K9=z{G@Hh?CDW2%>XW@IJ0j_hb&wwv^-ylGw09$l%;{Cx7>9~W&{^wA6%9}s!HDJ zlM_N~$n;B07PC5E&7wq2G8HEpT!r-&R}JJERb8=jHgDv%LGf4Zo&Vs+%sOP>2#^ZYD06fu z1EvC4fS@9))EGIT0o$HlIsR=>;oI1#Ty3ZC$8~2alXaf7S$kSW0qlNYd>e6b$O?QN zqA1C7k2=8fvM~4^W!S324#@X03w%M}mjb9OWvHDrqa@U>haN24T-(R>QQ+U6`{~z3 z3#J*=p6y7am4k`3ow1JXv}V1O5umqbo#{PDJab>Lu28o1DgTCg$%hi0G3B=o7i{t+A6`233>5~GXK@6#Ozb9B z4lGOBUV?hC$vND9HK%|{<1On1#0232#gxyy3<@~;)efthwEG;Q3iLLdE% z(jl6cnH6>Q>3cDCQsEUuxU)N^6YWDTq1i!u_`|yctAll_$A2&k)d$vw_75i#+UX#t zyT5CgjBGc?N)C$N4qlX9TpT9I$J+{lPVQAhPT^cDDitG>Z22_ML!P%2me5vG@#t`` zjIVDO)EHvL6s;W1N;jt!04VNO+w!}7*E6l?8dh~Ymo<WPkO`z?x z4l1#F%%~3rIPWI#a`0PR$cs)jZnJyCVq@x@K;9WqHZqCy?y13u=9RvR*f z<~AnTCm7+6?(|QY9-depGiaYQeS}CNl*rDkuqEqIW}lm(I4pd)2l7pNZER1#88c`- zTlhR?2CCUrMN{cEqCfn>V=XUQrqsR4iIU%sIfH%FAB`k{J$`#rdc(QudKcXagUS z$#t8@Kjifj1-0w*3sQw^3{u5qd;4r{iW5sb$C@-Yh~pge~sp!_C;=;MrQk)Bv^ zzdyj^M}c*7KWoGWcu?G~PJyIEL4AoYEz{|u}`k|4(?r_3GCM} zHR${}-BIhXyOatH75D>^uM$WIG%0|@E#Lsq7iWL91G9P6Z{;iE{g}oq=D~5RNN|3a zTX*5O6^48;J$;{${r5OyF^d5;+H20X?sh?V&F%LZM^lF9%O z$;h|sA%Y%~Ak-^i;Mz2azT?J4T3;Sc{X~ozyz0e6C?chyFAO?#X~5Qx29)7NmPa?- z!8<`-ehWo#=lhQoua5rw`snYT2-L<|A-TCDNCTUELwTl^M7G9j4%pjfUn z9myKxgotHKA*=rpDf^mU8w?PJ*9~Di088}!WqFA7oT|PYXTCdW75qX8>VeRi+1iv3 zq1X^W7WWl{$EY`4?Q_cChu{0(lvGM$y6cX?6$lWIPkDIt`0y!81q87WcT4+;{r+v} z0{1m}4mG5ZNxy<6E)8!5#Ds6qMPP-{!xj7ONAfkU*5Fv7lmdu5Lb<+HJkgf^H_+y9 z;PL*PL79L&Z%JW9cQM_I+{531y(mB*-%E@!qPT%P&0+O{O)b%nK|NJ>%;oy@i~n}| zY3c!RdQr(wmh>-)1HrW){~Ph)3H|&~JwHJFQqd5M8=lTfatgsFEx!X!gb_iA-~v#; zMQAT|8g6M$QkWK!zuMmo&JRG6^}MbavKw95%8i#4#tUWi&`b@ufif^i z{dntibR`46KpXz9zWjhtswDi^T<^i*l?fh+iu%lqvbj+T%KQD(HCH07I!B|qSz!U< zQ1dbZDgI|uzVNmFlfbX2)qUVUcz?@AkbZ&f+Hg#tORkZ8#Q-w9^8?QakV=LKY1R@( zTF%8%fs5oRbc?h+|0HGzA?ARp|LPUI)zEdDkw2+-_${hA0>%)3>5X;uaKeVm`00*C&_9_Oypdr4JCiU0x>JQxbfp?@XS_5{@gKz!!u;jn}NMZ)L6U5a4mZiP9 zy4X1-ht+Fy7A}3oJj$*KGRWX2Uf%wdGvLe)bov6%wZvY!NZlj-3RcrLjFO4H{wK;H z=;gNlkQdthTHeY7{2#*1AvD>wnPUJ~`m=C6odxix&=p9@hdq5-picufe*)=t8;99_On^MtkH0%kV}rXc<& zf*|gg_W<=i;q!)p^yvu&S~}HA#?#SI@~eAa;JoITEpDk(5*QpItXl%AfTm$V*Ahi6 zo%@BC6cg}c@>FWh4Mc&lA#sX9bG=}MWv)rJh(9C~xR%yb<8&za01xm1SkKmh@<;n} z{p@eKX+K~zY~TZ|$SJ^`AddPE?AQ&x&u&wlp_zvdxLx?0{}s2tx<32z6RBO2uXhpL z{{5j561Wk@Ylc*3uXu!ng5dV=l`+3=;`UDPc)jclO#o^(m=v}}JYCR>7vcK{N=?f= z1nlx0uuHT02w){_^lO%6caa90>oftoEK;`a|I^8@*kuB9h0WPNgU@4T;x?5b;zN(6 zu4uFD6x9D3+MEDLb9VX_7yM$8{7Sudw1j4n%7Ep;?)NgvjOhQRj9!zfIiUWNPLip| zOzO33ZJEWjkMM2&|7M`|_ntE!fN0#62t<4<@GcPKx%Mu+nE-W;4xYRO3ae1y%6uDo z(O2+(hap@Wex`om8!p$I-YpKD6ah60bVTR^Z^*Tt@iF^>1y~mi@FeYw1r+E4==HUd zRK^MOlh6a&6uAe#`B&QOnlgZzuSoOzNp;@@ocx4KULQJmjf@U*8|ndlX6E@RA2>$Xgx3sjQFiOW7v3nKqayL2;N2ij zz>k;G{;e}_^8c9f6;lAxwX3!T_3&KRL+$zZSpXpHt6qEe7~)n<4v1v0A^sVh*7;Im$;E5(^KsWpI(1bgmt~Rtz9f z$Gt(tNZ`So*H>#7p^oatPY%rMdu}PG8;C+81)+cplki)_R{B>WSil<>NGn#(m@L76 zh`5^q1k8rl1v7~vR(X zAc(rd`U?LM-LXTyx`Abax7^-f9u1fE3Dk(!l)wy*9rn2zj2VjJ<W&e`r`J6s}T+%0V)@Vd|QtlG~M zDi~P*8`CiQ@qSFyRfs8+Yo`FTF8B^IY2dr;Xb7U*NaFuOBVKVJ2+#&va~S$BcktYY z*{}&PM;o_B=n4fd_!STs!s$tOgE#cwxZCYMuqEUWLyIbl4}yrsB9OcBw!;`i;Dlf< z;BCEIVaz# z{Ij6_C(`Tj-y#JOXy~b@b&{C2Aw6UmXeEPX8G3|hSb|8I&`UG%%6k5v9>+`a>b8fr z$IOELU6DC{?d4!B_ZX0*WPBog)s-rUVBi5qkCXp&g8$`5x6W%C+O=5NVWX~FHACb> z!FYl7$E!f$^O6vOPoD3U9>DsS{Qf^Ei1-K!pfmhovFlUXaA)YcV>3Q0zXdZHNTqe8 z(;~FydqCwtCAiFg(hmRI6@8_31D(_Qj;PB(1Te|-*Mbc}mhqhnzb)d0&A#BPvn&1D zZ?r%Eg}xxK19O)^W`9}|pr zGX;>*?}xRUnU|koP;11?6RBZ5A#UaA-!XuXb6B_-5zHQh+qo(Pl0!sNs1a$UTW;Tg z(Frtakv084(dSARY$H7TkCSLRIwjTowy8N7kqH^!V~iZ24Sz7lH(HC{bbXP$j=uY< zJc|D9BY%Rs@_U<)`v7Tondw>9aQ0ui{_n2bR~gJ0od5T75YY0RpB23=UdiIcjpMX^ zMqrZ9r>*st&Gmd=dG}{E6LMskd0AA3QqBi$VuJson*Q4@yP1G5>!#|OSjNG%0#lHg znZALMM*v#r$_(<&Wym5|N{<8|e2bpmh!#EsbTjLr^USgDg6X#oKeg<;7E_%Lb80}^ z_1~F?*8v*qbV0dPGCZ|iI8tehXFdNw*>QYP;}}d>>HI++$O=H)%^j5V8NUT0uYf;E7_07zRMq+T?ZunIZ%x|hM?ZzAXIpj-U;USzoR2=(t{HZU3Z zYJ9*1lt{cEoLY&Jd;n9YeX(Pk(5cs|sldMuPZDJPs^Q$=W;Qz;b>o<}X;Mrz9?n5J zr8CwYU6bgt@2|UuJ)LYW-=AzBT3_otp>jCPQRF!Kp=dQrtCPtOZaH+Rsz&&8)YSU( z<^xGTzNZtC5zooC|IXEQswF^9iv|4X4C<8#1WR!eaB`Rv@KDwO(v~h&x8u^!ByL`% zK>77qzw_~aCGVj9YM~pZF&1P_SR3F#mdYPWy|i9-T~%}$-<<3$8CG91H8d77=X_*& zRA4Zh_){|i`Q-39o+iwB=r4L9@bdqgO#dfsLPHIh#|kNX2H?6e-5*X`0m`K3Gc7|B zX&_m>q7ARM9MM_@fC+OL$#`xOqM5_}ZlS;+SUUPoZ&FpoQlR~Ievx@U)#G{~no(Ro)h%>nE^3Zbjo(D(a4aW}g2w&IS6l89$PUvM=i#a2LmEh@ zBme26|L2c-pMmOTrBPBRy5fz^(#at1mI0HItDMB+`{Q9NCI@^Z5|BhXNS1?W!`oH8 zLfS`2mN@R0NAnoF`@>o>V0CrmN)~ABivkUV;UhhPD_9>_{}_VyqABe3nH)APV=x*~ zURz7w3_BWjwox_x?JZudxvS=$_1Fled%rMF#Y0SY@?py03>d$KUZuNlSZKYu@o@C4 z7oicTeyTC0ZIrF) zcrYP{MOoeMN7)n4aDFWJVdtW;>hhL*MnWhDhYvu-uuO~KR z^=H$UD0cdYSr_z=+9;49n^l*j*29yRr~?ZJ9m>J_{~l(igu{)`qmfvYvg4uPFb z;rDkY`uyy@uW>*yG}1a?qR~I_Ua84M#uVAUtjuIAEyJk9(AYdC{0O9(1EsYxQaKY& zjZwk&kD{z-N!E5(PM}eH!U*Z(!MdlqXqN*5gK36>c6#Tmr<^frX0^Y@y9a#}A;6I8 zxV1KSMYBG~I6u^+|GQj2*P|%VdJ`D+Kb&P5y4$D?FG0%~9ko>J3pW~Q!v`!miwMq$ zb+i!P0nZsQh=`MHduOpD=L{Ro>sxXQ%supz&&(#+e9=K@@mq&=Zr5IO<1wp=Hj&fb zMXT5gFeWDNXyq>RalLZ&g@rQ5lgUvV_QIsm{F5)6j1dk9cR@4G2S%88kysioJriZ9 z^-NjQ*5x}{TAX9Zs8ik~@~KscWlP*482#%^@%4N$Qd8UUaEkGNy-eWIM0ybo^OHP= z*m0thvOngQ)h_Y&g)yv)HlWz;_D*C!^v;Bx0qgb+xNgzJt}4NnF<`Wgu#yp8_5M(m zL1WZ1N;}W?r}NIgEl==A@H_*65nGe?44Cj*_b)HiUT9=5A|{RqcE6%w-xuiiy^w4=9Bu1{A6vp3oP#>SZrO5tYZgoOAVXxVHT*) zJ8gzb-{yrY05%a`_j)PuUJv?u$NsNi5jEQ5-FLJV;^A~l!Csf9(X2)xYl&^dH+bl1 z9=r~oGpEEK*?B)0RXsr(ADwzMU8P9U0bD(zktxTOqxyq~)(KD(LnqyY?o&u%XL0rR zzD~SbXGgwe>ozj7vOeb}?~)z4y5VO%bbGE{>?p!tUt0N*4Xx$h?OY5(cdU;3^? z-c@P)(>j`UJUi$3kh@Gc$^C~aVm{sCZ{@DTEjaP}^RH=kthQsrsO!4qbqHTNi|0yj z4U}4;syiMJE`i=>bcMObd)=(S0;3|xlyvFTH(|58;r0%ldqLZJ0n_WwLBY)v)98Uo zE(}qFYpAS%x&COai%A`Wf3QaOzZJcC;4x!kX{lKX6_kZ4jem778f;pS7lq7$#7CBL zPx1TSiGl35{eKbx2nawiezC1>*iRS}oo$i3;S$=f2QPg`KD@W?*N(XQo(ImqvXAW~ zZ=GtIZ<(@Y)>r~>^cZBMk1j{6FzRW1QSR4Yrr3*mdQAD*$kw|fi7Ru^NoFKM>3mOC zpzru->3l^o6%+)6>5$xQ?)5ogPz=E2L`8eXUsZQ?O;T1!Y%FFR_+n)aenP*5d`1l5X4O2|`_PRSf}^h`HQPHN;7weXp&KegE!#hW`+ zp2Wq*_QvU``w|lqlk4k*Ci4ji`}-{v8s6Lg<40aMlt)m;XK@Gocii=Pa$yWkBUuBk zBOi~v1T8$Zo!qQrtB?X8Lvf3AX};yjp)EisME!owj#Cf%j@1srX7N)ae!4M3+y(gE zOX!hKkB&sG4M|kyEHd3yaLUz!Uc+V|otuu9`N?Rax^T`Z$sslHygb4jefuhl)z7eZ zBZ0_b-_EwVrSa8Uu}^N=^n7C(1b5swAYD4Knlq7#YtO8QsQX;FEwLSK9f4b3=*f9DH37sOJ+Lb3YwgZ)~TK(@U8>ks= z*Kb+m27uWRe*d1Pv8khRd|WNMD7T(BU#ju=V7W(RZq%(u;vthpCAQKfS>7Xtm-&38 z_;M75j~nbpmWpC3wZ+V7H#M43#XW<2=UMEGzrU9RCUN{HJ5wl+{G?G8p503 z>NowS_1A+%iFE-9BbgNcdt4h;BdN@PRb6ty{Ymve%$oJ*9i3URw)B$TrQgBfSD%@C zXNwg2d)9F74JjV zC^k3op#a*f_<=`{%UPhYfwr?$;|q$!_AhD<8&}WI2}=>YmGPkI1~AWUbPuo zpXPibp9Q&o%KFfvOo_6hz7&dt=2V62T@iy0`iJ7kw4SYlc=xkp3alx;UoDh{yW}&_ z*<^mxVpdmiAhK+kPqqt>&-SQyzNEWIKX_xC!C2Pl_UAO%l~aRb zayvkHo5tnPP`VWBtmaIFrTg-u)T!$8`{GVvJG_6!Qe=M!2r2w|tGL=SinauC&!e4f zd~j(nH|!GSt%wwP67$g^45RnEfycc&+?!uulnW{&8xw;jCOnzRkDrb_R{a`1a zp!$qSBKj8%>Dtd2=ACN2{@c2dtPj+?(5FhPTTr?_MB(iuoCrL&BMgU2)s8kjF@3zG z4kx3#w{~DK7t|Cb8eW$&^WzMfBPaa%m!d{*T{ywS)`e)-?ghguhYQtGyNNm}gSl8M zlMfH`dMa@=ws}qQY)n?~5L42a$Vd=+x^V6yO;mA;R8sFQ_Oux4E^HA4Jt|3yK0vsq>?7T>n}cTj@HV> zmE0?1n)+22dN}uMdbn$KtgetpwbK=Ldk|TBgV&<4ux~v$2xEROTC`{>(Rcx8-P4h2 zSY&Zi(MHi=YrdyhSAKZ9)6Cqc>GAo8@3U$FyEP^~E0f++k0?v3E+-Arj|3?*80+}= zmT1-;^vebqvK{b?)wjJBBGq)dnzBfg^oOQ7%r@^Q6uxfH?6og;X(6i2fO8Dbw`AO&8C(Q94R(_&~K`YB7-*rfRR110`(X>OBvc}+L%0 zW!dhmIOg~&3sNlP_)wmJ`lhBQ1VecqF)d8N%h#2UTT+P^q~Mgw^7_Uy-~E|f|;_??1+vSiEG z(a)b8P7VuZ78&qmi&mM=C?(=HB$j^hL|nt9St);n7DqGmWuVjh0qymu&SyM)bX z9`H*`_d?LX_xSenCfA?7#gbH0#zXBjmB#qcA+d?cWn8FKkaSBoUa7G_!w!x^B+?dY zvp_`g(5mFV*eel*kQAPSwIs-jc&6 z)ZglSJYzFrckJ~KE1$YAe)?hCPRo9PQER*YDE?v8w+r3M-Ve==O$$ymnlVZ77GC&% z3Cp9(nr<`Y$tM09(O;OA-{h&sDz|h@?|J06n@h+R&XX0N_ZW4=e|D`)3A3DfG9x<^ z?z4Ytl{~Mdl+)DtHbGQA(_UJ`nbkg3!ElSeXX@PY{N#br$p6t*_*Yj(_#)U%+eybd zmJnfJlJ1(snbyAQE9HDgGGbR6IKYhD5V*&}ju*$f@Ka)iM>{cjBkG1T+SXy+{h43`0hBb_C^{i;QyF=W2^4Psx%rE`c8Rjkb zIPG^W1%wNCj<+04-U(?G6y{bCAU70-W$;>5z1%2p8Ze`Xm;Oo+^EQ(^8GW@zZn|?Q zu%Drfcbgk1(O#yAoW86odTINa@nJ5^nNWDTtbM>myqmVmgEb;Ga@ZMAktU@UwwjX~ z1G0_v)?XY}d~r8^erUE1Q*_up#zZquIpsWND4t0DK|i(rqgv)(!6Ghn)47g7*fscz z9~&C(z)NZv15(R;om5jshr^`%&NG+^#$qDzXSbO|_?=j{g8It+y4iCK12Jkc zvc|vXg+GBNMI-xIwHVb^ZmXaftg^SI){PflsU$2q4}-AX@4e%$i_t=6F#SMX{h?3u zJ)cz;^$Cry;f!~y7#={hrm%86B<(X?R*4}B7`!EEnMn#ceKd+i*c0aymdmOy=A?fL zbc$t5nS2nM#kD39tYBT-t7_k8C#Mx~GOu8jky>}=L#OpAeY(VTOF8IF*>T@zn~%3d z&cQa1yUcLUOpuwc;CB#qU)rFvVN4CYlt0|OO|(*6!7TWFJc?D`ZH8)4-2zzT zwha5NWM}Vts)P2uckUPqmXoNpk;GR;d(O*_s?;(g<5S^cy5{?_UUSkZ}{_NI$b?_jo{QFx;Jnvzl!9vDzTh4pSdAH$o^v4&jG-+`cv4#)+euBoT z6>cb<#8h|wf0TW7SXKMBw$k0*f=HK0x0Djn4T}*A24Q0FLkUWAnYJmr~GIE_rGh0#o_Au=q^4ID-nCw}_~cOSODz zi`>_+zU(oQr@Owd4w`mKMi07>7E_Mw#r^u6dyvrWM!mcxK*QYudm1yfLfG)b{lm)I zS_0aBazXBRZj10o{rVR7#+XF~!UYne@rmPyZ5HShoKZ+O^VV@D=ceJ3@b+%MOkGq?=NR z&79!_{ZlEMZ`6(bR|F~8xcN1T<(}U;Ew9GkLuXeUhF*SXvEwV%Wod6paKb_MrlRqd?b%PzZS{Zwa_sONPud`=##=r1BPVH{J^G=N*>xTcnI@RLof>i6z;Ras z>)i))m1Y-Z&5i32S4@;nlZLJwPmqtSfTBm22~m*tXM6h(mG{rLHcgydNx;z^XzkNgZG+ zFY&C@Yq)59_Oll@rBfD1t8Ia~LzG#!U4ahC3Y+n|6fUDVC>|{xPgL592nyPW7X{=i zwVBbyOsQ0nKqcA?%|T*i>fY|xZ=D^?5-<7B=lOPRt4|{WR4sX*F-SMJ5t7S@R^BGz z?R=XqnfF0A{=T|AGJyg^RJfeXTYx@N6=CiX`7uubKjFZo!uel%o+66Nl&lI(-_WaG42 zeTDjoIdZt#Bre$aL?voanF5$u?f7)ttgoQK(7i6xx1zn8CrRB^tEgZhquM<6>7Bya z23Oq2=A*(@-`-)D*2MuWwyHHdpGde+30L9$6xYy5xmIi)H{!*1{IkupcL$mh=NCmY z)t>k-WTL&dY@MBZj*_Nk?1@N1f9HeJ0R*AzIQ=wMDp{C@8e_jl*e2NhP~59y2(Qes z`kF{^r8DfgwoG{UOT5FHt5L2J}G zMO)nIo;X;4iS;SXW2ZUsq#-GwPs3;UCgZIZ{H&g$E==7C73Apsc6eZikQ|si9SIP*BI7Q zJ}G&Ezd>%#3FkYgU_k7SER*<>6nIN@T%hOO$y7Y+A!_~*Q9!>|1`voaXO@s9-(s|r zfATIN;J7J$?GN_$cB||i--NSWm+LZAx?B#sVZC&_M_!lf*0(>B{XR6Hv7uOmw&3LG zeieH*X|0)N2u0$|2UeZIdtxNVhv)QB3x{* zu*OgK;5mcban;XA;liVlb?3$P5S&-*-wz+3u-)gwN`z~O{7>}lFPw_?8Gs@o;;1UL z_QK4eCn7AjB9vh4zaJjl$=$Pfs%4T?dI*aZ;|43FyX-&6<@}6^Pe;x2n>F4Df?xmn z1e{j*JBV8O-JBa^eIsSf_=`RKX-{3mpMi<|xrL1}WRb%e&0VQi&=_DXr6dI08rn$$ zD*B(3a9XleY(=-beR5ZjUEZpj>2Bn71qhGF?ek4Z@5u4qPk?xWbGxBQUuzoZiOIRt zyKEQ4xEj4)c$gzFQjs-k&Z+M4BWoWyZ8}B4Nva>3bIkq1qSqVqwVZ49O^Hq@hRg8F zgA?@;=wq8+zM?i^o02eo1%Ig0FfZ)e3({!gkv{<-z=*95t2tAdDMe4j0Knn+k(}_l znb)zoVa;-s&D_;iP#t*5yZb);y9$1mD-g1EXG&{ny+YT4hhG-*8Q1+fhFf*(RyrYh z@XRr*-WNy8jbf&25tfwG!QYwi?6t-$;jH@o2+NxmrU#xyTP2e#|D3$rM*lT z7N)E=*Fz|bGqewaBkwfyuc}IbxK<_VR-Zy$wbGfwMcdk$UyQd)F;dr8OB zc_V@D%s<8YASkGv5D|X6VZNtq(^k|*X2W(QpjdDE;quIDuyxq|$Mnuh&*Je!M=bm_ zU^3+nwjzu<&RT>_?XGc{dyEZNl9fL`X@;ndlpA1Gu)Wz~5kHcQ&pkb;H)~XDF7(}t zJo?ZBk51bCU7(_T!FuX?G`L z3Ka>jT7WPm{FCl?1~dR>fL;Guap#z*MWGH8yMK0vR>Q>@G0_z!2ci3i8L zhv`dkIVR=s3Rz9bIv!=MS;3S*6P|<1ZS~&HkiEI7UaDAbsL^j=KRFWq!kHZse_dDg zf@+|{A^vR6Z8$0XI8Sbq2 z*``UMF}D5gf$PRMOqSczWsw(c=<6FH!}|LPk!39wEw9UVOj*E16z z#!DoMK<|V6u1AGv3q>AYgyXD{`O^b~a(6NFntG(^)NI){DkgG5ut1Qs8)DY;J26o> zUutGN5;0+aJuw0aZ|p+oP!-?ey2WM(Vq)GRuHDmeTuX&|C)3QEMtVi-Y=glL9wAXj z%Rxk#uH$S*(J`NnzS-j4v|#-!`nW~;N{ zeUAuL&>aIOIZVH3ZA9qL+ge_#>^PhyFv&Mt!sZWsLIx5!E2$~FMKKm?eiO(*q)uNu zgYMFOrKYpW1}o}ji}G<3su6$= zlq7G84^YGZUP@=XwH$sTR@MT`@=lAwL9cXRZUH7 zmj3c=^75+qLrP-(+6K*;(||dd5IqAhCb_J_Ss!ZJHQcDw-h2uYLP$RJDG-|hIuzG8 z)Jz*otUtFHOBnE3B#Bn^J_(v30J2UT@^Nw=hcYP->j#=^M2*=3n= z+Ow|GgaK_$x)P@!=J++%2LkUoV>!vI-p;Y@n3Fhj%spLvAZ#K3GVDoNRhS853h(bM z?sz0+#?8S-g=lgpX3)D4!~Mxa)l4XRE{|Ugi4z58`m7L4RU=3B8j(1%;FwWNV?fJd zdd$jTbc384Ug1G+=fwKm;v20UJTEe1$t=K#ijzwLS0u%!Ray-BJ`l;r-36@VkQ zz9~i2-_4>PdcmRx1P=k;@Tz%dP=4oazp53)WMTQEwxh^#zE(#KQKm!-k=g7hx(uvu zhuudU&gBRJt4_n~vsZ{WaldSfMrdq$(6v8s0&{kux$iQ`5eM$UJho$?wGAd|fuHIql z?{a?A4U0|hG*Cc`73cC3Zs$)%_$C6s4C{`UK2?o4^DQ-Eag9fUX`pXu4rXntpeR=1 z!hCQt?_Vf|hE@7#5F+W;gtiL2z(Zb$|O`BxvB`k$OcH|w+HX$n;Rf^DsN*s8xl{Dp(@^eAe@ zguIqK*f24`dM$czzM;MA4yp6s{}5(pV}dJ=M^SbkW+^?{6ld~NA5^OeJ~r=(l5`ON za!dG0ckOZ}d1QXXu4$C2sHwNQzRwrVm%W1h`0gb5Pr@nX91tLCX#(Ln^o*cK`_O-{A_PEHn>&i zUwm)EY0kgI)Q0kSnzadjscFur71_ovLBtbG162f0R8kB`b~Gwr?NG&U}q&+>`Y zSkxTm=S2(HYsyY~QQvUKQE+h4029LY+%c+FKRcupBSm^lBBjfUB2Rk0MTZfp*jDgg zA~*iD3UeLe$)I^(G4hYS;3Zryn>7+)71 z3B_HSTil$!y0aAnVNQRxWin*|9j!T9_ZrhyI9pg;`S5XdZx5OOoArs@Y84!N@$4HdT6v4_7r)B zD7EJDfC$bDb;}U2if8@i{N;&O9-E7;2{oZyfwYBlyQ<#?59<8~#C{6?tZ=KBU4bT0 zn!OTwS%@0#2gs1Px`uzOqgJJl1V-U~Vx=rUAG|jWiE>hNT9MhjxW?ktgfRiag^g`b zE!{_v(?{bxP02YU6!r{?w;k`MqjwPt#>Hq z0k4pX)~wE@nvXeF(=S{O-RDhY+ojjD05O}>9&c;Q=N9q6E)I-^dNA_RuBiq^6j(15 z#A`Dpd|arrFuDpFx8CiOO-lo>{Bm#_w=ljv4$eL6;fxI|0IsAJU>XS;XfH(G$401D z$>XV+4yxLd`^ppACMrST*kEuyjeyLsKx`7mTUEBUJ-Y6q?|*W{U#RL8+1fgWchSB1 zJBSZV0$j2^ql?&66I?xt8I7;WUxxWwe2M{Euv`L^c5DO#w+;k^w8Ey3zMD(s{fw>N zD**nf^mv^OiwYy;cxBXS^1PrXYT2yXOmt%fNaY*t%n~(K`Uc5`Ccb9Io}&XgpYmE$ z|9t@DMplNb#c5ZEM7B>O`=mP;~2M{g@uwTEwm5rAi~rUgRdMhJ*&9lM_5_zvKrxiLh$2m@B1~JP=jF$9cu5-2jMxW8JhwCutQe3`sUCv-5yoK4>j5n@XCd(Hd}q6yH^cM$|Divd(C6*oy)y8Q&zO!w-VTS%atqr zkaqd7yRPohW<+&3)32)<4chLXn}4heeUkwh&CVHa-!Ld?`jtv*dB+&)JX9|&*JApS zHQf-RR=TWi<*71V%B`{1x5DANU)+UrJL~sOgTqD! zFt|?iNTu9XZ>W^o*Q~n8;?Guo<=NIEsXK+aIqNQCga_G>lIE-OHX2tar6}R!!Jphe zRa93dEyM5kRu*>+9mFdytWzKu@K#$zGj&Bvj4*X^FYBjRG5G7(gukJB&E%!%cLjYy zF6VKI(-f$=c&>al^pNR%F3{O!PCOWt)Gd3^6ARxF5!urf-9PtCn}azXbl~{vXQ^e( zGoYS~M8#KL(R#;%zn*069pz>@lO`y5?GpHCl7-eG5X6cNNh$U!q<+b_ufr0587$TV$ArY8GsvgQ1bd zW}OSt#QF>^`+o1`4_tJxvv7p79N3L3ruQiHIgqG8QppWmw*x{1FDEDZlFmLZt!JIE z9Q~$6kT71l;Y<*9KU4w`*4}H?iFjzZ&wH?9li$53L9lX-L|#}d+EbWQ^V^!&dLS#Z z1ejSnJ3AlFuCOI?O@=+lf$3(i3TjNcx@B7o=lD*K__L*8^#%(zE|TGTGXBCv{*$%@ zHh8RqvU%h+W@FKe*dD*Xf)f|UCiT>Slx9&!_;OjuJvBj|;hpzDK4m*`1Vkq$bU@hX&|erFn#;<#Iv& zc-^5;h_=6MIp5@2Kkfdq3<}t;xzVlO;yD>;%cSW^CP-;~;QuXaU-r zOE>xwg=_Zii?ptx&VcH9a!@EA5ZH?6uBalMBPi}6+x;RCxP%wO#y-?yeI2@gO_U=Q zBc)!UUh;(qC#}qSw}l&k|9ASzjP*a%9V_GyEwnEMKdiJ5Z)I-+WDYK;Ss(vO#4$$| zH`T7DFG*645sG>g0ARalUY-T(>v(y9a{Czvf$ZijJ*D;chk|(p#KY#(EYz`KSeGl{ zqD1HG)2BtJ(8sNWJ_nojheNmhkv}*BB&jr;T4`Q~U2s;`b5oGD9AS_odGCX4;F!27 z^Ife0wcxcfBqi4_J4C(yeRGVYf%9*yqx={Qz$!D9OTN@1f#pR>{Vr@{>rocrCHF7L z^kHD1QTts};2R^{S^qGxg&`RUyD8Fzq1w#-FQ4K+g&Drh{S@sg>7HK<)wX9?y}B+f zJ+YI}U{>k|wmY65JcxHZVW`>#a>aB}8|kVdK2{VMZ;(4ufs5Km%8;Y(i16{m*;fO# z1;MK21yux)=en~8-gz-_M}9$4%b_PK67d$P@t^$lX}U%I!%=I1@MvVD6m9o&3N&~lLlOt?1kwbfTy=xWB z{O^>DC^rTb-bGuWsLYE2=j(_SQN!{UyfTVBZu49blwNCTsMfet`~%ka@@s#4l5RF( z6GaQz0f1lvEA@BPxYjXjIpqt2aK1l&g0j6V+0u8|L+1gW_oo^eHOR~ke6;e zUiHl)q!*8PPr0{FmBmmSq|@+fIRSk#N1%gO?@b-ZOv73JGgRAJsvMB|N&JYb>=z zpMN!y7AvRn4aFiPNQz55Ued-&cG3+KGvBmd3N9~M*T&zG3o*e${y-{%zB75~i zJekM-9nodgDAnjj@4J6?^zVG+FaUDF<@=E9us@V@gm4<|49G`o7VAQ zjLJtfRcPk##)ZPi@So1gsW0Rlr8Z0E3PEWk$qn|1EUEEXs#R!aU@m%8mHv9a&j6f$ znUdq*tVRpo190SZyEzV0@se9r@Zj<506_$s^WiE~=(f7CV=+wRFcJXOVy$FZW?;#scTR z;JBlH9!G*uqO$}`j?Ul;Uh)57@zZ0N8{_VsH~NB_A6T#BXwdT(Z7pWhT51vu&Mr6G zxKvCLKz2UNN)ydJ{NDFjtqD~BUXWg`;KOjf4dee{zW(K7XagU^qmH0HEqYt11GtDF zbTtHK+u^3~*4%#tbaFEQt&5wyI-GFy+d$p?K^Q;Dk?aOh+7Fq}WiYVJytWyy%{N+XJO7r{N8hXl zL>`ymLrC7HPVfH3Bh2Bv;6>8xiAD2e*tDZPhne|cGt#*ra;VB0&Q~_Sd3R;N#fj9<-Li~`qm4EsFY7k9PBi} zJB(JbAReBP4k<~I#PyKuyZuW3IL33sP+tMSsTz~C=2Pcp?M%DZ37Vl7Q%!EDUEN+D zUwrx3EC6rsRe+wBPYB(H6*LPA6qR!9J_Z7AsF22`t$*=mJn0V#VMnO-g^grVU- z^_lvMB?t%rc`52^ z&q%e^_IcFFQ8AV#B4bug4*lvp+4t|?qYfcKN6oKYTr~2BKmpM3=!O&hhFPmn(9kha zr_TS2K7xG_0M;o62T1g357q~EJw^{g1gD}PMJ(elx&Y6#u}KyMx+U<8jo@6 zzRxI(pAFV@mPbE0qAfB*EddST5@qnPN^Nc|Nnc?WRm$q~M&yZbQ zM|aT`moLbgtG+u~xJ+F|y@=VOR-pRMHoAoPgSyTSBS25(n0SIk+0mpfH4hSYKk%0X zE63^T&)aL+8Xlqk$4$z~$cmT^m4?poFu5;cKYKbQ_Z`oXg8RiYVo$+WAYA7|8@Y*( zWsrN#8y}!Pms&+n+5%xHjbCVtWmq~izjIH^zEmWck0iJzLL(QXU!2PdwoaGblg#FI z$Bp&8q}ufSbatdFYk@jE?;a5d*6p|^0P^oUJ7VkENe*>4qinZ&Np*J=rfDsvEyv^blegSo z?Jn1+fg8gE8)EWLS<1!id<0_(I07+$D06A+srlYyb){K^DCx2pa9zI`;4UpYo6H_| zrujG|-c4f|{CGco6o3L}_#5?A3Me|dHL6N?3U(zlj$*A!Ck9x|3s3~!l28yQ$nsqjUddlA3p z04IbecHVNSE;j7^V2Tj7nGj(}mhlMinr9cb-zw$2qe5opPg@|K`~%Qc{SE4#1>&R# zcwDdc$Cb5fnU}5Oj7tbc^S4FIF3@0(xD$i(g}$5GsBM&c-zL)d-h~QMSf1nSJ>%0Z zvq6mYVk&K(FErr_^Vqq5eW6{}Pa~5Y0?=pQ;h*{mtE^35z^Ngdd4Y z(|rsP`2}tG0q1u9MylH)nOd*VooMLgGToM7H&CLiH(lRz7Zl5rjM5xBprB^J6+mzD z58H2OMcQtuwcZrqIY9O(HoytkRjeKsIjrf#9iC_o@&OHc)$xNo~`gWXm-u6WB%k$O~ z;> z;P_3`8X>|`TG2;7B@IF~@3Rw_W`b29pbO=MF+UQvi9MAZwYOKaJ&z@cI$UZ;?cl53 z!9G#P$cH^4cJSH#syEIo7)cMql66n<&if zDf-_ve*BmFa|P^NGCZ1`LhD*M4%YlBBdc z@Ji7)#v=d8wME-~a4d7U_?& zj6ji~q@?;YZk=n@BcX8@l^-`Thf9_2&+N)Fj!1hdM(Rb{ywK+PFc`^>`-Iq!uie(a zdMn-5WopQtEh&GRN8VTqXM9fQtvs18&lsFV#N_u78i$ZnaT+ynJH@G&jzPpn6w)fR>qEhz)Ww*&B8$&!jMjn^2T zYAuf2#9kAXVDOh-C@Wtu=Qf~zx#iQKBXC`__NlTaDj;IXEdcEwS(1bI>urC8ScA%5sTPA0Y4;`=9_F9ktG4;Qf7zpF3O# zqoZmQJ9Tw+t8riBo>5Q;7c=a){RwtREKU%D@Gl#chx0%!Yd_Yox$j1w-P7;PEC`p? zz8Mf1=(0i1Bl2-yZbokl_eGW4(7;QdvlmM33ivuq#qCpg&vFVV<7QBs-0YD!dXIZqePv+ig5 z!O2_ce>K97&0cvVrI|kK2o7ElOE_QBE!*hi1a9e8)l0EtqvrmSlD07h2FG!UP{nZ8 z^4&KdqP=A-5fg&r3F`>FyUC;8C1E3QqAXl6k7N2#x=G#tP<1(Tk9b6INn-A$$xBAO95ZGQZvIfJ-S)gpHlaP~a{kr0e2-n`hJk zt)`}?Tw<|rG!tPokIZ;`C^>Lzkp609TTS=%G;_+MALuM-B<8&j346Xyp)qJ;o_R5U_q`=Vg_U=tm9Kv%MEGjIlZ0Mef$26WTQYSs0uMZQjN=Fn@LD z&EZ_K+*V9g&fT&`QnD}aJ2C4l_d%QE9X>*HEhmrQwXa~B_R{W+$&{X8r9d$ z7h4?rqz_z*hDudi9_^k{9@H9UJ;G(3`c7c5US&Q>hQ78U=Z#l<$WNK|9e(+FT+5`| zG>bIkzUZ;m@lJT*TH2#^tW^bjPDwba1;zYh7In)^H1tMDh&VKBZRbrm3H@%)5@iN?9m2ivfc{m$xx{48u;aVld; zXvAQ5iD80zDNLsI3rJA9gDOCp$T#gvGIskZ4)`1?ToMw0pyLo+=yK&W(|J^>(;(#c z^Jg+V9wuf4z*2z;cX?```CmTgZ=fS}5ulF1Kv98=gi|iOwF*RXCsecv9b5Q7H;uJ* zHflKjTT!B+p5w-eS_EX1BQb-C-h7P0o!x48=-qVPS?0VAEm-D0p|ypWZ{}At5Cnjy zKvcv2Wo2V6m^D&QTc)n4X#jv^ths6or@BfVIzHSUYUGfT(Jv~`tGTJdK`lbd1RBUa zPw8OD&B>n*@sq!#_(?xb#^F&w+qQT*XTNnMw)zcA^ZsNGZsAR2%-nE3kBGaRVm2r} z3&yvL37v;iRdZEC9W87--4l!qWqLA?K}(0+r=byroh$iCdJ(z6Z2q z0SpgdOuu%ESI2QRl8zI=L~Od`q;nA3PdkRPwLRG$E&PfT1-zk-_sZk2sNK0_+E4wh z^K!KJx!I2nAG4ydg*XJKhDY(zxy{JZ=3z_LS z9TvNvt%Y}?NGlNPOm2MLXnQ+m`5g47({h7>YW9k1&GF2>8rQdSEJhyG;E3_eL@CK6 zjYevczF3Ee8=}mQHPlVTM@3WiqP^8oa$+3L|GX6490bRN&!3?ivv-mhr1tE5YSE^= zM4@LeWmSpuk_%^hZs!QSv4PyAS)f=qTgOwg==A|(5*4hk+J0Z_X-apxoM?aaH;b$v z@AtmtHbo0@Hu0aLPoKMus31npLBfRs?W>J7iZB>ek(j@8ZnJUmFOD_dI%f%&xhz>T zzUv6iOJ0saJzAD?l@ss6z*j~ZrvNI-{pA`T>l4EB;w={5vRio8?1zE%*v^E|Ojhr| zj!~#yaa0A5IJ-m{U>1nLZb*9!Z!?y3ZQSv5G*;Kb`gYw9-dhNIsY5Cq3dx6D;4hb* zOO;Iu+Y_r=47!8tvkrsMiTwpV-K77w?l39<+|~c-!URhqnl^s+WfdRmDNy#?Sa=9c zH5`bkq?PzH1G$|-{VR3kSPI!|F%bC~DIwcwR%I|bGZW^LWzxG72l&&GlI8|M z+az;+$I;5n0EDRI67kJKM zb1<5!S#fDHnI5Kvf!4XuEo#+jTn1QcA_-n|82n$?CO0kUyjv@F}x~hU{6tG(odU}Unkuo?ppZ+ek zYLx+MeuMr7>`2^Y!aZ9w?JNND4(|ofr_BDyEw$SIJ5XfA@bv-Go1Hxp;C^Pt&|bx& zx*haLae4%^%>f2msMkZ-a-=i!06P-FUiSb42IHIkp-uJS&EYqKRw>W{Qq_mS7nKt`pncRX$1QqOq=p&P4n(*fmlRc{%K}A>yQ%gZF z@A9c>Y}fkN--Heu^-8f@&oFc%V_Np5_rmNI+0|x1>`WcsvxQr^ySGmEPYw`jOzrPq zn%Jx~-H+|IxSms}qFD*fh@GWVub{{4Ns3pUI`Nk^o(J7cWqrCxYHDXd@lax1&$kw&l^-3C6VThsFd}s^uEqgLsnpzZECx zsHHW#P$7RU9v%twV@hby*DBAjX_8`o44zQwmp%Qy>JytVN0JJ`@;M(WShw}}OCxSD ziwg_;XqtrjeGiQr@otsR-y2GqUk{(w{j{t8pOvM5W9QEfSk3Sp|InWNa>VX2l30|9F&h*#(c-j!mAgql^+O8@}ggg0_CYO2{6J=%9 zkGNVQ0NP!@XUcUlIH_{QwffO1Koj%Ll%@1x0{A6aU68CeU%BRq^YoPdUa^opYGt5% zV7j9ovQabX>Y)K>CIhJJ1Q;1R;W>5Phkmub3&eiAB^ERK;*RKcvWwk_FEhfLBl9c} z7X^kmWPynt!(uL*);za~9h#WyzT{n7PYM-5E2l!j0iwlgIfe9n>RKr?|OzY_dY z6=(`oxQGur@7!;WWfr;Dam?ug~Sb0<&Yv{vakzPJEr+j!5o zx!)A8|6c8hfRsv0^pmH2+6SPTMU37OW%D5;lO^dvS2)yZh@^=C;g6n;!UwFky;7nM zySQT6+LNk5ZZLEV`>{c#g*9I6g(N2LP3Y5CxGi@v5-VZk$PM8jX+yET*Ske^7R6ARm3wgu)G0-@r41XGM<13M+10& z^%?Vf1|)Tbm784(O^PW#|DO)YrVAZ}i5K4#u4_PA~> z{Y);U!eX>OJJaHBTZ)*w{tRl~mS#Q5=Ec)P$l{A~p}5>5(0R}?qV&5(5Z#f7dB zYpHcPbHWD*9fv7OYm&OOUvZsW85S3f z3f%toxCnsp3l?JSNJ!i%!ds6{j~nU{SLOLCvg1(GhRB!n=NgAD+*UkN{-m0BSzee= zTeZTI52;#97p2wQxnqtYD(|`c)ijMnAC;OK0U1W?*yvZAU{3WapaFTb)msZEzB1yi zwpuKSP{@79G;nLd`HCo9vj_Tj=%NqDW4~R_i`xw0Q3QTAkC%6Z2+TxxpZN>^I6ms@ zsxJ4M7U29YxVAplA-^{=(x2L|dn46%O?$*yOy1>(&N+NfnVSAz844c4-T5Wx?qc5f z9I0ID*gR9ReR5Kzm|;M~&hDjP;yGPK%(A%y@HW{+`CKO^oln0Vvf?xOxIA7uzAT?b z*i;uFuxiM(7jB(}svhFhZSJPklLO+4gZ#nr-vV|2mNfaCKR&XV&OOVg36>YI`qp+4 zG%(3bdV3aU8--y|7dU_nr_TMhv+3`?&8NJzNe(4I_YKUe(b2fdaJkArsA|kVIt8XV z<-(g3TfYIvn4_aE{da==caQw@Oj|)vloFp_Do6r0bR+&E=Tz)#g&n+X5MrTy0donq-xaI=u6Rwe)s z;LJ4Y!6|D1esZGO^7*HadJaemH5%Tpt+XlvzcAq%{#N$>?&PL$YcGShR*ALo9u;|Z z>L9U6;qe57-(moK*XR63OH{uLga10Le{pA5zCYeAKFN@98I{oUp>W_?K2(n!tM76_ zzfb%B^@P7}Ny_)JMFk7!7JBP4(Dk@aUtmaX)Iwy9WeU=zk{LK3^UM<_CJzcrLI! z`H4pu`y6}a>YqJD_$~g2yB~W0(%*(G!(+%V6VPh+s4QITxc}^VPhgAaMy`6F9RmfN z#H{_tMp5BjK%Hyf3s^5P{j)0rdcgrfJV`|~5qrF{e4rxcRM6Aa`x~a>Ul;Y)sdvc> z!}!*{21syajnt3oaRIDn1~f(z^v~ol&BqknEr+I0G4l%5{Estw*z~~UzWHU6Idi?$$rc~J*GNfT}cdGPQMnRrwFLX7sjGLjLHA~ zp!B$avptX)1V3&L=h5MZZrN|>{Ia`$ccg#6;~@ZJDm&w67>Wiq;UoIkN*)y%@Z~pz z$zNOlkB3P`0cT6St$(Kac?a`Civbh3HzXyre{ zzGSbo*}p;zPE+hUMLOmSK(?>r{@RI$vJIB#|)RCjgjg&_nDGLQI*hznr0;f!U<@>0i zi*4tJo%%=zEi4B_gRG59Mts(MzR*J2djX)c3TZ%^xQ40AzoF}o;Dn%|2uT`?qKMXTV(EgM1!ubQaYOo#Tz%JcXu2UKV$ffh!xdsiJ!oQu2!4Clx6#<(`7FEq`#3Hc4a~*ykms> z>D?XML3D1pcchm2RAcoORN%wv3kr%S{V}cek?70X`UgSWKd(P=yPkfVIEbIt?Z!^w z10<6>wN*M3)RQhMnH4;EXTzJwX-WCV(8^X!7~`QEoR*@`q80`q&(xiO)nRlee>yv~ zM>!z@t(@i;&m5b&o2KfkXr-Moc)xKJ*SIn{S0`Dz`}8WHo0KNQ_SRN0g$mzFhbJ)R zh%+{a07DU1fQBq?SIR*|BkCE?D!o;Y#M;Fm@*CymikIUU7@GHoYU-#iH!!i>8T>Iu&%WjNO0o;J6-@3;uyrOq#4%~Xl-Eqh#!#yw zl0|&~9=aP9PR!MrtZ`Imix%i5Tu&=VI7oKc$M!GT2R8ElG0Fhz+Hn8M zC^wWC|MYpM_%=U;%dSG>YHPU{fc6f5f0&*1Pcn-Mp`oFiBqU^H5m8ZkADyl2Gkq!% zvvRW2bswJ9Ivv#Wo*Q3sb%mkldT83zhduw`CP>U4@+ zKUMcEJoO@v)U=kNZ)?I^>(205KOBc*wDfORZv~->Eep!+ge+(&0Q$&aFjofvpa&>J ztH8j?*N+1yX$3(tfD;mC0DOrj2muHIoZiWXbk%wG+d3UN*SeYty<}IE<+>}KlGae+ z$@36>b;$bEs6a5vM9V~o(0d(a=&lOK1agh{wkAVnDI&<3PT6vdm?KdrbVTYh!9r=K zZ*SWAgOKH0@25UXP4%nUn8U!#wa}8~3P-*datX{j?4EPa`G3j-tmP@#j%A^)cJ5`b z$|vd1o>h}2-v74=GdStOUzkN#h&zRCFa>=-^Elkz`;qK+-v&5~v{YQ&eEHv#X~|tw0&mfJ4v<$L0k%Th}`XK)l{4K@65iCh~Qp z0Tv+`ywZ3M3^SuxweX#wO{)-sGK>Dat4_-c?vRYo@08BWM*OHU+qr9Tv9Nz~Z#I0p zsy>BHaDSt|zt|vmz{*da>cH@(B$;&3dPg(Wuf-wsxQ%8 z947Gs>zYh(=^DccHug0T;xm)sYZReU?c$-X$w^%4mK!Ks`e-#kbfSuDQIwZ}2HOQ! zM_M+>=dQDr&CQ&t*&AWT*fW`B@Ehs=YyWR(2jo2uOKyWxqLto%#VlY-oDXA;K);Rn zwyr^t(>I`giGczeHxox?-53QGfrk(g5+b1-z2lsQ|3lT!*H=DU%BZ%X0sn^`Ksaqc zTB!Ttdnj;ANk{jVv}Q@b@nm)(!EBZYzC6hAQ%b^Zko3N*Bfg?l)*I0(okg;zD$)|I zkeMw>TZ==59f&zu+p^kA+` zTcC~~2E=KcocgGbEm zT<87g9;jAMc?$3CCjwl94YY|a-xqt&TKn?uuuZAp`Ytrx5b&B$QM zl+$(9FL1J)*IQ7(Ue>W|SkgS-n|cVm6pE*IyqrqP94!~s0@NeG^k|?JXe27^_$b$X zcaao8tIPcQ-#~rg6RZzoDjLtYfp&EK(%fAb=kkf}==4DjG*9p_rAb%V06P2K_12-C3YF*EoA+;^Lsyb`O5eZPoPlkg}Tn>oQYG znIHDnU$sewk4Pdt#6J^3A#qB!X|g{j>p>yYTzKLurMNZ~6hUx(p;*GxKS+|Xk`N<`>}*qpy_hm} z{y7Zyvzh0$`}Fq1AZVLwsZL4I?!s|8GzLNZV95=k4qpdi+ojna$fe;!G?hxGF-QC^Y6I_D@cXtAfdvFi#?(V@| zgWi>YpS|yqw|?vHHP@_J_0<@&d|k{3^?f}QTgKG;v6A9cbRM_2JK$xpphu8I4Y8AB z2TU1Bx-kNx-VGsWIim#V@hTHrJ?33VX~4h-JGKQ$!3d#Hwt0D=oo5>iT(3wtop)1Y z@eS*Fu>MLs$YWVsN24c54N}SQq-nusQOAQ!tbnl*>Vq;;1SB#3_Kff}`IwVe;${0+ zx!J$!Z(5m|^U+8l6Uu(Jf-%Bf4Cq!hCWbXJUXw$M*0Nw7N#wERTp`*_97!;u@k2FK zwpa?@3HIH@BYtTN>L^Xa|M;GE5LbH6o09xn|(f zx1|kne4aY-TkE9LJin=Wv`jFb-aRd0NH~dB?aIQ8C5we)TDVZb+P_)EJ_U++dhUQbLELQdr-lRvE6)m zx-ZtPr)SyX_P8?DB;eiHbjurTpri8xs?D229?c_R#lOr4OZhB2wXUZ9qaFc*-JXSM zP%oZ&swJqAF%tjVR{OU+d2rAq#EXG6FcLBChl2T`*20WJeNtVYoPS?bF0(=3NrHT@ zcBy!IQAs_nb^~x6c@r*MopvaMg-Oh1Y^Wt;iTHn+kCld9(MkNS1b=2Thju+%9l5be z&5hNllN9Q=hyYQ-0O5r$ngy84Qtw3woE8)473vkJ+%A?q|8`gru)|FDZgFFNPvi(F z73r%?ev9lk?hB`)w;G}(vjW$QC!+;a1kzNoJ(B(gwvr#=HHtRozpX@@-Nyc(pkY`A ztVVVF8TR#~SkUG|3I2LpcNonk@nj~=;SQc5g&cFWk6wi?|A zhNAc!|8A;^amds!2ci2Vsy!4$BUhap&7|r+U}7?9iKQp?AKeO%*R%k#!QE< z;LK%B=0?*#@^+*A&xZK7KQ^oX{p_AI?t!x=K5ziMkUWCx$xi6~IzPCYL-+y+I6-F7 znVToJuOo>L8y#ES!EdQcJ2-W zssYlEL9Cw-9OS zwpavacQx@zD;7l{21!EEXz!0Goz!$57uyJHH5z7q8wngXtKe3*bCxk$eO6p6ZSYG(-u7`EK$ z6xm#VfwNpJCTE!?lj5!MJ!S5*ZRz+7mw$of zczeVqrsH2=xmj!UHk}vx{$DSC5^ySRf);WAErNqrFaKk$mpB)1M~A^w8nw?jN!$b> zLT5X7B|%o8-@LP`bJf=gKcLiP4>mY^Ab5q%5Z~`@#p2kLlFVr&Mp(!wy2v;tx{Um_ zSIXSYP=`A6C#r1o$U1$xw%I55tHp%A;C^L$D)sYBQO~o-40cXEDIylE$z}YWEK9w$ zx>#$&$&)h0`zxwyVod1wwK1t)=Gr=h3_BrCoZH56<2HBi4#zdQ8@;}PIQPZs4|knhrT>xU4l zucn6XV-sGs2MaJ9mwFqd^}%llB0I;3>b;@bGbKy)#iPR6Z1Nt1 zW&zdFeZbjnD341rYngol-x&|=lzj)!cMid%5IR&weY@DoPvsEh^i?jB4^E^?V0mc} z4N9KzCdb2N&~NMAuV!p&ZYGIy)NN^PC3V^sO|}%)2_Xds^z`&x$}UPcthZsju5a$g z8vHTzB&26lWec2 zt#0o3cYMMEem_!DD7}5WX?^+TBK2Adt^>0g-OK$>N2_?#d1hlcf}$2}_8? zsmYavHuJR>6MYuQ8e0SzoJu6_?i85W1G=`qWDc|f#v>Gd<^Xp>Qyle$V~kMPt>}<8 zc>f7IS+uH8uu#a^Ih?WBZa$&mW%2a#((>MzVmpqyc-oX3)Cmfk@VB4jz2@Xv^2LA* zZugH!Aj5P7`}_`x^#b`k!EAJR!%($yQ%V!t?~y*^!*>}G8f?vEggktC?hD(8jxk*V zFL2f1rEhRoy6S?73bgG-!$)6N6sT^$1>T$H+cbqd- zHmYQiRjjVxJYNAWXx%zeyW^R-FnX^DaTJ>4*X+T@dBoleDD}@CDQK`e*3RJbQfj4? z&lUzUIf$O%a$QM{WfyJ#0O|iEr~ehdqhkasOaJw2?(^P9|6T`m!4Olz@@)F|w%THW zL^XsNeH=OcUIU;_0I~#;Ns-^${}e5#N}^aIZ5KyGcG|Pbr4mQ{+u-Pz7H26i{)(aJ z0=Q|7m*)zdVWO>f!qFc-&zRmycS~m#tE8+*s2ja70c>B@791NvOwIQ8wY~in^E^nP zq`43+)HW^h35?1j|8W;DUPqgE+Ncuz(J4%j%c(=|_)oD)t0&}=tstP7-+++MGjemU z%<*y?BM$H8bcJK?3=NypO4(s|Bm)-~VOPxXt~?ZNfSGV3?77Bkg8xLo@pGd+RZ2e@ zG;PWD>+M3$GBT;?*>am1&x{61=zOt$@FkaZP_iwg0JlIK(v80|uN9dpN4*t8z&FJ% z1lgd7I*!<#W-_7Nc@Utiw?Zc}mhbuCqF7?=QSr7jppeRE0p)tS9#LgL8jZh<#RXmK zj~VqTIX$!6YwK2%8<#n{kp0g zw5e9Mur;3L6@E98Ocg8$MW_-r8~F)gf5-_c#ZMti$kMXd8bh?4CRU)zaXeA9p?fyiK-HN^KMvV+vw>4VOyEOw9h$Q_DC7*VKC5gUG!C^AO%x%C~Eih~b1AS;b zP}18PlR=;N;qft7^s>9Vy|KIx)a@*<_~h)+?4#r1t7rg<7)@jOso3RRtobujvQXpL z#Q6%C&6}Eds9y2cB`42H?t#17g}W9!}NUzL(}7Wn&gzC)rF20FGDUnpN~{+g><)BQy&uedKeVQx8GdLzR^ z!)XuPijdeQ;D>$;x`$xz+P6C?Q?&b7!zNIQ6*5a^<$u_zHQgP(6M~kyK~XU~lgDCVYhc~e+`%|Ea4b?Wz?PR;Q>T=H#m#1_&kyWTQP zqQCydA(dY>I8U7o&GFy+KvFF$AjdR!I@f8jv-hG>YPI{(<2mPna%}S~0Y01RtE3)x z50gos&`<7KmqHn|b>8-XsC?)G`X!7#0v_lKSrB@K`2&!D# z$G4a^A6KM|{#|9h6xP2qx13Nh=qEKrQY;ocX3MnY2AyeC(&zEqbru_4jM(L1tJS)w zZ2)#`y;o{dgrcb{)Zcr$KSxomp-7OtKdsQ2x7_Gt3j2RDsQ*1_MGb&g`cKjte$Q_W z4y_C_R9*(k5(C&`sdzFJexf3!|D5z{pw(74LL}T;21Y3+i-qW@<(T4zvy2M(t_=ad zfm^YKUI7GL8>XG!Aiw-~rj}_aHE6x;4WC~RJ@I1hs|o8O>1{>(Q{|bIZp+Q2N;AP9 zRZEp6$oQq*y6Q@HY^Ad!hOckC0wpwY+EAbF2xq0<#Tk<#Q%Zsf3uKZ67wGYKr6~Fu zZP)zMYX89Zir?+TX_Jd~;Iif-f88DYQ5InBS2mxOY73EWwLSFi-!G1n%V_kM6jsi6 zQpn~MKMGfE(tE0Gaz6}jh<@iE$qwKf=aW?thOKzXo*M~-7`@heC2}Vl>M;^MLiEAHFPASLD^34V*mK@x#VVvg_2Z- zVh1G0%4PZ#y|(SLvwVwd-l!v<>L_fgn|@+dT4E$@x~b3C8mczs6U|5pt1gl(sc4GN z+{Ew;G00d38wHEQb};~>Y~G*$A;TDgU{G#JtcnpmHwtYvjYq0B;c=Y;GX48Pfk8!0s= zRKL>b-QA3mp00JggfKcUT9(LU+OnC?Do#l}S$B0CmSa-zPLYwDj7~5Vxa-Lza3?V> z_3?_zW;1;wI9Rt1FHlIq%;IjSd4S-mJQ`NCiLS2kiF9gPrrot}9viGe=y^MRKCToc z8V-|L8cY$!#_Ugxz{ZMWAyRQk1q0~T7)6~6Efc5ys^{*b@SLa9=|=rm=S=QIHa zO!{Rw%l`ce%XazqvD?RNpibG{H6p8=bRwg+o6(eJPUVc9r$ghxj?b3!$v*gu81awJ zy<2o!kI4XHr(I)Br=87wG0CfX;(on(oBfMdRs|V$#{#+kp=9{MvBGn29_4ZM&YTfvUu58;6wS{} zi<;1npHLCru%k&GNL1g&_uq};Z7jpE3^J49DgnKs5p$Q z4BD*f9*71~QmR~;WZJai1Bm1%kWZl#S6f}X`iu5c4@|;6r?F6oE5*FiK@AXCefpkX z@z!4?K{!U>kT)8pEVcHbN3`K!t&HaRSy|LZ_#&5> z)ahaq;6avW)v=BPPz2iJk(tv6Gl?!aTsSUM;|1DgQ=Gg5w{M=7yrbb zhy=;is#PZq{2MtYNVd2ffLg|di7m_+XGS5L`GEv#xB|GyeYxC9q*=!yGx0s#C!9(} zy*VApSm!VWLD-_V0H#6d)B7h zRynjN?7`qR8ATcbF6%b(bc|Wc9g{jiPnM*}vL9hTz`P#AvbKv&eUR6wYmi(6vD)n5 z@(UdDRM7+xujez_FSV`BSNzyb}V#q7^x27JJ;RWnwRszEdKo&A7e>VSp;ICECJ0rvXu*T2^S9WVs^F%g!70L zCSm(=(J7(&+k(CoN`7}B+%1OcK*Z-H4SuJ&V&Qn%Z3kE*;SUv`z*(c(L56X;D>G;U z-K3y(dH7W&zgZU0N4*Gd*0skLJB)AJ6R4WJ;1l?@~Z4Pz~%4CFpCl;>eU7LN} z`|AcvpV)fSj}#XmSE1lw!aGF*Izi$JhreHX;qCK#2c4;+1M$^SyE=TbP<^V(YG_6c zyZ%{3C}TKH7TwwT?nyY>D$g8(1L6zV} zpQ~;M2S^oARVFx*ng0!$&tBu{(M)0>ap{e+S@DXXzKCmNJK#MV&A9cl4lhLJW}XSnLI!8Oc8Ta!Dy7IYt)pt z6<}!Z1{qTI-!Mf+L)Dw*QV~++PfM^yq5K6T*kS~qubQ!t&YuaBM*EzHNfEwU80MKs# zpF-l;c4Rr}$y2(!eCkdcBk)_8`TlmU$RW_8x zq4*mo$dFsY_w^Y{lssqJ%biD#9}EVq$78sUxBp)&bYrvb8$ z79P9Y!nNWWH``=Ol37X%rP$`Uo+mt7x9>r3gnBZu%OB(b=*kY0Ze3x?5cP0+B>B9Az>Abvf%sqa~ucovh|J!gmKH z-XZBtgjLHASUEGv0c*AmLdfz6xiQ&2YBM#uP9oe#mE|883RR}Z6_7rL3IQBWA!0HA%mb#3B4ph5V~ zuK^XjdIoy^kfCFa!bpDQYOY)C8Hx!Le&_@O+U~Q36J-&)ggJ3Fh5^rJQv~9sp`>;9 z$358h%aI=gW7#|G3<$(Dgf9S=e|b}q8%xaODU?7eLA2e=B>OoLeMczzyBbQdel3)K zoBL4RRFwnrvsw$;POVulX3*v&WlnYDGJ*F~F4-<;GZ(QBsUO*J;%EC;`_OX?!i{ym zzSfNMi?e>7RZVaF90EUO!T1h;fnT@7l@}xU4pr@9iz5?X8`)nCpWgE>x*FgX30_T8 z#gX$C53j(Yhf7CyMTaq_s|AuXMJAVQ>Bvh<*cJ4o@jU%YB5ACse56 z#l1EpR|*8?;u3>I8Xaxb?0PddTb~Y8t!l3rUrrzK689WZ33jC@MhQb#fQ(ruJ%l<- z4F>>(plhx5zSl%hgn~TD1J3 zdI@rhUuAQNg2b_etJAfSki1Wi3V^QAv@v+;JH4>uj`*!&yQf(!>c)sh6{FoU9v=57 zzlO~+g|hg${#x(xCzRphbCIAhs)fppNmG=@u?#k007d}sW}Y~x&?lY8O`h!jR_xbq zN3O~E0A-0J%-@?sG)t<-knWmh-xrF^&fJchznM!au}mW0+ql}DfCsVB>4%lF#P2Q{ zrdAYfr&M7r)^0b9R?^XM+R8l8PJz6o->eM&Wi}Gv+`Y?cU_j`NHfwc`XdU5pwu&+L zG@kXQkf7H}UjMWCTcP!YgI&OT*wD$li!PHaKK+`nQNl z`OTq(&@iO**C}6}MvBFQAqDH8OVgXAUYivQBBQMUa8)n5W!-|4y#@Z>o!|Zzbx4`Pxqzt0PX33 z$$$cLg0L(x3?bhm^5Y$0o@EAJiON&hLRDP=wGV*b`i2m0be(jXT&H}pFBDbK37EWd zl_r`>qn2xC{vAZI9G3HWS;oImP`*cCQUzV@4Sx?Moc?`Qc#h??_x9Vfwov_oC8RuO#bMW>(>e` z2eHfUmgk8fhAl*@`cn1n3qIO?-9OXInzBTgz2GK%y7V!=d@640Ihq?0sM)qGvv(6iV0f2gqX@AE;?WVPKNPb{G2-CJCnLkPE>EkhN$4kKb$Ch0zsFU_nL(F0=XQ z?+5pwf1QrW8tpbyk6_f43InoXrfPQLhyD8;&e;bd{T!9j`UlKwv1p-YFoP7YM`N86 z2}%yWCl0b3|Lo%zFsb^-MC~^$NjgquSF?FD-884P5|Ui252lCdNtbE3z*L(LNEtha zwFV3W*L!18(fHaxqt=wWj5P`Dz4M0-Y~&wGW9kPI%}AS}42Pg*MJ+lBQwjm6YBQoN zvfazJ0QLC7O5=H+R4w~x6O}N6Gep!P5=H6~=yhn)fElIa%=(yJhs;G>VwrV)w%pZ7 z`|GXN@La4lG%5o46DO6!ACsvlx-onn+?+{`Z3g6}$$Ndg8UjLjl9}0r9i99mSxg-T z3gJn80nmKDp3sID?{#m%3*&G4Wy=^VV zB;XI4sd8{L1rK_+M2=&T%+YB!sVW9MkDDH^SCEEsV(3-)44gfjcgl=jl#79q*@YJf zNoY}(q{a@~KC`-$g-+5o_90q?nNl|!Xsi-c?zKFM?;KCYwfmwF=Y;;9X9Rwws=3vb z4#rlCP>_mAWThR@sU1kPszqP&ay}=Mk5?iq=9~p}P20j=?e~3uNML%ec*TN`hOyt{n{w;lUVp+z{5$pzVJ)iV0(#Q}Xzqm{d?#U>}3uLuyg zmd-R|h$|p6ln|a3Sk&%aU0p=PkS{p2he z1rw)IyxyJ^c*~O+yIUA3tCc8|L)KJ-V&1+ftD5=&6QB~*e~B`E1pX)sk%~XQSh*C) z*U<_0Zmg_7lHFu$e$b%j>i(==1o~p@md{Ry$)sQW#i+jPF^wTq)d>1*Zl_0v9QQ*otWsycN$DpYc4b!Wn1H;YBE z(V%*1QIBAay`^}YpG(MLl|h5_m!(MZHyM^{_*IoRz7(ahyliFCb>3;4G% zmzjL%zTfbB#3TFG+u>5Tojb87CmI$t%9IRh0#Yi}&ZJ;+?b{1KVxnu+c>m-aQjYtL z|9^F&K83wQ2|%L&EWw|euko5^zIIn-8qz4loM`UdW+><2P;oNfrcJX?*ziJc3G^^+ zy+Y%8e?zSaN;|7>8_EBvfU!eUosd}w4lwZbiu&nhzG;5IM;5skY40l+w?Q}ghcql2 zV7k$s7n}ajGRkUsd#ue)Fek83kDAgl*+XM^E}|azabY?cU~iu(Hr>qJ=fU`rQ^H&U zlhf|S>!#*JwfdXk<6siRaBQ7mYknKFfD}3dy3#voT*|$#B<}N78Zv5I;!1p z!m~RpRX(^Y!0?bPbLFvFPfIKQZk=#mLszC%nH-f=&8%v5J?$HuLQ5q;Q?jZP>}DL0 ze2JJHm96QMNjBNaGZaH1snMuX*V;g9>F-PG}L=H&ct}782GWAOSiY zewWxNwez^0Q~7nZ3fEt$`#Q&4S#5=VOsO^bQIvL#O(@e_`dsoxj$f5#quGW545e*d z*YdlGsRt=O=a54xhTz5NcG<89)CGi!d{`w=F-m|G{KLqCLBbB8S)44=;Fz-z zv*Md(thf7$2O;)&*2&l>#+-7)^Tcc0OM{_Z$VcQim1`MOXmX z+N>$&Ka!FE5o!Fs1P^Nc#LndN28#gqP-Rt~yPItBxe~$b1{ru!E^=%8;U6egyK96g z;_`^o_C_6=UbfgN{iF&ql=E8;_WLelYtf7TDi$op0c_PsUZA%vtQS@GUZQWRZ-q7J zolmvHVsQb9j_SlgBL$#XXe3-z^2F`d|G~6_8P;|k0ngkSspGKww12*+XN4u4Q%#6+ z9X%0)Zl-)dSH>{49JKiY_X%*_!y=e*9ihctEF+FMW6`UAKg=T*W<+5KV-+0n9Z56V9t_yn-%DK>tErD)6Oy>hk>2m zVXoTRK7e9NoK0-Fh|QW!^-Hnh)`2i+o$QOcd?ssDSD+-y@dCYxcU%!9%FLW(vtCY&!(MD-i@}%-mJMI< zdHmGfe0>5*T&yuclpgWHSkO1&5w!jZ>7`>!4{C7Vl1-q@M`_NK{G(i^O9j$vtxIXi zljEcYb>)kH6z>Z78`&L8!DhSE5;&B>W@9d!!<~J37_rz>udDH9D+ijNLsoevSOtEgtQ>bBe+G}0W?)mA+9%%qUBrcLGODTYUyZaJZ| zl@n%+a_I@Rb$@zJcU^?60+Mc<-f)wLF` z53hX{ivkK?ioYfjMxOXl%{gIUpAObE)z&gRjz;&EcCVaHXnEEfh>r3%Hr>D5uW_9WjqL1NC=^TfrQFFl?7yZJMs}P6EKSf) z`C1|8)AhbwN=rF`x=vTQ`dF#ug8E{Q$Fu5#UsSz1RtX}Pn07b>JWs2vF z1gOL58k0gU+kYgbYPih5s0c2d-TwP8GZ~%}3AL66ECwxoRgQ#Dj)3g;i?Zg6NET~O zLAR1qhwIU*ijXcIyYstn%$l(#2EC4ehSL^mqLYm(IO!DXl8fW7#U*pf>%hKLS5cDB zV6V>|=aj($(D7c7p$|l_ekX|nM)q@22fE$GFSS$-Kc<M>R5kxbPp$piHSl6c4cqJ8ikmpyuyCRCZujy#!d1 zVwLZ=px|Ju+W768vn*Vs(qwByPQ~BzK+Y4d_scSR%G6D{(RMCf&F}8^wyP8)B2t{I zv}*5>yVSK}FqQaSopvxEE}fc!%)Cs6S7S8Mt+_~{xL`hWA?mqCxh{=-Z+wG>y!-mm znvBOr;-9!58dXc*v00La`}tbk#1$2>t<=kc=2R`;9!T>A-E$1*zwOi=eiPkux3bWw zw+--gv60f_wSDIg^mh^;%i@jWuNx|CwvM)qbL-6F=duwG+J}$SBI0IO+yfe)m&9gT zHvo(aY(u0Ub#oG+N|jdb5jwGPWos<@b|+SX4AN+`-K!xbtxp{qV$Jx+Eb}y#BT2;!5q(j(Wv{SnqhrgEcc=C z-sC2GG#OL1rqDRRv?^OqkS5!4=l_Jdp#&gPngtkmzWA@fn+G*K_!j8V;?*v7uiWEt zzrCm>0OjRg=py^;!=(wY_k-k=WjH!jtgK?+PCrUD2aKd#tUj4^RPq5|(*}EKh!@*;w<$0TBBjeV3~!~abkkCCH4VbhPq6x zWsh}f%)bV~rvK5Am^DmuUxYcS+>z=scLm17(}B~?u|Q%;wj@#ANnMRO(9Bqft6Y1c z22ncm#t?A9EY(`DHBgE1vk5oxvzd#*Qh%!d=6ATwC7Cp=K;CH53Y=-|$*iS9w*Uz) zRt#&0fqC1)B0#XcUMIBZ<8Gq2N|+$Q^m=Ld0P+8R=TO0FHQfIOuI^%PW#FI zB`dK_YD&l2LsqvTb?}cUcZ&8eQ+{Iu<38r>CNeq)+f?;=DvgeGPANHUbHUE+FKVSh zvu4hkQGy0-nnptY?Kx8}7m?tc<2P!Z;Iz-eO{1AiC~0qlrf8v-!k^_nCTNf2EiqYb zTb7I%x&z{i&ph%T0&jYN>0MIKt;GvnMtaNbpnm0 z8caH5YtYb+7nwMksFJ7qs*)N^|qSBI}}kqh}-J}vZBt&1gE@b5G1 zJ;9w=?KPAb@C13-teN^Eb&#PE$>lG7{Rf=8>_e60c)hq*R2f@y=3-HL!t@^rxGglw zz!EkYR$zm^SUv~&S1VN2YlcfIL{bUH3vS)Kw_TnBHAK&EY+M(I6XXNdkm8k?o0`|7xw7z2 zlkru6#Ux4{N=5Zw(Mv-j$N)YR%bV5JMGZ&jQqHO9nJ0mHd$@a_aqZB1Uwu9rdlfwb zWRxoZj2r&Q`1a$?PyLo5b;W1vbrS#DSO8FWlaTYIvTfet91 zCru@~p#M7l9aak_;f@O}Q~iVr%69<_eWhdPgHY)QLcl%~KPrQCThl~@U%LRF3e9$N zJ{D2s#!L>2bh*%VYlKL%kwoE~^|e%fY&0d(WKk^Pi%Fw=v0!$pPY``M>iJ|=E@Dl> z!<(gVMkVLkC(0X1G)WSGGD)?y&f?tnBOz0?R0fL;0<-x?L+|;})z-InNVqj4HmHCY z_UjIY<}FIVMw>?vUlamX z1*d6Nb56()u~N++vQc0>9#`9wjn+BHMx-_M<3B2oF#F?C@GwUp6iO`C5+!2-ss1`SzbDjjwA565PY zEU9^4-+xlJqf@CY4TxRUaDSyC<%LT(cBTcIbTUpzFaK+oZC8m$=iU53I?D5?{V`pR z3D1C}PbDvzq%Mv|Whoro?0Wi$RA<}A&jOpo5SY!!ouN~pm-qzKd{qR$CPJ>FJqic? zo5sWT?DMw?_1F5Af0l=TJ^Fq0W!<#d`tLu3&CA88toHWql4A3IXQTqI67fQd$5Xy` zXT&mX9DFefNNO!rHF~W6zUs_yZ89=^n^hdAj7mJbn&y#01wD*D$ne`N1k25(E9Ro= zBZZ3upAfGFazEA@$-Y}u?-ITUde5+m$4BNA$F^hDgVrKVHlie@on~KK{^$z(qA^^+ zj-`q^UL?wY;!v{h7H#shyS?n4{=ERbkL`BK)Fa)Js*$giJ&n~!Pk(*(;e-oOFhL8F zO#GYh+rDhlzuYoI)3VaIbB<>O_rC%6|Ki<@i2mhfxLsT*8X$H=Uj0Gu|D=(UFFv@h zQ0Kt{Q3a6$;~gD$ho9{Ie7|EE7!do8K3qhlz%1!8ce5p*nZ57v`?1p7RQ_&bFm*mCjY119rEh)a*1@`L$Gt0lHyK(v)^+ca}mB1W_sBcJ3EB9?!*UH zd9Wzwd%Qvy2*Qdsbu#G>ZcI4Cl1A>%wk&grIE8+k`5bk>8d4_QsUN!I5_KAx=#)Tg z=50_j{yFsLko9E+Phq)jk`b zl3_S1;0pv#Eq0S*5rC5b%4Aq=9CVfBl&~i^yW}`u@g01y|xX0m@?Q zInfU!3kraOXR(@C^21mWsJ9=G%Lfz`hejwg%oQ6t54bXz({6R6uE8xUxJPVOa{ zEq=8MPoKV6^RZMI?fGSOOpN{GJN#BA^AoZ@Fe1iqOl8(ehTNi(YH^QJfwo>7081h1 zWt_rCju2GJdLS7l;L-oQ!tQEYSSl**G=%{;dcyEJ0MIjcQl;N6K6iART8A@NmMik4 z9;txF<$eJIY$YXO;VV`u1H?M>w2>2uppq+ouUBEBA3p!$1PsPaRk{qP${64&VDg22 zx}*&&qMWbN>EE5fni2zzr*LqzI3GvBArmn5>FMdgCiN&u=FrpaaIgvQa**7h)F@cj z+o(y5XD*2?C>$c4F3?3Pxx9tF@dU4?w{5o@u9H|L6|2?aEZ5t0J$w=Nkcc!MS`C-Q zbcM)dd}#M_sh6y1pn$2;Ye!#S*QdB`S3ebZe>~w*=}(lR0^*ScH+{q+E`Ww5gF$4k zlM3A~q&Eo{PxQL;I|fq`DfA{Uk7KghB?1v9f_`bguoHGPM5Dkb$H%0_R=@T$rIq?` zWjQIV5e9zD%BC&4J&tlYpBAdx8T_*R6sl=!r_*7~_Gi>=Ad}OH*}M{+Dk=iLX!j5a{3v_CW5|Ck=~hQCTwSlOd^lAr0021cW!T;EED_D5 z!qS5oT|!?ml3!N9S4N$0bec?V#&z$8o-YG4Uk(}l&YbNs;bu{YlnLXWSpRHqh2R9* zTjq`44acQ%*2r^N6^>uPg`Sss`(4~EvDtneinn~ZW)uI}@-5YKEJ`yF?0x_I0Z&&` zVyfW7jy|AK4npW8hASzKPcNPQmni&+)sam766|dGp~oiVVW;Q#Nw#CSU4gWw>Tf4j z+VBbESHL=or>U9Y3t?*i*9Q#e&>MQdBhSk?StoS%wmAXNx26CIVm>v2X7X76(9_90 z%1LTzCZlTU90dfNI7nw^UG{CVRZ-h4Mt!9=NiLfi4VT^CC>;@99WR~PgBI{3LX;BJ zw_D#?@yOvUz`Z#Aze)MCGU!e`av&zBx>GuD;NjuR2|APn$s%e{^z25T!h*?M?ddXK zCyS%Mph1*>1YwoQ*^XKh_Hc*$&qyZ|&Y$HLD6E$i^k6GeeuSX6=V-PGH^Y^(_n^Ob z@;XJViquZTb&~ob3_mr~bGpwv{eCy3gjA~)-$zAzQW+dQ3{A~8e)!sob8lSy=y!T~ z`NTk;CXhK}63}_I^Lb7tXe0NUj_Ql{8U$l%vWVFi^ag6BW4Pb3d+?HDu9d?Oz;1z9 zhQHgNjoeWF*CuQfA_!-^+J)LTC`Zv)Yu_T0g$Z z>b{d_+Bq1NfRC03QJ`L!8BvW?GbV=$k!{MRF_Q=dz<3T!pm9Mfh5as3v6!lmFc8DC zt*|FL{|-bixB1onrJokNV_M|d|3UBHXsH2*)GMGI(NYZ2&DAW`NT6Svo_4O#W*2L5 zwt}2lq7@$Vmaq)ljTZkL%n^uLwX1gr*gBzruW+C^9Xdo8hm4Lqo58>yeJ}^BE{G*A zjn+zZla_{-oSs9ukTjTE#qKqr01#UTQ2kTvT>oJZ2deVX#qytEQc9QvVfHxGxf4K` zP^>EU;7-LvQqo|TPxhdg3^?kHfeu*w>hE6o{8$1#cI~sAfF5GtV|~rrZzEn0RH4L4Rj`0BuaK1&x8xi>v+G-z2&-i= z*`au$yq?+ne`O4rD=NxfyXPslB>rHsxXk>_^ldUDpb9+{xqNM32|6yaB8$5CFHa&YEQ%{+I3W#ih^&73df& z)tW(}9LUz(6Y>)k3nLYR@J&KKofrb%MVop1-W%+1=tHe;_RxCy<#vG~(cMs6I97o`KGUP+<-;QL|!Rjc(RlO z`1;+1C!}0gLnXacp2qBb4o=OvWXN0#q zY?;<(7Lz>5!o1ViD(&9$*1(A4owKF-W$!a77Et(h5tzlbw^2fFd#B8+#!EexqI50! zv>J~8Fv5B#4ym|edGGA(2T-6&G*~ALmsNn($}NpP;!jUNJV`RrD8A2#I+nN`uF7k& z$^U&-O%Dm-`u}eh_?IQ&!9f8dj5wdDwQpzRKn*Z$q_-MT;OF}lmCs%d9g;zFZbT?y zu9D00lAmdy*5Rppdd|nu!+IZw6>&_iA3Y9 zo$fj%80$XjOQH|RSzt?0z$65KsNT;Ed@h*^S^WO}U4-A~godsjJSZ6=$Lo1JR-1Ks zrMVWiu8S+_yo;4#BRb)Wxn>PV59%kVE^U*mvP6VtiBt*9dN|?g4_G7%QRs<;dq)Y0 z*8`TZ_}Zd5|i&!F8pERPDX*b9D zCP2(fuj&eIP2sy#6;$;`*i0ttqo@J!cUv@(iAX}AJ!}~;dY~kYn&0NjCR|-})IHq- zOvM2jopTh!i}ACQ^ZpY2y0q_lZf>#-D z4%EeJ<+zbuL80IqH(y4h3rIi2hcq;8!bba>1?qCh*6WKN>boRQ z%z7s@prV*UT3Wi?Z)nNjf$54$kv*guGxMi3Fb@eULeJaTjN@*!a?rWadq40(Ugi6x z70Eq=ec!9c@VPBUD}G>+0li#}WSK+;bl)y=JH9Bjh1O^Mx&8Kkg6~BTP_f_;3vELHTcx=BwfSqzcTyDF zl9A|H13*#FdCghZG_63i>5DN%S--IBE|DHmCdRUj1ZaW1e+^W~9nkAHmiTfBYubI>DHT%_JH7*B71ywT3TZTof2x_Vnh{u9g$?TX zufFuA^@US$myDT7qeG3CdjS@X$k1iPpE9X5WS)v-7W7;Cxg0NxZBUou9F3i~ zii>kjp}pnz?GV#4{t76zCrcjxbV*hWiX~TBw^V8kAa%Tg+xxVfYEjf9V^-}6f1R!8 z^)dJ?o+-ItTT}HlM<7IA{0;~%tZfx*7F{JDPCDBqe%fuk(;askte$2;LJEUIYL{MMZnZmYyL>8 z0H~wfRA%9nB$D4NDh6#{G?`GEAMt&y;TyQmC*l3&1O! zk7hs1a?ZC{_BByp`W|g1NuiWLlz{n!5cb0Ny7RlPjDSdyTRf$m(HJtx%MccbR8E@S zwQYZw7-hz=g!0~RR>oW0lFFgD7xT`1n!dI7>$PxNRHXlbxV%DD!x9G2-L z>(3Eb(7dbZ>uEAjhSm(cW<&*+QcTW(AF}=nS8;O?F88mr>cbGKvG0(>{Un4bL<3HO zn3Vv?BkSg?x)02Of3m+s%=B*8dXpy*HcD7m_JBDXV2)^BlO z0Kvi{D85pOVYB?bI#B|mv`iv)z?MetpZApKm5a>-+SNOM6QlC%+a>26YDSVdX2lT= z&S_rtOF8ylqZy@P8Uu{_l6Qi!8rWHJ0S)&5`=E-WgS;_(TY)p_eyG?-5I_#(pqHj8 z7H}GVSg0(My79)m520`n1wb!*_In!&x4l=Qec0i`XS1xvp{<_G5PdvB?a(f}XES&G zQ31q=)~DRd=oKcuWUAutroJjAfrk%3m(S>0g@Cw{YC3RrYV|!j_<~(fVRIqUuE3*^ zLC`Z&3G4S!GR{@BhB(3wN3!+$wb(692_CFi+#oJGNQR21J>}ReXqXE0N%{wFz2FKK zc5FLEy%nzV9k&_3;j4TtV;`8j*X5DLkarCxDKNw;zhjDz07cgw0McNB_t#;WxBOxY z!~T`20UJNbk(+kJ8Rz5{iZg6Y2D*A0Zr-o=sBcmFWI3HT&7Y5d0}i*{VgntcIzE&* z1Ya?Rx;C=}$R>Y9{Hrx&COvXw8`{RuM2JMZRlb4y1Dx)O*NSV)k{ZF3ik&>CbjJ)q zWaDR)?_MrEsO&yJY1=%Vf!KalQzfAsg_QZ-tftrx!|LyZeAb}6 z&ifrTq(H$gzDyH`-$=aJ-jxNQ*(AZ##_|cwts*%*oD^`;&CPrO>!o92LQIV_GPjC@ z$!iEI8am0S0M6^jN+$`1kJF$c|As9Q{LU=mXt~;u%qmsZ%p5)3-nMj{%k5xb^?Akjs%H@iXL1+tZ@Yyo5Z{JFtUvtMO)d_CivGwwy1T$D zP%i$NH4jARel0AVpRCT;ThZ}LHPOv)M1Vow&$kg~tu3cVgHojvGwnPBH7mK{s;igN z&$o6byFa5K7-t531yB!nS|V!20^7~oV1Rww*hWhcKb*N;bfxJ6#b$L?$1VVsK@NpT>) z>7WQWKGAW0Pez=kGqr;L^CW|{@V_P?cv^EwpBK0dQY1sh)gKJLsq!!V!LYR4QWF^_ zumABbYHL{;7)(N1aH%kU-xGq{J4!y_!aDy-i(Dz+0E^#yNKnk>coJ8=Sgl6XYG1w0 z^$c^$ihd=CS(^h9kcJEK*8eiC{?fbtTZs%3`v&e90WR~k>y$2+SxARQy6wTML8SKc z=id`HOF~{p{YV|L+{JPTsESLkkU(*UoGI7u@D~h;)hIbH3&Wb=K58Z?G_*rJ#Gvs< z3{gC!?)P*;Y^rw~a2>9@OMCN0v@94fPD&FSU&@MyD-3z}3ax|wjpR3C6VBtkTd#n; zce1+k7KG)tl(%RBvG8zBvDV}OvRqsS!h7IUHA=}cW!7)ud_vILk~rMKlyuHxkv zIXtK)r`3^;$1N4PI|K(yWNXkDRwbSjtT+%cgg+IEJOl8+eC>c zbK3QVg+q0@%UOfJWfurpA}S;eOrYB!BEdoSb;H;0{WfSMs(EXRR!9h3Tx6lGxmia9hmKY!%jiRvxCBM4xF zsZrW#)$37;Fkm)_egAa=JXij)c4N}~hxzMlG%%<*Ld0ni3_Pa#-CzA!cLM^x%2}q$ z-A)cFIfKNO1BZ7PI~|G2Vq4lc_8!V$4GPZ9p(x@Q>iNLcl?r>g#pXVPu5c;~df_d! zVhRXA?a22>lDb{h1A3nNyNVR*%vk+y(kmyYWy^B)|5PYkiqR!Sux&2 zPaRp=mn@K4etkVe0j~la@55Rpok-TTdb^dM##=feC9e@Ldo!p)=^ht95`mom&<6F* z+*lD&j2pDF{vqfwESzV-@CfD73E66G!FWEJc{uy!@ESvl+E?l3@tXBJwzjA)4g9$p zLFiDAQ~SgxHX@8l1oGS4WV8lnN9Kv9NFUZ%n?IP~Bvf~(lx9t5I96!VTL3EN1!Trc zR^HcQ8wl_Z9$q9?ripLqK^LU(7Pty&4HgADQ2RJ#bfPZX-K-7F*@XLX4^|T-=uF9( z7-=w63D>4Sck*rPP%@b)HW(=+@akQCk%u0SGVaVKKjc6t_*eE2fz{J;O_#Qx_18}&_i@ z{m5t@2OcOs)H}Ug*3!^`_>lH%tKk8_clDInN1-;@e(O)ntYRPE$;8c-4?js5N+~uM z_&6FC->mpN>v;2e`Kl%2zEet;AX>(Ac&jP6G}(LLuIZm2vxfd?Q}(8N=}%<0gUmXm z)tVY+Hk3uF&PDUAf64#ARHL(M`*s# z+~kF3U{0{3a?P5l;0Qh+hjAHFWLTa$pO5x(zLKH<3AvsMi)?0Aj#k0Ey*&|X%-hdP zH^@c{zkW#Ndm)`z+a4y&`smjb_9q?#_@OKx+Wm{G%ioFFD{hBXH4n146-3M?1D{~c z1W@^}?coIs5|RIR6Ad+LfU{XqxDLBkl zBv)ybrG8K3`53FvXKJ@|0LWlpfCQvoqXY3Lki^~tI>~+y#YfRkjOYer^tJoLw3J1K zRw_yVvF*0y149_br()IqCRl&l0H_*zX%R~pcJQh0B$JelxgWSZTTz|JPJx6;Ji;N4Xik+_X1m({!pQy8i@tjsCMj{NVp)0T2PcCKCSoB17dmWnDvf6-3>i(@UL9qD?wGz2lBE_AC!Wk*aYp=+M^ zUsU4kj&5T}1y^;_E8s?+k`4xRDdhdUo#Fkh<@a%Cr{{`!jDQgL0eFm_vdpqKL(`Xe zx(`qAJBz}4Qp!LWd)YCCg%*5NUxEP0qQUZmCg0@bTye<846h>yjm0KxAzzcN5crv} zfzB}Y=%{;OdZWY7aD{+V{c3kvCJ|=M7X=JJi7DkKpL;!>uijE5F~1Q9hMXvj-i=dB z)0HZ6K5{(@SQ;LdC=8y&6Z?%s2uIKmT=0(9r$goYW3y;V{->J} zFyTuYF0Zalp zeaQeC`P9H+U2lve4tSufl@BS*Nu{sVsx zCng-OrQ2|hb2AM}efpxEVyAoE2qW%t zV7cAgNQ(PNtJ0_W!eh%!&SM}?V?D%$!s_qStCf3EdbYKr$!ay=+LoAN-@w`vHem8b z^d0Boxup+3_~8nUJ^nPy*>wK+_jYtgfgr)aCP3K*0yDIN-4nCBxpGa8d)BgGc7M7L zJK#j$Uvt%Xqm2x5j+D@y?eN2@qP$6hxt1dT)nT6w&Qjf+BJY|Vaz)4RM9Qqfl7T`? z7>-apHQ|;nFaRQ>Z}AYJPv$^ZDEFI5?3)l^Nd<)wz}3h!0hu_|7i2l`ha_H<95&i| zAb>rlN46MCYapJ!`RM1tp+r~lf0?iWE%6QU2W3y1A*J9BM0Dbg z%npjAV@jFz;47;HRzVXAfFINYz(SG^BP0RZL6cs!juQUOwRx|3`0q_R_R5bNxOw|w z1h3zHn#KlDbP)l+JVcNZ(i@$R=Zkk;udTJ;ISudttVduj0o(nWkj%woFS=2B>ysUDX6MAhJ$z2DhiSdO#(yPW}_sD23V)HreGd5ir(M%JGf$RD{k?b|tD1dDz zbK)98U^VDY2h-vQ@d~-jBz5F)Yled44Vsvbk7xP|mckv|v|3hy_(E?NLG>S=phZ-Q z@i=iFX_!x>EBxKbB6~Gvz_`=*$?xsdY|$CxoZB0QsAdZ%)8b53wLne0-Jg5w;f5md zLipj?6gSCj>enQI|2xoc$x~4ToBIgG{inrM$Y3n#U>~UOY>w_4Ot$=kVc~PGk@8I_ z)jQZBgLsHjP_u37PeAXd{@y^xU3?B;A z8=sDn<-m#=ztAV(F8^3gqbY%F8s^c_yV66LZ)VH1;>@Zz-m82B>ePGz)ZS}N#9FVf zAq0r(t+LrIQudVgvL#n3SYJS*r-0mSe=uzWU)Vo9{N@#${mA52+Hgm3!Wvi$ng`V`auf=$IXH>0PUNR^^VTA)_P7{4I$oe1{K4%kPSLm zrqgPmglT}pTedmfpe(>)GcJ7WoY+8UQSzbOmR7eecDUCFIKXWkG49Yp+JRv$QK=<& zg|l7O2aFnE&L~qz)n*n}Np>DH35?#{4$WQcj>oC1Q;OnYG&7oAi-Oxc@95`iOw{xC z?j;7kZzs;HtOM%2Drts*Pek7E{5k;Ol25S6U`iBv4d8JJ+S{c40-3(Nh=447&+Gmj zWS!9r%YPz$RcrNdQU+lZ;(>ZFCCt$Lo&B>g9$$RV`09gBZ|Z5)Rxzu~GBl62a5!ea z<-JC;E!OBhs|uh(y`#IEDVosY1+nr2aZ#Xe)nBWx5mQJL@P2fitu>*@u(q*5z{UmR?v7738LFta+`=R8(7l7x`2igTcl@v^VGXWxWt}pu$%X;E% z)R@kuOqWmWCHp7&)r1+B68WFhx&VWpNmVl-v>bq~jv6abAhIv&gE3_(By*GHJnJ+AP>5 zq2)J_H24P`5+&%FukU5RU~p;cxXQ(?7kzoCS#|ktWO;e}c+RDJ#LO6xeTl>T^2^>& zw})Z%dOH)hvn9J~T;eKzBVX2)&lImPf#3M=tAgbfvhUGgOslr^uQ*Vhv2599IVYUX z(pHr^g#T%u?GdLuyu`%Df0fU|1tSSF+{5AwVmymD-X65q?|Mo}(ElOEo{9>Y6_6F4 ziOIp(W>vF@bW0u*VNUCH8DUm0&cMHJ2dOwI=&r?19u6+wcn5n4h?Z} zUdvMa8vK(P@!oG7zT@l+2?m3`gSnX9UT zRBrPtGV#)V{VARw?fOxcDQS3GRJ>cFh4Zt2UgIrmli6S%{-uV{<_K|4<$*aP2B`P| z+?htd^cC^h`g*vdvZ!M#J}cX^v%sl z-(b;jq977Wd#pWW20G23*t(2o)#*CPa7(SnF})!Q;xgQTOC;X8m)QuDMl-?DL!}wS7>{@ z!L+fKG1g;k^S-y9VvA+c)ma&;3dLw}zakXp(0r3-_2EMW(F9PyVSZQ$XLw@ zm%E(8^+f8+Dk2pyMn)*=K^`Vm$l72ngOdWmb~sWn@a8g{rAxU~jo^Y#=3DV5KK*_{ z10y3x*U7GYd;8vDw<-SUqMrG%t4#f9*x@sqD?_JjyLDXz6(YLV3-id~gdm7M3wE81 z7t}o)%J$uQP}u`R=UhS|;l<|R9~u`HrMRaHY|#V@%`ZpY8i#j!Z4VL?KNpk>9<7p{ zuYdE1LKva3Wggt+-(feoB*n^k$0-_(#7@WDkJlDfeq7g(ko5UhNKn1Pk1HlUTgN9FHqY|0+X4*coG*L72P-_UBntogK%qUeo-V$a!oxuD@W52;Lg+ZX_#O@E$3Oq|GUbND27Ri>(fsYHFJr{;qcOT& z77rxUqk7nUQ%i@)89A9hxbm8W zc1IJFWv4VC(9QDaw-3Ez{Bew6+y(vg1n->bm&%!y6;d1qjc*AFPg&Xr4yNg#R0Uz{ zIOeRT{XA~o+CJD?pwRmMw7uH%q!bOt*`1sA%~bD{a8i1_7dfLfj$?}9Nm zIUS~H&OdNw-w`ZmERFvjAmX;|2vN5}4VXpS=ipia566yQ_4oT46PxI7Z;7y|2Yh~~ zaJ%sCPnDJyW{*5R-L$*v5IKoMOr&(Vd^_6lP-g z9`hLlyYhxt2JZLfbFl)^Sh0}@=n3dxv>DL(d~XK{k&1h7B_HOD(s=Pkv$re*IKIl{ zZ>JQ9=j%HPqQsmOhMLJwoTTV?nY*>kr@#K*otB!PPQR2klK|czrLQ zw&NoETu64i-1<-ywBX2B;j9VQA)0y+6*c43tUPS;vTSI^_2i3r;^ye(SVwjXAn|r5 z8)?QTGWMIkTc`^CDlTuKtTww5b?hcN)LZUk3^ea@A!|8&8Je!#T%FojF*!-Lttw(# zUJjovepzkLNEh1NK1je@`XnI+3z*uw-g<318D z5s~^m+5O)W`*?3LCf9&oe?k!h9*e^H}!wN7DItY@^NiCGkZ!HsP4WmO`wvP zbF&lP%jYtZZ$aqm2AwvBhXGZ{8&ts$Sqj0UCm(i8I(k)rwfj+Pr_RrAT(8i2<1IH zost4vjG-*)ojR~Du&jikk<|N4^!f6`$r;9UX3I z+s)(4ZY=)nvs0l@2(MHw24hJ;w2bSR)q0k%04>B;? z5%#A|Mv*TL4#)^CoT$oU=ZMGtWDZ*cQ~-Cmq0I`xj67s-Ih)0HDITCNZ}|xzDALaY zpBuB#m?W#lMqrgA=2%lHKW1h@`&E#_@01zuj8Z zHTx$-N%be046F4ErtHhENTIdt$b`Y7TI(_FlSpEwYBM!yd0EloX}jM=!4J`1?Jv;k zBnJHEe8?5h;`lXI*Df@r98j?Lc`vuUzS#C*Jm~!M2i>sb3H#&Ec%fU0gKzK>kasvq zE;A#gxK9dXBzoAsPER$C{hn&YIua{@9Jrjn?hP=+dHgowk$nRa>&L80QQPozsJtW- zSTv_I4NVZvxMyyWR8i5iG0C-pZ}^+A?CZ$1!UVjw`48u>n#+iag7h>!&sj<5XMO@V z+ZS15R4xU^B6eP-=3z$hw3jzfl}c$UE9c%~uQrvfsTYrH4q_r|e+tgKJ6pEeg<+A& zBt!dyb#Ese5MEiJv&j~m?r?{^>02tWV6_hcn%7Ol_fKimX%b4$DhSRdfl}xv#uwej zuF2`sjZEN<`9E%ree6W?J7crTB%A$_$tqG;pkAe+*)ncbN_lw6VZ8|ot%mQg z=Z-L5c)UkoFTQNASFUe;Okc_ze<2EMjqLe}$HyXZ7x-F%vwFU)eK2`9Q)>)*Yq?}u z{4gNzH*Dw=`a$qXep*7~P>0L*(e&-(!;hiJl0`G6Z7>R@Fx>yVoT-3MfxdkeyBv}! zWyO?`twsBFQ9jG<)Q!|jLu+rXl#nbAD72u)PD;KnJ3rEF0`>A-YAkgPe9<2%Y$pVA zeV`Dof_Ig1E7!ZFcz);IeiNDZ2EKz3yFvm|V)I5%wlUD}tnbUd2nZToE({9@&*fkK zo~Z4PD!awj<`jhq-_hUSAB}&TN@?l=O^Jr2fLY(wLt{UF>`(xs5^xa$pYxdE?TbJ0 z+42^H-ZeishfK+je-j@bw9aHEPz!NLC?zc-I9t8(iR6dv3Mf~Zx4C(ZxegwjGVIb+ z>*~UuXb@gWyk5mSwzE-Hc*?PonVlPdr!!f6KuB&l?3wI7GBisMcFv0&!MB>)uhnW_ zvzk-t3VI{D!#zJ}9l^|V@Z_$GiLZkdtm(5HHB+`Ryc{UhZ9QLs3mr(IvY3UreA%BQ z(4IOy^&Qt3W?;mOg)#Lv%Ve!js&zeJyI=utT?;XKSTms$)z6#JjB-lx6{AA+kM912iqFn;JW z<6+X>N1q_rjt>1Q|Pa_RsI>VlOG&l*Nlc}8LFXZu`)#g@rbp!9aL<{|s?V-o*bC_VkQzzE;5Om)l0O~+; zVP0$Ai<{K9G|-Kh4;_tWu^hPmtps7rcin0qp1n~gr4#5RpGY)RXy<_hW4hNAsIr${U<*!z(Kr)%Vc z$mGUCvbGvZ!8h)%g{(*uQe=@cN3yJHkG*lrqEuM>~o2HLvz3*D=Bm!@7=~;iV*y(v3@+AXrZ|&@vN0{jc@y34 zZI!xu8a}^vmA-;-JYJe@f;n2^%{NWVBUK@fsjH>B_39W_5;gCf=ymHj1a)iW^&JO_ ztC!26mL>o&YqZWuuH|w(R3lh6KuZ;za8)nGtelldxvg)(nlI3P;s-k|&aj*;2z+0i z2i0Vr$QZ1wba`hv#3L>talow^x1<1Jq&BmDxS6ZYo0XW&q!g)WV=+FyyV&Z|p)1On z9azxAY!(9BzvK=7=|Sw>=T(I;_Tnuhh1v{X#pL<|`y5(un)T=yOf^;s5xWc$ zQ@F}OObWhZ8Hi}>eWgMhyJJ`t^*j?QLaE9u|Me`Xj~A_=@%Lz=Bl|_lAf#UsvRP(T z&&ksLQz5yQ6Lx4-2-Adh=lw|y1&s1!$Byx~SZs1Fc}Z~rtc)3`Ws~>*?9VrWXl{e+ zh{gdw9D4@-sLw>SdU!`=IhnuRQiKJ48fFax>9%MohY|B3$K@hAl*+6d*c^OlH)_WA z(mK4Scr>bt_!UhY~Us$N1!lbJf!&woVR|yIWfUW^%ZR zURsj;nVfdZQh+X6ZmX*Bx2+#PcH_YM!KO_P#@+Z6Uq;X_JA?LgY5dgW`e_Kf`NwWa ztR_GAEqLM17~1AQ!~F z8d)xn()cpt@>+Is*VN@X0uzKHrBGS0Yz=2wmuT(G{BIfG>k|oia|HZiL=WD#-b zv;w^Bq*zSH!fFh|1^Qa?LoS(?0$hXhJ`itr!+Txn`qLr&Y(A58bt~;mEOUPOFk=u| zYWZNiH346S1hY{9u84BtLj+xz~5Fi?nN&jtI=gz`D% zv*$toD8k2rYXc`xJgWchA1zr0X^HhMalHlH;Dd#7asdej<`F>VB0TMG*=T4u_U#xo ze%?Y*6JC~eTO&OVO1*oNZ2%)p5NHX1uo?XsfPm~cd^f%;b z$E8bhcI^Q;Pq89t^y>5g5Lcwj}mo-s*0SEjd^d3H{&n|azyT3ep#=m zujlqBt5rPG0l#7T1_ysm;Pp-de9_(dL9##go4nqqZYMG8r{aumkBjbL)kIdSwnN^J zhfQlmKr!)2Rk^pPvdT=>WU}BVEk$dxdxfyL>vFAC`DJDgx3sjY_li*=&}op9$YP`O z?a@@00edRM>dVrGBpq-!q*B{q8Fep3O;V~t4OF0hY|w$~a6<_TF9yazPuEA5_Hp5> z)9^x)?ye~S@Y&6~M~7kk zk5@B7iTqA^V@u?dN2M5`P}&3i+$HMnD`D1O!S0;vV69ijlgmw_giLL?; zBh!@EOk^}f>&7l#hh-AzT<~j9twj@EjAHak@@%8qwQOp{LD91nE6`oN1;z7RUA{eshr5^ z*KT949=GR9nW9%;F^Fde(Z;OBkTs>^W|moZS5(9_fR^2^z4WtRK{el-MeM9qUShl~ z=^pbc6KLm^&jR)8d~hjSGc70(TkOHUZ}rIPao%q97hIQ65Sq#1LyReB3bzmO#!7u! zZ3#OH3WG*zM{l^UX)R5d58iNc8+G;jrgxuzOHZLm?b~;^4&}YEB6B`7hW@wz0Jsoe zgaApic_q22J4_FdG`}?gk|s9DhxCC+L&9!4HN_;fH9)fCiqq_C5-Xnh8o)ySx{F6v(&}Q)2Cnvj7457}1J#zh= z`skCtH~g5U@R=}3rgQaM)^}-OZ8c()jC517DWp}iz7!~K(X&a6HG|SzqaVfVtwMn% z2>fGfiF&Y4%3|zswBYGZ45;53sr(pWPU`!g*(F)TC?l@z`ysy__3_|fodKQ74btS; zQT~CVjGn-<37Oq5QuiWHm|59&dm1yF46!UhAB66tsgpQVC#)^zbK8u1&GrD&y z3!|yXx;sQyJ=WGGQhA-G$>_ht4dB@CUutWAb-@OOBB8ljHFS%3*kI|F**$%%mQnUc z4N3Bi26c2QoC#u|NSVlpA2X8&Uj{(9)Oqcg^%`=Fp>++D3f|t0@2q;U>7p+mn#`vn zAniv#>`>^7Gc{eUM#15`QeL~QE>fc42u1~HR_!c;8m!PM1{T{SiK!eA5U`&dzJ2r9 zhR$w25@WMgsH@y!*d6I4x~Q&(DI^#V;+(M)U+ca4>~}Qkw9uGErX`*>h2woNBE_AN zm`HghJHsjRuHJNTf?z_(zo8Ca4rsFv?)ML^8jok2+{n`pUZ&sqF@145NF4NOdZegU z=AE+X5z7Ev#z5EdJsNWQGL6!z%Onka_}rUhNMguAZ|k@r`V|1_n4IM)3kqrWTXJ=mSW3D1IV4>8d#9HSY*&&U>EvA z+7w{i^|q+&l>{Wz%Lgp=OO|{nxT2|_P^98BH<126jLYgHlrzSot9%`}YA=V0ZWw#q z;rK_!o@6AAo%p1U#)n6)CI9-#7XQ`UEWT{h&e#=8G4M}Ev|qxwvAaJgJ;<09$kM8W z(o!$oz%I6W!$0pCVt2nb?#;>ytpgsvm^J*Qq*&iiK51~yXG(^mD`zJ?KF*ZhPILw~ zd_AftlZit|rHcSsF8tYH0$@ee$D94Ic67|np~+Z~wx;Oj{ss%){s8@>4|&aI=;uX4 z=AnslytA24w+9Cw@68q7f6#*WkGK5i13JrM+d1Cx3NHnggomrUNZ8kh=*K1#7LhOG zOVW?;@~PALy$jCz$HVgL(eD{$s|tAGJN~dDMcw8FOE4LmTjfIIk~gkI;$NPMgcLQ9 zd?j-BGjLnL_KJjZjbejPyAIjYSST&cQezm<$L8!HZldqPoR^~unx+zkAbP)VoqlVr z#Lwm_WMqc~mg{OB8bgnTQscT;WbGW?RIk5e&Em+2({Wu@q*HieWn>8CAl5p@xK^m} z{~i|qKS~khYC6cDY*wg&j2}3&gg#+20z1RnW~{F?F=vt007Dhfa^%X&yI5RqEJm8( z&3dyPgb5Vp)Tp=iC>-CvSHaDV_cdZF9qgZBWi$@y9c8NFbPuYZiDgd-cK1YiJ!08@ z>cweC9L69xn+bfh-uxI9hSQc@y}zQp^i+M`GKiTWGFeAFF$?}c$J)=saSd6Iz(?km ze{UL2rgiz(o=Ls`{SKO4_{>zfAO>_kjg=b+&%_UrHMyBi^>cs=Q6*b9gMpC?5Hpyt zumb`D*AIpbwXlDVUPo;)rJZ?mQi0<=jI|3BYp!nABe$VEJR79i;a9GwCt|lo>uNEg zQYJQ&To~cDm%AS!QGre|5ROvAo20USrgLc1!6SUA*;hB8!_PI=V`}Erb(tI@6_B4d z@pZ!-RDxBe-m26egs14^)E2(&PvfnV0JTrgt;fw1d2j?Og&z{@1h7ax7aVHPWJ@^w za!FO31*_G)uL7FEH@PL2ym|Q}7+oqT?N_w$7&V z8uY9Ekw5b-oW4e5^)MB|uhVdc3oLj-+I(fUUdX;q7Fy}tG~l`xJR5~d)sCQ;UhPYQ zJe%C%Qk_;@U`=r;r&g5JR8f-buNLF2ohl7z(Mj`33lkvs!iez$WoKxg5T%D|l}Qf( zeVbQ$Y(%%#Tg*nKRfhtsG5(*5Lj}V42;uwQBJ?aKE=eefJbg8h%n#o&JsLf;#3T4t zbTL0;zU8K#e!ZkkUth4!ggWBM_*PhtG6R_1k>yqKQ#^rTvHuL^PO2@iASXMn2J+H*7nEjDo+LtBzxkvlT{$r z5fNu5*dU^vth(h;!Qdm(7j%orE%e@^$WOQQ5`|BOC*?|6d5>SYx||8rq!krK0J@kN z-zhAOT~N1`(J%g5fbltR%I90-1gsdcxxag+&C{Rq7GWz;;;vyiZ4v?gzyBUFStDP{1}t6f;uwg8SF;(h zudnYUb$%N%>tSQuC;Q`xYFs3fQa}UlU%cPIRU8o_mw5JS>!~cox*XUF@O^`lwf``+ zhPVC6io43$C9-F&z5j)LFJ!CjJzzoC_47GwHuQ3zb$R!MY;kTK#?PG(qifZ9=338d zV<;?)oy?%6xsx%EoJ#4>b+gmLXj7obx*5v?fb(>WYMCO$C@%VS+uMJ0)ARzzDIx@B zQ~gO%MAR4xxc!A+K}F!8V_Gn76mIj?ZhpvoN%|MS2qF{znj|9&D6fq$aQX!vGZ$Y`{TK6S2m?|_4TL=jv&}ruN2(5JyyY}4W*kaCoiC>G*%#eh2)(?GC;grI_c`Qv z^>Fe~sdkTw2ghfn(&%6Y=$lBiY6Y3}Dv5xjGsW2LhXf>|m647nxvUI&{7_ih7ln;E zm-i8K{b}!jg6-qeeR))(srIFaYFjYk4+HN#i7*0zPBol)1qdXAy!8P!THJVAAhuv7 zZB`^pcSg}QTNP0T^{~)qw&;97-Kx@l0=L-H{VFcuw8P)!Z0Tkp=PU15AnUQtLJoL8fv8LBDnq& z593vv{z80{dBTvC)M3ZS7SquEvh^*Rf5KD79Pjko#p))kvb1}dX-Z8c+9rjBtlx6J z0;+V!y~@@pcC@rsqh{|1IDZIL*cPGJ>dOFsN(_XLG~rpmBe~3(wQI(*JhBI+G;i(n z1L@yV_ib?NIX9X$Vc2cr1;Kr88Q@MN`)`#4X@DVm@@wd|*BF*dcFhW(`6BY^AXbFt z$|L5-T*JDYCUvJUfzJXK>kqC^oDcfkO!m@3vX!%2W=~C1MQJ{a7Iu-m&?4^}k|(of zWSki1xA(?J1M({yb6rBfj?w?ILnv4A;ih!hL@P{wS7}y*{#NSL>$1=Ez}dU+kZAEx zeh~K(S$Vu|I27N!M&oc#=XZ;b7-khRc`7YM=+g(J$*+qiw;Yxf<1ao8Ic;lcqg0cZ zcuf%ykQ9GQ2%v*nX(2yDWxq;C@DrwZQ)^>VM>f~|gBM+HiN?etM3C!%GZ8yQ@VBtK zm4zE1`vMTtF8BDPaRVj@F`~20qaYZOi9W_rU&sxvSk3^1Tpocf)~8T1t=mV&CxWsU z&o_88hQg1HuA%u+6u%MI%5lYAH#)&q5QOqn1Kj%ByewF>=fj_c2A^v|50fZIbbb%&e{!OTgx%d~M$J?0wukw6wY8Ze

      =58_KBBksHp;02K<`Y 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ⅈW`bE_MQ!7V)(_nD^5L1(`_C`;p{U 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

      jKGDunl+{{dME%SE!`6GpCB47z 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%0AKKz4Daxjm;6-=^&V1M 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 Ef9pdxSpWb4 literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/cl-flamegraph.png b/clones/lispcookbook.github.io/cl-cookbook/assets/cl-flamegraph.png new file mode 100644 index 0000000000000000000000000000000000000000..247f40da762c287a054214d12e49d76521892cdd GIT binary patch literal 16842 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 M07*qoM6N<$g0ZiAP5=M^ literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/cl-repl.png b/clones/lispcookbook.github.io/cl-cookbook/assets/cl-repl.png new file mode 100644 index 0000000000000000000000000000000000000000..06bf08369f7296756f9fc6647b10d25f9bfd9c1c GIT binary patch literal 30795 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 literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/coverage.png b/clones/lispcookbook.github.io/cl-cookbook/assets/coverage.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f9ecea19aa88c7857ed70f73bcc3541ac30336 GIT binary patch literal 41906 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 DW0r7z literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/editor-sublime.png b/clones/lispcookbook.github.io/cl-cookbook/assets/editor-sublime.png new file mode 100644 index 0000000000000000000000000000000000000000..1848a678d78a5ed1d93287b40189b1eec501b784 GIT binary patch literal 31911 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 X?#(pz9r1xj!t#pkU#lijK|n@deaDP+Sr6 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 z
      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�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 NNi!xM*R$RFe*l2Ggt!0z literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/emacs-which-key-minibuffer.png b/clones/lispcookbook.github.io/cl-cookbook/assets/emacs-which-key-minibuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..702e175941e2338e13e14e11a5b4600ce7660b48 GIT binary patch literal 27502 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 StWem+x78nMKg?IQeDfa(njY)` literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/geany.png b/clones/lispcookbook.github.io/cl-cookbook/assets/geany.png new file mode 100644 index 0000000000000000000000000000000000000000..58728e6dee258d0b9df59f0598c735c56e7f6c67 GIT binary patch literal 96048 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 UkGj&hPq`W0F}sbu>Gbsf0l0*=$N&HU literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/github.css b/clones/lispcookbook.github.io/cl-cookbook/assets/github.css new file mode 100644 index 00000000..c319d9f2 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/assets/github.css @@ -0,0 +1,30 @@ +/** + * Inspired by github's default code highlighting + */ +pre { white-space: pre; background-color: #f8f8f8; border: 1px solid #ccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-radius: 3px; } +pre code.hl-highlighted {white-space: pre; margin: 0; padding: 0; background: none; border: none; overflow-x: auto; font-size: 13px;} +code.hl-highlighted {margin: 0 2px; padding: 0 5px; white-space: nowrap; font-family: Consolas, "Liberation Mono", Courier, monospace; background: #f8f8f8; border: 1px solid #eaeaea; border-radius: 3px;} + +code.hl-highlighted {color: #008080;} +code.hl-highlighted .function {color: #008080;} +code.hl-highlighted .function.known {color: #800603;} +code.hl-highlighted .function.known.special {color: #2d2d2d; font-weight: bold;} +code.hl-highlighted .keyword {color: #990073;} +code.hl-highlighted .keyword.known {color: #990073;} +code.hl-highlighted .symbol {color: #75a;} +code.hl-highlighted .lambda-list {color: #966;} +code.hl-highlighted .number {color: #800;} +code.hl-highlighted .variable.known {color: #c3c;} +code.hl-highlighted .variable.global {color: #939;} +code.hl-highlighted .variable.constant {color: #229;} +code.hl-highlighted .nil {color: #f00;} +code.hl-highlighted .list {color: #222;} + +code.hl-highlighted .string, code.hl-highlighted .string * {color: #d14 !important;} +code.hl-highlighted .comment, +code.hl-highlighted .comment *, +code.hl-highlighted .comment .string +code.hl-highlighted .comment .string * {color: #777777 !important;} +code.hl-highlighted .string .comment {color: #d14 !important;} + +code.hl-highlighted .list.active {display: inline-block; background: #aefff7;} diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/gui/gtk3-hello-buttons.png b/clones/lispcookbook.github.io/cl-cookbook/assets/gui/gtk3-hello-buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..8452d7c6d6e3a303386819bbdd336a88d62d42c0 GIT binary patch literal 7874 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 E0p`UB0RR91 literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/gui/ltk-on-macos.png b/clones/lispcookbook.github.io/cl-cookbook/assets/gui/ltk-on-macos.png new file mode 100644 index 0000000000000000000000000000000000000000..0b173391f5b3326f988b1cd836754269f8490a68 GIT binary patch literal 32811 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 Ck?>9c literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/gui/nuklear-test.png b/clones/lispcookbook.github.io/cl-cookbook/assets/gui/nuklear-test.png new file mode 100644 index 0000000000000000000000000000000000000000..5faa009c34a17cb2253ba4f4816701f9251196cb GIT binary patch literal 24137 zcmeFZbySpVxHpWwRl-CXgAh=VZctHRXc#)ByGv?N*@A$8bc3|Cbc02AOO8r|Fw!tE z@Ltc}=X~EH61M_|84;SuFf@+W9d`^)LAH{>$VIyuak~RMQ1*Z|34|=wwQSws3WEF?BM2)pwqV z=q3^B$s^V0tozd@J})J3 zMGBxJ_vKlmbzJR-8+iBSosz%vjz*?N2GX{M&QNd!mducR3?VsT|NXbcBWdaT6>jJ6 z7f$yOB-E*2zB~PfIB53Vt;dVgi%vhw`vWg#UJf9*+21XM?QzyOvI`(Tv0YK zNWC5Y*YHW?P>(e4k&msqQTnGXr26V(_j}xl6B(kTqgk#5e#prQU_AjJs(ybv{LR_3 zXBkk=3q8>cTJ&%sn=RD#s)~wXa*>0w$T@XI-0JkuISPa(n~0&YG1Oh;2OavGTUuCY zNIP!_Dj{e45m9I2h5Tc(|Nf_WOpn>X;jKE=U2OH9UQiJYsR_KtAGf#`j1ps*tpq zBH~_25NAP0ja8w#i`___l$WV|YL;5Q8C!GTGo=zwRaJ^&GI1L|Y1?Mf%-Z8a?xEN~ub)=V^KPy}XR9nb zQKoHlM2*jcgoMi7ar#ehU)CyAkB*9ZB7rhC&PYf|xJFIQmNV$F_WAG2SBYXL`wrfP zr|(xCM~=)-Fk-3k!^a1CRB+hKTyy0pGhaV3j8~ml(M~S^Z>78(Y1tyJqWC2@l**?n zDf`9}SvA{RjL+xuhUVU-P4`NY%boE_T?`pLF3Q{ac!fFI>M15)-zQ%(g}O0+yKF{W z=U5nDU8^N(7?9+_$f~22ZD~$ZLaA%NWjl0u=oWvOvVE|^8&l*)SEzLOHcR_gpqiqA z#UDGfCzKu@r9RJ}goNC`px7SMKl}l&fDZjmafXU|i06S6D)hZ}y?hYG`GnsnHHPO8 z6_4pTtb9K{~sdZ;v1HW_4%oTwYP5Mwc%cc#P5LbpQD+4j`< z!KD4Rr0py6$!&SPMC%XRIK^c$;RI8rnB^V&Shn7QG_n+oE^cp9yJUSu`xlp_-Dta? zD-Yp5erpc9wA579q5n~a+CIK8^XQJ}{w~MLM{MpH_sM)~QS}OX4-MREt}FbQ zYxdew-b#_Wa)SH?-$txKcj2Hgj$Tdbt^(!L&I+qE`GZQEQH*`q+e}n~Mx(ZAg(~suX8q+V?7y6WX6PV<~az{gBu>(Iz(Qf9UDtI!hR%RbAQ%d4XpFLNf zn@1iSKT#VQ%j&<7*5$0@9Xp}SuFDEh%%+! z-?#eqjB9V2if&Q4__*v=h*GMMSEM2p%LCK)E_BS?yZULf?I)!s)&;S>a_a3#Hmk=U z^+_7vU2xVJ{w{EH>>^M5b@gv9#Hn_fpRs;Y*nx``sE+p3%<@{Q3K|coVqs@jd#&ty zX`EJ9Evd6At$7;+G<3p-^T$TBq!r#KBnmUs>5UwbSGYXoVHwHE=0nGn-@abM$ZZok zSu~xdOeGQ7VUN}t&hXs*ZnrAL_w=c&uv));Ta8JBx?+fOlX$v7vQn8i%7gKB&`Qxz zPPEt7vUQ*nwnEyHd386~wSD9HlB}!pet&4MTbR^K zch&N+PJh|KO2sbwiWQY=*~)cW`H2q|gW~p&2YE~-g<5>&p#JLKywsQeG}xqU%w_M7 z;qd6FRP6QZ*Da^(J*=#)g%@l-tFjZt#!BbAiLA@6?iFlWx%Lcb;A&--Vlev+0p-Pp z4<+#$Tgkq9IU@N6=Z?3Uw)R@1@v{!G*|qsfbiMmtu9+uPEwSHfA}!q#9c7jqS^Sy#_+9{2 z!)4QMgUmQGadmX(i^rtJRIgOLAEhK+W)ZQf)1Ir@p?7KhB3Gzc^)U75NMaRRiE8y4 zhy1mg>bOU;cTTZQG0wN?s5e^u4B^Dr(Q+snlLrGC8+S&;+va-YD{YWCCb|7IkSTjmUP|DE|{d2IAFouiKoy&1;o1h5)DXsSEmTO}6 z?aSzwNB!1UX)-E54~fVJ#)|#n>lnR~f7UlCTaH6rZtmRp#83gblpo$i!x7{EB|LJ6 zbG(Q-)!0bQ&GYTGHT2CKUH)#7_vWPKxl?b@{UP~0g5UG?(GiDvUI*tzx7(HXYY9|T ze}{KRaoRMM@v_v&>ld?dx3fsB2Bk)^WVEvt8$~5pNb6-^3ryOIyH`Woz2PaZr571x zMWfalsJ|_FC17}`AoM&@^|wl!F|Oqe_&R@{d7{cb%>N3?%HDo-!oI06A|hf_$T$4i z$seWXnX(xu+Y=gg#HM)0m}IL}5-~eEt3{I;cY=d?dhug9gW)d@FQe68&ytbqHFvUp z<=Qi|cye}#p3hWS>E*}EBxg#g`dfDcyOy^HudvH#;C}#ciRqph+^{7&ec1Cusu}WQ3{XLC!!yKl$RtpWa zNLFrdDy0H5PnBzYcXG~T_6kq9Y27xA_rG>N9$!G^_w(7?@i^n55#lU1acmJ8X~l;U zKFL+dq9PetwYRN#$=&+H;}a&@Ox7|nxox?RQUA+NHyr$AVp@)HVI%A`L2c{Vze&vGTB*DCCIh!7e+S62J??Q8}KxBT3P z-=Yltuh|+U(=a@~uy=>cIP1Om1A#Bbnx=xh-YMNkS`bpTH|yzr|NMBw%gc+3kdcwO z7Wl+vu`g}Wwz;`^fkq*&myq$hZB^3P+KDReCEd%iejbVrVpvQvgL* zXRzH$b)D~CN1Ic7_%GFT!@Pq%PTsT5(bg-`RYgxFZWIQgP}I89N;&iIq{b>wRPa># zHcm#TsdgGxxVy2vOGs+06{eV|iqTbRZ zmnCAhT(aI;$Aq!yxTOq)u<~lCqp~FinX_1E0`GEjXv7dg@(S!?E$}wnmv?=PTC)F84ijNILM@ zXd9N^CF9R4a(pYzeB&Am9sqOw$(8@d51B2IWPS=rDWiIwVSoq#5w#5x)uH_ zFYA8hXXR5UN^V|Z+t_K_gNMF^NDWF(=Ap?+=60^?Nl^o~3*vnStnSu>IPZjr>%|UX ziX_ZT)>ESz7T=dnXUn5IW7>T7^mx}W>c_T?DkZf*0>_Z2Bp zUym8m*bWzKV;y|O!txd07ycw{<7%ef{rg-tgVC{<)xYsvk4)x>t!y8?t>w(j)=3pZ zIbzBDJ@L*VX8CSNIH#oTfMjtYC24yK`ev1KMs|yspiEiRwZJxqg}aTrKD-GkGJ#To zm(jPJ%iU-XhZCxFS7g1mr`Lqe*w7Uojq4@2ZaIo>jb`AV9h|t1agB)>)C=Md&D-tc zv#m5`dv22&dfNYFoAiNgN+tG=d?EE=mej$~PE>*}=d!IGS~D;~m|2m$470}^Z0-!5 zo>5&*&Gpe}DuB3XHjTW>O7*O)EGtXPaE9(waf5K_C;R*RL4kqcSe$sy_GZk5A6ysj z-r6qb&Cklx^N|c<>aNkp?(I}`youvF#TRX}m$FuEm7wyf(8`9aQ;=XawJC0={PJ=H zrQ1q^m;LZz(&?w3wbvXBGVG@tlmaC*ib%{C*$kSrva}p8xK`$h7s`!BlcxN(p@_EJX@ahy-!Ml9j%Wz|pNX=B!nX}o9!`rm?e#wUpyCl4`Azh-7C9DaVWxEr21 zKW}zlyIgvGeSLvOhN1oWpU>yIT~|hwEs0_^-zG(FMA2C%4H=TL^o-^etw^Q#cs7XpDTrtjkW*?yKX%rP5oq56_gsS#y={KS1 z_$Ad>dKY$hEDmt=0|sn13BC(erK~K>23qII<4>&$ zVd~{iWi#A)6pwa_vWb4IMS2Zv%^Ij!f zpw21Y{0%MrQ_c5!kIiQfwCddM4+9svQ8ZjB-k9%Z4x3iXa1&21f3hD57Ckf0$(*t>H4{&}Ok^=Yp z3XhLcYq0|vEqP~MrS6_bgq0sg+=S(=k-SJ5-OsHL!>HKE^223_KA8qs2O-i+^{jtL z+@u$-LG?7e`}A~uHd0a2*X-Lr?-->XAiB-Ne_n}Rf%HZ6AFux^Hvhi9c!r2M|Gp9d z+k>xvUvI`C|Ni%t=reM}|9Jfi)Hfoce_#JS`2U>Ze-;XfiT{bH|2i*T$o5E{e^J87 z%#1!w^ht1KZ7ut+PZSh@zCc=S=QKK*^tz=*60(}2>i2J(AfmU3EDB%$S9zxEOuiL6Dl0le3nvGohxV^?TG;6*$wfM|M za$+xCdHE0^QeRFG1A1vuWq-Z5hT!O)Z*~PUHivu-jt1 zd5W^WeoAR+X-fm<>jPC))y$zG)%a|Wai_%Y?DX{8_jRk47#SH^Sy+@MC0m~6D&D-L zq@$DQ>FGJUdoVmOkPcEksWj2o=?q{h>GT#!-a0BOSI(SdpIr&NLUbbx)@ZbGhqt-4 zHNUP-XJw>t(7L!GTTyJ^dU5?mhoIuVjJ&+s-D@gRQmxe^ zsgaQx!fVwMX-apgPAZVlV2^gHDtwPIp!jzu@+$_A(guZU>n`GnK50HqdlwWGRPM5* zBD(Y4m`fg=uU@Ev!8FqOY$;zj4a>n1nrK&x!Zd*rAHTX8JND|##i9QGv{rgw-3T79 z9h>ObSVhg&x`G0^;o)IV!uBX53g9Ix2Zwn6GpDa4{B5{hHb%y$e2MakBI{4Kl0r&G znjC&U=H=m8tXW72KH?M~JKW!Noo&0^ur(kXk(rsvfc)S065|_LVnh$<68Y^%#0i7q zxo`$~d3o(>hqR+j@niH)hqzxvH!h)TUYsA9oGfT*X<2NNX1JoqXFYNcRO$PAwW_kQ z>>!gQaB*=(B`5n#PgH0ZCI~vuf810gr57tmN}{RJEh@ttk&uv-!vBbRRod`PRF8<; zj`M)h`83BtO+$lB$KAyxky({xh1A}Z?vD^zjXdnJZJR9>NjHhvsdry*J}=D%SSdFDSLX> zg89X4L-5*N8!k2Nj7mu<`u6RKp4Vyxa-sRSOOWm1Uw~gcunZEP7K!XS99c zPUpK5nPWS%Alv|fTYRrAD=UkJY=<47^miOLjq0rugFG2f)6mO8MKZN7xxlvTLX|+< z+jE?wf8oe>@7@rcb8A8TSj(5NVh|1V%Cs{^nc~Mu<8P;{-|VbTFb6lM1LLxqX$jdl zAmkMlg@!(y#2l=$-n*x&tD6L+2LrLwf!kf-Z`u!0ND|wMiC;N#Da(UsZ5mD($B7 zSkT!|V$bJYw<1#ypB(JsMq#l81x`puT)BGHwUyR=aW2*%RN*CIGxfN@ z-e*Ne$nAGry*|g&lkAsfKA)rK(J0oxkE-3B_R9V1!K>L>6O@Xv@yy?a-0bXYuY3ah zn~lPojRI5L9ZN>V2RvxcpFfXZ5A!WJ#up!}pwZ|pj5xkOZ0pNKjt}YSMqiel({|~J zTC6Q(tli!Dn~5a<0Cbg!(D&I^lazZQJNFnl~ottSQ z>@8%#W$~9Hsd(K*!Z{+Mt6`wNrT^LY9sSh!$M9kY;3ZQj*fY`x#0}g$;tB?8}%bpm6UFx zAg6>pw-zl|D6J2my_`97Mn+C93X6+nr~orFE6a3SQac%x6&AmBMH3LTVQot;HDcAxD)>R&sl(e z()CkhBJan?wMmGHE%rC&gr5I-4@l*9-BeL&DOXl@c867k)$&koL}p4#ibbne!M3@% zxita5ec|=v3#U(l6imO{h$JQ4bHwP%aGqK|^rphpLx*gz}49=0!MNQd_PS!ZPf^V}rUSZuupjPye%*VCI+}DAa z{VmJ4eCnTw_249yaCLQsiac1LRhItpSsS$4;jyt?=2UN$2vrpoq&!LD_|1E0c=`EP z6rq)Ubd^y7V+azS*9Y$cL1eW#-<@OYTd>^=Vv&Ba21nywy4>K9>!=?8n$MW z>c$3f5uvK5cON277*~&uWRj0yh|d;Wvkj{_`ts#5bZ@CqL7wZ@B2-jVAc!!+=fEz3 zHrh6`eiwdNzt~-Og~Iv(g+hJZ8Rh9V94u%VZz_3P)tIIv4Y-)5>)+(4ydxDV9RVmQ zoz@!m8GL$1CMH%sKD2a{D!Q(x_dFzA=;^syJ5HS|Rh)nn%6Lyi+pYq=9 z)^5Ty=(5KG8sJ{Ths=2|UxYyq(rl*_SKD~H7eBNsJve{X4;Fl6eWtYnPzATx2yWLJ z0ONR#bBg zgX|Kc74v@H)f(_Pjk5~d*Y_UKG?Gss8|oMHQwg=`G?gS-`=^Sdl;=R9xJL{mq3iFJBlsxkh|;ZvDB-;hrN@;Jcih%IvYSAt50%+O3)s zy&WAY3JRfkJl=%DAJnv7tK*iu-sj6~DE3%3PghQ$Nsd61q$B;5AM5SBRe9UQ~(1G1V=4FP4hBB+L7#(!B9ObSUFCQPPu(0rW{O-QDlTh-7vwjho zyw)QY|IX(`cAE```5qcW(O4w&-SZotm}s5E0OEp}-X1mJ803M{{JyqUNOb+%)u1Q0 zjn}Z6+mwnvS)U`9%SuZn>nGu!sz1IxNAKOI+u&Kjuml&Eb^Fs_5s{IM$x}6y=2vdq z;Qy7gEzx=MrKFCIDF3wLbAZ{2!yyuoptjy;^`-`Mx= zKM?)%=@fp&;27{yo+A!9Yks4@VVhM&$_{~v$f3wzvKK^tma`9DrLoyH;+ONGf8Cg{ zNM7!bAqjkPJ40X4s@zq#L&+(7m6?G7nF}Z@xl%TH&~U5w{Mp%nm=?+DvQr>U_+Po{ze8w>O$xa}bd^m^OdpaJFo}$`^gD*_ot?a@ zDhPsxK{1C;vG zgi`_>0CP)WY*EB0prCGUJCw1-`VHEn`d)>h^x{QfVt8q&OT+#o)IGJ%UZZ;MA)cxK zi6=6@Is;=|flm9@&GP}$?dq_Eq8JW?qLC5xhW+_Oq)krQ9e;5#E6%K}7_$MW9)97% zg;}?{Ce?$Hsj0%MX;14RGGzp}=}JN^kVEP00RnhU&;RC=BzKI3DR47pQ@5=|@;7|u}4){k+SGOP+og<06N=;4O z;8Xr03TQR#6Qw`r@13+&#RMMI=0dM{z7k(KjxKB=;_vj%sbLL+!lqi1GnY6;Ruzv=7OuYohtYUlu+2T{c0=y1QIyPI}Ln|{?5 z2C(vw2F1u|3Gow=Szca#*#Kuu%Vv&uFttb+&22SRS10E%AzJu5SND?#m3_df93-d7 z9=R6+u4 z{xB5@gQ%z|LUG*q0)*ZHZ4DFIXtV4^@CoEGf2>MCG;Q4 zi1kQ8KO7^i!E0C2Zw0Ur6y19OHRH2c0=}k6(fhc3Q*wfsW1%5Mx?uV0U(m5tm6g-7 zvzZDtOCH-d5h@v${Hg7fG&EwNEvpx5X94Ob94?5*8d8jZH1xx)2OGQ{QwLn=`Qzm| zRUMst=p6SA8g&7O4FTY4@lGbccI^XTU}lA+KG4**0fw^yI)KK|Kd2~P2rM|HhEU=S z9C7q3nRo#*vf-CuieNoJS;Ip^--0O-2>;!`sGe6jOkPGt1#}#1YwIn(K^|bz{;oSf zySBd@hoK^n4h=XHVdS7ZAkqk&5TUIg>!enOq@>U_?2KD$e|+{5KIu8W0fZDdwxoUI zel~+;Pm-W^jnmvm!Fhnw_~BwqmV-b6#Nd?6p!|5HZKB*D&1hp{cKfv=v;Yk$V4P4v z*A}Caq>>#7a}6lN2phL(^_c63?(Z?Pvnw*|O(`@u#*g-s&gH_Ws108tpUwB1AY@2Q=YJbYqqkpqjOv9XwSH9+@LTxFt7zHVY$6L%*xI_f~+U_Wq_0s!N{17 zEn^8p29Oc~g-}c#^?i_k`t%Hk8AQAO35WPIR{@*CJxeoi{oZ-@K){BowQsStueYYA z2GU&^M<@Xq2&`;ShiDoK!N(pO8-u}`;AwR&Ey~pbI?y@V+uNZQ&%Y2LlUN9U%csqy zz8V}Hd_C|}lRss2wQlh=D#BCwjJ+GA7AcxR=_w}cMZIGs!+5AT~&g4mt zRj91ZMwH|*f4jVXaXvk(ih$JkOI@Vc@JC{S!yUY?`t1Joli zH#_^pFK~1PoJxP_n5qT_#Q=XjMCgzxNJ}%+wMB%{0D6ojXlAvz#se2nC#0}9S~i7f z6PT>NS2S^UnrumfIW{UvN=06cR^uUyd+(UCNCZ_o$dSR8E zK^}R~({dXc^ag%x75)A9X+Zx^aIsLwB?3rMRQ0TJSX}BmoRp=#y@s`Qz6hP-)}SU3 z)bHQF8)op#tkyp}lp9pFwJp4G@!~dqr8vy9Dg3nGBZ$$Jz4aM@*b9`xkw83wO&)xp z?LlU#srl{xk!}HFI+yRV_)FeP!Qht`hq6EiLFTuin*#BR?wkv1RM64ZMwHj>?d_#M zKflgc<)?it0YQ6pvIbo>=@i`2*;!#Zn9XUB!<_oYx2Uz_dFUu2DLT)0g?F1p_AUT= z;y!oog>wr4@e`j-Zqp0%xE~)E9J3KSjU z#3MBW1CD^NjtUxWV@YT)e?P1k{fiij1N-LDjxt zn>@tl^3dq$%6cpPDD?yy;vT9rXnMS!DW5DzX#{QpQnxOuk%Vvw1KtBlZ~tP> zG5}6IqOJ`Ls1#~f$dCs=1?qiFz#jXI*FuVJ4WSj6Ca_19+7LkirKuLVp=TmSj-`R8 z=VIS21XsZLnFc6=rDbIqhF=yoLBf=5a&RiB?C9+sg~88jSFhd~K{5mGY47zqhfonB&gUQ!dwMtKubv~ z@TR0FEQBAu_Sfm2?+RDfg=kkaDdD!Qk&*z3nBq_K2y|Zt5@D%JpBDU!i1(KBi@BmN z#{C5}vY+k8TPbt%h3cMj=U+cIR_LU-A0_R_ES0+AQYOvt_-@VLp!W;9lQV|we}{Je zxZTvKymA?bqpwJ2`sM0b)EW;4O_HFqq^S9MqLyHQQl|xB@v9{jTDVnC62+Fmv@{|^ zLn|0BF%E!T0{-&qyn~>njSbjlvEZ12!kUgn4@^wtPfzOu$4%Oi$1VH?PYGlDn3Fqx=wh01N-;iVf{(oWBR&6#>sb1dTZ?yFvBAwDt{4O4T4D@`1yoSL50-+#ii?PI{Jz~@IaBZrN1@z5S!*8eK z9zxed%oGv2Ft|;ifk>d`46=l^W+2Q$SoomS132bg7M4K&gOl;_Nno)Y-|?b!VN8lC za%qn3p_HJ#LgWk5kOp1UH3a9AsSP*}AWflp0(6e3q@)7SWZqIys26CaLHS3z3>1^` zQq$naX?eMUHS zN{n8^sSDr^0h6eysxE$dc}ly^t&q=lJacVr?IO81ECaZgvJ;q>p|M~gS&Ww>Z5}8z z5WS<4DcTpMqUKS=X*4R-l1M9?^L&-hzq-PU>}d65`oO6LWL2i;Q}DdI;f45%of( zeK^&J{Cu`r5nf)`q43Dze2tZH>*8UMa<==W=q=YKYXE_M)pA!~t6eEl#sT!r0Ofx< zeH5X12onSyFC8hm5cjNi@BVlgG3y|(HHE`ybjETZ4Q<+cQy$o8yIqyS{CttZR~66WBH(+6d!< zABOLMI1xsno1>V@4jl_dr$<1_n}{e#01(K*QGwnGmZst!C-*p~AkV=3<~~#)3svBsKXe6>dlq|Pi*sH_L?Vh1 z_?|2*Ed8x1RB|B1180Y7OW#mfQK1H144#@&laTPUt6Sys*=T1*bkw`o1`y%7gROY+ z$7jFNiB(oMHnf#h9ympa!H!y9S_*V~0+$R)FuVR7+3dDEVM#kQBSm^_|2o15nD+$H zR832Z1%-(IYH0KwNIejjrk>A)j5l~yfkh-#l#o0gkCK+A(8$@9d4LGB;CM>3O9P<; zZY@>d17}6#aR>%rqSg>!o--l*@Wjuw#W@Gyba0t5-eRe8gHd09_GN^L2^pQ+1dB~Y zfMx`i(_*4C3dC)I{T1*NgV|o83xsD7&Dx+{0nj(C&~}}$ty+R&7uY!6yBkNj64%w! zGXgytC?+iD(DbxI#z~NS7K|1*z^x?z6Vldjo(@Vay$%7OL0OH9$eG+TIEHO06r;dyAK8) zh}Rh)5TYY^Km{+GG14$lNZld!DO1h=COacWn)!~`&CwV;>LK`0p#tuInh%%hoJ z7HBS_qHNc+_zCkSU6+*9_)HYG+RdUC&-5G6j7a~qwV5e3X1=oB^iEG zzA?VD@zJ=IbP9|?{7*994~Sw38Kqp_(6Wj7h*YYnI)41P9;_YQ#SNc^R2(Pw2&bU$ zkvCMUhP_|GVDJIOr46~Dnk2K5JU$bENg9 zeeeN{W+0>y1j5Z}dg$~Bf(8KEKf%h%ir5jL8Z6qv(}4Y_Bg$M;*CO(Vcum5C0g0HWP@BFf~vl}V) zC0N^H8}*=KjqWxb`+x~#I~hjrS=`>%)(0jBFr=vXcuGA?V{4aYtBIlE&yP##Fyqa` z3hJAKpn&7AziCKYKe8A_z{doC%g8ai>(|xRf_v$ICcqgf3kaA`zVwf~-e@89m`Y5D zXQ+ge*!a+1j68Ux*r2$lN1@>ezru59Zc9acHe=AXXI8GFYGPGJQBeah=)mA0LV3VV zgurJTU+V1chNK$&u#yV8HE8o7U7J*B_a2d5wDszT3gH7&oSu6>11eze3JsbtleQY5 zB>5gK_>O?sD{hpS+KX(UW!c!Qi%>uVHc3RA7%3n3gd-&+sZIzEYu>ph;asgqdIFpY zP$88hBqX*flai7ad!e<0>y?p$<1e%;!x}vlbyHiL`g1 z@C4{({h8erLuA?o3OR+8BL^mCECk^I7)~7>GKlL1@ui}!9%I);a0BU+M7Y%$1ahSE zK{o-=mk#okVe%(nh0v9p@pqa4+TPbHeFEA)oHtTvfY!yAR8q+yPH97;gkq?C()E9Z&#HTgP6fTVNg9=Zq4w>ghqt8VLbN$L-)%)?E3QgtXl%Tz65C4C z%kH*H9L_E&vWU21Ek~8#$M8I#bNfo9bfz+eq}^9}iic}mT}yt!Xr@X3#P{A}*4^3< z7JmEe>=TX`x{m91k8lk}Pm8L51$89}aziGu#CEn$(iDSm4(&~=)C46NN)w-G->5aA zpDB~2QdBdaKuj+t(rm;D7Dm_av9iJO@p0QL`+<#Qp)?f&p3JQvY1WD^*c^1_;!R{_ zWuaFjeD*t+0}u_?q3@$ZE+&WNL{jq3&dzfG>l3HWX6EKD{Vl}~t6jU=EYdGHfjyYs zMP#x$WcCBT`0OU*?BTiLshy}MQ2XMA-R+>CM*>%x2Qr1L3LIe z>|kfr142HMA(;HWjI*;d=(Z}X(HmJDJ}jVCKi8H}+UXw_aj zzuPzFI?LcH(Co+aiT2q_cTK<|^8kg;>CcbPV0LB;nSW?#5XBPK+_^#5?n)IG2m2XL zu;0Sp=-5>Y-eN2=y0AYZel%k7N)&U>6WibDE zSm9X=SM|;&m^o(lsfS?D9rOL=D)6-u!bMs#{_YZfO`f~E z88|g35n=bW-~Hb2LPJB*{;$x4Te#(Ap$sJ_6D{Y{>`7k($Wn(NuB!TVIlEfX-3Y)o zG7l_y)2p&Z)1CQIw#v=y6%uB2_k==NB<3fL$4X(9r;FAQ=z7T;V%Ld?VyUF$e$W8o zM!T(!M?dmAn`Mt}9AASA@JAV$}ZZ}^?n zM1ZwfFtsx0v>(?BjZTFGxLUIs#dNQMIj7#E0F8C-h70+F;gF9eCGX}T@E1O1< zTm&(Vzyr8?F91`KV56A#r$62A55q+9Pe0F)D#ik)J{(IWXaNdM^gBm3Z%lunsa~WT zkEATsIcNtzR7#ARgX-5?sB=|WQ4x>=W^kyfS4bFd^huCqspQUry4D-QKdni^1U0Lz zCs}xNF(Zu0!&jjbK!6vGT((?%1Po}*V~?Y;Mh zt^os|gE!8wjq{MgiV@4!C+LZ#Dl02zdM=NF=2_)?a$oMS_xMmT>}xZ;+W>)`7Z%7^>|m@nyP|>@5GRCcUCRmB$?9v@ zF1$u+h{w;@H#R`%5kWb1-mfzG_U7_b$|#JYh`PcZvcM#68^GxSxagRem;!?)F%B4# zq_l4Z!>-hOe*|!|$3-uH_~F^%moEJ9Q@Te!2sv*j4p<3ReX8gM zFqbIETG}#iD9~WX#fbUfO-2f|EJ5E)Ik^KS+$^xq?rO&wFd(>0+TQ7c5GXobshlBc z3IPkFitT9<0i}?9zp+gQ8K2L!!4v*JPI20N|9IGJaQL(eOPDh_GKJp^fLvQwB0mRW z&OvcW1slQ?l>FfZHP+~RdbK>@2X@DC8kaiFb%-1vZVtC%VbTFsq$@>Km`vo)L%{EG zVC2lgSe$&sY>zOm3j!Gpx`|Oq9L&cA3qJqz4ES{#^g`wgsjwaxMv0wn@XAriHG#eN z05-)-<^946esjj>4p1qfD}kwZSs?U?aKMb3_Sw~ICK534i%3X_>YPK<65 zOY6$=a?hTH6i_&rvWx2J>2cmj0cAd--q%m+ho)3fW);Y_NK^z%WT`AEzZcNDi*i!W zc_!#{k)7rr1qSh>|9Qv(!v0@(`X5OKdH2t^|9SV{`JufZ(K1FgTMX{g< ziVd1BHcr95i;jm5`uIjND=Hix5nPEu9s2Rr7D9jDPkhhM7~{FS=A&$94`#MAK=W+a zSUA9H6*dL7S^v)}ov5eF8qBe9V|?#Oz7<&8L?%)7ui?mu*i9K3UzG7b|MO#OZAuto zQl$#(?&ikYBRDiZo`AGf^Bq$S*15)mwN8!3jq9&ZzX*PJhsh!I_jH3W=oX7RgJWay zD!EbMjJr*E8L&nVOim_2@nmTK`}|dvd*n##h5yS|6>>{`gl+UeDjW|#e~vD@yVviw z4G6Ar0ZfDTv6-xP1PBIy;sqRym=u!Y00YbvEj+;$0~UaK*3%Ww4Z)|O z*9((N9+S3W%7lna#Z)oS@`lDv{19>YcDknw8lSG~uv!f$H5)G6Dm^i;QNd+3XPp zyqD0)UUv_sdODfK)&r4;iL@HMJt6?dvA`&w2Be%5Wa#hjB{SvNR*=e&zCt79au;T3 zb*femy3EBQ5vT<=hp%s#RN6ZbzQvJYa)2n_1KaGHA8*1Wv5bz64vgTZ!tEb!8yve@ zSy?#&;99Uhnzsiq$7MD2LDy}}G`Fy@8!(f&n@(%{v;hJ{Kp8Om@#!VBo#BV2=DjIE zA5~M`;k(%-CF|AO!oR?hkOsy?NnddSnzH~-@-0Pp-CAuv{y16KUHx1o$mK3avx-Ly z{F4q6pnFCDA)QSulsX&2fB1|;N!^j=7jo@70?-kjUV~v(Uf(2@~_wfO?7ziHZd$Gt?p9E4DEA1D0 zlC>(V)DT>H2-HSl<0w27pm9Asv5=!{4~v4-O3)I_0a=bU`gr*hQ$|1`(yMcu1Dy~R z0o82|ri$8u-1$!Sxuoy9!(NE&&qmfP=jC&OER6iSbt?36n!^`7?fT(n@9y)*qC^g! zNgZbv+8~ApzzijfRod!QeO@;X6O94vFNka_X74M#dKf#6`I)J&^VYyT>QJ@nj zEb-q>KMJ#RX&1E-o&! zKwCS2ge)1KZICkPsQiC>EVMi)0G{*kSV&tHOwS;!Wa{yk%ghOV(~zzt)O;?9Jkyb= zrKZ)zxv=TRJH-TOmZrc#;~yA4Mq(B&VMid2n39VDs%0B!S@{#=AU$L}b1Is~#_L`} z#Q7iTXx3;I5b{?Sr1z?US#g7xCvvnmvk$m!0~wPazAe zk$R>ztoKIKUb9`(L4FfHA1P4KZ?$S&EVr$cK@571Io|aZ2QXPk+GyZ07u}UC%nv}a z9V*)<#5%Kwuj0}FnKf-apU}tb&qc{(dH=j<&<5((COAv3b@yCToCKL4br5 zod<)k+waBx12Du4^u5=cz1N&mWuZt^+GA6ITJDusIuB%`D4`+1>SugC^+`~D^M@aq zIt&rSF=*94FA4hONE3hBhspVd=dVtKBPWn5A|M>MmWT6&ZsK+f3v*HMC<*Cw@3+7a zpQ4cxi~e*#7Tz%5R(ErCC~{W=20An}+$AHwTU%K{dmHTU|0!`|OB!%v#4gVD49yD2 z{qhlT$3wZg4kd#9pK4Wdlhp1Cj@9-y3nBLhBmJ`wn$?R|?&U!DxEo8=vs5n25d9Ew zWWC{_4m*|zG&HlMgcE{Wu}+VP65z&5vTy+QThG&Xo3jfG?<4IS1kae|?n_7+-n%4( zpAVwvLqH}nICGoGLA?uk$n5_MxqKoa|9KC2z=LLX3}0^h~vWR z{W;P%yXwM@e!>qt-#5IQ}IJNp_KJ}yu7r#``{6G^`%LOZ`neo zXsC;iN*y2WcpbbKLo-|ba~Uu4ptba8NGGUAj;wZ z@By4cx(w29k+23K%VxS>5TycmkJGq?0fi(i$P+WZhS4&V;uvqhAf+G#)E}(XQSI;` zwmB5n4@bU0l!o0FQ94_h97)p9uK?yf@4_8yuf&Ra?PS8UJW@W$h!-@$POveYp#|B6 zkpQ*5$|NUUqx(-kVGwj#RDy&bT=j_6a~rd?KW?6ft?}6G<_|mg-oC5}kjHMa8ev_a zG8B^j0^Kwf=>r$}k##UOHU@y^+BKZ3FhYty0pwk@6iDtQFqs+hw}8k)opDu9vm6dws*HYRx3t9fsX(oYXJ-;)W*^N z3aXYw^8mDprsIPqML_N_aLny{bhu2v4o(j@qV%D2RU;T+tgRQM(>y6dge4$)XS}#C zrU=HIy;rRbIuQxv@*PPNKu%D(6fuW0^yVO2AP_%vY#PRK&7f=S<42q9is#2LOR+Kt z$^qb53JP95Jp455Cd~C*SW71idGQ1$d|v zCZxVHw8Kn6?dzhPRLuWs=gNYbI>RW6Q|nl(=%7-?Xhl$Hfy!8eB3P$N6ESGh#U(aW z1*#P*kX!`86xU9ni3ZuGNK|kGiv^rYP@=RtT9t^UDIi3FuoJ*0Xpkkh=L4qC?Mxr~ z;LDu>@<9IOeCIpoe0K?z-EZvXntCb%IZ;cY06K)Rx2jV7IfHy9sO&6VIBwqyPT-w$X|P{7lUDS_mN_m3fnpYStmOB)RTBqwmR zyFd!16SnCy>7}*{0Z_R>t*7#}$B0hik~(-tYy&^r{pgpAb?AWW@Rp@ z$ZB+VLinC&aR30>GS*7!3T!(3T`%bHez;v0T0F>cCRG$l)#gFE4STN{!Dh@irvx@4 zhqI@v$RPK@c#_^%jDV>WT2DmTqRK|%8Y=Gl%3QF5pua~A6*LUf=*B--Qpz~vOb4dVGw`2)CC1>38@5Xf0*)0jej zfICvSOJ7VNgWfV2$rcz=vb&Xt#W-+x2VEJ})0VN~_oPnNla|F=&#~4granQdKsNxp zBbiZUY1g?C@**sEb^8Hl12~2P&KSx78j^=wbp**6sE##Q`np>w(iG{7)0dt}~pl-SpGWU%^Xp zg3SoiWHO%K>%<=@5z}ezwsv*P`>Sv)DsTV@jtE8oy{U>g<5s#p3i)9v!w?SvSG)9j z(2)rZJanj*YWcd1YlLXZ-s&)e|~>}+Ays_*V*^O8&n;(>{1ITHtMDEPloCs zG-jjA#dUGqm)14GL?kf*R+YP+(|E8c6g+vNsl2V?#-d6eo|4dd45K4KQCGVEQ{F z+T0wBsy-ybVsR~d996wHUFhhJkY8#isOk|_;GsTZ;>3)gTqs7<)JWi>+bICIXtzJe zjYANb+XWSIM?#_Q@#9R)5SLu*019})Woh@x7M57uE?uLB*Kgn#zxyyeOknjbXtua# zJ+5Qf$#fxw68PT&8e5Y6$g)l9gW5{ha-dQ+_^DJ&&h8*lC6X|}^9!*F)JPz#phnO$ zC)F5-=1ZCF-+7W_b1t_TL!=i;qUIGKR%;(`;6|9$2L0kJn$F3qm*r0k!S$l~&5Va8 z)Cv7AIpa%G6gY|Axmlb@6FWNH$0x*aH&hT76#-&(IT|P&F+pDjX5R5F!))W4?t`XJ z(N5^#Esd?}e=jVo^PR+X_l9YM^UFz)NKlv&~*n!m%h_bqB6s-Kn_*dM8vQ zl0;bKi5TEfu$%>B@M7Ndt)oNx=eYJx4EV}`jUUZ}=DJ6>xyr8OQtp4(`f8_|vMC;x>5 z`j2eV|IvreWU*u<=HTl;jgO?)T@}^wc?Ga>k^yb*X{>EuA?vfTjIG6wHoTRB_w!Z+ G?f(lC_2+B= literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/gui/nuklear.png b/clones/lispcookbook.github.io/cl-cookbook/assets/gui/nuklear.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2baed4d07a1de5638bf79eeee98bf16a1cf924 GIT binary patch literal 108136 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

      ~hT(e!Htfe+X($rv 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ð7>9WBRMlB=@B`-#N0-~@e?ChDI7qWc@w)a~F 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 literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/gui/qtools-intro.png b/clones/lispcookbook.github.io/cl-cookbook/assets/gui/qtools-intro.png new file mode 100644 index 0000000000000000000000000000000000000000..e35e0491ba89abafcc22b31e3fd0cfdf61aa37f1 GIT binary patch literal 3692 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 floating-point-underflow ' + + 'probe-file >= floatp proclaim abort floor prog abs fmakunbound prog\\* access ' + + 'force-output prog1 acons format prog2 acos formatter progn acosh fourth ' + + 'program-error add-method fresh-line progv adjoin fround provide adjust-array ' + + 'ftruncate psetf adjustable-array-p ftype psetq allocate-instance funcall push ' + + 'alpha-char-p function pushnew alphanumericp function-keywords putprop and ' + + 'function-lambda-expression quote append functionp random apply gbitp ' + + 'random-state applyhook gcd random-state-p apropos generic-function rassoc ' + + 'apropos-list gensym rassoc-if aref gentemp rassoc-if-not arithmetic-error get ' + + 'ratio arithmetic-error-operands get-decoded-time rational ' + + 'arithmetic-error-operation get-dispatch-macro-character rationalize array ' + + 'get-internal-real-time rationalp array-dimension get-internal-run-time read ' + + 'array-dimension-limit get-macro-character read-byte array-dimensions ' + + 'get-output-stream-string read-char array-displacement get-properties ' + + 'read-char-no-hang array-element-type get-setf-expansion read-delimited-list ' + + 'array-has-fill-pointer-p get-setf-method read-eval-print array-in-bounds-p ' + + 'get-universal-time read-from-string array-rank getf read-line array-rank-limit ' + + 'gethash read-preserving-whitespace array-row-major-index go read-sequence ' + + 'array-total-size graphic-char-p reader-error array-total-size-limit handler-bind ' + + 'readtable arrayp handler-case readtable-case ash hash-table readtablep asin ' + + 'hash-table-count real asinh hash-table-p realp assert hash-table-rehash-size ' + + 'realpart assoc hash-table-rehash-threshold reduce assoc-if hash-table-size ' + + 'reinitialize-instance assoc-if-not hash-table-test rem atan host-namestring ' + + 'remf atanh identity remhash atom if remove base-char if-exists ' + + 'remove-duplicates base-string ignorable remove-if bignum ignore remove-if-not ' + + 'bit ignore-errors remove-method bit-and imagpart remprop bit-andc1 import ' + + 'rename-file bit-andc2 in-package rename-package bit-eqv in-package replace ' + + 'bit-ior incf require bit-nand initialize-instance rest bit-nor inline restart ' + + 'bit-not input-stream-p restart-bind bit-orc1 inspect restart-case bit-orc2 ' + + 'int-char restart-name bit-vector integer return bit-vector-p ' + + 'integer-decode-float return-from bit-xor integer-length revappend block ' + + 'integerp reverse boole interactive-stream-p room boole-1 intern rotatef ' + + 'boole-2 round boole-and intersection ' + + 'row-major-aref boole-andc1 invalid-method-error rplaca boole-andc2 ' + + 'invoke-debugger rplacd boole-c1 invoke-restart safety boole-c2 ' + + 'invoke-restart-interactively satisfies boole-clr isqrt sbit boole-eqv keyword ' + + 'scale-float boole-ior keywordp schar boole-nand labels search boole-nor ' + + 'second boole-orc1 lambda-list-keywords sequence boole-orc2 ' + + 'lambda-parameters-limit serious-condition boole-set last set boole-xor lcm ' + + 'set-char-bit boolean ldb set-difference both-case-p ldb-test ' + + 'set-dispatch-macro-character boundp ldiff set-exclusive-or break ' + + 'least-negative-double-float set-macro-character broadcast-stream ' + + 'least-negative-long-float set-pprint-dispatch broadcast-stream-streams ' + + 'least-negative-normalized-double-float set-syntax-from-char built-in-class ' + + 'least-negative-normalized-long-float setf butlast ' + + 'least-negative-normalized-short-float setq byte ' + + 'least-negative-normalized-single-float seventh byte-position ' + + 'least-negative-short-float shadow byte-size least-negative-single-float ' + + 'shadowing-import call-arguments-limit least-positive-double-float ' + + 'shared-initialize call-method least-positive-long-float shiftf ' + + 'call-next-method least-positive-normalized-double-float short-float capitalize ' + + 'least-positive-normalized-long-float short-float-epsilon car ' + + 'least-positive-normalized-short-float short-float-negative-epsilon case ' + + 'least-positive-normalized-single-float short-site-name catch ' + + 'least-positive-short-float signal ccase least-positive-single-float ' + + 'signed-byte cdr length signum ceiling simple-condition cell-error ' + + 'simple-array cell-error-name lisp simple-base-string cerror ' + + 'lisp-implementation-type simple-bit-vector change-class ' + + 'lisp-implementation-version simple-bit-vector-p char list ' + + 'simple-condition-format-arguments char-bit list\\* ' + + 'simple-condition-format-control char-bits list-all-packages simple-error ' + + 'char-bits-limit list-length simple-string char-code listen simple-string-p ' + + 'char-code-limit listp simple-type-error char-control-bit load simple-vector ' + + 'char-downcase load-logical-pathname-translations simple-vector-p char-equal ' + + 'load-time-value simple-warning char-font locally sin char-font-limit log ' + + 'single-flaot-epsilon char-greaterp logand single-float char-hyper-bit logandc1 ' + + 'single-float-epsilon char-int logandc2 single-float-negative-epsilon ' + + 'char-lessp logbitp sinh char-meta-bit logcount sixth char-name logeqv sleep ' + + 'char-not-equal logical-pathname slot-boundp char-not-greaterp ' + + 'logical-pathname-translations slot-exists-p char-not-lessp logior ' + + 'slot-makunbound char-super-bit lognand slot-missing char-upcase lognor ' + + 'slot-unbound char/= lognot slot-value char< logorc1 software-type char<= ' + + 'logorc2 software-version char= logtest some char> logxor sort char>= ' + + 'long-float space character long-float-epsilon special characterp ' + + 'long-float-negative-epsilon special-form-p check-type long-site-name ' + + 'special-operator-p cis loop speed class loop-finish sqrt class-name ' + + 'lower-case-p stable-sort class-of machine-instance standard clear-input ' + + 'machine-type standard-char clear-output machine-version standard-char-p close ' + + 'macro-function standard-class clrhash macroexpand standard-generic-function ' + + 'code-char macroexpand-1 standard-method coerce macroexpand-l standard-object ' + + 'commonp macrolet step compilation-speed make-array storage-condition compile ' + + 'make-array store-value compile-file make-broadcast-stream stream ' + + 'compile-file-pathname make-char stream-element-type compiled-function ' + + 'make-concatenated-stream stream-error compiled-function-p make-condition ' + + 'stream-error-stream compiler-let make-dispatch-macro-character ' + + 'stream-external-format compiler-macro make-echo-stream streamp ' + + 'compiler-macro-function make-hash-table streamup complement make-instance ' + + 'string complex make-instances-obsolete string-capitalize complexp make-list ' + + 'string-char compute-applicable-methods make-load-form string-char-p ' + + 'compute-restarts make-load-form-saving-slots string-downcase concatenate ' + + 'make-method string-equal concatenated-stream make-package string-greaterp ' + + 'concatenated-stream-streams make-pathname string-left-trim cond ' + + 'make-random-state string-lessp condition make-sequence string-not-equal ' + + 'conjugate make-string string-not-greaterp cons make-string-input-stream ' + + 'string-not-lessp consp make-string-output-stream string-right-strim constantly ' + + 'make-symbol string-right-trim constantp make-synonym-stream string-stream ' + + 'continue make-two-way-stream string-trim control-error makunbound ' + + 'string-upcase copy-alist map string/= copy-list map-into string< ' + + 'copy-pprint-dispatch mapc string<= copy-readtable mapcan string= copy-seq ' + + 'mapcar string> copy-structure mapcon string>= copy-symbol maphash stringp ' + + 'copy-tree mapl structure cos maplist structure-class cosh mask-field ' + + 'structure-object count max style-warning count-if member sublim count-if-not ' + + 'member-if sublis ctypecase member-if-not subseq debug merge subsetp decf ' + + 'merge-pathname subst declaim merge-pathnames subst-if declaration method ' + + 'subst-if-not declare method-combination substitute decode-float ' + + 'method-combination-error substitute-if decode-universal-time method-qualifiers ' + + 'substitute-if-not defclass min subtypep defconstant minusp svref defgeneric ' + + 'mismatch sxhash define-compiler-macro mod symbol define-condition ' + + 'most-negative-double-float symbol-function define-method-combination ' + + 'most-negative-fixnum symbol-macrolet define-modify-macro ' + + 'most-negative-long-float symbol-name define-setf-expander ' + + 'most-negative-short-float symbol-package define-setf-method ' + + 'most-negative-single-float symbol-plist define-symbol-macro ' + + 'most-positive-double-float symbol-value defmacro most-positive-fixnum symbolp ' + + 'defmethod most-positive-long-float synonym-stream defpackage ' + + 'most-positive-short-float synonym-stream-symbol defparameter ' + + 'most-positive-single-float sys defsetf muffle-warning system defstruct ' + + 'multiple-value-bind deftype multiple-value-call tagbody defun ' + + 'multiple-value-list tailp defvar multiple-value-prog1 tan delete ' + + 'multiple-value-seteq tanh delete-duplicates multiple-value-setq tenth ' + + 'delete-file multiple-values-limit terpri delete-if name-char the delete-if-not ' + + 'namestring third delete-package nbutlast throw denominator nconc time ' + + 'deposit-field next-method-p trace describe translate-logical-pathname ' + + 'describe-object nintersection translate-pathname destructuring-bind ninth ' + + 'tree-equal digit-char no-applicable-method truename digit-char-p ' + + 'no-next-method truncase directory not truncate directory-namestring notany ' + + 'two-way-stream disassemble notevery two-way-stream-input-stream ' + + 'division-by-zero notinline two-way-stream-output-stream do nreconc type do\\* ' + + 'nreverse type-error do-all-symbols nset-difference type-error-datum ' + + 'do-exeternal-symbols nset-exclusive-or type-error-expected-type ' + + 'do-external-symbols nstring type-of do-symbols nstring-capitalize typecase ' + + 'documentation nstring-downcase typep dolist nstring-upcase unbound-slot ' + + 'dotimes nsublis unbound-slot-instance double-float nsubst unbound-variable ' + + 'double-float-epsilon nsubst-if undefined-function ' + + 'double-float-negative-epsilon nsubst-if-not unexport dpb nsubstitute unintern ' + + 'dribble nsubstitute-if union dynamic-extent nsubstitute-if-not unless ecase ' + + 'nth unread echo-stream nth-value unread-char echo-stream-input-stream nthcdr ' + + 'unsigned-byte echo-stream-output-stream null untrace ed number unuse-package ' + + 'eighth numberp unwind-protect elt numerator ' + + 'update-instance-for-different-class encode-universal-time nunion ' + + 'update-instance-for-redefined-class end-of-file oddp ' + + 'upgraded-array-element-type endp open upgraded-complex-part-type ' + + 'enough-namestring open-stream-p upper-case-p ensure-directories-exist optimize ' + + 'use-package ensure-generic-function or use-value eq otherwise user eql ' + + 'output-stream-p user-homedir-pathname equal package values equalp ' + + 'package-error values-list error package-error-package vector etypecase ' + + 'package-name vector-pop eval package-nicknames vector-push eval-when ' + + 'package-shadowing-symbols vector-push-extend evalhook package-use-list vectorp ' + + 'evenp package-used-by-list warn every packagep warning exp pairlis when export ' + + 'parse-error wild-pathname-p expt parse-integer with-accessors extended-char ' + + 'parse-namestring with-compilation-unit fboundp pathname ' + + 'with-condition-restarts fceiling pathname-device with-hash-table-iterator ' + + 'fdefinition pathname-directory with-input-from-string ffloor pathname-host ' + + 'with-open-file fifth pathname-match-p with-open-stream file-author ' + + 'pathname-name with-output-to-string file-error pathname-type ' + + 'with-package-iterator file-error-pathname pathname-version with-simple-restart ' + + 'file-length pathnamep with-slots file-namestring peek-char ' + + 'with-standard-io-syntax file-position phase write file-stream write-byte ' + + 'file-string-length plusp write-char file-write-date pop write-line fill ' + + 'position write-sequence fill-pointer position-if write-string find ' + + 'position-if-not write-to-string find-all-symbols pprint y-or-n-p find-class ' + + 'pprint-dispatch yes-or-no-p find-if pprint-exit-if-list-exhausted zerop ' + + 'find-if-not pprint-fill'; + + // common lisp global variables. also from lisp.vim + var standard_vars = + '\\*applyhook\\* \\*load-pathname\\* \\*print-pprint-dispatch\\* \\*break-on-signals\\* ' + + '\\*load-print\\* \\*print-pprint-dispatch\\* \\*break-on-signals\\* \\*load-truename\\* ' + + '\\*print-pretty\\* \\*break-on-warnings\\* \\*load-verbose\\* \\*print-radix\\* ' + + '\\*compile-file-pathname\\* \\*macroexpand-hook\\* \\*print-readably\\* ' + + '\\*compile-file-pathname\\* \\*modules\\* \\*print-right-margin\\* \\*compile-file-truename\\* ' + + '\\*package\\* \\*print-right-margin\\* \\*compile-file-truename\\* \\*print-array\\* ' + + '\\*query-io\\* \\*compile-print\\* \\*print-base\\* \\*random-state\\* \\*compile-verbose\\* ' + + '\\*print-case\\* \\*read-base\\* \\*compile-verbose\\* \\*print-circle\\* ' + + '\\*read-default-float-format\\* \\*debug-io\\* \\*print-escape\\* \\*read-eval\\* ' + + '\\*debugger-hook\\* \\*print-gensym\\* \\*read-suppress\\* \\*default-pathname-defaults\\* ' + + '\\*print-length\\* \\*readtable\\* \\*error-output\\* \\*print-level\\* \\*standard-input\\* ' + + '\\*evalhook\\* \\*print-lines\\* \\*standard-output\\* \\*features\\* \\*print-miser-width\\* ' + + '\\*terminal-io\\* \\*gensym-counter\\* \\*print-miser-width\\* \\*trace-output\\* ' + + 'pi internal-time-units-per-second'; + + // common lisp known keywords + var keywords = + ':abort :from-end :overwrite :adjustable :gensym :predicate :append :host ' + + ':preserve-whitespace :array :if-does-not-exist :pretty :base :if-exists :print ' + + ':case :include :print-function :circle :index :probe :conc-name :inherited ' + + ':radix :constructor :initial-contents :read-only :copier :initial-element ' + + ':rehash-size :count :initial-offset :rehash-threshold :create :initial-value ' + + ':rename :default :input :rename-and-delete :defaults :internal :size :device ' + + ':io :start :direction :junk-allowed :start1 :directory :key :start2 ' + + ':displaced-index-offset :length :stream :displaced-to :level :supersede ' + + ':element-type :name :test :end :named :test-not :end1 :new-version :type :end2 ' + + ':nicknames :use :error :output :verbose :escape :output-file :version ' + + ':external :documentation :shadowing-import-from :modern :export ' + + ':case-sensitive :case-inverted :shadow :import-from :intern :fill-pointer ' + + ':upcase :downcase :preserve :invert :load-toplevel :compile-toplevel :execute ' + + ':while :until :for :do :if :then :else :when :unless :in :across :finally ' + + ':collect :nconc :maximize :minimize :sum :and :with :initially :append :into ' + + ':count :end :repeat :always :never :thereis :from :to :upto :downto :below ' + + ':above :by :on :being :each :the :hash-key :hash-keys :hash-value :hash-values ' + + ':using :of-type :upfrom :downfrom :arguments :return-type :library :full ' + + ':malloc-free :none :alloca :in :out :in-out :stdc-stdcall :stdc :c :language ' + + ':built-in :typedef :external :fini :init-once :init-always'; + + var lambda = '&allow-other-keys &aux &body &environment &key &optional &rest &whole'; + + var special = 'let let\\* lambda'; + + /** + * Given a list of items in a string: 'item1 item2 item2 ...' + * + * return a regex *string*: '(item1|item2|item2|...)' + */ + var list_to_regex = function(list) + { + var items = list.replace(/(^ | $)/gm, '').split(/ /g); + return '('+items.join('|')+')'; + }; + + var is_in_list = function(item, list) + { + var items = list.replace(/(^ | $)/gm, '').split(/ /g); + for(var i = 0, n = items.length; i < n; i++) + { + if(items[i] == item) return true; + } + return false; + }; + + /** + * Collections of search and replaces to make. + */ + var replace = [ + // --------------------------------------------------------------------- + // strings (should !!ALWAYS!! be first, lest our tags be destroyed...) + // --------------------------------------------------------------------- + {regex: /"([\s\S]*?)"/gm, replace: '"$1"'}, + + // --------------------------------------------------------------------- + // comments + // --------------------------------------------------------------------- + {regex: /(;.*)(\n|$)/gm, replace: '$1$2'}, + + // --------------------------------------------------------------------- + // "special" (let/lambda) + // --------------------------------------------------------------------- + { + regex: new RegExp('.'+list_to_regex(special)+'(?=[\\s()])', 'g'), + replace: function(fullmatch, fnname) { + if(fullmatch[0] == '(') + { + return '(' + fnname + ''; + } + else + { + return fullmatch; + } + } + }, + + + // --------------------------------------------------------------------- + // function matches + // --------------------------------------------------------------------- + // known functions + { + regex: new RegExp('.'+list_to_regex(funcs)+'(?=[\\s()])', 'g'), + replace: function(fullmatch, fnname) { + if(fullmatch[0] == '(') + { + return '(' + fnname + ''; + } + else + { + return fullmatch; + } + } + }, + // symbol functions (#'my-fn) + { + regex: /([\s()])(#'(\w[\w_-]*))(?=[\s()])/g, + replace: function(fullmatch, delim1, symfun, sym) + { + var known = false; + if(is_in_list(sym, funcs)) + { + known = true; + } + return delim1 +''+ symfun +''; + } + }, + + // --------------------------------------------------------------------- + // lambda keywords + // --------------------------------------------------------------------- + {regex: new RegExp('([\\s()])'+list_to_regex(lambda)+'(?=[\\s()])', 'g'), replace: '$1$2'}, + + // --------------------------------------------------------------------- + // symbols/keywords/variables + // --------------------------------------------------------------------- + // generic symbols + {regex: /([\s()])('\w[\w_-]*)(?=[\s()])/g, replace: '$1$2'}, + // known keywords + { + regex: new RegExp('([\\s()])'+list_to_regex(keywords)+'([\\s()])', 'g'), + replace: function(fullmatch, whitespace, keyword, whitespace2) { + return whitespace + ''+ keyword +''+ whitespace2; + } + }, + // generic keywords + { + regex: /([\s()])(:\w[\w_-]*)/g, + replace: function(fullmatch, delim, keyword) { + if(fullmatch[0].match(/[\s()]/gm)) + { + return delim + ''+ keyword +''; + } + return fullmatch; + } + }, + // known variables + { + regex: new RegExp('([\\s()])'+list_to_regex(standard_vars)+'([\\s()])', 'g'), + replace: function(fullmatch, whitespace, varname, whitespace2) { + return whitespace + ''+ varname +''+ whitespace2; + } + }, + // globals/constants + {regex: /([\s()])(\*\w[\w_-]*\*)(?=[\s()])/g, replace: '$1$2'}, + {regex: /([\s()])(\+\w[\w_-]*\+)(?=[\s()])/g, replace: '$1$2'}, + + // --------------------------------------------------------------------- + // numbers + // --------------------------------------------------------------------- + // binary + {regex: /([\s()])(#b[01]+)(?=[\s()])/ig, replace: '$1$2'}, + // hex + {regex: /([\s()])(#x[\da-f]+)(?=[\s()])/ig, replace: '$1$2'}, + // float + {regex: /([\s()])([+-]?(?:\d+\.\d+|\d+\.|\.\d+))(?=[\s()])/g, replace: '$1$2'}, + // ratio + {regex: /([\s()])([+-]?\d+(?:\/\d+)?)(?=[\s()])/g, replace: '$1$2'}, + // integers + {regex: /([\s()])([+-]?\d+)(?=[\s()])/g, replace: '$1$2'}, + + // --------------------------------------------------------------------- + // misc parsers + // --------------------------------------------------------------------- + // t/nil + {regex: /([\s()])(nil|t)(?=[\s()])/g, replace: '$1$2'}, + + // generic "maybe a function" forms. best second to last + {regex: /\((\w[\w_:-]*)(?=[\s()])/g, replace: '($1'}, + + // ()'s (should most probably be last, unless there's a good reason) + {regex: /([()])/g, replace: '$1'} + ]; + + /** + * Main highlight function. + */ + this.highlight_element = function(code_el) + { + code_el.className += ' hl-highlighted'; + var html = code_el.innerHTML; + // can't have &...;'s running wild like a pack of animals... + html = html.replace(/&/g, '&'); + html = html.replace(/</g, '<'); + html = html.replace(/>/g, '>'); + // pad the HTML string (makes regexs much simpler) + html = "\n" + html + "\n"; + for(var i = 0, n = replace.length; i < n; i++) + { + var rep = replace[i]; + html = html.replace(rep.regex, rep.replace); + } + // unpad HTML string + html = html.replace(/(^\n|\n$)/g, ''); + html = html.replace(/<(?!\/?span)/g, '<'); + // Re-encode stray &s to conform with XHTML + //html = html.replace(/&/g, '&'); + + code_el.innerHTML = html; + }, + + /** + * Automatically highlight all blocks + * + * Takes an options arg, which can be used to specify the classname of the + * tags you wish to highlight. + */ + this.highlight_auto = function(options) + { + options || (options = {}); + var classname = options.className ? options.className : 'lisp'; + var codes = document.getElementsByTagName('code'); + for(var i = 0, n = codes.length; i < n; i++) + { + var code = codes[i]; + if(code.className.match(classname)) + { + this.highlight_element(code); + } + } + }, + + /** + * If called, enables paren matching (hovering over a paren will add the + * "active" class to both the highlighted and the matching paren) + */ + this.paren_match = function(options) + { + options || (options = {}); + + if(!('querySelector' in document)) + { + console.error('HighlightLisp.paren_match: browser does not support querySelector/matches'); + return; + } + + var matches = function(element, selector) + { + if(!element) return; + var domatch; + var tests = ['matches', 'msMatchesSelector', 'mozMatchesSelector', 'webkitMatchesSelector']; + for(var i = 0; i < tests.length; i++) + { + if(!(tests[i] in element)) continue; + domatch = element[tests[i]]; + break; + } + + return domatch.call(element, selector); + }; + + var is_paren = function(el) + { + return matches(el, 'code > .list, code span:not(.comment):not(.string) .list'); + }; + + var find_match = function(paren) + { + // grab all non-commented/stringed parens + var children = paren.parentElement.querySelectorAll('code > span.list, code span:not(.comment):not(.string) .list'); + // turn them into a real array + children = Array.prototype.slice.call(children); + + var is_opening = function(el) { return el.innerHTML == '('; }; + + // tracks when to start counting parens + var count = false; + // tests if this is an opening or closing paren + var opening = is_opening(paren); + // if this is a closing paren, reverse the children so we can search + // backwards just by going forwards + if(!opening) children.reverse(); + + for(var i = 0; i < children.length; i++) + { + var child = children[i]; + var open = is_opening(child); + // mark the first occurance of the paren, and start counting + // from there + if(child === paren) + { + count = 1; + continue; + } + if(count === false) continue; + if(opening == open) count++; + else count--; + if(count === 0) return child; + } + }; + + var add_class = function(el, classname, add) + { + if(!el) return; + el.className = el.className.replace(new RegExp(classname, 'g'), ''); + if(add) el.className += ' '+classname; + }; + + var codes = document.getElementsByClassName('hl-highlighted'); + for(var i = 0; i < codes.length; i++) + { + var code = codes[i]; + var listener = function(add, e) + { + var hovered = e.target; + if(!is_paren(hovered)) return; + var match = find_match(hovered); + add_class(hovered, 'active', add); + add_class(match, 'active', add); + }; + code.addEventListener('mouseover', listener.bind(this, true)); + code.addEventListener('mouseout', listener.bind(this, false)); + } + } +}; + +var HighlightLisp = new highlight_lisp(); diff --git a/clones/lispcookbook.github.io/cl-cookbook/assets/img-ci-build.png b/clones/lispcookbook.github.io/cl-cookbook/assets/img-ci-build.png new file mode 100644 index 0000000000000000000000000000000000000000..826a6306b295a76642adcc0848b13598789bad37 GIT binary patch literal 34794 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%0A-%L>Op# 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 z

      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 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + + + + + + + +

      The Common Lisp Cookbook – Fundamentals of CLOS

      +
      + + + + +
      +
      + +
      +
      + +
      +
      Table of Contents
      +
        +
        +
        + +
        +

        The Common Lisp Cookbook – Fundamentals of CLOS

        + + +

        + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

        +

        + 📕 Get the EPUB and PDF +

        + + +
        CLOS is the “Common Lisp Object Systemâ€, arguably one of the most +powerful object systems available in any language.

        + +

        Some of its features include:

        + +
          +
        • it is dynamic, making it a joy to work with in a Lisp REPL. For +example, changing a class definition will update the existing +objects, given certain rules which we have control upon.
        • +
        • it supports multiple dispatch and multiple inheritance,
        • +
        • it is different from most object systems in that class and method +definitions are not tied together,
        • +
        • it has excellent introspection capabilities,
        • +
        • it is provided by a meta-object protocol, which provides a +standard interface to the CLOS, and can be used to create new object +systems.
        • +
        + +

        The functionality belonging to this name was added to the Common Lisp +language between the publication of Steele’s first edition of “Common +Lisp, the Language†in 1984 and the formalization of the language as +an ANSI standard ten years later.

        + +

        This page aims to give a good understanding of how to use CLOS, but +only a brief introduction to the MOP.

        + +

        To learn the subjects in depth, you will need two books:

        + + + +

        But see also

        + + + +

        Classes and instances

        + +

        Diving in

        + +

        Let’s dive in with an example showing class definition, creation of +objects, slot access, methods specialized for a given class, and +inheritance.

        + +
        (defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name)
        +   (lisper
        +    :initform nil
        +    :accessor lisper)))
        +
        +;; => #<STANDARD-CLASS PERSON>
        +
        +(defvar p1 (make-instance 'person :name "me" ))
        +;;                                 ^^^^ initarg
        +;; => #<PERSON {1006234593}>
        +
        +(name p1)
        +;;^^^ accessor
        +;; => "me"
        +
        +(lisper p1)
        +;; => nil
        +;;    ^^ initform (slot unbound by default)
        +
        +(setf (lisper p1) t)
        +
        +
        +(defclass child (person)
        +  ())
        +
        +(defclass child (person)
        +  ((can-walk-p
        +     :accessor can-walk-p
        +     :initform t)))
        +;; #<STANDARD-CLASS CHILD>
        +
        +(can-walk-p (make-instance 'child))
        +;; T
        +
        + +

        Defining classes (defclass)

        + +

        The macro used for defining new data types in CLOS is defclass.

        + +

        We used it like this:

        + +
        (defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name)
        +   (lisper
        +    :initform nil
        +    :accessor lisper)))
        +
        + +

        This gives us a CLOS type (or class) called person and two slots, +named name and lisper.

        + +
        (class-of p1)
        +#<STANDARD-CLASS PERSON>
        +
        +(type-of p1)
        +PERSON
        +
        + +

        The general form of defclass is:

        + +
        (defclass <class-name> (list of super classes)
        +  ((slot-1
        +     :slot-option slot-argument)
        +   (slot-2, etc))
        +  (:optional-class-option
        +   :another-optional-class-option))
        +
        + +

        So, our person class doesn’t explicitly inherit from another class +(it gets the empty parentheses ()). However it still inherits by default from +the class t and from standard-object. See below under +“inheritanceâ€.

        + +

        We could write a minimal class definition without slot options like this:

        + +
        (defclass point ()
        +  (x y z))
        +
        + +

        or even without slot specifiers: (defclass point () ()).

        + +

        Creating objects (make-instance)

        + +

        We create instances of a class with make-instance:

        + +
        (defvar p1 (make-instance 'person :name "me" ))
        +
        + +

        It is generally good practice to define a constructor:

        + +
        (defun make-person (name &key lisper)
        +  (make-instance 'person :name name :lisper lisper))
        +
        + +

        This has the direct advantage that you can control the required +arguments. You should now export the constructor from your package and +not the class itself.

        + +

        Slots

        + +

        A function that always works (slot-value)

        + +

        The function to access any slot anytime is (slot-value <object> <slot-name>).

        + +

        Given our point class above, which didn’t define any slot accessors:

        + +
        (defvar pt (make-instance 'point))
        +
        +(inspect pt)
        +The object is a STANDARD-OBJECT of type POINT.
        +0. X: "unbound"
        +1. Y: "unbound"
        +2. Z: "unbound"
        +
        + +

        We got an object of type POINT, but slots are unbound by +default: trying to access them will raise an UNBOUND-SLOT +condition:

        + +
        (slot-value pt 'x) ;; => condition: the slot is unbound
        +
        + +

        slot-value is setf-able:

        + +
        (setf (slot-value pt 'x) 1)
        +(slot-value pt 'x) ;; => 1
        +
        + +

        Initial and default values (initarg, initform)

        + +
          +
        • :initarg :foo is the keyword we can pass to make-instance to +give a value to this slot:
        • +
        + +
        (make-instance 'person :name "me")
        +
        + +

        (again: slots are unbound by default)

        + +
          +
        • :initform <val> is the default value in case we didn’t specify + an initarg. This form is evaluated each time it’s needed, in the + lexical environment of the defclass.
        • +
        + +

        Sometimes we see the following trick to clearly require a slot:

        + +
        (defclass foo ()
        +    ((a
        +      :initarg :a
        +      :initform (error "you didn't supply an initial value for slot a"))))
        +;; #<STANDARD-CLASS FOO>
        +
        +(make-instance 'foo) ;; => enters the debugger.
        +
        + +

        Getters and setters (accessor, reader, writer)

        + +
          +
        • :accessor foo: an accessor is both a getter and a +setter. Its argument is a name that will become a generic +function.
        • +
        + +
        (name p1) ;; => "me"
        +
        +(type-of #'name)
        +STANDARD-GENERIC-FUNCTION
        +
        + +
          +
        • :reader and :writer do what you expect. Only the :writer is setf-able.
        • +
        + +

        If you don’t specify any of these, you can still use slot-value.

        + +

        You can give a slot more than one :accessor, :reader or :initarg.

        + +

        We introduce two macros to make the access to slots shorter in some situations:

        + +

        1- with-slots allows to abbreviate several calls to slot-value. The +first argument is a list of slot names. The second argument evaluates +to a CLOS instance. This is followed by optional declarations and an +implicit progn. Lexically during the evaluation of the body, an +access to any of these names as a variable is equivalent to accessing +the corresponding slot of the instance with slot-value.

        + +
        (with-slots (name lisper)
        +    c1
        +  (format t "got ~a, ~a~&" name lisper))
        +
        + +

        or

        + +
        (with-slots ((n name)
        +             (l lisper))
        +    c1
        +  (format t "got ~a, ~a~&" n l))
        +
        + +

        2- with-accessors is equivalent, but instead of a list of slots it +takes a list of accessor functions. Any reference to the variable +inside the macro is equivalent to a call to the accessor function.

        + +
        (with-accessors ((name        name)
        +                  ^^variable  ^^accessor
        +                 (lisper lisper))
        +            p1
        +          (format t "name: ~a, lisper: ~a" name lisper))
        +
        + +

        Class VS instance slots

        + +

        :allocation specifies whether this slot is local or shared.

        + +
          +
        • +

          a slot is local by default, that means it can be different for each instance of the class. In that case :allocation equals :instance.

          +
        • +
        • +

          a shared slot will always be equal for all instances of the + class. We set it with :allocation :class.

          +
        • +
        + +

        In the following example, note how changing the value of the class +slot species of p2 affects all instances of the +class (whether or not those instances exist yet).

        + +
        (defclass person ()
        +  ((name :initarg :name :accessor name)
        +   (species
        +      :initform 'homo-sapiens
        +      :accessor species
        +      :allocation :class)))
        +
        +;; Note that the slot "lisper" was removed in existing instances.
        +(inspect p1)
        +;; The object is a STANDARD-OBJECT of type PERSON.
        +;; 0. NAME: "me"
        +;; 1. SPECIES: HOMO-SAPIENS
        +;; > q
        +
        +(defvar p2 (make-instance 'person))
        +
        +(species p1)
        +(species p2)
        +;; HOMO-SAPIENS
        +
        +(setf (species p2) 'homo-numericus)
        +;; HOMO-NUMERICUS
        +
        +(species p1)
        +;; HOMO-NUMERICUS
        +
        +(species (make-instance 'person))
        +;; HOMO-NUMERICUS
        +
        +(let ((temp (make-instance 'person)))
        +    (setf (species temp) 'homo-lisper))
        +;; HOMO-LISPER
        +(species (make-instance 'person))
        +;; HOMO-LISPER
        +
        + +

        Slot documentation

        + +

        Each slot accepts one :documentation option.

        + +

        Slot type

        + +

        The :type slot option may not do the job you expect it does. If you +are new to the CLOS, we suggest you skip this section and use your own +constructors to manually check slot types.

        + +

        Indeed, whether slot types are being checked or not is undefined. See the Hyperspec.

        + +

        Few implementations will do it. Clozure CL does it, SBCL does it since +its version 1.5.9 (November, 2019) or when safety is high ((declaim +(optimise safety))).

        + +

        To do it otherwise, see this Stack-Overflow answer, and see also quid-pro-quo, a contract programming library.

        + +

        find-class, class-name, class-of

        + +
        (find-class 'point)
        +;; #<STANDARD-CLASS POINT 275B78DC>
        +
        +(class-name (find-class 'point))
        +;; POINT
        +
        +(class-of my-point)
        +;; #<STANDARD-CLASS POINT 275B78DC>
        +
        +(typep my-point (class-of my-point))
        +;; T
        +
        + +

        CLOS classes are also instances of a CLOS class, and we can find out +what that class is, as in the example below:

        + +
        (class-of (class-of my-point))
        +;; #<STANDARD-CLASS STANDARD-CLASS 20306534>
        +
        + +

        Note: this is your first introduction to the MOP. You don’t need that to get started !

        + +

        The object my-point is an instance of the class named point, and the +class named point is itself an instance of the class named +standard-class. We say that the class named standard-class is +the metaclass (i.e. the class of the class) of +my-point. We can make good uses of metaclasses, as we’ll see later.

        + +

        Subclasses and inheritance

        + +

        As illustrated above, child is a subclass of person.

        + +

        All objects inherit from the class standard-object and t.

        + +

        Every child instance is also an instance of person.

        + +
        (type-of c1)
        +;; CHILD
        +
        +(subtypep (type-of c1) 'person)
        +;; T
        +
        +(ql:quickload "closer-mop")
        +;; ...
        +
        +(closer-mop:subclassp (class-of c1) 'person)
        +;; T
        +
        + +

        The closer-mop library is the +portable way to do CLOS/MOP operations.

        + +

        A subclass inherits all of its parents’ slots, and it can override any +of their slot options. Common Lisp makes this process dynamic, great +for REPL session, and we can even control parts of it (like, do +something when a given slot is removed/updated/added, etc).

        + +

        The class precedence list of a child is thus:

        + +
        child <- person <-- standard-object <- t
        +
        + +

        Which we can get with:

        + +
        (closer-mop:class-precedence-list (class-of c1))
        +;; (#<standard-class child>
        +;;  #<standard-class person>
        +;;  #<standard-class standard-object>
        +;;  #<sb-pcl::slot-class sb-pcl::slot-object>
        +;;  #<sb-pcl:system-class t>)
        +
        + +

        However, the direct superclass of a child is only:

        + +
        (closer-mop:class-direct-superclasses (class-of c1))
        +;; (#<standard-class person>)
        +
        + +

        We can further inspect our classes with +class-direct-[subclasses, slots, default-initargs] and many more functions.

        + +

        How slots are combined follows some rules:

        + +
          +
        • +

          :accessor and :reader are combined by the union of accessors + and readers from all the inherited slots.

          +
        • +
        • +

          :initarg: the union of initialization arguments from all the +inherited slots.

          +
        • +
        • +

          :initform: we get the most specific default initial value +form, i.e. the first :initform for that slot in the precedence +list.

          +
        • +
        • +

          :allocation is not inherited. It is controlled solely by the class +being defined and defaults to :instance.

          +
        • +
        + +

        Last but not least, be warned that inheritance is fairly easy to +misuse, and multiple inheritance is multiply so, so please take a +little care. Ask yourself whether foo really wants to inherit from +bar, or whether instances of foo want a slot containing a bar. A +good general guide is that if foo and bar are “same sort of thing†+then it’s correct to mix them together by inheritance, but if they’re +really separate concepts then you should use slots to keep them apart.

        + +

        Multiple inheritance

        + +

        CLOS supports multiple inheritance.

        + +
        (defclass baby (child person)
        +  ())
        +
        + +

        The first class on the list of parent classes is the most specific +one, child’s slots will take precedence over the person’s. Note +that both child and person have to be defined prior to defining +baby in this example.

        + +

        Redefining and changing a class

        + +

        This section briefly covers two topics:

        + +
          +
        • redefinition of an existing class, which you might already have done +by following our code snippets, and what we do naturally during +development, and
        • +
        • changing an instance of one class into an instance of another, +a powerful feature of CLOS that you’ll probably won’t use very often.
        • +
        + +

        We’ll gloss over the details. Suffice it to say that everything’s +configurable by implementing methods exposed by the MOP.

        + +

        To redefine a class, simply evaluate a new defclass form. This then +takes the place of the old definition, the existing class object is +updated, and all instances of the class (and, recursively, its +subclasses) are lazily updated to reflect the new definition. You don’t +have to recompile anything other than the new defclass, nor to +invalidate any of your objects. Think about it for a second: this is awesome !

        + +

        For example, with our person class:

        + +
        (defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name)
        +   (lisper
        +    :initform nil
        +    :accessor lisper)))
        +
        +(setf p1 (make-instance 'person :name "me" ))
        +
        + +

        Changing, adding, removing slots,…

        + +
        (lisper p1)
        +;; NIL
        +
        +(defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name)
        +   (lisper
        +    :initform t        ;; <-- from nil to t
        +    :accessor lisper)))
        +
        +(lisper p1)
        +;; NIL (of course!)
        +
        +(lisper (make-instance 'person :name "You"))
        +;; T
        +
        +(defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name)
        +   (lisper
        +    :initform nil
        +    :accessor lisper)
        +   (age               ;; <-- new slot
        +    :initarg :arg
        +    :initform 18      ;; <-- default value
        +    :accessor age)))
        +
        +(age p1)
        +;; => 18. Correct. This is the default initform for this new slot.
        +
        +(slot-value p1 'bwarf)
        +;; => "the slot bwarf is missing from the object #<person…>"
        +
        +(setf (age p1) 30)
        +(age p1) ;; => 30
        +
        +(defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name)))
        +
        +(slot-value p1 'lisper) ;; => slot lisper is missing.
        +(lisper p1) ;; => there is no applicable method for the generic function lisper when called with arguments #(lisper).
        +
        + +

        To change the class of an instance, use change-class:

        + +
        (change-class p1 'child)
        +;; we can also set slots of the new class:
        +(change-class p1 'child :can-walk-p nil)
        +
        +(class-of p1)
        +;; #<STANDARD-CLASS CHILD>
        +
        +(can-walk-p p1)
        +;; T
        +
        + +

        In the above example, I became a child, and I inherited the can-walk-p slot, which is true by default.

        + +

        Pretty printing

        + +

        Every time we printed an object so far we got an output like

        + +
        #<PERSON {1006234593}>
        +
        + +

        which doesn’t say much.

        + +

        What if we want to show more information ? Something like

        + +
        #<PERSON me lisper: t>
        +
        + +

        Pretty printing is done by specializing the generic print-object method for this class:

        + +
        (defmethod print-object ((obj person) stream)
        +      (print-unreadable-object (obj stream :type t)
        +        (with-accessors ((name name)
        +                         (lisper lisper))
        +            obj
        +          (format stream "~a, lisper: ~a" name lisper))))
        +
        + +

        It gives:

        + +
        p1
        +;; #<PERSON me, lisper: T>
        +
        + +

        print-unreadable-object prints the #<...>, that says to the reader +that this object can not be read back in. Its :type t argument asks +to print the object-type prefix, that is, PERSON. Without it, we get +#<me, lisper: T>.

        + +

        We used the with-accessors macro, but of course for simple cases this is enough:

        + +
        (defmethod print-object ((obj person) stream)
        +  (print-unreadable-object (obj stream :type t)
        +    (format stream "~a, lisper: ~a" (name obj) (lisper obj))))
        +
        + +

        Caution: trying to access a slot that is not bound by default will +lead to an error. Use slot-boundp.

        + +

        For reference, the following reproduces the default behaviour:

        + +
        (defmethod print-object ((obj person) stream)
        +  (print-unreadable-object (obj stream :type t :identity t)))
        +
        + +

        Here, :identity to t prints the {1006234593} address.

        + +

        Classes of traditional lisp types

        + +

        Where we approach that we don’t need CLOS objects to use CLOS.

        + +

        Generously, the functions introduced in the last section also work on +lisp objects which are not CLOS instances:

        + +
        (find-class 'symbol)
        +;; #<BUILT-IN-CLASS SYMBOL>
        +(class-name *)
        +;; SYMBOL
        +(eq ** (class-of 'symbol))
        +;; T
        +(class-of ***)
        +;; #<STANDARD-CLASS BUILT-IN-CLASS>
        +
        + +

        We see here that symbols are instances of the system class +symbol. This is one of 75 cases in which the language requires a +class to exist with the same name as the corresponding lisp +type. Many of these cases are concerned with CLOS itself (for +example, the correspondence between the type standard-class and +the CLOS class of that name) or with the condition system (which +might or might not be built using CLOS classes in any given +implementation). However, 33 correspondences remain relating to +“traditional†lisp types:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        arrayhash-tablereadtable
        bit-vectorintegerreal
        broadcast-streamlistsequence
        characterlogical-pathnamestream
        complexnullstring
        concatenated-streamnumberstring-stream
        conspackagesymbol
        echo-streampathnamesynonym-stream
        file-streamrandom-statet
        floatratiotwo-way-stream
        functionrationalvector
        + +

        Note that not all “traditional†lisp types are included in this +list. (Consider: atom, fixnum, short-float, and any type not +denoted by a symbol.)

        + +

        The presence of t is interesting. Just as every lisp +object is of type t, every lisp object is also a member +of the class named t. This is a simple example of +membership of more then one class at a time, and it brings into +question the issue of inheritance, which we will consider +in some detail later.

        + +
        (find-class t)
        +;; #<BUILT-IN-CLASS T 20305AEC>
        +
        + +

        In addition to classes corresponding to lisp types, there is also a + CLOS class for every structure type you define:

        + +
        (defstruct foo)
        +FOO
        +
        +(class-of (make-foo))
        +;; #<STRUCTURE-CLASS FOO 21DE8714>
        +
        + +

        The metaclass of a structure-object is the class + structure-class. It is implementation-dependent whether + the metaclass of a “traditional†lisp object is + standard-class, structure-class, or + built-in-class. Restrictions:

        + + + + + + + + + + + + + + + + +
        built-in-classMay not use make-instance, may not use slot-value, may not use defclass to modify, may not create subclasses.
        structure-classMay not use make-instance, might work with slot-value (implementation-dependent). Use defstruct to subclass application structure types. Consequences of modifying an existing structure-class are undefined: full recompilation may be necessary.
        standard-classNone of these restrictions.
        + +

        Introspection

        + +

        We already saw some introspection functions.

        + +

        Your best option is to discover the +closer-mop library and to +keep the CLOS & MOP specifications at +hand.

        + +

        More functions:

        + +
        closer-mop:class-default-initargs
        +closer-mop:class-direct-default-initargs
        +closer-mop:class-direct-slots
        +closer-mop:class-direct-subclasses
        +closer-mop:class-direct-superclasses
        +closer-mop:class-precedence-list
        +closer-mop:class-slots
        +closer-mop:classp
        +closer-mop:extract-lambda-list
        +closer-mop:extract-specializer-names
        +closer-mop:generic-function-argument-precedence-order
        +closer-mop:generic-function-declarations
        +closer-mop:generic-function-lambda-list
        +closer-mop:generic-function-method-class
        +closer-mop:generic-function-method-combination
        +closer-mop:generic-function-methods
        +closer-mop:generic-function-name
        +closer-mop:method-combination
        +closer-mop:method-function
        +closer-mop:method-generic-function
        +closer-mop:method-lambda-list
        +closer-mop:method-specializers
        +closer-mop:slot-definition
        +closer-mop:slot-definition-allocation
        +closer-mop:slot-definition-initargs
        +closer-mop:slot-definition-initform
        +closer-mop:slot-definition-initfunction
        +closer-mop:slot-definition-location
        +closer-mop:slot-definition-name
        +closer-mop:slot-definition-readers
        +closer-mop:slot-definition-type
        +closer-mop:slot-definition-writers
        +closer-mop:specializer-direct-generic-functions
        +closer-mop:specializer-direct-methods
        +closer-mop:standard-accessor-method
        +
        + +

        See also

        + +

        defclass/std: write shorter classes

        + +

        The library defclass/std +provides a macro to write shorter defclass forms.

        + +

        By default, it adds an accessor, an initarg and an initform to nil to your slots definition:

        + +

        This:

        + +
        (defclass/std example ()
        +  ((slot1 slot2 slot3)))
        +
        + +

        expands to:

        + +
        (defclass example ()
        +  ((slot1
        +    :accessor slot1
        +    :initarg :slot1
        +    :initform nil)
        +   (slot2
        +     :accessor slot2
        +     :initarg :slot2
        +     :initform nil)
        +   (slot3
        +     :accessor slot3
        +     :initarg :slot3
        +     :initform nil)))
        +
        + +

        It does much more and it is very flexible, however it is seldom used +by the Common Lisp community: use at your own risks©.

        + +

        Methods

        + +

        Diving in

        +

        Recalling our person and child classes from the beginning:

        + +
        (defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name)))
        +;; => #<STANDARD-CLASS PERSON>
        +
        +(defclass child (person)
        +  ())
        +;; #<STANDARD-CLASS CHILD>
        +
        +(setf p1 (make-instance 'person :name "me"))
        +(setf c1 (make-instance 'child :name "Alice"))
        +
        + +

        Below we create methods, we specialize them, we use method combination +(before, after, around), and qualifiers.

        + +
        (defmethod greet (obj)
        +  (format t "Are you a person ? You are a ~a.~&" (type-of obj)))
        +;; style-warning: Implicitly creating new generic function common-lisp-user::greet.
        +;; #<STANDARD-METHOD GREET (t) {1008EE4603}>
        +
        +(greet :anything)
        +;; Are you a person ? You are a KEYWORD.
        +;; NIL
        +(greet p1)
        +;; Are you a person ? You are a PERSON.
        +
        +(defgeneric greet (obj)
        +  (:documentation "say hello"))
        +;; STYLE-WARNING: redefining COMMON-LISP-USER::GREET in DEFGENERIC
        +;; #<STANDARD-GENERIC-FUNCTION GREET (2)>
        +
        +(defmethod greet ((obj person))
        +  (format t "Hello ~a !~&" (name obj)))
        +;; #<STANDARD-METHOD GREET (PERSON) {1007C26743}>
        +
        +(greet p1) ;; => "Hello me !"
        +(greet c1) ;; => "Hello Alice !"
        +
        +(defmethod greet ((obj child))
        +  (format t "ur so cute~&"))
        +;; #<STANDARD-METHOD GREET (CHILD) {1008F3C1C3}>
        +
        +(greet p1) ;; => "Hello me !"
        +(greet c1) ;; => "ur so cute"
        +
        +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        +;;; Method combination: before, after, around.
        +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        +
        +(defmethod greet :before ((obj person))
        +  (format t "-- before person~&"))
        +#<STANDARD-METHOD GREET :BEFORE (PERSON) {100C94A013}>
        +
        +(greet p1)
        +;; -- before person
        +;; Hello me
        +
        +(defmethod greet :before ((obj child))
        +  (format t "-- before child~&"))
        +;; #<STANDARD-METHOD GREET :BEFORE (CHILD) {100AD32A43}>
        +(greet c1)
        +;; -- before child
        +;; -- before person
        +;; ur so cute
        +
        +(defmethod greet :after ((obj person))
        +  (format t "-- after person~&"))
        +;; #<STANDARD-METHOD GREET :AFTER (PERSON) {100CA2E1A3}>
        +(greet p1)
        +;; -- before person
        +;; Hello me
        +;; -- after person
        +
        +(defmethod greet :after ((obj child))
        +  (format t "-- after child~&"))
        +;; #<STANDARD-METHOD GREET :AFTER (CHILD) {10075B71F3}>
        +(greet c1)
        +;; -- before child
        +;; -- before person
        +;; ur so cute
        +;; -- after person
        +;; -- after child
        +
        +(defmethod greet :around ((obj child))
        +  (format t "Hello my dear~&"))
        +;; #<STANDARD-METHOD GREET :AROUND (CHILD) {10076658E3}>
        +(greet c1) ;; Hello my dear
        +
        +
        +;; call-next-method
        +
        +(defmethod greet :around ((obj child))
        +  (format t "Hello my dear~&")
        +  (when (next-method-p)
        +    (call-next-method)))
        +;; #<standard-method greet :around (child) {100AF76863}>
        +
        +(greet c1)
        +;; Hello my dear
        +;; -- before child
        +;; -- before person
        +;; ur so cute
        +;; -- after person
        +;; -- after child
        +
        +;;;;;;;;;;;;;;;;;
        +;; Adding in &key
        +;;;;;;;;;;;;;;;;;
        +
        +;; In order to add "&key" to our generic method, we need to remove its definition first.
        +(fmakunbound 'greet)  ;; with Slime: C-c C-u (slime-undefine-function)
        +(defmethod greet ((obj person) &key talkative)
        +  (format t "Hello ~a~&" (name obj))
        +  (when talkative
        +    (format t "blah")))
        +
        +(defgeneric greet (obj &key &allow-other-keys)
        +  (:documentation "say hi"))
        +
        +(defmethod greet (obj &key &allow-other-keys)
        +  (format t "Are you a person ? You are a ~a.~&" (type-of obj)))
        +
        +(defmethod greet ((obj person) &key talkative &allow-other-keys)
        +  (format t "Hello ~a !~&" (name obj))
        +  (when talkative
        +    (format t "blah")))
        +
        +(greet p1 :talkative t) ;; ok
        +(greet p1 :foo t) ;; still ok
        +
        +
        +;;;;;;;;;;;;;;;;;;;;;;;
        +
        +(defgeneric greet (obj)
        +  (:documentation "say hello")
        +  (:method (obj)
        +    (format t "Are you a person ? You are a ~a~&." (type-of obj)))
        +  (:method ((obj person))
        +    (format t "Hello ~a !~&" (name obj)))
        +  (:method ((obj child))
        +    (format t "ur so cute~&")))
        +
        +;;;;;;;;;;;;;;;;
        +;;; Specializers
        +;;;;;;;;;;;;;;;;
        +
        +(defgeneric feed (obj meal-type)
        +  (:method (obj meal-type)
        +    (declare (ignorable meal-type))
        +    (format t "eating~&")))
        +
        +(defmethod feed (obj (meal-type (eql :dessert)))
        +    (declare (ignorable meal-type))
        +    (format t "mmh, dessert !~&"))
        +
        +(feed c1 :dessert)
        +;; mmh, dessert !
        +
        +(defmethod feed ((obj child) (meal-type (eql :soup)))
        +    (declare (ignorable meal-type))
        +    (format t "bwark~&"))
        +
        +(feed p1 :soup)
        +;; eating
        +(feed c1 :soup)
        +;; bwark
        +
        + +

        Generic functions (defgeneric, defmethod)

        + +

        A generic function is a lisp function which is associated +with a set of methods and dispatches them when it’s invoked. All +the methods with the same function name belong to the same generic +function.

        + +

        The defmethod form is similar to a defun. It associates a body of +code with a function name, but that body may only be executed if the +types of the arguments match the pattern declared by the lambda list.

        + +

        They can have optional, keyword and &rest arguments.

        + +

        The defgeneric form defines the generic function. If we write a +defmethod without a corresponding defgeneric, a generic function +is automatically created (see examples).

        + +

        It is generally a good idea to write the defgenerics. We can add a +default implementation and even some documentation.

        + +
        (defgeneric greet (obj)
        +  (:documentation "says hi")
        +  (:method (obj)
        +    (format t "Hi")))
        +
        + +

        The required parameters in the method’s lambda list may take one of +the following three forms:

        + +

        1- a simple variable:

        + +
        (defmethod greet (foo)
        +  ...)
        +
        + +

        This method can take any argument, it is always applicable.

        + +

        The variable foo is bound to the corresponding argument value, as +usual.

        + +

        2- a variable and a specializer, as in:

        + +
        (defmethod greet ((foo person))
        +  ...)
        +
        + +

        In this case, the variable foo is bound to the corresponding +argument only if that argument is of specializer class person or a subclass, +like child (indeed, a “child†is also a “personâ€).

        + +

        If any argument fails to match its +specializer then the method is not applicable and it cannot be +executed with those arguments.We’ll get an error message like +“there is no applicable method for the generic function xxx when +called with arguments yyyâ€.

        + +

        Only required parameters can be specialized. We can’t specialize on optional &key arguments.

        + +

        3- a variable and an eql specializer

        + +
        (defmethod feed ((obj child) (meal-type (eql :soup)))
        +    (declare (ignorable meal-type))
        +    (format t "bwark~&"))
        +
        +(feed c1 :soup)
        +;; "bwark"
        +
        + +

        In place of a simple symbol (:soup), the eql specializer can be any +lisp form. It is evaluated at the same time of the defmethod.

        + +

        You can define any number of methods with the same function name but +with different specializers, as long as the form of the lambda list is +congruent with the shape of the generic function. The system chooses +the most specific applicable method and executes its body. The most +specific method is the one whose specializers are nearest to the head +of the class-precedence-list of the argument (classes on the left of +the lambda list are more specific). A method with specializers is more +specific to one without any.

        + +

        Notes:

        + +
          +
        • +

          It is an error to define a method with the same function name as +an ordinary function. If you really want to do that, use the +shadowing mechanism.

          +
        • +
        • +

          To add or remove keys or rest arguments to an existing generic +method’s lambda list, you will need to delete its declaration with +fmakunbound (or C-c C-u (slime-undefine-function) with the +cursor on the function in Slime) and start again. Otherwise, +you’ll see:

          +
        • +
        + +
        attempt to add the method
        +  #<STANDARD-METHOD NIL (#<STANDARD-CLASS CHILD>) {1009504233}>
        +to the generic function
        +  #<STANDARD-GENERIC-FUNCTION GREET (2)>;
        +but the method and generic function differ in whether they accept
        +&REST or &KEY arguments.
        +
        + +
          +
        • +

          Methods can be redefined (exactly as for ordinary functions).

          +
        • +
        • +

          The order in which methods are defined is irrelevant, although +any classes on which they specialize must already exist.

          +
        • +
        • +

          An unspecialized argument is more or less equivalent to being +specialized on the class t. The only difference is that +all specialized arguments are implicitly taken to be “referred to†(in +the sense of declare ignore.)

          +
        • +
        • +

          Each defmethod form generates (and returns) a CLOS +instance, of class standard-method.

          +
        • +
        • +

          An eql specializer won’t work as is with strings. Indeed, strings +need equal or equalp to be compared. But, we can assign our string +to a variable and use the variable both in the eql specializer and +for the function call.

          +
        • +
        • +

          All the methods with the same function name belong to the same generic function.

          +
        • +
        • +

          All slot accessors and readers defined by defclass are methods. They can override or be overridden by other methods on the same generic function.

          +
        • +
        + +

        See more about defmethod on the CLHS.

        + +

        Multimethods

        + +

        Multimethods explicitly specialize more than one of the generic +function’s required parameters.

        + +

        They don’t belong to a particular class. Meaning, we don’t have to +decide on the class that would be best to host this method, as we might +have to in other languages.

        + +
        (defgeneric hug (a b)
        +   (:documentation "Hug between two persons."))
        +;; #<STANDARD-GENERIC-FUNCTION HUG (0)>
        +
        +(defmethod hug ((a person) (b person))
        +  :person-person-hug)
        +
        +(defmethod hug ((a person) (b child))
        +  :person-child-hug)
        +
        + +

        Read more on Practical Common Lisp.

        + +

        Controlling setters (setf-ing methods)

        + +

        In Lisp, we can define setf counterparts of functions or methods. We +might want this to have more control on how to update an object.

        + +
        (defmethod (setf name) (new-val (obj person))
        +  (if (equalp new-val "james bond")
        +    (format t "Dude that's not possible.~&")
        +    (setf (slot-value obj 'name) new-val)))
        +
        +(setf (name p1) "james bond") ;; -> no rename
        +
        + +

        If you know Python, this behaviour is provided by the @property decorator.

        + +

        Dispatch mechanism and next methods

        + +

        When a generic function is invoked, the application cannot directly invoke a method. The dispatch mechanism proceeds as follows:

        + +
          +
        1. compute the list of applicable methods
        2. +
        3. if no method is applicable then signal an error
        4. +
        5. sort the applicable methods in order of specificity
        6. +
        7. invoke the most specific method.
        8. +
        + +

        Our greet generic function has three applicable methods:

        + +
        (closer-mop:generic-function-methods #'greet)
        +(#<STANDARD-METHOD GREET (CHILD) {10098406A3}>
        + #<STANDARD-METHOD GREET (PERSON) {1009008EC3}>
        + #<STANDARD-METHOD GREET (T) {1008E6EBB3}>)
        +
        + +

        During the execution of a method, the remaining applicable methods +are still accessible, via the local function +call-next-method. This function has lexical scope within +the body of a method but indefinite extent. It invokes the next most +specific method, and returns whatever value that method returned. It +can be called with either:

        + +
          +
        • +

          no arguments, in which case the next method will +receive exactly the same arguments as this method did, or

          +
        • +
        • +

          explicit arguments, in which case it is required that the +sorted set of methods applicable to the new arguments must be the same +as that computed when the generic function was first called.

          +
        • +
        + +

        For example:

        + +
        (defmethod greet ((obj child))
        +  (format t "ur so cute~&")
        +  (when (next-method-p)
        +    (call-next-method)))
        +;; STYLE-WARNING: REDEFINING GREET (#<STANDARD-CLASS CHILD>) in DEFMETHOD
        +;; #<STANDARD-METHOD GREET (child) {1003D3DB43}>
        +
        +(greet c1)
        +;; ur so cute
        +;; Hello Alice !
        +
        + +

        Calling call-next-method when there is no next method +signals an error. You can find out whether a next method exists by +calling the local function next-method-p (which also has +has lexical scope and indefinite extent).

        + +

        Note finally that the body of every method establishes a block with the same name as the method’s generic function. If you return-from that name you are exiting the current method, not the call to the enclosing generic function.

        + +

        Method qualifiers (before, after, around)

        + +

        In our “Diving in†examples, we saw some use of the :before, :after and :around qualifiers:

        + +
          +
        • (defmethod foo :before (obj) (...))
        • +
        • (defmethod foo :after (obj) (...))
        • +
        • (defmethod foo :around (obj) (...))
        • +
        + +

        By default, in the standard method combination framework provided by +CLOS, we can only use one of those three qualifiers, and the flow of control is as follows:

        + +
          +
        • a before-method is called, well, before the applicable primary +method. If they are many before-methods, all are called. The +most specific before-method is called first (child before person).
        • +
        • the most specific applicable primary method (a method without +qualifiers) is called (only one).
        • +
        • all applicable after-methods are called. The most specific one is +called last (after-method of person, then after-method of child).
        • +
        + +

        The generic function returns the value of the primary method. Any +values of the before or after methods are ignored. They are used for +their side effects.

        + +

        And then we have around-methods. They are wrappers around the core +mechanism we just described. They can be useful to catch return values +or to set up an environment around the primary method (set up a catch, +a lock, timing an execution,…).

        + +

        If the dispatch mechanism finds an around-method, it calls it and +returns its result. If the around-method has a call-next-method, it +calls the next most applicable around-method. It is only when we reach +the primary method that we start calling the before and after-methods.

        + +

        Thus, the full dispatch mechanism for generic functions is as follows:

        + +
          +
        1. compute the applicable methods, and partition them into +separate lists according to their qualifier;
        2. +
        3. if there is no applicable primary method then signal an +error;
        4. +
        5. sort each of the lists into order of specificity;
        6. +
        7. execute the most specific :around method and +return whatever that returns;
        8. +
        9. if an :around method invokes +call-next-method, execute the next most specific +:around method;
        10. +
        11. +

          if there were no :around methods in the first +place, or if an :around method invokes +call-next-method but there are no further +:around methods to call, then proceed as follows:

          + +

          a. run all the :before methods, in order, + ignoring any return values and not permitting calls to + call-next-method or + next-method-p;

          + +

          b. execute the most specific primary method and return + whatever that returns;

          + +

          c. if a primary method invokes call-next-method, + execute the next most specific primary method;

          + +

          d. if a primary method invokes call-next-method + but there are no further primary methods to call then signal an + error;

          + +

          e. after the primary method(s) have completed, run all the + :after methods, in reverse + order, ignoring any return values and not permitting calls to + call-next-method or + next-method-p.

          +
        12. +
        + +

        Think of it as an onion, with all the :around + methods in the outermost layer, :before and + :after methods in the middle layer, and primary methods + on the inside.

        + +

        Other method combinations

        + +

        The default method combination type we just saw is named standard, +but other method combination types are available, and no need to say +that you can define your own.

        + +

        The built-in types are:

        + +
        progn + list nconc and max or append min
        +
        + +

        You notice that these types are named after a lisp operator. Indeed, +what they do is they define a framework that combines the applicable +primary methods inside a call to the lisp operator of that name. For +example, using the progn combination type is equivalent to calling all +the primary methods one after the other:

        + +
        (progn
        +  (method-1 args)
        +  (method-2 args)
        +  (method-3 args))
        +
        + +

        Here, unlike the standard mechanism, all the primary methods +applicable for a given object are called, the most specific +first.

        + +

        To change the combination type, we set the :method-combination +option of defgeneric and we use it as the methods’ qualifier:

        + +
        (defgeneric foo (obj)
        +  (:method-combination progn))
        +
        +(defmethod foo progn ((obj obj))
        +   (...))
        +
        + +

        An example with progn:

        + +
        (defgeneric dishes (obj)
        +   (:method-combination progn)
        +   (:method progn (obj)
        +     (format t "- clean and dry.~&"))
        +   (:method progn ((obj person))
        +     (format t "- bring a person's dishes~&"))
        +   (:method progn ((obj child))
        +     (format t "- bring the baby dishes~&")))
        +;; #<STANDARD-GENERIC-FUNCTION DISHES (3)>
        +
        +(dishes c1)
        +;; - bring the baby dishes
        +;; - bring a person's dishes
        +;; - clean and dry.
        +
        +(greet c1)
        +;; ur so cute  --> only the most applicable method was called.
        +
        + +

        Similarly, using the list type is equivalent to returning the list +of the values of the methods.

        + +
        (list
        +  (method-1 args)
        +  (method-2 args)
        +  (method-3 args))
        +
        + +
        (defgeneric tidy (obj)
        +  (:method-combination list)
        +  (:method list (obj)
        +    :foo)
        +  (:method list ((obj person))
        +    :books)
        +  (:method list ((obj child))
        +    :toys))
        +;; #<STANDARD-GENERIC-FUNCTION TIDY (3)>
        +
        +(tidy c1)
        +;; (:toys :books :foo)
        +
        + +

        Around methods are accepted:

        + +
        (defmethod tidy :around (obj)
        +   (let ((res (call-next-method)))
        +     (format t "I'm going to clean up ~a~&" res)
        +     (when (> (length res)
        +              1)
        +       (format t "that's too much !~&"))))
        +
        +(tidy c1)
        +;; I'm going to clean up (toys book foo)
        +;; that's too much !
        +
        + +

        Note that these operators don’t support before, after and around +methods (indeed, there is no room for them anymore). They do support +around methods, where call-next-method is allowed, but they don’t +support calling call-next-method in the primary methods (it would +indeed be redundant since all primary methods are called, or clunky to +not call one).

        + +

        CLOS allows us to define a new operator as a method combination type, be +it a lisp function, macro or special form. We’ll let you refer to the +books if you feel the need.

        + +

        Debugging: tracing method combination

        + +

        It is possible to trace the method +combination, but this is implementation dependent.

        + +

        In SBCL, we can use (trace foo :methods t). See this post by an SBCL core developer.

        + +

        For example, given a generic:

        + +
        (defgeneric foo (x)
        +  (:method (x) 3))
        +(defmethod foo :around ((x fixnum))
        +  (1+ (call-next-method)))
        +(defmethod foo ((x integer))
        +  (* 2 (call-next-method)))
        +(defmethod foo ((x float))
        +  (* 3 (call-next-method)))
        +(defmethod foo :before ((x single-float))
        +  'single)
        +(defmethod foo :after ((x double-float))
        + 'double)
        +
        + +

        Let’s trace it:

        + +
        (trace foo :methods t)
        +
        +(foo 2.0d0)
        +  0: (FOO 2.0d0)
        +    1: ((SB-PCL::COMBINED-METHOD FOO) 2.0d0)
        +      2: ((METHOD FOO (FLOAT)) 2.0d0)
        +        3: ((METHOD FOO (T)) 2.0d0)
        +        3: (METHOD FOO (T)) returned 3
        +      2: (METHOD FOO (FLOAT)) returned 9
        +      2: ((METHOD FOO :AFTER (DOUBLE-FLOAT)) 2.0d0)
        +      2: (METHOD FOO :AFTER (DOUBLE-FLOAT)) returned DOUBLE
        +    1: (SB-PCL::COMBINED-METHOD FOO) returned 9
        +  0: FOO returned 9
        +9
        +
        + +

        MOP

        + +

        We gather here some examples that make use of the framework provided +by the meta-object protocol, the configurable object system that rules +Lisp’s object system. We touch advanced concepts so, new reader, don’t +worry: you don’t need to understand this section to start using the +Common Lisp Object System.

        + +

        We won’t explain much about the MOP here, but hopefully sufficiently +to make you see its possibilities or to help you understand how some +CL libraries are built. We invite you to read the books referenced in +the introduction.

        + +

        Metaclasses

        + +

        Metaclasses are needed to control the behaviour of other classes.

        + +

        As announced, we won’t talk much. See also Wikipedia for metaclasses or CLOS.

        + +

        The standard metaclass is standard-class:

        + +
        (class-of p1) ;; #<STANDARD-CLASS PERSON>
        +
        + +

        But we’ll change it to one of our own, so that we’ll be able to +count the creation of instances. This same mechanism could be used +to auto increment the primary key of a database system (this is +how the Postmodern or Mito libraries do), to log the creation of objects, +etc.

        + +

        Our metaclass inherits from standard-class:

        + +
        (defclass counted-class (standard-class)
        +  ((counter :initform 0)))
        +#<STANDARD-CLASS COUNTED-CLASS>
        +
        +(unintern 'person)
        +;; this is necessary to change the metaclass of person.
        +;; or (setf (find-class 'person) nil)
        +;; https://stackoverflow.com/questions/38811931/how-to-change-classs-metaclass#38812140
        +
        +(defclass person ()
        +  ((name
        +    :initarg :name
        +    :accessor name))
        +  (:metaclass counted-class)) ;; <- metaclass
        +;; #<COUNTED-CLASS PERSON>
        +;;   ^^^ not standard-class anymore.
        +
        + +

        The :metaclass class option can appear only once.

        + +

        Actually you should have gotten a message asking to implement +validate-superclass. So, still with the closer-mop library:

        + +
        (defmethod closer-mop:validate-superclass ((class counted-class)
        +                                           (superclass standard-class))
        +  t)
        +
        + +

        Now we can control the creation of new person instances:

        + +
        (defmethod make-instance :after ((class counted-class) &key)
        +  (incf (slot-value class 'counter)))
        +;; #<STANDARD-METHOD MAKE-INSTANCE :AFTER (COUNTED-CLASS) {1007718473}>
        +
        + +

        See that an :after qualifier is the safest choice, we let the +standard method run as usual and return a new instance.

        + +

        The &key is necessary, remember that make-instance is given initargs.

        + +

        Now testing:

        + +
        (defvar p3 (make-instance 'person :name "adam"))
        +#<PERSON {1007A8F5B3}>
        +
        +(slot-value p3 'counter)
        +;; => error. No, our new slot isn't on the person class.
        +(slot-value (find-class 'person) 'counter)
        +;; 1
        +
        +(make-instance 'person :name "eve")
        +;; #<PERSON {1007AD5773}>
        +(slot-value (find-class 'person) 'counter)
        +;; 2
        +
        + +

        It’s working.

        + +

        Controlling the initialization of instances (initialize-instance)

        + +

        To further control the creation of object instances, we can specialize the method +initialize-instance. It is called by make-instance, just after +a new instance was created but wasn’t initialized yet with the +default initargs and initforms.

        + +

        It is recommended (Keene) to create an after method, since creating a +primary method would prevent slots’ initialization.

        + +
        (defmethod initialize-instance :after ((obj person) &key) ;; note &key
        +  (do something with obj))
        +
        + +

        A typical example would be to validate the initial values. Here we’ll +check that the person’s name is longer than 3 characters:

        + +
        (defmethod initialize-instance :after ((obj person) &key)
        +  (with-slots (name) obj
        +    (assert (>= (length name) 3))))
        +
        + +

        So this call doesn’t work anymore:

        + +
        (make-instance 'person :name "me" )
        +;; The assertion (>= #1=(LENGTH NAME) 3) failed with #1# = 2.
        +;;   [Condition of type SIMPLE-ERROR]
        +
        + +

        We are prompted into the interactive debugger and we are given a +choice of restarts (continue, retry, abort).

        + +

        So while we’re at it, here’s an assertion that uses the debugger +features to offer to change “nameâ€:

        + +
        (defmethod INITIALIZE-INSTANCE :after ((obj person) &key)
        +  (with-slots (name) obj
        +    (assert (>= (length name) 3)
        +            (name)  ;; creates a restart that offers to change "name"
        +            "The value of name is ~a. It should be longer than 3 characters." name)))
        +
        + +

        We get:

        + +
        The value of name is me. It should be longer than 3 characters.
        +   [Condition of type SIMPLE-ERROR]
        +
        +Restarts:
        + 0: [CONTINUE] Retry assertion with new value for NAME.    <--- new restart
        + 1: [RETRY] Retry SLIME REPL evaluation request.
        + 2: [*ABORT] Return to SLIME's top level.
        +
        + +

        Another rationale. The CLOS implementation of + make-instance is in two stages: allocate the new object, + and then pass it along with all the make-instance keyword + arguments, to the generic function + initialize-instance. Implementors and application writers + define :after methods on + initialize-instance, to initialize the slots of the + instance. The system-supplied primary method does this with regard to + (a) :initform and :initarg values supplied + with the class was defined and (b) the keywords passed through from + make-instance. Other methods can extend this behaviour as + they see fit. For example, they might accept an additional keyword + which invokes a database access to fill certain slots. The lambda list + for initialize-instance is:

        + +
        initialize-instance instance &rest initargs &key &allow-other-keys
        +
        + +

        See more in the books !

        + + +

        + Page source: clos.md +

        +
        + + + + + +
        +
        +
        + © 2002–2021 the Common Lisp Cookbook Project +
        + +
        +
        T
        O
        C
        +
        + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/dandelion.png b/clones/lispcookbook.github.io/cl-cookbook/dandelion.png new file mode 100644 index 0000000000000000000000000000000000000000..09c7975b8b520dc9e447a8aadf7edef4bf11f6bb GIT binary patch literal 144060 zcmbTdbyOVBx;ENK@Zjzc++Bi`puvJm@Bl$4xJz)C1PKt_-F0vc?(RCcyMFWAXYX^q zv({aA-F4@WneOVU>gs;$wdZ{%OhrlNEebIT003|0WIw6`0D>3*z*!){LR&UkSB9ZK zaE_94>PSdPOB>4T&{Iq&DQzb;khznqv4a_)_RZPJ$;`pje;gSAC;_>T66$V?M=P#I zxEe3O+3Bzi`#}C}tRw?6GE8m~Wvi?VrVRtWO@Y|Ze%SN$)Rfv-4NQRr0VZyq{3*($ zB;}9Tz$=6Lx#U|PUmI+`0lFhLs*m?RFXLv_kGrj>o;Bdhm0NSdoCzc(sz6N1|N3(N zL>=s)qls1|0K>|8%DcRJjdWVE*snRMXzZHz@ztbcQU!!2flsCvf|} zuKsTQ_kI8AvqEq?ZyIBa3!OY`sB*{mb=8;uRTEFJGDe!=-fSkELix9e8qQOrm}F4X zVNT4^T%lp}cN@&^pp`Y>+wS^SL<}VH-_O;lW5d~tChDJe-9 z3l!QIn)Ta{QWK9ZWJDT?M|-+9+e#F9BaE%bhQldI6MBt-Su&9{jWp3oqp9rY2CS} z&C_y-MM+Hav|=er#Icakc4fQ@M59XoL= zEP@xwJM&(syuF<|cjM?pBxL`u=(8!F*3;t2IJ;IBdXKu>MK+wrvH(pW>uf4O!#I_% zd_d*0M}ii8@;;rYDiRL(JnctikAmQ**6+#j=B)TCv$6k*c8ctE>5ui6hk`a&MM3;D z|BUT-jIbsye&*L(+k1jyyEf-97=l}-|2!1cc2s3$Wnf@nOH0eeg+rp*8;QcwQh2|f zo}S7|js~Iv7l^@vP5t=zxIwGO&h9QBNI_N>2?Jy9@S4yXx>}!oy zWW?};B7bA*Umb>V;cQWenJm^)#i_Qv9IYCnTO^UVVGabCsDl2y=hB>BcX1ujLHV%j z%IvCHjJWD@8)cmPeT)9kkqnc|W&b$fX++Rk(}qzEz1h}MI`d@t$4bZ;t~D9ud5j#9 zsE?CF?C&bP(#O62!QA8;Y6ln67Ng_Vv(&H`#Y}ij~S2aWa7P;b`SUCQ;RP z`G&;FP*$|&IVrEKgTqi~VueQCNz&wBtPdIlN`ESeWR>N!UmXI*6 zcZHs4#JQpkw~?{+d+A|un|6YHg`%flu{JznA{o|NcOhOVMq<|k5d}T1b_OnLft@Qx zz(JuSc%{z!9IK1sVFLT+?wBGxdB%4+FUGTDu_{a0iKBh@kBZ`oDE zDH&ZhpPu7NzD1yH5A{@4LPf=>NYmD>k83nKUQ>l&jHMM+q=h+SUhE6UH=O~95g)T1 zA)^V2iSPMu_NOd5{9v4&o$ZE>_KJ@^T17=fTJ!Vsv$9}-r{`zHx5V3Ckx*5C-Vn34 z?FG--37KjZD5R{Vjx9Goj(en<>_4d|lzqEhEVCH4`PRPCs*!)u94m|WDRtCj4B>{cWLB^P#!Ic(=1JVHzK~MVhv~mW0lfJ?TZ%I&i(1`6 zz$-PevSAkCv7t=^^5E1vOzVl0Xgvr*PUsO?1&gTl z&+Bv!R$djnQsdAW+k&gD3%y=$o{oxZ>!R^y!@$Yz{!MAcRQ^Jv{`x71i(O2ZVQewN zR+Awg8S_@tSuIu74eH|d%#RRJLSKB$f{R)}c6}25WzV_mAcNHdn4+zLw&0 zG{51+VcZ2@;b6ea%e%k7uc4ta%A#gul*tVsm zIe8G&+`W+6;3Y#wI%tM}3$jSS+ix!~k;pp?DlppfLYn~*eBtkUDe(>_ajoUqtGn;D zdPlYzlP|eE!Yr|UZ$>hh*mq~5j`B7EQfJzPo4`2k(`dhk&Eb_3mpS^YT$jO<88JI^#Af%j=&^bEg*H22N5u{rmX^~*T;v^39fNxo z$Wzf~WTSuuFK)o8r;EK|k-nCO#uC)$=R@}|8B^t(s4p(B3{CZ&UB$XurN#N3wm3%< zSc5OFV!ZMkdPg)GKfNCwRc%|PGP6*yLf4W~7qXaB+(qiF&#E4^Tra~;Wn?Vx5w-MQ@}tySOVfF<^1s(G4$VSWYwr8=#8 z2JlT6`zu6hxpmY4+25#6S0&4DZ{o56?G$)*8I7AL~2f z2Wo1{)e*S88j8SOtf$q2K%BcCSw(-+yYgz zn3(ktQ>p@<;8!;|4$5!=zu(uoWTsV(WN4b;+Exi_Q+72AP_WDvziflZ(jRt|Hb^H@8CfYX#Kn5aR$0aN8_-xwa$hn!l0TOsNAgA8Ic64xLV0 zZ{Jgterdu6PQa(45V6aPiHy2aV!NGxvnVB)~n6~m`Qd!}M`P4Ta zz%L05Rr;%fzq$)=;yw;@s77TFiic*@*|?Z&r7#7Xg?3x1R06vPRyFGtMrrh$Xdjl+ zpPGg74@%xj7E;V4Si*>x$6=MQe%sa`Q|8(^(ZB8OtFgF!T0Nv|0OQcOz8u2gp#nw~ z%uEwpt$2vhnvh*xDuH*h+ex^{$x>2Mx<;OPmJE12#GLUuR#q%MhUl{oOz(gabajqt zB%s4@q3bd1i}Jii(Ny20Nb0D~<4fj4Vq6^dVzY^in#s=-sbmnob0&%MRrO%G4UM1N=`N{oYioHSLxXy2{dR^K$h_T0sR zp00w0m+}iE9;*bG#V;>^R)Ghl^1z7?;8dxyev9g3IQ6zKxZ9XrwB>s+!lob_C>^r@@yx3K1rN>9O{}cWD{+!n6KA$lpFGVJGILzLlihBn-8+y6k zj2?L;@vss|&8pYjM66Nva@3o{mjw1r_CfJWz73xB+0Ro zpazFICl*hojw@(Y__`1v)&A62NAt5p(Deu6eaA$VNu|H_-~qP%Q|uKti;43uZZnsAO8BB3?Vldep9nmlGJVElUi^=wDZZvkwH_~Wc$OuSZAhXCQv5e z8CPFMHO1N|9hh_Fl>Rnb<{C?gVeLlfi%`H1(`68ST{}O<%eqT6hFW<@_d8kmK$r2F zsM>``SItjEfHaZVS8d58avep}nD<>IKeJ19h&_3mts9y>taT>;yT!m3XSfW z{=doWtVMY~M}0zs#@Eji_lf4s@?G8C{ZS-Z>gw_7=?41xZvi+&beh1P-d;Hx?1uGrw=`*J$v`$u8C|^;yZbe*Q2R^ODF6R1W^VO1_jvtm!#E z`4+KH20M}4Yp>G;OOjle9XM!`ZKh%!R9MTAr~(t{7Z$V3s^7k^GPpXzLYf8E) zge}$!T<@K1-9={0+ z7PWSYFN64-(R>EMWi?=d25w2>2eJSvd~W#lvN`G_|#q&cYV&L;UC*i3KOZg{nMuTbmXODS^KZ(}tzDH~N!;Q~FEcz; zX+C`iOWi)-gVdDC%vM;7Y1DHN`?nGxk|BF&DSLgny(!M*bY(rLu!_rUyfMug&5D*o zOVVSyjBt+PuF%#{P>uH|l)o4n$zACjAHBg3$gnrGC}~k#StKD(5}eHKJhzwF{6up1 zknK;*?D;mDMUy-Z^Ki~>O5BQRgn0{&eI^P8y+mhCMGsW@E7~er>;~%WB0F(BpqiR)6-={@-Vkg^ykT>uMW^XV8Cj{HJ#_ z`>?@(213_=f?A{X|99w6&Ji9jsr&V40iPB&2bs5BXO5m#V2Sp-;-$y!r-GY(xl1K5 zX{!skt+_e#vD}&FwbUCT1x|^k^w38a{P*G|eML{IwW1>oS<-w4mbH`}22d%QJl!}D z(fVQNn|~tf*`kOUTVA6DZxJS%5^78-NfZiI@qc1=tBXkXT~S@QLYb_*9MD@jDb!~J z-~35RaLRD4#JBT4t?K12P|gs&OnfxBd%rZ@M1+(99;=(%U3s4N^Sl?}}CB%r4l-Y-rso7+#$u_etxFwKy)NQ9!~) zKw4W^P8zEmx`=-cZbf)sUtMN@jgmY3=S8aE#4X_{#W8%_d|VUFU_%5lTY7B*Heh-> zaUStbD{VLEP*3^rIv#GFPt*%V&#pbTa^9)&{^TQKvLOL{h>^F)pMkA>ECimB`!c8mN&;nlBl;d}N)+9Fh5PTVmsKJ&J?etu z@@s+t0951^Wir5rsaOHCMSci=u&H^5-Ni`Nr2hy-%k9WZ z1cJ(~&eMY!eh3^#bolYBhuapYSDMWM8qJFGv1%SzR$xUKl>DmB`d}W3x|BTEky`wE zV(z*|&ceg-B8QVC>VDeDP*j5>=4GLabXbnp^9Q2Zt(9?9HSpMGmuDHHHq)E>@;uAm zp7=YAN5Ho80zyD@A!De0V|tIeD=nWC+i!eib+P5rDRMbD=HO-o|8vP)&A)XKlr;VJa6z^o(xwmIK%61{VAa$ z`U>uOgW%My>||7VEdys%r)I77G|ewbRQD%klRy72^fep>Eo`siv`=e5uyD|5r?>&{lPvti5mhp_IF%P&b?Fohf2^dQ?y-}O{|&w8)wP!Uz5;N7%v z|9;W)qpQk!Ax*pGo9>cs4f4dXPm>g0g>zLgZSSWX&eH@KoFBHBeHN=MhVD_Go~CJLlkiVn_kbDNvs-G+^FNcJ~igm2G1MNy<58b3 ze_a-b4!sKG1({lTN6#NPxR$L<#0q4GlwO}yYqnOW z7@keABi?{KtiS9RYt7-#vqzD-mSyfH@Zg^QT4YSBb%*#o6zgygXXXseO=dTLW8|*rCDU;!oz+eu0q>XN$am;n8 zNY0p&gZaHqeKjG?2H9a6^lxR==ihoznSTQnWvxm!j(`3IH)KTZZflY7c z@uTeftL6Q+UP#Hv`(LH6BbV4;Pf)X1nJoX_atcJ6bZnIvjEukDH7wbAAEjkfJ4-%h z+36u#%)m;EIXzN}4WjnwHbNTRE<}Erc6`H~rn2IM11Q7(cwHJLNLly=ejb>7kbiex zJZC66b;n287uF4?w?h^z@+)TsoT2V7Xjd)B?DRpAoX0GHj7+crb7$73z}kXoT+ zC2U@Id04{h_ns=cKj*uV)GWIS_fpmzuXp|72tM>*p@)(zflpNOXH{KV#CbVb{r24m z@LgqMM-*e!A21Zm#xlxx%cKxTLx%OoYcAH`;7k|@6e*J8y}J>>RRp0!v0U(T6t_9X z8jcsb=zq-rp`H*kqK;x8Gc(00Jrw^G9QDYaS$m`A{NZ}PpWql;AA=_eI{{q^EOa3J z%RRwu13*vq+*0H$LTYsd8a#@4n1G7&PSUbDP>9KKUbMu|=K0!BVi;~E{77)1?Dg7v zi+CB;@mVcQB5sf)9+`|+@Y_l>sbjJEDHh@Nm(ox^T77uOG{prO6nFqB4!%U{7x zGYj1y-D3zfW5xXM%lYxnSUXM2>+F}PrOCyT0EWU4`R`D)1>Q7DDw!rr*cgzVavm4d z$ke8ce}f4hofUuHJXg40sWZ%%UcZ=DG+MmJngdUmDI6EVXoF`yX{@k3SNTi!f#q>8 zfkITb>M2^|^RE+c8%yb0TtK@?^&>+i^r6I0IDV7i`kgo47tI*5>$_-|es!BHmSKPX zrSTBP@CJc_DzYETT%%Pcu=KqLl~&pz{{{NncX(@rT5b0VaXXQ%x7FV{{SIj%i%0&A zLjKFwp4Z({^U{81oAHML=CU zncm5wzDXL%Q9h6UOxw*tN8{D!&|!7E@8X4r{v3lGNs@A{$kvAj)~!OX--C+29Qqj{ z17~k{%yj}&;PepTq%EAZKCC@7+d8{Ttb#f(UfDdhdwes#yxi1_zNYLTieG6U!1(I` z270A9mQTWMx+Jvtt+Rw2?hB#3uXh*IXZ@2z(QlYkP&$ArE5#AA;qiO~6?W=jguLq{ z+f}d(H8GD!=o{$;3!Clm*2l7I`%8~dy`%{b0=pQ>TM_D+$netlUYiX}cJotN#0z_w zW49Ea@gFb@HX-)p13M!yq3V+YWh2j({Eg%>qKFj#4!Xyk%UTZ&K4-=YGzmQ>(kT)3 zf?nKK!m1I{>f5fC!;apA>||s^$F&>98T@!&`gpcRPcby+87IvwR;oCy8{awtn_wJa3GS1ptoK&g#l6cVR`xi?{+xNacFDpS5}w< zz&CD7Ri3~@e~(X^Ez){(jYu$(#%a3xe42jnymuJk5xNrGyb@fSDeJv`Ema+*yejP2 z_Y@*_SNC#YULn5hI6yK4+wgpxxKIP~zMl(}F#z*MgNOYr^*&HMq)eas+$0JrT^b0R z+YMI=SouERRlVW17*2LQ^(DI`&mixG0sfkDKe@0O3VV(|mk`sj`#StyTvEWvOF_m^ z;Cj8=r&62z8G?}U3K98~$mZ!~Hq()nrPa8aFt{nx3$tXcUK;uyai?QL!eyib*B9ep z?_W}~IrHt*=(J z)_lM3^Ko>gb1!}gp&^jidWidN&^QEr>EeWHZE6%9*g}gA^3|%YRM1kIjIMP+f=H7^ zZ7`1%HLzi!@T1KfiF>)bVd=*r)li+m)T_QB!{O8o=(MI>+VBuHqN+({#!W?!UvM8C z5>y8{By@fI z&cX)lF^{sHSU>#FRy}ff^2vc_ekd*x3nm1G_jeJW+KBGY^?vyaG{EIMzkNgTuxKU# z1De(|vuf%#s;qISgRWDYal_X9SAwgi`IQC5SX5%Q_#5!TS9?s9RlW=?#%cN4Y<^^u zAXPRK#w_*km~o-}#7CtuSO|a-EtA+AUS7k>^k4TywCDk=)U}Ri%}4&tg8rn_iZK8O zbx?-EInn^~!^5 z)`m0bv@A}c@jIZ=r*T6JhfCWM3(qAH?Y^N=BCAYz|4t4H9Ekv%s zcF;~6t$BAv`#9+a#NGI1vZ$%mKZ}xCISrSB1@5?L<}jSv;wBcx*-$n@{sEVCP!G)` z0*p|{IO0vlCRMtxqnWeHJ72Dx*;1sz?@2zXnUmc#!&kF9`$d@=Gn=*OokLxqEvTcm zC=0`T#Y2F1HeCDaJ%1++UygzGxzG54{(;TxApmsPan+VHopW}L=9AQw@6>%u1)GjL z6P!e6&WcQadEMQDVF1lqkE~yIzL_?je*d1husonAY5m>5^O)w7Fb;S!V<=v<`nY#5 z*&5*R(n|Nd)5Ms?vL1*PqpkFOc>=+B@4@P3>xYsQ`rqKoUzrn4^z2U?#=Q;+l3kqQ z`f~U59m;Rp2&tcrEbDpck={_Ba$VM=CD0Ip=T4?mzOg|jk302MPcGZ&Wwlv_~tvOWA* z`v7uH5875J|16(M;RlY?v$eI=)YP=HDqez5)SOe%Q%jGXCg_)*>rM#xXC=)D+YW*V z|A2o7ql1Hk**Q5lI5-LNW}ajB@A7fq|E9yo#O$cH(b3UaYqL{Tzg}!!Ou5ihJVD2* z)Gdpj6uV7g#sV-?v$C7{nCQqcMoW&BF%Rq};Uj6t-yv;qNdM~|#a32U!DvL;>P$K} z%Ff*l=ogCed0Z?kM|%@Fb~Rc*I^*QLX;vzw^o5gK>+5g2f>3E`X#sJh^Y0Ud+()BT zxHve!;^T2iNssQ8q=3ws+4zJnJ*Nx$>;Dh;S}gCL(Iw*%WDsCt5IA^Gfn8Tu2X;Az z3T~u{ehg9Wa&TmEadC5V6Izt@Oz*(vM9bkPR;1I1pv$l36UaTEsepC{KPdiFh>ceb z`{!ibr#&-!x7E7;am-U+?X5GR;SX=c?48(brK>U#8@J%8YA^5P~m=n*= zkuV&_&$zevuILZ-6S4G=N=6QP%dm-?{)*shrs!RHDCk;$eb$>D=-?-+c#_y^sy<2E zJ$)ZPj@XrMbsgAn2?ZvxB}2uLsmAi!JQN2%LSNyF7egLte-(@8^LC|n;*LPH>Vf;O ziUxQ?1A}zkvgqjOwk`+xPoJPQN+>~0*sBc*$Tsl|33lC8?s=OR!cOYOXgQ4v!#Rtc(55EPx8cLUl2u{kvEz3GgT*f;?{w@ zq%8-b&*O1}T7lBO(|bULDPdq>AV)e11qJ0`Fz!GPXH;WeY<@y~F+-UFhf`SzBYOI~ zRt0hY&{(-ZmB*EMdn%$e14oOvV+7lB`~D6@n*9@6C5mbM zzW)X(?lVMZVa6yj2zUF8weCUen!H|5emmAexnd@tBNa=>{3Xj*p>q z4EcU$!M1%J8GV&I{IfVEJ~w^F*|`d9BM=)RooF1v%(P{a&6XHX`_V(BsT-nVVPWBW zJ);HX$`KI}O-xL%3~6d;kO{k;UC$Y2i21fbp1pUxth-WE5B#0mxsNR>7>3#!ea4IP z;`uraIGO=Af-wu)y)|Vnxzj4|HW=?CY znq9%Mlc)1*dnjpvL*BEy>7uLwMtr%fUkLJRM%|Kawevf+b4Ad~L23w<>s#6uCZG4r zGf!2~c5`2+@Mgch%v$`xcnCsxu~m6~DjWOS*0|cVvy)`#b6hu<$Zq%&a<@8+vwFl4 zB>%1re0N{lAz1Fqd)}8ozlNa}xL@`@NLvc2Nz?3~N{6pJX}>S>Ii#r6_yURY+nv=tdPK7kQ^t_UmYeMO z)Ku$+B}Yd`Xg$*PYHuQX>uBRm4YBfP7-;lT)0?mE9yjlK)?Tn|m+?~tPxsu#?IT9e z7joj&cNS|y-rNR9{_yyDXdIE^g_M{-R9YvtAGE|0CY#cB1i&B8DiuP+drdfjuRFVp z+gyoesTd2*2xanA?b-(W$7n1Rl5YWvv2^`9s~OgYWiF4az0%TB_V%Yq^BToJ0_PJl z6eFXfFWbMANzwa%bDB2qv2+#C&D)@JR$r!Q&gs*?~ejC4ybeIhKv)o)fE)4`Zy)MAoKRTiDZGlXqh_F|z^ zKnH}P6Si@`oe~p#X?i@5*8ycLoP8~bA4_E#=@ojXY7w8Ny|mKif~2Xh-JWVS3eu!? za)up(7%%fJ)Y=`8h-#V6Dl51Aq&guY1OUzS8#FXGAGZ$|OWb3k=f5t6_8{z0`WKTF zls}}9MP|NJD-e^vi(%x!w=351Rr}kr+g{FeN2!g4osGn5!!S6RcFyCuQ$BozvbDIS z!M+l|rYE>&+aF3^$2nqlI`ZdHY^bZSLsFZ z&fsmtajrXTb&Zak@Wzu43tbIPhunZ38Qw8&)r~3|B`ZFhH~7pyDcjzMrPP$L5{PPC zed!7nZZ$N%^iXZ^Wo2U{7j)R}r||ugoGb{H<&b%Wa7=orG2v=4J1g7augzZf3N8lm z^pr)boGx8#kAqkImo+5-@I2nTr-12Lyrn}2+m6kU8w7HVo+iR#xxwIG;5S@uzrhS$ z_kztzk7ku5{4t*L5R7hagqN7;$qP3WqH=isP|^P4F_A3=HQ+g9jU1l z+-NzP^*%{^)rL_FW`x02`^<-qt_U|Nl-H>IzZrnS1cghutWO6uXMLeb?ZOy<7zM*~ z|MNiK@GGsdFDTeiOxYkWL5Aq%H>Dj`KB6!-mKrQ#>YOu$#Eii!b$jd}H0@Pi~_fKLXCs6a*Q z&7$L&2*iCL2w&&V@iveW}V9bc(F?gr!Uo?faDTaG%!DFk&?R?oe%15!|qzF2g5&0DgRV7%-&l2+KqB z+kcXm8WYmC^b1*Fj+344M5}``&+WJRL|*Q;O#34D*R58lS03=XSs373>Fk&m6Gw_XzD9Su%;A)6p znWwEROmMT((;%~9CN}gV?^}G}jDSC%GUVg%&+iu%3Tt2SW)E2n+E2gyl1=yUT>h;U zEl82ET79hKI#+t%wUfQ>RU`iKE|{KPHR%5Z06PxP=gWwadEL?5GFZEqOR#PdqRE%9G_5Gc z<}Pr15PsOrkjnyuN}&ygXIF-zLH{cS&`R>tA!lmD<0{kJxC zJ4F^S>K$zU#jNYq{1*=I^ShpdLblMRGO96Ed-cjXLZ3e$k%8jzbU?-1r=}U=G+F~c zn=scOV!SL-J-Vbhyik4Ki|`LdCsq!tW!Bp+Ge~et##Jzj89=ZI{ zxBP?*lzM|q4z4r?{nFE_)xZF3mKYfW*HYkB`j4=zsz^hwAz+Vf@lbhyTDW!C9+3kGMMWl6jg5^0qN1xMPwQsYTB=Qk-+sGJxx8e%^Y7(5OY22wxcP96D)T*bNzC+4 zWuOxqcv3z74*eN_{#vPROO{k`+8>R_tl2oy%&On)w9z$W_$f#w7!w8fhzT!=hoTX| zJ{yQF@y*M>zeohKT+&CR?R?EBCo)u0vXxCOtA@og^o51>6pL*C9*qSAO;SdNhe^eJ zS{xVrmsauMji(DgGi#P|q>hYcOjTGFdK0n&P)tOd4%Ux9BYo3{GF)oRigg!QO?8#Jgg z(YZdyqfYiU8f0BHkAS8O(G;$}5`{2u2sHGbPWGIu=7l4xgfrZoVhq~lni^k0Xea!7 zG#Wx`mQf3}Y(-<9hbRcQ$f9W#86wnYhKHZTyzJPZ=wg0r;@ZQn`Rujxm^gCt3erCL z?q0IbmQ&j=8{)_SO{DJPfne}KOG-<3N*lkc#BdaCNcNP)-{*IWE!UWUN)U~TeDNsg zM)`u_hx5+$xiMiwlFh?&9LRepRiG3daC7tCFDhtL_C4HX5_!EPOV|M&!}(G8KG|>f zgo(!Me2Y6CX7b*e%>ts-N_K7C7wd_pf>Dp$7+V#?|M6bp_ zKv|!)3pPp0(ZE*A4}vUlviJGUc85?e@78RU1p6V4od!)=oH`Cu9{D@^RQ}2CFE}iKUr$g z%OZ#Ld%gY$1o@cO>AO{|7g4 z>&DY==JtXQQ`4c40>Lz-*Rv0Kw@aCyVEK3cAKo^xe(fKwYp5oi0ygH##XYIkZwXwb z^Ay$Z5aDe3_m2p$_0sF=B1}e?aD61mw1R(NB|!MzT%`?#Cuo61MbWl)zpCvT&RxGk zyez62FDnkOJiN1{@GB}|I;3i*?>lgkef5)`Zgm#MUUTOT$@uzFQ{}Bz#n6B;FGm_~ z?way)HU@^mCRbsvDFFi&)8e8N3bvU;TYzJ$|J52iZND4bf4g#DRFwbVCZXsh);{`t zb2Q9ZS60?*a(*9Sy2O(z86I-ob#Bs0kW_WD80*@x?b7^udaKUx5^dI?@ z^Zhk(N(h6ENzD-X$g5U39$%)7`f?!&)Y3+TMnLGzaJ`{Cj$N}LZ-=vgLfNK57?+uw z`X6m~rjjo5l@BPu4PTIeydG#{2*d9E0inZC0Hf7P(c8oN^w2Ln>Yts~`E3Wg5E0-x zW`o~@<$LBYbV2sd!yv1G)Cw3TXFqwe@3e9y<~7rX^z3#mPBu3X)SpSEGqO4fcTtyM zL(!x!_ zDF6fFa$AF)K+R+%5%=KG5E;6Rjm=THK6o@;1pIXXyGVVox|9-0AJdA0gnGW$ z1RXdrLr23Qa4$RW zB}P*E2fx!@@COmk_MJ|5W_*Wa(Q7ZVN4&m2svZl2->I>HJXnm)5(5f~T17rVii(Fa z7Yoh(6wj$FOR3e?ZhsL*m5Mo`Pk>)Y0G-erGHgfAmWi@g)?$st*wg)`cS&*0FyorY z@~W!LpQ3-D_vhrsa?;!uDNJTsRy)bR@(I)ihneGlDy;?$cne$!r3;7HzCMmBpe8v2 zFF&AM1fav9*>{Umr>_euPId0IZ(7x%nVQnJR5w>vVTyEwrRGL9p4%%`^6r37Z?FdS zTLqCfTrUeeJqFUtv22*TteA7=$E4H*0`6KZS))Qy;EqpEm$wNO)*3=2H{~4mCuRiQ z%4OWoc}y5aY@tVa8PC?bsIXI5d5v zhI0O)ST?BbK7YXmYOj%zk*VYM&NjNCC^1?$18z7}MUed02c&|^g{MU$@geu+my<>? zFDIa{lvoiRsVva+0V%$ig1qT&%W&@Re6d3}H1{R2FI`~z9l1$d7FYg63dl+YZ4?#I zq_?j)+0v8&My*aeMe)`A=9rKl-wJ>BU(Cb zo!WB7XWQwgV(2oVqLs=~dEOA=kAq023CH{sY(53Qh<9x-K>9OtdY*GA#_O`9@{Mxf zHR<#TcNyJm&0}P!#>U`YoD{v!ew?Ug@weNpk=(KknuGE%K@RHFs^);f-*vos78sAT zN}FF_^i?P*f~%~n86WR6{^+r#aW@ctWE=O+LaWbv;1vA6O__o6h@f^SM&^P>A-F7(aw6p66kGf?&D*#2t^XVv}AVo7xL3TW+hC#g$y zuaaD5TAMnkP1TNavD7}a24Bv|xN0oTz&+=(zKV|o6@*8cNxeQA(VG=^z_IesUuo2{ z_N?HyE@;>L%n0HGerF$X4l}buIZ+ETgq`j}G#+`M`xJ;*ggQp>`@DbYSs=TC7fdvY zgs6H=AwDxN-tE*o?Mx|8A6+Dl3#r$bO4GyqmVpUO0TE;U;V6X%#o zm3+Kr)A0svRg9tGa2U1GdHeKlWtl?8GAIPTuV3s8Ww`GqMH>XKnEL zIFDN|ai5HU33T8%b}A%o3C*{;lBtDR!uj+Gy4_6yaQDUr3MFvHH*Hb{O-Wwv&bI^w z1xHIjglNIT!wO0Alh2R0GE!1+5D^jK;oY>On33x+a(Wj~sj(VvevQr5ai;uVRWdUPK7sY~9}_#Zi>oC% z9$6@fqG%J_3Tv;w9gcc^D1gkw5-H{N?sfG?aq4wr*p0Fcu&DQ&&$GCcEWk$gU~?K! zM^O2%&(zK{eb2-B4;P@E!syROtVNL0&O*kKrnR@3qRItNl`sH2sVCihYH49KaB!%; zydPx=hWJn6!->ySDHE1+67?)aZG0gA<`uw&4VqnG6UBIF)4HorcXI^M-}YQnFlrRStanYMxj06AL8ec4(npK{0k3o93IGzlF!g6#uawAGR;CB?)W0#2KQON74S_rA?#~X zWfzgmpId^V6p`Hh5|=0z7|7*xz1X58;?Lp$tRxn|b|87{qfv<-7@SbVXZ4flU| zvIrI{NW9aROEwpR0aC@ysBh%|t2Fd=p=7rL#Y8dY`|cOJ1d&zu6=q=l@M2JQZ=Mpl z#KO<=Nmqi*T*y8-w6{_ zx`nQK`SHf~gW45sHI1^H%Ujm0DWu3MBFpNGGBu%T;Bp8gg|61QAky_aY6N)w$_HP0Bjd`q5` zkyL*6FO6qVsGBy>>5M7S4Eg*U^`|Kj#7`H97$lx~3(WG`CflWEEEAVD)Mh=$^i7NV z?fE(+WNQ}#`gWU>DM^3+4^v+O)>gE1d$0n*$PhTs{SqV@Bg-aht4ox^B94K6F zUQA@qywxh6E%)F5hZ|5R-SD8 zL6qE@4V_a&3Db{QX`e!($x7m$C|4R>FMM>y6O2Eds~TtpFBwOREU)&3Oj_`^0sLe$ zu#_W392X9! zp4z^_WGsqiD@kRfrLn)Kf8FMNzjx)Olbn3fF#;JJ>5)*YkW9Kjq?gm~Y4u=kgfI2+ z1~M#W=FJh_>uf!rTx%yDS3&x?ayd21T036ipBTCM?&D3Ix$nlLXu}{rn zc>bH6JVLb*lC7&WHUodr)W^KB&R5i}3yt)q=ECN2DW6of4_DlUIZqSVab;_TOKD4L zuR@~Fop!2AH0YMz1YU+?*FB~z*{GY77?iLDeTP;9lnc&~#FJy9U#6yE5bGmP*3txp z92?Z`d*#l)(U|Z`%sKGiX0O;gQU92KJMJu@+6t>TkzE5WyhMurE~R3U00(ayaITJk za)C+xy@O>v6dFo<#XU3-`IVKFliL^h723%Bc$1kHHwlMli~by()EBa~gCkAf&j&(g z0}o?P!q*|_2ut2S2hDLlNIK`o7{KL9*q85tT3}02Z9T%tWX4g=Yu$%ZSZ`K*_&Prl z^la_yP?D27MG;+HhM@ua8~3l^JZ>pfb=UKX{-^gg2MMW5WTRjl4q_ zvD(DFtk;MrjB)odMzrts?)t&L152OIvf;Lw#^Uj@hz%JbvvBGLk-K*$qmFHx_i^RVKU+ErxZ!PtB zp_V4CR(#=ge*jYOKgSNMNyBf5SXrx+-~2Ao3QB4LoR`ViJ88FwmqEwuog({o(i_7 zs2nGKymW8UuCS3-*=jzmv9K?5P*8y&;OFAoHSN_=AB9|NiyKu}KAh2P<#oK&xa^#L z(z1bR%k(%oOqQg0V8H+KHkkZ9Le+^x)CZcMwX9V1>NYqfyD}if+7fkh6+t3@tvR0r)!@ugx_f&F$|mg=rd&v4NFwKEp7Q^T*;NoY$s6RNdhx&b(ag zOrY{$dSb7_AeHT0=nJNZiOELZdK;|3n-7J{olnx~^Wft!B0=Y+WxNSBWtO0CG47WK z7lsdg4&|8e4Ppqo_QcBy9M^R|RZPvl$9kR}6~l78_>;fT^%t;TA|E?nZ$9e`7pcBU zso%rq9+gx)y&YT&LZv}Z%E7DuKqFp4Vp<@nHI%ejCOCJrQGE7=To&$oi zP&G|Jbr#$(|7(;vylrnDf+)@4^cg0>z8+WsTSoh7-MR>0nTGn0tvBq!KXQ_T=?2IR z&9K}c&{AfBS^^B@r_4HZCa0Jq0tpdOu2>P0Su0VAqt&Aa3&v7Ny+%W`N%G$^uSbF~ zV)k~df2Bvose48tzfk7qMLe8;1lT!dz4&U=eMP1%SjBZzIF~9J(yPlC-{DRY0`I~p z4*F5Pio>MUvo85_lRLOhWOgp&Yk5}O%TLoUzpFbFINQwKuRPorLC{3bru`ZcEf>)! z+qa#Ggq%!TYpZL{ZgT3Bt{d=xcpMhO`pB6rG7yvf;p@+$`y2eS)JV4wl8lvwh&+Vv zB$8n|_qwM}F4n6yM97`*I2^BEtGPHI7#8KG7K;ro`Th`5c`3M!>2`Mc9Ksmf>M%EM zki>61(Uw{s%SJ`@Nr6${9p1IYys4tBD2rcbBFFvaxNOWcCnqOFVcF;9>0)ODC(^sj zTaMg>Jt1XZmF6p)r|K%p<@#e|o#q+AiWbOhhD!Qf?=8df{zpY6-P}JP=k*GE35a`c)dU082v?#c7W5JnG=kD_wkI%wlz+CiSoJ#mva+)F zD;%!(Ar6ZrX8H08SRWX@LD>9x^Wgz++lR1yUofvt2LbM zhWGJWH0we0QH;qhaB-l*Zd`Xni$kkVN=4Fo>`9$(7@N{AeyYvXr4xbX$CrqWSt}W@ z!mnH7%7g_f!!k(jM%hPMtTtEqboVCKgT4~NR?;n!y|oTMO;tYQZ!WOMOT?#i=T(qF z8!_3OI&QOCZf@A~HZxXD*x(__CP)h%-aosYkp6Z^Hxa7TGHsBaaNm%YWncqJA_meNk<{<{ zGhv{CBFcRawR%QnRfj6wF97VK)QlerOTgOUIUPNqn3IGXW ziVPJLJ5dyJPfgvXM&tSF)~Rf#=Z1xujs1?mm$S;oR5Yg0Oz}QCSl>w0F2n)@VH?zR39I91y#vNzB1oRj(Y3~#8cNH2m;nHR^KdPAwhT0bl!Ak6 zeZi~CS4y5*5A%5VuQaAO9a$Z=2Ln8P${pxBpHkgJjUeo}w~stGO&JyvMoB+SpnL4c z&RjSWK-=*8UU7dQb#OFIDB~&p)0drFaB!2R9^l`zbGA<*i$lO6Tk=MeqtPj~S1K}6n%iSij=_Ecs*THUh|i5*eG};V&lENs%6SE zIs^5@kHaBK_|zq7Z?Ffdc?C$}^mD7_Nj&o-CE;QPb(GpJduD;diiK5o8Sh z6oTG=P0JC6FSg6KOPBkY`%{!Z&z-4m z;%uFrm8q}_7$f00Jg(^gZuiTgLkZ-YED2Fjs`zqQsVve?Gpp z22@xBqO2o3?nw3e{@$M1lZ8 zAW|}j79Aip7Ra&G=)^3^1VSa!4*$b&HFt&n282AH20^|=c6aae^z~eg31k-BI-@}% zWGS0f-l7#7V|hB9tBD!7id!5a5Q2mxA$mSKcH6p`LK8pJ)0cwKNspJo54UFquDmnV zDU6IQomn7|#m(`Om8GR3jS`A6>N@M+X8Tvhs=H9Ffg})%g(t+uPLyfXi^e$G*->A` ztzkC1E=u*mhuexEM^khbWmdN)TtamAAcREc-O=ntLb;OHNJtkFb^N65I~Sp?np12L zuCJLHhi)4XLuR3cFi`Cd*3Oq#dLd{39|6St?b-xXQQ%Ba|4{$_z0VXN@J7CPa%u`Y zHAioCP~iWb$i|Bm&!0s=*~m}+K{o(dwlJHZD-gJ9ZR zE$IN3h0*wL;o&HNp^?#=*!REJDTR}bjSUc$lA=!z`tKW=?e5LZ&+F$-2G!Isce{^S zK>lCJ{F`uR8?9wB1lL?Y{ioe|Y5Wnnl_vT7e_m%ZwtmEZT2cV<&0;qV1lBxz6)T%< zmY+A3GS&-jP?m|F66JajdRRivJT4O`)o7xg3N+kNkjO z`R-Dfn$kT#tSQeEqi;<8+hY4~3)qoayi~;O0t-lfw^hKX-TV$8{-6I+NadO|dAWQY zEY!{$9bCKdI+FC8W#5&Om%gOgS>fXmj=)Gw;oVE4w-55TF5Cxi|1!&XTu5rZ3&D&Xb^Sx zGOWE^MoW3l)){n!GM;C1jeUOgagDE-+1Xy!;*J~SdbS?9JZt`vIAS#UYDEsQR<6j8 z@81CuNYg@Z)cb&k4SRw>6UM(@SyEts;-yGONm&>jr&c4)!moK8s)LIPkVNa;xA;Ze zPc|-^wFy2*K-rhHYoy7yj$M`&}n}KqzS5e9pg)~=gCl_dkW#*2{6UB0YnQq7@ z`T}5ajiRajqM{;*a%ZN`GcEv8AVMSJp3N0Ot5OZyadFUf)u202lJ>o)s&V%Fvep|- z3XeuaKtMnj4Pj=TCq@IZ0)T{*LDx?7(zVIr3B6vgdL##hp|?ZpL$g2q$rPHDqN1Xx zsHmVIEC7)YC1AG&Dy05RNIDNtz8k9$VHMm?Xn;<$rb)3bo!KMdLSNa=;b7dTm8c=P z^i{M~;QNVIRhHshYNe-gm$JswS@IrGR(C%~ry`#FO!ZJe4_4*~jsz4*Y5j#n`nY(4 z?*`&6n~JC1uayGb)Opxg*95JA>(V)i-8@oSAGuP3bDA;QDpdk(?5SLlNXQfuPQZZy zAkT;?Dq?BV>?#d|x)pFOEDq|d7POmP{{VFXLKW*9q^*zk5^ip+)M)1#k`|Pd)ay#t zlKnM%cL_tZ${HV{-<1zRy4@j~w6FkjHbj<(>gzkye}iKCu{IOtSE?}1OMfK+P>Ot{ z7@lZOREp2%9lLcnCGy$1j*{8tMCWYGZ}gGxX5

        rRhK`l!4p1?~JCX!Jf0=n?pV9 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�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 a$9Q6I(-tdjrqR=NV-~Jzi7cVIQ literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/data-structures.html b/clones/lispcookbook.github.io/cl-cookbook/data-structures.html new file mode 100644 index 00000000..dff56777 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/data-structures.html @@ -0,0 +1,1953 @@ + + + + + Data structures + + + + + + + + + + + + + + +

        The Common Lisp Cookbook – Data structures

        +
        + + + + +
        +
        + +
        +
        + +
        +
        Table of Contents
        +
          +
          +
          + +
          +

          The Common Lisp Cookbook – Data structures

          + + +

          + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

          +

          + 📕 Get the EPUB and PDF +

          + + +
          We hope to give here a clear reference of the common data +structures. To really learn the language, you should take the time to +read other resources. The following resources, which we relied upon, +also have many more details:

          + + + +

          Don’t miss the appendix and when you need more data structures, have a +look at the +awesome-cl +list and Quickdocs.

          + +

          Lists

          + +

          Building lists. Cons cells, lists.

          + +

          A list is also a sequence, so we can use the functions shown below.

          + +

          The list basic element is the cons cell. We build lists by assembling +cons cells.

          + +
          (cons 1 2)
          +;; => (1 . 2) ;; representation with a point, a dotted pair.
          +
          + +

          It looks like this:

          + +
          [o|o]--- 2
          + |
          + 1
          +
          + +

          If the cdr of the first cell is another cons cell, and if the cdr of +this last one is nil, we build a list:

          + +
          (cons 1 (cons 2 nil))
          +;; => (1 2)
          +
          + +

          It looks like this:

          + +
          [o|o]---[o|/]
          + |       |
          + 1       2
          +
          +

          (ascii art by draw-cons-tree).

          + +

          See that the representation is not a dotted pair ? The Lisp printer +understands the convention.

          + +

          Finally we can simply build a literal list with list:

          + +
          (list 1 2)
          +;; => (1 2)
          +
          + +

          or by calling quote:

          + +
          '(1 2)
          +;; => (1 2)
          +
          + +

          which is shorthand notation for the function call (quote (1 2)).

          + +

          Circular lists

          + +

          A cons cell car or cdr can refer to other objects, including itself or +other cells in the same list. They can therefore be used to define +self-referential structures such as circular lists.

          + +

          Before working with circular lists, tell the printer to recognise them +and not try to print the whole list by setting +*print-circle* +to T:

          + +
          (setf *print-circle* t)
          +
          + +

          A function which modifies a list, so that the last cdr points to the +start of the list is:

          + +
          (defun circular! (items)
          +  "Modifies the last cdr of list ITEMS, returning a circular list"
          +  (setf (cdr (last items)) items))
          +
          +(circular! (list 1 2 3))
          +;; => #1=(1 2 3 . #1#)
          +
          +(fifth (circular! (list 1 2 3)))
          +;; => 2
          +
          + +

          The list-length +function recognises circular lists, returning nil.

          + +

          The reader can also create circular lists, using +Sharpsign Equal-Sign +notation. An object (like a list) can be prefixed with #n= where n +is an unsigned decimal integer (one or more digits). The +label #n# can be used to refer to the object later in the +expression:

          + +
          '#42=(1 2 3 . #42#)
          +;; => #1=(1 2 3 . #1#)
          +
          + +

          Note that the label given to the reader (n=42) is discarded after +reading, and the printer defines a new label (n=1).

          + +

          Further reading

          + + + +

          car/cdr or first/rest (and second… to tenth)

          + +
          (car (cons 1 2)) ;; => 1
          +(cdr (cons 1 2)) ;; => 2
          +(first (cons 1 2)) ;; => 1
          +(first '(1 2 3)) ;; => 1
          +(rest '(1 2 3)) ;; => (2 3)
          +
          + +

          We can assign any new value with setf.

          + +

          last, butlast, nbutlast (&optional n)

          + +

          return the last cons cell in a list (or the nth last cons cells).

          + +
          (last '(1 2 3))
          +;; => (3)
          +(car (last '(1 2 3)) ) ;; or (first (last …))
          +;; => 3
          +(butlast '(1 2 3))
          +;; => (1 2)
          +
          + +

          In Alexandria, lastcar is equivalent of (first (last …)):

          + +
          (alexandria:lastcar '(1 2 3))
          +;; => 3
          +
          + +

          reverse, nreverse

          + +

          reverse and nreverse return a new sequence.

          + +

          nreverse is destructive. The N stands for non-consing, meaning +it doesn’t need to allocate any new cons cells. It might (but in +practice, does) reuse and modify the original sequence:

          + +
          (defparameter mylist '(1 2 3))
          +;; => (1 2 3)
          +(reverse mylist)
          +;; => (3 2 1)
          +mylist
          +;; => (1 2 3)
          +(nreverse mylist)
          +;; => (3 2 1)
          +mylist
          +;; => (1) in SBCL but implementation dependent.
          +
          + +

          append

          + +

          append takes any number of list arguments and returns a new list +containing the elements of all its arguments:

          + +
          (append (list 1 2) (list 3 4))
          +;; => (1 2 3 4)
          +
          + +

          The new list shares some cons cells with the (3 4):

          + +

          http://gigamonkeys.com/book/figures/after-append.png

          + +

          nconc is the recycling equivalent.

          + +

          push (item, place)

          + +

          push prepends item to the list that is stored in place, stores +the resulting list in place, and returns the list.

          + +
          (defparameter mylist '(1 2 3))
          +(push 0 mylist)
          +;; => (0 1 2 3)
          +
          + +
          (defparameter x ’(a (b c) d))
          +;; => (A (B C) D)
          +(push 5 (cadr x))
          +;; => (5 B C)
          +x
          +;; => (A (5 B C) D)
          +
          + +

          push is equivalent to (setf place (cons item place )) except that +the subforms of place are evaluated only once, and item is evaluated +before place.

          + +

          There is no built-in function to add to the end of a list. It is a +more costly operation (have to traverse the whole list). So if you +need to do this: either consider using another data structure, either +just reverse your list when needed.

          + +

          pop

          + +

          a destructive operation.

          + +

          nthcdr (index, list)

          + +

          Use this if first, second and the rest up to tenth are not +enough.

          + +

          car/cdr and composites (cadr, caadr…) - accessing lists inside lists

          + +

          They make sense when applied to lists containing other lists.

          + +
          (caar (list 1 2 3))                  ==> error
          +(caar (list (list 1 2) 3))           ==> 1
          +(cadr (list (list 1 2) (list 3 4)))  ==> (3 4)
          +(caadr (list (list 1 2) (list 3 4))) ==> 3
          +
          + +

          destructuring-bind (parameter*, list)

          + +

          It binds the parameter values to the list elements. We can destructure +trees, plists and even provide defaults.

          + +

          Simple matching:

          + +
          (destructuring-bind (x y z) (list 1 2 3)
          +  (list :x x :y y :z z))
          +;; => (:X 1 :Y 2 :Z 3)
          +
          + +

          Matching inside sublists:

          + +
          (destructuring-bind (x (y1 y2) z) (list 1 (list 2 20) 3)
          +  (list :x x :y1 y1 :y2 y2 :z z))
          +;; => (:X 1 :Y1 2 :Y2 20 :Z 3)
          +
          + +

          The parameter list can use the usual &optional, &rest and &key +parameters.

          + +
          (destructuring-bind (x (y1 &optional y2) z) (list 1 (list 2) 3)
          +  (list :x x :y1 y1 :y2 y2 :z z))
          +;; => (:X 1 :Y1 2 :Y2 NIL :Z 3)
          +
          + +
          (destructuring-bind (&key x y z) (list :z 1 :y 2 :x 3)
          +  (list :x x :y y :z z))
          +;; => (:X 3 :Y 2 :Z 1)
          +
          + +

          The &whole parameter is bound to the whole list. It must be the +first one and others can follow.

          + +
          (destructuring-bind (&whole whole-list &key x y z) (list :z 1 :y 2 :x 3)
          +  (list :x x :y y :z z :whole whole-list))
          +;; => (:X 3 :Y 2 :Z 1 :WHOLE-LIST (:Z 1 :Y 2 :X 3))
          +
          + +

          Destructuring a plist, giving defaults:

          + +

          (example from Common Lisp Recipes, by E. Weitz, Apress, 2016)

          + +
          (destructuring-bind (&key a (b :not-found) c
          +                     &allow-other-keys)
          +    ’(:c 23 :d "D" :a #\A :foo :whatever)
          +  (list a b c))
          +;; => (#\A :NOT-FOUND 23)
          +
          + +

          If this gives you the will to do pattern matching, see +pattern matching.

          + +

          Predicates: null, listp

          + +

          null is equivalent to not, but considered better style.

          + +

          listp tests whether an object is a cons cell or nil.

          + +

          and sequences’ predicates.

          + +

          ldiff, tailp, list*, make-list, fill, revappend, nreconc, consp, atom

          + +
          (make-list 3 :initial-element "ta")
          +;; => ("ta" "ta" "ta")
          +
          + +
          (make-list 3)
          +;; => (NIL NIL NIL)
          +(fill * "hello")
          +;; => ("hello" "hello" "hello")
          +
          + +

          member (elt, list)

          + +

          Returns the tail of list beginning with the first element satisfying eqlity.

          + +

          Accepts :test, :test-not, :key (functions or symbols).

          + +
          (member 2 '(1 2 3))
          +;; (2 3)
          +
          + +

          Replacing objects in a tree: subst, sublis

          + +

          subst and +subst-if search and replace occurences of an element +or subexpression in a tree (when it satisfies the optional test):

          + +
          (subst 'one 1 '(1 2 3))
          +;; => (ONE 2 3)
          +
          +(subst  '(1 . one) '(1 . 1) '((1 . 1) (2 . 2) (3 . 3)) :test #'equal)
          +;; ((1 . ONE) (2 . 2) (3 . 3))
          +
          + +

          sublis +allows to replace many objects at once. It substitutes the objects +given in alist and found in tree with their new values given in +the alist:

          + +
          (sublis '((x . 10) (y . 20))
          +        '(* x (+ x y) (* y y)))
          +;; (* 10 (+ 10 20) (* 20 20))
          +
          + +

          sublis accepts the :test and :key arguments. :test is a +function that takes two arguments, the key and the subtree.

          + +
          (sublis '((t . "foo"))
          +        '("one" 2 ("three" (4 5)))
          +        :key #'stringp)
          +;; ("foo" 2 ("foo" (4 5)))
          +
          + +

          Sequences

          + +

          lists and vectors (and thus strings) are sequences.

          + +

          Note: see also the strings page.

          + +

          Many of the sequence functions take keyword arguments. All keyword +arguments are optional and, if specified, may appear in any order.

          + +

          Pay attention to the :test argument. It defaults to eql (for +strings, use :equal).

          + +

          The :key argument should be passed either nil, or a function of one +argument. This key function is used as a filter through which the +elements of the sequence are seen. For instance, this:

          + +
          (find x y :key 'car)
          +
          + +

          is similar to (assoc* x y): It searches for an element of the list +whose car equals x, rather than for an element which equals x +itself. If :key is omitted or nil, the filter is effectively the +identity function.

          + +

          Example with an alist (see definition below):

          + +
          (defparameter my-alist (list (cons 'foo "foo")
          +                             (cons 'bar "bar")))
          +;; => ((FOO . "foo") (BAR . "bar"))
          +(find 'bar my-alist)
          +;; => NIL
          +(find 'bar my-alist :key 'car)
          +;; => (BAR . "bar")
          +
          + +

          For more, use a lambda that takes one parameter.

          + +
          (find 'bar my-alist :key (lambda (it) (car it)))
          +
          + +
          (find 'bar my-alist :key ^(car %))
          +(find 'bar my-alist :key (lm (it) (car it)))
          +
          + +

          Predicates: every, some,…

          + +

          every, notevery (test, sequence): return nil or t, respectively, as +soon as one test on any set of the corresponding elements of sequences +returns nil.

          + +
          (defparameter foo '(1 2 3))
          +(every #'evenp foo)
          +;; => NIL
          +(some #'evenp foo)
          +;; => T
          +
          + +

          with a list of strings:

          + +
          (defparameter str '("foo" "bar" "team"))
          +(every #'stringp str)
          +;; => T
          +(some #'(lambda (it) (= 3 (length it))) str)
          +;; => T
          +
          + +

          some, notany (test, sequence): return either the value of the test, or nil.

          + +

          Functions

          + +

          See also sequence functions defined in +Alexandria: +starts-with, ends-with, ends-with-subseq, length=, emptyp,…

          + +

          length (sequence)

          + +

          elt (sequence, index) - find by index

          + +

          beware, here the sequence comes first.

          + +

          count (foo sequence)

          + +

          Return the number of elements in sequence that match foo.

          + +

          Additional paramaters: :from-end, :start, :end.

          + +

          See also count-if, count-not (test-function sequence).

          + +

          subseq (sequence start, [end])

          + +
          (subseq (list 1 2 3) 0)
          +;; (1 2 3)
          +(subseq (list 1 2 3) 1 2)
          +;; (2)
          +
          + +

          However, watch out if the end is larger than the list:

          + +
          (subseq (list 1 2 3) 0 99)
          +;; => Error: the bounding indices 0 and 99 are bad for a sequence of length 3.
          +
          + +

          To this end, use alexandria-2:subseq*:

          + +
          (alexandria-2:subseq* (list 1 2 3) 0 99)
          +;; (1 2 3)
          +
          + +

          subseq is “setfâ€able, but only works if the new sequence has the same +length of the one to replace.

          + +

          sort, stable-sort (sequence, test [, key function])

          + +

          These sort functions are destructive, so one may prefer to copy the sequence with copy-seq before sorting:

          + +
          (sort (copy-seq seq) :test #'string<)
          +
          + +

          Unlike sort, stable-sort guarantees to keep the order of the argument. +In theory, the result of this:

          + +
          (sort '((1 :a) (1 :b)) #'< :key #'first)
          +
          + +

          could be either ((1 :A) (1 :B)), either ((1 :B) (1 :A)). On my tests, the order is preserved, but the standard does not guarantee it.

          + +

          find, position (foo, sequence) - get index

          + +

          also find-if, find-if-not, position-if, position-if-not (test +sequence). See :key and :test parameters.

          + +
          (find 20 '(10 20 30))
          +;; 20
          +(position 20 '(10 20 30))
          +;; 1
          +
          + +

          search and mismatch (sequence-a, sequence-b)

          + +

          search searches in sequence-b for a subsequence that matches sequence-a. It returns the +position in sequence-b, or NIL. It has the from-end, end1, end2 and the usual test and key +parameters.

          + +
          (search '(20 30) '(10 20 30 40))
          +;; 1
          +(search '("b" "c") '("a" "b" "c"))
          +;; NIL
          +(search '("b" "c") '("a" "b" "c") :test #'equal)
          +;; 1
          +(search "bc" "abc")
          +;; 1
          +
          + +

          mismatch returns the position where the two sequences start to differ:

          + +
          (mismatch '(10 20 99) '(10 20 30))
          +;; 2
          +(mismatch "hellolisper" "helloworld")
          +;; 5
          +(mismatch "same" "same")
          +;; NIL
          +(mismatch "foo" "bar")
          +;; 0
          +
          + +

          substitute, nsubstitute[if,if-not]

          + +

          Return a sequence of the same kind as sequence with the same elements, +except that all elements equal to old are replaced with new.

          + +
          (substitute #\o #\x "hellx") ;; => "hello"
          +(substitute :a :x '(:a :x :x)) ;; => (:A :A :A)
          +(substitute "a" "x" '("a" "x" "x") :test #'string=) ;; => ("a" "a" "a")
          +
          + +

          sort, stable-sort, merge

          + +

          (see above)

          + +

          replace (sequence-a, sequence-b, &key start1, end1)

          + +

          Destructively replace elements of sequence-a with elements of +sequence-b.

          + +

          The full signature is:

          + +
          (replace sequence1 sequence2 &rest args &key (start1 0) (end1 nil) (start2 0)
          + (end2 nil))
          +
          + +

          Elements are copied to the subseqeuence bounded by START1 and END1, +from the subsequence bounded by START2 and END2. If these subsequences +are not of the same length, then the shorter length determines how +many elements are copied.

          + +
          (replace "xxx" "foo")
          +"foo"
          +
          +(replace "xxx" "foo" :start1 1)
          +"xfo"
          +
          +(replace "xxx" "foo" :start1 1 :start2 1)
          +"xoo"
          +
          +(replace "xxx" "foo" :start1 1 :start2 1 :end2 2)
          +"xox"
          +
          + +

          remove, delete (foo sequence)

          + +

          Make a copy of sequence without elements matching foo. Has +:start/end, :key and :count parameters.

          + +

          delete is the recycling version of remove.

          + +
          (remove "foo" '("foo" "bar" "foo") :test 'equal)
          +;; => ("bar")
          +
          + +

          see also remove-if[-not] below.

          + +

          remove-duplicates, delete-duplicates (sequence)

          + +

          remove-duplicates returns a +new sequence with uniq elements. delete-duplicates may modify the +original sequence.

          + +

          remove-duplicates accepts the following, usual arguments: from-end +test test-not start end key.

          + +
          (remove-duplicates '(:foo :foo :bar))
          +(:FOO :BAR)
          +
          +(remove-duplicates '("foo" "foo" "bar"))
          +("foo" "foo" "bar")
          +
          +(remove-duplicates '("foo" "foo" "bar") :test #'string-equal)
          +("foo" "bar")
          +
          + +

          mapping (map, mapcar, remove-if[-not],…)

          + +

          If you’re used to map and filter in other languages, you probably want +mapcar. But it only works on lists, so to iterate on vectors (and +produce either a vector or a list, use (map 'list function vector).

          + +

          mapcar also accepts multiple lists with &rest more-seqs. The +mapping stops as soon as the shortest sequence runs out.

          + +

          map takes the output-type as first argument ('list, 'vector or +'string):

          + +
          (defparameter foo '(1 2 3))
          +(map 'list (lambda (it) (* 10 it)) foo)
          +
          + +

          reduce (function, sequence). Special parameter: :initial-value.

          + +
          (reduce '- '(1 2 3 4))
          +;; => -8
          +(reduce '- '(1 2 3 4) :initial-value 100)
          +;; => 90
          +
          + +

          Filter is here called remove-if-not.

          + +

          Flatten a list (Alexandria)

          + +

          With +Alexandria, +we have the flatten function.

          + +

          Creating lists with variables

          + +

          That’s one use of the backquote:

          + +
          (defparameter *var* "bar")
          +;; First try:
          +'("foo" *var* "baz") ;; no backquote
          +;; => ("foo" *VAR* "baz") ;; nope
          +
          + +

          Second try, with backquote interpolation:

          + +
          `("foo" ,*var* "baz")     ;; backquote, comma
          +;; => ("foo" "bar" "baz") ;; good
          +
          + +

          The backquote first warns we’ll do interpolation, the comma introduces +the value of the variable.

          + +

          If our variable is a list:

          + +
          (defparameter *var* '("bar" "baz"))
          +;; First try:
          +`("foo" ,*var*)
          +;; => ("foo" ("bar" "baz")) ;; nested list
          +`("foo" ,@*var*)            ;; backquote, comma-@ to
          +;; => ("foo" "bar" "baz")
          +
          + +

          E. Weitz warns that “objects generated this way will very likely share +structure (see Recipe 2-7)â€.

          + +

          Comparing lists

          + +

          We can use sets functions.

          + +

          Set

          + +

          We show below how to use set operations on lists.

          + +

          A set doesn’t contain twice the same element and is unordered.

          + +

          Most of these functions have recycling (modifying) counterparts, starting with “nâ€: nintersection,… They all accept the usual :key and :test arguments, so use the test #'string= or #'equal if you are working with strings.

          + +

          For more, see functions in +Alexandria: +setp, set-equal,… and the FSet library, shown in the next section.

          + +

          intersection of lists

          + +

          What elements are both in list-a and list-b ?

          + +
          (defparameter list-a '(0 1 2 3))
          +(defparameter list-b '(0 2 4))
          +(intersection list-a list-b)
          +;; => (2 0)
          +
          + +

          Remove the elements of list-b from list-a (set-difference)

          + +
          (set-difference list-a list-b)
          +;; => (3 1)
          +(set-difference list-b list-a)
          +;; => (4)
          +
          + +

          Join two lists with uniq elements (union)

          + +
          (union list-a list-b)
          +;; => (3 1 0 2 4) ;; order can be different in your lisp
          +
          + +

          Remove elements that are in both lists (set-exclusive-or)

          + +
          (set-exclusive-or list-a list-b)
          +;; => (4 3 1)
          +
          + +

          Add an element to a set (adjoin)

          + +

          A new set is returned, the original set is not modified.

          + +
          (adjoin 3 list-a)
          +;; => (0 1 2 3)   ;; <-- nothing was changed, 3 was already there.
          +
          +(adjoin 5 list-a)
          +;; => (5 0 1 2 3) ;; <-- element added in front.
          +
          +list-a
          +;; => (0 1 2 3)  ;; <-- original list unmodified.
          +
          + +

          Check if this is a subset (subsetp)

          + +
          (subsetp '(1 2 3) list-a)
          +;; => T
          +
          +(subsetp '(1 1 1) list-a)
          +;; => T
          +
          +(subsetp '(3 2 1) list-a)
          +;; => T
          +
          +(subsetp '(0 3) list-a)
          +;; => T
          +
          + +

          Fset - immutable data structure

          + +

          You may want to have a look at the +FSet +library (in Quicklisp).

          + +

          Arrays and vectors

          + +

          Arrays have constant-time access characteristics.

          + +

          They can be fixed or adjustable. A simple array is neither displaced +(using :displaced-to, to point to another array) nor adjustable +(:adjust-array), nor does it have a fill pointer (fill-pointer, +that moves when we add or remove elements).

          + +

          A vector is an array with rank 1 (of one dimension). It is also a +sequence (see above).

          + +

          A simple vector is a simple array that is also not specialized (it +doesn’t use :element-type to set the types of the elements).

          + +

          Create an array, one or many dimensions

          + +

          make-array (sizes-list :adjustable bool)

          + +

          adjust-array (array, sizes-list, :element-type, :initial-element)

          + +

          Access: aref (array i [j …])

          + +

          aref (array i j k …) or row-major-aref (array i) equivalent to +(aref i i i …).

          + +

          The result is setfable.

          + +
          (defparameter myarray (make-array '(2 2 2) :initial-element 1))
          +myarray
          +;; => #3A(((1 1) (1 1)) ((1 1) (1 1)))
          +(aref myarray 0 0 0)
          +;; => 1
          +(setf (aref myarray 0 0 0) 9)
          +;; => 9
          +(row-major-aref myarray 0)
          +;; => 9
          +
          + +

          Sizes

          + +

          array-total-size (array): how many elements will fit in the array ?

          + +

          array-dimensions (array): list containing the length of the array’s dimensions.

          + +

          array-dimension (array i): length of the ith dimension.

          + +

          array-rank number of dimensions of the array.

          + +
          (defparameter myarray (make-array '(2 2 2)))
          +;; => MYARRAY
          +myarray
          +;; => #3A(((0 0) (0 0)) ((0 0) (0 0)))
          +(array-rank myarray)
          +;; => 3
          +(array-dimensions myarray)
          +;; => (2 2 2)
          +(array-dimension myarray 0)
          +;; => 2
          +(array-total-size myarray)
          +;; => 8
          +
          + +

          Vectors

          + +

          Create with vector or the reader macro #(). It returns a simple +vector.

          + +
          (vector 1 2 3)
          +;; => #(1 2 3)
          +#(1 2 3)
          +;; => #(1 2 3)
          +
          + +

          vector-push (foo vector): replace the vector element pointed to by +the fill pointer by foo. Can be destructive.

          + +

          vector-push-extend (foo vector [extension-num])t

          + +

          vector-pop (vector): return the element of vector its fill pointer +points to.

          + +

          fill-pointer (vector). setfable.

          + +

          and see also the sequence functions.

          + +

          Transforming a vector to a list.

          + +

          If you’re mapping over it, see the map function whose first parameter +is the result type.

          + +

          Or use (coerce vector 'list).

          + +

          Hash Table

          + +

          Hash Tables are a powerful data structure, associating keys with +values in a very efficient way. Hash Tables are often preferred over +association lists whenever performance is an issue, but they introduce +a little overhead that makes assoc lists better if there are only a +few key-value pairs to maintain.

          + +

          Alists can be used sometimes differently though:

          + +
            +
          • they can be ordered
          • +
          • we can push cons cells that have the same key, remove the one in +front and we have a stack
          • +
          • they have a human-readable printed representation
          • +
          • they can be easily (de)serialized
          • +
          • because of RASSOC, keys and values in alists are essentially +interchangeable; whereas in hash tables, keys and values play very +different roles (as usual, see CL Recipes for more).
          • +
          + +

          + +

          Creating a Hash Table

          + +

          Hash Tables are created using the function +make-hash-table. It +has no required argument. Its most used optional keyword argument is +:test, specifying the function used to test the equality of keys.

          + +
          +Note: see shorter notations in the Serapeum or Rutils libraries. For example, Serapeum has dict, and Rutils a #h reader macro. +
          + +

          + +

          Adding an Element to a Hash Table

          + +

          If you want to add an element to a hash table, you can use gethash, +the function to retrieve elements from the hash table, in conjunction +with +setf.

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table))
          +*MY-HASH*
          +CL-USER> (setf (gethash 'one-entry *my-hash*) "one")
          +"one"
          +CL-USER> (setf (gethash 'another-entry *my-hash*) 2/4)
          +1/2
          +CL-USER> (gethash 'one-entry *my-hash*)
          +"one"
          +T
          +CL-USER> (gethash 'another-entry *my-hash*)
          +1/2
          +T
          +
          + +

          With Serapeum’s dict, we can create a hash-table and add elements to +it in one go:

          + +
          (defparameter *my-hash* (dict :one-entry "one" :another-entry 2/4))
          +;; =>
          + (dict
          +  :ONE-ENTRY "one"
          +  :ANOTHER-ENTRY 1/2
          + )
          +
          + +

          + +

          Getting a value from a Hash Table

          + +

          The function +gethash +takes two required arguments: a key and a hash table. It returns two +values: the value corresponding to the key in the hash table (or nil +if not found), and a boolean indicating whether the key was found in +the table. That second value is necessary since nil is a valid value +in a key-value pair, so getting nil as first value from gethash +does not necessarily mean that the key was not found in the table.

          + +

          Getting a key that does not exist with a default value

          + +

          gethash has an optional third argument:

          + +
          (gethash 'bar *my-hash* "default-bar")
          +;; => "default-bar"
          +;;     NIL
          +
          + +

          Getting all keys or all values of a hash table

          + +

          The +Alexandria +library (in Quicklisp) has the functions hash-table-keys and +hash-table-values for that.

          + +
          (ql:quickload "alexandria")
          +;; […]
          +(alexandria:hash-table-keys *my-hash*)
          +;; => (BAR)
          +
          + +

          + +

          Testing for the Presence of a Key in a Hash Table

          + +

          The first value returned by gethash is the object in the hash table +that’s associated with the key you provided as an argument to +gethash or nil if no value exists for this key. This value can act +as a +generalized boolean if you want to test for the presence of keys.

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table))
          +*MY-HASH*
          +CL-USER> (setf (gethash 'one-entry *my-hash*) "one")
          +"one"
          +CL-USER> (if (gethash 'one-entry *my-hash*)
          +           "Key exists"
          +           "Key does not exist")
          +"Key exists"
          +CL-USER> (if (gethash 'another-entry *my-hash*)
          +           "Key exists"
          +           "Key does not exist")
          +"Key does not exist"
          +
          + +

          But note that this does not work if nil is amongst the values that +you want to store in the hash.

          + +
          CL-USER> (setf (gethash 'another-entry *my-hash*) nil)
          +NIL
          +CL-USER> (if (gethash 'another-entry *my-hash*)
          +           "Key exists"
          +           "Key does not exist")
          +"Key does not exist"
          +
          + +

          In this case you’ll have to check the second return value of gethash which will always return nil if no value is found and T otherwise.

          + +
          CL-USER> (if (nth-value 1 (gethash 'another-entry *my-hash*))
          +           "Key exists"
          +           "Key does not exist")
          +"Key exists"
          +CL-USER> (if (nth-value 1 (gethash 'no-entry *my-hash*))
          +           "Key exists"
          +           "Key does not exist")
          +"Key does not exist"
          +
          + +

          + +

          Deleting from a Hash Table

          + +

          Use +remhash +to delete a hash entry. Both the key and its associated value will be +removed from the hash table. remhash returns T if there was such an +entry, nil otherwise.

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table))
          +*MY-HASH*
          +CL-USER> (setf (gethash 'first-key *my-hash*) 'one)
          +ONE
          +CL-USER> (gethash 'first-key *my-hash*)
          +ONE
          +T
          +CL-USER> (remhash 'first-key *my-hash*)
          +T
          +CL-USER> (gethash 'first-key *my-hash*)
          +NIL
          +NIL
          +CL-USER> (gethash 'no-entry *my-hash*)
          +NIL
          +NIL
          +CL-USER> (remhash 'no-entry *my-hash*)
          +NIL
          +CL-USER> (gethash 'no-entry *my-hash*)
          +NIL
          +NIL
          +
          + +

          + +

          Deleting a Hash Table

          + +

          Use +clrhash +to delete a hash table. This will remove all of the data from the hash table and return the deleted table.

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table))
          +*MY-HASH*
          +CL-USER> (setf (gethash 'first-key *my-hash*) 'one)
          +ONE
          +CL-USER> (setf (gethash 'second-key *my-hash*) 'two)
          +TWO
          +CL-USER> *my-hash*
          +#<hash-table :TEST eql :COUNT 2 {10097BF4E3}>
          +CL-USER> (clrhash *my-hash*)
          +#<hash-table :TEST eql :COUNT 0 {10097BF4E3}>
          +CL-USER> (gethash 'first-key *my-hash*)
          +NIL
          +NIL
          +CL-USER> (gethash 'second-key *my-hash*)
          +NIL
          +NIL
          +
          + +

          + +

          Traversing a Hash Table

          + +

          If you want to perform an action on each entry (i.e., each key-value +pair) in a hash table, you have several options:

          + +

          You can use +maphash +which iterates over all entries in the hash table. Its first argument +must be a function which accepts two arguments, the key and the +value of each entry. Note that due to the nature of hash tables you +can’t control the order in which the entries are provided by +maphash (or other traversing constructs). maphash always returns +nil.

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table))
          +*MY-HASH*
          +CL-USER> (setf (gethash 'first-key *my-hash*) 'one)
          +ONE
          +CL-USER> (setf (gethash 'second-key *my-hash*) 'two)
          +TWO
          +CL-USER> (setf (gethash 'third-key *my-hash*) nil)
          +NIL
          +CL-USER> (setf (gethash nil *my-hash*) 'nil-value)
          +NIL-VALUE
          +CL-USER> (defun print-hash-entry (key value)
          +    (format t "The value associated with the key ~S is ~S~%" key value))
          +PRINT-HASH-ENTRY
          +CL-USER> (maphash #'print-hash-entry *my-hash*)
          +The value associated with the key FIRST-KEY is ONE
          +The value associated with the key SECOND-KEY is TWO
          +The value associated with the key THIRD-KEY is NIL
          +The value associated with the key NIL is NIL-VALUE
          +
          + +

          You can also use +with-hash-table-iterator, +a macro which turns (via +macrolet) +its first argument into an iterator that on each invocation returns +three values per hash table entry - a generalized boolean that’s true +if an entry is returned, the key of the entry, and the value of the +entry. If there are no more entries, only one value is returned - +nil.

          + +
          ;;; same hash-table as above
          +CL-USER> (with-hash-table-iterator (my-iterator *my-hash*)
          +           (loop
          +              (multiple-value-bind (entry-p key value)
          +                  (my-iterator)
          +                (if entry-p
          +                    (print-hash-entry key value)
          +                    (return)))))
          +The value associated with the key FIRST-KEY is ONE
          +The value associated with the key SECOND-KEY is TWO
          +The value associated with the key THIRD-KEY is NIL
          +The value associated with the key NIL is NIL-VALUE
          +NIL
          +
          + +

          Note the following caveat from the HyperSpec: “It is unspecified what +happens if any of the implicit interior state of an iteration is +returned outside the dynamic extent of the with-hash-table-iterator +form such as by returning some closure over the invocation form.â€

          + +

          And there’s always loop:

          + +
          ;;; same hash-table as above
          +CL-USER> (loop for key being the hash-keys of *my-hash*
          +           do (print key))
          +FIRST-KEY
          +SECOND-KEY
          +THIRD-KEY
          +NIL
          +NIL
          +CL-USER> (loop for key being the hash-keys of *my-hash*
          +           using (hash-value value)
          +           do (format t "The value associated with the key ~S is ~S~%" key value))
          +The value associated with the key FIRST-KEY is ONE
          +The value associated with the key SECOND-KEY is TWO
          +The value associated with the key THIRD-KEY is NIL
          +The value associated with the key NIL is NIL-VALUE
          +NIL
          +CL-USER> (loop for value being the hash-values of *my-hash*
          +           do (print value))
          +ONE
          +TWO
          +NIL
          +NIL-VALUE
          +NIL
          +CL-USER> (loop for value being the hash-values of *my-hash*
          +           using (hash-key key)
          +           do (format t "~&~A -> ~A" key value))
          +FIRST-KEY -> ONE
          +SECOND-KEY -> TWO
          +THIRD-KEY -> NIL
          +NIL -> NIL-VALUE
          +NIL
          +
          + +

          Traversing keys or values

          + +

          To map over keys or values we can again rely on Alexandria with +maphash-keys and maphash-values.

          + +

          + +

          Counting the Entries in a Hash Table

          + +

          No need to use your fingers - Common Lisp has a built-in function to +do it for you: +hash-table-count.

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table))
          +*MY-HASH*
          +CL-USER> (hash-table-count *my-hash*)
          +0
          +CL-USER> (setf (gethash 'first *my-hash*) 1)
          +1
          +CL-USER> (setf (gethash 'second *my-hash*) 2)
          +2
          +CL-USER> (setf (gethash 'third *my-hash*) 3)
          +3
          +CL-USER> (hash-table-count *my-hash*)
          +3
          +CL-USER> (setf (gethash 'second *my-hash*) 'two)
          +TWO
          +CL-USER> (hash-table-count *my-hash*)
          +3
          +CL-USER> (clrhash *my-hash*)
          +#<EQL hash table, 0 entries {48205F35}>
          +CL-USER> (hash-table-count *my-hash*)
          +0
          +
          + +

          Printing a Hash Table readably

          + +

          With print-object (non portable)

          + +

          It is very tempting to use print-object. It works under several +implementations, but this method is actually not portable. The +standard doesn’t permit to do so, so this is undefined behaviour.

          + +
          (defmethod print-object ((object hash-table) stream)
          +  (format stream "#HASH{~{~{(~a : ~a)~}~^ ~}}"
          +          (loop for key being the hash-keys of object
          +                using (hash-value value)
          +                collect (list key value))))
          +
          +;; WARNING:
          +;;   redefining PRINT-OBJECT (#<STRUCTURE-CLASS COMMON-LISP:HASH-TABLE>
          +;;                            #<SB-PCL:SYSTEM-CLASS COMMON-LISP:T>) in DEFMETHOD
          +;; #<STANDARD-METHOD COMMON-LISP:PRINT-OBJECT (HASH-TABLE T) {1006A0D063}>
          +
          + +

          and let’s try it:

          + +
          (let ((ht (make-hash-table)))
          +  (setf (gethash :foo ht) :bar)
          +  ht)
          +;; #HASH{(FOO : BAR)}
          +
          + +

          With a custom function (portable way)

          + +

          Here’s a portable way.

          + +

          This snippets prints the keys, values and the test function of a +hash-table, and uses alexandria:alist-hash-table to read it back in:

          + +
          ;; https://github.com/phoe/phoe-toolbox/blob/master/phoe-toolbox.lisp
          +(defun print-hash-table-readably (hash-table
          +                                  &optional (stream *standard-output*))
          +  "Prints a hash table readably using ALEXANDRIA:ALIST-HASH-TABLE."
          +  (let ((test (hash-table-test hash-table))
          +        (*print-circle* t)
          +        (*print-readably* t))
          +    (format stream "#.(ALEXANDRIA:ALIST-HASH-TABLE '(~%")
          +    (maphash (lambda (k v) (format stream "   (~S . ~S)~%" k v)) hash-table)
          +    (format stream "   ) :TEST '~A)" test)
          +    hash-table))
          +
          + +

          Example output:

          + +
          #.(ALEXANDRIA:ALIST-HASH-TABLE
          +'((ONE . 1))
          +  :TEST 'EQL)
          +#<HASH-TABLE :TEST EQL :COUNT 1 {10046D4863}>
          +
          + +

          This output can be read back in to create a hash-table:

          + +
          (read-from-string
          + (with-output-to-string (s)
          +   (print-hash-table-readably
          +    (alexandria:alist-hash-table
          +     '((a . 1) (b . 2) (c . 3))) s)))
          +;; #<HASH-TABLE :TEST EQL :COUNT 3 {1009592E23}>
          +;; 83
          +
          + +

          With Serapeum (readable and portable)

          + +

          The Serapeum library +has the dict constructor, the function pretty-print-hash-table and +the toggle-pretty-print-hash-table switch, all which do not use +print-object under the hood.

          + +
          CL-USER> (serapeum:toggle-pretty-print-hash-table)
          +T
          +CL-USER> (serapeum:dict :a 1 :b 2 :c 3)
          +(dict
          +  :A 1
          +  :B 2
          +  :C 3
          + )
          +
          + +

          This printed representation can be read back in.

          + +

          + +

          Thread-safe Hash Tables

          + +

          The standard hash-table in Common Lisp is not thread-safe. That means +that simple access operations can be interrupted in the middle and +return a wrong result.

          + +

          Implementations offer different solutions.

          + +

          With SBCL, we can create thread-safe hash tables with the :synchronized keyword to make-hash-table: http://www.sbcl.org/manual/#Hash-Table-Extensions.

          + +
          +

          If nil (the default), the hash-table may have multiple concurrent readers, but results are undefined if a thread writes to the hash-table concurrently with another reader or writer. If t, all concurrent accesses are safe, but note that clhs 3.6 (Traversal Rules and Side Effects) remains in force. See also: sb-ext:with-locked-hash-table.

          +
          + +
          (defparameter *my-hash* (make-hash-table :synchronized t))
          +
          + +

          But, operations that expand to two accesses, like the modify macros (incf) or this:

          + +
          (setf (gethash :a *my-hash*) :new-value)
          +
          + +

          need to be wrapped around sb-ext:with-locked-hash-table:

          + +
          +

          Limits concurrent accesses to HASH-TABLE for the duration of BODY. If HASH-TABLE is synchronized, BODY will execute with exclusive ownership of the table. If HASH-TABLE is not synchronized, BODY will execute with other WITH-LOCKED-HASH-TABLE bodies excluded – exclusion of hash-table accesses not surrounded by WITH-LOCKED-HASH-TABLE is unspecified.

          +
          + +
          (sb-ext:with-locked-hash-table (*my-hash*)
          +  (setf (gethash :a *my-hash*) :new-value))
          +
          + +

          In LispWorks, hash-tables are thread-safe by default. But +likewise, there is no guarantee of atomicity between access +operations, so we can use +with-hash-table-locked.

          + +

          Ultimately, you might like what the cl-gserver library +proposes. It offers helper functions around hash-tables and its +actors/agent system to allow thread-safety. They also maintain the +order of updates and reads.

          + +

          Performance Issues: The Size of your Hash Table

          + +

          The make-hash-table function has a couple of optional parameters +which control the initial size of your hash table and how it’ll grow +if it needs to grow. This can be an important performance issue if +you’re working with large hash tables. Here’s an (admittedly not very +scientific) example with CMUCL pre-18d on +Linux:

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table))
          +*MY-HASH*
          +CL-USER> (hash-table-size *my-hash*)
          +65
          +CL-USER> (hash-table-rehash-size *my-hash*)
          +1.5
          +CL-USER> (time (dotimes (n 100000) (setf (gethash n *my-hash*) n)))
          +Compiling LAMBDA NIL:
          +Compiling Top-Level Form:
          +
          +Evaluation took:
          +  0.27 seconds of real time
          +  0.25 seconds of user run time
          +  0.02 seconds of system run time
          +  0 page faults and
          +  8754768 bytes consed.
          +NIL
          +CL-USER> (time (dotimes (n 100000) (setf (gethash n *my-hash*) n)))
          +Compiling LAMBDA NIL:
          +Compiling Top-Level Form:
          +
          +Evaluation took:
          +  0.05 seconds of real time
          +  0.05 seconds of user run time
          +  0.0 seconds of system run time
          +  0 page faults and
          +  0 bytes consed.
          +NIL
          +
          + +

          The values for +hash-table-size +and +hash-table-rehash-size +are implementation-dependent. In our case, CMUCL chooses and initial +size of 65, and it will increase the size of the hash by 50 percent +whenever it needs to grow. Let’s see how often we have to re-size the +hash until we reach the final size…

          + +
          CL-USER> (log (/ 100000 65) 1.5)
          +18.099062
          +CL-USER> (let ((size 65)) (dotimes (n 20) (print (list n size)) (setq size (* 1.5 size))))
          +(0 65)
          +(1 97.5)
          +(2 146.25)
          +(3 219.375)
          +(4 329.0625)
          +(5 493.59375)
          +(6 740.3906)
          +(7 1110.5859)
          +(8 1665.8789)
          +(9 2498.8184)
          +(10 3748.2275)
          +(11 5622.3413)
          +(12 8433.512)
          +(13 12650.268)
          +(14 18975.402)
          +(15 28463.104)
          +(16 42694.656)
          +(17 64041.984)
          +(18 96062.98)
          +(19 144094.47)
          +NIL
          +
          + +

          The hash has to be re-sized 19 times until it’s big enough to hold +100,000 entries. That explains why we saw a lot of consing and why it +took rather long to fill the hash table. It also explains why the +second run was much faster - the hash table already had the correct +size.

          + +

          Here’s a faster way to do it: +If we know in advance how big our hash will be, we can start with the right size:

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table :size 100000))
          +*MY-HASH*
          +CL-USER> (hash-table-size *my-hash*)
          +100000
          +CL-USER> (time (dotimes (n 100000) (setf (gethash n *my-hash*) n)))
          +Compiling LAMBDA NIL:
          +Compiling Top-Level Form:
          +
          +Evaluation took:
          +  0.04 seconds of real time
          +  0.04 seconds of user run time
          +  0.0 seconds of system run time
          +  0 page faults and
          +  0 bytes consed.
          +NIL
          +
          + +

          That’s obviously much faster. And there was no consing involved +because we didn’t have to re-size at all. If we don’t know the final +size in advance but can guess the growth behaviour of our hash table +we can also provide this value to make-hash-table. We can provide an +integer to specify absolute growth or a float to specify relative +growth.

          + +
          CL-USER> (defparameter *my-hash* (make-hash-table :rehash-size 100000))
          +*MY-HASH*
          +CL-USER> (hash-table-size *my-hash*)
          +65
          +CL-USER> (hash-table-rehash-size *my-hash*)
          +100000
          +CL-USER> (time (dotimes (n 100000) (setf (gethash n *my-hash*) n)))
          +Compiling LAMBDA NIL:
          +Compiling Top-Level Form:
          +
          +Evaluation took:
          +  0.07 seconds of real time
          +  0.05 seconds of user run time
          +  0.01 seconds of system run time
          +  0 page faults and
          +  2001360 bytes consed.
          +NIL
          +
          + +

          Also rather fast (we only needed one re-size) but much more consing +because almost the whole hash table (minus 65 initial elements) had to +be built during the loop.

          + +

          Note that you can also specify the rehash-threshold while creating a +new hash table. One final remark: Your implementation is allowed to +completely ignore the values provided for rehash-size and +rehash-threshold…

          + +

          Alist

          + +

          Definition

          + +

          An association list is a list of cons cells.

          + +

          This simple example:

          + +
          (defparameter *my-alist* (list (cons 'foo "foo")
          +                             (cons 'bar "bar")))
          +;; => ((FOO . "foo") (BAR . "bar"))
          +
          + +

          looks like this:

          + +
          [o|o]---[o|/]
          + |       |
          + |      [o|o]---"bar"
          + |       |
          + |      BAR
          + |
          +[o|o]---"foo"
          + |
          +FOO
          +
          + +

          Construction

          + +

          We can construct an alist like its representation:

          + +
          (setf *my-alist* '((:foo . "foo")
          +                 (:bar . "bar")))
          +
          + +

          The constructor pairlis associates a list of keys and a list of values:

          + +
          (pairlis '(:foo :bar)
          +         '("foo" "bar"))
          +;; => ((:BAR . "bar") (:FOO . "foo"))
          +
          + +

          Alists are just lists, so you can have the same key multiple times in the same alist:

          + +
          (setf *alist-with-duplicate-keys*
          +  '((:a . 1)
          +    (:a . 2)
          +    (:b . 3)
          +    (:a . 4)
          +    (:c . 5)))
          +
          + +

          Access

          + +

          To get a key, we have assoc (use :test 'equal when your keys are +strings, as usual). It returns the whole cons cell, so you may want to +use cdr or second to get the value or even better assoc-value list key from Alexandria.

          + +
          (alexandria:assoc-value *my-alist* :foo)
          +;; it actually returns 2 values
          +;; "foo"
          +;; (:FOO . "FOO")
          +
          + +

          There is assoc-if, and rassoc to get a cons cell by its value.

          + +

          If the alist has repeating (duplicate) keys, you can use remove-if-not, for example, to retrieve all of them.

          + +
          (remove-if-not
          +  #'(lambda (entry)
          +      (eq :a entry))
          +  *alist-with-duplicate-keys*
          +  :key #'car)
          +
          + +

          Insert and remove entries

          + +

          To add a key, we push another cons cell:

          + +
          (push (cons 'team "team") *my-alist*)
          +;; => ((TEAM . "team") (FOO . "foo") (BAR . "bar"))
          +
          + +

          We can use pop and other functions that operate on lists, like remove:

          + +
          (remove :team *my-alist*)
          +;; => ((:TEAM . "team") (FOO . "foo") (BAR . "bar")) ;; didn't remove anything
          +(remove :team *my-alist* :key 'car)
          +;; => ((FOO . "foo") (BAR . "bar")) ;; returns a copy
          +
          + +

          Remove only one element with :count:

          + +
          (push (cons 'bar "bar2") *my-alist*)
          +;; => ((BAR . "bar2") (TEAM . "team") (FOO . "foo") (BAR . "bar")) ;; twice the 'bar key
          +(remove 'bar *my-alist* :key 'car :count 1)
          +;; => ((TEAM . "team") (FOO . "foo") (BAR . "bar"))
          +;; because otherwise:
          +(remove 'bar *my-alist* :key 'car)
          +;; => ((TEAM . "team") (FOO . "foo")) ;; no more 'bar
          +
          + +

          Update entries

          + +

          Replace a value:

          + +
          *my-alist*
          +;; => '((:FOO . "foo") (:BAR . "bar"))
          +(assoc :foo *my-alist*)
          +;; => (:FOO . "foo")
          +(setf (cdr (assoc :foo *my-alist*)) "new-value")
          +;; => "new-value"
          +*my-alist*
          +;; => '((:foo . "new-value") (:BAR . "bar"))
          +
          + +

          Replace a key:

          + +
          *my-alist*
          +;; => '((:FOO . "foo") (:BAR . "bar")))
          +(setf (car (assoc :bar *my-alist*)) :new-key)
          +;; => :NEW-KEY
          +*my-alist*
          +;; => '((:FOO . "foo") (:NEW-KEY . "bar")))
          +
          + +

          In the +Alexandria +library, see more functions like hash-table-alist, alist-plist,…

          + +

          Plist

          + +

          A property list is simply a list that alternates a key, a value, and +so on, where its keys are symbols (we can not set its :test). More +precisely, it first has a cons cell whose car is the key, whose +cdr points to the following cons cell whose car is the +value.

          + +

          For example this plist:

          + +
          (defparameter my-plist (list 'foo "foo" 'bar "bar"))
          +
          + +

          looks like this:

          + +
          [o|o]---[o|o]---[o|o]---[o|/]
          + |       |       |       |
          +FOO     "foo"   BAR     "bar"
          +
          +
          + +

          We access an element with getf (list elt) (it returns the value) +(the list comes as first element),

          + +

          we remove an element with remf.

          + +
          (defparameter my-plist (list 'foo "foo" 'bar "bar"))
          +;; => (FOO "foo" BAR "bar")
          +(setf (getf my-plist 'foo) "foo!!!")
          +;; => "foo!!!"
          +
          + +

          Structures

          + +

          Structures offer a way to store data in named slots. They support +single inheritance.

          + +

          Classes provided by the Common Lisp Object System (CLOS) are more flexible however structures may offer better performance (see for example the SBCL manual).

          + +

          Creation

          + +

          Use defstruct:

          + +
          (defstruct person
          +   id name age)
          +
          + +

          At creation slots are optional and default to nil.

          + +

          To set a default value:

          + +
          (defstruct person
          +   id
          +   (name "john doe")
          +   age)
          +
          + +

          Also specify the type after the default value:

          + +
          (defstruct person
          +  id
          +  (name "john doe" :type string)
          +  age)
          +
          + +

          We create an instance with the generated constructor make- + +<structure-name>, so make-person:

          + +
          (defparameter *me* (make-person))
          +*me*
          +#S(PERSON :ID NIL :NAME "john doe" :AGE NIL)
          +
          + +

          note that printed representations can be read back by the reader.

          + +

          With a bad name type:

          + +
          (defparameter *bad-name* (make-person :name 123))
          +
          + +
          Invalid initialization argument:
          +  :NAME
          +in call for class #<STRUCTURE-CLASS PERSON>.
          +   [Condition of type SB-PCL::INITARG-ERROR]
          +
          + +

          We can set the structure’s constructor so as to create the structure +without using keyword arguments, which can be more convenient +sometimes. We give it a name and the order of the arguments:

          + +
          (defstruct (person (:constructor create-person (id name age)))
          +     id
          +     name
          +     age)
          +
          + +

          Our new constructor is create-person:

          + +
          (create-person 1 "me" 7)
          +#S(PERSON :ID 1 :NAME "me" :AGE 7)
          +
          + +

          However, the default make-person does not work any more:

          + +
          (make-person :name "me")
          +;; debugger:
          +obsolete structure error for a structure of type PERSON
          +[Condition of type SB-PCL::OBSOLETE-STRUCTURE]
          +
          + +

          Slot access

          + +

          We access the slots with accessors created by <name-of-the-struct>- + slot-name:

          + +
          (person-name *me*)
          +;; "john doe"
          +
          + +

          we then also have person-age and person-id.

          + +

          Setting

          + +

          Slots are setf-able:

          + +
          (setf (person-name *me*) "Cookbook author")
          +(person-name *me*)
          +;; "Cookbook author"
          +
          + +

          Predicate

          + +

          A predicate function is generated:

          + +
          (person-p *me*)
          +T
          +
          + +

          Single inheritance

          + +

          Use single inheritance with the :include <struct> argument:

          + +
          (defstruct (female (:include person))
          +     (gender "female" :type string))
          +(make-female :name "Lilie")
          +;; #S(FEMALE :ID NIL :NAME "Lilie" :AGE NIL :GENDER "female")
          +
          + +

          Note that the CLOS object system is more powerful.

          + +

          Limitations

          + +

          After a change, instances are not updated.

          + +

          If we try to add a slot (email below), we have the choice to lose +all instances, or to continue using the new definition of +person. But the effects of redefining a structure are undefined by +the standard, so it is best to re-compile and re-run the changed +code.

          + +
          (defstruct person
          +       id
          +       (name "john doe" :type string)
          +       age
          +       email)
          +
          +attempt to redefine the STRUCTURE-OBJECT class PERSON
          +incompatibly with the current definition
          +   [Condition of type SIMPLE-ERROR]
          +
          +Restarts:
          + 0: [CONTINUE] Use the new definition of PERSON, invalidating already-loaded code and instances.
          + 1: [RECKLESSLY-CONTINUE] Use the new definition of PERSON as if it were compatible, allowing old accessors to use new instances and allowing new accessors to use old instances.
          + 2: [CLOBBER-IT] (deprecated synonym for RECKLESSLY-CONTINUE)
          + 3: [RETRY] Retry SLIME REPL evaluation request.
          + 4: [*ABORT] Return to SLIME's top level.
          + 5: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1002A0FFA3}>)
          +
          + +

          If we choose restart 0, to use the new definition, we lose access to *me*:

          + +
          *me*
          +obsolete structure error for a structure of type PERSON
          +   [Condition of type SB-PCL::OBSOLETE-STRUCTURE]
          +
          + +

          There is also very little introspection. +Portable Common Lisp does not define ways of finding out defined super/sub-structures nor what slots a structure has.

          + +

          The Common Lisp Object System (which came after into the language) +doesn’t have such limitations. See the CLOS section.

          + + + +

          Tree

          + +

          tree-equal, copy-tree. They descend recursively into the car and +the cdr of the cons cells they visit.

          + +

          Sycamore - purely functional weight-balanced binary trees

          + +

          https://github.com/ndantam/sycamore

          + +

          Features:

          + +
            +
          • Fast, purely functional weight-balanced binary trees. +
              +
            • Leaf nodes are simple-vectors, greatly reducing tree height.
            • +
            +
          • +
          • Interfaces for tree Sets and Maps (dictionaries).
          • +
          • Ropes
          • +
          • Purely functional pairing heaps
          • +
          • Purely functional amortized queue.
          • +
          + +

          Controlling how much of data to print (*print-length*, *print-level*)

          + +

          Use *print-length* and *print-level*.

          + +

          They are both nil by default.

          + +

          If you have a very big list, printing it on the REPL or in a +stacktrace can take a long time and bring your editor or even your +server down. Use *print-length* to choose the maximum of elements of +the list to print, and to show there is a rest with a ... +placeholder:

          + +
          (setf *print-length* 2)
          +(list :A :B :C :D :E)
          +;; (:A :B ...)
          +
          + +

          And if you have a very nested data structure, set *print-level* to +choose the depth to print:

          + +
          (let ((*print-level* 2))
          +  (print '(:a (:b (:c (:d :e))))))
          +;; (:A (:B #))             <= *print-level* in action
          +;; (:A (:B (:C (:D :E))))  <= the list is returned, the let binding is not in effect anymore.
          +
          + +

          *print-length* will be applied at each level.

          + +

          Reference: the HyperSpec.

          + +

          Appendix A - generic and nested access of alists, plists, hash-tables and CLOS slots

          + +

          The solutions presented below might help you getting started, but keep +in mind that they’ll have a performance impact and that error messages +will be less explicit.

          + +
            +
          • the access library (battle tested, used by the Djula templating system) has a generic (access my-var :elt) (blog post). It also has accesses (plural) to access and set nested values.
          • +
          • rutils as a generic generic-elt or ?,
          • +
          + +

          Appendix B - accessing nested data structures

          + +

          Sometimes we work with nested data structures, and we might want an +easier way to access a nested element than intricated “getf†and +“assoc†and all. Also, we might want to just be returned a nil when +an intermediary key doesn’t exist.

          + +

          The access library given above provides this, with (accesses var key1 key2…).

          + + +

          + Page source: data-structures.md +

          +
          + + + + + +
          +
          +
          + © 2002–2021 the Common Lisp Cookbook Project +
          + +
          +
          T
          O
          C
          +
          + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/databases.html b/clones/lispcookbook.github.io/cl-cookbook/databases.html new file mode 100644 index 00000000..49de5eb6 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/databases.html @@ -0,0 +1,952 @@ + + + + + Database Access and Persistence + + + + + + + + + + + + + + +

          The Common Lisp Cookbook – Database Access and Persistence

          +
          + + + + +
          +
          + +
          +
          + +
          +
          Table of Contents
          +
            +
            +
            + +
            +

            The Common Lisp Cookbook – Database Access and Persistence

            + + +

            + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

            +

            + 📕 Get the EPUB and PDF +

            + + +
            The +Database section on the Awesome-cl list +is a resource listing popular libraries to work with different kind of +databases. We can group them roughly in four categories:

            + +
              +
            • wrappers to one database engine (cl-sqlite, postmodern, cl-redis,…),
            • +
            • interfaces to several DB engines (clsql, sxql,…),
            • +
            • persistent object databases (bknr.datastore (see chap. 21 of “Common Lisp Recipesâ€), ubiquitous,…),
            • +
            • Object Relational Mappers (Mito),
            • +
            + +

            and other DB-related tools (pgloader).

            + +

            We’ll begin with an overview of Mito. If you must work with an +existing DB, you might want to have a look at cl-dbi and clsql. If you +don’t need a SQL database and want automatic persistence of Lisp +objects, you also have a choice of libraries.

            + +

            The Mito ORM and SxQL

            + +

            Mito is in Quicklisp:

            + +
            (ql:quickload "mito")
            +
            + +

            Overview

            + +

            Mito is “an ORM for Common Lisp +with migrations, relationships and PostgreSQL supportâ€.

            + +
              +
            • it supports MySQL, PostgreSQL and SQLite3,
            • +
            • when defining a model, it adds an id (serial primary key), +created_at and updated_at fields by default like Ruby’s +ActiveRecord or Django,
            • +
            • handles DB migrations for the supported backends,
            • +
            • permits DB schema versioning,
            • +
            • is tested under SBCL and CCL.
            • +
            + +

            As an ORM, it allows to write class definitions, to specify relationships, and +provides functions to query the database. For custom queries, it relies on +SxQL, an SQL generator that provides the +same interface for several backends.

            + +

            Working with Mito generally involves these steps:

            + +
              +
            • connecting to the DB
            • +
            • writing CLOS classes to define models
            • +
            • running migrations to create or alter tables
            • +
            • creating objects, saving same in the DB,
            • +
            + +

            and iterating.

            + +

            Connecting to a DB

            + +

            Mito provides the function connect-toplevel to establish a +connection to RDBMs:

            + +
            (mito:connect-toplevel :mysql :database-name "myapp" :username "fukamachi" :password "c0mon-1isp")
            +
            + +

            The driver type can be of :mysql, :sqlite3 and :postgres.

            + +

            With sqlite you don’t need the username and password:

            + +
            (mito:connect-toplevel :sqlite3 :database-name "myapp")
            +
            + +

            As usual, you need to create the MySQL or PostgreSQL database beforehand. +Refer to their documentation.

            + +

            Connecting sets mito:*connection* to the new connection and returns it.

            + +

            Disconnect with disconnect-toplevel.

            + +

            You might make good use of a wrapper function:

            + +
            (defun connect ()
            +  "Connect to the DB."
            +  (mito:connect-toplevel :sqlite3 :database-name "myapp"))
            +
            + +

            Models

            + +

            Defining models

            + +

            In Mito, you can define a class which corresponds to a database table with the deftable macro:

            + +
            (mito:deftable user ()
            +  ((name :col-type (:varchar 64))
            +   (email :col-type (or (:varchar 128) :null)))
            +
            +

            Alternatively, you can specify (:metaclass mito:dao-table-class) in a regular class definition.

            + +

            The deftable macro automatically adds some slots: a primary key named id if there’s no primary key, and created_at and updated_at for recording timestamps. Specifying (:auto-pk nil) and (:record-timestamps nil) in the deftable form will disable these behaviours. A deftable class will also come with initializers, named after the slot, and accessors, of form <class-name>-<slot-name>, for each named slot. For example, for the name slot in the above table definition, the initarg :name will be added to the constuctor, and the accessor user-name will be created.

            + +

            You can inspect the new class:

            + +
            (mito.class:table-column-slots (find-class 'user))
            +;=> (#<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS MITO.DAO.MIXIN::ID>
            +;    #<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS COMMON-LISP-USER::NAME>
            +;    #<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS COMMON-LISP-USER::EMAIL>
            +;    #<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS MITO.DAO.MIXIN::CREATED-AT>
            +;    #<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS MITO.DAO.MIXIN::UPDATED-AT>)
            +
            + +

            The class inherits mito:dao-class implicitly.

            + +
            (find-class 'user)
            +;=> #<MITO.DAO.TABLE:DAO-TABLE-CLASS COMMON-LISP-USER::USER>
            +
            +(c2mop:class-direct-superclasses *)
            +;=> (#<STANDARD-CLASS MITO.DAO.TABLE:DAO-CLASS>)
            +
            + +

            This may be useful when you define methods which can be applied for +all table classes.

            + +

            For more information on using the Common Lisp Object System, see the +clos page.

            + +

            Creating the tables

            + +

            After defining the models, you must create the tables:

            + +
            (mito:ensure-table-exists 'user)
            +
            + +

            So a helper function:

            + +
            (defun ensure-tables ()
            +  (mapcar #'mito:ensure-table-exists '(user foo bar)))
            +
            + +

            See +Mito’s documentation +for a couple more ways.

            + +

            When you alter the model you’ll need to run a DB migration, see the next section.

            + +

            Fields

            + +
            Fields types
            + +

            Field types are:

            + +

            (:varchar <integer>) ,

            + +

            :serial, :bigserial, :integer, :bigint, :unsigned,

            + +

            :timestamp, :timestamptz,

            + +

            :bytea,

            + +
            Optional fields
            + +

            Use (or <real type> :null):

            + +
               (email :col-type (or (:varchar 128) :null))
            +
            + +
            Field constraints
            + +

            :unique-keys can be used like so:

            + +
            (mito:deftable user ()
            +  ((name :col-type (:varchar 64))
            +   (email :col-type (:varchar 128))
            +  (:unique-keys email))
            +
            + +

            We already saw :primary-key.

            + +

            You can change the table name with :table-name.

            + +

            Relationships

            + +

            You can define a relationship by specifying a foreign class with :col-type:

            + +
            (mito:deftable tweet ()
            +  ((status :col-type :text)
            +   ;; This slot refers to USER class
            +   (user :col-type user))
            +
            +(table-definition (find-class 'tweet))
            +;=> (#<SXQL-STATEMENT: CREATE TABLE tweet (
            +;        id BIGSERIAL NOT NULL PRIMARY KEY,
            +;        status TEXT NOT NULL,
            +;        user_id BIGINT NOT NULL,
            +;        created_at TIMESTAMP,
            +;        updated_at TIMESTAMP
            +;    )>)
            +
            + +

            Now you can create or retrieve a TWEET by a USER object, not a USER-ID.

            + +
            (defvar *user* (mito:create-dao 'user :name "Eitaro Fukamachi"))
            +(mito:create-dao 'tweet :user *user*)
            +
            +(mito:find-dao 'tweet :user *user*)
            +
            + +

            Mito doesn’t add foreign key constraints for referring tables.

            + +
            One-to-one
            + +

            A one-to-one relationship is simply represented with a simple foreign +key on a slot (as :col-type user in the tweet class). Besides, we +can add a unicity constraint, as with (:unique-keys email).

            + +
            One-to-many, many-to-one
            + +

            The tweet example above shows a one-to-many relationship between a user and +his tweets: a user can write many tweets, and a tweet belongs to only +one user.

            + +

            The relationship is defined with a foreign key on the “many†side +linking back to the “one†side. Here the tweet class defines a +user foreign key, so a tweet can only have one user. You didn’t need +to edit the user class.

            + +

            A many-to-one relationship is actually the contrary of a one-to-many. +You have to put the foreign key on the appropriate side.

            + +
            Many-to-many
            + +

            A many-to-many relationship needs an intermediate table, which will be +the “many†side for the two tables it is the intermediary of.

            + +

            And, thanks to the join table, we can store more information about the relationship.

            + +

            Let’s define a book class:

            + +
            (mito:deftable book ()
            +    ((title :col-type (:varchar 128))
            +     (ean :col-type (or (:varchar 128) :null))))
            +
            + +

            A user can have many books, and a book (as the title, not the physical +copy) is likely to be in many people’s library. Here’s the +intermediate class:

            + +
            (mito:deftable user-books ()
            +    ((user :col-type user)
            +     (book :col-type book)))
            +
            + +

            Each time we want to add a book to a user’s collection (say in +a add-book function), we create a new user-books object.

            + +

            But someone may very well own many copies of one book. This is an +information we can store in the join table:

            + +
            (mito:deftable user-books ()
            +    ((user :col-type user)
            +     (book :col-type book)
            +    ;; Set the quantity, 1 by default:
            +     (quantity :col-type :integer)))
            +
            + +

            Inheritance and mixin

            + +

            A subclass of DAO-CLASS is allowed to be inherited. This may be useful +when you need classes which have similar columns:

            + +
            (mito:deftable user ()
            +  ((name :col-type (:varchar 64))
            +   (email :col-type (:varchar 128)))
            +  (:unique-keys email))
            +
            +(mito:deftable temporary-user (user)
            +  ((registered-at :col-type :timestamp)))
            +
            +(mito:table-definition 'temporary-user)
            +;=> (#<SXQL-STATEMENT: CREATE TABLE temporary_user (
            +;        id BIGSERIAL NOT NULL PRIMARY KEY,
            +;        name VARCHAR(64) NOT NULL,
            +;        email VARCHAR(128) NOT NULL,
            +;        registered_at TIMESTAMP NOT NULL,
            +;        created_at TIMESTAMP,
            +;        updated_at TIMESTAMP,
            +;        UNIQUE (email)
            +;    )>)
            +
            + +

            If you need a ‘template’ for tables which aren’t related to any +database tables, you can use DAO-TABLE-MIXIN in a defclass form. The has-email +class below will not create a table.

            + +
            (defclass has-email ()
            +  ((email :col-type (:varchar 128)
            +          :initarg :email
            +          :accessor object-email))
            +  (:metaclass mito:dao-table-mixin)
            +  (:unique-keys email))
            +;=> #<MITO.DAO.MIXIN:DAO-TABLE-MIXIN COMMON-LISP-USER::HAS-EMAIL>
            +
            +(mito:deftable user (has-email)
            +  ((name :col-type (:varchar 64))))
            +;=> #<MITO.DAO.TABLE:DAO-TABLE-CLASS COMMON-LISP-USER::USER>
            +
            +(mito:table-definition 'user)
            +;=> (#<SXQL-STATEMENT: CREATE TABLE user (
            +;       id BIGSERIAL NOT NULL PRIMARY KEY,
            +;       name VARCHAR(64) NOT NULL,
            +;       email VARCHAR(128) NOT NULL,
            +;       created_at TIMESTAMP,
            +;       updated_at TIMESTAMP,
            +;       UNIQUE (email)
            +;   )>)
            +
            + +

            See more examples of use in mito-auth.

            + +

            Troubleshooting

            + +
            “Cannot CHANGE-CLASS objects into CLASS metaobjects.â€
            + +

            If you get the following error message:

            + +
            Cannot CHANGE-CLASS objects into CLASS metaobjects.
            +   [Condition of type SB-PCL::METAOBJECT-INITIALIZATION-VIOLATION]
            +See also:
            +  The Art of the Metaobject Protocol, CLASS [:initialization]
            +
            + +

            it is certainly because you first wrote a class definition and then +added the Mito metaclass and tried to evaluate the class definition +again.

            + +

            If this happens, you must remove the class definition from the current package:

            + +
            (setf (find-class 'foo) nil)
            +
            + +

            or, with the Slime inspector, click on the class and find the “remove†button.

            + +

            More info here.

            + +

            Migrations

            + +

            We can run database migrations manually, as shown below, or we can +automatically run migrations after a change to the model +definitions. To enable automatic migrations, set mito:*auto-migration-mode* to t.

            + +

            The first step is to create the tables, if needed:

            + +
            (ensure-table-exists 'user)
            +
            + +

            then alter the tables:

            + +
            (mito:migrate-table 'user)
            +
            + +

            You can check the SQL generated code with migration-expressions +'class. For example, we create the user table:

            + +
            (ensure-table-exists 'user)
            +;-> ;; CREATE TABLE IF NOT EXISTS "user" (
            +;       "id" BIGSERIAL NOT NULL PRIMARY KEY,
            +;       "name" VARCHAR(64) NOT NULL,
            +;       "email" VARCHAR(128),
            +;       "created_at" TIMESTAMP,
            +;       "updated_at" TIMESTAMP
            +;   ) () [0 rows] | MITO.DAO:ENSURE-TABLE-EXISTS
            +
            + +

            There are no changes from the previous user definition:

            + +
            (mito:migration-expressions 'user)
            +;=> NIL
            +
            + +

            Now let’s add a unique email field:

            + +
            (mito:deftable user ()
            +  ((name :col-type (:varchar 64))
            +   (email :col-type (:varchar 128)))
            +  (:unique-keys email))
            +
            + +

            The migration will run the following code:

            + +
            (mito:migration-expressions 'user)
            +;=> (#<SXQL-STATEMENT: ALTER TABLE user ALTER COLUMN email TYPE character varying(128), ALTER COLUMN email SET NOT NULL>
            +;    #<SXQL-STATEMENT: CREATE UNIQUE INDEX unique_user_email ON user (email)>)
            +
            + +

            so let’s apply it:

            + +
            (mito:migrate-table 'user)
            +;-> ;; ALTER TABLE "user" ALTER COLUMN "email" TYPE character varying(128), ALTER COLUMN "email" SET NOT NULL () [0 rows] | MITO.MIGRATION.TABLE:MIGRATE-TABLE
            +;   ;; CREATE UNIQUE INDEX "unique_user_email" ON "user" ("email") () [0 rows] | MITO.MIGRATION.TABLE:MIGRATE-TABLE
            +;-> (#<SXQL-STATEMENT: ALTER TABLE user ALTER COLUMN email TYPE character varying(128), ALTER COLUMN email SET NOT NULL>
            +;    #<SXQL-STATEMENT: CREATE UNIQUE INDEX unique_user_email ON user (email)>)
            +
            + +

            Queries

            + +

            Creating objects

            + +

            We can create user objects with the regular make-instance:

            + +
            (defvar me
            +  (make-instance 'user :name "Eitaro Fukamachi" :email "e.arrows@gmail.com"))
            +;=> USER
            +
            + +

            To save it in DB, use insert-dao:

            + +
            (mito:insert-dao me)
            +;-> ;; INSERT INTO `user` (`name`, `email`, `created_at`, `updated_at`) VALUES (?, ?, ?, ?) ("Eitaro Fukamachi", "e.arrows@gmail.com", "2016-02-04T19:55:16.365543Z", "2016-02-04T19:55:16.365543Z") [0 rows] | MITO.DAO:INSERT-DAO
            +;=> #<USER {10053C4453}>
            +
            + +

            Do the two steps above at once:

            + +
            (mito:create-dao 'user :name "Eitaro Fukamachi" :email "e.arrows@gmail.com")
            +
            + +

            You should not export the user class and create objects outside of +its package (it is good practice anyway to keep all database-related +operations in say a models package and file). You should instead use +a helper function:

            + +
            (defun make-user (&key name)
            +  (make-instance 'user :name name))
            +
            + +

            Updating fields

            + +
            (setf (slot-value me 'name) "nitro_idiot")
            +;=> "nitro_idiot"
            +
            + +

            and save it:

            + +
            (mito:save-dao me)
            +
            + +

            Deleting

            + +
            (mito:delete-dao me)
            +;-> ;; DELETE FROM `user` WHERE (`id` = ?) (1) [0 rows] | MITO.DAO:DELETE-DAO
            +
            +;; or:
            +(mito:delete-by-values 'user :id 1)
            +;-> ;; DELETE FROM `user` WHERE (`id` = ?) (1) [0 rows] | MITO.DAO:DELETE-DAO
            +
            + +

            Get the primary key value

            + +
            (mito:object-id me)
            +;=> 1
            +
            + +

            Count

            + +
            (mito:count-dao 'user)
            +;=> 1
            +
            + +

            Find one

            + +
            (mito:find-dao 'user :id 1)
            +;-> ;; SELECT * FROM `user` WHERE (`id` = ?) LIMIT 1 (1) [1 row] | MITO.DB:RETRIEVE-BY-SQL
            +;=> #<USER {10077C6073}>
            +
            + +

            So here’s a possibility of generic helpers to find an object by a given key:

            + +
            (defgeneric find-user (key-name key-value)
            +  (:documentation "Retrieves an user from the data base by one of the unique
            +keys."))
            +
            +(defmethod find-user ((key-name (eql :id)) (key-value integer))
            +  (mito:find-dao 'user key-value))
            +
            +(defmethod find-user ((key-name (eql :name)) (key-value string))
            +  (first (mito:select-dao 'user
            +                          (sxql:where (:= :name key-value)))))
            +
            + +

            Find all

            + +

            Use the macro select-dao.

            + +

            Get a list of all users:

            + +
            (mito:select-dao 'user)
            +;(#<USER {10077C6073}>)
            +;#<SXQL-STATEMENT: SELECT * FROM user>
            +
            + +

            Find by relationship

            + +

            As seen above:

            + +
            (mito:find-dao 'tweet :user *user*)
            +
            + +

            Custom queries

            + +

            It is with select-dao that you can write more precise queries by +giving it SxQL statements.

            + +

            Example:

            + +
            (select-dao 'tweet
            +    (where (:like :status "%Japan%")))
            +
            + +

            another:

            + +
            (select (:id :name :sex)
            +  (from (:as :person :p))
            +  (where (:and (:>= :age 18)
            +               (:< :age 65)))
            +  (order-by (:desc :age)))
            +
            + +

            You can compose your queries with regular Lisp code:

            + +
            (defun find-tweets (&key user)
            +  (select-dao 'tweet
            +    (when user
            +      (where (:= :user user)))
            +    (order-by :object-created)))
            +
            + +

            select-dao is a macro that expands to the right thing©.

            + +
            +Note: if you didn't use SXQL, then write (sxql:where …) and (sxql:order-by …). +
            +


            + +

            You can compose your queries further with the backquote syntax.

            + +

            Imagine you receive a query string, maybe composed of +space-separated words, and you want to search for books that have +either one of these words in their title or in their author’s +name. Searching for “bob adventure†would return a book that has +“adventure†in its title and “bob†in its author name, or both in the +title.

            + +

            For the example sake, an author is a string, not a link to another table:

            + +
            (mito:deftable book ()
            +    ((title :col-type (:varchar 128))
            +     (author :col-type (:varchar 128))
            +     (ean :col-type (or (:varchar 128) :null))))
            +
            + +

            You want to add a clause that searches on both fields for each word.

            + +
            (defun find-books (&key query (order :desc))
            +  "Return a list of books. If a query string is given, search on both the title and the author fields."
            +  (mito:select-dao 'book
            +    (when (str:non-blank-string-p query)
            +      (sxql:where
            +       `(:and
            +         ,@(loop for word in (str:words query)
            +              :collect `(:or (:like :title ,(str:concat "%" word "%"))
            +                             (:like :authors ,(str:concat "%" word "%")))))))
            +       (sxql:order-by `(,order :created-at))))
            +
            + +

            By the way, we are still using a LIKE statement, but with a non-small dataset you’ll want to use your database’s full text search engine.

            + +

            Clauses

            + +

            See the SxQL documentation.

            + +

            Examples:

            + +
            (select-dao 'foo
            +  (where (:and (:> :age 20) (:<= :age 65))))
            +
            + +
            (order-by :age (:desc :id))
            +
            + +
            (group-by :sex)
            +
            + +
            (having (:>= (:sum :hoge) 88))
            +
            + +
            (limit 0 10)
            +
            + +

            and joins, etc.

            + +

            Operators

            + +
            :not
            +:is-null, :not-null
            +:asc, :desc
            +:distinct
            +:=, :!=
            +:<, :>, :<= :>=
            +:a<, :a>
            +:as
            +:in, :not-in
            +:like
            +:and, :or
            +:+, :-, :* :/ :%
            +:raw
            +
            + +

            Triggers

            + +

            Since insert-dao, update-dao and delete-dao are defined as generic +functions, you can define :before, :after or :around methods to those, like regular method combination.

            + +
            (defmethod mito:insert-dao :before ((object user))
            +  (format t "~&Adding ~S...~%" (user-name object)))
            +
            +(mito:create-dao 'user :name "Eitaro Fukamachi" :email "e.arrows@gmail.com")
            +;-> Adding "Eitaro Fukamachi"...
            +;   ;; INSERT INTO "user" ("name", "email", "created_at", "updated_at") VALUES (?, ?, ?, ?) ("Eitaro Fukamachi", "e.arrows@gmail.com", "2016-02-16 21:13:47", "2016-02-16 21:13:47") [0 rows] | MITO.DAO:INSERT-DAO
            +;=> #<USER {100835FB33}>
            +
            + +

            Inflation/Deflation

            + +

            Inflation/Deflation is a function to convert values between Mito and RDBMS.

            + +
            (mito:deftable user-report ()
            +  ((title :col-type (:varchar 100))
            +   (body :col-type :text
            +         :initform "")
            +   (reported-at :col-type :timestamp
            +                :initform (local-time:now)
            +                :inflate #'local-time:universal-to-timestamp
            +                :deflate #'local-time:timestamp-to-universal)))
            +
            + +

            Eager loading

            + +

            One of the pains in the neck to use ORMs is the “N+1 query†problem.

            + +
            ;; BAD EXAMPLE
            +
            +(use-package '(:mito :sxql))
            +
            +(defvar *tweets-contain-japan*
            +  (select-dao 'tweet
            +    (where (:like :status "%Japan%"))))
            +
            +;; Getting names of tweeted users.
            +(mapcar (lambda (tweet)
            +          (user-name (tweet-user tweet)))
            +        *tweets-contain-japan*)
            +
            + +

            This example sends a query to retrieve a user like “SELECT * FROM user +WHERE id = ?†at each iteration.

            + +

            To prevent this performance issue, add includes to the above query +which only sends a single WHERE IN query instead of N queries:

            + +
            ;; GOOD EXAMPLE with eager loading
            +
            +(use-package '(:mito :sxql))
            +
            +(defvar *tweets-contain-japan*
            +  (select-dao 'tweet
            +    (includes 'user)
            +    (where (:like :status "%Japan%"))))
            +;-> ;; SELECT * FROM `tweet` WHERE (`status` LIKE ?) ("%Japan%") [3 row] | MITO.DB:RETRIEVE-BY-SQL
            +;-> ;; SELECT * FROM `user` WHERE (`id` IN (?, ?, ?)) (1, 3, 12) [3 row] | MITO.DB:RETRIEVE-BY-SQL
            +;=> (#<TWEET {1003513EC3}> #<TWEET {1007BABEF3}> #<TWEET {1007BB9D63}>)
            +
            +;; No additional SQLs will be executed.
            +(tweet-user (first *))
            +;=> #<USER {100361E813}>
            +
            + +

            Schema versioning

            + +
            $ ros install mito
            +$ mito
            +Usage: mito command [option...]
            +
            +Commands:
            +    generate-migrations
            +    migrate
            +
            +Options:
            +    -t, --type DRIVER-TYPE          DBI driver type (one of "mysql", "postgres" or "sqlite3")
            +    -d, --database DATABASE-NAME    Database name to use
            +    -u, --username USERNAME         Username for RDBMS
            +    -p, --password PASSWORD         Password for RDBMS
            +    -s, --system SYSTEM             ASDF system to load (several -s's allowed)
            +    -D, --directory DIRECTORY       Directory path to keep migration SQL files (default: "/Users/nitro_idiot/Programs/lib/mito/db/")
            +    --dry-run                       List SQL expressions to migrate
            +
            + +

            Introspection

            + +

            Mito provides some functions for introspection.

            + +

            We can access the information of columns with the functions in +(mito.class.column:...):

            + +
              +
            • table-column-[class, name, info, not-null-p,...]
            • +
            • primary-key-p
            • +
            + +

            and likewise for tables with (mito.class.table:...).

            + +

            Given we get a list of slots of our class:

            + +
            (ql:quickload "closer-mop")
            +
            +(closer-mop:class-direct-slots (find-class 'user))
            +;; (#<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS NAME>
            +;;  #<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS EMAIL>)
            +
            +(defparameter user-slots *)
            +
            + +

            We can answer the following questions:

            + +

            What is the type of this column ?

            + +
            (mito.class.column:table-column-type (first user-slots))
            +;; (:VARCHAR 64)
            +
            + +

            Is this column nullable ?

            + +
            (mito.class.column:table-column-not-null-p
            +  (first user-slots))
            +;; T
            +(mito.class.column:table-column-not-null-p
            +  (second user-slots))
            +;; NIL
            +
            + +

            Testing

            + +

            We don’t want to test DB operations against the production one. We +need to create a temporary DB before each test.

            + +

            The macro below creates a temporary DB with a random name, creates the +tables, runs the code and connects back to the original DB connection.

            + +
            (defpackage my-test.utils
            +  (:use :cl)
            +  (:import-from :my.models
            +                :*db*
            +                :*db-name*
            +                :connect
            +                :ensure-tables-exist
            +                :migrate-all)
            +  (:export :with-empty-db))
            +
            +(in-package my-test.utils)
            +
            +(defun random-string (length)
            +  ;; thanks 40ants/hacrm.
            +  (let ((chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"))
            +    (coerce (loop repeat length
            +                  collect (aref chars (random (length chars))))
            +            'string)))
            +
            +(defmacro with-empty-db (&body body)
            +  "Run `body` with a new temporary DB."
            +  `(let* ((*random-state* (make-random-state t))
            +          (prefix (concatenate 'string
            +                               (random-string 8)
            +                               "/"))
            +          ;; Save our current DB connection.
            +          (connection mito:*connection*))
            +     (uiop:with-temporary-file (:pathname name :prefix prefix)
            +       ;; Bind our *db-name* to a new name, so as to create a new DB.
            +       (let* ((*db-name* name))
            +         ;; Always re-connect to our real DB even in case of error in body.
            +         (unwind-protect
            +           (progn
            +             ;; our functions to connect to the DB, create the tables and run the migrations.
            +             (connect)
            +             (ensure-tables-exist)
            +             (migrate-all)
            +             ,@body)
            +
            +           (setf mito:*connection* connection))))))
            +
            + +

            Use it like this:

            + +
            (prove:subtest "Creation in a temporary DB."
            +  (with-empty-db
            +    (let ((user (make-user :name "Cookbook")))
            +      (save-user user)
            +
            +      (prove:is (name user)
            +                "Cookbook"
            +                "Test username in a temp DB."))))
            +;; Creation in a temporary DB
            +;;  CREATE TABLE "user" (
            +;;       id BIGSERIAL NOT NULL PRIMARY KEY,
            +;;       name VARCHAR(64) NOT NULL,
            +;;       email VARCHAR(128) NOT NULL,
            +;;       created_at TIMESTAMP,
            +;;       updated_at TIMESTAMP,
            +;;       UNIQUE (email)
            +;; ) () [0 rows] | MITO.DB:EXECUTE-SQL
            +;; ✓ Test username in a temp DB.
            +
            + +

            See also

            + + + + + + +

            + Page source: databases.md +

            +
            + + + + + +
            +
            +
            + © 2002–2021 the Common Lisp Cookbook Project +
            + +
            +
            T
            O
            C
            +
            + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/dates_and_times.html b/clones/lispcookbook.github.io/cl-cookbook/dates_and_times.html new file mode 100644 index 00000000..e9a5dc2b --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/dates_and_times.html @@ -0,0 +1,582 @@ + + + + + Dates and Times + + + + + + + + + + + + + + +

            The Common Lisp Cookbook – Dates and Times

            +
            + + + + +
            +
            + +
            +
            + +
            +
            Table of Contents
            +
              +
              +
              + +
              +

              The Common Lisp Cookbook – Dates and Times

              + + +

              + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

              +

              + 📕 Get the EPUB and PDF +

              + + +
              Common Lisp provides two different ways of looking at time: universal time, +meaning time in the “real worldâ€, and run time, meaning time as seen by your +computer’s CPU. We will deal with both of them separately.

              + +

              + +

              Built-in time functions

              + +

              Universal Time

              + +

              Universal time is represented as the number of seconds that have elapsed since +00:00 of January 1, 1900 in the GMT time zone. The function +get-universal-time +returns the current universal time:

              + +
              CL-USER> (get-universal-time)
              +3220993326
              +
              + +

              Of course this value is not very readable, so you can use the function +decode-universal-time +to turn it into a “calendar time†representation:

              + +
              CL-USER> (decode-universal-time 3220993326)
              +6
              +22
              +19
              +25
              +1
              +2002
              +4
              +NIL
              +5
              +
              + +

              NB: in the next section we’ll use the local-time library to get more user-friendy functions, such as (local-time:universal-to-timestamp (get-universal-time)) which returns @2021-06-25T09:16:29.000000+02:00.

              + +

              This call to decode-universal-time returns nine values: seconds, minutes, hours, day, month, year, day of +the week, daylight savings time flag and time zone. Note that the day of the +week is represented as an integer in the range 0..6 with 0 being Monday and 6 +being Sunday. Also, the time zone is represented as the number of hours you need +to add to the current time in order to get GMT time.

              + +

              So in this example the +decoded time would be 19:22:06 of Friday, January 25, 2002, in the EST time +zone, with no daylight savings in effect. This, of course, relies on the +computer’s own clock, so make sure that it is set correctly (including the time +zone you are in and the DST flag). As a shortcut, you can use +get-decoded-time +to get the calendar time representation of the current time directly:

              + +
              CL-USER> (get-decoded-time)
              +
              + +

              is equivalent to

              + +
              CL-USER> (decode-universal-time (get-universal-time))
              +
              + +

              Here is an example of how to use these functions in a program (but frankly, use the local-time library instead):

              + +
              CL-USER> (defconstant *day-names*
              +           '("Monday" "Tuesday" "Wednesday"
              +	         "Thursday" "Friday" "Saturday"
              +	         "Sunday"))
              +*DAY-NAMES*
              +
              +CL-USER> (multiple-value-bind
              +           (second minute hour day month year day-of-week dst-p tz)
              +    	   (get-decoded-time)
              +           (format t "It is now ~2,'0d:~2,'0d:~2,'0d of ~a, ~d/~2,'0d/~d (GMT~@d)"
              +	    	 hour
              +	    	 minute
              +	    	 second
              +	    	 (nth day-of-week *day-names*)
              +	    	 month
              +	    	 day
              +	    	 year
              +	    	 (- tz)))
              +It is now 17:07:17 of Saturday, 1/26/2002 (GMT-5)
              +
              + +

              Of course the call to get-decoded-time above could be replaced by +(decode-universal-time n), where n is any integer number, to print an +arbitrary date. You can also go the other way around: the function +encode-universal-time +lets you encode a calendar time into the corresponding universal time. This +function takes six mandatory arguments (seconds, minutes, hours, day, month and +year) and one optional argument (the time zone) and it returns a universal time:

              + +
              CL-USER> (encode-universal-time 6 22 19 25 1 2002)
              +3220993326
              +
              + +

              Note that the result is automatically adjusted for daylight savings time if the time zone is not supplied. If it is supplied, than Lisp assumes that the specified time zone already accounts for daylight savings time, and no adjustment is performed.

              + +

              Since universal times are simply numbers, they are easier and safer to manipulate than calendar times. Dates and times should always be stored as universal times if possible, and only converted to string representations for output purposes. For example, it is straightforward to know which of two dates came before the other, by simply comparing the two corresponding universal times with <.

              + +

              Internal Time

              + +

              Internal time is the time as measured by your Lisp environment, using your computer’s clock. It differs from universal time in three important respects. First, internal time is not measured starting from a specified point in time: it could be measured from the instant you started your Lisp, from the instant you booted your machine, or from any other arbitrary time point in the past. As we will see shortly, the absolute value of an internal time is almost always meaningless; only differences between internal times are useful. The second difference is that internal time is not measured in seconds, but in a (usually smaller) unit whose value can be deduced from internal-time-units-per-second:

              + +
              CL-USER> internal-time-units-per-second
              +1000
              +
              + +

              This means that in the Lisp environment used in this example, internal time is measured in milliseconds.

              + +

              Finally, what is being measured by the “internal time†clock? There are actually two different internal time clocks in your Lisp:

              + +
                +
              • one of them measures the passage of “real†time (the same time that universal time measures, but in different units), and
              • +
              • the other one measures the passage of CPU time, that is, the time your CPU spends doing actual computation for the current Lisp process.
              • +
              + +

              On most modern computers these two times will be different, since your CPU will never be entirely dedicated to your program (even on single-user machines, the CPU has to devote part of its time to processing interrupts, performing I/O, etc). The two functions used to retrieve internal times are called get-internal-real-time and get-internal-run-time respectively. Using them, we can solve the above problem about measuring a function’s run time, which is what the time built-in macro does.

              + +
              CL-USER> (time (sleep 1))
              +Evaluation took:
              +  1.000 seconds of real time
              +  0.000049 seconds of total run time (0.000044 user, 0.000005 system)
              +  0.00% CPU
              +  2,594,553,447 processor cycles
              +  0 bytes consed
              +
              + +

              The local-time library

              + +

              The local-time library (GitHub) is a very handy extension to +the somewhat limited functionalities as defined by the standard.

              + +

              In particular, it can

              + +
                +
              • print timestamps in various standard or custom formats (e.g. RFC1123 or RFC3339)
              • +
              • parse timestrings,
              • +
              • perform time arithmetic,
              • +
              • convert Unix times, timestamps, and universal times to and from.
              • +
              + +

              We present below what we find the most useful functions. See its manual for the full details.

              + +

              It is available in Quicklisp:

              + +
              CL-USER> (ql:quickload "local-time")
              +
              + +

              Create timestamps (encode-timestamp, universal-to-timestamp)

              + +

              Create a timestamp with encode-timestamp, giving it its number of nanoseconds, seconds, minutes, days, months and years:

              + +
              (local-time:encode-timestamp 0 0 0 0 1 1 1984)
              +@1984-01-01T00:00:00.000000+01:00
              +
              + +

              The complete signature is:

              + +
              **encode-timestamp** nsec sec minute hour day month year &key timezone offset into
              +
              +The offset is the number of seconds offset from UTC of the locale. If offset is not specified, the offset will be guessed from the timezone. If a timestamp is passed as the into argument, its value will be set and that timestamp will be returned. Otherwise, a new timestamp is created.
              +
              + +

              Create a timestamp from a universal time with universal-to-timestamp:

              + +
              (get-universal-time)
              +3833588757
              +(local-time:universal-to-timestamp (get-universal-time))
              +@2021-06-25T07:45:59.000000+02:00
              +
              + +

              You can also parse a human-readable time string:

              + +
              (local-time:parse-timestring "1984-01-01")
              +@1984-01-01T01:00:00.000000+01:00
              +
              + +

              But see the section on parsing timestrings for more.

              + +

              Get today’s date (now, today)

              + +

              Use now or today:

              + +
              (local-time:now)
              +@2019-11-13T20:02:13.529541+01:00
              +
              +(local-time:today)
              +@2019-11-13T01:00:00.000000+01:00
              +
              + +

              “today†is the midnight of the current day in the UTC zone.

              + +

              To compute “yesterday†and “tomorrowâ€, see below.

              + +

              Add or substract times (timestamp+, timestamp-)

              + +

              Use timestamp+ and timestamp-. Each takes 3 arguments: a date, a number and a unit (and optionally a timezone and an offset):

              + +
              (local-time:now)
              +@2021-06-25T07:19:39.836973+02:00
              +
              +(local-time:timestamp+ (local-time:now) 1 :day)
              +@2021-06-26T07:16:58.086226+02:00
              +
              +(local-time:timestamp- (local-time:now) 1 :day)
              +@2021-06-24T07:17:02.861763+02:00
              +
              + +

              The available units are :sec :minute :hour :day :year.

              + +

              This operation is also possible with adjust-timestamp, which can do a bit more as we’ll see right in the next section (it can do many operations at once).

              + +
              (local-time:timestamp+ (today) 3 :day)
              +@2021-06-28T02:00:00.000000+02:00
              +
              +(local-time:adjust-timestamp (today) (offset :day 3))
              +@2021-06-28T02:00:00.000000+02:00
              +
              + +

              Here’s yesterday and tomorrow defined from today:

              + +
              (defun yesterday ()
              +  "Returns a timestamp representing the day before today."
              +  (timestamp- (today) 1 :day))
              +
              +(defun tomorrow ()
              +  "Returns a timestamp representing the day after today."
              +  (timestamp+ (today) 1 :day))
              +
              + +

              Modify timestamps with any offset (adjust-timestamp)

              + +

              adjust-timestamp’s first argument is the timestamp we operate on, and then it accepts a full &body changes where a “change†is in the form (offset :part value):

              + +

              Please point to the previous Monday:

              + +
              (local-time:adjust-timestamp (today) (offset :day-of-week :monday))
              +@2021-06-21T02:00:00.000000+02:00
              +
              + +

              We can apply many changes at once. Travel in time:

              + +
              (local-time:adjust-timestamp (today)
              +  (offset :day 3)
              +  (offset :year 110)
              +  (offset :month -1))
              +@2131-05-28T02:00:00.000000+01:00
              +
              + +

              There is a destructive version, adjust-timestamp!.

              + +

              Compare timestamps (timestamp<, timestamp<, timestamp= …)

              + +

              These should be self-explanatory.

              + +
              timestamp< time-a time-b
              +timestamp<= time-a time-b
              +timestamp> time-a time-b
              +timestamp>= time-a time-b
              +timestamp= time-a time-b
              +timestamp/= time-a time-b
              +
              + +

              Find the minimum or maximum timestamp

              + +

              Use timestamp-minimum and timestamp-maximum. They accept any number of arguments.

              + +
              (local-time:timestamp-minimum (local-time:today)
              +                              (local-time:timestamp- (local-time:today) 100 :year))
              +@1921-06-25T02:00:00.000000+01:00
              +
              + +

              If you have a list of timestamps, use (apply #'timestamp-minimum <your list of timestamps>).

              + +

              Maximize or minimize a timestamp according to a time unit (timestamp-maximize-part, timestamp-minimize-part)

              + +

              We can answer quite a number of questions with this handy function.

              + +

              Here’s an example: please give me the last day of this month:

              + +
              (let ((in-february (local-time:parse-timestring "1984-02-01")))
              +  (local-time:timestamp-maximize-part in-february :day))
              +
              +@1984-02-29T23:59:59.999999+01:00
              +
              + +

              Querying timestamp objects (get the day, the day of week, the days in month…)

              + +

              Use:

              + +
              timestamp-[year, month, day, hour, minute, second, millisecond, microsecond,
              +           day-of-week (starts at 0 for sunday),
              +           millenium, century, decade]
              +
              + +

              Get all the values at once with decode-timestamp.

              + +

              Bind a variable to a value of your choice with this convenient macro:

              + +
              (local-time:with-decoded-timestamp (:hour h)
              +     (now)
              +   (print h))
              +
              +8
              +8
              +
              + +

              You can of course bind each time unit (:sec :minute :day) to its variable, in any order.

              + +

              See also (days-in-month <month> <year>).

              + +

              Formatting time strings (format, format-timestring, +iso-8601-format+)

              + +

              local-time’s date representation starts with @. We can format them as usual, with the aesthetic directive for instance, to get a usual date representation.

              + +
              (local-time:now)
              +@2019-11-13T18:07:57.425654+01:00
              +
              + +
              (format nil "~a" (local-time:now))
              +"2019-11-13T18:08:23.312664+01:00"
              +
              + +

              We can use format-timestring, which can be used like format (thus it takes a stream as first argument):

              + +
              (local-time:format-timestring nil (local-time:now))
              +"2019-11-13T18:09:06.313650+01:00"
              +
              + +

              Here nil returns a new string. t would print to *standard-output*.

              + +

              But format-timestring also accepts a :format argument. We can use predefined date formats as well as give our own in s-expression friendly way (see next section).

              + +

              Its default value is ++iso-8601-format+, with the output shown above. The +rfc3339-format+ format defaults to it.

              + +

              With +rfc-1123-format+:

              + +
              (local-time:format-timestring nil (local-time:now) :format local-time:+rfc-1123-format+)
              +"Wed, 13 Nov 2019 18:11:38 +0100"
              +
              + +

              With +asctime-format+:

              + +
              (local-time:format-timestring nil (local-time:now) :format local-time:+asctime-format+)
              +"Wed Nov 13 18:13:15 2019"
              +
              + +

              With +iso-week-date-format+:

              + +
              (local-time:format-timestring nil (local-time:now) :format local-time:+iso-week-date-format+)
              +"2019-W46-3"
              +
              + +

              Putting all this together, here is a function that returns Unix times as a human readable string:

              + +
              (defun unix-time-to-human-string (unix-time)
              +  (local-time:format-timestring
              +   nil
              +   (local-time:unix-to-timestamp unix-time)
              +   :format local-time:+asctime-format+))
              +
              +(unix-time-to-human-string (get-universal-time))
              +"Mon Jun 25 06:46:49 2091"
              +
              + +

              Defining format strings (format-timestring (:year “-“ :month “-“ :day))

              + +

              We can pass a custom :format argument to format-timestring.

              + +

              The syntax consists of a list made of symbols with special meanings +(:year, :day…), strings and characters:

              + +
              (local-time:format-timestring nil (local-time:now) :format '(:year "-" :month "-" :day))
              +"2019-11-13"
              +
              + +

              The list of symbols is available in the documentation: https://common-lisp.net/project/local-time/manual.html#Parsing-and-Formatting

              + +

              There are :year :month :day :weekday :hour :min :sec :msec, long and +short notations (“Mondayâ€, “Mo.â€), gmt offset, timezone markers and +more.

              + +

              The +rfc-1123-format+ itself is defined like this:

              + +
              (defparameter +rfc-1123-format+
              +  ;; Sun, 06 Nov 1994 08:49:37 GMT
              +  '(:short-weekday ", " (:day 2) #\space :short-month #\space (:year 4) #\space
              +    (:hour 2) #\: (:min 2) #\: (:sec 2) #\space :gmt-offset-hhmm)
              +  "See the RFC 1123 for the details about the possible values of the timezone field.")
              +
              + +

              We see the form (:day 2): the 2 is for padding, to ensure that the +day is printed with two digits (not only 1, but 01). There could be +an optional third argument, the character with which to fill the +padding (by default, #\0).

              + +

              Parsing time strings

              + +

              Use parse-timestring to parse timestrings, in the form +2019-11-13T18:09:06.313650+01:00. It works in a variety of formats +by default, and we can change parameters to adapt it to our needs.

              + +

              To parse more formats such as “Thu Jul 23 19:42:23 2013†(asctime), +we’ll use the cl-date-time-parser library.

              + +

              The parse-timestring docstring is:

              + +
              +

              Parses a timestring and returns the corresponding timestamp. Parsing begins at start and stops at the end position. If there are invalid characters within timestring and fail-on-error is T, then an invalid-timestring error is signaled, otherwise NIL is returned.

              + +

              If there is no timezone specified in timestring then offset is used as the default timezone offset (in seconds).

              +
              + +

              Examples:

              + +
              (local-time:parse-timestring "2019-11-13T18:09:06.313650+01:00")
              +;; @2019-11-13T18:09:06.313650+01:00
              +
              + +
              (local-time:parse-timestring "2019-11-13")
              +;; @2019-11-13T01:00:00.000000+01:00
              +
              + +

              This custom format fails by default: “2019/11/13â€, but we can set the +:date-separator to “/â€:

              + +
              (local-time:parse-timestring "2019/11/13" :date-separator #\/)
              +;; @2019-11-13T19:42:32.394092+01:00
              +
              + +

              There is also a :time-separator (defaulting to #\:) and +:date-time-separator (#\T).

              + +

              Other options include:

              + +
                +
              • the start and end positions
              • +
              • fail-on-error (defaults to t)
              • +
              • (allow-missing-elements t)
              • +
              • (allow-missing-date-part allow-missing-elements)
              • +
              • (allow-missing-time-part allow-missing-elements)
              • +
              • (allow-missing-timezone-part allow-missing-elements)
              • +
              • (offset 0)
              • +
              + +

              Now a format like ““Wed Nov 13 18:13:15 2019†will fail. We’ll use the +cl-date-time-parser library:

              + +
              (cl-date-time-parser:parse-date-time "Wed Nov 13 18:13:15 2019")
              +;; 3782657595
              +;; 0
              +
              + +

              It returns the universal time which, in turn, we can ingest with the +local-time library:

              + +
              (local-time:universal-to-timestamp *)
              +;; @2019-11-13T19:13:15.000000+01:00
              +
              + +

              Misc

              + +

              To find out if it’s Alice anniversary, use timestamp-whole-year-difference time-a time-b.

              + + +

              + Page source: dates_and_times.md +

              +
              + + + + + +
              +
              +
              + © 2002–2021 the Common Lisp Cookbook Project +
              + +
              +
              T
              O
              C
              +
              + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/debugging.html b/clones/lispcookbook.github.io/cl-cookbook/debugging.html new file mode 100644 index 00000000..13b0e63e --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/debugging.html @@ -0,0 +1,560 @@ + + + + + Debugging + + + + + + + + + + + + + + +

              The Common Lisp Cookbook – Debugging

              +
              + + + + +
              +
              + +
              +
              + +
              +
              Table of Contents
              +
                +
                +
                + +
                +

                The Common Lisp Cookbook – Debugging

                + + +

                + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                +

                + 📕 Get the EPUB and PDF +

                + + +
                You entered this new world of Lisp and now wonder: how can we debug +what’s going on? How is it more interactive than other platforms? +What does the interactive debugger bring, apart from stack traces?

                + + + +

                Well of course we can use the famous technique of “print +debuggingâ€. Let’s just recap a few print functions.

                + +

                print works, it prints a readable representation of its argument, +which means what is printed can be read back in by the Lisp +reader.

                + +

                princ focuses on an aesthetic representation.

                + +

                (format t "~a" …), with the aesthetic directive, prints a string (in t, the standard output +stream) and returns nil, whereas format nil … doesn’t print anything +and returns a string. With many format controls we can print several +variables at once.

                + +

                Logging

                + +

                Logging is already a good evolution from print debugging ;)

                + +

                log4cl is the popular, +de-facto logging library but it isn’t the only one. Download it:

                + +
                (ql:quickload "log4cl")
                +
                + +

                and let’s have a dummy variable:

                + +
                (defvar *foo* '(:a :b :c))
                +
                + +

                We can use log4cl with its log nickname, then it is as simple to use as:

                + +
                (log:info *foo*)
                +;; <INFO> [13:36:49] cl-user () - *FOO*: (:A :B :C)
                +
                + +

                We can interleave strings and expressions, with or without format +control strings:

                + +
                (log:info "foo is " *foo*)
                +;; <INFO> [13:37:22] cl-user () - foo is *FOO*: (:A :B :C)
                +(log:info "foo is ~{~a~}" *foo*)
                +;; <INFO> [13:39:05] cl-user () - foo is ABC
                +
                + +

                With its companion library log4slime, we can interactively change +the log level:

                + +
                  +
                • globally
                • +
                • per package
                • +
                • per function
                • +
                • and by CLOS methods and CLOS hierarchy (before and after methods)
                • +
                + +

                It is very handy, when we have a lot of output, to turn off the +logging of functions or packages we know to work, and thus narrowing +our search to the right area. We can even save this configuration and +re-use it in another image, be it on another machine.

                + +

                We can do all this through commands, keyboard shortcuts and also through a +menu or mouse clicks.

                + +

                "changing the log level with log4slime"

                + +

                We invite you to read log4cl’s README.

                + +

                Using the powerful REPL

                + +

                Part of the joy of Lisp is the excellent REPL. Its existence usually +delays the need to use other debugging tools, if it doesn’t annihilate +them for the usual routine.

                + +

                As soon as we define a function, we can try it in the REPL. In Slime, +compile a function with C-c C-c (the whole buffer with C-c C-k), +switch to the REPL with C-c C-z and try it. Eventually enter the +package you are working on with (in-package :your-package) +or C-c ~ (slime-sync-package-and-default-directory), +(which will also change the default working directory to the package definition’s directory).

                + +

                The feedback is immediate. There is no need to recompile everything, +nor to restart any process, nor to create a main function and define +command line arguments for use in the shell (which we can of course do later on +when needed).

                + +

                We usually need to create some data to test our function(s). This is a +subsequent art of the REPL existence and it may be a new discipline +for newcomers. A trick is to write the test data alongside your +functions but below a #+nil feature test (or safer, +(or nil)) so that only you can +manually compile them:

                + +
                #+nil
                +(progn
                +   (defvar *test-data* nil)
                +   (setf *test-data* (make-instance 'foo …)))
                +
                + +

                When you load this file, *test-data* won’t exist, but you can +manually create it with C-c C-c.

                + +

                We can define tests functions like this.

                + +

                Some do similarly inside #| … |# comments.

                + +

                All that being said, keep in mind to write unit tests when time comes ;)

                + +

                Inspect and describe

                + +

                These two commands share the same goal, printing a description of an +object, inspect being the interactive one.

                + +
                (inspect *foo*)
                +
                +The object is a proper list of length 3.
                +0. 0: :A
                +1. 1: :B
                +
                +2. 2: :C
                +> q
                +
                + +

                We can also, in editors that support it, right-click on any object in +the REPL and inspect them. We are presented a screen where we can +dive deep inside the data structure and even change it.

                + +

                Let’s have a quick look with a more interesting structure, an object:

                + +
                (defclass foo ()
                +    ((a :accessor foo-a :initform '(:a :b :c))
                +     (b :accessor foo-b :initform :b)))
                +;; #<STANDARD-CLASS FOO>
                +(make-instance 'foo)
                +;; #<FOO {100F2B6183}>
                +
                + +

                We right-click on the #<FOO object and choose “inspectâ€. We are +presented an interactive pane (in Slime):

                + +
                #<FOO {100F2B6183}>
                +--------------------
                +Class: #<STANDARD-CLASS FOO>
                +--------------------
                + Group slots by inheritance [ ]
                + Sort slots alphabetically  [X]
                +
                +All Slots:
                +[ ]  A = (:A :B :C)
                +[ ]  B = :B
                +
                +[set value]  [make unbound]
                +
                + +

                When we click or press enter on the line of slot A, we inspect it further:

                + +
                #<CONS {100F5E2A07}>
                +--------------------
                +A proper list:
                +0: :A
                +1: :B
                +2: :C
                +
                + +

                The interactive debugger

                + +

                Whenever an exceptional situation happens (see +error handling), the interactive debugger pops +up.

                + +

                It presents the error message, available actions (restarts), +and the backtrace. A few remarks:

                + +
                  +
                • the restarts are programmable, we can create our own
                • +
                • in Slime, press v on a stack trace frame to view the corresponding +source file location
                • +
                • hit enter on a frame for more details
                • +
                • we can explore the functionality with the menu that should appear +in our editor. See the “break†section below for a few +more commands (eval in frame, etc).
                • +
                + +

                Compile with maximum debugging information

                + +

                Usually your compiler will optimize things out and this will reduce +the amount of information available to the debugger. For example +sometimes we can’t see intermediate variables of computations. We can +change the optimization choices with:

                + +
                (declaim (optimize (speed 0) (space 0) (debug 3)))
                +
                + +

                and recompile our code. You can achieve the same with a handy shortcut: C-u C-c C-c: the form is compiled with maximum debug settings. You can on the contrary use a negative prefix argument (M--) to compile for speed. And use a numeric argument to set the setting to it (you should read the docstring of slime-compile-defun).

                + +

                Trace

                + +

                trace allows us to see when a +function was called, what arguments it received, and the value it +returned.

                + +
                (defun factorial (n)
                +  (if (plusp n)
                +    (* n (factorial (1- n)))
                +    1))
                +
                + +
                (trace factorial)
                +
                +(factorial 2)
                +  0: (FACTORIAL 3)
                +    1: (FACTORIAL 2)
                +      2: (FACTORIAL 1)
                +        3: (FACTORIAL 0)
                +        3: FACTORIAL returned 1
                +      2: FACTORIAL returned 1
                +    1: FACTORIAL returned 2
                +  0: FACTORIAL returned 6
                +6
                +
                +(untrace factorial)
                +
                + +

                To untrace all functions, just evaluate (untrace).

                + +

                In Slime we also have the shortcut C-c M-t to trace or untrace a +function.

                + +

                If you don’t see recursive calls, that may be because of the +compiler’s optimizations. Try this before defining the function to be +traced:

                + +
                (declaim (optimize (debug 3)))
                +
                + +

                The output is printed to *trace-output* (see the CLHS).

                + +

                In Slime, we also have an interactive trace dialog with M-x +slime-trace-dialog bound to C-c T.

                + +

                Tracing method invocation

                + +

                In SBCL, we can use (trace foo :methods t) to trace the execution order of method combination (before, after, around methods). For example:

                + +
                (trace foo :methods t)
                +
                +(foo 2.0d0)
                +  0: (FOO 2.0d0)
                +    1: ((SB-PCL::COMBINED-METHOD FOO) 2.0d0)
                +      2: ((METHOD FOO (FLOAT)) 2.0d0)
                +        3: ((METHOD FOO (T)) 2.0d0)
                +        3: (METHOD FOO (T)) returned 3
                +      2: (METHOD FOO (FLOAT)) returned 9
                +      2: ((METHOD FOO :AFTER (DOUBLE-FLOAT)) 2.0d0)
                +      2: (METHOD FOO :AFTER (DOUBLE-FLOAT)) returned DOUBLE
                +    1: (SB-PCL::COMBINED-METHOD FOO) returned 9
                +  0: FOO returned 9
                +9
                +
                + +

                See the CLOS section for a tad more information.

                + +

                Step

                + +

                step is an interactive command with +similar scope than trace. This:

                + +
                (step (factorial 2))
                +
                + +

                gives an interactive pane with the available restarts:

                + +
                Evaluating call:
                +  (FACTORIAL 2)
                +With arguments:
                +  2
                +   [Condition of type SB-EXT:STEP-FORM-CONDITION]
                +
                +Restarts:
                + 0: [STEP-CONTINUE] Resume normal execution
                + 1: [STEP-OUT] Resume stepping after returning from this function
                + 2: [STEP-NEXT] Step over call
                + 3: [STEP-INTO] Step into call
                + 4: [RETRY] Retry SLIME REPL evaluation request.
                + 5: [*ABORT] Return to SLIME's top level.
                + --more--
                +
                +Backtrace:
                +  0: ((LAMBDA ()))
                +  1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LET ((SB-IMPL::*STEP-OUT* :MAYBE)) (UNWIND-PROTECT (SB-IMPL::WITH-STEPPING-ENABLED #))) #S(SB-KERNEL:LEXENV :FUNS NIL :VARS NIL :BLOCKS NIL :TAGS NIL :TYPE-RESTRICTIONS ..
                +  2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (STEP (FACTORIAL 2)) #<NULL-LEXENV>)
                +  3: (EVAL (STEP (FACTORIAL 2)))
                +
                + +

                Stepping is useful, however it may be a sign that you need to simplify your function.

                + +

                Break

                + +

                A call to break makes the program +enter the debugger, from which we can inspect the call stack.

                + +

                Breakpoints in Slime

                + +

                Look at the SLDB menu, it shows navigation keys and available +actions. Of which:

                + +
                  +
                • e (sldb-eval-in-frame) prompts for an expression and evaluates +it in the selected frame. This is how we can explore our +intermediate variables
                • +
                • d is similar with the addition of pretty printing the result
                • +
                + +

                Once we are in a frame and detect a suspicious behavior, we can even +re-compile a function at runtime and resume the program execution from +where it stopped (using the “step-continue†restart).

                + +

                Advise and watch

                + +

                advise and +watch are available in some +implementations, like CCL +(advise and +watch) +and LispWorks. They do exist in +SBCL but are not exported. advise allows to modify a function without changing its +source, or to do something before or after its execution, similar +to CLOS method combination (before, after, around methods).

                + +

                watch will signal a condition when a thread attempts to write to an +object being watched. It can be coupled with the display of the +watched objects in a GUI. +For a certain class of bugs (someone is changing this value, but I +don’t know who), this can be extremely helpful.

                + +

                Unit tests

                + +

                Last but not least, automatic testing of functions in isolation might +be what you’re looking for! See the testing section and a list of +test frameworks and libraries.

                + +

                Remote debugging

                + +

                You can have your software running on a machine over the network, +connect to it and debug it from home, from your development +environment.

                + +

                The steps involved are to start a Swank server on the remote machine (Swank is the backend companion of Slime), create an +ssh tunnel and connect to the Swank server from our editor. Then we +can browse and evaluate code on the running instance transparently.

                + +

                To test this, let’s define a function that prints forever.

                + +

                If needed, import the dependencies first:

                + +
                (ql:quickload '("swank" "bordeaux-threads"))
                +
                + +
                ;; a little common lisp swank demo
                +;; while this program is running, you can connect to it from another terminal or machine
                +;; and change the definition of doprint to print something else out!
                +
                +(require :swank)
                +(require :bordeaux-threads)
                +
                +(defparameter *counter* 0)
                +
                +(defun dostuff ()
                +  (format t "hello world ~a!~%" *counter*))
                +
                +(defun runner ()
                +  (swank:create-server :port 4006)
                +  (format t "we are past go!~%")
                +  (bt:make-thread (lambda ()
                +                    (loop repeat 5 do
                +                          (sleep 5)
                +                          (dostuff)
                +                          (incf *counter*)))
                +                  :name "do-stuff"))
                +
                +(runner)
                +
                + +

                On the server, we can run this code with

                + +
                sbcl --load demo.lisp
                +
                + +

                If you check with (bt:all-threads), you’ll see your Swank server running on port 4006, as well +as the other thread ready to do stuff:

                + +
                (#<SB-THREAD:THREAD "do-stuff" RUNNING {10027CEDC3}>
                + #<SB-THREAD:THREAD "Swank Sentinel" waiting on:
                +      #<WAITQUEUE  {10027D0003}>
                +    {10027CE8B3}>
                + #<SB-THREAD:THREAD "Swank 4006" RUNNING {10027CEB63}>
                + #<SB-THREAD:THREAD "main thread" RUNNING {1007C40393}>)
                +
                + +

                We do port forwarding on our development machine:

                + +
                ssh -L4006:127.0.0.1:4006 username@example.com
                +
                + +

                this will securely forward port 4006 on the server at example.com to +our local computer’s port 4006 (Swank only accepts connections from +localhost).

                + +

                We connect to the running Swank with M-x slime-connect, choosing localhost for the host +and port 4006.

                + +

                We can write new code:

                + +
                (defun dostuff ()
                +  (format t "goodbye world ~a!~%" *counter*))
                +(setf *counter* 0)
                +
                + +

                and eval it as usual with C-c C-c or M-x slime-eval-region for instance. The output should change.

                + +

                That’s how Ron Garret debugged the Deep Space 1 spacecraft from the earth +in 1999:

                + +
                +

                We were able to debug and fix a race condition that had not shown up during ground testing. (Debugging a program running on a $100M piece of hardware that is 100 million miles away is an interesting experience. Having a read-eval-print loop running on the spacecraft proved invaluable in finding and fixing the problem.

                +
                + +

                References

                + + + + +

                + Page source: debugging.md +

                +
                + + + + + +
                +
                +
                + © 2002–2021 the Common Lisp Cookbook Project +
                + +
                +
                T
                O
                C
                +
                + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/drafts/defmodel.lisp.html b/clones/lispcookbook.github.io/cl-cookbook/drafts/defmodel.lisp.html new file mode 100644 index 00000000..e383dd52 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/drafts/defmodel.lisp.html @@ -0,0 +1,154 @@ + + + + + A "defmodel" macro + + + + + + + + + + + + + + +

                The Common Lisp Cookbook – A "defmodel" macro

                +
                + + + + +
                +
                + +
                +
                + +
                +
                Table of Contents
                +
                  +
                  +
                  + +
                  +

                  The Common Lisp Cookbook – A "defmodel" macro

                  + + +

                  + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                  +

                  + 📕 Get the EPUB and PDF +

                  + + +
                   

                  + +
                  (defmacro defmodel (name slot-definitions)
                  +  `(progn
                  +     (defclass ,name ()
                  +       ((id :col-type serial :reader ,(symb name 'id))
                  +	,@slot-definitions)
                  +       (:metaclass dao-class)
                  +       (:keys id))
                  +     (with-connection (db-params)
                  +       (unless (table-exists-p ',name)
                  +	 (execute (dao-table-definition ',name))))
                  +     ;; Create
                  +     (defmacro ,(symb name 'create) (&rest args)
                  +       `(with-connection (db-params)
                  +	  (make-dao ',',name ,@args)))
                  +     ;; Read
                  +     (defun ,(symb name 'get-all) ()
                  +       (with-connection (db-params)
                  +	 (select-dao ',name)))
                  +     (defun ,(symb name 'get) (id)
                  +       (with-connection (db-params)
                  +	 (get-dao ',name id)))
                  +     (defmacro ,(symb name 'select) (sql-test &optional sort)
                  +       `(with-connection (db-params)
                  +	  (select-dao ',',name ,sql-test ,sort)))
                  +     ;; Update
                  +     (defun ,(symb name 'update) (,name)
                  +       (with-connection (db-params)
                  +	 (update-dao ,name)))
                  +     ;; Delete
                  +     (defun ,(symb name 'delete) (,name)
                  +       (with-connection (db-params)
                  +(delete-dao ,name)))))
                  +
                  + + +

                  + Page source: drafts/defmodel.lisp.md +

                  +
                  + + + + + +
                  +
                  +
                  + © 2002–2021 the Common Lisp Cookbook Project +
                  + +
                  +
                  T
                  O
                  C
                  +
                  + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/editor-support.html b/clones/lispcookbook.github.io/cl-cookbook/editor-support.html new file mode 100644 index 00000000..102b1338 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/editor-support.html @@ -0,0 +1,337 @@ + + + + + Editor support + + + + + + + + + + + + + + +

                  The Common Lisp Cookbook – Editor support

                  +
                  + + + + +
                  +
                  + +
                  +
                  + +
                  +
                  Table of Contents
                  +
                    +
                    +
                    + +
                    +

                    The Common Lisp Cookbook – Editor support

                    + + +

                    + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                    +

                    + 📕 Get the EPUB and PDF +

                    + + +
                    The editor of choice is still Emacs, but it is not the only one.

                    + +

                    Emacs

                    + +

                    SLIME is the Superior Lisp +Interaction Mode for Emacs. It has support for interacting with a +running Common Lisp process for compilation, debugging, documentation +lookup, cross-references, and so on. It works with many implementations.

                    + +

                    Portacle is a portable and +multi-platform Common Lisp environment. It ships Emacs, SBCL, +Quicklisp, SLIME and Git.

                    + +

                    + +

                    Installing SLIME

                    + +

                    SLIME is in the official GNU ELPA repository of Emacs Lisp packages +(in Emacs24 and forward). Install with:

                    + +
                    M-x package-install RET slime RET
                    +
                    + +

                    Since SLIME is heavily modular and the defaults only do the bare minimum (not +even the SLIME REPL), you might want to enable more features with

                    + +
                    (slime-setup '(slime-fancy slime-quicklisp slime-asdf))
                    +
                    + +

                    For more details, consult the +documentation (also available +as an Info page).

                    + +

                    Now you can run SLIME with M-x slime and/or M-x slime-connect.

                    + +

                    See also:

                    + + + +

                    Using Emacs as an IDE

                    + +

                    See “Using Emacs as an IDEâ€.

                    + +

                    Vim & Neovim

                    + +

                    Slimv is a full-blown +environment for Common Lisp inside of Vim.

                    + +

                    Vlime is a Common Lisp dev +environment for Vim (and Neovim), similar to SLIME for Emacs and SLIMV +for Vim.

                    + +

                    + +

                    cl-neovim makes it possible to write +Neovim plugins in Common Lisp.

                    + +

                    quicklisp.nvim is a Neovim +frontend for Quicklisp.

                    + +

                    Slimv_box brings Vim, SBCL, ABCL, +and tmux in a Docker container for a quick installation.

                    + +

                    Atom

                    + +

                    See SLIMA. This package +allows you to interactively develop Common Lisp code, turning +Atom into a pretty good Lisp IDE.

                    + +

                    + +

                    VSCode

                    + +

                    Alive makes +VSCode a powerful Common Lisp development. It hooks directly into the Swank +server that Emacs Slime uses and is fully compatible with VSCode’s ability to +develop remotely in containers, WSL, Remote machines, etc. It has no +dependencies beyond a version of Common Lisp on which to run the Swank server. +It can be configured to run with Quicklisp, CLPM, and Roswell. It currently +supports:

                    + +
                      +
                    • Syntax highlighting
                    • +
                    • Code completion
                    • +
                    • Code formatter
                    • +
                    • Jump to definition
                    • +
                    • Snippets
                    • +
                    • REPL integration
                    • +
                    • Interactive Debugger
                    • +
                    • REPL history
                    • +
                    • Inline evaluation
                    • +
                    • Macro expand
                    • +
                    • Disassemble
                    • +
                    • Inspector
                    • +
                    • Hover Text
                    • +
                    • Rename function args and let bindings
                    • +
                    • Code folding
                    • +
                    + +

                    + +

                    commonlisp-vscode +extension +works via the cl-lsp language server and +it’s possible to write LSP client that works in other editors. It depends +heavily on Roswell. It currently +supports:

                    + +
                      +
                    • running a REPL
                    • +
                    • evaluate code
                    • +
                    • auto indent,
                    • +
                    • code completion
                    • +
                    • go to definition
                    • +
                    • documentation on hover
                    • +
                    + +

                    + +

                    Using VSCode with Alive

                    + +

                    See Using VSCode with Alive.

                    + +

                    Eclipse

                    + +

                    Dandelion is a plugin for the +Eclipse IDE.

                    + +

                    Available for Windows, Mac and Linux, built-in SBCL and CLISP support +and possibility to connect other environments, interactive debugger +with restarts, macro-expansion, parenthesis matching,…

                    + +

                    + +

                    Lem

                    + +

                    Lem is an editor tailored for Common Lisp development. Once you +install it, you can start developing. Its interface resembles Emacs +and SLIME (same shortcuts). It comes with an ncurses and an Electron +frontend, and other programming modes: Python, Go, Rust, JS, Nim, +Scheme, HTML, CSS, directory mode, a vim layer, and more.

                    + +

                    + +

                    It can be started as a REPL right away in the terminal. Run it with:

                    + +
                    lem --eval "(lem-lisp-mode:start-lisp-repl t)"
                    +
                    + +

                    So you probably want a shell alias:

                    + +
                    alias ilem='lem --eval "(lem-lisp-mode:start-lisp-repl t)"'
                    +
                    + +

                    + +

                    Sublime Text

                    + +

                    Sublime Text has now good support for +Common Lisp.

                    + +

                    First install the “SublimeREPL†package and then see the options +in Tools/SublimeREPL to choose your CL implementation.

                    + +

                    Then Slyblime ships IDE-like +features to interact with the running Lisp image. It is an +implementation of SLY and it uses the same backend (SLYNK). It +provides advanced features including a debugger with stack frame +inspection.

                    + +

                    + +

                    LispWorks (proprietary)

                    + +

                    LispWorks is a Common Lisp implementation that +comes with its own Integrated Development Environment (IDE) and its share of +unique features, such as the CAPI GUI toolkit. It is proprietary and +provides a free limited version.

                    + +

                    You can read our LispWorks review here.

                    + +

                    + +

                    Geany (experimental)

                    + +

                    Geany-lisp is an experimental +lisp mode for the Geany editor. It features completion of symbols, +smart indenting, jump to definition, compilation of the current file and +highlighting of errors and warnings, a REPL, and a project skeleton creator.

                    + +

                    + +

                    Notebooks

                    + +

                    common-lisp-jupyter is a Common Lisp +kernel for Jupyter notebooks.

                    + +

                    You can see a live Jupyter notebook written in Lisp here. It is easy to install (Roswell, repo2docker and Docker recipes).

                    + +

                    + +

                    There is also Darkmatter, a notebook-style +Common Lisp environment, built in Common Lisp.

                    + +

                    REPLs

                    + +

                    cl-repl is an ipython-like REPL. It supports symbol completion, magic and shell commands, editing command in a file and a simple debugger.

                    + +

                    You might also like sbcli, an even simpler REPL with readline capabilities. It handles errors gracefully instead of showing a debugger.

                    + +

                    + +

                    Others

                    + +

                    There are some more editors out there, more or less discontinued, and +free versions of other Lisp vendors, such as Allegro CL.

                    + + +

                    + Page source: editor-support.md +

                    +
                    + + + + + +
                    +
                    +
                    + © 2002–2021 the Common Lisp Cookbook Project +
                    + +
                    +
                    T
                    O
                    C
                    +
                    + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/emacs-ide.html b/clones/lispcookbook.github.io/cl-cookbook/emacs-ide.html new file mode 100644 index 00000000..3fdda194 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/emacs-ide.html @@ -0,0 +1,1051 @@ + + + + + Emacs + + + + + + + + + + + + + + +

                    The Common Lisp Cookbook – Emacs

                    +
                    + + + + +
                    +
                    + +
                    +
                    + +
                    +
                    Table of Contents
                    +
                      +
                      +
                      + +
                      +

                      The Common Lisp Cookbook – Emacs

                      + + +

                      + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                      +

                      + 📕 Get the EPUB and PDF +

                      + + +
                      Using Emacs as an IDE + +

                      This page is meant to provide an introduction to using Emacs as a Lisp IDE.

                      + +

                      + +

                      Note: Portacle is a +portable and multi-platform CL development environment, a +straightforward way to get going.

                      + +

                      + +

                      Why Use Emacs?

                      + +
                        +
                      • Emacs has fantastic support for working with Lisp code
                      • +
                      • Not tying yourself into a single CL vendor’s editor
                      • +
                      • Runs on virtually every OS and CL implementation
                      • +
                      • Extensible: awesome-emacs.
                      • +
                      • Can be customized to do many common tasks
                      • +
                      • Built-in support for different source code version control systems
                      • +
                      • Vast number of add-on packages
                      • +
                      • Emacs will probably always be around
                      • +
                      • Emacs works well either with a mouse or without a mouse
                      • +
                      • Emacs works well either in GUI mode or in the terminal
                      • +
                      • Emacs has a large user base with multiple newsgroups
                      • +
                      • Benefits of using Emacs far outweigh the effort spent in learning it
                      • +
                      • Because Org-mode
                      • +
                      • Because Magit
                      • +
                      • Because Emacs Rocks !
                      • +
                      + +

                      + +

                      Emacs Lisp vs Common Lisp

                      + +
                        +
                      • Learning Emacs Lisp is useful and similar (but different from CL): +
                          +
                        • Dynamic scope is everywhere
                        • +
                        • There are no reader (or reader-related) functions
                        • +
                        • Does not support all the types that are supported in CL
                        • +
                        • Incomplete implementation of CLOS (with the add-on EIEIO package)
                        • +
                        • Not all of CL is supported
                        • +
                        • No numerical tower support
                        • +
                        +
                      • +
                      • Some good Emacs Lisp learning resources: + +
                      • +
                      + +

                      + +

                      SLIME: Superior Lisp Interaction Mode for Emacs

                      + +

                      SLIME is the goto major mode +for CL programming.

                      + +
                        +
                      • Pros: +
                          +
                        • Provides REPL which is hooked to implementation directly in Emacs
                        • +
                        • Has integrated Common Lisp debugger with Emacs interface
                        • +
                        • Interactive object-inspector in Emacs buffer
                        • +
                        • Has its own minor mode which enhances lisp-mode in many ways
                        • +
                        • Supports every common Common Lisp implementation
                        • +
                        • Readily available from MELPA
                        • +
                        • Actively maintained
                        • +
                        • Symbol completion
                        • +
                        • Cross-referencing
                        • +
                        • Can perform macroexpansions
                        • +
                        +
                      • +
                      • Cons: +
                          +
                        • Installing SLIME without MELPA can be tricky
                        • +
                        +
                      • +
                      • Setup: +
                          +
                        • Installing it from MELPA is straightforward. Search package-list-packages for ‘slime’ and click to install. If MELPA is configured correctly, it will install itself and all dependencies.
                        • +
                        • Enable the desired contribs (SLIME does very little by defaults), e.g. (slime-setup '(slime-fancy slime-quicklisp slime-asdf)).
                        • +
                        • Run SLIME with M-x slime.
                        • +
                        +
                      • +
                      + +

                      Check out this video tutorial ! (and the author’s channel, full of great stuff)

                      + +
                      SLIME fancy, contrib packages and other extensions
                      + +

                      SLIME’s functionalities live in packages and so-called contrib +modules +must be loaded to add further functionalities. The default +slime-fancy includes:

                      + +
                        +
                      • slime-autodoc
                      • +
                      • slime-c-p-c
                      • +
                      • slime-editing-commands
                      • +
                      • slime-fancy-inspector
                      • +
                      • slime-fancy-trace
                      • +
                      • slime-fontifying-fu
                      • +
                      • slime-fuzzy
                      • +
                      • slime-mdot-fu
                      • +
                      • slime-macrostep
                      • +
                      • slime-presentations
                      • +
                      • slime-references
                      • +
                      • slime-repl
                      • +
                      • slime-scratch
                      • +
                      • slime-package-fu
                      • +
                      • slime-trace-dialog
                      • +
                      + +

                      SLIME also has some nice extensions like +Helm-SLIME which features, among +others

                      +
                        +
                      • Fuzzy completion,
                      • +
                      • REPL and connection listing,
                      • +
                      • Fuzzy-search of the REPL history,
                      • +
                      • Fuzzy-search of the apropos documentation.
                      • +
                      + +
                      REPL interactions
                      + +

                      From the SLIME REPL, press , to prompt for commands. There is completion +over the available systems and packages. Examples:

                      + +
                        +
                      • ,load-system
                      • +
                      • ,reload-system
                      • +
                      • ,in-package
                      • +
                      • ,restart-inferior-lisp
                      • +
                      + +

                      and many more.

                      + +

                      With the slime-quicklisp contrib, you can also ,ql to list all systems +available for installation.

                      + +

                      SLY: Sylvester the Cat’s Common Lisp IDE

                      + +

                      SLY is a SLIME fork that contains +the following improvements:

                      + +
                        +
                      • Completely redesigned REPL based on Emacs’s own full-featured comint.el
                      • +
                      • Live code annotations via a new sly-stickers contrib
                      • +
                      • Consistent interactive button interface. Everything can be copied to the REPL.
                      • +
                      • Multiple inspectors with independent history
                      • +
                      • Regexp-capable M-x sly-apropos
                      • +
                      • Contribs are first class SLY citizens, enabled by default, loaded with ASDF on demand.
                      • +
                      • Support for NAMED-READTABLES, macrostep.el and quicklisp.
                      • +
                      + +

                      Finding one’s way into Emacs’ built-in documentation

                      + +

                      Emacs comes with built-in tutorials and documentation. Moreover, it is +a self-documented and self-discoverable editor, capable of introspection to let you +know about the current keybindings, to let you search about function documentation, +available variables,source code, tutorials, etc. Whenever you ask yourself questions like +“what are the available shortcuts to do x†or “what does this +keybinding really doâ€, the answer is most probably a keystroke away, +right inside Emacs. You should learn a few keybindings to be able to +discover Emacs with Emacs flawlessly.

                      + +

                      The help on the topic is here:

                      + + + +

                      The help keybindings start with either C-h or F1. Important ones are:

                      + +
                        +
                      • C-h k <keybinding>: what function does this keybinding call?
                      • +
                      • C-h f <function name>: what keybinding is linked to this function?
                      • +
                      • C-h a <topic>: show a list of commands whose name match the given topic. It accepts a keyword, a list of keywords or a regular expression.
                      • +
                      • C-h i: show the Info page, a menu of major topics.
                      • +
                      + +

                      Some Emacs packages give even more help.

                      + +

                      More help and discoverability packages

                      + +

                      Sometimes, you start typing a key sequence but you can’t remember it +completely. Or, you wonder what other keybindings are related. Comes +which-key-mode. This +packages will display all possible keybindings starting with the key(s) you just typed.

                      + +

                      For example, I know there are useful keybindings under C-x but I don’t remember which ones… I just type C-x, I wait for half a second, and which-key shows all the ones available.

                      + +

                      + +

                      Just try it with C-h too!

                      + +

                      See also Helpful, an alternative to the built-in Emacs help that provides much more contextual information.

                      + +

                      + +

                      Learn Emacs with the built-in tutorial

                      + +

                      Emacs ships its own tutorial. You should give it a look to learn the most important keybindings and concepts.

                      + +

                      Call it with M-x help-with-tutorial (where M-x is alt-x).

                      + +

                      + +

                      Working with Lisp Code

                      + +

                      In this short tutorial we’ll see how to:

                      + +
                        +
                      • edit Lisp code
                      • +
                      • evaluate and compile Lisp code
                      • +
                      • search Lisp code
                      • +
                      + +

                      Packages for structured editing

                      + +

                      In addition to the built-in Emacs commands, you have several packages at your disposal +that will help to keep the parens and/or the indentation balanced. +The list below is somewhat sorted by age of the +extension, according to the +history of Lisp editing:

                      + +
                        +
                      • Paredit - Paredit is a +classic. It defines the must-have commands (move, kill, split, join +a sexp,…). +(visual tutorial)
                      • +
                      • Smartparens - Smartparens +not only deals with parens but with everything that comes in pairs +(html tags,…) and thus has features for non-lispy languages.
                      • +
                      • Lispy - Lispy reimagines Paredit +with the goal to have the shortest bindings (mostly one key) that +only act depending on the point position.
                      • +
                      • Paxedit - Paxedit adds +commands based on the context (in a symbol, a sexp,… ) and puts +efforts on whitespace cleanup and context refactoring.
                      • +
                      • Parinfer - Parinfer +automatically fixes the parens depending on the indentation, or the +other way round (or both !).
                      • +
                      + +

                      We personally advice to try Parinfer and the famous Paredit, then to +go up the list. See explanations and even more on +Wikemacs.

                      + +

                      + +

                      Editing

                      + +

                      Emacs has, of course, built-in commands to deal with s-expressions.

                      + +
                      Forward/Backward/Up/Down movement and selection by s-expressions
                      + +

                      Use C-M-f and C-M-b (forward-sexp and backward-sexp) to move +in units of s-expressions.

                      + +

                      Use C-M-t to swap +the first addition sexp and the second one. Put the cursor on the open +parens of “(+ x†in defun c and press

                      + +

                      Use C-M-@ to highlight an entire sexp. Then press C-M-u to expand +the selection “upwards†and C-M-d to move forward down one level of +parentheses.

                      + +
                      Deleting s-expressions
                      + +

                      Use C-M-k (kill-sexp) and C-M-backspace (backward-kill-sexp) (but caution: this keybinding may restart the system on GNU/Linux).

                      + +

                      For example, if point is before (progn (I’ll use [] as an indication where the cursor is):

                      + +
                      (defun d ()
                      +  (if t
                      +      (+ 3 3)
                      +     [](progn
                      +        (+ 1 1)
                      +        (if t
                      +            (+ 2 2)
                      +            (+ 3 3)))
                      +      (+ 4 4)))
                      +
                      + +

                      and you press C-M-k, you get:

                      + +
                      (defun d ()
                      +  (if t
                      +      (+ 3 3)
                      +      []
                      +      (+ 4 4)))
                      +
                      + +
                      Indenting s-expressions
                      + +

                      Indentation is automatic for Lisp forms.

                      + +

                      Pressing TAB will indent incorrectly indented code. For example, put +the point at the beginning of the (+ 3 3) form and press TAB:

                      + +
                      (progn
                      +(+ 3 3))
                      +
                      + +

                      you correctly get

                      + +
                      (progn
                      +  (+ 3 3))
                      +
                      + +

                      Use C-M-q (slime-reindent-defun) to indent the current function definition:

                      + +
                      ;; Put the cursor on the open parens of "(defun ..." and press "C-M-q"
                      +;; to indent the code:
                      +(defun e ()
                      +"A badly indented function."
                      +(let ((x 20))
                      +(loop for i from 0 to x
                      +do (loop for j from 0 below 10
                      +do (print j))
                      +(if (< i 10)
                      +(let ((z nil) )
                      +(setq z (format t "x=~d" i))
                      +(print z))))))
                      +
                      +;; This is the result:
                      +
                      +(defun e ()
                      +  "A badly indented function (now correctly indented)."
                      +  (let ((x 20))
                      +    (loop for i from 0 to x
                      +       do (loop for j from 0 below 10
                      +             do (print j))
                      +         (if (< i 10)
                      +             (let ((z nil) )
                      +               (setq z (format t "x=~d" i))
                      +               (print z))))))
                      +
                      + +

                      You can also select a region and call M-x indent-region.

                      + +
                      Support for parenthesis
                      + +

                      Use M-( to insert a pair of parenthesis (()) and the same +keybinding with a prefix argument, C-u M-(, to enclose the +expression in front of the cursor with a pair of parens.

                      + +

                      For example, we start with the cursor before the first paren:

                      + +
                      CL-USER> |(- 2 2)
                      +
                      + +

                      Press C-u M-( to enclose it with parens:

                      + +
                      CL-USER> (|(- 2 2))
                      +;; now write anything.
                      +CL-USER> (zerop (- 2 2))
                      +
                      + +

                      With a numbered prefix argument (C-u 2 M-(), wrap around this number of s-expressions.

                      + +

                      Additionnaly, use M-x check-parens to spot malformed s-exps and C-c +C-] (slime-close-all-parens-in-sexp) to insert the required number +of closing parenthesis.

                      + +
                      Code completion
                      + +

                      Use the built-in C-c TAB to complete symbols in SLIME. You can get tooltips +with company-mode.

                      + +

                      + +

                      In the REPL, it’s simply TAB.

                      + +

                      Use Emacs’ hippie-expand, bound to M-/, to complete any string +present in other open buffers.

                      + +
                      Hiding/showing code
                      + +

                      Use C-x n n (narrow-to-region) and C-x n w to widen back.

                      + +

                      See also code folding.

                      + +
                      Comments
                      + +

                      Insert a comment, comment a region with M-;, adjust text with M-q.

                      + +

                      + +

                      Evaluating and Compiling Lisp in SLIME

                      + +

                      Compile the entire buffer by pressing C-c C-k (slime-compile-and-load-file).

                      + +

                      Compile a region with M-x slime-compile-region.

                      + +

                      Compile a defun by putting the cursor inside it and pressing C-c C-c (slime-compile-defun).

                      + +

                      To evaluate rather than compile:

                      + +
                        +
                      • evaluate the sexp before the point by putting the cursor after +its closing paren and pressing C-x C-e +(slime-eval-last-expression). The result is printed in the minibuffer.
                      • +
                      • similarly, use C-c C-p (slime-pprint-eval-last-expression) to eval and pretty-print the expression before point. It shows the result in a new “slime-description†window.
                      • +
                      • evaluate a region with C-c C-r,
                      • +
                      • evaluate a defun with C-M-x,
                      • +
                      • type C-c C-e (slime-interactive-eval) to get a prompt that asks for code to eval in the current context. It prints the result in the minibuffer. With a prefix argument, insert the result into the current buffer.
                      • +
                      • type C-c C-j (slime-eval-last-expression-in-repl), when the cursor is after the closing parenthesis of an expression, to send this expression to the REPL and evaluate it.
                      • +
                      + +

                      See also other commands in the menu.

                      + +
                      + +

                      EVALUATION VS COMPILATION

                      + +

                      There are a couple of pragmatic differences when choosing between compiling or evaluating. +In general, it is better to compile top-level forms, for two reasons:

                      + +
                        +
                      • Compiling a top-level form highlights warnings and errors in the editor, whereas evaluation does not.
                      • +
                      • SLIME keeps track of line-numbers of compiled forms, but when a top-level form is evaluated, the file line number information is lost. That’s problematic for code navigation afterwards.
                      • +
                      + +

                      eval is still useful to observe results from individual non top-level forms. For example, say you have this function:

                      + +
                      (defun foo ()
                      +  (let ((f (open "/home/mariano/test.lisp")))
                      +    ...))
                      +
                      + +

                      Go to the end of the OPEN expression and evaluate it (C-x C-e), to observe the result:

                      + +
                      => #<SB-SYS:FD-STREAM for "file /mnt/e6b00b8f-9dad-4bf4-bd40-34b1e6d31f0a/home/marian/test.lisp" {1003AAAB53}>
                      +
                      + +

                      Or on this example, with the cursor on the last parentheses, press C-x C-e to evaluate the let:

                      + +
                      (let ((n 20))
                      +  (loop for i from 0 below n
                      +     do (print i)))
                      +
                      + +

                      You should see numbers printed in the REPL.

                      + +

                      See also eval-in-repl to send any form to the repl.

                      + +
                      + +

                      + +

                      Searching Lisp Code

                      + +
                      Standard Emacs text search (isearch forward/backward, regexp searches, search/replace)
                      + +

                      C-s does an incremental search forward (e.g. - as each key is +the search string is entered, the source file is searched for the +first match. This can make finding specific text much quicker as +you only need to type in the unique characters. Repeat searches +(using the same search characters) can be done by repeatedly +pressing C-s

                      + +

                      C-r does an incremental search backward

                      + +

                      C-s RET and C-r RET both do conventional string searches +(forward and backward respectively)

                      + +

                      C-M-s and C-M-r both do regular expression searches (forward +and backward respectively)

                      + +

                      M-% does a search/replace while C-M-% does a regular +expression search/replace

                      + +
                      Finding occurrences (occur, grep)
                      + +

                      Use M-x grep, rgrep, occur…

                      + +

                      See also interactive versions with +helm-swoop, helm-occur, +ag.el.

                      + +
                      Go to definition
                      + +

                      Put the cursor on any symbol and press M-. (slime-edit-definition) to go to its +definition. Press M-, to come back.

                      + +
                      Go to symbol, list symbols in current source
                      + +

                      Use C-u M-. (slime-edit-definition with a prefix argument, also available as M-- M-.) to autocomplete the symbol and navigate to it. This command always asks for a symbol even if the cursor is on one. It works with any loaded definition. Here’s a little demonstration video.

                      + +

                      You can think of it as a imenu completion that always work for any Lisp symbol. Add in Slime’s fuzzy completion for maximum powerness!

                      + +
                      Crossreferencing: find who’s calling, referencing, setting a symbol
                      + +

                      Slime has nice cross-referencing facilities. For example, you can ask +what calls a particular function, what expands a macro, or where a global variable is being used.

                      + +

                      Results are presented in a new buffer, listing the places which reference a particular entity. +From there, we can press Enter to go to the corresponding source line, +or more interestingly we can recompile the place at point by pressing C-c C-c on that +line. Likewise, C-c C-k will recompile all the references. This is useful when +modifying macros, inline functions, or constants.

                      + +

                      The bindings are the following (they are also shown in Slime’s menu):

                      + +
                        +
                      • C-c C-w c (slime-who-calls) callers of a function
                      • +
                      • C-c C-w m (slime-who-macroexpands) places where a macro is expanded
                      • +
                      • C-c C-w r (slime-who-references) global variable references
                      • +
                      • C-c C-w b (slime-who-bind) global variable bindings
                      • +
                      • C-c C-w s (slime-who-sets) global variable setters
                      • +
                      • C-c C-w a (slime-who-specializes) methods specialized on a symbol
                      • +
                      + +

                      And when the slime-asdf contrib is enabled, +C-c C-w d (slime-who-depends-on) lists dependent ASDF systems

                      + +

                      And a general binding: M-? or M-_ (slime-edit-uses) combines all +of the above, it lists every kind of references.

                      + +

                      + +

                      Lisp Documentation in Emacs - Learning About Lisp Symbols

                      + +

                      Argument lists

                      + +

                      When you put the cursor on a function, SLIME will show its signature +in the minibuffer.

                      + +

                      Documentation lookup

                      + +

                      The main shortcut to know is:

                      + +
                        +
                      • C-c C-d d shows the symbols’ documentation on a new window (same result as using describe).
                      • +
                      + +

                      Other bindings which may be useful:

                      + +
                        +
                      • C-c C-d f describes a function
                      • +
                      • C-c C-d h looks up the symbol documentation in CLHS by opening the web browser. But it works only on symbols, so there are two more bindings:
                      • +
                      • C-c C-d # for reader macros
                      • +
                      • C-c C-d ~ for format directives
                      • +
                      + +

                      You can enhance the help buffer with the Slime extension slime-doc-contribs. It will show more information in a nice looking buffer.

                      + +

                      Inspect

                      + +

                      You can call (inspect 'symbol) from the REPL or call it with C-c I from a source file.

                      + +

                      Macroexpand

                      + +

                      Use C-c M-m to macroexpand a macro call

                      + +

                      Consult the CLHS offline

                      + +
                      (ql:quickload "clhs")
                      +
                      + +

                      Then add this to your Emacs configuration:

                      + +
                      (load "~/.quicklisp/clhs-use-local.el" 'noerror)
                      +
                      + +

                      Miscellaneous

                      + +

                      Synchronizing packages

                      + +

                      C-c ~ (slime-sync-package-and-default-directory): When run in a +buffer with a lisp file it will change the current package of the REPL +to the package of that file and also set the current directory of the REPL +to the parent directory of the file.

                      + +

                      Calling code

                      + +

                      C-c C-y (slime-call-defun): When the point is inside a defun and +C-c C-y is pressed,

                      + +

                      (I’ll use [] as an indication where the cursor is)

                      + +
                      (defun foo ()
                      + nil[])
                      +
                      + +

                      then (foo []) will be inserted into the REPL, so that you can write +additional arguments and run it.

                      + +

                      If foo was in a different package than the package of the REPL, +(package:foo ) or (package::foo ) will be inserted.

                      + +

                      This feature is very useful for testing a function you just wrote.

                      + +

                      That works not only for defun, but also for defgeneric, defmethod, +defmacro, and define-compiler-macro in the same fashion as for defun.

                      + +

                      For defvar, defparameter, defconstant: [] *foo* will be inserted +(the cursor is positioned before the symbol so that you can easily +wrap it into a function call).

                      + +

                      For defclass: (make-instance ‘class-name ).

                      + +

                      Inserting calls to frames in the debugger

                      + +

                      C-y in SLDB on a frame will insert a call to that frame into the REPL, e.g.,

                      + +
                      (/ 0) =>
                      +…
                      +1: (CCL::INTEGER-/-INTEGER 1 0)
                      +…
                      +
                      + +

                      C-y will insert (CCL::INTEGER-/-INTEGER 1 0).

                      + +

                      (thanks to Slime tips)

                      + +

                      Exporting symbols

                      + +

                      C-c x (slime-export-symbol-at-point) from the slime-package-fu +contrib: takes the symbol at point and modifies the :export clause of +the corresponding defpackage form. It also exports the symbol. When +called with a negative argument (C-u C-c x) it will remove the symbol +from :export and unexport it.

                      + +

                      M-x slime-export-class does the same but with symbols defined +by a structure or a class, like accessors, constructors, and so on. +It works on structures only on SBCL and Clozure CL so far. +Classes should work everywhere with MOP.

                      + +

                      Customization

                      + +

                      There are different styles of how symbols are presented in +defpackage, the default is to use uninterned symbols (#:foo). +This can be changed:

                      + +

                      to use keywords:

                      + +
                      (setq slime-export-symbol-representation-function
                      +      (lambda (n) (format ":%s" n)))
                      +
                      + +

                      or strings:

                      + +
                      (setq slime-export-symbol-representation-function
                      + (lambda (n) (format "\"%s\"" (upcase n))))
                      +
                      + +

                      Project Management

                      + +

                      ASDF is the de-facto build facility. It is shipped in most Common Lisp implementations.

                      + + + +

                      Searching Quicklisp libraries

                      + +

                      From the REPL, we can use ,ql to install a package known by name already.

                      + +

                      In addition, we can use the Quicklisp-systems Slime extension to search, browse and load Quicklisp systems from Emacs.

                      + +

                      Questions/Answers

                      + +

                      utf-8 encoding

                      + +

                      You might want to set this to your init file:

                      + +
                      (set-language-environment "UTF-8")
                      +(setenv "LC_CTYPE" "en_US.UTF-8")
                      +
                      + +

                      and for Sly:

                      + +
                      (setq sly-lisp-implementations
                      +          '((sbcl ("/usr/local/bin/sbcl") :coding-system utf-8-unix)
                      +            ))
                      +
                      + +

                      This will avoid getting ascii stream decoding errors when you have +non-ascii characters in files you evaluate with SLIME.

                      + +

                      Default cut/copy/paste keybindings

                      + +

                      I am so used to C-c, C-v and friends to copy and paste text that +the default Emacs shortcuts don’t make any sense to me.

                      + +

                      Luckily, you have a solution! Install cua-mode and you can continue to use these shortcuts.

                      + +
                      ;; C-z=Undo, C-c=Copy, C-x=Cut, C-v=Paste (needs cua.el)
                      +(require 'cua) (CUA-mode t)
                      +
                      + +

                      Appendix

                      + +

                      All Slime REPL shortcuts

                      + +

                      Here is the reference of all Slime shortcuts that work in the REPL.

                      + +

                      To see them, go in a REPL, type C-h m and go to the Slime REPL map section.

                      + +
                      REPL mode defined in ‘slime-repl.el’:
                      +Major mode for interacting with a superior Lisp.
                      +key             binding
                      +---             -------
                      +
                      +C-c             Prefix Command
                      +C-j             slime-repl-newline-and-indent
                      +RET             slime-repl-return
                      +C-x             Prefix Command
                      +ESC             Prefix Command
                      +SPC             slime-space
                      +  (that binding is currently shadowed by another mode)
                      +,               slime-handle-repl-shortcut
                      +DEL             backward-delete-char-untabify
                      +<C-down>        slime-repl-forward-input
                      +<C-return>      slime-repl-closing-return
                      +<C-up>          slime-repl-backward-input
                      +<return>        slime-repl-return
                      +
                      +C-x C-e         slime-eval-last-expression
                      +
                      +C-c C-c         slime-interrupt
                      +C-c C-n         slime-repl-next-prompt
                      +C-c C-o         slime-repl-clear-output
                      +C-c C-p         slime-repl-previous-prompt
                      +C-c C-s         slime-complete-form
                      +C-c C-u         slime-repl-kill-input
                      +C-c C-z         other-window
                      +C-c ESC         Prefix Command
                      +C-c I           slime-repl-inspect
                      +
                      +M-RET           slime-repl-closing-return
                      +M-n             slime-repl-next-input
                      +M-p             slime-repl-previous-input
                      +M-r             slime-repl-previous-matching-input
                      +M-s             previous-line
                      +
                      +C-c C-z         run-lisp
                      +  (that binding is currently shadowed by another mode)
                      +
                      +C-M-x           lisp-eval-defun
                      +
                      +C-M-q           indent-sexp
                      +
                      +C-M-q           prog-indent-sexp
                      +  (that binding is currently shadowed by another mode)
                      +
                      +C-c M-e         macrostep-expand
                      +C-c M-i         slime-fuzzy-complete-symbol
                      +C-c M-o         slime-repl-clear-buffer
                      +
                      + +

                      All other Slime shortcuts

                      + +

                      Here are all the default keybindings defined by Slime mode.

                      + +

                      To see them, go in a .lisp file, type C-h m and go to the Slime section.

                      + +
                      Commands to compile the current buffer’s source file and visually
                      +highlight any resulting compiler notes and warnings:
                      +C-c C-k	- Compile and load the current buffer’s file.
                      +C-c M-k	- Compile (but not load) the current buffer’s file.
                      +C-c C-c	- Compile the top-level form at point.
                      +
                      +Commands for visiting compiler notes:
                      +M-n	- Goto the next form with a compiler note.
                      +M-p	- Goto the previous form with a compiler note.
                      +C-c M-c	- Remove compiler-note annotations in buffer.
                      +
                      +Finding definitions:
                      +M-.
                      +- Edit the definition of the function called at point.
                      +M-,
                      +- Pop the definition stack to go back from a definition.
                      +
                      +Documentation commands:
                      +C-c C-d C-d	- Describe symbol.
                      +C-c C-d C-a	- Apropos search.
                      +C-c M-d	- Disassemble a function.
                      +
                      +Evaluation commands:
                      +C-M-x	- Evaluate top-level from containing point.
                      +C-x C-e	- Evaluate sexp before point.
                      +C-c C-p	- Evaluate sexp before point, pretty-print result.
                      +
                      +Full set of commands:
                      +key             binding
                      +---             -------
                      +
                      +C-c             Prefix Command
                      +C-x             Prefix Command
                      +ESC             Prefix Command
                      +SPC             slime-space
                      +
                      +C-c C-c         slime-compile-defun
                      +C-c C-j         slime-eval-last-expression-in-repl
                      +C-c C-k         slime-compile-and-load-file
                      +C-c C-s         slime-complete-form
                      +C-c C-y         slime-call-defun
                      +C-c ESC         Prefix Command
                      +C-c C-]         slime-close-all-parens-in-sexp
                      +C-c x           slime-export-symbol-at-point
                      +C-c ~           slime-sync-package-and-default-directory
                      +
                      +C-M-a           slime-beginning-of-defun
                      +C-M-e           slime-end-of-defun
                      +M-n             slime-next-note
                      +M-p             slime-previous-note
                      +
                      +C-M-,           slime-previous-location
                      +C-M-.           slime-next-location
                      +
                      +C-c TAB         completion-at-point
                      +C-c RET         slime-expand-1
                      +C-c C-p         slime-pprint-eval-last-expression
                      +C-c C-u         slime-undefine-function
                      +C-c ESC         Prefix Command
                      +
                      +C-c C-b         slime-interrupt
                      +C-c C-d         slime-doc-map
                      +C-c C-e         slime-interactive-eval
                      +C-c C-l         slime-load-file
                      +C-c C-r         slime-eval-region
                      +C-c C-t         slime-toggle-fancy-trace
                      +C-c C-v         Prefix Command
                      +C-c C-w         slime-who-map
                      +C-c C-x         Prefix Command
                      +C-c C-z         slime-switch-to-output-buffer
                      +C-c ESC         Prefix Command
                      +C-c :           slime-interactive-eval
                      +C-c <           slime-list-callers
                      +C-c >           slime-list-callees
                      +C-c E           slime-edit-value
                      +C-c I           slime-inspect
                      +
                      +C-x C-e         slime-eval-last-expression
                      +C-x 4           Prefix Command
                      +C-x 5           Prefix Command
                      +
                      +C-M-x           slime-eval-defun
                      +M-,             slime-pop-find-definition-stack
                      +M-.             slime-edit-definition
                      +M-?             slime-edit-uses
                      +M-_             slime-edit-uses
                      +
                      +C-c M-c         slime-remove-notes
                      +C-c M-e         macrostep-expand
                      +C-c M-i         slime-fuzzy-complete-symbol
                      +C-c M-k         slime-compile-file
                      +C-c M-q         slime-reindent-defun
                      +
                      +C-c M-m         slime-macroexpand-all
                      +
                      +C-c C-v C-d     slime-describe-presentation-at-point
                      +C-c C-v TAB     slime-inspect-presentation-at-point
                      +C-c C-v C-n     slime-next-presentation
                      +C-c C-v C-p     slime-previous-presentation
                      +C-c C-v C-r     slime-copy-presentation-at-point-to-repl
                      +C-c C-v C-w     slime-copy-presentation-at-point-to-kill-ring
                      +C-c C-v ESC     Prefix Command
                      +C-c C-v SPC     slime-mark-presentation
                      +C-c C-v d       slime-describe-presentation-at-point
                      +C-c C-v i       slime-inspect-presentation-at-point
                      +C-c C-v n       slime-next-presentation
                      +C-c C-v p       slime-previous-presentation
                      +C-c C-v r       slime-copy-presentation-at-point-to-repl
                      +C-c C-v w       slime-copy-presentation-at-point-to-kill-ring
                      +C-c C-v C-SPC   slime-mark-presentation
                      +
                      +C-c C-w C-a     slime-who-specializes
                      +C-c C-w C-b     slime-who-binds
                      +C-c C-w C-c     slime-who-calls
                      +C-c C-w RET     slime-who-macroexpands
                      +C-c C-w C-r     slime-who-references
                      +C-c C-w C-s     slime-who-sets
                      +C-c C-w C-w     slime-calls-who
                      +C-c C-w a       slime-who-specializes
                      +C-c C-w b       slime-who-binds
                      +C-c C-w c       slime-who-calls
                      +C-c C-w d       slime-who-depends-on
                      +C-c C-w m       slime-who-macroexpands
                      +C-c C-w r       slime-who-references
                      +C-c C-w s       slime-who-sets
                      +C-c C-w w       slime-calls-who
                      +
                      +C-c C-d C-a     slime-apropos
                      +C-c C-d C-d     slime-describe-symbol
                      +C-c C-d C-f     slime-describe-function
                      +C-c C-d C-g     common-lisp-hyperspec-glossary-term
                      +C-c C-d C-p     slime-apropos-package
                      +C-c C-d C-z     slime-apropos-all
                      +C-c C-d #       common-lisp-hyperspec-lookup-reader-macro
                      +C-c C-d a       slime-apropos
                      +C-c C-d d       slime-describe-symbol
                      +C-c C-d f       slime-describe-function
                      +C-c C-d g       common-lisp-hyperspec-glossary-term
                      +C-c C-d h       slime-documentation-lookup
                      +C-c C-d p       slime-apropos-package
                      +C-c C-d z       slime-apropos-all
                      +C-c C-d ~       common-lisp-hyperspec-format
                      +C-c C-d C-#     common-lisp-hyperspec-lookup-reader-macro
                      +C-c C-d C-~     common-lisp-hyperspec-format
                      +
                      +C-c C-x c       slime-list-connections
                      +C-c C-x n       slime-next-connection
                      +C-c C-x p       slime-prev-connection
                      +C-c C-x t       slime-list-threads
                      +
                      +C-c M-d         slime-disassemble-symbol
                      +C-c M-p         slime-repl-set-package
                      +
                      +C-x 5 .         slime-edit-definition-other-frame
                      +
                      +C-x 4 .         slime-edit-definition-other-window
                      +
                      +C-c C-v M-o     slime-clear-presentations
                      +
                      + +

                      See also

                      + + + + +

                      + Page source: emacs-ide.md +

                      +
                      + + + + + +
                      +
                      +
                      + © 2002–2021 the Common Lisp Cookbook Project +
                      + +
                      +
                      T
                      O
                      C
                      +
                      + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/error_handling.html b/clones/lispcookbook.github.io/cl-cookbook/error_handling.html new file mode 100644 index 00000000..b4eb3b5c --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/error_handling.html @@ -0,0 +1,688 @@ + + + + + Error and exception handling + + + + + + + + + + + + + + +

                      The Common Lisp Cookbook – Error and exception handling

                      +
                      + + + + +
                      +
                      + +
                      +
                      + +
                      +
                      Table of Contents
                      +
                        +
                        +
                        + +
                        +

                        The Common Lisp Cookbook – Error and exception handling

                        + + +

                        + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                        +

                        + 📕 Get the EPUB and PDF +

                        + + +
                        Common Lisp has mechanisms for error and condition handling as found +in other languages, and can do more.

                        + +

                        What is a condition ?

                        + +
                        +

                        Just like in languages that support exception handling (Java, C++, +Python, etc.), a condition represents, for the most part, an +“exceptional†situation. However, even more so that those languages, +a condition in Common Lisp can represent a general situation where +some branching in program logic needs to take place, not +necessarily due to some error condition. Due to the highly +interactive nature of Lisp development (the Lisp image in +conjunction with the REPL), this makes perfect sense in a language +like Lisp rather than say, a language like Java or even Python, +which has a very primitive REPL. In most cases, however, we may not +need (or even allow) the interactivity that this system offers +us. Thankfully, the same system works just as well even in +non-interactive mode.

                        + +

                        z0ltan

                        +
                        + +

                        Let’s dive into it step by step. More resources are given afterwards.

                        + +

                        Ignoring all errors, returning nil

                        + +

                        Sometimes you know that a function can fail and you just want to +ignore it: use ignore-errors:

                        + +
                        (ignore-errors
                        +  (/ 3 0))
                        +; in: IGNORE-ERRORS (/ 3 0)
                        +;     (/ 3 0)
                        +;
                        +; caught STYLE-WARNING:
                        +;   Lisp error during constant folding:
                        +;   arithmetic error DIVISION-BY-ZERO signalled
                        +;   Operation was (/ 3 0).
                        +;
                        +; compilation unit finished
                        +;   caught 1 STYLE-WARNING condition
                        +NIL
                        +#<DIVISION-BY-ZERO {1008FF5F13}>
                        +
                        + +

                        We get a welcome division-by-zero warning but the code runs well and +it returns two things: nil and the condition that was signaled. We +could not choose what to return.

                        + +

                        Remember that we can inspect the condition with a right click in Slime.

                        + +

                        Catching any condition (handler-case)

                        + + + +

                        ignore-errors is built from handler-case. We can write the previous +example by catching the general error but now we can return whatever +we want:

                        + +
                        (handler-case (/ 3 0)
                        +  (error (c)
                        +    (format t "We caught a condition.~&")
                        +    (values 0 c)))
                        +; in: HANDLER-CASE (/ 3 0)
                        +;     (/ 3 0)
                        +;
                        +; caught STYLE-WARNING:
                        +;   Lisp error during constant folding:
                        +;   Condition DIVISION-BY-ZERO was signalled.
                        +;
                        +; compilation unit finished
                        +;   caught 1 STYLE-WARNING condition
                        +We caught a condition.
                        +0
                        +#<DIVISION-BY-ZERO {1004846AE3}>
                        +
                        + +

                        We also returned two values, 0 and the signaled condition.

                        + +

                        The general form of handler-case is

                        + +
                        (handler-case (code that errors out)
                        +   (condition-type (the-condition) ;; <-- optional argument
                        +      (code))
                        +   (another-condition (the-condition)
                        +       ...))
                        +
                        + +

                        We can also catch all conditions by matching t, like in a cond:

                        + +
                        (handler-case
                        +    (progn
                        +      (format t "This won't work…~%")
                        +      (/ 3 0))
                        +  (t (c)
                        +    (format t "Got an exception: ~a~%" c)
                        +    (values 0 c)))
                        +;; …
                        +;; This won't work…
                        +;; Got an exception: arithmetic error DIVISION-BY-ZERO signalled
                        +;; Operation was (/ 3 0).
                        +;; 0
                        +;; #<DIVISION-BY-ZERO {100608F0F3}>
                        +
                        + +

                        Catching a specific condition

                        + +

                        We can specify what condition to handle:

                        + +
                        (handler-case (/ 3 0)
                        +  (division-by-zero (c)
                        +    (format t "Caught division by zero: ~a~%" c)))
                        +;; …
                        +;; Caught division by zero: arithmetic error DIVISION-BY-ZERO signalled
                        +;; Operation was (/ 3 0).
                        +;; NIL
                        +
                        + +

                        This workflow is similar to a try/catch as found in other languages, but we can do more.

                        + +

                        handler-case VS handler-bind

                        + +

                        handler-case is similar to the try/catch forms that we find in +other languages.

                        + +

                        handler-bind (see the next examples), is what to use +when we need absolute control over what happens when a signal is +raised. It allows us to use the debugger and restarts, either +interactively or programmatically.

                        + +

                        If some library doesn’t catch all conditions and lets some bubble out +to us, we can see the restarts (established by restart-case) +anywhere deep in the stack, including restarts established by other +libraries that this library called. And we can see the stack +trace, with every frame that was called and, in some lisps, even see +local variables and such. Once we handler-case, we “forget†about +this, everything is unwound. handler-bind does not rewind the +stack.

                        + +

                        Before we properly see handler-bind, let’s study conditions and restarts.

                        + +

                        Defining and making conditions

                        + +

                        We define conditions with define-condition and we make (initialize) them with make-condition.

                        + +
                        (define-condition my-division-by-zero (error)
                        +  ())
                        +
                        +(make-condition 'my-division-by-zero)
                        +;; #<MY-DIVISION-BY-ZERO {1005A5FE43}>
                        +
                        + +

                        It’s better if we give more information to it when we create a condition, so let’s use slots:

                        + +
                        (define-condition my-division-by-zero (error)
                        +  ((dividend :initarg :dividend
                        +             :initform nil
                        +             :reader dividend)) ;; <-- we'll get the dividend with (dividend condition). See the CLOS tutorial if needed.
                        +  (:documentation "Custom error when we encounter a division by zero.")) ;; good practice ;)
                        +
                        + +

                        Now when we’ll “signal†or “throw†the condition in our code we’ll be +able to populate it with information to be consumed later:

                        + +
                        (make-condition 'my-division-by-zero :dividend 3)
                        +;; #<MY-DIVISION-BY-ZERO {1005C18653}>
                        +
                        + +
                        +

                        +Note: here's a quick reminder on classes, if you are not fully operational +on the Common Lisp Object System. +

                        +
                        + +
                        (make-condition 'my-division-by-zero :dividend 3)
                        +;;                                   ^^ this is the ":initarg"
                        +
                        + +

                        and :reader dividend created a generic function that is a “getter†+for the dividend of a my-division-by-zero object:

                        + +
                        (make-condition 'my-division-by-zero :dividend 3)
                        +;; #<MY-DIVISION-BY-ZERO {1005C18653}>
                        +(dividend *)
                        +;; 3
                        +
                        + +

                        an “:accessor†would be both a getter and a setter.

                        + +

                        So, the general form of define-condition looks and feels like a +regular class definition, but despite the similarities, conditions are +not standard objects.

                        + +

                        A difference is that we can’t use slot-value on slots.

                        + +

                        Signaling (throwing) conditions: error, warn, signal

                        + +

                        We can use error in two ways:

                        + +
                          +
                        • (error "some text"): signals a condition of type simple-error, and opens-up the interactive debugger.
                        • +
                        • (error 'my-error :message "We did this and that and it didn't work."): creates and throws a custom condition with its slot “message†and opens-up the interactive debugger.
                        • +
                        + +

                        With our own condition we can do:

                        + +
                        (error 'my-division-by-zero :dividend 3)
                        +;; which is a shortcut for
                        +(error (make-condition 'my-division-by-zero :dividend 3))
                        +
                        + +

                        Throwing these conditions will enter the interactive debugger, where +the user may select a restart.

                        + +

                        warn will not enter the debugger (create warning conditions by subclassing simple-warning).

                        + +

                        Use signal if you do not want to enter the debugger, but you still want to signal to the upper levels that something exceptional happened.

                        + +

                        And that can be anything. For example, it can be used to track +progress during an operation. You would create a condition with a +percent slot, signal one when progress is made, and the +higher level code would handle it and display it to the user. See the +resources below for more.

                        + +

                        Conditions hierarchy

                        + +

                        The class precedence list of simple-error is simple-error, simple-condition, error, serious-condition, condition, t.

                        + +

                        The class precedence list of simple-warning is simple-warning, simple-condition, warning, condition, t.

                        + +

                        Custom error messages (:report)

                        + +

                        So far, when throwing our error, we saw this default text in the +debugger:

                        + +
                        Condition COMMON-LISP-USER::MY-DIVISION-BY-ZERO was signalled.
                        +   [Condition of type MY-DIVISION-BY-ZERO]
                        +
                        + +

                        We can do better by giving a :report function in our condition declaration:

                        + +
                        (define-condition my-division-by-zero (error)
                        +  ((dividend :initarg :dividend
                        +             :initform nil
                        +             :accessor dividend))
                        +  ;; the :report is the message into the debugger:
                        +  (:report (lambda (condition stream)
                        +     (format stream "You were going to divide ~a by zero.~&" (dividend condition)))))
                        +
                        + +

                        Now:

                        + +
                        (error 'my-division-by-zero :dividend 3)
                        +;; Debugger:
                        +;;
                        +;; You were going to divide 3 by zero.
                        +;;    [Condition of type MY-DIVISION-BY-ZERO]
                        +
                        + +

                        Inspecting the stacktrace

                        + +

                        That’s another quick reminder, not a Slime tutorial. In the debugger, +you can inspect the stacktrace, the arguments to the function calls, +go to the erroneous source line (with v in Slime), execute code in +the context (e), etc.

                        + +

                        Often, you can edit a buggy function, compile it (with the C-c C-c +shortcut in Slime), choose the “RETRY†restart and see your code pass.

                        + +

                        All this depends on compiler options, wether it is optimized for +debugging, speed or security.

                        + +

                        See our debugging section.

                        + +

                        Restarts, interactive choices in the debugger

                        + +

                        Restarts are the choices we get in the debugger, which always has the +RETRY and ABORT ones.

                        + +

                        By handling restarts we can start over the operation as if the error +didn’t occur (as seen in the stack).

                        + +

                        Using assert’s optional restart

                        + +

                        In its simple form assert does what we know:

                        + +
                        (assert (realp 3))
                        +;; NIL = passed
                        +
                        + +

                        When the assertion fails, we are prompted into the debugger:

                        + +
                        (defun divide (x y)
                        +  (assert (not (zerop y)))
                        +  (/ x y))
                        +
                        +(divide 3 0)
                        +;; The assertion (NOT #1=(ZEROP Y)) failed with #1# = T.
                        +;;    [Condition of type SIMPLE-ERROR]
                        +;;
                        +;; Restarts:
                        +;;  0: [CONTINUE] Retry assertion.
                        +;;  1: [RETRY] Retry SLIME REPL evaluation request.
                        +;;  …
                        +
                        + +

                        It also accepts an optional parameter to offer to change values:

                        + +
                        (defun divide (x y)
                        +  (assert (not (zerop y))
                        +          (y)   ;; list of values that we can change.
                        +          "Y can not be zero. Please change it") ;; custom error message.
                        +  (/ x y))
                        +
                        + +

                        Now we get a new restart that offers to change the value of Y:

                        + +
                        (divide 3 0)
                        +;; Y can not be zero. Please change it
                        +;;    [Condition of type SIMPLE-ERROR]
                        +;;
                        +;; Restarts:
                        +;;  0: [CONTINUE] Retry assertion with new value for Y.  <--- new restart
                        +;;  1: [RETRY] Retry SLIME REPL evaluation request.
                        +;;  …
                        +
                        + +

                        and when we choose it, we are prompted for a new value in the REPL:

                        + +
                        The old value of Y is 0.
                        +Do you want to supply a new value?  (y or n) y
                        +
                        +Type a form to be evaluated:
                        +2
                        +3/2  ;; and our result.
                        +
                        + +

                        Defining restarts (restart-case)

                        + +

                        All this is good but we might want more custom choices. We can add +restarts on the top of the list by wrapping our function call inside +restart-case.

                        + +
                        (defun divide-with-restarts (x y)
                        +  (restart-case (/ x y)
                        +    (return-zero ()  ;; <-- creates a new restart called "RETURN-ZERO"
                        +      0)
                        +    (divide-by-one ()
                        +      (/ x 1))))
                        +(divide-with-restarts 3 0)
                        +
                        + +

                        In case of any error (we’ll improve on that with handler-bind), +we’ll get those two new choices at the top of the debugger:

                        + +

                        + +

                        That’s allright but let’s just write more human-friendy “reportsâ€:

                        + +
                        (defun divide-with-restarts (x y)
                        +  (restart-case (/ x y)
                        +    (return-zero ()
                        +      :report "Return 0"  ;; <-- added
                        +      0)
                        +    (divide-by-one ()
                        +      :report "Divide by 1"
                        +      (/ x 1))))
                        +(divide-with-restarts 3 0)
                        +;; Nicer restarts:
                        +;;  0: [RETURN-ZERO] Return 0
                        +;;  1: [DIVIDE-BY-ONE] Divide by 1
                        +
                        + +

                        That’s better, but we lack the ability to change an operand, as we did +with the assert example above.

                        + +

                        Changing a variable with restarts

                        + +

                        The two restarts we defined didn’t ask for a new value. To do this, we +add an :interactive lambda function to the restart, that asks for +the user a new value with the input method of its choice. Here, we’ll +use the regular read.

                        + +
                        (defun divide-with-restarts (x y)
                        +  (restart-case (/ x y)
                        +    (return-zero ()
                        +      :report "Return 0"
                        +      0)
                        +    (divide-by-one ()
                        +      :report "Divide by 1"
                        +      (/ x 1))
                        +    (set-new-divisor (value)
                        +      :report "Enter a new divisor"
                        +      ;;
                        +      ;; Ask the user for a new value:
                        +      :interactive (lambda () (prompt-new-value "Please enter a new divisor: "))
                        +      ;;
                        +      ;; and call the divide function with the new value…
                        +      ;; … possibly catching bad input again!
                        +      (divide-with-restarts x value))))
                        +
                        +(defun prompt-new-value (prompt)
                        +  (format *query-io* prompt)  ;; *query-io*: the special stream to make user queries.
                        +  (force-output *query-io*)   ;; Ensure the user sees what he types.
                        +  (list (read *query-io*)))   ;; We must return a list.
                        +
                        +(divide-with-restarts 3 0)
                        +
                        + +

                        When calling it, we are offered a new restart, we enter a new value, +and we get our result:

                        + +
                        (divide-with-restarts 3 0)
                        +;; Debugger:
                        +;;
                        +;; 2: [SET-NEW-DIVISOR] Enter a new divisor
                        +;;
                        +;; Please enter a new divisor: 10
                        +;;
                        +;; 3/10
                        +
                        + +

                        Oh, you prefer a graphical user interface? We can use the zenity +command line interface on GNU/Linux.

                        + +
                        (defun prompt-new-value (prompt)
                        +  (list
                        +   (let ((input
                        +          ;; We capture the program's output to a string.
                        +          (with-output-to-string (s)
                        +            (let* ((*standard-output* s))
                        +              (uiop:run-program `("zenity"
                        +                                  "--forms"
                        +                                  ,(format nil "--add-entry=~a" prompt))
                        +                                :output s)))))
                        +     ;; We get a string and we want a number.
                        +     ;; We could also use parse-integer, the parse-number library, etc.
                        +     (read-from-string input))))
                        +
                        + +

                        Now try again and you should get a little window asking for a new number:

                        + +

                        + +

                        That’s fun, but that’s not all. Choosing restarts manually is not always (or +often?) satisfactory. And by handling restarts we can start over the operation +as if the error didn’t occur, as seen in the stack.

                        + +

                        Calling restarts programmatically (handler-bind, invoke-restart)

                        + +

                        We have a piece of code that we know can throw conditions. Here, +divide-with-restarts can signal an error about a division by +zero. What we want to do, is our higher-level code to automatically +handle it and call the appropriate restart.

                        + +

                        We can do this with handler-bind and invoke-restart:

                        + +
                        (defun divide-and-handle-error (x y)
                        +  (handler-bind
                        +      ((division-by-zero (lambda (c)
                        +                (format t "Got error: ~a~%" c) ;; error-message
                        +                (format t "and will divide by 1~&")
                        +                (invoke-restart 'divide-by-one))))
                        +    (divide-with-restarts x y)))
                        +
                        +(divide-and-handle-error 3 0)
                        +;; Got error: arithmetic error DIVISION-BY-ZERO signalled
                        +;; Operation was (/ 3 0).
                        +;; and will divide by 1
                        +;; 3
                        +
                        + +

                        Using other restarts (find-restart)

                        + +

                        Use find-restart.

                        + +

                        find-restart 'name-of-restart will return the most recent bound +restart with the given name, or nil.

                        + +

                        Hiding and showing restarts

                        + +

                        Restarts can be hidden. In restart-case, in addition to :report +and :interactive, they also accept a :test key:

                        + +
                        (restart-case
                        +   (return-zero ()
                        +     :test (lambda ()
                        +             (some-test))
                        +    ...
                        +
                        + +

                        Handling conditions (handler-bind)

                        + +

                        We just saw a use for handler-bind.

                        + +

                        Its general form is:

                        + +
                        (handler-bind ((a-condition #'function-to-handle-it)
                        +               (another-one #'another-function))
                        +    (code that can...)
                        +    (...error out))
                        +
                        + +

                        We can study a real example with the +unix-opts library, that +parses command line arguments. It defined some conditions: +unknown-option, missing-arg and arg-parser-failed, and it is up +to us to write what to do in these cases.

                        + +
                        (handler-bind ((opts:unknown-option #'unknown-option)
                        +               (opts:missing-arg #'missing-arg)
                        +               (opts:arg-parser-failed #'arg-parser-failed))
                        +  (opts:get-opts))
                        +
                        + +

                        Our unknown-option function is simple and looks like this:

                        + +
                        (defun unknown-option (condition)
                        +  (format t "~s option is unknown.~%" (opts:option condition))
                        +  (opts:describe)
                        +  (exit)) ;; <-- we return to the command line, no debugger.
                        +
                        + +

                        it takes the condition as parameter, so we can read information from +it if needed. Here we get the name of the erroneous option with the +condition’s reader (opts:option condition).

                        + +

                        Running some code, condition or not (“finallyâ€) (unwind-protect)

                        + +

                        The “finally†part of others try/catch/finally forms is done with unwind-protect.

                        + +

                        It is the construct used in “with-“ macros, like with-open-file, +which always closes the file after it.

                        + +

                        With this example:

                        + +
                        (unwind-protect (/ 3 0)
                        +  (format t "This place is safe.~&"))
                        +
                        + +

                        We do get the interactive debugger (we didn’t use handler-bind or +anything), but our message is printed afterwards anyway.

                        + +

                        Conclusion

                        + +

                        You’re now more than ready to write some code and to dive into other resources!

                        + +

                        Resources

                        + + + +

                        See also

                        + + + + + +

                        + Page source: error_handling.md +

                        +
                        + + + + + +
                        +
                        +
                        + © 2002–2021 the Common Lisp Cookbook Project +
                        + +
                        +
                        T
                        O
                        C
                        +
                        + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/ffi.html b/clones/lispcookbook.github.io/cl-cookbook/ffi.html new file mode 100644 index 00000000..f7c2a527 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/ffi.html @@ -0,0 +1,225 @@ + + + + + Foreign Function Interfaces + + + + + + + + + + + + + + +

                        The Common Lisp Cookbook – Foreign Function Interfaces

                        +
                        + + + + +
                        +
                        + +
                        +
                        + +
                        +
                        Table of Contents
                        +
                          +
                          +
                          + +
                          +

                          The Common Lisp Cookbook – Foreign Function Interfaces

                          + + +

                          + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                          +

                          + 📕 Get the EPUB and PDF +

                          + + +
                          The ANSI Common Lisp standard doesn’t mention this topic. So almost everything that can be said here depends on your OS and your implementation.

                          + +

                          + +

                          Example: Calling ‘gethostname’ from CLISP

                          + +

                          Note: You should read the relevant chapter from the CLISP implementation notes before you proceed.

                          + +

                          int gethostname(char *name, int len) follows a typical pattern of C “outâ€-parameter convention - it expects a pointer to a buffer it’s going to fill. So you must view this parameter as either :OUT or :IN-OUT. Additionally, one must tell the function the size of the buffer. Here len is just an :IN parameter. Sometimes this will be an :IN-OUT parameter, returning the number of bytes actually filled in.

                          + +

                          So name is actually a pointer to an array of up to len characters, regardless of what the poor “char *†C prototype says, to be used like a C string (0-termination). How many elements are in the array? Luckily, in our case, you can find it out without calculating the sizeof() a C structure. It’s a hostname that will be returned. The Solaris 2.x manpage says “Host names are limited to MAXHOSTNAMELEN characters, currently 256.â€

                          + +

                          Also, in the present example, you can use allocation :ALLOCA, like you’d do in C: stack-allocate a temporary. Why make things worse when using Lisp than when using C?

                          + +

                          This yields the following useful signature for your foreign function:

                          + +
                          (ffi:def-c-call-out gethostname
                          +     (:arguments (name (ffi:c-ptr (ffi:c-array-max ffi:char 256))
                          +     :out :alloca)
                          +     (len ffi:int))
                          +     ;; (:return-type BOOLEAN) could have been used here
                          +     ;; (Solaris says it's either 0 or -1).
                          +     (:return-type ffi:int))
                          +
                          +     (defun myhostname ()
                          +     (multiple-value-bind (success name)
                          +     ;; :OUT or :IN-OUT parameters are returned via multiple values
                          +     (gethostname 256)
                          +     (if (zerop success)
                          +     (subseq name 0 (position #\null name))
                          +     (error ... ; errno may be set
                          +     ...))))
                          +     (defvar hostname (myhostname))
                          +
                          + +

                          Possibly SUBSEQ and POSITION are superfluous, thanks to C-ARRAY-MAX as opposed to C-ARRAY:

                          + +
                          (defun myhostname ()
                          +     (multiple-value-bind (success name)
                          +     ;; :out or :in-out parameters are returned via multiple values
                          +     (gethostname 256)
                          +     (if (zerop success) name
                          +     (error ... ; errno may be set
                          +     ...))))
                          +
                          + +

                          + +

                          Example: Calling ‘gethostname’ from Allegro CL

                          + +

                          This is how the same example above would be written in Allegro Common Lisp version 6 and above. ACL doesn’t explicitly distinguish between input and output arguments. The way to declare an argument as output (i.e., modifiable by C) is to use an array, since arrays are passed by reference and C therefore receives a pointer to a memory location (which is what it expects). In this case things are made even easier by the fact that gethostname() expects an array of char, and a SIMPLE-ARRAY of CHARACTER represents essentially the same thing in Lisp. The foreign function definition is therefore the following:

                          + +
                          (def-foreign-call (c-get-hostname "gethostname")
                          +     ((name (* :char) (simple-array 'character (*)))
                          +     (len :int integer))
                          +     :returning :int)
                          +
                          + +

                          Let’s read this line by line: this form defines a Lisp function called C-GET-HOSTNAME that calls the C function gethostname(). It takes two arguments: the first one, called NAME, is a pointer to a char (*char in C), and a SIMPLE-ARRAY of characters in Lisp; the second one is called LEN, and is an integer. The function returns an integer value.

                          + +

                          And now the Lisp side:

                          + +
                          (defun get-hostname ()
                          +     (let* ((name (make-array 256 :element-type 'character))
                          +     (result (c-get-hostname name 256)))
                          +     (if (zerop result)
                          +     (let ((pos (position #\null name)))
                          +     (subseq name 0 pos))
                          +     (error "gethostname() failed."))))
                          +
                          + +

                          This function creates the NAME array, calls C-GET-HOSTNAME to fill it and then checks the returned value. If the value is zero, then the call was successful, and we return the contents of NAME up to the first 0 character (the string terminator in C), otherwise we signal an error. Note that, unlike the previous example, we allocate the string in Lisp, and we rely on the Lisp garbage collector to get rid of it after the function terminates. Here is a usage example:

                          + +
                          * (get-hostname)
                          +     "terminus"
                          +
                          + +

                          Working with strings is, in general, easier than the previous example showed. Let’s say you want to call getenv() from Lisp to access the value of an environment variable. getenv() takes a string argument (the variable name) and returns another string (the variable value). To be more precise, the argument is a pointer to a sequence of characters that should have been allocated by the caller, and the return value is a pointer to an already-existing sequence of chars (in the environment). Here is the definition of C-GETENV:

                          + +
                          (def-foreign-call (c-getenv "getenv")
                          +     ((var (* :char) string))
                          +     :returning :int
                          +     :strings-convert t)
                          +
                          + +

                          The argument in this case is still a pointer to char in C, but we can declare it a STRING to Lisp. The return value is a pointer, so we declare it as integer. Finally, the :STRINGS-CONVERT keyword argument specifies that ACL should automatically translate the Lisp string passed as the first argument into a C string. Here is how it’s used:

                          + +
                          * (c-getenv "SHELL")
                          +     -1073742215
                          +
                          + +

                          If you are surprised by the return value, just remember that C-GETENV returns a pointer, and we must tell Lisp how to interpret the contents of the memory location pointed to by it. Since in this case we know that it will point to a C string, we can use the FF:NATIVE-TO-STRING function to convert it to a Lisp string:

                          + +
                          * (native-to-string (c-getenv "SHELL"))
                          +     "/bin/tcsh"
                          +     9
                          +     9
                          +
                          + +

                          (The second and third values are the number of characters and bytes copied, respectively). One caveat: if you ask for the value of a non-existent variable, C-GETENV will return 0, and NATIVE-TO-STRING will fail. So a safer example would be:

                          + +
                          * (let ((ptr (c-getenv "NOSUCHVAR")))
                          +     (unless (zerop ptr)
                          +     (native-to-string ptr)))
                          +     NIL
                          +
                          + + +

                          + Page source: ffi.md +

                          +
                          + + + + + +
                          +
                          +
                          + © 2002–2021 the Common Lisp Cookbook Project +
                          + +
                          +
                          T
                          O
                          C
                          +
                          + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/files.html b/clones/lispcookbook.github.io/cl-cookbook/files.html new file mode 100644 index 00000000..4a0ba879 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/files.html @@ -0,0 +1,745 @@ + + + + + Files and Directories + + + + + + + + + + + + + + +

                          The Common Lisp Cookbook – Files and Directories

                          +
                          + + + + +
                          +
                          + +
                          +
                          + +
                          +
                          Table of Contents
                          +
                            +
                            +
                            + +
                            +

                            The Common Lisp Cookbook – Files and Directories

                            + + +

                            + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                            +

                            + 📕 Get the EPUB and PDF +

                            + + +
                            We’ll see here a handful of functions and libraries to operate on files and directories.

                            + +

                            In this chapter, we use mainly +namestrings +to +specify filenames. +In a recipe or two we also use +pathnames.

                            + +

                            Many functions will come from UIOP, so we suggest you have a look directly at it:

                            + + + +

                            Of course, do not miss:

                            + + + +

                            Testing whether a file exists

                            + +

                            Use the function +probe-file +which will return a +generalized boolean - +either nil if the file doesn’t exists, or its +truename +(which might be different from the argument you supplied).

                            + +

                            For more portability, use uiop:probe-file* or uiop:file-exists-p +which will return the file pathname (if it exists).

                            + +
                            $ ln -s /etc/passwd foo
                            +
                            +* (probe-file "/etc/passwd")
                            +#p"/etc/passwd"
                            +
                            +* (probe-file "foo")
                            +#p"/etc/passwd"
                            +
                            +* (probe-file "bar")
                            +NIL
                            +
                            + +

                            Expanding a file or a directory name with a tilde (~)

                            + +

                            For portability, use uiop:native-namestring:

                            + +
                            (uiop:native-namestring "~/.emacs.d/")
                            +"/home/me/.emacs.d/"
                            +
                            + +

                            It also expand the tilde with files and directories that don’t exist:

                            + +
                            (uiop:native-namestring "~/foo987.txt")
                            +:: "/home/me/foo987.txt"
                            +
                            + +

                            On several implementations (CCL, ABCL, ECL, CLISP, LispWorks), +namestring works similarly. On SBCL, if the file or directory +doesn’t exist, namestring doesn’t expand the path but returns the +argument, with the tilde.

                            + +

                            With files that exist, you can also use truename. But, at least on +SBCL, it returns an error if the path doesn’t exist.

                            + +

                            Creating directories

                            + +

                            The function +ensure-directories-exist +creates the directories if they do not exist:

                            + +
                            (ensure-directories-exist "foo/bar/baz/")
                            +
                            + +

                            This may create foo, bar and baz. Don’t forget the trailing slash.

                            + +

                            Deleting directories

                            + +

                            Use uiop:delete-directory-tree with a pathname (#p), a trailing slash and the :validate key:

                            + +
                            ;; mkdir dirtest
                            +(uiop:delete-directory-tree #p"dirtest/" :validate t)
                            +
                            + +

                            You can use pathname around a string that designates a directory:

                            + +
                            (defun rmdir (path)
                            +  (uiop:delete-directory-tree (pathname path) :validate t))
                            +
                            + +

                            UIOP also has delete-empty-directory

                            + +

                            cl-fad has (fad:delete-directory-and-files "dirtest").

                            + +

                            Merging files and directories

                            + +

                            Use merge-pathnames, with one thing to note: if you want to append +directories, the second argument must have a trailing /.

                            + +

                            As always, look at UIOP functions. We have a uiop:merge-pathnames* +equivalent which fixes corner cases.

                            + +

                            So, here’s how to append a directory to another one:

                            + +
                            (merge-pathnames "otherpath" "/home/vince/projects/")
                            +;;                                             ^^ a trailing / denotes a directory.
                            +;; => #P"/home/vince/projects/otherpath"
                            +
                            + +

                            Look at the difference: if you don’t include a trailing slash to +either paths, otherpath and projects are seen as files, so otherpath is appended to the base directory containing projects:

                            + +
                            (merge-pathnames "otherpath" "/home/vince/projects")
                            +;; #P"/home/vince/otherpath"
                            +;;               ^^ no "projects", because it was seen as a file.
                            +
                            + +

                            or again, with otherpath/ (a trailing /) but projects seen as a file:

                            + +
                            (merge-pathnames "otherpath/" "/home/vince/projects")
                            +;; #P"/home/vince/otherpath/projects"
                            +;;                ^^ inserted here
                            +
                            + +

                            Get the current working directory (CWD)

                            + +

                            Use uiop/os:getcwd:

                            + +
                            (uiop/os:getcwd)
                            +;; #P"/home/vince/projects/cl-cookbook/"
                            +;;                                    ^ with a trailing slash, useful for merge-pathnames
                            +
                            + +

                            Get the current directory relative to a Lisp project

                            + +

                            Use asdf:system-relative-pathname system path.

                            + +

                            Say you are working inside mysystem. It has an ASDF system +declaration, the system is loaded in your Lisp image. This ASDF file +is somewhere on your filesystem and you want the path to src/web/. Do this:

                            + +
                            (asdf:system-relative-pathname "mysystem" "src/web/")
                            +;; => #P"/home/vince/projects/mysystem/src/web/"
                            +
                            + +

                            This will work on another user’s machine, where the system sources are located in another location.

                            + +

                            Opening a file

                            + +

                            Common Lisp has +open and +close +functions which resemble the functions of the same denominator from other +programming languages you’re probably familiar with. However, it is almost +always recommendable to use the macro +with-open-file +instead. Not only will this macro open the file for you and close it when you’re +done, it’ll also take care of it if your code leaves the body abnormally (such +as by a use of +throw). A +typical use of with-open-file looks like this:

                            + +
                            (with-open-file (str <_file-spec_>
                            +    :direction <_direction_>
                            +    :if-exists <_if-exists_>
                            +    :if-does-not-exist <_if-does-not-exist_>)
                            +  (your code here))
                            +
                            + +
                              +
                            • str is a variable which’ll be bound to the stream which is created by +opening the file.
                            • +
                            • <_file-spec_> will be a truename or a pathname.
                            • +
                            • <_direction_> is usually :input (meaning you want to read from the file), +:output (meaning you want to write to the file) or :io (which is for +reading and writing at the same time) - the default is :input.
                            • +
                            • <_if-exists_> specifies what to do if you want to open a file for writing +and a file with that name already exists - this option is ignored if you +just want to read from the file. The default is :error which means that an +error is signalled. Other useful options are :supersede (meaning that the +new file will replace the old one), :append (content is added to the file), +nil (the stream variable will be bound to nil), +and :rename (i.e. the old file is renamed).
                            • +
                            • <_if-does-not-exist_> specifies what to do if the file you want to open does +not exist. It is one of :error for signalling an error, :create for +creating an empty file, or nil for binding the stream variable to +nil. The default is, to be brief, to do the right thing depending on the +other options you provided. See the CLHS for details.
                            • +
                            + +

                            Note that there are a lot more options to with-open-file. See +the CLHS entry for open +for all the details. You’ll find some examples on how to use with-open-file +below. Also note that you usually don’t need to provide any keyword arguments if +you just want to open an existing file for reading.

                            + +

                            Reading files

                            + +

                            Reading a file into a string or a list of lines

                            + +

                            It’s quite common to need to access the contents of a file in string +form, or to get a list of lines.

                            + +

                            uiop is included in ASDF (there is no extra library to install or +system to load) and has the following functions:

                            + +
                            (uiop:read-file-string "file.txt")
                            +
                            + +

                            and

                            + +
                            (uiop:read-file-lines "file.txt")
                            +
                            + +

                            Otherwise, this can be achieved by using read-line or read-char functions, +that probably won’t be the best solution. The file might not be divided into +multiple lines or reading one character at a time might bring significant +performance problems. To solve this problems, you can read files using buckets +of specific sizes.

                            + +
                            (with-output-to-string (out)
                            +  (with-open-file (in "/path/to/big/file")
                            +    (loop with buffer = (make-array 8192 :element-type 'character)
                            +          for n-characters = (read-sequence buffer in)
                            +          while (< 0 n-characters)
                            +          do (write-sequence buffer out :start 0 :end n-characters)))))
                            +
                            + +

                            Furthermore, you’re free to change the format of the read/written data, instead +of using elements of type character every time. For instance, you can set +:element-type type argument of with-output-to-string, with-open-file and +make-array functions to '(unsigned-byte 8) to read data in octets.

                            + +

                            Reading with an utf-8 encoding

                            + +

                            To avoid an ASCII stream decoding error you might want to specify an UTF-8 encoding:

                            + +
                            (with-open-file (in "/path/to/big/file"
                            +                     :external-format :utf-8)
                            +                 ...
                            +
                            + +

                            Set SBCL’s default encoding format to utf-8

                            + +

                            Sometimes you don’t control the internals of a library, so you’d +better set the default encoding to utf-8. Add this line to your +~/.sbclrc:

                            + +
                            (setf sb-impl::*default-external-format* :utf-8)
                            +
                            + +

                            and optionally

                            + +
                            (setf sb-alien::*default-c-string-external-format* :utf-8)
                            +
                            + +

                            Reading a file one line at a time

                            + +

                            read-line +will read one line from a stream (which defaults to +standard input) +the end of which is determined by either a newline character or the end of the +file. It will return this line as a string without the trailing newline +character. (Note that read-line has a second return value which is true if there +was no trailing newline, i.e. if the line was terminated by the end of the +file.) read-line will by default signal an error if the end of the file is +reached. You can inhibit this by supplying NIL as the second argument. If you do +this, read-line will return nil if it reaches the end of the file.

                            + +
                            (with-open-file (stream "/etc/passwd")
                            +  (do ((line (read-line stream nil)
                            +       (read-line stream nil)))
                            +       ((null line))
                            +       (print line)))
                            +
                            + +

                            You can also supply a third argument which will be used instead of nil to signal +the end of the file:

                            + +
                            (with-open-file (stream "/etc/passwd")
                            +  (loop for line = (read-line stream nil 'foo)
                            +   until (eq line 'foo)
                            +   do (print line)))
                            +
                            + +

                            Reading a file one character at a time

                            + +

                            read-char +is similar to read-line, but it only reads one character as opposed to one +line. Of course, newline characters aren’t treated differently from other +characters by this function.

                            + +
                            (with-open-file (stream "/etc/passwd")
                            +  (do ((char (read-char stream nil)
                            +       (read-char stream nil)))
                            +       ((null char))
                            +       (print char)))
                            +
                            + +

                            Looking one character ahead

                            + +

                            You can ‘look at’ the next character of a stream without actually removing it +from there - this is what the function +peek-char +is for. It can be used for three different purposes depending on its first +(optional) argument (the second one being the stream it reads from): If the +first argument is nil, peek-char will just return the next character that’s +waiting on the stream:

                            + +
                            CL-USER> (with-input-from-string (stream "I'm not amused")
                            +           (print (read-char stream))
                            +           (print (peek-char nil stream))
                            +           (print (read-char stream))
                            +           (values))
                            +
                            +#\I
                            +#\'
                            +#\'
                            +
                            + +

                            If the first argument is T, peek-char will skip +whitespace +characters, i.e. it will return the next non-whitespace character that’s waiting +on the stream. The whitespace characters will vanish from the stream as if they +had been read by read-char:

                            + +
                            CL-USER> (with-input-from-string (stream "I'm not amused")
                            +           (print (read-char stream))
                            +           (print (read-char stream))
                            +           (print (read-char stream))
                            +           (print (peek-char t stream))
                            +           (print (read-char stream))
                            +           (print (read-char stream))
                            +           (values))
                            +
                            +#\I
                            +#\'
                            +#\m
                            +#\n
                            +#\n
                            +#\o
                            +
                            + +

                            If the first argument to peek-char is a character, the function will skip all +characters until that particular character is found:

                            + +
                            CL-USER> (with-input-from-string (stream "I'm not amused")
                            +           (print (read-char stream))
                            +           (print (peek-char #\a stream))
                            +           (print (read-char stream))
                            +           (print (read-char stream))
                            +           (values))
                            +
                            +#\I
                            +#\a
                            +#\a
                            +#\m
                            +
                            + +

                            Note that peek-char has further optional arguments to control its behaviour on +end-of-file similar to those for read-line and read-char (and it will signal an +error by default):

                            + +
                            CL-USER> (with-input-from-string (stream "I'm not amused")
                            +           (print (read-char stream))
                            +           (print (peek-char #\d stream))
                            +           (print (read-char stream))
                            +           (print (peek-char nil stream nil 'the-end))
                            +           (values))
                            +
                            +#\I
                            +#\d
                            +#\d
                            +THE-END
                            +
                            + +

                            You can also put one character back onto the stream with the function +unread-char. You +can use it as if, after you have read a character, you decide that you’d +better used peek-char instead of read-char:

                            + +
                            CL-USER> (with-input-from-string (stream "I'm not amused")
                            +           (let ((c (read-char stream)))
                            +             (print c)
                            +             (unread-char c stream)
                            +             (print (read-char stream))
                            +             (values)))
                            +
                            +#\I
                            +#\I
                            +
                            + +

                            Note that the front of a stream doesn’t behave like a stack: You can only put +back exactly one character onto the stream. Also, you must put back the same +character that has been read previously, and you can’t unread a character if +none has been read before.

                            + +

                            Random access to a File

                            + +

                            Use the function +file-position +for random access to a file. If this function is used with one argument (a +stream), it will return the current position within the stream. If it’s used +with two arguments (see below), it will actually change the +file position +in the stream.

                            + +
                            CL-USER> (with-input-from-string (stream "I'm not amused")
                            +           (print (file-position stream))
                            +           (print (read-char stream))
                            +           (print (file-position stream))
                            +           (file-position stream 4)
                            +           (print (file-position stream))
                            +           (print (read-char stream))
                            +           (print (file-position stream))
                            +           (values))
                            +
                            +0
                            +#\I
                            +1
                            +4
                            +#\n
                            +5
                            +
                            + +

                            Writing content to a file

                            + +

                            With with-open-file, specify :direction :output and use write-sequence inside:

                            + +
                            (with-open-file (f <pathname> :direction :output
                            +                              :if-exists :supersede
                            +                              :if-does-not-exist :create)
                            +    (write-sequence s f))
                            +
                            + +

                            If the file exists, you can also :append content to it.

                            + +

                            If it doesn’t exist, you can :error out. See the standard for more details.

                            + +

                            Using libraries

                            + +

                            The library Alexandria +has a function called write-string-into-file

                            + +
                            (alexandria:write-string-into-file content "file.txt")
                            +
                            + +

                            Alternatively, the library str has the to-file function.

                            + +
                            (str:to-file "file.txt" content) ;; with optional options
                            +
                            + +

                            Both alexandria:write-string-into-file and str:to-file take the same keyword arguments as cl:open that controls file creation: :if-exists and if-does-not-exists.

                            + +

                            Getting the file extension

                            + +

                            The file extension is a pathname type in Lisp parlance:

                            + +
                            (pathname-type "~/foo.org")  ;; => "org"
                            +
                            + +

                            Getting file attributes (size, access time,…)

                            + +

                            Osicat (in Quicklisp) +is a lightweight operating system interface for Common Lisp on +POSIX-like systems, including Windows. With Osicat we can get and set +environment variables, manipulate files and directories, +pathnames and a bit more.

                            + +

                            Once it is installed, Osicat also defines the osicat-posix system, +which permits us to get file attributes.

                            + +
                            (ql:quickload "osicat")
                            +
                            +(let ((stat (osicat-posix:stat #P"./files.md")))
                            +  (osicat-posix:stat-size stat))  ;; => 10629
                            +
                            + +

                            We can get the other attributes with the following methods:

                            + +
                            osicat-posix:stat-dev
                            +osicat-posix:stat-gid
                            +osicat-posix:stat-ino
                            +osicat-posix:stat-uid
                            +osicat-posix:stat-mode
                            +osicat-posix:stat-rdev
                            +osicat-posix:stat-size
                            +osicat-posix:stat-atime
                            +osicat-posix:stat-ctime
                            +osicat-posix:stat-mtime
                            +osicat-posix:stat-nlink
                            +osicat-posix:stat-blocks
                            +osicat-posix:stat-blksize
                            +
                            + +

                            Listing files and directories

                            + +

                            Some functions below return pathnames, so you might need the following:

                            + +
                            (namestring #p"/foo/bar/baz.txt")           ==> "/foo/bar/baz.txt"
                            +(directory-namestring #p"/foo/bar/baz.txt") ==> "/foo/bar/"
                            +(file-namestring #p"/foo/bar/baz.txt")      ==> "baz.txt"
                            +
                            + +

                            Listing files in a directory

                            + +
                            (uiop:directory-files "./")
                            +
                            + +

                            Returns a list of pathnames:

                            + +
                            (#P"/home/vince/projects/cl-cookbook/.emacs"
                            + #P"/home/vince/projects/cl-cookbook/.gitignore"
                            + #P"/home/vince/projects/cl-cookbook/AppendixA.jpg"
                            + #P"/home/vince/projects/cl-cookbook/AppendixB.jpg"
                            + #P"/home/vince/projects/cl-cookbook/AppendixC.jpg"
                            + #P"/home/vince/projects/cl-cookbook/CHANGELOG"
                            + #P"/home/vince/projects/cl-cookbook/CONTRIBUTING.md"
                            + […]
                            +
                            + +

                            Listing sub-directories

                            + +
                            (uiop:subdirectories "./")
                            +
                            + +
                            (#P"/home/vince/projects/cl-cookbook/.git/"
                            + #P"/home/vince/projects/cl-cookbook/.sass-cache/"
                            + #P"/home/vince/projects/cl-cookbook/_includes/"
                            + #P"/home/vince/projects/cl-cookbook/_layouts/"
                            + #P"/home/vince/projects/cl-cookbook/_site/"
                            + #P"/home/vince/projects/cl-cookbook/assets/")
                            +
                            + +

                            Traversing (walking) directories

                            + +

                            See uiop/filesystem:collect-sub*directories. It takes as arguments:

                            + +
                              +
                            • a directory
                            • +
                            • a recursep function
                            • +
                            • a collectp function
                            • +
                            • a collector function
                            • +
                            + +

                            Given a directory, when collectp returns true with the directory, +call the collector function on the directory, and recurse +each of its subdirectories on which recursep returns true.

                            + +

                            This function will thus let you traverse a filesystem hierarchy, +superseding the functionality of cl-fad:walk-directory.

                            + +

                            The behavior in presence of symlinks is not portable. Use IOlib to handle such situations.

                            + +

                            Example:

                            + +
                            (defparameter *dirs* nil "All recursive directories.")
                            +
                            +(uiop:collect-sub*directories "~/cl-cookbook"
                            +    (constantly t)
                            +    (constantly t)
                            +    (lambda (it) (push it *dirs*)))
                            +
                            + +

                            With cl-fad:walk-directory, we can also collect files, not only subdirectories:

                            + +
                            (cl-fad:walk-directory "./"
                            +  (lambda (name)
                            +     (format t "~A~%" name))
                            +   :directories t)
                            +
                            + +

                            Finding files matching a pattern

                            + +

                            Below we simply list files of a directory and check that their name +contains a given string.

                            + +
                            (remove-if-not (lambda (it)
                            +                   (search "App" (namestring it)))
                            +               (uiop:directory-files "./"))
                            +
                            + +
                            (#P"/home/vince/projects/cl-cookbook/AppendixA.jpg"
                            + #P"/home/vince/projects/cl-cookbook/AppendixB.jpg"
                            + #P"/home/vince/projects/cl-cookbook/AppendixC.jpg")
                            +
                            + +

                            We used namestring to convert a pathname to a string, thus a +sequence that search can deal with.

                            + +

                            Finding files with a wildcard

                            + +

                            We can not transpose unix wildcards to portable Common Lisp.

                            + +

                            In pathname strings we can use * and ** as wildcards. This works +in absolute and relative pathnames.

                            + +
                            (directory #P"*.jpg")
                            +
                            + +
                            (directory #P"**/*.png")
                            +
                            + +

                            Change the default pathname

                            + +

                            The concept of . denoting the current directory does not exist in +portable Common Lisp. This may exist in specific filesystems and +specific implementations.

                            + +

                            Also ~ to denote the home directory does not exist. They may be +recognized by some implementations as non-portable extensions.

                            + +

                            *default-pathname-defaults*provides a default for some pathname +operations.

                            + +
                            (let ((*default-pathname-defaults* (pathname "/bin/")))
                            +          (directory "*sh"))
                            +(#P"/bin/zsh" #P"/bin/tcsh" #P"/bin/sh" #P"/bin/ksh" #P"/bin/csh" #P"/bin/bash")
                            +
                            + +

                            See also (user-homedir-pathname).

                            + + + +

                            + Page source: files.md +

                            +
                            + + + + + +
                            +
                            +
                            + © 2002–2021 the Common Lisp Cookbook Project +
                            + +
                            +
                            T
                            O
                            C
                            +
                            + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/functions.html b/clones/lispcookbook.github.io/cl-cookbook/functions.html new file mode 100644 index 00000000..ce5fad64 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/functions.html @@ -0,0 +1,740 @@ + + + + + Functions + + + + + + + + + + + + + + +

                            The Common Lisp Cookbook – Functions

                            +
                            + + + + +
                            +
                            + +
                            +
                            + +
                            +
                            Table of Contents
                            +
                              +
                              +
                              + +
                              +

                              The Common Lisp Cookbook – Functions

                              + + +

                              + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                              +

                              + 📕 Get the EPUB and PDF +

                              + + +

                              + +

                              Named functions: defun

                              + +

                              Creating named functions is done with the defun keyword. It follows this model:

                              + +
                              (defun <name> (list of arguments)
                              +  "docstring"
                              +  (function body))
                              +
                              + +

                              The return value is the value returned by the last expression of the body +(see below for more). There is no “return xx†statement.

                              + +

                              So, for example:

                              + +
                              (defun hello-world ()
                              +  ;;               ^^ no arguments
                              +  (print "hello world!"))
                              +
                              + +

                              Call it:

                              + +
                              (hello-world)
                              +;; "hello world!"  <-- output
                              +;; "hello world!"  <-- a string is returned.
                              +
                              + +

                              Arguments

                              + +

                              Base case: required arguments

                              + +

                              Add in arguments like this:

                              + +
                              (defun hello (name)
                              +  "Say hello to `name'."
                              +  (format t "hello ~a !~&" name))
                              +;; HELLO
                              +
                              + +

                              (where ~a is the most used format directive to print a variable +aesthetically and ~& prints a newline)

                              + +

                              Call the function:

                              + +
                              (hello "me")
                              +;; hello me !  <-- this is printed by `format`
                              +;; NIL         <-- return value: `format t` prints a string to standard output and returns nil.
                              +
                              + +

                              If you don’t specify the right amount of arguments, you’ll be trapped +into the interactive debugger with an explicit error message:

                              + +

                              (hello)

                              + +
                              +

                              invalid number of arguments: 0

                              +
                              + +

                              Optional arguments: &optional

                              + +

                              Optional arguments are declared after the &optional keyword in the +lambda list. They are ordered, they must appear one after another.

                              + +

                              This function:

                              + +
                              (defun hello (name &optional age gender) …)
                              +
                              + +

                              must be called like this:

                              + +
                              (hello "me") ;; a value for the required argument, zero optional arguments
                              +(hello "me" "7")  ;; a value for age
                              +(hello "me" 7 :h) ;; a value for age and gender
                              +
                              + +

                              Named parameters: &key

                              + +

                              It is not always convenient to remember the order of the arguments. It +is thus possible to supply arguments by name: we declare them using +&key <name>, we set them with :name <value> in the function call, +and we use name as a regular variable in the function body. They are +nil by default.

                              + +
                              (defun hello (name &key happy)
                              +  "If `happy' is `t', print a smiley"
                              +  (format t "hello ~a " name)
                              +  (when happy
                              +    (format t ":)~&")))
                              +
                              + +

                              The following calls are possible:

                              + +
                              (hello "me")
                              +(hello "me" :happy t)
                              +(hello "me" :happy nil) ;; useless, equivalent to (hello "me")
                              +
                              + +

                              and this is not valid: (hello "me" :happy):

                              + +
                              +

                              odd number of &KEY arguments

                              +
                              + +

                              A similar example of a function declaration, with several key parameters:

                              + +
                              (defun hello (name &key happy lisper cookbook-contributor-p) …)
                              +
                              + +

                              it can be called with zero or more key parameters, in any order:

                              + +
                              (hello "me" :lisper t)
                              +(hello "me" :lisper t :happy t)
                              +(hello "me" :cookbook-contributor-p t :happy t)
                              +
                              + +

                              Last but not least, you would quickly realize it, but we can choose the keys programmatically (they can be variables):

                              + +
                              (let ((key :happy)
                              +      (val t))
                              +  (hello "me" key val))
                              +;; hello me :)
                              +;; NIL
                              +
                              + +

                              Mixing optional and key parameters

                              + +

                              It is generally a style warning, but it is possible.

                              + +
                              (defun hello (&optional name &key happy)
                              +  (format t "hello ~a " name)
                              +  (when happy
                              +    (format t ":)~&")))
                              +
                              + +

                              In SBCL, this yields:

                              + +
                              ; in: DEFUN HELLO
                              +;     (SB-INT:NAMED-LAMBDA HELLO
                              +;         (&OPTIONAL NAME &KEY HAPPY)
                              +;       (BLOCK HELLO (FORMAT T "hello ~a " NAME) (WHEN HAPPY (FORMAT T ":)~&"))))
                              +;
                              +; caught STYLE-WARNING:
                              +;   &OPTIONAL and &KEY found in the same lambda list: (&OPTIONAL (NAME "John") &KEY
                              +;                                                      HAPPY)
                              +;
                              +; compilation unit finished
                              +;   caught 1 STYLE-WARNING condition
                              +
                              + +

                              We can call it:

                              + +
                              (hello "me" :happy t)
                              +;; hello me :)
                              +;; NIL
                              +
                              + +

                              Default values to key parameters

                              + +

                              In the lambda list, use pairs to give a default value to an optional or a key argument, like (happy t) below:

                              + +
                              (defun hello (name &key (happy t))
                              +
                              + +

                              Now happy is true by default.

                              + +

                              Was a key parameter specified?

                              + +

                              You can skip this tip for now if you want, but come back later to it as it can turn handy.

                              + +

                              We saw that a default key parameter is nil by default ((defun hello +(name &key happy) …)). But how can be distinguish between “the value +is NIL by default†and “the user wants it to be NIL�

                              + +

                              We saw how to use a tuple to set its default value:

                              + +

                              &key (:happy t)

                              + +

                              To answer our question, use a triple like this:

                              + +

                              &key (happy t happy-p)

                              + +

                              where happy-p serves as a predicate variable (using -p is only a +convention, give it the name you want) to know if the key was +supplied. If it was, then it will be T.

                              + +

                              So now, we will print a sad face if :happy was explicitely set to +NIL. We don’t print it by default.

                              + +
                              (defun hello (name &key (happy nil happy-p))
                              +  (format t "Key supplied? ~a~&" happy-p)
                              +  (format t "hello ~a " name)
                              +  (when happy-p
                              +    (if happy
                              +      (format t ":)")
                              +      (format t ":("))))
                              +
                              + +

                              Variable number of arguments: &rest

                              + +

                              Sometimes you want a function to accept a variable number of +arguments. Use &rest <variable>, where <variable> will be a list.

                              + +
                              (defun mean (x &rest numbers)
                              +    (/ (apply #'+ x numbers)
                              +       (1+ (length numbers))))
                              +
                              + +
                              (mean 1)
                              +(mean 1 2)  ;; => 3/2 (yes, it is printed as a ratio)
                              +(mean 1 2 3 4 5) ;;  => 3
                              +
                              + +

                              Defining key arguments, and allowing more: &allow-other-keys

                              + +

                              Observe:

                              + +
                              (defun hello (name &key happy)
                              +  (format t "hello ~a~&" name))
                              +
                              +(hello "me" :lisper t)
                              +;; => Error: unknown keyword argument
                              +
                              + +

                              whereas

                              + +
                              (defun hello (name &key happy &allow-other-keys)
                              +  (format t "hello ~a~&" name))
                              +
                              +(hello "me" :lisper t)
                              +;; hello me
                              +
                              + +

                              We might need &allow-other-keys when passing around arguments or +with higher level manipulation of functions.

                              + +

                              Here’s a real example. We define a function to open a file that always +uses :if-exists :supersede, but still passes any other keys to the +open function.

                              + +
                              (defun open-supersede (f &rest other-keys &key &allow-other-keys)
                              +  (apply #'open f :if-exists :supersede other-keys))
                              +
                              + +

                              In the case of a duplicated :if-exists argument, our first one takes precedence.

                              + +

                              Return values

                              + +

                              The return value of the function is the value returned by the last +executed form of the body.

                              + +

                              There are ways for non-local exits (return-from <function name> <value>), but they are usually not needed.

                              + +

                              Common Lisp has also the concept of multiple return values.

                              + +

                              Multiple return values: values, multiple-value-bind and nth-value

                              + +

                              Returning multiple values is not like returning a tuple or a list of +results ;) This is a common misconception.

                              + +

                              Multiple values are specially useful and powerful because a change in +them needs little to no refactoring.

                              + +
                              (defun foo (a b c)
                              +  a)
                              +
                              + +

                              This function returns a.

                              + +
                              (defvar *res* (foo :a :b :c))
                              +;; :A
                              +
                              + +

                              We use values to return multiple values:

                              + +
                              (defun foo (a b c)
                              +  (values a b c))
                              +
                              + +
                              (setf *res* (foo :a :b :c))
                              +;; :A
                              +
                              + +

                              Observe here that *res* is still :A.

                              + +

                              All functions that use the return value of foo need not to change, they +still work. If we had returned a list or an array, this would be +different.

                              + +

                              multiple-value-bind

                              + +

                              We destructure multiple values with multiple-value-bind (or +mvb+TAB in Slime for short) and we can get one given its position +with nth-value:

                              + +
                              (multiple-value-bind (res1 res2 res3)
                              +    (foo :a :b :c)
                              +  (format t "res1 is ~a, res2 is ~a, res2 is ~a~&" res1 res2 res3))
                              +;; res1 is A, res2 is B, res2 is C
                              +;; NIL
                              +
                              + +

                              Its general form is

                              + +
                              (multiple-value-bind (var-1 .. var-n) expr
                              +  body)
                              +
                              + +

                              The variables var-n are not available outside the scope of multiple-value-bind.

                              + +

                              With nth-value:

                              + +
                              (nth-value 0 (values :a :b :c))  ;; => :A
                              +(nth-value 2 (values :a :b :c))  ;; => :C
                              +(nth-value 9 (values :a :b :c))  ;; => NIL
                              +
                              + +

                              Look here too that values is different from a list:

                              + +
                              (nth-value 0 '(:a :b :c)) ;; => (:A :B :C)
                              +(nth-value 1 '(:a :b :c)) ;; => NIL
                              +
                              + +

                              Note that (values) with no values returns… no values at all.

                              + +

                              multiple-value-list

                              + +

                              While we are at it: multiple-value-list turns multiple values to a list:

                              + +
                              (multiple-value-list (values 1 2 3))
                              +;; (1 2 3)
                              +
                              + +

                              The reverse is values-list, it turns a list to multiple values:

                              + +
                              (values-list '(1 2 3))
                              +;; 1
                              +;; 2
                              +;; 3
                              +
                              + +

                              Anonymous functions: lambda

                              + +

                              Anonymous functions are created with lambda:

                              + +
                              (lambda (x) (print x))
                              +
                              + +

                              We can call a lambda with funcall or apply (see below).

                              + +

                              If the first element of an unquoted list is a lambda expression, the +lambda is called:

                              + +
                              ((lambda (x) (print x)) "hello")
                              +;; hello
                              +
                              + +

                              Calling functions programmatically: funcall and apply

                              + +

                              funcall is to be used with a known number of arguments, when apply +can be used on a list, for example from &rest:

                              + +
                              (funcall #'+ 1 2)
                              +(apply #'+ '(1 2))
                              +
                              + +

                              Referencing functions by name: single quote ' or sharpsign-quote #'?

                              + +

                              In the example above, we used #', but a single quote also works, and +we can encounter it in the wild. Which one to use?

                              + +

                              It is generally safer to use #', because it respects lexical scope. Observe:

                              + +
                              (defun foo (x)
                              +  (* x 100))
                              +
                              +(flet ((foo (x) (1+ x)))
                              +  (funcall #'foo 1))
                              +;; => 2, as expected
                              +;;
                              +;; But:
                              +
                              +(flet ((foo (x) (1+ x)))
                              +  (funcall 'foo 1))
                              +;; => 100
                              +
                              + +

                              #' is actually the shorthand for (function …):

                              + +
                              (function +)
                              +;; #<FUNCTION +>
                              +
                              +(flet ((foo (x) (1+ x)))
                              +  (print (function foo))
                              +  (funcall (function foo) 1))
                              +;; #<FUNCTION (FLET FOO) {1001C0ACFB}>
                              +;; 2
                              +
                              + +

                              Using function or the #' shorthand allows us to refer to local +functions. If we pass instead a symbol to funcall, what is +called is always the function named by that symbol in the global environment.

                              + +

                              Higher order functions: functions that return functions

                              + +

                              Writing functions that return functions is simple enough:

                              + +
                              (defun adder (n)
                              +  (lambda (x) (+ x n)))
                              +;; ADDER
                              +
                              + +

                              Here we have defined the function adder which returns an object of type function.

                              + +

                              To call the resulting function, we must use funcall or apply:

                              + +
                              (adder 5)
                              +;; #<CLOSURE (LAMBDA (X) :IN ADDER) {100994ACDB}>
                              +(funcall (adder 5) 3)
                              +;; 8
                              +
                              + +

                              Trying to call it right away leads to an illegal function call:

                              + +
                              ((adder 3) 5)
                              +In: (ADDER 3) 5
                              +    ((ADDER 3) 5)
                              +Error: Illegal function call.
                              +
                              + +

                              Indeed, CL has different namespaces for functions and variables, i.e. the same name can refer to different things depending on its position in a form that’s evaluated.

                              + +
                              ;; The symbol foo is bound to nothing:
                              +CL-USER> (boundp 'foo)
                              +NIL
                              +CL-USER> (fboundp 'foo)
                              +NIL
                              +;; We create a variable:
                              +CL-USER> (defparameter foo 42)
                              +FOO
                              +* foo
                              +42
                              +;; Now foo is "bound":
                              +CL-USER> (boundp 'foo)
                              +T
                              +;; but still not as a function:
                              +CL-USER> (fboundp 'foo)
                              +NIL
                              +;; So let's define a function:
                              +CL-USER> (defun foo (x) (* x x))
                              +FOO
                              +;; Now the symbol foo is bound as a function too:
                              +CL-USER> (fboundp 'foo)
                              +T
                              +;; Get the function:
                              +CL-USER> (function foo)
                              +#<FUNCTION FOO>
                              +;; and the shorthand notation:
                              +* #'foo
                              +#<FUNCTION FOO>
                              +;; We call it:
                              +(funcall (function adder) 5)
                              +#<CLOSURE (LAMBDA (X) :IN ADDER) {100991761B}>
                              +;; and call the lambda:
                              +(funcall (funcall (function adder) 5) 3)
                              +8
                              +
                              + +

                              To simplify a bit, you can think of each symbol in CL having (at least) two “cells†in which information is stored. One cell - sometimes referred to as its value cell - can hold a value that is bound to this symbol, and you can use boundp to test whether the symbol is bound to a value (in the global environment). You can access the value cell of a symbol with symbol-value.

                              + +

                              The other cell - sometimes referred to as its function cell - can hold the definition of the symbol’s (global) function binding. In this case, the symbol is said to be fbound to this definition. You can use fboundp to test whether a symbol is fbound. You can access the function cell of a symbol (in the global environment) with symbol-function.

                              + +

                              Now, if a symbol is evaluated, it is treated as a variable in that its value cell is returned (just foo). If a compound form, i.e. a cons, is evaluated and its car is a symbol, then the function cell of this symbol is used (as in (foo 3)).

                              + +

                              In Common Lisp, as opposed to Scheme, it is not possible that the car of the compound form to be evaluated is an arbitrary form. If it is not a symbol, it must be a lambda expression, which looks like (lambda lambda-list form*).

                              + +

                              This explains the error message we got above - (adder 3) is neither a symbol nor a lambda expression.

                              + +

                              If we want to be able to use the symbol *my-fun* in the car of a compound form, we have to explicitly store something in its function cell (which is normally done for us by the macro defun):

                              + +
                              ;;; continued from above
                              +CL-USER> (fboundp '*my-fun*)
                              +NIL
                              +CL-USER> (setf (symbol-function '*my-fun*) (adder 3))
                              +#<CLOSURE (LAMBDA (X) :IN ADDER) {10099A5EFB}>
                              +CL-USER> (fboundp '*my-fun*)
                              +T
                              +CL-USER> (*my-fun* 5)
                              +8
                              +
                              + +

                              Read the CLHS section about form evaluation for more.

                              + +

                              Closures

                              + +

                              Closures allow to capture lexical bindings:

                              + +
                              (let ((limit 3)
                              +      (counter -1))
                              +    (defun my-counter ()
                              +      (if (< counter limit)
                              +          (incf counter)
                              +          (setf counter 0))))
                              +
                              +(my-counter)
                              +0
                              +(my-counter)
                              +1
                              +(my-counter)
                              +2
                              +(my-counter)
                              +3
                              +(my-counter)
                              +0
                              +
                              + +

                              Or similarly:

                              + +
                              (defun repeater (n)
                              +  (let ((counter -1))
                              +     (lambda ()
                              +       (if (< counter n)
                              +         (incf counter)
                              +         (setf counter 0)))))
                              +
                              +(defparameter *my-repeater* (repeater 3))
                              +;; *MY-REPEATER*
                              +(funcall *my-repeater*)
                              +0
                              +(funcall *my-repeater*)
                              +1
                              +(funcall *my-repeater*)
                              +2
                              +(funcall *my-repeater*)
                              +3
                              +(funcall *my-repeater*)
                              +0
                              +
                              + +

                              See more on Practical Common Lisp.

                              + +

                              setf functions

                              + +

                              A function name can also be a list of two symbols with setf as the +first one, and where the first argument is the new value:

                              + +
                              (defun (setf <name>) (new-value <other arguments>)
                              +  body)
                              +
                              + +

                              This mechanism is particularly used for CLOS methods.

                              + +

                              A silly example:

                              + +
                              (defparameter *current-name* ""
                              +  "A global name.")
                              +
                              +(defun hello (name)
                              +  (format t "hello ~a~&" name))
                              +
                              +(defun (setf hello) (new-value)
                              +  (hello new-value)
                              +  (setf *current-name* new-value)
                              +  (format t "current name is now ~a~&" new-value))
                              +
                              +(setf (hello) "Alice")
                              +;; hello Alice
                              +;; current name is now Alice
                              +;; NIL
                              +
                              + +

                              + +

                              Currying

                              + +

                              Concept

                              + +

                              A related concept is that of currying which you might be familiar with if you’re coming from a functional language. After we’ve read the last section that’s rather easy to implement:

                              + +
                              CL-USER> (defun curry (function &rest args)
                              +           (lambda (&rest more-args)
                              +	           (apply function (append args more-args))))
                              +CURRY
                              +CL-USER> (funcall (curry #'+ 3) 5)
                              +8
                              +CL-USER> (funcall (curry #'+ 3) 6)
                              +9
                              +CL-USER> (setf (symbol-function 'power-of-ten) (curry #'expt 10))
                              +#<Interpreted Function "LAMBDA (FUNCTION &REST ARGS)" {482DB969}>
                              +CL-USER> (power-of-ten 3)
                              +1000
                              +
                              + +

                              With the Alexandria library

                              + +

                              Now that you know how to do it, you may appreciate using the +implementation of the +Alexandria +library (in Quicklisp).

                              + +
                              (ql:quickload "alexandria")
                              +
                              +(defun adder (foo bar)
                              +  "Add the two arguments."
                              +  (+ foo bar))
                              +
                              +(defvar add-one (alexandria:curry #'adder 1) "Add 1 to the argument.")
                              +
                              +(funcall add-one 10)  ;; => 11
                              +
                              +(setf (symbol-function 'add-one) add-one)
                              +(add-one 10)  ;; => 11
                              +
                              + +

                              Documentation

                              + +
                                +
                              • functions: http://www.lispworks.com/documentation/HyperSpec/Body/t_fn.htm#function
                              • +
                              • ordinary lambda lists: http://www.lispworks.com/documentation/HyperSpec/Body/03_da.htm
                              • +
                              • multiple-value-bind: http://clhs.lisp.se/Body/m_multip.htm
                              • +
                              + + +

                              + Page source: functions.md +

                              +
                              + + + + + +
                              +
                              +
                              + © 2002–2021 the Common Lisp Cookbook Project +
                              + +
                              +
                              T
                              O
                              C
                              +
                              + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/getting-started.html b/clones/lispcookbook.github.io/cl-cookbook/getting-started.html new file mode 100644 index 00000000..eae3713d --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/getting-started.html @@ -0,0 +1,591 @@ + + + + + Getting started + + + + + + + + + + + + + + +

                              The Common Lisp Cookbook – Getting started

                              +
                              + + + + +
                              +
                              + +
                              +
                              + +
                              +
                              Table of Contents
                              +
                                +
                                +
                                + +
                                +

                                The Common Lisp Cookbook – Getting started

                                + + +

                                + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                +

                                + 📕 Get the EPUB and PDF +

                                + + +
                                We’ll begin with presenting easy steps to install a development environment and to start a new Common Lisp project.

                                + +

                                Want a 2-clicks install? Then get +Portacle, a portable and +multi-platform Common Lisp environment. It ships Emacs, SBCL (the +implementation), Quicklisp (package manager), SLIME (IDE) and +Git. It’s the most straightforward way to get going!

                                + +

                                Install an implementation

                                + +

                                With your package manager

                                + +

                                If you don’t know which implementation of Common Lisp to use, try SBCL:

                                + +
                                apt-get install sbcl
                                +
                                + +

                                Common Lisp has been standardized via an ANSI document, so it can be +implemented in different ways. See +Wikipedia’s list of implementations.

                                + +

                                The following implementations are packaged for Debian and most other popular Linux distributions:

                                + + + +

                                Other well-known implementations include:

                                + + + +

                                and older implementations:

                                + +
                                  +
                                • CMUCL, originally developed at Carnegie Mellon University, from which SBCL is derived, and
                                • +
                                • GNU Common Lisp
                                • +
                                • and there is more!
                                • +
                                + +

                                With the asdf-vm package manager

                                + +

                                The asdf-vm tool can be used to manage a large ecosystem of runtimes and tools.

                                + + + +

                                With Roswell

                                + +

                                Roswell is:

                                + +
                                  +
                                • an implementation manager: it makes it easy to install a Common Lisp +implementation (ros install ecl), an exact version of an +implementation (ros install sbcl/1.2.0), to change the default one +being used (ros use ecl),
                                • +
                                • a scripting environment (helps to run Lisp from the shell, to get +the command line arguments,…),
                                • +
                                • a script installer,
                                • +
                                • a testing environment (to run tests, including on popular Continuous +Integration platforms),
                                • +
                                • a building utility (to build images and executables in a portable way).
                                • +
                                + +

                                You’ll find several ways of installation on its wiki (Debian package, +Windows installer, Brew/Linux Brew,…).

                                + +

                                With Docker

                                + +

                                If you already know Docker, you can get +started with Common Lisp pretty quickly. The +clfoundation/cl-devel +image comes with recent versions of SBCL, CCL, ECL and ABCL, plus +Quicklisp installed in the home (/home/cl), so than we can +ql:quickload libraries straight away.

                                + +

                                Docker works on GNU/Linux, Mac and Windows.

                                + +

                                The following command will download the required image (around 1.0GB +compressed), put your local sources inside the Docker image where indicated, +and drop you into an SBCL REPL:

                                + +
                                docker run --rm -it -v /path/to/local/code:/home/cl/common-lisp/source clfoundation/cl-devel:latest sbcl
                                +
                                + +

                                We still want to develop using Emacs and SLIME, so we need to connect SLIME to +the Lisp inside Docker. See +slime-docker, +which is a library that helps on setting that up.

                                + +

                                On Windows

                                + +

                                All implementations above can be installed on Windows.

                                + +

                                Portacle is multiplatform and works on Windows.

                                + +

                                You can also try:

                                + +
                                  +
                                • ÏEmacs, a preconfigured distribution of GNU Emacs specifically for Microsoft Windows. It ships with many CL implementations: CCL, SBCL, CLISP, ABCL and ECL, and also has components for other programming languages (Python, Racket, Java, C++…).
                                • +
                                • Corman Lisp, for Windows XP, Windows 2000, Windows ME or Windows NT. It is fully integrated with the Win32 API, and all the Windows API functions are readily available from Lisp.
                                • +
                                + +

                                Start a REPL

                                + +

                                Just launch the implementation executable on the command line to enter +the REPL (Read Eval Print Loop), i.e. the interactive +interpreter.

                                + +

                                Quit with (quit) or ctr-d (on some implementations).

                                + +

                                Here is a sample session:

                                + +
                                user@debian:~$ sbcl
                                +This is SBCL 1.3.14.debian, an implementation of ANSI Common Lisp.
                                +More information about SBCL is available at <http://www.sbcl.org/>.
                                +
                                +SBCL is free software, provided as is, with absolutely no warranty.
                                +It is mostly in the public domain; some portions are provided under
                                +BSD-style licenses.  See the CREDITS and COPYING files in the
                                +distribution for more information.
                                +* (+ 1 2)
                                +
                                +3
                                +* (quit)
                                +user@debian:~$
                                +
                                + +

                                You can slightly enhance the REPL (the arrow keys do not work, +it has no history,…) with rlwrap:

                                + +
                                apt-get install rlwrap
                                +
                                + +

                                and:

                                + +
                                rlwrap sbcl
                                +
                                + +

                                But we’ll setup our editor to offer a better experience instead of +working in this REPL. See editor-support.

                                + +

                                Lisp is interactive by nature, so in case of an error we enter the +debugger. This can be annoying in certain cases, so you might want to +use SBCL’s --disable-debugger option.

                                + +
                                + +TIP: The CLISP implementation has a better default REPL for the +terminal (readline capabilities, completion of symbols). You can even +use clisp -on-error abort to have error messages without the +debugger. It's handy to try things out, but we recommend to set-up +your editor and to use SBCL or CCL. +
                                + +
                                + +TIP: + By adding the -c switch to rlwrap, you can autocomplete file names. +
                                + +

                                Libraries

                                + +

                                Common Lisp has thousands of libraries available under a free software license. See:

                                + +
                                  +
                                • Quickdocs - the library documentation hosting for CL.
                                • +
                                • the Awesome-cl list, a +curated list of libraries.
                                • +
                                • Cliki, the Common Lisp wiki.
                                • +
                                + +

                                Some terminology

                                + +
                                  +
                                • +

                                  In the Common Lisp world, a package is a way of grouping symbols +together and of providing encapsulation. It is similar to a C++ +namespace, a Python module or a Java package.

                                  +
                                • +
                                • +

                                  A system is a collection of CL source files bundled with an .asd +file which tells how to compile and load them. There is often a +one-to-one relationship between systems and packages, but this is in +no way mandatory. A system may declare a dependency on other +systems. Systems are managed by ASDF (Another System Definition +Facility), which offers functionalities similar to those of make and +ld.so, and has become a de facto standard.

                                  +
                                • +
                                • +

                                  A Common Lisp library or project typically consists of one or +several ASDF systems (and is distributed as one Quicklisp project).

                                  +
                                • +
                                + +

                                Install Quicklisp

                                + +

                                Quicklisp is more than a package +manager, it is also a central repository (a dist) that ensures that +all libraries build together.

                                + +

                                It provides its own dist but it is also possible to build our own.

                                + +

                                To install it, we can either:

                                + +

                                1- run this command, anywhere:

                                + +
                                curl -O https://beta.quicklisp.org/quicklisp.lisp
                                +
                                + +

                                and enter a Lisp REPL and load this file:

                                + +
                                sbcl --load quicklisp.lisp
                                +
                                + +

                                or

                                + +

                                2- install the Debian package:

                                + +
                                apt-get install cl-quicklisp
                                +
                                + +

                                and load it, from a REPL:

                                + +
                                (load "/usr/share/common-lisp/source/quicklisp/quicklisp.lisp")
                                +
                                + +

                                Then, in both cases, still from the REPL:

                                + +
                                (quicklisp-quickstart:install)
                                +
                                + +

                                This will create the ~/quicklisp/ directory, where Quicklisp will +maintain its state and downloaded projects.

                                + +

                                If you wish, you can install Quicklisp to a different location. For instance, +to install it to a hidden folder on Unix systems:

                                + +
                                (quicklisp-quickstart:install :path "~/.quicklisp")
                                +
                                + +

                                If you want Quicklisp to always be loaded in your Lisp sessions, run +(ql:add-to-init-file): this adds the right stuff to the init file of +your CL implementation. Otherwise, you have to run (load +"~/quicklisp/setup.lisp") in every session if you want to use +Quicklisp or any of the libraries installed through it.

                                + +

                                It adds the following in your (for example) ~/.sbclrc:

                                + +
                                #-quicklisp
                                +  (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                +                                         (user-homedir-pathname))))
                                +    (when (probe-file quicklisp-init)
                                +      (load quicklisp-init)))
                                +
                                + +

                                Install libraries

                                + +

                                In the REPL:

                                + +
                                (ql:quickload "package-name")
                                +
                                + +

                                and voilà. See Quicklisp’s documentation for more commands.

                                + +

                                Note also that dozens of Common Lisp libraries are packaged in +Debian. The package names usually begin with the cl- prefix (use +apt-cache search --names-only "^cl-.*" to list them all).

                                + +

                                For example, in order to use the CL-PPCRE library (for regular +expressions), one should first install the cl-ppcre package.

                                + +

                                Then, in SBCL and ECL, it can be used with:

                                + +
                                (require "asdf")
                                +(require "cl-ppcre")
                                +(cl-ppcre:regex-replace "fo+" "foo bar" "frob")
                                +
                                + +

                                See more: https://wiki.debian.org/CommonLisp

                                + +

                                Advanced dependencies management

                                + +

                                You can drop Common Lisp projects into any of those folders:

                                + +
                                  +
                                • ~/common-lisp,
                                • +
                                • ~/.local/share/common-lisp/source,
                                • +
                                • ~/quicklisp/local-projects
                                • +
                                + +

                                For a complete list, see

                                + +
                                (asdf/source-registry:default-user-source-registry)
                                +
                                + +

                                and

                                + +
                                asdf:*central-registry*
                                +
                                + +

                                A library installed here is automatically available for every project.

                                + +

                                Providing our own version of a library. Cloning projects.

                                + +

                                Given the property above, we can clone any library into the +local-projects directory and it will be found by ASDF (and Quicklisp) and +available right-away:

                                + +
                                (asdf:load-system "system")
                                +
                                + +

                                or

                                + +
                                (ql:quickload "system")
                                +
                                + +

                                The practical different between the two is that ql:quickload first tries to +fetch the system from the Internet if it is not already installed.

                                + +

                                How to work with local versions of libraries

                                + +

                                If we need libraries to be installed locally, for only one project, or +in order to easily ship a list of dependencies with an application, we +can use Qlot or CLPM.

                                + +

                                Quicklisp also provides +Quicklisp bundles. They +are self-contained sets of systems that are exported from Quicklisp +and loadable without involving Quicklisp.

                                + +

                                At last, there’s +Quicklisp controller +to help us build dists.

                                + +

                                Working with projects

                                + +

                                Now that we have Quicklisp and our editor ready, we can start writing +Lisp code in a file and interacting with the REPL.

                                + +

                                But what if we want to work with an existing project or create a new +one, how do we proceed, what’s the right sequence of defpackage, +what to put in the .asd file, how to load the project into the REPL ?

                                + +

                                Creating a new project

                                + +

                                Some project builders help to scaffold the project structure. We like +cl-project that also sets +up a tests skeleton.

                                + +

                                In short:

                                + +
                                (ql:quickload "cl-project")
                                +(cl-project:make-project #P"./path-to-project/root/")
                                +
                                + +

                                it will create a directory structure like this:

                                + +
                                |-- my-project.asd
                                +|-- my-project-test.asd
                                +|-- README.markdown
                                +|-- README.org
                                +|-- src
                                +|   `-- my-project.lisp
                                +`-- tests
                                +    `-- my-project.lisp
                                +
                                + +

                                Where my-project.asd resembles this:

                                + +
                                (defsystem "my-project"
                                +  :version "0.1.0"
                                +  :author ""
                                +  :license ""
                                +  :depends-on ()  ;; <== list of Quicklisp dependencies
                                +  :components ((:module "src"
                                +                :components
                                +                ((:file "my-project"))))
                                +  :description ""
                                +  :long-description
                                +  #.(read-file-string
                                +     (subpathname *load-pathname* "README.markdown"))
                                +  :in-order-to ((test-op (test-op "my-project-test"))))
                                +
                                + +

                                and src/my-project.lisp this:

                                + +
                                (defpackage footest
                                +  (:use :cl))
                                +(in-package :footest)
                                +
                                + + + +

                                How to load an existing project

                                + +

                                You have created a new project, or you have an existing one, and you +want to work with it on the REPL, but Quicklisp doesn’t know it. How +can you do ?

                                + +

                                Well first, if you create it or clone it into +one of ~/common-lisp, ~/.local/share/common-lisp/source/ or +~/quicklisp/local-projects, you’ll be able to (ql:quickload …) it with no +further ado.

                                + +

                                Otherwise you’ll need to compile and load its system definition +(.asd) first. In SLIME with the slime-asdf contrib loaded, type C-c C-k +(slime-compile-and-load-file) in the .asd, then you can +(ql:quickload …) it.

                                + +

                                Usually you want to “enter†the system in the REPL at this stage:

                                + +
                                (in-package :my-project)
                                +
                                + +

                                Lastly, you can compile or eval the sources (my-project.lisp) with +C-c C-k or C-c C-c (slime-compile-defun) in a form, and see its +result in the REPL.

                                + +

                                Another solution is to use ASDF’s list of known projects:

                                + +
                                (pushnew "~/path-to-project/root/" asdf:*central-registry* :test #'equal)
                                +
                                + +

                                and since ASDF is integrated into Quicklisp, we can quickload our project.

                                + +

                                Happy hacking !

                                + +

                                More settings

                                + +

                                You might want to set SBCL’s default encoding format to utf-8:

                                + +
                                (setf sb-impl::*default-external-format* :utf-8)
                                +
                                + +

                                You can add this to your ~/.sbclrc.

                                + +

                                If you dislike the REPL to print all symbols upcase, add this:

                                + +
                                (setf *print-case* :downcase)
                                +
                                + +
                                + +Warning: This might break the behaviour of some packages like it happened with +Mito. +Avoid doing this in production. +
                                + +

                                See also

                                + +
                                  +
                                • cl-cookieproject - a project skeleton for a ready-to-use project with an entry point and unit tests. With a src/ subdirectory, some more metadata, a 5AM test suite, a way to build a binary, an example CLI args parsing, Roswell integration.
                                • +
                                • Source code organization, libraries and packages: https://lispmethods.com/libraries.html
                                • +
                                + +

                                Credits

                                + + + + +

                                + Page source: getting-started.md +

                                +
                                + + + + + +
                                +
                                +
                                + © 2002–2021 the Common Lisp Cookbook Project +
                                + +
                                +
                                T
                                O
                                C
                                +
                                + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/gui.html b/clones/lispcookbook.github.io/cl-cookbook/gui.html new file mode 100644 index 00000000..c88a0885 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/gui.html @@ -0,0 +1,1098 @@ + + + + + GUI toolkits + + + + + + + + + + + + + + +

                                The Common Lisp Cookbook – GUI toolkits

                                +
                                + + + + +
                                +
                                + +
                                +
                                + +
                                +
                                Table of Contents
                                +
                                  +
                                  +
                                  + +
                                  +

                                  The Common Lisp Cookbook – GUI toolkits

                                  + + +

                                  + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                  +

                                  + 📕 Get the EPUB and PDF +

                                  + + +
                                  Lisp has a long and rich history and so does the development of +Graphical User Interfaces in Lisp. In fact, the first GUI builder was +written in Lisp (and sold to Apple. It is now Interface Builder).

                                  + +

                                  Lisp is also famous and unrivalled for its interactive development +capabilities, a feature even more worth having to develop GUI +applications. Can you imagine compiling one function and seeing your +GUI update instantly? We can do this with many GUI frameworks today, +even though the details differ from one to another.

                                  + +

                                  Finally, a key part in building software is how to build it and ship +it to users. Here also, we can build self-contained binaries, for +the three main operating systems, that users can run with a double +click.

                                  + +

                                  We aim here to give you the relevant information to help you choose +the right GUI framework and to put you on tracks. Don’t hesitate to +contribute, to +send more examples and to furnish the upstream documentations.

                                  + +

                                  Introduction

                                  + +

                                  In this recipe, we’ll present the following GUI toolkits:

                                  + + + +

                                  In addition, you might want to have a look to:

                                  + +
                                    +
                                  • the CAPI toolkit (Common Application Programming Interface), +which is proprietary and made by LispWorks. It is a complete and cross-platform +toolkit (Windows, Gtk+, Cocoa), very praised by its users. LispWorks +also has iOS and Android +runtimes. Example +software built with CAPI include ScoreCloud. It is possible to +try it with the LispWorks free demo.
                                  • +
                                  • Allegro CL’s IDE and Common Graphics windowing system (proprietary): Allegro’s IDE is a general environment for developing applications. It works in concert with a windowing system called Common Graphics. The IDE is available for Allegro CL’s Microsoft Windows, on Linux platforms, Free BSD and on the Mac. +
                                      +
                                    • NEW! 🎉 since Allegro CL 10.1 (released in March of 2022), the IDE, and the Common Graphics GUI toolkit, runs in the browser. It is called CG/JS.
                                    • +
                                    +
                                  • +
                                  • CCL’s built-in Cocoa +interface, +used to build applications such as Opusmodus.
                                  • +
                                  • Clozure CL’s built-in Objective-C bridge and CocoaInterface, a Cocoa interface for CCL. Build Cocoa user interface windows dynamically using Lisp code and bypass the typical Xcode processes. +
                                      +
                                    • the bridge is good at catching ObjC errors and turning them into Lisp errors, so one can have an iterative REPL-based development cycle for a macOS GUI application.
                                    • +
                                    +
                                  • +
                                  • McCLIM and Garnet are toolkit in 100% Common Lisp. McClim even has a prototype running in the browser with the Broadway protocol and Garnet has an ongoing interface to Gtk.
                                  • +
                                  • Alloy, another very new toolkit in 100% Common Lisp, used for example in the Kandria game.
                                  • +
                                  • nodgui, a fork of Ltk, with syntax sugar and additional widgets.
                                  • +
                                  • eql, eql5, eql5-android, embedded Qt4 and Qt5 Lisp, embedded in ECL, embeddable in Qt. Port of EQL5 to the Android platform.
                                  • +
                                  • this demo using Java Swing from ABCL
                                  • +
                                  • examples of using Gtk without C files with SBCL, as well as GTK-server.
                                  • +
                                  • and, last but not least, Ceramic, to ship a cross-platform web app with Electron.
                                  • +
                                  + +

                                  as well as the other ones listed on awesome-cl#gui and Cliki.

                                  + +

                                  Tk (Ltk)

                                  + +

                                  Tk (or Tcl/Tk, where Tcl is the programming language) has the +infamous reputation of having an outdated look. This is not (so) true +anymore since its version 8 of 1997 (!). It is probably better than +you think:

                                  + +

                                  + +

                                  Tk doesn’t have a great choice of widgets, but it has a useful canvas, +and it has a couple of unique features: we can develop a graphical +interface fully interactively and we can run the GUI remotely +from the core app.

                                  + +

                                  So, Tk isn’t fancy, but it is an used and proven GUI toolkit (and +programming language) still used in the industry. It can be a great +choice to quickly create simple GUIs, to leverage its ease of deployment, or +when stability is required.

                                  + +

                                  The Lisp binding is Ltk.

                                  + +
                                    +
                                  • Written in: Tcl
                                  • +
                                  • +

                                    Portability: cross-platform (Windows, macOS, Linux).

                                    +
                                  • +
                                  • +

                                    Widgets: this is not the fort of Tk. It has a small set of +default widgets, and misses important ones, for example a calendar. We +can find some in extensions (such as in Nodgui), but they don’t +feel native, at all.

                                    +
                                  • +
                                  • +

                                    Interactive development: very much.

                                    +
                                  • +
                                  • +

                                    Graphical builder: no

                                    +
                                  • +
                                  • Other features: +
                                      +
                                    • remote execution: the connection between Lisp and Tcl/Tk is +done via a stream. It is thus possible to run the Lisp program on +one computer, and to display the GUI on another one. The only +thing required on the client computer is tcl/tk installed and the +remote.tcl script. See Ltk-remote.
                                    • +
                                    +
                                  • +
                                  • Bindings documentation: short but complete. Nodgui too.
                                  • +
                                  • Bindings stability: very stable
                                  • +
                                  • Bindings activity: low.
                                  • +
                                  • Licence: Tcl/Tk is BSD-style, Ltk is LGPL.
                                  • +
                                  • Example applications: +
                                      +
                                    • Fulci - a program to organise your movie collections.
                                    • +
                                    • Ltk small games - snake and tic-tac-toe.
                                    • +
                                    • cl-pkr - a cross-platform color picker.
                                    • +
                                    • cl-torrents - searching torrents on popular trackers. CLI, readline and a simple Tk GUI.
                                    • +
                                    +
                                  • +
                                  • More examples: + +
                                  • +
                                  + +

                                  List of widgets

                                  + +

                                  (please don’t suppose the list is exhaustive)

                                  + +
                                  Button Canvas Check-button Entry Frame Label Labelframe Listbox
                                  +Menu Menubutton Message
                                  +Paned-window
                                  +Radio-button Scale
                                  +Scrollbar Spinbox Text
                                  +Toplevel Widget Canvas
                                  +
                                  +Ltk-megawidgets:
                                  +    progress
                                  +    history-entry
                                  +    menu-entry
                                  +
                                  + +

                                  Nodgui adds:

                                  + +
                                  treelist tooltip searchable-listbox date-picker calendar autocomplete-listbox
                                  +password-entry progress-bar-star notify-window
                                  +dot-plot bar-chart equalizer-bar
                                  +swap-list
                                  +
                                  + +

                                  Qt4 (Qtools)

                                  + +

                                  Do we need to present Qt and Qt4? Qt is huge and contains +everything and the kitchen sink. Qt not only provides UI widgets, but +numerous other layers (networking, D-BUS…).

                                  + +

                                  Qt is free for open-source software, however you’ll want to check the +conditions to ship proprietary ones.

                                  + +

                                  The Qtools bindings target Qt4. The Qt5 Lisp bindings are +yet to be created.

                                  + +

                                  A companion library for Qtools, that you’ll want to check out once you +made your first Qtool application, is +Qtools-ui, a collection of +useful widgets and pre-made components. It comes with short +demonstrations +videos.

                                  + + + +
                                    +
                                  • Framework written in: C++
                                  • +
                                  • Framework Portability: multi-platform, Android, embedded systems, WASM.
                                  • +
                                  • +

                                    Bindings Portability: Qtools runs on x86 desktop platforms on Windows, macOS and GNU/Linux.

                                    +
                                  • +
                                  • +

                                    Widgets choice: large.

                                    +
                                  • +
                                  • +

                                    Graphical builder: yes.

                                    +
                                  • +
                                  • +

                                    Other features: Web browser, a lot more.

                                    +
                                  • +
                                  • Bindings documentation: lengthy explanations, a few examples. Prior Qt knowledge is required.
                                  • +
                                  • Bindings stability: stable
                                  • +
                                  • Bindings activity: active
                                  • +
                                  • Qt Licence: both commercial and open source licences.
                                  • +
                                  • Example applications: +
                                      +
                                    • https://github.com/Shinmera/qtools/tree/master/examples
                                    • +
                                    • https://github.com/Shirakumo/lionchat
                                    • +
                                    • https://github.com/shinmera/halftone - a simple image viewer
                                    • +
                                    +
                                  • +
                                  + +

                                  Gtk+3 (cl-cffi-gtk)

                                  + +

                                  Gtk+3 is the primary library used to build GNOME +applications. Its (currently most advanced) lisp bindings is +cl-cffi-gtk. While primarily created for GNU/Linux, Gtk +works fine under macOS and can now also be used on Windows.

                                  + +
                                    +
                                  • Framework written in: C
                                  • +
                                  • +

                                    Portability: GNU/Linux and macOS, also Windows.

                                    +
                                  • +
                                  • +

                                    Widgets choice: large.

                                    +
                                  • +
                                  • Graphical builder: yes: Glade.
                                  • +
                                  • +

                                    Other features: web browser (WebKitGTK)

                                    +
                                  • +
                                  • Bindings documentation: very good: http://www.crategus.com/books/cl-gtk/gtk-tutorial.html
                                  • +
                                  • Bindings stability: stable
                                  • +
                                  • Bindings activity: low activity, active development.
                                  • +
                                  • Licence: LGPL
                                  • +
                                  • Example applications: + +
                                  • +
                                  • more documentation and examples: + +
                                  • +
                                  + +

                                  IUP (lispnik/IUP)

                                  + +

                                  IUP is a cross-platform GUI toolkit actively developed +at the PUC university of Rio de Janeiro, Brazil. It uses native +controls: the Windows API for Windows, Gtk3 for GNU/Linux. At the +time of writing, it has a Cocoa port in the works (as well as iOS, +Android and WASM ones). A particularity of IUP is its small API.

                                  + +

                                  The Lisp bindings are lispnik/iup. They are nicely +done in that they are automatically generated from the C sources. They +can follow new IUP versions with a minimal work and the required steps +are documented. All this gives us good guarantee over the bus +factor.

                                  + +

                                  IUP stands as a great solution in between Tk and Gtk or Qt.

                                  + +
                                    +
                                  • Framework written in: C (official API also in Lua and LED)
                                  • +
                                  • +

                                    Portability: Windows and Linux, work started for +Cocoa, iOS, Android, WASM.

                                    +
                                  • +
                                  • +

                                    Widgets choice: medium.

                                    +
                                  • +
                                  • +

                                    Graphical builder: yes: IupVisualLED

                                    +
                                  • +
                                  • +

                                    Other features: OpenGL, Web browser (WebKitGTK on GNU/Linux), plotting, Scintilla text editor

                                    +
                                  • +
                                  • Bindings documentation: good examples and good readme, otherwise low.
                                  • +
                                  • Bindings stability: alpha (but fully generated and working nicely).
                                  • +
                                  • Bindings activity: low but steady, and reactive to new IUP versions.
                                  • +
                                  • Licence: IUP and the bindings are MIT licenced.
                                  • +
                                  + +

                                  List of widgets

                                  + +
                                  Radio, Tabs, FlatTabs, ScrollBox, DetachBox,
                                  +Button, FlatButton, DropButton, Calendar, Canvas, Colorbar, ColorBrowser, DatePick, Dial, Gauge, Label, FlatLabel,
                                  +FlatSeparator, Link, List, FlatList, ProgressBar, Spin, Text, Toggle, Tree, Val,
                                  +listDialog, Alarm, Color, Message, Font, Scintilla, file-dialog…
                                  +Cells, Matrix, MatrixEx, MatrixList,
                                  +GLCanvas, Plot, MglPlot, OleControl, WebBrowser (WebKit/Gtk+)…
                                  +drag-and-drop
                                  +
                                  + + + +

                                  + +

                                  Nuklear (Bodge-Nuklear)

                                  + +

                                  Nuklear is a small immediate-mode GUI toolkit:

                                  + +
                                  +

                                  Nuklear is a minimal-state, immediate-mode graphical user interface toolkit written in ANSI C and licensed under public domain. It was designed as a simple embeddable user interface for application and does not have any dependencies, a default render backend or OS window/input handling but instead provides a highly modular, library-based approach, with simple input state for input and draw commands describing primitive shapes as output. So instead of providing a layered library that tries to abstract over a number of platform and render backends, it focuses only on the actual UI.

                                  +
                                  + +

                                  its Lisp binding is Bodge-Nuklear, and its higher level companions bodge-ui and bodge-ui-window.

                                  + +

                                  Unlike traditional UI frameworks, Nuklear allows the developer to take +over the rendering loop or the input management. This might require +more setup, but it makes Nuklear particularly well suited for games, +or for applications where you want to create new controls.

                                  + +
                                    +
                                  • Framework written in: ANSI C, single-header library.
                                  • +
                                  • +

                                    Portability: where C runs. Nuklear doesn’t contain +platform-specific code. No direct OS or window handling is done in +Nuklear. Instead all input state has to be provided by platform +specific code.

                                    +
                                  • +
                                  • +

                                    Widgets choice: small.

                                    +
                                  • +
                                  • +

                                    Graphical builder: no.

                                    +
                                  • +
                                  • +

                                    Other features: fully skinnable and customisable.

                                    +
                                  • +
                                  • Bindings stability: stable
                                  • +
                                  • Bindings activity: active
                                  • +
                                  • Licence: MIT or Public Domain (unlicence).
                                  • +
                                  • Example applications: + +
                                  • +
                                  + +

                                  List of widgets

                                  + +

                                  Non-exhaustive list:

                                  + +
                                  buttons, progressbar, image selector, (collapsable) tree, list, grid, range, slider, color picker,
                                  +date-picker
                                  +
                                  + +

                                  + +

                                  Getting started

                                  + +

                                  Tk

                                  + +

                                  Ltk is quick and easy to grasp.

                                  + +
                                  (ql:quickload "ltk")
                                  +(in-package :ltk-user)
                                  +
                                  + +

                                  How to create widgets

                                  + +

                                  All widgets are created with a regular make-instance and the widget name:

                                  + +
                                  (make-instance 'button)
                                  +(make-instance 'treeview)
                                  +
                                  + +

                                  This makes Ltk explorable with the default symbol completion.

                                  + +

                                  How to start the main loop

                                  + +

                                  As with most bindings, the GUI-related code must be started inside a macro that +handles the main loop, here with-ltk:

                                  + +
                                  (with-ltk ()
                                  +  (let ((frame (make-instance 'frame)))
                                  +    …))
                                  +
                                  + +

                                  How to display widgets

                                  + +

                                  After we created some widgets, we must place them on the layout. There +are a few Tk systems for that, but the most recent one and the one we +should start with is the grid. grid is a function that takes as +arguments the widget, its column, its row, and a few optional +parameters.

                                  + +

                                  As with any Lisp code in a regular environment, the functions’ +signatures are indicated by the editor. It makes Ltk explorable.

                                  + +

                                  Here’s how to display a button:

                                  + +
                                  (with-ltk ()
                                  +  (let ((button (make-instance 'button :text "hello")))
                                  +    (grid button 0 0)))
                                  +
                                  + +

                                  That’s all there is to it.

                                  + +

                                  Reacting to events

                                  + +

                                  Many widgets have a :command argument that accept a lambda which is +executed when the widget’s event is started. In the case of a button, +that will be on a click:

                                  + +
                                  (make-instance 'button
                                  +  :text "Hello"
                                  +  :command (lambda ()
                                  +             (format t "clicked")))
                                  +
                                  + +

                                  Interactive development

                                  + +

                                  When we start the Tk process in the background with (start-wish), we +can create widgets and place them on the grid interactively.

                                  + +

                                  See the documentation.

                                  + +

                                  Once we’re done, we can (exit-wish).

                                  + +

                                  Nodgui

                                  + +

                                  To try the Nodgui demo, do:

                                  + +
                                  (ql:quickload "nodgui")
                                  +(nodgui.demo:demo)
                                  +
                                  + +

                                  Qt4

                                  + +
                                  (ql:quickload '(:qtools :qtcore :qtgui))
                                  +
                                  + +
                                  (defpackage #:qtools-test
                                  +  (:use #:cl+qt)
                                  +  (:export #:main))
                                  +(in-package :qtools-test)
                                  +(in-readtable :qtools)
                                  +
                                  + +

                                  We create our main widget that will contain the rest:

                                  + +
                                  (define-widget main-window (QWidget)
                                  +  ())
                                  +
                                  + +

                                  We create an input field and a button inside this main widget:

                                  + +
                                  (define-subwidget (main-window name) (q+:make-qlineedit main-window)
                                  +  (setf (q+:placeholder-text name) "Your name please."))
                                  +
                                  + +
                                  (define-subwidget (main-window go-button) (q+:make-qpushbutton "Go!" main-window))
                                  +
                                  + +

                                  We stack them horizontally:

                                  + +
                                  (define-subwidget (main-window layout) (q+:make-qhboxlayout main-window)
                                  +  (q+:add-widget layout name)
                                  +  (q+:add-widget layout go-button))
                                  +
                                  + +

                                  and we show them:

                                  + +
                                  (with-main-window
                                  +  (window 'main-window))
                                  +
                                  + +

                                  + +

                                  That’s cool, but we don’t react to the click event yet.

                                  + +

                                  Reacting to events

                                  + +

                                  Reacting to events in Qt happens through signals and slots. Slots are +functions that receive or “connect to†signals, and signals are event carriers.

                                  + +

                                  Widgets already send their own signals: for example, a button sends a +“pressed†event. So, most of the time, we only need to connect to them.

                                  + +

                                  However, had we extra needs, we can create our own set of signals.

                                  + +
                                  Built-in events
                                  + +

                                  We want to connect our go-button to the pressed and +return-pressed events and display a message box.

                                  + +
                                    +
                                  • we need to do this inside a define-slot function,
                                  • +
                                  • where we establish the connection to those events,
                                  • +
                                  • and where we create the message box. We grab the text of the name +input field with (q+:text name).
                                  • +
                                  + +
                                  (define-slot (main-window go-button) ()
                                  +  (declare (connected go-button (pressed)))
                                  +  (declare (connected name (return-pressed)))
                                  +  (q+:qmessagebox-information main-window
                                  +                              "Greetings"  ;; title
                                  +                              (format NIL "Good day to you, ~a!" (q+:text name))))
                                  +
                                  + +

                                  And voilà. Run it with

                                  + +
                                  (with-main-window (window 'main-window))
                                  +
                                  + +
                                  Custom events
                                  + +

                                  We’ll implement the same functionality as above, but for demonstration +purposes we’ll create our own signal named name-set to throw when +the button is clicked.

                                  + +

                                  We start by defining the signal, which happens inside the +main-window, and which is of type string:

                                  + +
                                  (define-signal (main-window name-set) (string))
                                  +
                                  + +

                                  We create a first slot to make our button react to the pressed +and return-pressed events. But instead of creating the message box +here, as above, we send the name-set signal, with the value of our +input field..

                                  + +
                                  (define-slot (main-window go-button) ()
                                  +  (declare (connected go-button (pressed)))
                                  +  (declare (connected name (return-pressed)))
                                  +  (signal! main-window (name-set string) (q+:text name)))
                                  +
                                  + +

                                  So far, nobody reacts to name-set. We create a second slot that +connects to it, and displays our message. Here again, we precise the +parameter type.

                                  + +
                                  (define-slot (main-window name-set) ((new-name string))
                                  +  (declare (connected main-window (name-set string)))
                                  +  (q+:qmessagebox-information main-window "Greetings" (format NIL "Good day to you, ~a!" new-name)))
                                  +
                                  + +

                                  and run it:

                                  + +
                                  (with-main-window (window 'main-window))
                                  +
                                  + +

                                  Building and deployment

                                  + +

                                  It is possible to build a binary and bundle it together with all the +necessary shared libraries.

                                  + +

                                  Please read https://github.com/Shinmera/qtools#deployment.

                                  + +

                                  You might also like this Travis CI script to build a self-contained binary for the three OSes.

                                  + +

                                  Gtk3

                                  + +

                                  The +documentation +is exceptionally good, including for beginners.

                                  + +

                                  The library to quickload is cl-cffi-gtk. It is made of numerous +ones, that we have to :use for our package.

                                  + +
                                  (ql:quickload "cl-cffi-gtk")
                                  +
                                  +(defpackage :gtk-tutorial
                                  +  (:use :gtk :gdk :gdk-pixbuf :gobject
                                  +   :glib :gio :pango :cairo :common-lisp))
                                  +
                                  +(in-package :gtk-tutorial)
                                  +
                                  + +

                                  How to run the main loop

                                  + +

                                  As with the other libraries, everything happens inside the main loop +wrapper, here with-main-loop.

                                  + +

                                  How to create a window

                                  + +

                                  (make-instance 'gtk-window :type :toplevel :title "hello" ...).

                                  + +

                                  How to create a widget

                                  + +

                                  All widgets have a corresponding class. We can create them with +make-instance 'widget-class, but we preferably use the constructors.

                                  + +

                                  The constructors end with (or contain) “newâ€:

                                  + +
                                  (gtk-label-new)
                                  +(gtk-button-new-with-label "Label")
                                  +
                                  + +

                                  How to create a layout

                                  + +
                                  (let ((box (make-instance 'gtk-box :orientation :horizontal :spacing 6))) ...)
                                  +
                                  + +

                                  then pack a widget onto the box:

                                  + +
                                  (gtk-box-pack-start box mybutton-1)
                                  +
                                  + +

                                  and add the box to the window:

                                  + +
                                  (gtk-container-add window box)
                                  +
                                  + +

                                  and display them all:

                                  + +
                                  (gtk-widget-show-all window)
                                  +
                                  + +

                                  Reacting to events

                                  + +

                                  Use g-signal-connect + the concerned widget + the event name (as a +string) + a lambda, that takes the widget as argument:

                                  + +
                                  (g-signal-connect window "destroy"
                                  +  (lambda (widget)
                                  +    (declare (ignore widget))
                                  +    (leave-gtk-main)))
                                  +
                                  + +

                                  Or again:

                                  + +
                                  (g-signal-connect button "clicked"
                                  +  (lambda (widget)
                                  +    (declare (ignore widget))
                                  +    (format t "Button was pressed.~%")))
                                  +
                                  + +

                                  Full example

                                  + +
                                  (defun hello-world ()
                                  +  ;; in the docs, this is example-upgraded-hello-world-2.
                                  +  (within-main-loop
                                  +    (let ((window (make-instance 'gtk-window
                                  +                                 :type :toplevel
                                  +                                 :title "Hello Buttons"
                                  +                                 :default-width 250
                                  +                                 :default-height 75
                                  +                                 :border-width 12))
                                  +          (box (make-instance 'gtk-box
                                  +                              :orientation :horizontal
                                  +                              :spacing 6)))
                                  +      (g-signal-connect window "destroy"
                                  +                        (lambda (widget)
                                  +                          (declare (ignore widget))
                                  +                          (leave-gtk-main)))
                                  +      (let ((button (gtk-button-new-with-label "Button 1")))
                                  +        (g-signal-connect button "clicked"
                                  +                          (lambda (widget)
                                  +                            (declare (ignore widget))
                                  +                            (format t "Button 1 was pressed.~%")))
                                  +        (gtk-box-pack-start box button))
                                  +      (let ((button (gtk-button-new-with-label "Button 2")))
                                  +        (g-signal-connect button "clicked"
                                  +                          (lambda (widget)
                                  +                            (declare (ignore widget))
                                  +                            (format t "Button 2 was pressed.~%")))
                                  +        (gtk-box-pack-start box button))
                                  +      (gtk-container-add window box)
                                  +      (gtk-widget-show-all window))))
                                  +
                                  + +

                                  + +

                                  IUP

                                  + +

                                  Please check the installation instructions upstream. You may need one +system dependency on GNU/Linux, and to modify an environment variable +on Windows.

                                  + +

                                  Finally, do:

                                  + +
                                  (ql:quickload "iup")
                                  +
                                  + +

                                  We are not going to :use IUP (it is a bad practice generally after all).

                                  + +
                                  (defpackage :test-iup
                                  +  (:use :cl))
                                  +(in-package :test-iup)
                                  +
                                  + +

                                  The following snippet creates a dialog frame to display a text label.

                                  + +
                                  (defun hello ()
                                  +  (iup:with-iup ()
                                  +    (let* ((label (iup:label :title (format nil "Hello, World!~%IUP ~A~%~A ~A"
                                  +                                            (iup:version)
                                  +                                            (lisp-implementation-type)
                                  +                                            (lisp-implementation-version))))
                                  +           (dialog (iup:dialog label :title "Hello, World!")))
                                  +      (iup:show dialog)
                                  +      (iup:main-loop))))
                                  +(hello)
                                  +
                                  + +

                                  Important note for SBCL: we currently must trap division-by-zero +errors (see advancement on this +issue). So, run snippets +like so:

                                  + +
                                  (defun run-gui-function ()
                                  +  #-sbcl (gui-function)
                                  +  #+sbcl
                                  +  (sb-int:with-float-traps-masked
                                  +      (:divide-by-zero :invalid)
                                  +    (gui-function)))
                                  +
                                  + +

                                  How to run the main loop

                                  + +

                                  As with all the bindings seen so far, widgets are shown inside a +with-iup macro, and with a call to iup:main-loop.

                                  + +

                                  How to create widgets

                                  + +

                                  The constructor function is the name of the widget: iup:label, +iup:dialog.

                                  + +

                                  How to display a widget

                                  + +

                                  Be sure to “show†it: (iup:show dialog).

                                  + +

                                  You can group widgets on frames, and stack them vertically or +horizontally (with vbox or hbox, see the example below).

                                  + +

                                  To allow a widget to be expanded on window resize, use :expand +:yes (or :horizontal and :vertical).

                                  + +

                                  Use also the :alignement properties.

                                  + +

                                  How to get and set a widget’s attributes

                                  + +

                                  Use (iup:attribute widget attribute) to get the attribute’s value, +and use setf on it to set it.

                                  + +

                                  Reacting to events

                                  + +

                                  Most widgets take an :action parameter that takes a lambda function +with one parameter (the handle).

                                  + +
                                  (iup:button :title "Test &1"
                                  +            :expand :yes
                                  +            :tip "Callback inline at control creation"
                                  +            :action (lambda (handle)
                                  +                      (iup:message "title" "button1's action callback")
                                  +                      iup:+default+))
                                  +
                                  + +

                                  Below we create a label and put a button below it. We display a +message dialog when we click on the button.

                                  + +
                                  (defun click-button ()
                                  +  (iup:with-iup ()
                                  +    (let* ((label (iup:label :title (format nil "Hello, World!~%IUP ~A~%~A ~A"
                                  +                                            (iup:version)
                                  +                                            (lisp-implementation-type)
                                  +                                            (lisp-implementation-version))))
                                  +           (button (iup:button :title "Click me"
                                  +                               :expand :yes
                                  +                               :tip "yes, click me"
                                  +                               :action (lambda (handle)
                                  +                                         (declare (ignorable handle))
                                  +                                         (iup:message "title" "button clicked")
                                  +                                         iup:+default+)))
                                  +           (vbox
                                  +            (iup:vbox (list label button)
                                  +                      :gap "10"
                                  +                      :margin "10x10"
                                  +                      :alignment :acenter))
                                  +           (dialog (iup:dialog vbox :title "Hello, World!")))
                                  +      (iup:show dialog)
                                  +      (iup:main-loop))))
                                  +
                                  +#+sbcl
                                  +(sb-int:with-float-traps-masked
                                  +      (:divide-by-zero :invalid)
                                  +    (click-button))
                                  +
                                  + +

                                  Here’s a similar example to make a counter of clicks. We use a label +and its title to hold the count. The title is an integer.

                                  + +
                                  (defun counter ()
                                  +  (iup:with-iup ()
                                  +    (let* ((counter (iup:label :title 0))
                                  +           (label (iup:label :title (format nil "The button was clicked ~a time(s)."
                                  +                                            (iup:attribute counter :title))))
                                  +           (button (iup:button :title "Click me"
                                  +                               :expand :yes
                                  +                               :tip "yes, click me"
                                  +                               :action (lambda (handle)
                                  +                                         (declare (ignorable handle))
                                  +                                         (setf (iup:attribute counter :title)
                                  +                                               (1+ (iup:attribute counter :title 'number)))
                                  +                                         (setf (iup:attribute label :title)
                                  +                                               (format nil "The button was clicked ~a times."
                                  +                                                       (iup:attribute counter :title)))
                                  +                                         iup:+default+)))
                                  +           (vbox
                                  +            (iup:vbox (list label button)
                                  +                      :gap "10"
                                  +                      :margin "10x10"
                                  +                      :alignment :acenter))
                                  +           (dialog (iup:dialog vbox :title "Counter")))
                                  +      (iup:show dialog)
                                  +      (iup:main-loop))))
                                  +
                                  +(defun run-counter ()
                                  +  #-sbcl
                                  +  (counter)
                                  +  #+sbcl
                                  +  (sb-int:with-float-traps-masked
                                  +      (:divide-by-zero :invalid)
                                  +    (counter)))
                                  +
                                  + +

                                  List widget example

                                  + +

                                  Below we create three list widgets with simple and multiple selection, we +set their default value (the pre-selected row) and we place them +horizontally side by side.

                                  + +
                                  (defun list-test ()
                                  +  (iup:with-iup ()
                                  +    (let*  ((list-1 (iup:list :tip "List 1"  ;; tooltip
                                  +                              ;; multiple selection
                                  +                              :multiple :yes
                                  +                              :expand :yes))
                                  +            (list-2 (iup:list :value 2   ;; default index of the selected row
                                  +                              :tip "List 2" :expand :yes))
                                  +            (list-3 (iup:list :value 9 :tip "List 3" :expand :yes))
                                  +            (frame (iup:frame
                                  +                    (iup:hbox
                                  +                     (progn
                                  +                       ;; populate the lists: display integers.
                                  +                       (loop for i from 1 upto 10
                                  +                          do (setf (iup:attribute list-1 i)
                                  +                                   (format nil "~A" i))
                                  +                          do (setf (iup:attribute list-2 i)
                                  +                                   (format nil "~A" (+ i 10)))
                                  +                          do (setf (iup:attribute list-3 i)
                                  +                                   (format nil "~A" (+ i 50))))
                                  +                       ;; hbox wants a list of widgets.
                                  +                       (list list-1 list-2 list-3)))
                                  +                    :title "IUP List"))
                                  +            (dialog (iup:dialog frame :menu "menu" :title "List example")))
                                  +
                                  +      (iup:map dialog)
                                  +      (iup:show dialog)
                                  +      (iup:main-loop))))
                                  +
                                  +(defun run-list-test ()
                                  +  #-sbcl (hello)
                                  +  #+sbcl
                                  +  (sb-int:with-float-traps-masked
                                  +      (:divide-by-zero :invalid)
                                  +    (list-test)))
                                  +
                                  + +

                                  Nuklear

                                  + +

                                  Disclaimer: as per the author’s words at the time of writing, +bodge-ui is in early stages of development and not ready for general +use yet. There are some quirks that need to be fixed, which might +require some changes in the API.

                                  + +

                                  bodge-ui is not in Quicklisp but in its own Quicklisp distribution. Let’s install it:

                                  + +
                                  (ql-dist:install-dist "http://bodge.borodust.org/dist/org.borodust.bodge.txt" :replace t :prompt nil)
                                  +
                                  + +

                                  Uncomment and evaluate this line only if you want to enable the OpenGL 2 +renderer:

                                  + +
                                  ;; (cl:pushnew :bodge-gl2 cl:*features*)
                                  +
                                  + +

                                  Quickload bodge-ui-window:

                                  + +
                                  (ql:quickload "bodge-ui-window")
                                  +
                                  + +

                                  We can run the built-in example:

                                  + +
                                  (ql:quickload "bodge-ui-window/examples")
                                  +(bodge-ui-window.example.basic:run)
                                  +
                                  + +

                                  Now let’s define a package to write a simple application.

                                  + +
                                  (cl:defpackage :bodge-ui-window-test
                                  +  (:use :cl :bodge-ui :bodge-host))
                                  +(in-package :bodge-ui-window-test)
                                  +
                                  + +
                                  (defpanel (main-panel
                                  +           (:title "Hello Bodge UI")
                                  +           (:origin 200 50)
                                  +           (:width 400) (:height 400)
                                  +           (:options :movable :resizable
                                  +                     :minimizable :scrollable
                                  +                     :closable))
                                  +    (label :text "Nested widgets:")
                                  +  (horizontal-layout
                                  +   (radio-group
                                  +    (radio :label "Option 1")
                                  +    (radio :label "Option 2" :activated t))
                                  +   (vertical-layout
                                  +    (check-box :label "Check 1" :width 100)
                                  +    (check-box :label "Check 2"))
                                  +   (vertical-layout
                                  +    (label :text "Awesomely" :align :left)
                                  +    (label :text "Stacked" :align :centered)
                                  +    (label :text "Labels" :align :right)))
                                  +  (label :text "Expand by width:")
                                  +  (horizontal-layout
                                  +   (button :label "Dynamic")
                                  +   (button :label "Min-Width" :width 80)
                                  +   (button :label "Fixed-Width" :expandable nil :width 100))
                                  +  (label :text "Expand by width:")
                                  +  (horizontal-layout
                                  +   (button :label "1.0" :expand-ratio 1.0)
                                  +   (button :label "0.75" :expand-ratio 0.75)
                                  +   (button :label "0.5" :expand-ratio 0.5))
                                  +  (label :text "Rest:")
                                  +  (button :label "Top-level Button"))
                                  +
                                  +(defparameter *window-width* 800)
                                  +(defparameter *window-height* 600)
                                  +
                                  +(defclass main-window (bodge-ui-window:ui-window) ()
                                  +  (:default-initargs
                                  +   :title "Bodge UI Window Example"
                                  +   :width *window-width*
                                  +   :height *window-height*
                                  +   :panels '(main-panel)
                                  +   :floating t
                                  +   :opengl-version #+bodge-gl2 '(2 1)
                                  +                   #+bodge-gl2 '(3 3)))
                                  +
                                  +
                                  +(defun run ()
                                  +  (bodge-host:open-window (make-instance 'main-window)))
                                  +
                                  + +

                                  and run it:

                                  + +
                                  (run)
                                  +
                                  + +

                                  + +

                                  To react to events, use the following signals:

                                  + +
                                  :on-click
                                  +:on-hover
                                  +:on-leave
                                  +:on-change
                                  +:on-mouse-press
                                  +:on-mouse-release
                                  +
                                  + +

                                  They take as argument a function with one argument, the panel. But +beware: they will be called on each rendering cycle when the widget is +on the given state, so potentially a lot of times.

                                  + +

                                  Interactive development

                                  + +

                                  If you ran the example in the REPL, you couldn’t see what’s cool. Put +the code in a lisp file and run it, so than you get the window. Now +you can change the panel widgets and the layout, and your changes will +be immediately applied while the application is running!

                                  + +

                                  Conclusion

                                  + +

                                  Have fun, and don’t hesitate to share your experience and your apps.

                                  + + + +

                                  + Page source: gui.md +

                                  +
                                  + + + + + +
                                  +
                                  +
                                  + © 2002–2021 the Common Lisp Cookbook Project +
                                  + +
                                  +
                                  T
                                  O
                                  C
                                  +
                                  + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/index.html b/clones/lispcookbook.github.io/cl-cookbook/index.html new file mode 100644 index 00000000..ddc9f24a --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/index.html @@ -0,0 +1,274 @@ + + + + + Home + + + + + + + + + + + + + + +

                                  The Common Lisp Cookbook – Home

                                  +
                                  + + + + +
                                  +
                                  + +
                                  +
                                  + +
                                  +
                                  Table of Contents
                                  +
                                    +
                                    +
                                    + +
                                    +

                                    The Common Lisp Cookbook – Home

                                    + + +

                                    + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                    +

                                    + 📕 Get the EPUB and PDF +

                                    + + +
                                    +

                                    Cookbook, n. +a book containing recipes and other information about the preparation and cooking of food.

                                    + + +

                                    A Cookbook is an invaluable resource, as it shows how to do various things in a clear fashion without all the theoretical context. Sometimes you just need to look things up. While cookbooks can never replace proper documentation such as the HyperSpec or books such as Practical Common Lisp, every language deserves a good cookbook, Common Lisp included.

                                    + +

                                    The CL Cookbook aims to tackle all sort of topics, for the beginner as for the more advanced developer.

                                    + +

                                    Content

                                    + +

                                    + + + +

                                    Download in EPUB

                                    + +

                                    The Cookbook is also available in EPUB (and PDF) format.

                                    + +

                                    You can download it directly in EPUB and PDF, and you can pay what you want to further support its development:

                                    + +


                                    + +

                                    + Donate and download the EPUB version +

                                    + +


                                    + +

                                    Thank you!

                                    + +

                                    Translations

                                    + +

                                    The Cookbook has been translated to:

                                    + + + +

                                    Other CL Resources

                                    + +

                                    + + + +

                                    Books

                                    + + + +

                                    Advanced books

                                    + + + +

                                    Specifications

                                    + + + +

                                    Further remarks

                                    + +

                                    This is a collaborative project that aims to provide for Common Lisp something +similar to the Perl Cookbook published by O’Reilly. More details about +what it is and what it isn’t can be found in this thread from +comp.lang.lisp.

                                    + +

                                    If you want to contribute to the CL Cookbook, please send a pull request in or +file a ticket!

                                    + +

                                    Yes, we’re talking to you! We need contributors - write a chapter that’s missing +and add it, find an open question and provide an answer, find bugs and report +them, (If you have no idea what might be missing but would like to help, take a +look at the table of contents of the Perl Cookbook.) Don’t worry about +the formatting, just send plain text if you like - we’ll take care about that +later.

                                    + +

                                    Thanks in advance for your help!

                                    + +

                                    The pages here on Github are kept up to date. You can also download a +up to date zip file for offline browsing. More info can be found at the +Github project page.

                                    + +
                                    + +
                                    + + + +

                                    + Page source: index.md +

                                    +
                                    + + + + + +
                                    +
                                    +
                                    + © 2002–2021 the Common Lisp Cookbook Project +
                                    + +
                                    +
                                    T
                                    O
                                    C
                                    +
                                    + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/io.html b/clones/lispcookbook.github.io/cl-cookbook/io.html new file mode 100644 index 00000000..917fffa6 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/io.html @@ -0,0 +1,293 @@ + + + + + Input/Output + + + + + + + + + + + + + + +

                                    The Common Lisp Cookbook – Input/Output

                                    +
                                    + + + + +
                                    +
                                    + +
                                    +
                                    + +
                                    +
                                    Table of Contents
                                    +
                                      +
                                      +
                                      + +
                                      +

                                      The Common Lisp Cookbook – Input/Output

                                      + + +

                                      + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                      +

                                      + 📕 Get the EPUB and PDF +

                                      + + +

                                      + +

                                      Redirecting the Standard Output of your Program

                                      + +

                                      You do it like this:

                                      + +
                                      (let ((*standard-output* <some form generating a stream>))
                                      +  ...)
                                      +
                                      + +

                                      Because +*STANDARD-OUTPUT* +is a dynamic variable, all references to it during execution of the body of the +LET form refer to the stream that you bound it to. After exiting the LET +form, the old value of *STANDARD-OUTPUT* is restored, no matter if the exit +was by normal execution, a RETURN-FROM leaving the whole function, an +exception, or what-have-you. (This is, incidentally, why global variables lose +much of their brokenness in Common Lisp compared to other languages: since they +can be bound for the execution of a specific form without the risk of losing +their former value after the form has finished, their use is quite safe; they +act much like additional parameters that are passed to every function.)

                                      + +

                                      If the output of the program should go to a file, you can do the following:

                                      + +
                                      (with-open-file (*standard-output* "somefile.dat" :direction :output
                                      +                                   :if-exists :supersede)
                                      +  ...)
                                      +
                                      + +

                                      WITH-OPEN-FILE +opens the file - creating it if necessary - binds *STANDARD-OUTPUT*, executes +its body, closes the file, and restores *STANDARD-OUTPUT* to its former +value. It doesn’t get more comfortable than this!

                                      + +

                                      Faithful Output with Character Streams

                                      + +

                                      By faithful output I mean that characters with codes between 0 and 255 will be +written out as is. It means, that I can (PRINC (CODE-CHAR 0..255) s) to a +stream and expect 8-bit bytes to be written out, which is not obvious in the +times of Unicode and 16 or 32 bit character representations. It does not +require that the characters ä, ß, or þ must have their +CHAR-CODE +in the range 0..255 - the implementation is free to use any code. But it does +require that no #\Newline to CRLF translation takes place, among others.

                                      + +

                                      Common Lisp has a long tradition of distinguishing character from byte (binary) +I/O, +e.g. READ-BYTE +and +READ-CHAR +are in the standard. Some implementations let both functions be called +interchangeably. Others allow either one or the other. (The +simple stream proposal defines the +notion of a bivalent stream where both are possible.)

                                      + +

                                      Varying element-types are useful as some protocols rely on the ability to send +8-Bit output on a channel. E.g. with HTTP, the header is normally ASCII and +ought to use CRLF as line terminators, whereas the body can have the MIME type +application/octet-stream, where CRLF translation would destroy the data. (This +is how the Netscape browser on MS-Windows destroys data sent by incorrectly +configured Webservers which declare unknown files as having MIME type +text/plain - the default in most Apache configurations).

                                      + +

                                      What follows is a list of implementation dependent choices and behaviours and some code to experiment.

                                      + +

                                      CLISP

                                      + +

                                      On CLISP, faithful output is possible using

                                      + +
                                      :external-format
                                      +(ext:make-encoding :charset 'charset:iso-8859-1 :line-terminator :unix)
                                      +
                                      + +

                                      You can also use (SETF (STREAM-ELEMENT-TYPE F) '(UNSIGNED-BYTE 8)), where the +ability to SETF is a CLISP-specific extension. Using :EXTERNAL-FORMAT :UNIX +will cause portability problems, since the default character set on MS-Windows +is CHARSET:CP1252. CHARSET:CP1252 doesn’t allow output of e.g. (CODE-CHAR +#x81):

                                      + +
                                      ;*** - Character #\u0080 cannot be represented in the character set CHARSET:CP1252
                                      +
                                      + +

                                      Characters with code > 127 cannot be represented in ASCII:

                                      + +
                                      ;*** - Character #\u0080 cannot be represented in the character set CHARSET:ASCII
                                      +
                                      + +

                                      CMUCL

                                      + +

                                      :EXTERNAL-FORMAT :DEFAULT (untested) - no unicode, so probably no problems.

                                      + +

                                      AllegroCL

                                      + +

                                      #+(AND ALLEGRO UNIX) :DEFAULT (untested) - seems enough on UNIX, but would not +work on the MS-Windows port of AllegroCL.

                                      + +

                                      LispWorks

                                      + +

                                      :EXTERNAL-FORMAT '(:LATIN-1 :EOL-STYLE :LF) (confirmed by Marc Battyani)

                                      + +

                                      Example

                                      + +

                                      Here’s some sample code to play with:

                                      + +
                                      (defvar *unicode-test-file* "faithtest-out.txt")
                                      +
                                      +(defun generate-256 (&key (filename *unicode-test-file*)
                                      +			  #+CLISP (charset 'charset:iso-8859-1)
                                      +                          external-format)
                                      +  (let ((e (or external-format
                                      +	       #+CLISP (ext:make-encoding :charset charset :line-terminator :unix))))
                                      +    (describe e)
                                      +    (with-open-file (f filename :direction :output
                                      +		     :external-format e)
                                      +      (write-sequence
                                      +        (loop with s = (make-string 256)
                                      +	      for i from 0 to 255
                                      +	      do (setf (char s i) (code-char i))
                                      +	      finally (return s))
                                      +       f)
                                      +      (file-position f))))
                                      +
                                      +;(generate-256 :external-format :default)
                                      +;#+CLISP (generate-256 :external-format :unix)
                                      +;#+CLISP (generate-256 :external-format 'charset:ascii)
                                      +;(generate-256)
                                      +
                                      +(defun check-256 (&optional (filename *unicode-test-file*))
                                      +  (with-open-file (f filename :direction :input
                                      +		     :element-type '(unsigned-byte 8))
                                      +    (loop for i from 0
                                      +	  for c = (read-byte f nil nil)
                                      +	  while c
                                      +	  unless (= c i)
                                      +	  do (format t "~&Position ~D found ~D(#x~X)." i c c)
                                      +	  when (and (= i 33) (= c 32))
                                      +	  do (let ((c (read-byte f)))
                                      +	       (format t "~&Resync back 1 byte ~D(#x~X) - cause CRLF?." c c) ))
                                      +    (file-length f)))
                                      +
                                      +#| CLISP
                                      +(check-256 *unicode-test-file*)
                                      +(progn (generate-256 :external-format :unix) (check-256))
                                      +; uses UTF-8 -> 385 bytes
                                      +
                                      +(progn (generate-256 :charset 'charset:iso-8859-1) (check-256))
                                      +
                                      +(progn (generate-256 :external-format :default) (check-256))
                                      +; uses UTF-8 + CRLF(on MS-Windows) -> 387 bytes
                                      +
                                      +(progn (generate-256 :external-format
                                      +  (ext:make-encoding :charset 'charset:iso-8859-1 :line-terminator :mac)) (check-256))
                                      +(progn (generate-256 :external-format
                                      +  (ext:make-encoding :charset 'charset:iso-8859-1 :line-terminator :dos)) (check-256))
                                      +|#
                                      +
                                      + +

                                      + +

                                      Fast Bulk I/O

                                      + +

                                      If you need to copy a lot of data and the source and destination are both +streams (of the same +element type), +it’s very fast to use +READ-SEQUENCE +and +WRITE-SEQUENCE:

                                      + +
                                      (let ((buf (make-array 4096 :element-type (stream-element-type input-stream))))
                                      +  (loop for pos = (read-sequence buf input-stream)
                                      +        while (plusp pos)
                                      +        do (write-sequence buf output-stream :end pos)))
                                      +
                                      + + +

                                      + Page source: io.md +

                                      +
                                      + + + + + +
                                      +
                                      +
                                      + © 2002–2021 the Common Lisp Cookbook Project +
                                      + +
                                      +
                                      T
                                      O
                                      C
                                      +
                                      + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/iteration.html b/clones/lispcookbook.github.io/cl-cookbook/iteration.html new file mode 100644 index 00000000..f3becbaa --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/iteration.html @@ -0,0 +1,1501 @@ + + + + + Loop, iteration, mapping + + + + + + + + + + + + + + +

                                      The Common Lisp Cookbook – Loop, iteration, mapping

                                      +
                                      + + + + +
                                      +
                                      + +
                                      +
                                      + +
                                      +
                                      Table of Contents
                                      +
                                        +
                                        +
                                        + +
                                        +

                                        The Common Lisp Cookbook – Loop, iteration, mapping

                                        + + +

                                        + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                        +

                                        + 📕 Get the EPUB and PDF +

                                        + + +
                                        + +

                                        Introduction: loop, iterate, for, mapcar, series

                                        + +

                                        loop +is the built-in macro for iteration.

                                        + +

                                        Its simplest form is (loop (print "hello")): this will print forever.

                                        + +

                                        A simple iteration over a list is:

                                        + +
                                        (loop for x in '(1 2 3)
                                        +  do (print x))
                                        +
                                        + +

                                        It prints what’s needed but returns nil.

                                        + +

                                        If you want to return a list, use collect:

                                        + +
                                        (loop for x in '(1 2 3)
                                        +  collect (* x 10))
                                        +;; (10 20 30)
                                        +
                                        + +

                                        The Loop macro is different than most Lisp expressions in having a complex +internal domain-specific language that doesn’t use s-expressions. +So you need to read Loop expressions with half of your brain in Lisp mode, and +the other half in Loop mode. You love it or you hate it.

                                        + +

                                        Think of Loop expressions as having four parts: expressions that set up +variables that will be iterated, expressions that conditionally terminate the +iteration, expressions that do something on each iteration, and expressions that +do something right before the Loop exits. In addition, Loop expressions can +return a value. It is very rare to use all of these parts in a given Loop +expression, but you can combine them in many ways.

                                        + +

                                        iterate is a +popular iteration macro that aims at being simpler, “lispier†and more +predictable than loop, besides being extensible. However it isn’t built-in, +so you have to import it:

                                        + +
                                        (ql:quickload "iterate")
                                        +(use-package :iterate)
                                        +
                                        + +

                                        Iterate looks like this:

                                        + +
                                        (iter (for i from 1 to 5)
                                        +    (collect (* i i)))
                                        +
                                        + +

                                        (if you use loop and iterate in the same package, you might run into name conflicts)

                                        + +

                                        Iterate also comes with display-iterate-clauses that can be quite handy:

                                        + +
                                        (display-iterate-clauses '(for))
                                        +;; FOR PREVIOUS &OPTIONAL INITIALLY BACK     Previous value of a variable
                                        +;; FOR FIRST THEN            Set var on first, and then on subsequent iterations
                                        +;; ...
                                        +
                                        + +

                                        Much of the examples on this page that are valid for loop are also valid for iterate, +with minor modifications.

                                        + +

                                        for is an extensible iteration +macro that is often shorter than loop, that “unlike loop is extensible +and sensible, and unlike iterate does not require code-walking and is +easier to extendâ€.

                                        + +

                                        It has the other advantage of having one construct that works for all +data structures (lists, vectors, hash-tables…): in doubt, just use +for… over:

                                        + +
                                        (for:for ((x over <your data structure>))
                                        +   (print …))
                                        +
                                        + +

                                        You also have to quickload it:

                                        + +
                                        (ql:quickload "for")
                                        +
                                        + +

                                        We’ll also give examples with mapcar and map, and eventually +with their friends mapcon, mapcan, maplist, mapc and mapl +which E. Weitz categorizes very well in his “Common Lisp Recipesâ€, +chap. 7. The one you are certainly accustomed to from other languages is +mapcar: it takes a function, one or more lists as arguments, +applies the function on each element of the lists one by one and +returns a list of result.

                                        + +
                                        (mapcar (lambda (it) (+ it 10)) '(1 2 3))
                                        +(11 12 13)
                                        +
                                        + +

                                        map is generic, it accepts list and vectors as arguments, and +expects the type for its result as first argument:

                                        + +
                                        (map 'vector (lambda (it) (+ it 10)) '(1 2 3))
                                        +;; #(11 12 13)
                                        +(map 'list (lambda (it) (+ it 10)) #(1 2 3))
                                        +;; (11 12 13)
                                        +(map 'string (lambda (it) (code-char it)) '#(97 98 99))
                                        +;; "abc"
                                        +
                                        + +

                                        The other constructs have their advantages in some situations ;) They +either process the tails of lists, or concatenate the return +values, or don’t return anything. We’ll see some of them.

                                        + +

                                        If you like mapcar, use it a lot, and would like a quicker and +shorter way to write lambdas, then you might like one of those +lambda shorthand libraries.

                                        + +

                                        Here is an example with cl-punch:

                                        + +
                                        (mapcar ^(* _ 10) '(1 2 3))
                                        +;; (10 20 30)
                                        +
                                        + +

                                        and voilà :) We won’t use this more in this recipe, but feel free to do.

                                        + +

                                        Last but not least, you might like +series, +a library that describes itself as combining aspects of sequences, +streams, and loops. Series expressions look like operations on +sequences (= functional programming), but can achieve the same high level of efficiency as a +loop. Series first appeared in “Common Lisp the Languageâ€, in the +appendix A (it nearly became part of the language). Series looks like +this:

                                        + +
                                        (collect
                                        +  (mapping ((x (scan-range :from 1 :upto 5)))
                                        +    (* x x)))
                                        +;; (1 4 9 16 25)
                                        +
                                        + +

                                        series is good, but its function names are different from what we +find in functional languages today. You might like the “Generators +The Way I Want Them Generated†+library. It is a lazy sequences library, similar to series although +younger and not as complete, with a “modern†API with words like take, filter, +for or fold, and that is easy to use.

                                        + +
                                        (range :from 20)
                                        +;; #<GTWIWTG::GENERATOR! {1001A90CA3}>
                                        +
                                        +(take 4 (range :from 20))
                                        +;; (20 21 22 23)
                                        +
                                        + +

                                        At the time of writing, GTWIWTG is licensed under the GPLv3.

                                        + +

                                        Recipes

                                        + +

                                        Looping forever, return

                                        + +
                                        (loop
                                        +    (print "hello"))
                                        +
                                        + +

                                        return can return a result:

                                        + +
                                        (loop for i in '(1 2 3)
                                        +     when (> i 1)
                                        +     return i)
                                        +2
                                        +
                                        + +

                                        Looping a fixed number of times

                                        + +

                                        dotimes

                                        + +
                                        (dotimes (n 3)
                                        +  (print n))
                                        +;; =>
                                        +;; 0
                                        +;; 1
                                        +;; 2
                                        +;; NIL
                                        +
                                        + +

                                        Here dotimes returns nil. There are two ways to return a value. First, you can set a result form in the lambda list:

                                        + +
                                        (dotimes (n 3 :done)
                                        +  ;;          ^^^^^ result form. It can be a s-expression.
                                        +  (print n))
                                        +;; =>
                                        +;; 0
                                        +;; 1
                                        +;; 2
                                        +;; :DONE
                                        +
                                        + +

                                        Or you can use return with return values:

                                        + +
                                        (dotimes (i 3)
                                        +   (if (> i 1)
                                        +       (return :early-exit!)
                                        +       (print i)))
                                        +;; =>
                                        +;; 0
                                        +;; 1
                                        +;; :EARLY-EXIT!
                                        +
                                        + +

                                        loop… repeat

                                        + +
                                        (loop repeat 10
                                        +  do (format t "Hello!~%"))
                                        +
                                        + +

                                        This prints 10 times “hello†and returns nil.

                                        + +
                                        (loop repeat 10 collect (random 10))
                                        +;; (5 1 3 5 4 0 7 4 9 1)
                                        +
                                        + +

                                        with collect, this returns a list.

                                        + +

                                        Series

                                        + +
                                        (iterate ((n (scan-range :below 10)))
                                        +  (print n))
                                        +
                                        + +

                                        Looping an infinite number of times, cycling over a circular list

                                        + +

                                        First, as shown above, we can simply use (loop ...) to loop +infinitely. Here we show how to loop on a list forever.

                                        + +

                                        We can build an infinite list by setting its last element to the list itself:

                                        + +
                                        (loop with list-a = '(1 2 3)
                                        +      with infinite-list = (setf (cdr (last list-a)) list-a)
                                        +      for item in infinite-list
                                        +      repeat 8
                                        +      collect item)
                                        +;; (1 2 3 1 2 3 1 2)
                                        +
                                        + +

                                        Illustration: (last '(1 2 3)) is (3), a list, or rather a cons cell, whose car is 3 and cdr is NIL. See the data-structures chapter for a reminder. This is the representation of (list 3):

                                        + +
                                        [o|/]
                                        + |
                                        + 3
                                        +
                                        + +

                                        The representation of (list 1 2 3):

                                        + +
                                        [o|o]---[o|o]---[o|/]
                                        + |       |       |
                                        + 1       2       3
                                        +
                                        + +

                                        By setting the cdr of the last element to the list itself, we make it recur on itself.

                                        + +

                                        A notation shortcut is possible with the #= syntax:

                                        + +
                                        (defparameter *list-a* '#1=(1 2 3 . #1#))
                                        +(setf *print-circle* t)  ;; don't print circular lists forever
                                        +*list-a*
                                        +
                                        + +

                                        If you need to alternate only between two values, use for … then:

                                        + +
                                        (loop repeat 4
                                        +      for up = t then (not up)
                                        +      do (print up))
                                        +T
                                        +NIL
                                        +T
                                        +NIL
                                        +
                                        + +

                                        Iterate’s for loop

                                        + +

                                        For lists and vectors:

                                        + +
                                        (iter (for item in '(1 2 3))
                                        +  (print item))
                                        +(iter (for i in-vector #(1 2 3))
                                        +  (print i))
                                        +
                                        + +

                                        or, a generalized iteration clause for lists and vectors, use +in-sequence (you’ll pay a speed penalty).

                                        + +

                                        Looping over a hash-table is also straightforward:

                                        + +
                                        (let ((h (let ((h (make-hash-table)))
                                        +           (setf (gethash 'a h) 1)
                                        +           (setf (gethash 'b h) 2)
                                        +           h)))
                                        +  (iter (for (k v) in-hashtable h)
                                        +    (print k)))
                                        +;; b
                                        +;; a
                                        +
                                        + +

                                        In fact, take a look here, +or (display-iterate-clauses '(for)) to know about iterating over

                                        + +
                                          +
                                        • symbols in-package
                                        • +
                                        • forms - or lines, or whatever-you-wish - in-file, or in-stream
                                        • +
                                        • elements in-sequence - sequences can be vectors or lists
                                        • +
                                        + +

                                        Looping over a list

                                        + +

                                        dolist

                                        + +
                                        (dolist (item '(1 2 3))
                                        +  (print item))
                                        +
                                        + +

                                        dolist returns nil.

                                        + +

                                        loop

                                        + +

                                        with in, no surprises:

                                        + +
                                        (loop for x in '(a b c)
                                        +      do (print x))
                                        +;; A
                                        +;; B
                                        +;; C
                                        +;; NIL
                                        +
                                        + +
                                        (loop for x in '(a b c)
                                        +      collect x)
                                        +;; (A B C)
                                        +
                                        + +

                                        With on, we loop over the cdr of the list:

                                        + +
                                        (loop for i on '(1 2 3) do (print i))
                                        +;; (1 2 3)
                                        +;; (2 3)
                                        +;; (3)
                                        +
                                        + +

                                        mapcar

                                        + +
                                        (mapcar (lambda (x)
                                        +             (print (* x 10)))
                                        +         '(1 2 3))
                                        +10
                                        +20
                                        +30
                                        +(10 20 30)
                                        +
                                        + +

                                        mapcar returns the results of the lambda function as a list.

                                        + +

                                        Series

                                        +
                                        (iterate ((item (scan '(1 2 3))))
                                        +  (print item))
                                        +
                                        + +

                                        scan-sublists is the equivalent of loop for ... on:

                                        + +
                                        (iterate ((i (scan-sublists '(1 2 3))))
                                        +  (print i))
                                        +
                                        + +

                                        Looping over a vector

                                        + +

                                        loop: across

                                        + +
                                        (loop for i across #(1 2 3) do (print i))
                                        +
                                        + +

                                        Series

                                        + +
                                        (iterate ((i (scan #(1 2 3))))
                                        +  (print i))
                                        +
                                        + +

                                        Looping over a hash-table

                                        + +

                                        We create a hash-table:

                                        + +
                                        (defparameter h (make-hash-table))
                                        +(setf (gethash 'a h) 1)
                                        +(setf (gethash 'b h) 2)
                                        +
                                        + +

                                        loop

                                        + +

                                        Looping over keys:

                                        + +
                                        (loop for k being the hash-key of h do (print k))
                                        +;; b
                                        +;; a
                                        +
                                        + +

                                        same with hash-value.

                                        + +

                                        Looping over key-values pairs:

                                        + +
                                        (loop for k
                                        +    being the hash-key
                                        +    using (hash-value v) of h
                                        +    do (format t "~a ~a~%" k v))
                                        +b 2
                                        +a 1
                                        +
                                        + +

                                        iterate

                                        + +

                                        Use in-hashtable:

                                        + +
                                        (iter (for (key value) in-hashtable h)
                                        +  (collect (list key value)))
                                        +
                                        + +

                                        for

                                        + +

                                        the same with for:

                                        + +
                                        (for:for ((it over h))
                                        +    (print it))
                                        +(A 1)
                                        +(B 2)
                                        +NIL
                                        +
                                        + +

                                        maphash

                                        + +

                                        The lambda function of maphash takes two arguments: the key and the +value:

                                        + +
                                        (maphash (lambda (key val)
                                        +             (format t "key: ~a val:~a~&" key val))
                                        +          h)
                                        +;; key: A val:1
                                        +;; key: B val:2
                                        +;; NIL
                                        +
                                        + +

                                        See also with-hash-table-iterator.

                                        + +

                                        dohash

                                        + +

                                        Only because we like this topic, we introduce another library, trivial-do. It has the dohash macro, that ressembles dolist:

                                        + +
                                        (dohash (key value h)
                                        +  (format t "key: ~A, value: ~A~%" key value))
                                        +
                                        + +

                                        Series

                                        +
                                        (iterate (((k v) (scan-hash h)))
                                        +  (format t "~&~a ~a~%" k v))
                                        +
                                        + +

                                        Looping over two lists in parallel

                                        + +

                                        loop

                                        + +
                                        (loop for x in '(a b c)
                                        +      for y in '(1 2 3)
                                        +      collect (list x y))
                                        +;; ((A 1) (B 2) (C 3))
                                        +
                                        + +

                                        To return a flat list, use nconcing instead of collect:

                                        + +
                                        (loop for x in '(a b c)
                                        +      for y in '(1 2 3)
                                        +      nconcing (list x y))
                                        +(A 1 B 2 C 3)
                                        +
                                        + +

                                        If a list is smaller than the other one, loop stops at the end of the small one:

                                        + +
                                        (loop for x in '(a b c)
                                        +      for y in '(1 2 3 4 5)
                                        +      collect (list x y))
                                        +;; ((A 1) (B 2) (C 3))
                                        +
                                        + +

                                        We could loop over the biggest list and manually access the elements +of the smaller one by index, but it would quickly be +inefficient. Instead, we can tell loop to extend the short list.

                                        + +
                                        (loop for y in '(1 2 3 4 5)
                                        +      for x-list = '(a b c) then (cdr x-list)
                                        +      for x = (or (car x-list) 'z)
                                        +      collect (list x y))
                                        +;; ((A 1) (B 2) (C 3) (Z 4) (Z 5))
                                        +
                                        + +

                                        The trick is that the notation for … = … then (cdr …) (note the = +and the role of then) shortens our intermediate list at each +iteration (thanks to cdr). It will first be '(a b c), the initial +value, then we will get the cdr: (2 3), then (3), then +NIL. And both (car NIL) and (cdr NIL) return NIL, so we are +good.

                                        + +

                                        mapcar

                                        +
                                        (mapcar (lambda (x y)
                                        +          (list x y))
                                        +        '(a b c)
                                        +        '(1 2 3))
                                        +;; ((A 1) (B 2) (C 3))
                                        +
                                        + +

                                        or simply:

                                        + +
                                        (mapcar #'list
                                        +        '(a b c)
                                        +        '(1 2 3))
                                        +;; ((A 1) (B 2) (C 3))
                                        +
                                        + +

                                        Return a flat list:

                                        + +
                                        (mapcan (lambda (x y)
                                        +          (list x y))
                                        +        '(a b c)
                                        +        '(1 2 3))
                                        +;; (A 1 B 2 C 3)
                                        +
                                        + +

                                        Series

                                        +
                                        (collect
                                        +  (#Mlist (scan '(a b c))
                                        +          (scan '(1 2 3))))
                                        +
                                        + +

                                        A more efficient way, when the lists are known to be of equal length:

                                        + +
                                        (collect
                                        +  (mapping (((x y) (scan-multiple 'list
                                        +                                  '(a b c)
                                        +                                  '(1 2 3))))
                                        +    (list x y)))
                                        +
                                        + +

                                        Return a flat list:

                                        + +
                                        (collect-append ; or collect-nconc
                                        + (mapping (((x y) (scan-multiple 'list
                                        +                                 '(a b c)
                                        +                                 '(1 2 3))))
                                        +   (list x y)))
                                        +
                                        + +

                                        Nested loops

                                        +

                                        loop

                                        + +
                                        (loop for x from 1 to 3
                                        +      collect (loop for y from 1 to x
                                        +		    collect y))
                                        +;; ((1) (1 2) (1 2 3))
                                        +
                                        + +

                                        To return a flat list, use nconcing instead of the first collect.

                                        + +

                                        iterate

                                        + +
                                        (iter outer
                                        +   (for i below 2)
                                        +   (iter (for j below 3)
                                        +      (in outer (collect (list i j)))))
                                        +;; ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2))
                                        +
                                        + +

                                        Series

                                        + +
                                        (collect
                                        +  (mapping ((x (scan-range :from 1 :upto 3)))
                                        +    (collect (scan-range :from 1 :upto x))))
                                        +
                                        + +

                                        Computing an intermediate value

                                        + +

                                        Use =.

                                        + +

                                        With for:

                                        + +
                                        (loop for x from 1 to 3
                                        +      for y = (* x 10)
                                        +      collect y)
                                        +;; (10 20 30)
                                        +
                                        + +

                                        With with, the difference being that the value is computed only +once:

                                        + +
                                        (loop for x from 1 to 3
                                        +      for y = (* x 10)
                                        +      with z = x
                                        +      collect (list x y z))
                                        +;; ((1 10 1) (2 20 1) (3 30 1))
                                        +
                                        + +

                                        The HyperSpec defines the with clause like this:

                                        + +
                                        with-clause::= with var1 [type-spec] [= form1] {and var2 [type-spec] [= form2]}*
                                        +
                                        + +

                                        so it turns out we can specify the type before the = and chain the with with and:

                                        + +
                                        (loop for x from 1 to 3
                                        +      for y integer = (* x 10)
                                        +      with z integer = x
                                        +      collect (list x y z))
                                        +
                                        + +
                                        (loop for x upto 3
                                        +      with foo = :foo
                                        +      and bar = :bar
                                        +      collect (list x foo bar))
                                        +
                                        + +

                                        We can also give for a then clause that will be called at each iteration:

                                        + +
                                        (loop repeat 3
                                        +      for intermediate = 10 then (incf intermediate)
                                        +      do (print intermediate))
                                        +10
                                        +11
                                        +12
                                        +
                                        + +

                                        Here’s a trick to alternate a boolean:

                                        + +
                                        (loop repeat 4
                                        +      for up = t then (not up)
                                        +      do (print up))
                                        +
                                        +T
                                        +NIL
                                        +T
                                        +NIL
                                        +
                                        + +

                                        Loop with a counter

                                        +

                                        loop

                                        +

                                        Iterate through a list, and have a counter iterate in parallel. The length of +the list determines when the iteration ends. Two sets of actions are defined, +one of which is executed conditionally.

                                        + +
                                        * (loop for x in '(a b c d e)
                                        +      for y from 1
                                        +
                                        +      when (> y 1)
                                        +      do (format t ", ")
                                        +
                                        +      do (format t "~A" x)
                                        +      )
                                        +
                                        +A, B, C, D, E
                                        +NIL
                                        +
                                        + +

                                        We could also write the preceding loop using the IF construct.

                                        + +
                                        * (loop for x in '(a b c d e)
                                        +      for y from 1
                                        +
                                        +      if (> y 1)
                                        +      do (format t ", ~A" x)
                                        +      else do (format t "~A" x)
                                        +      )
                                        +
                                        +A, B, C, D, E
                                        +NIL
                                        +
                                        + +

                                        Series

                                        + +

                                        By iterating on multiple series in parallel, and using an infinite +range, we can make a counter.

                                        + +
                                        (iterate ((x (scan '(a b c d e)))
                                        +          (y (scan-range :from 1)))
                                        +  (when (> y 1) (format t ", "))
                                        +  (format t "~A" x))
                                        +
                                        + +

                                        Ascending, descending order, limits

                                        +

                                        loop

                                        + +

                                        from… to…:

                                        + +
                                        (loop for i from 0 to 10
                                        +      do (print i))
                                        +;; 0 1 2 3 4 5 6 7 8 9 10
                                        +
                                        + +

                                        from… below…: this stops at 9:

                                        + +
                                        (loop for i from 0 below 10
                                        +      do (print i))
                                        +
                                        + +

                                        Similarly, use from 10 downto 0 (10…0) and from 10 above 0 (10…1).

                                        + +

                                        Series

                                        + +

                                        :from ... :upto, including the upper limit:

                                        + +
                                        (iterate ((i (scan-range :from 0 :upto 10)))
                                        +  (print i))
                                        +
                                        + +

                                        :from ... :below, excluding the upper limit:

                                        + +
                                        (iterate ((i (scan-range :from 0 :below 10)))
                                        +  (print i))
                                        +
                                        + +

                                        Steps

                                        +

                                        loop

                                        + +

                                        with by:

                                        + +
                                        (loop for i from 1 to 10 by 2
                                        +      do (print i))
                                        +
                                        + +

                                        if you use by (1+ (random 3)), the random is evaluated only once, as +if it was in a closure:

                                        + +
                                        (let ((step (random 3)))
                                        +   (loop for i from 1 to 10 by (+ 1 step)
                                        +      do (print i)))
                                        +
                                        + +

                                        The step must always be a positive number. If you want to count down, see above.

                                        + +

                                        Series

                                        + +

                                        with :by

                                        +
                                        (iterate ((i (scan-range :from 1 :upto 10 :by 2)))
                                        +  (print i))
                                        +
                                        + +

                                        Loop and conditionals

                                        +

                                        loop

                                        + +

                                        with if, else and finally:

                                        + +
                                        ;; https://riptutorial.com/common-lisp/example/11095/conditionally-executing-loop-clauses
                                        +(loop repeat 10
                                        +      for x = (random 100)
                                        +      if (evenp x)
                                        +        collect x into evens
                                        +      else
                                        +        collect x into odds
                                        +      finally (return (values evens odds)))
                                        +
                                        + +
                                        (42 82 24 92 92)
                                        +(55 89 59 13 49)
                                        +
                                        + +

                                        Combining multiple clauses in an if body requires special syntax (and +do, and count):

                                        + +
                                         (loop repeat 10
                                        +       for x = (random 100)
                                        +       if (evenp x)
                                        +          collect x into evens
                                        +          and do (format t "~a is even!~%" x)
                                        +       else
                                        +          collect x into odds
                                        +          and count t into n-odds
                                        +       finally (return (values evens odds n-odds)))
                                        +
                                        +
                                        46 is even!
                                        +8 is even!
                                        +76 is even!
                                        +58 is even!
                                        +0 is even!
                                        +(46 8 76 58 0)
                                        +(7 45 43 15 69)
                                        +5
                                        +
                                        + +

                                        iterate

                                        + +

                                        Translating (or even writing!) the above example using iterate is straight-forward:

                                        + +
                                        (iter (repeat 10)
                                        +   (for x = (random 100))
                                        +   (if (evenp x)
                                        +       (progn
                                        +         (collect x into evens)
                                        +         (format t "~a is even!~%" x))
                                        +       (progn
                                        +         (collect x into odds)
                                        +         (count t into n-odds)))
                                        +   (finally (return (values evens odds n-odds))))
                                        +
                                        + +

                                        Series

                                        + +

                                        The preceding loop would be done a bit differently in Series. split +sorts one series into multiple according to provided boolean series.

                                        + +
                                        (let* ((number (#M(lambda (n) (random 100))
                                        +                  (scan-range :below 10)))
                                        +       (parity (#Mevenp number)))
                                        +  (iterate ((n number) (p parity))
                                        +    (when p (format t "~a is even!~%" n)))
                                        +  (multiple-value-bind (evens odds) (split number parity)
                                        +    (values (collect evens)
                                        +            (collect odds)
                                        +            (collect-length odds))))
                                        +
                                        + +

                                        Note that although iterate and the three collect expressions are +written sequentially, only one iteration is performed, the same as the +example with loop.

                                        + +

                                        Begin the loop with a clause (initially)

                                        + +
                                        (loop initially
                                        +      (format t "~a " 'loop-begin)
                                        +      for x below 3
                                        +      do (format t "~a " x))
                                        +;; LOOP-BEGIN 0 1 2
                                        +
                                        + +

                                        initially also exists with iterate.

                                        + +

                                        Terminate the loop with a test (until, while)

                                        +

                                        loop

                                        + +
                                        (loop for x in '(1 2 3 4 5)
                                        +	until (> x 3)
                                        +	collect x)
                                        +;; (1 2 3)
                                        +
                                        + +

                                        the same, with while:

                                        + +
                                        (loop for x in '(1 2 3 4 5)
                                        +	while (< x 4)
                                        +	collect x)
                                        +
                                        + +

                                        Series

                                        + +

                                        We truncate the series with until-if, then collect from its result.

                                        + +
                                        (collect
                                        +  (until-if (lambda (i) (> i 3))
                                        +            (scan '(1 2 3 4 5))))
                                        +
                                        + +

                                        Loop, print and return a result

                                        +

                                        loop

                                        + +

                                        do and collect can be combined in one expression

                                        + +
                                        (loop for x in '(1 2 3 4 5)
                                        +	while (< x 4)
                                        +        do (format t "x is ~a~&" x)
                                        +	collect x)
                                        +x is 1
                                        +x is 2
                                        +x is 3
                                        +(1 2 3)
                                        +
                                        + +

                                        Series

                                        +

                                        By mapping, we can perform a side effect and also collect items

                                        + +
                                        (collect
                                        +  (mapping ((x (until-if (complement (lambda (x) (< x 4)))
                                        +                         (scan '(1 2 3 4 5)))))
                                        +    (format t "x is ~a~&" x)
                                        +    x))
                                        +
                                        + +

                                        Named loops and early exit

                                        +

                                        loop

                                        + +

                                        The special loop named foo syntax allows you to create a loop that +you can exit early from. The exit is performed using return-from, +and can be used from within nested loops.

                                        + +
                                        ;; useless example
                                        +(loop named loop-1
                                        +    for x from 0 to 10 by 2
                                        +    do (loop for y from 0 to 100 by (1+ (random 3))
                                        +            when (< x y)
                                        +            do (return-from loop-1 (values x y))))
                                        +0
                                        +2
                                        +
                                        + +

                                        Sometimes, you want to return early but execute the finally clause +anyways. Use loop-finish.

                                        + +
                                        (loop for x from 0 to 100
                                        +  do (print x)
                                        +  when (>= x 3)
                                        +  return x
                                        +  finally (print :done))  ;; <-- not printed
                                        +;; 0
                                        +;; 1
                                        +;; 2
                                        +;; 3
                                        +;; 3
                                        +
                                        +(loop for x from 0 to 100
                                        +  do (print x)
                                        +  when (>= x 3)
                                        +  do (loop-finish)
                                        +  finally (print :done)
                                        +     (return x))
                                        +;; 0
                                        +;; 1
                                        +;; 2
                                        +;; 3
                                        +;; :DONE
                                        +;; 3
                                        +
                                        + +

                                        It is most needed when some computation must take place in the finally clause.

                                        + +

                                        Loop shorthands for when/return

                                        + +

                                        Several actions provide shorthands for combinations of when/return:

                                        + +
                                        * (loop for x in '(foo 2)
                                        +      thereis (numberp x))
                                        +T
                                        +
                                        + +
                                        * (loop for x in '(foo 2)
                                        +      never (numberp x))
                                        +NIL
                                        +
                                        + +
                                        * (loop for x in '(foo 2)
                                        +      always (numberp x))
                                        +NIL
                                        +
                                        + +

                                        They correspond to the functions some, notany and every:

                                        + +
                                        (some #'numberp '(foo 2))
                                        +(notany #'numberp '(foo 2))
                                        +(every #'numberp '(foo 2))
                                        +
                                        + +

                                        Series

                                        + +

                                        A block is manually created and returned from.

                                        + +
                                        (block loop-1
                                        +  (iterate ((x (scan-range :from 0 :upto 10 :by 2)))
                                        +    (iterate ((y (scan-range :from 0 :upto 100 :by (1+ (random 3)))))
                                        +      (when (< x y)
                                        +        (return-from loop-1 (values x y))))))
                                        +
                                        + +

                                        Count

                                        +

                                        loop

                                        +
                                        (loop for i from 1 to 3 count (oddp i))
                                        +;; 2
                                        +
                                        + +

                                        Series

                                        +
                                        (collect-length (choose-if #'oddp (scan-range :from 1 :upto 3)))
                                        +
                                        + +

                                        Summation

                                        +

                                        loop

                                        + +
                                        (loop for i from 1 to 3 sum (* i i))
                                        +;; 14
                                        +
                                        + +

                                        Summing into a variable:

                                        + +
                                        (loop for i from 1 to 3
                                        +   sum (* i i) into total
                                        +   do (print i)
                                        +   finally (print total))
                                        +1
                                        +2
                                        +3
                                        +14
                                        +
                                        + +

                                        Series

                                        + +
                                        (collect-sum (#M(lambda (i) (* i i))
                                        +                (scan-range :from 1 :upto 3)))
                                        +
                                        + +

                                        max, min

                                        +

                                        loop

                                        + +
                                        (loop for i from 1 to 3 maximize (mod i 3))
                                        +;; 2
                                        +
                                        + +

                                        and minimize.

                                        + +

                                        Series

                                        +
                                        (collect-max (#M(lambda (i) (mod i 3))
                                        +                (scan-range :from 1 :upto 3)))
                                        +
                                        +

                                        and collect-min.

                                        + +

                                        Destructuring, aka pattern matching against the list or dotted pairs

                                        +

                                        loop

                                        + +
                                        (loop for (a b) in '((x 1) (y 2) (z 3))
                                        +      collect (list b a) )
                                        +;; ((1 X) (2 Y) (3 Z))
                                        +
                                        + +
                                        (loop for (x . y) in '((1 . a) (2 . b) (3 . c)) collect y)
                                        +;; (A B C)
                                        +
                                        + +

                                        Use nil to ignore a term:

                                        + +
                                        (loop for (a nil) in '((x 1) (y 2) (z 3))
                                        +      collect a )
                                        +;; (X Y Z)
                                        +
                                        + +
                                        Iterating 2 by 2 over a list
                                        + +

                                        To iterate over a list, 2 items at a time we use a combination of on, by and destructuring.

                                        + +

                                        We use on to loop over the rest (the cdr) of the list.

                                        + +
                                        (loop for rest on '(a 2 b 2 c 3)
                                        +      collect rest)
                                        +;; ((A 2 B 2 C 3) (2 B 2 C 3) (B 2 C 3) (2 C 3) (C 3) (3))
                                        +
                                        + +

                                        We use by to skip one element at every iteration ((cddr list) is equivalent to (rest (rest list)))

                                        + +
                                        (loop for rest on '(a 2 b 2 c 3) by #'cddr
                                        +      collect rest)
                                        +;; ((A 2 B 2 C 3) (B 2 C 3) (C 3))
                                        +
                                        + +

                                        Then we add destructuring to bind only the first two items at each iteration:

                                        + +
                                        (loop for (key value) on '(a 2 b 2 c 3) by #'cddr
                                        +      collect (list key (* 2 value)))
                                        +;; ((A 2) (B 4) (C 6))
                                        +
                                        + +

                                        Series

                                        +

                                        In general, with destructuring-bind:

                                        + +
                                        (collect
                                        +  (mapping ((l (scan '((x 1) (y 2) (z 3)))))
                                        +    (destructuring-bind (a b) l
                                        +      (list b a))))
                                        +
                                        + +

                                        But for alists, scan-alist is provided:

                                        + +
                                        (collect
                                        +  (mapping (((a b) (scan-alist '((1 . a) (2 . b) (3 . c)))))
                                        +    b))
                                        +
                                        + +

                                        Iterate unique features lacking in loop

                                        + +

                                        iterate has some other things unique to it.

                                        + +

                                        If you are a newcomer in Lisp, it’s perfectly OK to keep you this section for +later. You could very well spend your career in Lisp without resorting +to those features… although they might turn out useful one day.

                                        + +

                                        No rigid order for clauses

                                        + +

                                        loop requires that all for clauses appear before the loop body, +for example before a while. It’s ok for iter to not follow this +order:

                                        + +
                                        (iter (for x in '(1 2 99)
                                        +  (while (< x 10))
                                        +  (for y = (print x))
                                        +  (collect (list x y)))
                                        +
                                        + +

                                        Accumulating clauses can be nested

                                        + +

                                        collect, appending and other accumulating clauses can appear anywhere:

                                        + +
                                        (iter (for x in '(1 2 3))
                                        +  (case x
                                        +    (1 (collect :a))
                                        +    ;;  ^^ iter keyword, nested in a s-expression.
                                        +    (2 (collect :b))))
                                        +
                                        + +

                                        Finders: finding

                                        + +

                                        iterate has finders.

                                        + +
                                        +

                                        A finder is a clause whose value is an expression that meets some condition.

                                        +
                                        + +

                                        We can use finding followed by maximizing, minimizing or such-that.

                                        + +

                                        Here’s how to find the longest list in a list of lists:

                                        + +
                                        (iter (for elt in '((a) (b c d) (e f)))
                                        +      (finding elt maximizing (length elt)))
                                        +=> (B C D)
                                        +
                                        + +

                                        The rough equivalent in LOOP would be:

                                        + +
                                        (loop with max-elt = nil
                                        +      with max-key = 0
                                        +      for elt in '((a) (b c d) (e f))
                                        +      for key = (length elt)
                                        +      do
                                        +      (when (> key max-key)
                                        +        (setf max-elt elt
                                        +              max-key key))
                                        +      finally (return max-elt))
                                        +=> (B C D)
                                        +
                                        + +

                                        There could be more than one such-that clause:

                                        + +
                                         (iter (for i in '(7 -4 2 -3))
                                        +       (if (plusp i)
                                        +    (finding i such-that (evenp i))
                                        +        (finding (- i) such-that (oddp i))))
                                        +;; => 2
                                        +
                                        + +

                                        We can also write such-that #'evenp and such-that #'oddp.

                                        + +

                                        Control flow: next-iteration

                                        + +

                                        It is like “continue†and loop doesn’t have it.

                                        + +
                                        +

                                        Skips the remainder of the loop body and begins the next iteration of the loop.

                                        +
                                        + +

                                        iterate also has first-iteration-p and (if-first-time then else).

                                        + +

                                        See control flow.

                                        + +

                                        Generators

                                        + +

                                        Use generate and next. A generator is lazy, it goes to the next value when said explicitly.

                                        + +
                                        (iter (for i in '(1 2 3 4 5))
                                        +      (generate c in-string "black")
                                        +      (if (oddp i) (next c))
                                        +      (format t "~a " c))
                                        +;; b b l l a
                                        +;; NIL
                                        +
                                        + +

                                        Variable backtracking (previous) VS parallel binding

                                        + +

                                        iterate allows us to get the previous value of a variable:

                                        + +
                                        (iter (for el in '(a b c d e))
                                        +      (for prev-el previous el)
                                        +      (collect (list el prev-el)))
                                        +;; => ((A NIL) (B A) (C B) (D C) (E D))
                                        +
                                        + +

                                        In this case however we can do it with loop’s parallel binding and, which is unsupported in iterate:

                                        + +
                                        (loop for el in '(a b c d e)
                                        +      and prev-el = nil then el
                                        +      collect (list el prev-el))
                                        +
                                        + +

                                        More clauses

                                        + +
                                          +
                                        • in-string can be used explicitly to iterate character by character over a string. With loop, use across.
                                        • +
                                        + +
                                        (iter (for c in-string "hello")
                                        +      (collect c))
                                        +;; => (#\h #\e #\l #\l #\o)
                                        +
                                        + +
                                          +
                                        • loop offers collecting, nconcing, and appending. iterate has these and also adjoining, unioning, nunioning, and accumulating.
                                        • +
                                        + +
                                        (iter (for el in '(a b c a d b))
                                        +      (adjoining el))
                                        +;; => (A B C D)
                                        +
                                        + +

                                        (adjoin is a set operation)

                                        + +
                                          +
                                        • loop has summing, counting, maximizing, and minimizing. iterate also includes multiplying and reducing. reducing is the generalized reduction builder:
                                        • +
                                        + +
                                        (iter (with dividend = 100)
                                        +      (for divisor in '(10 5 2))
                                        +      (reducing divisor by #'/ initial-value dividend))
                                        +;; => 1
                                        +
                                        + +

                                        Iterate is extensible

                                        + +
                                        (defmacro dividing-by (num &keys (initial-value 0))
                                        +  `(reducing ,num by #'/ initial-value ,initial-value))
                                        +
                                        +(iter (for i in '(10 5 2))
                                        +      (dividing-by i :initial-value 100))
                                        +=> 1
                                        +
                                        + +

                                        but there is more to it, see the documentation.

                                        + +

                                        We saw libraries extending loop, for example CLSQL, but they are +full of feature flag checks (#+(or allegro clisp-aloop cmu openmcl +sbcl scl)) and they call internal modules +(ansi-loop::add-loop-path, sb-loop::add-loop-path etc).

                                        + +

                                        Custom series scanners

                                        + +

                                        If we often scan the same type of object, we can write our own scanner + for it: the iteration itself can be factored out. Taking the example + above, of scanning a list of two-element lists, we’ll write a scanner + that returns a series of the first elements and a series of the + second.

                                        + +
                                        (defun scan-listlist (listlist)
                                        +  (declare (optimizable-series-function 2))
                                        +  (map-fn '(values t t)
                                        +          (lambda (l)
                                        +            (destructuring-bind (a b) l
                                        +              (values a b)))
                                        +          (scan listlist)))
                                        +
                                        +(collect
                                        +  (mapping (((a b) (scan-listlist '((x 1) (y 2) (z 3)))))
                                        +    (list b a)))
                                        +
                                        + +

                                        Shorter series expressions

                                        + +

                                        Consider this series expression:

                                        + +
                                        (collect-sum (mapping ((i (scan-range :length 5)))
                                        +                    (* i 2)))
                                        +
                                        + +

                                        It’s a bit longer than it needs to be, the mapping form’s only +purpose is to bind the variable i, and i is used in only one +place. Series has a “hidden feature†that allows us to simplify this +expression to the following:

                                        + +
                                        (collect-sum (* 2 (scan-range :length 5)))
                                        +
                                        + +

                                        This is called implicit mapping and can be enabled in the call to +series::install:

                                        + +
                                        (series::install :implicit-map t)
                                        +
                                        + +

                                        When using implicit mapping, the #M reader macro demonstrated above +becomes redundant.

                                        + +

                                        Loop gotchas

                                        + +
                                          +
                                        • the keyword it, often used in functional constructs, can be +recognized as a loop keyword. Don’t use it inside a loop.
                                        • +
                                        + +

                                        Iterate gotchas

                                        + +

                                        It breaks on the function count:

                                        + +
                                        (iter (for i from 1 to 10)
                                        +      (sum (count i '(1 3 5))))
                                        +
                                        + +

                                        It doesn’t recognize the built-in count function and instead signals a condition.

                                        + +

                                        It works in loop:

                                        + +
                                        (loop for i from 1 to 10
                                        +    sum (count i '(1 3 5 99)))
                                        +;; 3
                                        +
                                        + +

                                        Appendix: list of loop keywords

                                        + +

                                        Name Clause

                                        + +
                                        named
                                        +
                                        + +

                                        Variable Clauses

                                        + +
                                        initially finally for as with
                                        +
                                        + +

                                        Main Clauses

                                        + +
                                        do collect collecting append
                                        +appending nconc nconcing into count
                                        +counting sum summing maximize return loop-finish
                                        +maximizing minimize minimizing doing
                                        +thereis always never if when
                                        +unless repeat while until
                                        +
                                        + +

                                        These don’t introduce clauses:

                                        + +
                                        = and it else end from upfrom
                                        +above below to upto downto downfrom
                                        +in on then across being each the hash-key
                                        +hash-keys of using hash-value hash-values
                                        +symbol symbols present-symbol
                                        +present-symbols external-symbol
                                        +external-symbols fixnum float t nil of-type
                                        +
                                        + +

                                        But note that it’s the parsing that determines what is a keyword. For example in:

                                        + +
                                        (loop for key in hash-values)
                                        +
                                        + +

                                        Only for and in are keywords.

                                        + +

                                        ©Dan Robertson on Stack Overflow.

                                        + +

                                        Credit and references

                                        + +

                                        Loop

                                        + + + +

                                        Iterate

                                        + + + +

                                        Series

                                        + + + +

                                        Others

                                        + + + + +

                                        + Page source: iteration.md +

                                        +
                                        + + + + + +
                                        +
                                        +
                                        + © 2002–2021 the Common Lisp Cookbook Project +
                                        + +
                                        +
                                        T
                                        O
                                        C
                                        +
                                        + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/license.html b/clones/lispcookbook.github.io/cl-cookbook/license.html new file mode 100644 index 00000000..c5c804e7 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/license.html @@ -0,0 +1,145 @@ + + + + + License + + + + + + + + + + + + + + +

                                        The Common Lisp Cookbook – License

                                        +
                                        + + + + +
                                        +
                                        + +
                                        +
                                        + +
                                        +
                                        Table of Contents
                                        +
                                          +
                                          +
                                          + +
                                          +

                                          The Common Lisp Cookbook – License

                                          + + +

                                          + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                          +

                                          + 📕 Get the EPUB and PDF +

                                          + + +
                                          Redistribution and use of the “Common Lisp Cookbook†in its original form (HTML) +or in ‘derived’ forms (PDF, Postscript, RTF and so forth) with or without +modification, are permitted provided that the following condition is met:

                                          + +
                                            +
                                          • Redistributions must reproduce the above copyright notice, this and the +following disclaimer in the document itself and/or other materials provided +with the distribution.
                                          • +
                                          + +

                                          IMPORTANT: This document is provided by the Common Lisp Cookbook Project “as +is†and any expressed or implied warranties, including, but not limited to, the +implied warranties of merchantability and fitness for a particular purpose are +disclaimed. In no event shall the Common Lisp Cookbook Project be liable for any +direct, indirect, incidental, special, exemplary, or consequential damages +(including, but not limited to, procurement of substitute goods or services; +loss of use, data, or profits; or business interruption) however caused and on +any theory of liability, whether in contract, strict liability, or tort +(including negligence or otherwise) arising in any way out of the use of this +documentation, even if advised of the possibility of such damage.

                                          + +

                                          LispCookbook Github Group addendum: this document is now managed in a modified format.

                                          + +

                                          Copyright: +2015-2017 LispCookbook Github Group +2002-2007 The Common Lisp Cookbook Project,

                                          + + +

                                          + Page source: license.md +

                                          +
                                          + + + + + +
                                          +
                                          +
                                          + © 2002–2021 the Common Lisp Cookbook Project +
                                          + +
                                          +
                                          T
                                          O
                                          C
                                          +
                                          + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/lispworks.html b/clones/lispcookbook.github.io/cl-cookbook/lispworks.html new file mode 100644 index 00000000..042c775b --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/lispworks.html @@ -0,0 +1,652 @@ + + + + + LispWorks + + + + + + + + + + + + + + +

                                          The Common Lisp Cookbook – LispWorks

                                          +
                                          + + + + +
                                          +
                                          + +
                                          +
                                          + +
                                          +
                                          Table of Contents
                                          +
                                            +
                                            +
                                            + +
                                            +

                                            The Common Lisp Cookbook – LispWorks

                                            + + +

                                            + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                            +

                                            + 📕 Get the EPUB and PDF +

                                            + + +
                                            LispWorks is a Common Lisp implementation that +comes with its own Integrated Development Environment (IDE) and its share of +unique features, such as the CAPI GUI toolkit. It is proprietary and +provides a free limited version.

                                            + +

                                            Here, we will mainly explore its IDE, asking ourselves what it can +offer to a seasoned lisper used to Emacs and Slime. The short answer +is: more graphical tools, such as an easy to use graphical stepper, a +tracer, a code coverage browser or again a class browser. Setting and +using breakpoints was easier than on Slime.

                                            + +

                                            LispWorks also provides more integrated tools (the Process browser +lists all processes running in the Lisp image and we can +stop, break or debug them) and presents many information in the form of +graphs (for example, a graph of function calls or a graph of all the +created windows).

                                            + +

                                            LispWorks' listener and editor in the Mate desktop environment

                                            + +

                                            LispWorks features

                                            + +

                                            We can see a matrix of LispWorks features by edition and platform here: http://www.lispworks.com/products/features.html.

                                            + +

                                            We highlight:

                                            + +
                                              +
                                            • 32-bit, 64-bit and ARM support on Windows, MacOS, Linux, Solaris, FreeBSD,
                                            • +
                                            • CAPI portable GUI toolkit: provides native look-and-feel on Windows, Cocoa, GTK+ and Motif. +
                                                +
                                              • comes with a graphical “Interface Builder†(think QtCreator) (though not available on MacOS (nor on mobile))
                                              • +
                                              +
                                            • +
                                            • LispWorks for mobile runtime, for Android and iOS,
                                            • +
                                            • optimized application delivery: LispWorks can use a tree shaker to +remove unused lisp code from the delivered applicatiion, thus +shipping lighter binaries than existing open-source implementations.
                                            • +
                                            • ability to deliver a dynamic library,
                                            • +
                                            • a Java interface, allowing to call from Lisp to Java or the other way around,
                                            • +
                                            • an Objective-C and Cocoa interface, with drag and drop and multi-touch support,
                                            • +
                                            • a Foreign Language Interface,
                                            • +
                                            • TCP/UDP sockets with SSL & IPv6 support,
                                            • +
                                            • natived threads and symmetric multiprocessing, unicode support, and all other Common Lisp features, and all other LispWorks Enterprise features.
                                            • +
                                            + +

                                            And, of course, a built-in IDE.

                                            + +

                                            LispWorks is used in diverse areas of the industry. They maintain a list of success stories. As for software that we can use ourselves, we find ScoreCloud amazing (a music notation software: you play an instrument, sing or whistle and it writes the music) or OpenMusic (opensource composition environment).

                                            + +

                                            Free edition limitations

                                            + +

                                            The download instructions and the limitations are given on the download page.

                                            + +

                                            The limitations are the following:

                                            + +
                                              +
                                            • There is a heap size limit which, if exceeded, causes the image to exit. A warning is provided when the limit is approached.
                                            • +
                                            + +

                                            What does it prevent us to do? As an illustration, we can not load this set of libraries together in the same image:

                                            + +
                                            (ql:quickload '("alexandria" "serapeum" "bordeaux-threads" "lparallel" "dexador" "hunchentoot" "quri" "ltk" "cl-ppcre" "mito"))
                                            +
                                            + +
                                              +
                                            • +

                                              There is a time limit of 5 hours for each session, after which LispWorks Personal exits, possibly without saving your work or performing cleanups such as removing temporary files. You are warned after 4 hours of use.

                                              +
                                            • +
                                            • +

                                              It is impossible to build a binary. Indeed, the functions save-image, deliver (the function to create a stand-alone executable), and load-all-patches are not available.

                                              +
                                            • +
                                            • +

                                              Initialization files are not loaded. If you are used to initializing Quicklisp from your ~/.sbclrc on Emacs, you’ll have to load an init file manually every time you start LispWorks ((load #p"~/.your-init-file)).

                                              +
                                            • +
                                            + +

                                            For the record, the snippet provided by Quicklisp to put in one’s startup file is the following:

                                            + +
                                            ;; provided you installed quicklisp in ~/quicklisp/
                                            +(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" (user-homedir-pathname))))
                                            +  (when (probe-file quicklisp-init)
                                            +    (load quicklisp-init)))
                                            +
                                            + +

                                            You’ll have to paste it to the listener window (with the C-y key, y as “yankâ€).

                                            + +
                                              +
                                            • Layered products that are part of LispWorks Professional and Enterprise Editions (CLIM, KnowledgeWorks, Common SQL and LispWorks ORB) are not included. But we can try the CAPI toolkit.
                                            • +
                                            + +

                                            The installation process requires you to fill an HTML form to receive +a download link, then to run a first script that makes you accept the +terms and the licence, then to run a second script that installs the software.

                                            + +

                                            Licencing model

                                            + +

                                            LispWorks actually comes in four paid editions. It’s all explained by themselves here: http://www.lispworks.com/products/lispworks.html. In short, there is:

                                            + +
                                              +
                                            • a Hobbyist edition with save-image and load-all-patches, to apply updates of minor versions, without the obvious limitations, for non-commercial and non-academic use,
                                            • +
                                            • a HobbyistDV edition with the deliver function to create executables (still for non-commercial and non-academic uses),
                                            • +
                                            • a Professional edition, with the deliver function, for commercial and academic uses,
                                            • +
                                            • an Enterprise one, with their enterprise modules: the Common SQL interface, LispWorks ORB, KnowledgeWorks.
                                            • +
                                            + +

                                            At the time of writing, the licence of the hobbyist edition costs 750 USD, the pro version the double. They are bought for a LW version, per platform. They have no limit of time.

                                            + +
                                            + +NB: Please double check their upstream resources and don't hesitate to contact them. +
                                            + +

                                            LispWorks IDE

                                            + +

                                            The LispWorks IDE is self-contained, but it is also possible to use LispWorks-the-implementation from Emacs and Slime (see below). The IDE runs inside the Common Lisp image, unlike Emacs which is an external program that communicates with the Lisp image through Swank and Slime. User code runs in the same process.

                                            + +

                                            The editor

                                            + +

                                            The editor offers what’s expected: a TAB-completion pop-up, syntax +highlighting, Emacs-like keybindings (including the M-x extended +command). The menus help the discovery.

                                            + +

                                            We personally found the editing experience a bit “rawâ€. For example:

                                            +
                                              +
                                            • indention after a new line is not automatic, one has to press TAB +again.
                                            • +
                                            • the auto-completion is not fuzzy.
                                            • +
                                            • there are no plugins similar to Paredit (there is a brand new (2021) Paredit for LispWorks) or Lispy, nor a Vim layer.
                                            • +
                                            + +

                                            We also had an issue, in that the go-to-source function bound to M-. +did not work out for built-in Lisp symbols. Apparently, LispWorks +doesn’t provide much source code, and mostly code of the editor. Some +other commercial Lisps, like Allegro CL, provide more source code

                                            + +

                                            The editor provides an interesting tab: Changed Definitions. It lists the functions and methods that were redefined since, at our choosing: the first edit of the session, the last save, the last compile.

                                            + +

                                            See also:

                                            + + + +

                                            Keybindings

                                            + +

                                            Most of the keybindings are similar to Emacs, but not all. Here are some differences:

                                            + +
                                              +
                                            • to compile a function, use C-S-c (control, shift and c), instead of C-c C-c.
                                            • +
                                            • to compile the current buffer, use C-S-b (instead of C-c C-k).
                                            • +
                                            + +

                                            Similar ones include:

                                            + +
                                              +
                                            • C-g to cancel what you’re doing,
                                            • +
                                            • C-x C-s to save the current buffer,
                                            • +
                                            • M-w and C-y to copy and paste,
                                            • +
                                            • M-b, M-f, C-a, C-e… to move around words, to go to the beginning or the end of the line,
                                            • +
                                            • C-k to kill until the end of the line, C-w to kill a selected region,
                                            • +
                                            • M-. to find the source of a symbol,
                                            • +
                                            • C-x C-e to evaluate the current defun,
                                            • +
                                            • …
                                            • +
                                            + +

                                            Some useful functions don’t have a keybinding by default, for example:

                                            + + +
                                              +
                                            • clear the REPL with M-x Clear Listener
                                            • +
                                            • Backward Kill Line
                                            • +
                                            + +

                                            It is possible to use classical keybindings, à la KDE/Gnome. Go to the +Preferences menu, Environment and in the Emulation tab.

                                            + +

                                            There is no Vim layer.

                                            + +

                                            Searching keybindings by name

                                            + +

                                            It is possible to search for a keybinding associated to a function, or +a function name from its keybinding, with the menu (Help -> Editing -> +Key to Command / Command to Key) or with C-h followed by a key, +as in Emacs. For example type C-h k then enter a keybinding to +get the command name. See more with C-h ?.

                                            + +

                                            Tweaking the IDE

                                            + +

                                            It is possible to change keybindings. The editor’s state is accessible +from the editor package, and the editor is built with the CAPI +framework, so we can use the capi interface too. Useful functions +include:

                                            + +
                                            `
                                            +editor:bind-key
                                            +editor:defcommand
                                            +editor:current-point
                                            +editor:with-point  ;; save point location
                                            +editor:move-point
                                            +editor:*buffer-list*
                                            +editor:*in-listener* ;; returns T when we are in the REPL
                                            +…
                                            +
                                            + +

                                            Here’s how you can bind keys:

                                            + +
                                            ;; Indent new lines.
                                            +;; By default, the point is not indented after a Return.
                                            +(editor:bind-key "Indent New Line" #\Return :mode "Lisp")
                                            +
                                            +;; Insert pairs.
                                            +(editor:bind-key "Insert Parentheses For Selection" #\( :mode "Lisp") ;;
                                            +(editor:bind-key "Insert Double Quotes For Selection" #\" :mode "Lisp")
                                            +
                                            + +

                                            Here’s how to define a new command. We make the ) key +to go past the next closing parenthesis.

                                            + +
                                            (editor:defcommand "Move Over ()" (p)
                                            +  "Move past the next close parenthesis.
                                            +Any indentation preceeding the parenthesis is deleted."
                                            +  "Move past the next close parenthesis."
                                            +  ;; thanks to Thomas Hermann
                                            +  ;; https://github.com/ThomasHermann/LispWorks/blob/master/editor.lisp
                                            +  (declare (ignore p))
                                            +  (let ((point (editor:current-point)))
                                            +    (editor:with-point ((m point))
                                            +      (cond ((editor::forward-up-list m)
                                            +	     (editor:move-point point m)
                                            +             (editor::point-before point)
                                            +             (loop (editor:with-point ((back point))
                                            +                     (editor::back-to-indentation back)
                                            +                     (unless (editor:point= back point)
                                            +                       (return)))
                                            +                   (editor::delete-indentation point))
                                            +	     (editor::point-after point))
                                            +	    (t (editor:editor-error))))))
                                            +
                                            +(editor:bind-key "Move Over ()" #\) :mode "Lisp")
                                            +
                                            + +

                                            And here’s how you can change indentation for special forms:

                                            + +
                                            (editor:setup-indent "if" 1 4 1)
                                            +
                                            + +

                                            See also:

                                            + + + +

                                            The listener

                                            + +

                                            The listener is the REPL we are expecting to find, but it has a slight +difference from Slime.

                                            + +

                                            It doesn’t evaluate the input line by line or form by form, instead it +parses the input while typing. So we get some errors instantly. For +example, we type (abc. So far so good. Once we type a colon to get +(abc:, an error message is printed just above our input:

                                            + +
                                            Error while reading: Reader cannot find package ABC.
                                            +
                                            +CL-USER 1 > (abc:
                                            +
                                            + +

                                            Indeed, now abc: references a package, but such a package doesn’t exist.

                                            + +

                                            Its interactive debugger is primarily textual but you can also +interact with it with graphical elements. For example, you can use the +Abort button of the menu bar, which brings you back to the top +level. You can invoke the graphical debugger to see the stacktraces +and interact with them. See the Debugger button at the very end of the +toolbar.

                                            + +

                                            + +

                                            If you see the name of your function in the stacktraces (you will if +you wrote and compiled your code in a file, and not directly wrote it +in the REPL), you can double-click on its name to go back to the +editor and have it highlight the part of your code that triggered the +error.

                                            + +
                                            + +NB: this is equivalent of pressing M-v in Slime. +
                                            + +

                                            It is possible to choose the graphical debugger to appear by default, instead of the textual one.

                                            + +

                                            The listener provides some helper commands, not unlike Slime’s ones starting with a comma ,:

                                            + +
                                            CL-USER 1 > :help
                                            +
                                            +:bug-form <subject> &key <filename>
                                            +         Print out a bug report form, optionally to a file.
                                            +:get <variable> <command identifier>
                                            +         Get a previous command (found by its number or a symbol/subform within it) and put it in a variable.
                                            +:help    Produce this list.
                                            +:his &optional <n1> <n2>
                                            +         List the command history, optionally the last n1 or range n1 to n2.
                                            +:redo &optional <command identifier>
                                            +         Redo a previous command, found by its number or a symbol/subform within it.
                                            +:use <new> <old> &optional <command identifier>
                                            +         Do variant of a previous command, replacing old symbol/subform with new symbol/subform.
                                            +
                                            + +

                                            The stepper. Breakpoints.

                                            + +

                                            The stepper is one +of the areas where LispWorks shines.

                                            + +

                                            When your are writing code in the editor window, you can set +breakpoints with the big red “Breakpoint†button (or by calling M-x Stepper Breakpoint). +This puts a red mark in your code.

                                            + +

                                            The next time your code is executed, you’ll get a comprehensive Stepper pop-up window showing:

                                            + +
                                              +
                                            • your source code, with an indicator showing what expression is being evaluated
                                            • +
                                            • a lower pane with two tabs: +
                                                +
                                              • the backtrace, showing the intermediate variables, thus showing their evolution during the execution of the program
                                              • +
                                              • the listener, in the context of this function call, where you can evaluate expressions
                                              • +
                                              +
                                            • +
                                            • and the menu bar with the stepper controls: you can step into the next expression, step on the next function call, continue execution until the position of the cursor, continue the execution until the next breakpoint, etc.
                                            • +
                                            + +

                                            + +

                                            That’s not all. The non-visual, REPL-oriented stepper is also nice. It shows the forms that are being evaluated and their results.

                                            + +

                                            In this example, we use :s to “step†though the current form and its subforms. We are using the usual listener, we can write any Lisp code after the prompt (the little ` -> ` here), and we have access to the local variables (X).

                                            + +
                                            CL-USER 4 > (defun my-abs (x) (cond ((> x 0) x) ((< x 0) (- x)) (t 0)))
                                            +CL-USER 5 > (step (my-abs -5))
                                            +(MY-ABS -5) -> :s
                                            +   -5 -> :s
                                            +   -5
                                            +   (COND ((> X 0) X) ((< X 0) (- X)) (T 0)) <=> (IF (> X 0) (PROGN X) (IF (< X 0) (- X) (PROGN 0)))
                                            +   ;; Access to the local variables:
                                            +   (IF (> X 0) (PROGN X) (IF (< X 0) (- X) (PROGN 0))) -> (format t "Is X equal to -5? ~a~&" (if (equal x -5) "yes" "no"))
                                            +Is X equal to -5? yes
                                            +   (IF (> X 0) (PROGN X) (IF (< X 0) (- X) (PROGN 0))) -> :s
                                            +      (> X 0) -> :s
                                            +         X -> :s
                                            +         -5
                                            +         0 -> :s
                                            +         0
                                            +      NIL
                                            +      (IF (< X 0) (- X) (PROGN 0)) -> :s
                                            +         (< X 0) -> :s
                                            +            X -> :s
                                            +            -5
                                            +            0 -> :s
                                            +            0
                                            +         T
                                            +         (- X) -> :s
                                            +            X -> :s
                                            +            -5
                                            +         5
                                            +      5
                                            +   5
                                            +5
                                            +
                                            + +

                                            Here are the available stepper commands (see :?):

                                            + +
                                            :s       Step this form and all of its subforms (optional +ve integer arg)
                                            +:st      Step this form without stepping its subforms
                                            +:si      Step this form without stepping its arguments if it is a function call
                                            +:su      Step up out of this form without stepping its subforms
                                            +:sr      Return a value to use for this form
                                            +:sq      Quit from the current stepper level
                                            +:bug-form <subject> &key <filename>
                                            +         Print out a bug report form, optionally to a file.
                                            +:get <variable> <command identifier>
                                            +         Get a previous command (found by its number or a symbol/subform within it) and put it in a variable.
                                            +:help    Produce this list.
                                            +:his &optional <n1> <n2>
                                            +         List the command history, optionally the last n1 or range n1 to n2.
                                            +:redo &optional <command identifier>
                                            +         Redo a previous command, found by its number or a symbol/subform within it.
                                            +:use <new> <old> &optional <command identifier>
                                            +         Do variant of a previous command, replacing old symbol/subform with new symbol/subform.
                                            +
                                            + +

                                            The class browser

                                            + +

                                            The class browser allows us to examine a class’s slots, parent classes, available methods, and some more.

                                            + +

                                            Let’s create a simple class:

                                            + +
                                            (defclass person ()
                                            +  ((name :accessor name
                                            +         :initarg :name
                                            +         :initform "")
                                            +   (lisper :accessor lisperp
                                            +           :initform t)))
                                            +
                                            + +

                                            Now call the class browser:

                                            + +
                                              +
                                            • use the “Class†button from the listener,
                                            • +
                                            • or use the menu Expression -> Class,
                                            • +
                                            • or put the cursor on the class and call M-x Describe class.
                                            • +
                                            + +

                                            + +

                                            It is composed of several panes:

                                            + +
                                              +
                                            • the class hierarchy, showing the superclasses on the left and the subclasses on the right, with their description to the bottom,
                                            • +
                                            • the superclasses viewer, in the form of a simple schema, and the same for subclasses,
                                            • +
                                            • the slots pane (the default),
                                            • +
                                            • the available initargs,
                                            • +
                                            • the existing generic functions for that class
                                            • +
                                            • and the class precedence list.
                                            • +
                                            + +

                                            The Functions pane lists all methods applicable to that class, so we can discover public methods provided by the CLOS object system: initialize-instance, print-object, shared-initialize, etc. We can double-click on them to go to their source. We can choose not to include the inherited methods too (see the “include inherited†checkbox).

                                            + +

                                            You’ll find buttons on the toolbar (for example, Inspect a generic +function) and more actions on the Methods menu, such as a way to see +the functions calls, a menu to undefine or trace a function.

                                            + +

                                            See more:

                                            + + + +

                                            The function call browser

                                            + +

                                            The function call browser allows us to see a graph of the callers and +the callees of a function. It provides several ways to filter the +displayed information and to further inspect the call stack.

                                            + +
                                            + +NB: The Slime functions to find such cross-references are slime-who-[calls, references, binds, sets, depends-on, specializes, macroexpands]. +
                                            + +

                                            After loading a couple packages, here’s a simple example showing who calls the string-trim function.

                                            + +

                                            The function call browser

                                            + +

                                            It shows functions from all packages, but there is a select box to restrict it further, for example to the “current and used†or only to the current packages.

                                            + +

                                            Double click on a function shown in the graph to go to its source. Again, as in many LispWorks views, the Function menu allows to further manipulate selected functions: trace, undefine, listen (paste the object to the Listener)…

                                            + +

                                            The Text tab shows the same information, but textually, the callers and callees side by side.

                                            + +

                                            We can see cross references for compiled code, and we must ensure the feature is on. When we compile code, LispWorks shows a compilation output likes this:

                                            + +
                                            ;;; Safety = 3, Speed = 1, Space = 1, Float = 1, Interruptible = 1
                                            +;;; Compilation speed = 1, Debug = 2, Fixnum safety = 3
                                            +;;; Source level debugging is on
                                            +;;; Source file recording is  on
                                            +;;; Cross referencing is on
                                            +
                                            + +

                                            We see that cross referencing is on. Otherwise, activate it with (toggle-source-debugging t).

                                            + +

                                            See more:

                                            + + + +

                                            The Process Browser

                                            + +

                                            The Process Browser shows us a list of all threads running. The input area allows to filter by name. It accepts regular expressions. Then we can stop, inspect, listen, break into these processes.

                                            + +

                                            "The process browser"

                                            + +

                                            See more:

                                            + + + +

                                            Misc

                                            + +

                                            We like the Search Files functionality. It is like a recursive +grep, but we get a typical LispWorks graphical window +that displays the results, allows to double-click on them and that offers +some more actions.

                                            + +

                                            Last but not least, have a look at the compilation conditions +browser. LispWorks puts all warnings and errors into a special +browser when we compile a system. From now on we can work on fixing +them and see them disappear from the browser. That helps keeping track +of warnings and errors during development.

                                            + +

                                            Using LispWorks from Emacs and Slime

                                            + +

                                            To do that, start LispWorks normally, start a Swank server and connect to it from Emacs (Swank is the backend part of Slime).

                                            + +

                                            First, let’s load the dependencies:

                                            + +
                                            (ql:quickload "swank")
                                            +;; or
                                            +(load "~/.emacs.d/elpa/slime-20xx/swank-loader.lisp")
                                            +
                                            + +

                                            Start a server:

                                            + +
                                            (swank:create-server :port 9876)
                                            +;; Swank started at port: 9876.
                                            +9876
                                            +
                                            + +

                                            From Emacs, run M-x slime-connect, choose localhost and 9876 for the port.

                                            + +

                                            You should be connected. Check with: (lisp-implementation-type). You are now able to use LispWorks’ features:

                                            + +
                                            (setq button
                                            +      (make-instance 'capi:push-button
                                            +                     :data "Button"))
                                            +(capi:contain button)
                                            +
                                            + +

                                            See also

                                            + + + + +

                                            + Page source: lispworks.md +

                                            +
                                            + + + + + +
                                            +
                                            +
                                            + © 2002–2021 the Common Lisp Cookbook Project +
                                            + +
                                            +
                                            T
                                            O
                                            C
                                            +
                                            + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/macros.html b/clones/lispcookbook.github.io/cl-cookbook/macros.html new file mode 100644 index 00000000..ade67c18 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/macros.html @@ -0,0 +1,795 @@ + + + + + Macros + + + + + + + + + + + + + + +

                                            The Common Lisp Cookbook – Macros

                                            +
                                            + + + + +
                                            +
                                            + +
                                            +
                                            + +
                                            +
                                            Table of Contents
                                            +
                                              +
                                              +
                                              + +
                                              +

                                              The Common Lisp Cookbook – Macros

                                              + + +

                                              + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                              +

                                              + 📕 Get the EPUB and PDF +

                                              + + +
                                              The word macro is used generally in computer science to mean a syntactic extension to a programming language. (Note: The name comes from the word “macro-instruction,†which was a useful feature of many second-generation assembly languages. A macro-instruction looked like a single instruction, but expanded into a sequence of actual instructions. The basic idea has since been used many times, notably in the C preprocessor. The name “macro†is perhaps not ideal, since it connotes nothing relevant to what it names, but we’re stuck with it.) Although many languages have a macro facility, none of them are as powerful as Lisp’s. The basic mechanism of Lisp macros is simple, but has subtle complexities, so learning your way around it takes a bit of practice.

                                              + +

                                              How Macros Work

                                              + +

                                              A macro is an ordinary piece of Lisp code that operates on another piece of putative Lisp code, translating it into (a version closer to) executable Lisp. That may sound a bit complicated, so let’s give a simple example. Suppose you want a version of setq that sets two variables to the same value. So if you write

                                              + +
                                              (setq2 x y (+ z 3))
                                              +
                                              + +

                                              when z=8 then both x and y are set to 11. (I can’t think of any use for this, but it’s just an example.)

                                              + +

                                              It should be obvious that we can’t define setq2 as a function. If x=50 and y=-5, this function would receive the values 50, -5, and 11; it would have no knowledge of what variables were supposed to be set. What we really want to say is, When you (the Lisp system) see:

                                              + +
                                              (setq2 v1 v2 e)
                                              +
                                              + +

                                              then treat it as equivalent to:

                                              + +
                                              (progn
                                              +  (setq v1 e)
                                              +  (setq v2 e))
                                              +
                                              + +

                                              Actually, this isn’t quite right, but it will do for now. A macro allows us to do precisely this, by specifying a program for transforming the input pattern (setq2 v1 v2 e) into the output pattern (progn ...).

                                              + +

                                              Quote

                                              + +

                                              Here’s how we could define the setq2 macro:

                                              + +
                                              (defmacro setq2 (v1 v2 e)
                                              +  (list 'progn (list 'setq v1 e) (list 'setq v2 e)))
                                              +
                                              + +

                                              It takes as parameters two variables and one expression.

                                              + +

                                              Then it returns a piece of code. In Lisp, because code is represented +as lists, we can simply return a list that represents code.

                                              + +

                                              We also use the quote, a special operator (not a function nor a macro, but one of a few special operators forming the core of Lisp).

                                              + +

                                              Each quoted object evaluates to itself, aka it is returned as is:

                                              + +
                                                +
                                              • (+ 1 2) evaluates to 3 but (quote (+ 1 2)) evaluates to (+ 1 2)
                                              • +
                                              • (quote (foo bar baz)) evaluates to (foo bar baz)
                                              • +
                                              • ' is a shortcut for quote: (quote foo) and 'foo are equvalent - both evaluate to foo.
                                              • +
                                              + +

                                              So, our macro returns the following bits:

                                              + +
                                                +
                                              • the symbol progn,
                                              • +
                                              • a second list, that contains +
                                                  +
                                                • the symbol setq
                                                • +
                                                • the variable v1: note that the variable is not evaluated inside the macro!
                                                • +
                                                • the expression e: it is not evaluated either!
                                                • +
                                                +
                                              • +
                                              • a second list, with v2.
                                              • +
                                              + +

                                              We can use it like this:

                                              + +
                                              (defparameter v1 1)
                                              +(defparameter v2 2)
                                              +(setq2 v1 v2 3)
                                              +;; 3
                                              +
                                              + +

                                              We can check, v1 and v2 were set to 3.

                                              + +

                                              Macroexpand

                                              + +

                                              We must start writing a macro when we know what code we want to +generate. Once we’ve begun writing one, it becomes very useful to +check effectively what code does the macro generate. The function for +that is macroexpand. It is a function, and we give it some code, as +a list (so, we quote the code snippet we give it):

                                              + +
                                              (macroexpand '(setq2 v1 v2 3))
                                              +;; (PROGN (SETQ V1 3) (SETQ V2 3))
                                              +;; T
                                              +
                                              + +

                                              Yay, our macro expands to the code we wanted!

                                              + +

                                              More interestingly:

                                              + +
                                              (macroexpand '(setq2 v1 v2 (+ z 3)))
                                              +;; (PROGN (SETQ V1 (+ z 3)) (SETQ V2 (+ z 3)))
                                              +;; T
                                              +
                                              + +

                                              We can confirm that our expression e, here (+ z 3), was not +evaluated. We will see how to control the evaluation of arguments with +the comma: ,.

                                              + +

                                              Note: Slime tips

                                              + +

                                              With Slime, you can call macroexpand by putting the cursor at +the left of the parenthesis of the s-expr to expand and call the functionM-x +slime-macroexpand-[1,all], or C-c M-m:

                                              + +
                                              [|](setq2 v1 v2 3)
                                              +;^ cursor
                                              +; C-c M-m
                                              +; =>
                                              +; (PROGN (SETQ V1 3) (SETQ V2 3))
                                              +
                                              + +

                                              Another tip: on a macro name, type C-c C-w m (or M-x +slime-who-macroexpands) to get a new buffer with all the places +where the macro was expanded. Then type the usual C-c C-k +(slime-compile-and-load-file) to recompile all of them.

                                              + +

                                              Macros VS functions

                                              + +

                                              Our macro is very close to the following function definition:

                                              + +
                                              (defun setq2-function (v1 v2 e)
                                              +  (list 'progn (list 'setq v1 e) (list 'setq v2 e)))
                                              +
                                              + +

                                              If we evaluated (setq2-function 'x 'y '(+ z 3)) (note that each +argument is quoted, so it isn’t evaluated when we call the +function), we would get

                                              + +
                                              (progn (setq x (+ z 3)) (setq y (+ z 3)))
                                              +
                                              + +

                                              This is a perfectly ordinary Lisp computation, whose sole point of interest is that its output is a piece of executable Lisp code. What defmacro does is create this function implicitly and make sure that whenever an expression of the form (setq2 x y (+ z 3)) is seen, setq2-function is called with the pieces of the form as arguments, namely x, y, and (+ z 3). The resulting piece of code then replaces the call to setq2, and execution resumes as if the new piece of code had occurred in the first place. The macro form is said to expand into the new piece of code.

                                              + +

                                              Evaluation context

                                              + +

                                              This is all there is to it, except, of course, for the myriad subtle consequences. The main consequence is that run time for the setq2 macro is compile time for its context. That is, suppose the Lisp system is compiling a function, and midway through it finds the expression (setq2 x y (+ z 3)). The job of the compiler is, of course, to translate source code into something executable, such as machine language or perhaps byte code. Hence it doesn’t execute the source code, but operates on it in various mysterious ways. However, once the compiler sees the setq2 expression, it must suddenly switch to executing the body of the setq2 macro. As I said, this is an ordinary piece of Lisp code, which can in principle do anything any other piece of Lisp code can do. That means that when the compiler is running, the entire Lisp (run-time) system must be present.

                                              + +

                                              We’ll stress this once more: at compile-time, you have the full language at your disposal.

                                              + +

                                              Novices often make the following sort of mistake. Suppose that the setq2 macro needs to do some complex transformation on its e argument before plugging it into the result. Suppose this transformation can be written as a Lisp procedure some-computation. The novice will often write:

                                              + +
                                              (defmacro setq2 (v1 v2 e)
                                              +  (let ((e1 (some-computation e)))
                                              +    (list 'progn (list 'setq v1 e1) (list 'setq v2 e1))))
                                              +
                                              +(defmacro some-computation (exp) ...) ;; _Wrong!_
                                              +
                                              + +

                                              The mistake is to suppose that once a macro is called, the Lisp system enters a “macro world,†so naturally everything in that world must be defined using defmacro. This is the wrong picture. The right picture is that defmacro enables a step into the ordinary Lisp world, but in which the principal object of manipulation is Lisp code. Once that step is taken, one uses ordinary Lisp function definitions:

                                              + +
                                              (defmacro setq2 (v1 v2 e)
                                              +  (let ((e1 (some-computation e)))
                                              +    (list 'progn (list 'setq v1 e1) (list 'setq v2 e1))))
                                              +
                                              +(defun some-computation (exp) ...) ;; _Right!_
                                              +
                                              + +

                                              One possible explanation for this mistake may be that in other languages, such as C, invoking a preprocessor macro does get you into a different world; you can’t run an arbitrary C program. It might be worth pausing to think about what it might mean to be able to.

                                              + +

                                              Another subtle consequence is that we must spell out how the arguments to the macro get distributed to the hypothetical behind-the-scenes function (called setq2-function in my example). In most cases, it is easy to do so: In defining a macro, we use all the usual lambda-list syntax, such as &optional, &rest, &key, but what gets bound to the formal parameters are pieces of the macro form, not their values (which are mostly unknown, this being compile time for the macro form). So if we defined a macro thus:

                                              + +
                                              (defmacro foo (x &optional y &key (cxt 'null)) ...)
                                              +
                                              + +

                                              then

                                              + +
                                              _If we call it thus ..._     |_The parameters' values are ..._
                                              +-----------------------------|-----------------------------------
                                              +`(foo a)`                    | `x=a`, `y=nil`, `cxt=null`
                                              +`(foo (+ a 1) (- y 1))`      |`x=(+ a 1)`, `y=(- y 1)`, `cxt=null`
                                              +`(foo a b :cxt (zap zip))`   |`x=a`, `y=b`, `cxt=(zap zip)`
                                              +
                                              + +

                                              Note that the values of the variables are the actual expressions (+ a 1) and (zap zip). There is no requirement that these expressions’ values be known, or even that they have values. The macro can do anything it likes with them. For instance, here’s an even more useless variant of setq: (setq-reversible e1 e2 d) behaves like (setq e1 e2) if d=:normal, and behaves like (setq e2 e1) if d=:backward. It could be defined thus:

                                              + +
                                              (defmacro setq-reversible (e1 e2 direction)
                                              +  (case direction
                                              +    (:normal (list 'setq e1 e2))
                                              +    (:backward (list 'setq e2 e1))
                                              +    (t (error "Unknown direction: ~a" direction))))
                                              +
                                              + +

                                              Here’s how it expands:

                                              + +
                                              (macroexpand '(setq-reversible x y :normal))
                                              +(SETQ X Y)
                                              +T
                                              +(macroexpand '(setq-reversible x y :backward))
                                              +(SETQ Y X)
                                              +T
                                              +
                                              + +

                                              And with a wrong direction:

                                              + +
                                              (macroexpand '(setq-reversible x y :other-way-around))
                                              +
                                              + +

                                              We get an error and are prompted into the debugger!

                                              + +

                                              We’ll see the backquote and comma mechanism in the next section, but +here’s a fix:

                                              + +
                                              (defmacro setq-reversible (v1 v2 direction)
                                              +  (case direction
                                              +    (:normal (list 'setq v1 v2))
                                              +    (:backward (list 'setq v2 v1))
                                              +    (t `(error "Unknown direction: ~a" ,direction))))
                                              +    ;; ^^ backquote                    ^^ comma: get the value inside the backquote.
                                              +
                                              +(macroexpand '(SETQ-REVERSIBLE v1 v2 :other-way-around))
                                              +;; (ERROR "Unknown direction: ~a" :OTHER-WAY-AROUND)
                                              +;; T
                                              +
                                              + +

                                              Now when we call (setq-reversible v1 v2 :other-way-around) we still get the +error and the debugger, but at least not when using macroexpand.

                                              + +

                                              + +

                                              Backquote and comma

                                              + +

                                              Before taking another step, we need to introduce a piece of Lisp notation that is indispensable to defining macros, even though technically it is quite independent of macros. This is the backquote facility. As we saw above, the main job of a macro, when all is said and done, is to define a piece of Lisp code, and that means evaluating expressions such as (list 'prog (list 'setq ...) ...). As these expressions grow in complexity, it becomes hard to read them and write them. What we find ourselves wanting is a notation that provides the skeleton of an expression, with some of the pieces filled in with new expressions. That’s what backquote provides. Instead of the list expression given above, one writes

                                              + +
                                                `(progn (setq ,v1 ,e) (setq ,v2 ,e))
                                              +;;^ backquote   ^   ^         ^   ^ commas
                                              +
                                              + +

                                              The backquote (`) character signals that in the expression that follows, every subexpression not preceded by a comma is to be quoted, and every subexpression preceded by a comma is to be evaluated.

                                              + +

                                              You can think of it, and use it, as data interpolation:

                                              + +
                                              `(v1 = ,v1) ;; => (V1 = 3)
                                              +
                                              + +

                                              That’s mostly all there is to backquote. There are just two extra items to point out.

                                              + +

                                              Comma-splice ,@

                                              + +

                                              First, if you write “,@e†instead of “,e†then the value of e is spliced (or “joinedâ€, “combinedâ€, “interleavedâ€) into the result. So if v equals (oh boy), then

                                              + +
                                              `(zap ,@v ,v)
                                              +
                                              + +

                                              evaluates to

                                              + +
                                              (zap oh boy (oh boy))
                                              +;;   ^^^^^ elements of v (two elements), spliced.
                                              +;;          ^^ v itself (a list)
                                              +
                                              + +

                                              The second occurrence of v is replaced by its value. The first is replaced by the elements of its value. If v had had value (), it would have disappeared entirely: the value of (zap ,@v ,v) would have been (zap ()), which is the same as (zap nil).

                                              + +

                                              Quote-comma ‘,

                                              + +

                                              When we are inside a backquote context and we want to print an +expression literally, we have no choice but to use the combination of +quote and comma:

                                              + +
                                              (defmacro explain-exp (exp)
                                              +  `(format t "~S = ~S" ',exp ,exp))
                                              +  ;;                   ^^
                                              +
                                              +(explain-exp (+ 2 3))
                                              +;; (+ 2 3) = 5
                                              +
                                              + +

                                              See by yourself:

                                              + +
                                              ;; Defmacro with no quote at all:
                                              +(defmacro explain-exp (exp)
                                              +  (format t "~a = ~a" exp exp))
                                              +(explain-exp v1)
                                              +;; V1 = V1
                                              +
                                              +;; OK, with a backquote and a comma to get the value of exp:
                                              +(defmacro explain-exp (exp)
                                              +  ;; WRONG example
                                              +  `(format t "~a = ~a" exp ,exp))
                                              +(explain-exp v1)
                                              +;; => error: The variable EXP is unbound.
                                              +
                                              +;; We then must use quote-comma:
                                              +(defmacro explain-exp (exp)
                                              +  `(format t "~a = ~a" ',exp ,exp))
                                              +(explain-exp (+ 1 2))
                                              +;; (+ 1 2) = 3
                                              +
                                              + +

                                              Nested backquotes

                                              + +

                                              Second, one might wonder what happens if a backquote expression occurs inside another backquote. The answer is that the backquote becomes essentially unreadable and unwriteable; using nested backquote is usually a tedious debugging exercise. The reason, in my not-so-humble opinion, is that backquote is defined wrong. A comma pairs up with the innermost backquote when the default should be that it pairs up with the outermost. But this is not the place for a rant; consult your favorite Lisp reference for the exact behavior of nested backquote plus some examples.

                                              + +

                                              Building lists with backquote

                                              + +

                                              One problem with backquote is that once you learn it you tend to use for every list-building occasion. For instance, you might write

                                              + +
                                              (mapcan (lambda (x)
                                              +          (cond ((symbolp x) `((,x)))
                                              +                ((> x 10) `(,x ,x))
                                              +                (t '())))
                                              +        some-list)
                                              +
                                              + +

                                              which yields ((a) 15 15) when some-list = (a 6 15). The problem is that mapcan destructively alters the results returned by the lambda-expression. Can we be sure that the lists returned by that expression are “fresh,†that is, they are different (in the eq sense) from the structures returned on other calls of that lambda expression? In the present case, close analysis will show that they must be fresh, but in general backquote is not obligated to return a fresh list every time (whether it does or not is implementation-dependent). If the example above got changed to

                                              + +
                                              (mapcan (lambda (x)
                                              +          (cond ((symbolp x) `((,x)))
                                              +                ((> x 10) `(,x ,x))
                                              +                ((>= x 0) `(low))
                                              +                (t '())))
                                              +        some-list)
                                              +
                                              + +

                                              then backquote may well treat (low) as if it were +'(low); the list will be allocated at load time, and every time the +lambda is evaluated, that same chunk of storage will be returned. So +if we evaluate the expression with some-list = (a 6 15), we will +get ((a) low 15 15), but as a side effect the constant (low) will +get clobbered to become (low 15 15). If we then evaluate the +expression with, say, some-list = (8 oops), the result will be +(low 15 15 (oops)), and now the “constant†that started off as +'(low) will be (low 15 15 (oops)). (Note: The bug exemplified here +takes other forms, and has often bit newbies - as well as experienced +programmers - in the ass. The general form is that a constant list is +produced as the value of something that is later destructively +altered. The first line of defense against this bug is never to +destructively alter any list. For newbies, this is also the last line +of defense. For those of us who imagine we’re more sophisticated, the +next line of defense is to think very carefully any time you use +nconc or mapcan).

                                              + +

                                              To fix the bug, you can write (map 'list ...) instead of mapcan. However, if you are determined to use mapcan, write the expression this way:

                                              + +
                                              (mapcan (lambda (x)
                                              +          (cond ((symbolp x) (list `(,x)))
                                              +                ((> x 10) (list x x))
                                              +                ((>= x 0) (list 'low))
                                              +                (t '())))
                                              +        some-list)
                                              +
                                              + +

                                              My personal preference is to use backquote only to build S-expressions, that is, hierarchical expressions that consist of symbols, numbers, and strings, and that are not conceptualized as changing in length. For instance, I would never write

                                              + +
                                              (setq sk `(,x ,@sk))
                                              +
                                              + +

                                              If sk is being used as a stack, that is, it’s going to be popped in the normal course of things, I would write (push x sk). If not, I would write (setq sk (cons x sk)).

                                              + +

                                              + +

                                              Getting Macros Right

                                              + +

                                              I said in the first section that my definition of setq2 wasn’t quite right, and now it’s time to fix it.

                                              + +

                                              Suppose we write (setq2 x y (+ x 2)), when x=8. Then according to the definition given above, this form will expand into

                                              + +
                                              (progn
                                              +  (setq x (+ x 2))
                                              +  (setq y (+ x 2)))
                                              +
                                              + +

                                              so that x will have value 10 and y will have value 12. Indeed, here’s its macroexpansion:

                                              + +
                                              (macroexpand '(setq2 x y (+ x 2)))
                                              +;;(PROGN (SETQ X (+ X 2)) (SETQ Y (+ X 2)))
                                              +
                                              + +

                                              Chances are that isn’t what the macro is expected to do (although you never know). Another problematic case is (setq2 x y (pop l)), which causes l to be popped twice; again, probably not right.

                                              + +

                                              The solution is to evaluate the expression e just once, save it in a temporary variable, and then set v1 and v2 to it.

                                              + +

                                              Gensym

                                              + +

                                              To make temporary variables, we use the gensym function, which returns a fresh variable guaranteed to appear nowhere else. Here is what the macro should look like:

                                              + +
                                              (defmacro setq2 (v1 v2 e)
                                              +  (let ((tempvar (gensym)))
                                              +    `(let ((,tempvar ,e))
                                              +       (progn (setq ,v1 ,tempvar)
                                              +              (setq ,v2 ,tempvar)))))
                                              +
                                              + +

                                              Now (setq2 x y (+ x 2)) expands to

                                              + +
                                              (let ((#:g2003 (+ x 2)))
                                              +  (progn (setq x #:g2003) (setq y #:g2003)))
                                              +
                                              + +

                                              Here gensym has returned the symbol #:g2003, which prints in this funny way because it won’t be recognized by the reader. (Nor is there any need for the reader to recognize it, since it exists only long enough for the code that contains it to be compiled.)

                                              + +

                                              Exercise: Verify that this new version works correctly for the case (setq2 x y (pop l1)).

                                              + +

                                              Exercise: Try writing the new version of the macro without using backquote. If you can’t do it, you have done the exercise correctly, and learned what backquote is for!

                                              + +

                                              The moral of this section is to think carefully about which expressions in a macro get evaluated and when. Be on the lookout for situations where the same expression gets plugged into the output twice (as e was in my original macro design). For complex macros, watch out for cases where the order that expressions are evaluated differs from the order in which they are written. This is sure to trip up some user of the macro - even if you are the only user.

                                              + +

                                              What Macros are For

                                              + +

                                              Macros are for making syntactic extensions to Lisp. One often hears it said that macros are a bad idea, that users can’t be trusted with them, and so forth. Balderdash. It is just as reasonable to extend a language syntactically as to extend it by defining your own procedures. It may be true that the casual reader of your code can’t understand the code without seeing the macro definitions, but then the casual reader can’t understand it without seeing function definitions either. Having defmethods strewn around several files contributes far more to unclarity than macros ever have, but that’s a different diatribe.

                                              + +

                                              Before surveying what sorts of syntactic extensions I have found useful, let me point out what sorts of syntactic extensions are generally not useful, or best accomplished using means other than macros. Some novices think macros are useful for open-coding functions. So, instead of defining

                                              + +
                                              (defun sqone (x)
                                              +  (let ((y (+ x 1))) (* y y)))
                                              +
                                              + +

                                              they might define

                                              + +
                                              (defmacro sqone (x)
                                              +  `(let ((y (+ ,x 1))) (* y y)))
                                              +
                                              + +

                                              So that (sqone (* z 13)) might expand into

                                              + +
                                              (let ((y (+ (* z 13) 1)))
                                              +  (* y y))
                                              +
                                              + +

                                              This is correct, but a waste of effort. For one thing, the amount of time saved is almost certainly negligible. If it’s really important that sqone be expanded inline, one can put (declaim (inline sqone)) before sqone is defined (although the compiler is not obligated to honor this declaration). For another, once sqone is defined as a macro, it becomes impossible to write (mapcar #'sqone ll), or to do anything else with it except call it.

                                              + +

                                              But macros have a thousand and one legitimate uses. Why write (lambda (x) ...) when you can write (\\ (x) ...)? Just define \\ as a macro: (defmacro \\ (&rest list) `(lambda ,@list)).

                                              + +

                                              Many people find mapcar and mapcan a bit too obscure, especially when used with large lambda expressions. Rather than write something like

                                              + +
                                              (mapcar (lambda (x)
                                              +          (let ((y (hairy-fun1 x))
                                              +                (z (hairy-fun2 x)))
                                              +            (dolist (y1 y)
                                              +              (dolist (z1 z)
                                              +                _... and further meaningless_
                                              +                _space-filling nonsense..._
                                              +                ))))
                                              +        list)
                                              +
                                              + +

                                              we might prefer to write

                                              + +
                                              (for (x :in list)
                                              +     (let ((y (hairy-fun1 x))
                                              +           (z (hairy-fun2 x)))
                                              +       (dolist (y1 y)
                                              +         (dolist (z1 z)
                                              +           _... and further meaningless_
                                              +           _space-filling nonsense..._
                                              +           ))))
                                              +
                                              + +

                                              This macro might be defined thus:

                                              + +
                                              (defmacro for (listspec exp)
                                              +  ;;           ^^ listspec = (x :in list), a list of length 3.
                                              +  ;;                    ^^ exp = the rest of the code.
                                              +  (cond
                                              +    ((and (= (length listspec) 3)
                                              +          (symbolp (first listspec))
                                              +          (eq (second listspec) ':in))
                                              +     `(mapcar (lambda (,(first listspec))
                                              +                ,exp)
                                              +              ,(third listspec)))
                                              +    (t (error "Ill-formed for spec: ~A" listspec)))))
                                              +
                                              + +

                                              (This is a simplified version of a macro by Chris Riesbeck.)

                                              + +

                                              It’s worth stopping for a second to discuss the role the keyword :in plays in this macro. It serves as a sort of “local syntax marker,†in that it has no meaning as far as Lisp is concerned, but does serve as a syntactic guidepost for the macro itself. I will refer to these markers as guide symbols. (Here its job may seem trivial, but if we generalized the for macro to allow multiple list arguments and an implicit progn in the body the :ins would be crucial in telling us where the arguments stopped and the body began.)

                                              + +

                                              It is not strictly necessary for the guide symbols of a macro to be in the keyword package, but it is a good idea, for two reasons. First, they highlight to the reader that something idiosyncratic is going on. A form like (for ((x in (foobar a b 'oof))) (something-hairy x (list x))) looks a bit wrong already, because of the double parentheses before the x. But using “:in†makes it more obvious.

                                              + +

                                              Second, notice that I wrote (eq (second listspec) ':in) in the macro definition to check for the presence of the guide symbol. If I had used in instead, I would have had to think about which package my in lives in and which package the macro user’s in lives in. One way to avoid trouble would be to write

                                              + +
                                              (and (symbolp (second listspec))
                                              +     (eq (intern (symbol-name (second listspec))
                                              +                 :keyword)
                                              +         ':in))
                                              +
                                              + +

                                              Another would be to write

                                              + +
                                              (and (symbolp (second listspec))
                                              +     (string= (symbol-name (second listspec)) (symbol-name 'in)))
                                              +
                                              + +

                                              which neither of which is particularly clear or aesthetic. The keyword package is there to provide a home for symbols whose home is not per se relevant to anything; you might as well use it. (Note: In ANSI Lisp, I could have written "IN" instead of (symbol-name 'in), but there are Lisp implementations that do not convert symbols’ names to uppercase. Since I think the whole uppercase conversion idea is an embarrassing relic, I try to write code that is portable to those implementations.)

                                              + +

                                              Let’s look at another example, both to illustrate a nice macro, and to provide an auxiliary function for some of the discussion below. One often wants to create new symbols in Lisp, and gensym is not always adequate for building them. Here is a description of an alternative facility called build-symbol:

                                              + +
                                              +

                                              (build-symbol [(:package p)] -pieces-) builds a symbol by concatenating the given pieces and interns it as specified by p. For each element of pieces, if it is a …

                                              + +
                                                +
                                              • … string: The string is added to the new symbol’s name.
                                              • +
                                              • … symbol: The name of the symbol is added to the new symbol’s name.
                                              • +
                                              • … expression of the form (:< e): e should evaluate to a string, symbol, or number; the characters of the value of e (as printed by princ) are concatenated into the new symbol’s name.
                                              • +
                                              • … expression of the form (:++ p): p should be a place expression (i.e., appropriate as the first argument to setf), whose value is an integer; the value is incremented by 1, and the new value is concatenated into the new symbol’s name.
                                              • +
                                              + +

                                              If the :package specification is omitted, it defaults to the value of *package*. If p is nil, the symbol is interned nowhere. Otherwise, it should evaluate to a package designator (usually, a keyword whose name is the same of a package).

                                              +
                                              + +

                                              For example, (build-symbol (:< x) "-" (:++ *x-num*)), when x = foo and *x-num* = 8, sets *x-num* to 9 and evaluates to FOO-9. If evaluated again, the result will be FOO-10, and so forth.

                                              + +

                                              Obviously, build-symbol can’t be implemented as a function; it has to be a macro. Here is an implementation:

                                              + +
                                              (defmacro build-symbol (&rest list)
                                              +  (let ((p (find-if (lambda (x)
                                              +                      (and (consp x)
                                              +                           (eq (car x) ':package)))
                                              +                    list)))
                                              +    (when p
                                              +      (setq list (remove p list)))
                                              +    (let ((pkg (cond ((eq (second p) 'nil)
                                              +                      nil)
                                              +                     (t `(find-package ',(second p))))))
                                              +      (cond (p
                                              +             (cond (pkg
                                              +                    `(values (intern ,(symstuff list) ,pkg)))
                                              +                   (t
                                              +                    `(make-symbol ,(symstuff list)))))
                                              +            (t
                                              +             `(values (intern ,(symstuff list))))))))
                                              +
                                              +(defun symstuff (list)
                                              +  `(concatenate 'string
                                              +                ,@(for (x :in list)
                                              +                       (cond ((stringp x)
                                              +                              `',x)
                                              +                             ((atom x)
                                              +                              `',(format nil "~a" x))
                                              +                             ((eq (car x) ':<)
                                              +                              `(format nil "~a" ,(second x)))
                                              +                             ((eq (car x) ':++)
                                              +                              `(format nil "~a" (incf ,(second x))))
                                              +                             (t
                                              +                              `(format nil "~a" ,x))))))
                                              +
                                              + +

                                              (Another approach would be have symstuff return a single call of the form (format nil format-string -forms-), where the forms are derived from the pieces, and the format-string consists of interleaved ~a’s and strings.)

                                              + +

                                              Sometimes a macro is needed only temporarily, as a sort of syntactic scaffolding. Suppose you need to define 12 functions, but they fall into 3 stereotyped groups of 4:

                                              + +
                                              (defun make-a-zip (y z)
                                              +  (vector 2 'zip y z))
                                              +(defun test-whether-zip (x)
                                              +  (and (vectorp x) (eq (aref x 1) 'zip)))
                                              +(defun zip-copy (x) ...)
                                              +(defun zip-deactivate (x) ...)
                                              +
                                              +(defun make-a-zap (u v w)
                                              +  (vector 3 'zap u v w))
                                              +(defun test-whether-zap (x) ...)
                                              +(defun zap-copy (x) ...)
                                              +(defun zap-deactivate (x) ...)
                                              +
                                              +(defun make-a-zep ()
                                              +  (vector 0 'zep))
                                              +(defun test-whether-zep (x) ...)
                                              +(defun zep-copy (x) ...)
                                              +(defun zep-deactivate (x) ...)
                                              +
                                              + +

                                              Where the omitted pieces are the same in all similarly named functions. (That is, the “…†in zep-deactivate is the same code as the “…†in zip-deactivate, and so forth.) Here, for the sake of concreteness, if not plausibility, zip, zap, and zep are behaving like odd little data structures. The functions could be rather large, and it would get tedious keeping them all in sync as they are debugged. An alternative would be to use a macro:

                                              + +
                                              (defmacro odd-define (name buildargs)
                                              +  `(progn (defun ,(build-symbol make-a- (:< name))
                                              +                                ,buildargs
                                              +            (vector ,(length buildargs) ',name ,@buildargs))
                                              +          (defun ,(build-symbol test-whether- (:< name)) (x)
                                              +            (and (vectorp x) (eq (aref x 1) ',name))
                                              +          (defun ,(build-symbol (:< name) -copy) (x)
                                              +            ...)
                                              +          (defun ,(build-symbol (:< name) -deactivate) (x)
                                              +            ...))))
                                              +
                                              +(odd-define zip (y z))
                                              +(odd-define zap (u v w))
                                              +(odd-define zep ())
                                              +
                                              + +

                                              If all the uses of this macro are collected in this one place, it might be clearer to make it a local macro using macrolet:

                                              + +
                                              (macrolet ((odd-define (name buildargs)
                                              +             `(progn (defun ,(build-symbol make-a- (:< name))
                                              +                                           ,buildargs
                                              +                       (vector ,(length buildargs)
                                              +                               ',name
                                              +                                ,@buildargs))
                                              +                     (defun ,(build-symbol test-whether- (:< name))
                                              +                            (x)
                                              +                       (and (vectorp x) (eq (aref x 1) ',name))
                                              +                     (defun ,(build-symbol (:< name) -copy) (x)
                                              +                       ...)
                                              +                     (defun ,(build-symbol (:< name) -deactivate) (x)
                                              +                       ...)))))
                                              +(odd-define zip (y z))
                                              +(odd-define zap (u v w))
                                              +(odd-define zep ()))
                                              +
                                              + +

                                              Finally, macros are essential for defining “command languages.†A command is a function with a short name for use by users in interacting with Lisp’s read-eval-print loop. A short name is useful and possible because we want it to be easy to type and we don’t care much whether the name clashes some other command; if two command names clash, we can change one of them.

                                              + +

                                              As an example, let’s define a little command language for debugging macros. (You may actually find this useful.) There are just two commands, ex and fi. They keep track of a “current form,†the thing to be macro-expanded or the result of such an expansion:

                                              + +
                                                +
                                              1. (ex [form]): Apply macroexpand-1 to form (if supplied) or the current form, and make the result the current form. Then pretty-print the current form.
                                              2. +
                                              3. (fi s [k]): Find the k‘th subexpression of the current form whose car is s. (k defaults to 0.) Make that subexpression the current form and pretty-print it.
                                              4. +
                                              + +

                                              Suppose you’re trying to debug a macro hair-squared that expands into something complex containing a subform that is itself a macro form beginning with the symbol odd-define. You suspect there is a bug in the subform. You might issue the following commands:

                                              + +
                                              (ex (hair-squared ...))
                                              +(PROGN (DEFUN ...)
                                              +         (ODD-DEFINE ZIP (U V W))
                                              +         ...)
                                              +
                                              +(fi odd-define)
                                              +(ODD-DEFINE ZIP (U V W))
                                              +
                                              +(ex)
                                              +(PROGN (DEFUN MAKE-A-ZIP (U V W) ...)
                                              +   ...)
                                              +
                                              + +

                                              Once again, it is clear that ex and fi cannot be functions, although they could easily be made into functions if we were willing to type a quote before their arguments. But using “quote†often seems inappropriate in commands. For one thing, having to type it is a nuisance in a context where we are trying to save keystrokes, especially if the argument in question is always quoted. For another, in many cases it just seems inappropriate. If we had a command that took a symbol as one of its arguments and set it to a value, it would just be strange to write (command 'x ...) instead of (command x ...), because we want to think of the command as a variant of setq.

                                              + +

                                              Here is how ex and fi might be defined:

                                              + +
                                              (defvar *current-form*)
                                              +
                                              +(defmacro ex (&optional (form nil form-supplied))
                                              +  `(progn
                                              +     (pprint (setq *current-form*
                                              +                   (macroexpand-1
                                              +                    ,(cond (form-supplied
                                              +                            `',form)
                                              +                           (t '*current-form*)))))
                                              +     (values)))
                                              +
                                              +(defmacro fi (s &optional (k 0))
                                              +  `(progn
                                              +     (pprint (setq *current-form*
                                              +                   (find-nth-occurrence ',s *current-form* ,k)))
                                              +     (values)))
                                              +
                                              + +

                                              The ex macro expands to a form containing a call to macroexpand-1, a built-in function that does one step of macro expansion to a form whose car is the name of a macro. (If given some other form, it returns the form unchanged.) pprint is a built-in function that pretty-prints its argument. Because we are using ex and fi at a read-eval-print loop, any value returned by their expansions will be printed. Here the expansion is executed for side effect, so we arrange to return no values at all by having the expansion return (values).

                                              + +

                                              In some Lisp implementations, read-eval-print loops routinely print results using pprint. In those implementations we could simplify ex and fi by having them print nothing, but just return the value of *current-form*, which the read-eval-print loop will then print prettily. Use your judgment.

                                              + +

                                              I leave the definition of find-nth-occurrence as an exercise. You might also want to define a command that just sets and prints the current form: (cf e).

                                              + +

                                              One caution: In general, command languages will consist of a mixture of macros and functions, with convenience for their definer (and usually sole user) being the main consideration. If a command seems to “want†to evaluate some of its arguments sometimes, you have to decide whether to define two (or more) versions of it, or just one, a function whose arguments must be quoted to prevent their being evaluated. For the cf command mentioned in the previous paragraph, some users might prefer cf to be a function, some a macro.

                                              + +

                                              See also

                                              + + + +

                                              video

                                              + +
                                                +
                                              • the article “Reader macros in Common Lispâ€: https://lisper.in/reader-macros
                                              • +
                                              + + +

                                              + Page source: macros.md +

                                              +
                                              + + + + + +
                                              +
                                              +
                                              + © 2002–2021 the Common Lisp Cookbook Project +
                                              + +
                                              +
                                              T
                                              O
                                              C
                                              +
                                              + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/misc.html b/clones/lispcookbook.github.io/cl-cookbook/misc.html new file mode 100644 index 00000000..d5874dde --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/misc.html @@ -0,0 +1,210 @@ + + + + + Miscellaneous + + + + + + + + + + + + + + +

                                              The Common Lisp Cookbook – Miscellaneous

                                              +
                                              + + + + +
                                              +
                                              + +
                                              +
                                              + +
                                              +
                                              Table of Contents
                                              +
                                                +
                                                +
                                                + +
                                                +

                                                The Common Lisp Cookbook – Miscellaneous

                                                + + +

                                                + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                +

                                                + 📕 Get the EPUB and PDF +

                                                + + +

                                                + +

                                                Re-using complex data structures

                                                + +

                                                Sometimes you want your functions to behave in a ‘functional’ way, i.e. return fresh results without side effects, sometimes you want them to re-use and modify existing data in a destructive way - consider the difference between append and nconc for an example.

                                                + +

                                                Well, you can have your cake and eat it too, by using optional (or keyword) parameters. Here’s an example: Let’s assume you’re writing a function complex-matrix-stuff which takes two matrices m1 and m2 as its arguments and computes and returns a resulting matrix the size of which depends on m1 and m2, i.e. for a fresh result you’ll need an empty matrix which’ll be created by, say, (make-appropriate-result-matrix-for m1 m2).

                                                + +

                                                The classical textbook way to implement this function will more or less look like this:

                                                + +
                                                (defun complex-matrix-stuff (m1 m2)
                                                +  (let ((result (make-appropriate-result-matrix-for m1 m2)))
                                                +    ;; ... compute storing the results in RESULT
                                                +    result))
                                                +
                                                + +

                                                And you’ll use it like this:

                                                + +
                                                (setq some-matrix (complex-matrix-stuff A B))
                                                +
                                                + +

                                                But why not write it like so:

                                                + +
                                                (defun complex-matrix-stuff (m1 m2
                                                +                             &optional
                                                +                             (result
                                                +                              (make-appropriate-result-matrix-for m1 m2)))
                                                +  ;; ... compute storing the results in RESULT
                                                +  result)
                                                +
                                                + +

                                                Now you have it both ways. You can still “make up results†on the fly as in:

                                                + +
                                                (setq some-matrix (complex-matrix-stuff A B))
                                                +
                                                + +

                                                But you can also (destructively) re-use previously allocated matrices:

                                                + +
                                                (complex-matrix-stuff A B some-appropriate-matrix-I-built-before)
                                                +
                                                + +

                                                Or use your function like this:

                                                + +
                                                (setq some-other-matrix
                                                +      (complex-matrix-stuff A B some-appropriate-matrix-I-built-before))
                                                +
                                                + +

                                                in which case you’ll end up with:

                                                + +
                                                * (eq some-other-matrix some-appropriate-matrix-I-built-before)
                                                +
                                                +T
                                                +
                                                + +

                                                + +

                                                Using ADJUST-ARRAY instead of consing up new sequences with SUBSEQ

                                                + +

                                                Most CL functions operating on sequences will accept start and end keywords so you can make them operate on a sub-sequence without actually creating it, i.e. instead of

                                                + +
                                                (count #\a (subseq long-string from to))
                                                +
                                                + +

                                                you should of course use

                                                + +
                                                (count #\a long-string :start from :end to)
                                                +
                                                + +

                                                which’ll yield the same result but not create an unnecessary intermediate sub-sequence.

                                                + +

                                                However, sometimes it looks like you can’t avoid creating new data. Consider a hash table the keys of which are strings. If the key you’re looking for is a sub-string of another string you’ll most likely end up with

                                                + +
                                                (gethash (subseq original-string from to)
                                                +         hash-table)
                                                +
                                                + +

                                                But you don’t have to. You can create one displaced string and reuse it multiple times with adjust-array:

                                                + +
                                                (let ((substring (make-array 0
                                                +                             :element-type 'character
                                                +                             :displaced-to ""
                                                +                             :displaced-index-offset 0)))
                                                +  ;; more code
                                                +  (gethash
                                                +   (adjust-array substring (- to from)
                                                +                 :displaced-to original-string
                                                +                 :displaced-index-offset from)
                                                +   hash-table)
                                                +  ;; even more code
                                                +  )
                                                +
                                                + + +

                                                + Page source: misc.md +

                                                +
                                                + + + + + +
                                                +
                                                +
                                                + © 2002–2021 the Common Lisp Cookbook Project +
                                                + +
                                                +
                                                T
                                                O
                                                C
                                                +
                                                + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/numbers.html b/clones/lispcookbook.github.io/cl-cookbook/numbers.html new file mode 100644 index 00000000..a1d4ee4d --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/numbers.html @@ -0,0 +1,703 @@ + + + + + Numbers + + + + + + + + + + + + + + +

                                                The Common Lisp Cookbook – Numbers

                                                +
                                                + + + + +
                                                +
                                                + +
                                                +
                                                + +
                                                +
                                                Table of Contents
                                                +
                                                  +
                                                  +
                                                  + +
                                                  +

                                                  The Common Lisp Cookbook – Numbers

                                                  + + +

                                                  + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                  +

                                                  + 📕 Get the EPUB and PDF +

                                                  + + +
                                                  Common Lisp has a rich set of numerical types, including integer, +rational, floating point, and complex.

                                                  + +

                                                  Some sources:

                                                  + + + +

                                                  Introduction

                                                  + +

                                                  Integer types

                                                  + +

                                                  Common Lisp provides a true integer type, called bignum, limited only by the total +memory available (not the machine word size). For example this would +overflow a 64 bit integer by some way:

                                                  + +
                                                  * (expt 2 200)
                                                  +1606938044258990275541962092341162602522202993782792835301376
                                                  +
                                                  + +

                                                  For efficiency, integers can be limited to a fixed number of bits, +called a fixnum type. The range of integers which can be represented +is given by:

                                                  + +
                                                  * most-positive-fixnum
                                                  +4611686018427387903
                                                  +* most-negative-fixnum
                                                  +-4611686018427387904
                                                  +
                                                  + +

                                                  Functions which operate on or evaluate to integers include:

                                                  + +
                                                    +
                                                  • isqrt, which returns the greatest integer less than or equal to the +exact positive square root of natural.
                                                  • +
                                                  + +
                                                  * (isqrt 10)
                                                  +3
                                                  +* (isqrt 4)
                                                  +2
                                                  +
                                                  + +
                                                    +
                                                  • gcd to find the Greatest Common Denominator
                                                  • +
                                                  • lcm for the Least Common Multiple.
                                                  • +
                                                  + +

                                                  Like other low-level programming languages, Common Lisp provides literal +representation for hexadecimals and other radixes up to 36. For example:

                                                  + +
                                                  * #xFF
                                                  +255
                                                  +* #2r1010
                                                  +10
                                                  +* #4r33
                                                  +15
                                                  +* #8r11
                                                  +9
                                                  +* #16rFF
                                                  +255
                                                  +* #36rz
                                                  +35
                                                  +
                                                  + +

                                                  Rational types

                                                  + +

                                                  Rational numbers of type ratio consist of two bignums, the +numerator and denominator. Both can therefore be arbitrarily large:

                                                  + +
                                                  * (/ (1+ (expt 2 100)) (expt 2 100))
                                                  +1267650600228229401496703205377/1267650600228229401496703205376
                                                  +
                                                  + +

                                                  It is a subtype of the rational class, along with +integer.

                                                  + +

                                                  Floating point types

                                                  + +

                                                  See Common Lisp the Language, 2nd Edition, section 2.1.3.

                                                  + +

                                                  Floating point types attempt to represent the continuous real numbers +using a finite number of bits. This means that many real numbers +cannot be represented, but are approximated. This can lead to some nasty +surprises, particularly when converting between base-10 and the base-2 +internal representation. If you are working with floating point +numbers then reading What Every Computer Scientist Should Know About +Floating-Point Arithmetic is highly +recommended.

                                                  + +

                                                  The Common Lisp standard allows for several floating point types. In +order of increasing precision these are: short-float, +single-float, double-float, and long-float. Their precisions are +implementation dependent, and it is possible for an implementation to +have only one floating point precision for all types.

                                                  + +

                                                  The constants short-float-epsilon, single-float-epsilon, +double-float-epsilon and long-float-epsilon give +a measure of the precision of the floating point types, and are +implementation dependent.

                                                  + +

                                                  Floating point literals

                                                  + +

                                                  When reading floating point numbers, the default type is set by the special +variable *read-default-float-format*. By default +this is SINGLE-FLOAT, so if you want to ensure that a number is read as double +precision then put a d0 suffix at the end

                                                  + +
                                                  * (type-of 1.24)
                                                  +SINGLE-FLOAT
                                                  +
                                                  +* (type-of 1.24d0)
                                                  +DOUBLE-FLOAT
                                                  +
                                                  + +

                                                  Other suffixes are s (short), f (single float), d (double +float), l (long float) and e (default; usually single float).

                                                  + +

                                                  The default type can be changed, but note that this may break packages +which assume single-float type.

                                                  + +
                                                  * (setq *read-default-float-format* 'double-float)
                                                  +* (type-of 1.24)
                                                  +DOUBLE-FLOAT
                                                  +
                                                  + +

                                                  Note that unlike in some languages, appending a single decimal point +to the end of a number does not make it a float:

                                                  +
                                                  * (type-of 10.)
                                                  +(INTEGER 0 4611686018427387903)
                                                  +
                                                  +* (type-of 10.0)
                                                  +SINGLE-FLOAT
                                                  +
                                                  + +

                                                  Floating point errors

                                                  + +

                                                  If the result of a floating point calculation is too large then a floating +point overflow occurs. By default in SBCL (and other implementations) +this results in an error condition:

                                                  + +
                                                  * (exp 1000)
                                                  +; Evaluation aborted on #<FLOATING-POINT-OVERFLOW {10041720B3}>.
                                                  +
                                                  + +

                                                  The error can be caught and handled, or this behaviour can be +changed, to return +infinity. In SBCL this is:

                                                  + +
                                                  * (sb-int:set-floating-point-modes :traps '(:INVALID :DIVIDE-BY-ZERO))
                                                  +
                                                  +* (exp 1000)
                                                  +#.SB-EXT:SINGLE-FLOAT-POSITIVE-INFINITY
                                                  +
                                                  +* (/ 1 (exp 1000))
                                                  +0.0
                                                  +
                                                  + +

                                                  The calculation now silently continues, without an error condition.

                                                  + +

                                                  A similar functionality to disable floating overflow errors +exists in CCL:

                                                  + +
                                                  * (set-fpu-mode :overflow nil)
                                                  +
                                                  + +

                                                  In SBCL the floating point modes can be inspected:

                                                  + +
                                                  * (sb-int:get-floating-point-modes)
                                                  +(:TRAPS (:OVERFLOW :INVALID :DIVIDE-BY-ZERO) :ROUNDING-MODE :NEAREST
                                                  + :CURRENT-EXCEPTIONS NIL :ACCRUED-EXCEPTIONS NIL :FAST-MODE NIL)
                                                  +
                                                  + +

                                                  Arbitrary precision

                                                  + +

                                                  For arbitrary high precision calculations there is the +computable-reals library on QuickLisp:

                                                  + +
                                                  * (ql:quickload :computable-reals)
                                                  +* (use-package :computable-reals)
                                                  +
                                                  +* (sqrt-r 2)
                                                  ++1.41421356237309504880...
                                                  +
                                                  +* (sin-r (/r +pi-r+ 2))
                                                  ++1.00000000000000000000...
                                                  +
                                                  + +

                                                  The precision to print is set by *PRINT-PREC*, by default 20

                                                  + +
                                                  * (setq *PRINT-PREC* 50)
                                                  +* (sqrt-r 2)
                                                  ++1.41421356237309504880168872420969807856967187537695...
                                                  +
                                                  + +

                                                  Complex types

                                                  + +

                                                  There are 5 types of complex number: The real and imaginary parts must +be of the same type, and can be rational, or one of the floating point +types (short, single, double or long).

                                                  + +

                                                  Complex values can be created using the #C reader macro or the function +complex. The reader macro does not allow the use of expressions +as real and imaginary parts:

                                                  + +
                                                  * #C(1 1)
                                                  +#C(1 1)
                                                  +
                                                  +* #C((+ 1 2) 5)
                                                  +; Evaluation aborted on #<TYPE-ERROR expected-type: REAL datum: (+ 1 2)>.
                                                  +
                                                  +* (complex (+ 1 2) 5)
                                                  +#C(3 5)
                                                  +
                                                  + +

                                                  If constructed with mixed types then the higher precision type will be used for both parts.

                                                  + +
                                                  * (type-of #C(1 1))
                                                  +(COMPLEX (INTEGER 1 1))
                                                  +
                                                  +* (type-of #C(1.0 1))
                                                  +(COMPLEX (SINGLE-FLOAT 1.0 1.0))
                                                  +
                                                  +* (type-of #C(1.0 1d0))
                                                  +(COMPLEX (DOUBLE-FLOAT 1.0d0 1.0d0))
                                                  +
                                                  + +

                                                  The real and imaginary parts of a complex number can be extracted using +realpart and imagpart:

                                                  + +
                                                  * (realpart #C(7 9))
                                                  +7
                                                  +* (imagpart #C(4.2 9.5))
                                                  +9.5
                                                  +
                                                  + +

                                                  Complex arithmetic

                                                  + +

                                                  Common Lisp’s mathematical functions generally handle complex numbers, +and return complex numbers when this is the true result. For example:

                                                  + +
                                                  * (sqrt -1)
                                                  +#C(0.0 1.0)
                                                  +
                                                  +* (exp #C(0.0 0.5))
                                                  +#C(0.87758255 0.47942555)
                                                  +
                                                  +* (sin #C(1.0 1.0))
                                                  +#C(1.2984576 0.63496387)
                                                  +
                                                  + +

                                                  Reading numbers from strings

                                                  + +

                                                  The parse-integer function reads an integer from a string.

                                                  + +

                                                  The parse-float library provides a parser which cannot evaluate +arbitrary expressions, so should be safer to use on untrusted input:

                                                  + +
                                                  * (ql:quickload :parse-float)
                                                  +* (use-package :parse-float)
                                                  +
                                                  +* (parse-float "23.4e2" :type 'double-float)
                                                  +2340.0d0
                                                  +6
                                                  +
                                                  + +

                                                  See the strings section on converting between strings and numbers.

                                                  + +

                                                  Converting numbers

                                                  + +

                                                  Most numerical functions automatically convert types as needed. +The coerce function converts objects from one type to another, +including numeric types.

                                                  + +

                                                  See Common Lisp the Language, 2nd Edition, section 12.6.

                                                  + +

                                                  Convert float to rational

                                                  + +

                                                  The rational and rationalize functions convert +a real numeric argument into a rational. rational assumes that floating +point arguments are exact; rationalize exploits the fact that floating point +numbers are only exact to their precision, so can often find a simpler +rational number.

                                                  + +

                                                  Convert rational to integer

                                                  + +

                                                  If the result of a calculation is a rational number where the numerator +is a multiple of the denominator, then it is automatically converted +to an integer:

                                                  + +
                                                  * (type-of (* 1/2 4))
                                                  +(INTEGER 0 4611686018427387903)
                                                  +
                                                  + +

                                                  Rounding floating-point and rational numbers

                                                  + +

                                                  The ceiling, floor, round and truncate functions +convert floating point or rational numbers to integers. The difference +between the result and the input is returned as the second value, so that the +input is the sum of the two outputs.

                                                  + +
                                                  * (ceiling 1.42)
                                                  +2
                                                  +-0.58000004
                                                  +
                                                  +* (floor 1.42)
                                                  +1
                                                  +0.41999996
                                                  +
                                                  +* (round 1.42)
                                                  +1
                                                  +0.41999996
                                                  +
                                                  +* (truncate 1.42)
                                                  +1
                                                  +0.41999996
                                                  +
                                                  + +

                                                  There is a difference between floor and truncate for negative +numbers:

                                                  + +
                                                  * (truncate -1.42)
                                                  +-1
                                                  +-0.41999996
                                                  +
                                                  +* (floor -1.42)
                                                  +-2
                                                  +0.58000004
                                                  +
                                                  +* (ceiling -1.42)
                                                  +-1
                                                  +-0.41999996
                                                  +
                                                  + +

                                                  Similar functions fceiling, ffloor, fround and ftruncate +return the result as floating point, of the same type as their +argument:

                                                  + +
                                                  * (ftruncate 1.3)
                                                  +1.0
                                                  +0.29999995
                                                  +
                                                  +* (type-of (ftruncate 1.3))
                                                  +SINGLE-FLOAT
                                                  +
                                                  +* (type-of (ftruncate 1.3d0))
                                                  +DOUBLE-FLOAT
                                                  +
                                                  + +

                                                  Comparing numbers

                                                  + +

                                                  See Common Lisp the Language, 2nd Edition, Section 12.3.

                                                  + +

                                                  The = predicate returns T if all arguments are numerically equal. +Note that comparison of floating point numbers includes some margin +for error, due to the fact that they cannot represent all real +numbers and accumulate errors.

                                                  + +

                                                  The constant single-float-epsilon is the smallest +number which will cause an = comparison to fail, if it is added to 1.0:

                                                  + +
                                                  * (= (+ 1s0 5e-8) 1s0)
                                                  +T
                                                  +* (= (+ 1s0 6e-8) 1s0)
                                                  +NIL
                                                  +
                                                  + +

                                                  Note that this does not mean that a single-float is always precise +to within 6e-8:

                                                  + +
                                                  * (= (+ 10s0 4e-7) 10s0)
                                                  +T
                                                  +* (= (+ 10s0 5e-7) 10s0)
                                                  +NIL
                                                  +
                                                  + +

                                                  Instead this means that single-float is precise to approximately +seven digits. If a sequence of calculations are performed, then error +can accumulate and a larger error margin may be needed. In this case +the absolute difference can be compared:

                                                  + +
                                                  * (< (abs (- (+ 10s0 5e-7)
                                                  +             10s0))
                                                  +     1s-6)
                                                  +T
                                                  +
                                                  + +

                                                  When comparing numbers with = mixed types are allowed. To test both +numerical value and type use eql:

                                                  + +
                                                  * (= 3 3.0)
                                                  +T
                                                  +
                                                  +* (eql 3 3.0)
                                                  +NIL
                                                  +
                                                  + +

                                                  Operating on a series of numbers

                                                  + +

                                                  Many Common Lisp functions operate on sequences, which can be either lists +or vectors (1D arrays). See the section on +mapping.

                                                  + +

                                                  Operations on multidimensional arrays are discussed in +this section.

                                                  + +

                                                  Libraries are available for defining and operating on lazy sequences, +including “infinite†sequences of numbers. For example

                                                  + +
                                                    +
                                                  • Clazy which is on QuickLisp.
                                                  • +
                                                  • folio2 on QuickLisp. Includes an interface to the
                                                  • +
                                                  • Series package for efficient sequences.
                                                  • +
                                                  • lazy-seq.
                                                  • +
                                                  + +

                                                  Working with Roman numerals

                                                  + +

                                                  The format function can convert numbers to roman numerals with the +~@r directive:

                                                  + +
                                                  * (format nil "~@r" 42)
                                                  +"XLII"
                                                  +
                                                  + +

                                                  There is a gist by tormaroe for reading roman numerals.

                                                  + +

                                                  Generating random numbers

                                                  + +

                                                  The random function generates either integer or floating point +random numbers, depending on the type of its argument.

                                                  + +
                                                  * (random 10)
                                                  +7
                                                  +
                                                  +* (type-of (random 10))
                                                  +(INTEGER 0 4611686018427387903)
                                                  +* (type-of (random 10.0))
                                                  +SINGLE-FLOAT
                                                  +* (type-of (random 10d0))
                                                  +DOUBLE-FLOAT
                                                  +
                                                  + +

                                                  In SBCL a Mersenne Twister pseudo-random number generator + is used. See section 7.13 of the SBCL manual for details.

                                                  + +

                                                  The random seed is stored in *random-state* whose internal +representation is implementation dependent. The function +make-random-state can be used to make new random +states, or copy existing states.

                                                  + +

                                                  To use the same set of random numbers multiple times, +(make-random-state nil) makes a copy of the current *random-state*:

                                                  + +
                                                  * (dotimes (i 3)
                                                  +    (let ((*random-state* (make-random-state nil)))
                                                  +      (format t "~a~%"
                                                  +              (loop for i from 0 below 10 collecting (random 10)))))
                                                  +
                                                  +(8 3 9 2 1 8 0 0 4 1)
                                                  +(8 3 9 2 1 8 0 0 4 1)
                                                  +(8 3 9 2 1 8 0 0 4 1)
                                                  +
                                                  + +

                                                  This generates 10 random numbers in a loop, but each time the sequence +is the same because the *random-state* special variable is dynamically +bound to a copy of its state before the let form.

                                                  + +

                                                  Other resources:

                                                  + +
                                                    +
                                                  • The random-state package is available on QuickLisp, and +provides a number of portable random number generators.
                                                  • +
                                                  + +

                                                  Bit-wise Operation

                                                  + +

                                                  Common Lisp also provides many functions to perform bit-wise arithmetic +operations. Some commonly used ones are listed below, together with their +C/C++ equivalence.

                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  Common LispC/C++Description
                                                  (logand a b c)a & b & cBit-wise AND of multiple operands
                                                  (logior a b c)a | b | cBit-wise OR of multiple arguments
                                                  (lognot a)~aBit-wise NOT of single operand
                                                  (logxor a b c)a ^ b ^ cBit-wise exclusive or (XOR) or multiple operands
                                                  (ash a 3)a << 3Bit-wise left shift
                                                  (ash a -3)a >> 3Bit-wise right shift
                                                  + +

                                                  Negative numbers are treated as two’s-complements. If you have forgotten this, +please refer to the Wiki page.

                                                  + +

                                                  For example:

                                                  + +
                                                  * (logior 1 2 4 8)
                                                  +15
                                                  +;; Explanation:
                                                  +;;   0001
                                                  +;;   0010
                                                  +;;   0100
                                                  +;; | 1000
                                                  +;; -------
                                                  +;;   1111
                                                  +
                                                  +* (logand 2 -3 4)
                                                  +0
                                                  +
                                                  +;; Explanation:
                                                  +;;   0010 (2)
                                                  +;;   1101 (two's complement of -3)
                                                  +;; & 0100 (4)
                                                  +;; -------
                                                  +;;   0000
                                                  +
                                                  +* (logxor 1 3 7 15)
                                                  +10
                                                  +
                                                  +;; Explanation:
                                                  +;;   0001
                                                  +;;   0011
                                                  +;;   0111
                                                  +;; ^ 1111
                                                  +;; -------
                                                  +;;   1010
                                                  +
                                                  +* (lognot -1)
                                                  +0
                                                  +;; Explanation:
                                                  +;;   11 -> 00
                                                  +
                                                  +* (lognot -3)
                                                  +2
                                                  +;;   101 -> 010
                                                  +
                                                  +* (ash 3 2)
                                                  +12
                                                  +;; Explanation:
                                                  +;;   11 -> 1100
                                                  +
                                                  +* (ash -5 -2)
                                                  +-2
                                                  +;; Explanation
                                                  +;;   11011 -> 110
                                                  +
                                                  + +

                                                  Please see the CLHS page for a more detailed explanation +or other bit-wise functions.

                                                  + + + +

                                                  + Page source: numbers.md +

                                                  +
                                                  + + + + + +
                                                  +
                                                  +
                                                  + © 2002–2021 the Common Lisp Cookbook Project +
                                                  + +
                                                  +
                                                  T
                                                  O
                                                  C
                                                  +
                                                  + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/orly-cover.png b/clones/lispcookbook.github.io/cl-cookbook/orly-cover.png new file mode 100644 index 0000000000000000000000000000000000000000..ede9dd9f1e7939297c8a03737b9c9c05c1364f47 GIT binary patch literal 74485 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 + + + + Interfacing with your OS + + + + + + + + + + + + + + +

                                                  The Common Lisp Cookbook – Interfacing with your OS

                                                  +
                                                  + + + + +
                                                  +
                                                  + +
                                                  +
                                                  + +
                                                  +
                                                  Table of Contents
                                                  +
                                                    +
                                                    +
                                                    + +
                                                    +

                                                    The Common Lisp Cookbook – Interfacing with your OS

                                                    + + +

                                                    + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                    +

                                                    + 📕 Get the EPUB and PDF +

                                                    + + +
                                                    The ANSI Common Lisp standard doesn’t mention this topic. (Keep in mind that it was written at a time where Lisp Machines were at their peak. On these boxes Lisp was your operating system!) So almost everything that can be said here depends on your OS and your implementation. +There are, however, some widely used libraries, which either come with your Common Lisp implementation, or are easily +available through Quicklisp. These include:

                                                    + + + +

                                                    + +

                                                    Accessing Environment variables

                                                    + +

                                                    UIOP comes with a function that’ll allow you to look at Unix/Linux environment variables on a lot of different CL implementations:

                                                    + +
                                                    * (uiop:getenv "HOME")
                                                    +  "/home/edi"
                                                    +
                                                    + +

                                                    Below is an example implementation, where we can see /feature flags/ used to run code on specific implementations:

                                                    + +
                                                    * (defun my-getenv (name &optional default)
                                                    +    "Obtains the current value of the POSIX environment variable NAME."
                                                    +    (declare (type (or string symbol) name))
                                                    +    (let ((name (string name)))
                                                    +      (or #+abcl (ext:getenv name)
                                                    +         #+ccl (ccl:getenv name)
                                                    +         #+clisp (ext:getenv name)
                                                    +         #+cmu (unix:unix-getenv name) ; since CMUCL 20b
                                                    +         #+ecl (si:getenv name)
                                                    +         #+gcl (si:getenv name)
                                                    +         #+mkcl (mkcl:getenv name)
                                                    +         #+sbcl (sb-ext:posix-getenv name)
                                                    +         default)))
                                                    +MY-GETENV
                                                    +* (my-getenv "HOME")
                                                    +"/home/edi"
                                                    +* (my-getenv "HOM")
                                                    +NIL
                                                    +* (my-getenv "HOM" "huh?")
                                                    +"huh?"
                                                    +
                                                    + +

                                                    You should also note that some of these implementations also provide the ability to set these variables. These include ECL (si:setenv) and AllegroCL, LispWorks, and CLISP where you can use the functions from above together with setf. This feature might be important if you want to start subprocesses from your Lisp environment.

                                                    + +

                                                    Also note that the +Osicat +library has the method (environment-variable "name"), on POSIX-like +systems including Windows. It is also fset-able.

                                                    + +

                                                    + +

                                                    Accessing the command line arguments

                                                    + +

                                                    Basics

                                                    + +

                                                    Accessing command line arguments is implementation-specific but it +appears most implementations have a way of getting at +them. UIOP with uiop:command-line-arguments or Roswell as well as external +libraries (see next section) make it portable.

                                                    + +

                                                    SBCL stores the arguments list in the special variable sb-ext:*posix-argv*

                                                    + +
                                                    $ sbcl my-command-line-arg
                                                    +
                                                    + +

                                                    ….

                                                    + +
                                                    * sb-ext:*posix-argv*
                                                    +
                                                    +("sbcl" "my-command-line-arg")
                                                    +*
                                                    +
                                                    + +

                                                    More on using this to write standalone Lisp scripts can be found in the SBCL Manual

                                                    + +

                                                    LispWorks has system:*line-arguments-list*

                                                    + +
                                                    * system:*line-arguments-list*
                                                    +("/Users/cbrown/Projects/lisptty/tty-lispworks" "-init" "/Users/cbrown/Desktop/lisp/lispworks-init.lisp")
                                                    +
                                                    + +

                                                    Here’s a quick function to return the argument strings list across multiple implementations:

                                                    + +
                                                    (defun my-command-line ()
                                                    +  (or
                                                    +   #+SBCL *posix-argv*
                                                    +   #+LISPWORKS system:*line-arguments-list*))
                                                    +
                                                    + +

                                                    Now it would be handy to access them in a portable way and to parse +them according to a schema definition.

                                                    + +

                                                    Parsing command line arguments

                                                    + +

                                                    We have a look at the +Awesome CL list#scripting +section and we’ll show how to use unix-opts.

                                                    + +
                                                    (ql:quickload "unix-opts")
                                                    +
                                                    + +

                                                    We can now refer to it with its opts nickname.

                                                    + +

                                                    We first declare our arguments with opts:define-opts, for example

                                                    + +
                                                    (opts:define-opts
                                                    +    (:name :help
                                                    +           :description "print this help text"
                                                    +           :short #\h
                                                    +           :long "help")
                                                    +    (:name :level
                                                    +           :description "The level of something (integer)."
                                                    +           :short #\l
                                                    +           :long "level"
                                                    +           :arg-parser #'parse-integer))
                                                    +
                                                    + +

                                                    Everything should be self-explanatory. Note that #'parse-integer is +a built-in CL function.

                                                    + +

                                                    Now we can parse and get them with opts:get-opts, which returns two +values: the first is the list of valid options and the second the +remaining free arguments. We then must use multiple-value-bind to +catch everything:

                                                    + +
                                                    (multiple-value-bind (options free-args)
                                                    +    ;; There is no error handling yet (specially for options not having their argument).
                                                    +    (opts:get-opts)
                                                    +
                                                    + +

                                                    We can explore this by giving a list of strings (as options) to +get-opts:

                                                    + +
                                                    (multiple-value-bind (options free-args)
                                                    +                   (opts:get-opts '("hello" "-h" "-l" "1"))
                                                    +                 (format t "Options: ~a~&" options)
                                                    +                 (format t "free args: ~a~&" free-args))
                                                    +Options: (HELP T LEVEL 1)
                                                    +free args: (hello)
                                                    +NIL
                                                    +
                                                    + +

                                                    If we put an unknown option, we get into the debugger. We refer you to +unix-opts’ documentation and code sample to deal with erroneous +options and other errors.

                                                    + +

                                                    We can access the arguments stored in options with getf (it is a +property list), and we can exit (in a portable way) with +opts:exit. So, for example:

                                                    + +
                                                    (multiple-value-bind (options free-args)
                                                    +    ;; No error handling.
                                                    +    (opts:get-opts)
                                                    +
                                                    +  (if (getf options :help)
                                                    +      (progn
                                                    +        (opts:describe
                                                    +         :prefix "My app. Usage:"
                                                    +         :args "[keywords]")
                                                    +        (exit))) ;; <= exit takes an optional return status.
                                                    +    ...
                                                    +
                                                    + +

                                                    And that’s it for now, you know the essential. See the documentation +for a complete example, and the Awesome CL list for useful packages to +use in the terminal (ansi colors, printing tables and progress bars, +interfaces to readline,…).

                                                    + +

                                                    Running external programs

                                                    + +

                                                    uiop has us covered, and is probably included in your Common Lisp +implementation.

                                                    + +

                                                    Synchronously

                                                    + +

                                                    uiop:run-program either takes a string as argument, denoting the +name of the executable to run, or a list of strings, for the program and its arguments:

                                                    + +
                                                    (uiop:run-program "firefox")
                                                    +
                                                    + +

                                                    or

                                                    + +
                                                    (uiop:run-program (list "firefox" "http:url"))
                                                    +
                                                    + +

                                                    This will process the program output as specified and return the +processing results when the program and its output processing are +complete.

                                                    + +

                                                    Use :output t to print to standard output.

                                                    + +

                                                    This function has the following optional arguments:

                                                    + +
                                                    run-program (command &rest keys &key
                                                    +                         ignore-error-status
                                                    +                         (force-shell nil force-shell-suppliedp)
                                                    +                         input
                                                    +                         (if-input-does-not-exist :error)
                                                    +                         output
                                                    +                         (if-output-exists :supersede)
                                                    +                         error-output
                                                    +                         (if-error-output-exists :supersede)
                                                    +                         (element-type #-clozure *default-stream-element-type* #+clozure 'character)
                                                    +                         (external-format *utf-8-external-format*)
                                                    +                       &allow-other-keys)
                                                    +
                                                    + +

                                                    It will always call a shell (rather than directly executing the command when possible) +if force-shell is specified. Similarly, it will never call a shell if force-shell is +specified to be nil.

                                                    + +

                                                    Signal a continuable subprocess-error if the process wasn’t successful (exit-code 0), +unless ignore-error-status is specified.

                                                    + +

                                                    If output is a pathname, a string designating a pathname, or nil (the default) +designating the null device, the file at that path is used as output. +If it’s :interactive, output is inherited from the current process; +beware that this may be different from your *standard-output*, +and under slime will be on your *inferior-lisp* buffer. +If it’s t, output goes to your current *standard-output* stream. +Otherwise, output should be a value that is a suitable first argument to +slurp-input-stream (qv.), or a list of such a value and keyword arguments. +In this case, run-program will create a temporary stream for the program output; +the program output, in that stream, will be processed by a call to slurp-input-stream, +using output as the first argument (or the first element of output, and the rest as keywords). +The primary value resulting from that call (or nil if no call was needed) +will be the first value returned by run-program. +E.g., using :output :string will have it return the entire output stream as a string. +And using :output '(:string :stripped t) will have it return the same string +stripped of any ending newline.

                                                    + +

                                                    if-output-exists, which is only meaningful if output is a string or a +pathname, can take the values :error, :append, and :supersede (the +default). The meaning of these values and their effect on the case +where output does not exist, is analogous to the if-exists parameter +to open with :direction :output.

                                                    + +

                                                    error-output is similar to output, except that the resulting value is returned +as the second value of run-program. t designates the *error-output*. +Also :output means redirecting the error output to the output stream, +in which case nil is returned.

                                                    + +

                                                    if-error-output-exists is similar to if-output-exist, except that it +affects error-output rather than output.

                                                    + +

                                                    input is similar to output, except that vomit-output-stream is used, +no value is returned, and T designates the *standard-input*.

                                                    + +

                                                    if-input-does-not-exist, which is only meaningful if input is a string +or a pathname, can take the values :create and :error (the +default). The meaning of these values is analogous to the +if-does-not-exist parameter to open with :direction :input.

                                                    + +

                                                    element-type and external-format are passed on +to your Lisp implementation, when applicable, for creation of the output stream.

                                                    + +

                                                    One and only one of the stream slurping or vomiting may or may not happen +in parallel in parallel with the subprocess, +depending on options and implementation, +and with priority being given to output processing. +Other streams are completely produced or consumed +before or after the subprocess is spawned, using temporary files.

                                                    + +

                                                    run-program returns 3 values:

                                                    + +
                                                      +
                                                    • the result of the output slurping if any, or nil
                                                    • +
                                                    • the result of the error-output slurping if any, or nil
                                                    • +
                                                    • either 0 if the subprocess exited with success status, or an +indication of failure via the exit-code of the process
                                                    • +
                                                    + +

                                                    Asynchronously

                                                    + +

                                                    With uiop:launch-program.

                                                    + +

                                                    Its signature is the following:

                                                    + +
                                                    launch-program (command &rest keys
                                                    +                         &key
                                                    +                           input
                                                    +                           (if-input-does-not-exist :error)
                                                    +                           output
                                                    +                           (if-output-exists :supersede)
                                                    +                           error-output
                                                    +                           (if-error-output-exists :supersede)
                                                    +                           (element-type #-clozure *default-stream-element-type*
                                                    +                                         #+clozure 'character)
                                                    +                           (external-format *utf-8-external-format*)
                                                    +                           directory
                                                    +                           #+allegro separate-streams
                                                    +                           &allow-other-keys)
                                                    +
                                                    + +

                                                    Output (stdout) from the launched program is set using the output +keyword:

                                                    + +
                                                      +
                                                    • If output is a pathname, a string designating a pathname, or +nil (the default) designating the null device, the file at that +path is used as output.
                                                    • +
                                                    • If it’s :interactive, output is inherited from the current process; +beware that this may be different from your *standard-output*, and +under Slime will be on your *inferior-lisp* buffer.
                                                    • +
                                                    • If it’s T, output goes to your current *standard-output* stream.
                                                    • +
                                                    • If it’s :stream, a new stream will be made available that can be accessed via +process-info-output and read from.
                                                    • +
                                                    • Otherwise, output should be a value that the underlying lisp +implementation knows how to handle.
                                                    • +
                                                    + +

                                                    if-output-exists, which is only meaningful if output is a string or a +pathname, can take the values :error, :append, and :supersede (the +default). The meaning of these values and their effect on the case +where output does not exist, is analogous to the if-exists parameter +to open with :DIRECTION :output.

                                                    + +

                                                    error-output is similar to output. T designates the *error-output*, +:output means redirecting the error output to the output stream, +and :stream causes a stream to be made available via +process-info-error-output.

                                                    + +

                                                    launch-program returns a process-info object, which look like the following (source):

                                                    + +
                                                    (defclass process-info ()
                                                    +    (
                                                    +     ;; The advantage of dealing with streams instead of PID is the
                                                    +     ;; availability of functions like `sys:pipe-kill-process`.
                                                    +     (process :initform nil)
                                                    +     (input-stream :initform nil)
                                                    +     (output-stream :initform nil)
                                                    +     (bidir-stream :initform nil)
                                                    +     (error-output-stream :initform nil)
                                                    +     ;; For backward-compatibility, to maintain the property (zerop
                                                    +     ;; exit-code) <-> success, an exit in response to a signal is
                                                    +     ;; encoded as 128+signum.
                                                    +     (exit-code :initform nil)
                                                    +     ;; If the platform allows it, distinguish exiting with a code
                                                    +     ;; >128 from exiting in response to a signal by setting this code
                                                    +     (signal-code :initform nil)))
                                                    +
                                                    + +

                                                    See the docstrings.

                                                    + +

                                                    Test if a subprocess is alive

                                                    + +

                                                    uiop:process-alive-p tests if a process is still alive, given a +process-info object returned by launch-program:

                                                    + +
                                                    * (defparameter *shell* (uiop:launch-program "bash" :input :stream :output :stream))
                                                    +
                                                    +;; inferior shell process now running
                                                    +* (uiop:process-alive-p *shell*)
                                                    +T
                                                    +
                                                    +;; Close input and output streams
                                                    +* (uiop:close-streams *shell*)
                                                    +* (uiop:process-alive-p *shell*)
                                                    +NIL
                                                    +
                                                    + +

                                                    Get the exit code

                                                    + +

                                                    We can use uiop:wait-process. If the process is finished, it returns +immediately, and returns the exit code. If not, it waits for the +process to terminate.

                                                    + +
                                                    (uiop:process-alive-p *process*)
                                                    +NIL
                                                    +(uiop:wait-process *process*)
                                                    +0
                                                    +
                                                    + +

                                                    An exit code to 0 means success (use zerop).

                                                    + +

                                                    The exit code is also stored in the exit-code slot of our +process-info object. We see from the class definition above that it +has no accessor, so we’ll use slot-value. It has an initform to +nil, so we don’t have to check if the slot is bound. We can do:

                                                    + +
                                                    (slot-value *my-process* 'uiop/launch-program::exit-code)
                                                    +0
                                                    +
                                                    + +

                                                    The trick is that we must run wait-process beforehand, otherwise +the result will be nil.

                                                    + +

                                                    Since wait-process is blocking, we can do it on a new thread:

                                                    + +
                                                    (bt:make-thread
                                                    +  (lambda ()
                                                    +    (let ((exit-code (uiop:wait-process
                                                    +                       (uiop:launch-program (list "of" "commands"))))
                                                    +      (if (zerop exit-code)
                                                    +          (print :success)
                                                    +          (print :failure)))))
                                                    +  :name "Waiting for <program>")
                                                    +
                                                    + +

                                                    Note that run-program returns the exit code as the third value.

                                                    + +

                                                    Input and output from subprocess

                                                    + +

                                                    If the input keyword is set to :stream, then a stream is created +and can be written to in the same way as a file. The stream can be +accessed using uiop:process-info-input:

                                                    + +
                                                    ;; Start the inferior shell, with input and output streams
                                                    +* (defparameter *shell* (uiop:launch-program "bash" :input :stream :output :stream))
                                                    +;; Write a line to the shell
                                                    +* (write-line "find . -name '*.md'" (uiop:process-info-input *shell*))
                                                    +;; Flush stream
                                                    +* (force-output (uiop:process-info-input *shell*))
                                                    +
                                                    + +

                                                    where write-line writes the +string to the given stream, adding a newline at the end. The +force-output call attempts to +flush the stream, but does not wait for completion.

                                                    + +

                                                    Reading from the output stream is similar, with +uiop:process-info-output returning the output stream:

                                                    + +
                                                    * (read-line (uiop:process-info-output *shell*))
                                                    +
                                                    + +

                                                    In some cases the amount of data to be read is known, or there are +delimiters to determine when to stop reading. If this is not the case, +then calls to read-line can +hang while waiting for data. To avoid this, +listen can be used to test if +a character is available:

                                                    + +
                                                    * (let ((stream (uiop:process-info-output *shell*)))
                                                    +     (loop while (listen stream) do
                                                    +         ;; Characters are immediately available
                                                    +         (princ (read-line stream))
                                                    +         (terpri)))
                                                    +
                                                    + +

                                                    There is also +read-char-no-hang which reads +a single character, or returns nil if no character is available. +Note that due to issues like buffering, and the timing of when the +other process is executed, there is no guarantee that all data sent +will be received before listen or read-char-no-hang return nil.

                                                    + +

                                                    Piping

                                                    + +

                                                    Here’s an example to do the equivalent of ls | sort. Note that “ls†+uses launch-program (async) and outputs to a stream, where “sortâ€, +the last command of the pipe, uses run-program and outputs to a +string.

                                                    + +
                                                    (uiop:run-program "sort"
                                                    +                   :input
                                                    +                   (uiop:process-info-output
                                                    +                    (uiop:launch-program "ls"
                                                    +                                         :output :stream))
                                                    +                   :output :string)
                                                    +
                                                    + +

                                                    Get Lisp’s current Process ID (PID)

                                                    + +

                                                    Implementations provide their own functions for this.

                                                    + +

                                                    On SBCL:

                                                    + +
                                                    (sb-posix:getpid)
                                                    +
                                                    + +

                                                    It is possible portably with the osicat library:

                                                    + +
                                                    (osicat-posix:getpid)
                                                    +
                                                    + +

                                                    Here again, we could find it by using the apropos function:

                                                    + +
                                                    CL-USER> (apropos "pid")
                                                    +OSICAT-POSIX:GETPID (fbound)
                                                    +OSICAT-POSIX::PID
                                                    +[…]
                                                    +SB-IMPL::PID
                                                    +SB-IMPL::WAITPID (fbound)
                                                    +SB-POSIX:GETPID (fbound)
                                                    +SB-POSIX:GETPPID (fbound)
                                                    +SB-POSIX:LOG-PID (bound)
                                                    +SB-POSIX::PID
                                                    +SB-POSIX::PID-T
                                                    +SB-POSIX:WAITPID (fbound)
                                                    +[…]
                                                    +
                                                    + + +

                                                    + Page source: os.md +

                                                    +
                                                    + + + + + +
                                                    +
                                                    +
                                                    + © 2002–2021 the Common Lisp Cookbook Project +
                                                    + +
                                                    +
                                                    T
                                                    O
                                                    C
                                                    +
                                                    + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/packages.html b/clones/lispcookbook.github.io/cl-cookbook/packages.html new file mode 100644 index 00000000..f6f7c384 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/packages.html @@ -0,0 +1,316 @@ + + + + + Packages + + + + + + + + + + + + + + +

                                                    The Common Lisp Cookbook – Packages

                                                    +
                                                    + + + + +
                                                    +
                                                    + +
                                                    +
                                                    + +
                                                    +
                                                    Table of Contents
                                                    +
                                                      +
                                                      +
                                                      + +
                                                      +

                                                      The Common Lisp Cookbook – Packages

                                                      + + +

                                                      + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                      +

                                                      + 📕 Get the EPUB and PDF +

                                                      + + +
                                                      See: The Complete Idiot’s Guide to Common Lisp Packages

                                                      + +

                                                      Creating a package

                                                      + +

                                                      Here’s an example package definition. It takes a name, and you +probably want to :use the Common Lisp symbols and functions.

                                                      + +
                                                      (defpackage :my-package
                                                      +  (:use :cl))
                                                      +
                                                      + +

                                                      To start writing code for this package, go inside it:

                                                      + +
                                                      (in-package :my-package)
                                                      +
                                                      + +

                                                      Accessing symbols from a package

                                                      + +

                                                      As soon as you have defined a package or loaded one (with Quicklisp, +or if it was defined as a dependency in your .asd system +definition), you can access its symbols with package:a-symbol, or +with a double colon if the symbol is not exported: +package::non-exported-symbol.

                                                      + +

                                                      Now we can choose to import individual symbols to access them right +away, without the package prefix.

                                                      + +

                                                      Importing symbols from another package

                                                      + +

                                                      You can import exactly the symbols you need with :import-from:

                                                      + +
                                                      (defpackage :my-package
                                                      +  (:import-from :ppcre :regex-replace)
                                                      +  (:use :cl))
                                                      +
                                                      + +

                                                      Sometimes, we see (:import-from :ppcre), without an explicit +import. This helps people using ASDF’s package inferred system.

                                                      + +

                                                      About “useâ€-ing packages being a bad practice

                                                      + +

                                                      :use is a well spread idiom. You could do:

                                                      + +
                                                      (defpackage :my-package
                                                      +  (:use :cl :ppcre))
                                                      +
                                                      + +

                                                      and now, all symbols that are exported by cl-ppcre (aka ppcre) +are available to use directly in your package. However, this should be +considered bad practice, unless you use another package of your +project that you control. Indeed, if the external package adds a +symbol, it could conflict with one of yours, or you could add one +which will hide the external symbol and you might not see a warning.

                                                      + +

                                                      To quote this thorough explanation (a recommended read):

                                                      + +
                                                      +

                                                      USE is a bad idea in contemporary code except for internal packages that you fully control, where it is a decent idea until you forget that you mutate the symbol of some other package while making that brand new shiny DEFUN. USE is the reason why Alexandria cannot nowadays even add a new symbol to itself, because it might cause name collisions with other packages that already have a symbol with the same name from some external source.

                                                      +
                                                      + +

                                                      List all Symbols in a Package

                                                      + +

                                                      Common Lisp provides some macros to iterate through the symbols of a +package. The two most interesting are: +DO-SYMBOLS and DO-EXTERNAL-SYMBOLS. DO-SYMBOLS iterates over the +symbols accessible in the package and DO-EXTERNAL-SYMBOLS only iterates over +the external symbols (you can see them as the real package API).

                                                      + +

                                                      To print all exported symbols of a package named “PACKAGEâ€, you can write:

                                                      + +
                                                      (do-external-symbols (s (find-package "PACKAGE"))
                                                      +  (print s))
                                                      +
                                                      + +

                                                      You can also collect all these symbols in a list by writing:

                                                      + +
                                                      (let (symbols)
                                                      +  (do-external-symbols (s (find-package "PACKAGE"))
                                                      +    (push s symbols))
                                                      +  symbols)
                                                      +
                                                      + +

                                                      Or you can do it with LOOP.

                                                      + +
                                                      (loop for s being the external-symbols of (find-package "PACKAGE")
                                                      +  collect s)
                                                      +
                                                      + +

                                                      Package nickname

                                                      + +

                                                      Nickname Provided by Packages

                                                      + +

                                                      When defining a package, it is trivial to give it a nickname for better user +experience. The following example is a snippet of PROVE package:

                                                      + +
                                                      (defpackage prove
                                                      +  (:nicknames :cl-test-more :test-more)
                                                      +  (:export :run
                                                      +           :is
                                                      +           :ok)
                                                      +
                                                      + +

                                                      Afterwards, a user may use nickname instead of the package name to refer to this +package. For example:

                                                      + +
                                                      (prove:run)
                                                      +(cl-test-more:is)
                                                      +(test-more:ok)
                                                      +
                                                      + +

                                                      Please note that although Common Lisp allows defining multiple nicknames for +one package, too many nicknames may bring maintenance complexity to the +users. Thus the nicknames shall be meaningful and straightforward. For +example:

                                                      + +
                                                      (defpackage #:iterate
                                                      +  (:nicknames #:iter))
                                                      +
                                                      +(defpackage :cl-ppcre
                                                      +  (:nicknames :ppcre)
                                                      +
                                                      + +

                                                      Package Local Nicknames (PLN)

                                                      + +

                                                      Sometimes it is handy to give a local name to an imported package to +save some typing, especially when the imported package does not +provide nice nicknames.

                                                      + +

                                                      Many implementations (SBCL, CCL, ECL, Clasp, ABCL, ACL, LispWorks >= 7.2…) support Package Local Nicknames (PLN).

                                                      + +
                                                      (defpackage :mypackage
                                                      +  (:use :cl)
                                                      +  (:local-nicknames (:nickname :original-package-name)
                                                      +                    (:alex :alexandria)
                                                      +                    (:re :cl-ppcre)))
                                                      +
                                                      +(in-package :mypackage)
                                                      +
                                                      +;; You can use :nickname instead of :original-package-name
                                                      +(nickname:some-function "a" "b")
                                                      +
                                                      + +

                                                      The effect of PLN is totally within mypackage i.e. the nickname won’t work in other packages unless defined there too. So, you don’t have to worry about unintended package name clash in other libraries.

                                                      + +

                                                      Another facility exists for adding nicknames to packages. The function RENAME-PACKAGE can be used to replace the name and nicknames of a package. But it’s use would mean that other libraries may not be able to access the package using the original name or nicknames. There is rarely any situation to use this. Use Package Local Nicknames instead.

                                                      + +

                                                      Package locks

                                                      + +

                                                      The package common-lisp and SBCL internal implementation packages are locked +by default, including sb-ext.

                                                      + +

                                                      In addition, any user-defined package can be declared to be locked so that it +cannot be modified by the user. Attempts to change its symbol table or +redefine functions which its symbols name result in an error.

                                                      + +

                                                      More detailed information can be obtained from documents of +SBCL and CLisp.

                                                      + +

                                                      For example, if you try the following code:

                                                      + +
                                                      (asdf:load-system :alexandria)
                                                      +(rename-package :alexandria :alex)
                                                      +
                                                      + +

                                                      You will get the following error (on SBCL):

                                                      + +
                                                      Lock on package ALEXANDRIA violated when renaming as ALEX while
                                                      +in package COMMON-LISP-USER.
                                                      +   [Condition of type PACKAGE-LOCKED-ERROR]
                                                      +See also:
                                                      +  SBCL Manual, Package Locks [:node]
                                                      +
                                                      +Restarts:
                                                      + 0: [CONTINUE] Ignore the package lock.
                                                      + 1: [IGNORE-ALL] Ignore all package locks in the context of this operation.
                                                      + 2: [UNLOCK-PACKAGE] Unlock the package.
                                                      + 3: [RETRY] Retry SLIME REPL evaluation request.
                                                      + 4: [*ABORT] Return to SLIME's top level.
                                                      + 5: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {10047A8433}>)
                                                      +
                                                      +...
                                                      +
                                                      + +

                                                      If a modification is required anyway, a package named +cl-package-lock can be used to ignore package locks. For +example:

                                                      + +
                                                      (cl-package-locks:without-package-locks
                                                      +  (rename-package :alexandria :alex))
                                                      +
                                                      + +

                                                      See also

                                                      + + + + + +

                                                      + Page source: packages.md +

                                                      +
                                                      + + + + + +
                                                      +
                                                      +
                                                      + © 2002–2021 the Common Lisp Cookbook Project +
                                                      + +
                                                      +
                                                      T
                                                      O
                                                      C
                                                      +
                                                      + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/pattern_matching.html b/clones/lispcookbook.github.io/cl-cookbook/pattern_matching.html new file mode 100644 index 00000000..e2c062a4 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/pattern_matching.html @@ -0,0 +1,315 @@ + + + + + Pattern Matching + + + + + + + + + + + + + + +

                                                      The Common Lisp Cookbook – Pattern Matching

                                                      +
                                                      + + + + +
                                                      +
                                                      + +
                                                      +
                                                      + +
                                                      +
                                                      Table of Contents
                                                      +
                                                        +
                                                        +
                                                        + +
                                                        +

                                                        The Common Lisp Cookbook – Pattern Matching

                                                        + + +

                                                        + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                        +

                                                        + 📕 Get the EPUB and PDF +

                                                        + + +
                                                        The ANSI Common Lisp standard does not include facilities for pattern +matching, but libraries existed for this task and +Trivia became a community +standard.

                                                        + +

                                                        For an introduction to the concepts of pattern matching, see Trivia’s wiki.

                                                        + +

                                                        Trivia matches against a lot of lisp objects and is extensible.

                                                        + +

                                                        The library is in Quicklisp:

                                                        + +
                                                        (ql:quickload "trivia")
                                                        +
                                                        + +

                                                        For the following examples, let’s use the library:

                                                        + +
                                                        (use-package :trivia)
                                                        +
                                                        + +

                                                        Common destructuring patterns

                                                        + +

                                                        cons

                                                        + +
                                                        (match '(1 2 3)
                                                        +  ((cons x y)
                                                        +  ; ^^ pattern
                                                        +   (print x)
                                                        +   (print y)))
                                                        +;; |-> 1
                                                        +;; |-> (2 3)
                                                        +
                                                        + +

                                                        list, list*

                                                        + +

                                                        list is a strict pattern, it expects the length of the matched +object to be the same length as its subpatterns.

                                                        + +
                                                        (match '(something 2 3)
                                                        +  ((list a b _)
                                                        +   (values a b)))
                                                        +SOMETHING
                                                        +2
                                                        +
                                                        + +

                                                        Without the _ placeholder, it would not match:

                                                        + +
                                                        (match '(something 2 3)
                                                        +  ((list a b)
                                                        +   (values a b)))
                                                        +NIL
                                                        +
                                                        + +

                                                        The list* pattern is flexible on the object’s length:

                                                        + +
                                                        (match '(something 2 3)
                                                        +  ((list* a b)
                                                        +   (values a b)))
                                                        +SOMETHING
                                                        +(2 3)
                                                        +
                                                        + +
                                                        (match '(1 2 . 3)
                                                        +  ((list* _ _ x)
                                                        +   x))
                                                        +3
                                                        +
                                                        + +

                                                        However pay attention that if list* receives only one object, that +object is returned, regardless of whether or not it is a list:

                                                        + +
                                                        (match #(0 1 2)
                                                        +  ((list* a)
                                                        +   a))
                                                        +#(0 1 2)
                                                        +
                                                        + +

                                                        This is related to the definition of list* in the HyperSpec: http://clhs.lisp.se/Body/f_list_.htm.

                                                        + +

                                                        vector, vector*

                                                        + +

                                                        vector checks if the object is a vector, if the lengths are the +same, and if the contents matches against each subpatterns.

                                                        + +

                                                        vector* is similar, but called a soft-match variant that allows if +the length is larger-than-equal to the length of subpatterns.

                                                        + +
                                                        (match #(1 2 3)
                                                        +  ((vector _ x _)
                                                        +   x))
                                                        +;; -> 2
                                                        +
                                                        + +
                                                        (match #(1 2 3 4)
                                                        +  ((vector _ x _)
                                                        +   x))
                                                        +;; -> NIL : does not match
                                                        +
                                                        + +
                                                        (match #(1 2 3 4)
                                                        +  ((vector* _ x _)
                                                        +   x))
                                                        +;; -> 2 : soft match.
                                                        +
                                                        + +
                                                        <vector-pattern> : vector      | simple-vector
                                                        +                   bit-vector  | simple-bit-vector
                                                        +                   string      | simple-string
                                                        +                   base-string | simple-base-string | sequence
                                                        +(<vector-pattern> &rest subpatterns)
                                                        +
                                                        + +

                                                        Class and structure pattern

                                                        + +

                                                        There are three styles that are equivalent:

                                                        + +
                                                        (defstruct foo bar baz)
                                                        +(defvar *x* (make-foo :bar 0 :baz 1)
                                                        +
                                                        +(match *x*
                                                        +  ;; make-instance style
                                                        +  ((foo :bar a :baz b)
                                                        +   (values a b))
                                                        +  ;; with-slots style
                                                        +  ((foo (bar a) (baz b))
                                                        +   (values a b))
                                                        +  ;; slot name style
                                                        +  ((foo bar baz)
                                                        +   (values bar baz)))
                                                        +
                                                        + +

                                                        type, satisfies

                                                        + +

                                                        The type pattern matches if the object is of type. satisfies matches +if the predicate returns true for the object. A lambda form is +acceptable.

                                                        + +

                                                        assoc, property, alist, plist

                                                        + +

                                                        All these patterns first check if the pattern is a list. If that is +satisfied, then they obtain the contents, and the value is matched +against the subpattern.

                                                        + +

                                                        Array, simple-array, row-major-array patterns

                                                        + +

                                                        See https://github.com/guicho271828/trivia/wiki/Type-Based-Destructuring-Patterns#array-simple-array-row-major-array-pattern !

                                                        + +

                                                        Logic based patterns

                                                        + +

                                                        We can combine any pattern with some logic.

                                                        + +

                                                        and, or

                                                        + +

                                                        The following:

                                                        + +
                                                        (match x
                                                        +  ((or (list 1 a)
                                                        +       (cons a 3))
                                                        +   a))
                                                        +
                                                        + +

                                                        matches against both (1 2) and (4 . 3) and returns 2 and 4, respectively.

                                                        + +

                                                        not

                                                        + +

                                                        It does not match when subpattern matches. The variables used in the +subpattern are not visible in the body.

                                                        + +

                                                        Guards

                                                        + +

                                                        Guards allow us to use patterns and to verify them against a predicate.

                                                        + +

                                                        The syntax is guard + subpattern + a test form, and the body.

                                                        + +
                                                        (match (list 2 5)
                                                        +  ((guard (list x y)     ; subpattern1
                                                        +          (= 10 (* x y))) ; test-form
                                                        +   :ok))
                                                        +
                                                        + +

                                                        If the subpattern is true, the test form is evaluated, and if it is +true it is matched against subpattern1.

                                                        + +

                                                        Nesting patterns

                                                        + +

                                                        Patterns can be nested:

                                                        + +
                                                        (match '(:a (3 4) 5)
                                                        +  ((list :a (list _ c) _)
                                                        +   c))
                                                        +
                                                        + +

                                                        returns 4.

                                                        + +

                                                        See more

                                                        + +

                                                        See special patterns: place, bind and access.

                                                        + + +

                                                        + Page source: pattern_matching.md +

                                                        +
                                                        + + + + + +
                                                        +
                                                        +
                                                        + © 2002–2021 the Common Lisp Cookbook Project +
                                                        + +
                                                        +
                                                        T
                                                        O
                                                        C
                                                        +
                                                        + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/performance.html b/clones/lispcookbook.github.io/cl-cookbook/performance.html new file mode 100644 index 00000000..56066cd8 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/performance.html @@ -0,0 +1,769 @@ + + + + + Performance Tuning and Tips + + + + + + + + + + + + + + +

                                                        The Common Lisp Cookbook – Performance Tuning and Tips

                                                        +
                                                        + + + + +
                                                        +
                                                        + +
                                                        +
                                                        + +
                                                        +
                                                        Table of Contents
                                                        +
                                                          +
                                                          +
                                                          + +
                                                          +

                                                          The Common Lisp Cookbook – Performance Tuning and Tips

                                                          + + +

                                                          + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                          +

                                                          + 📕 Get the EPUB and PDF +

                                                          + + +
                                                          Many Common Lisp implementations translate the source code into assembly +language, so the performance is really good compared with some other +interpreted languages.

                                                          + +

                                                          However, sometimes we just want the program to be faster. This chapter +introduces some techniques to squeeze the CPU power out.

                                                          + +

                                                          Finding Bottlenecks

                                                          + +

                                                          Acquiring Execution Time

                                                          + +

                                                          The macro time is very useful for finding out bottlenecks. It takes +a form, evaluates it and prints timing information in +*trace-output*, as shown below:

                                                          + +
                                                          * (defun collect (start end)
                                                          +    "Collect numbers [start, end] as list."
                                                          +    (loop for i from start to end
                                                          +          collect i))
                                                          +
                                                          +* (time (collect 1 10))
                                                          +
                                                          +Evaluation took:
                                                          +  0.000 seconds of real time
                                                          +  0.000001 seconds of total run time (0.000001 user, 0.000000 system)
                                                          +  100.00% CPU
                                                          +  3,800 processor cycles
                                                          +  0 bytes consed
                                                          +
                                                          + +

                                                          By using the time macro it is fairly easy to find out which part of your program +takes too much time.

                                                          + +

                                                          Please note that the timing information provided here is not guaranteed to be +reliable enough for marketing comparisons. It should only be used for tuning +purpose, as demonstrated in this chapter.

                                                          + +

                                                          Know your Lisp’s statistical profiler

                                                          + +

                                                          Implementations ship their own profilers. SBCL has +sb-profile, a +“classic, per-function-call†deterministic profiler and +sb-sprof, a +statistical profiler. The latter works by taking samples of the +program execution at regular intervals, instead of instrumenting +functions like sb-profile:profile does.

                                                          + +
                                                          +

                                                          You might find sb-sprof more useful than the deterministic profiler when profiling functions in the common-lisp-package, SBCL internals, or code where the instrumenting overhead is excessive.

                                                          +
                                                          + +

                                                          Use flamegraphs and other tracing profilers

                                                          + +

                                                          cl-flamegraph is a wrapper around SBCL’s statistical profiler to generate FlameGraph charts. Flamegraphs are a very visual way to search for hotspots in your code:

                                                          + +

                                                          + +

                                                          See also tracer, a tracing +profiler for SBCL. Its output is suitable for display in +Chrome’s or Chromium’s Tracing Viewer (chrome://tracing).

                                                          + +

                                                          Checking Assembly Code

                                                          + +

                                                          The function disassemble takes a function and prints the +compiled code of it to *standard-output*. For example:

                                                          + +
                                                          * (defun plus (a b)
                                                          +    (+ a b))
                                                          +PLUS
                                                          +
                                                          +* (disassemble 'plus)
                                                          +; disassembly for PLUS
                                                          +; Size: 37 bytes. Origin: #x52B8063B
                                                          +; 3B:       498B5D60         MOV RBX, [R13+96]                ; no-arg-parsing entry point
                                                          +                                                              ; thread.binding-stack-pointer
                                                          +; 3F:       48895DF8         MOV [RBP-8], RBX
                                                          +; 43:       498BD0           MOV RDX, R8
                                                          +; 46:       488BFE           MOV RDI, RSI
                                                          +; 49:       FF1425B0001052   CALL QWORD PTR [#x521000B0]      ; GENERIC-+
                                                          +; 50:       488B75E8         MOV RSI, [RBP-24]
                                                          +; 54:       4C8B45F0         MOV R8, [RBP-16]
                                                          +; 58:       488BE5           MOV RSP, RBP
                                                          +; 5B:       F8               CLC
                                                          +; 5C:       5D               POP RBP
                                                          +; 5D:       C3               RET
                                                          +; 5E:       CC0F             BREAK 15                         ; Invalid argument count trap
                                                          +
                                                          + +

                                                          The code above was evaluated in SBCL. In some other implementations such as +CLISP, disassembly might return something different:

                                                          + +
                                                          * (defun plus (a b)
                                                          +    (+ a b))
                                                          +PLUS
                                                          +
                                                          +* (disassemble 'plus)
                                                          +Disassembly of function PLUS
                                                          +2 required arguments
                                                          +0 optional arguments
                                                          +No rest parameter
                                                          +No keyword parameters
                                                          +4 byte-code instructions:
                                                          +0     (LOAD&PUSH 2)
                                                          +1     (LOAD&PUSH 2)
                                                          +2     (CALLSR 2 55)                       ; +
                                                          +5     (SKIP&RET 3)
                                                          +NIL
                                                          +
                                                          + +

                                                          It is because SBCL compiles the Lisp code into machine code, while CLISP does +not.

                                                          + +

                                                          Using Declare Expression

                                                          + +

                                                          The declare expression can be used to provide hints for compilers +to perform various optimization. Please note that these hints are +implementation-dependent. Some implementations such as SBCL support this +feature, and you may refer to their own documentation for detailed +information. Here only some basic techniques mentioned in CLHS are introduced.

                                                          + +

                                                          In general, declare expressions can occur only at the beginning of the bodies +of certain forms, or immediately after a documentation string if the context +allows. Also, the content of a declare expression is restricted to limited +forms. Here we introduce some of them that are related to performance tuning.

                                                          + +

                                                          Please keep in mind that these optimization skills introduced in this section +are strongly connected to the Lisp implementation selected. Always check their +documentation before using declare!

                                                          + +

                                                          Speed and Safety

                                                          + +

                                                          Lisp allows you to specify several quality properties for the compiler using +the declaration optimize. Each quality may be assigned a value +from 0 to 3, with 0 being “totally unimportant†and 3 being “extremely +importantâ€.

                                                          + +

                                                          The most significant qualities might be safety and speed.

                                                          + +

                                                          By default, Lisp considers code safety to be much more important than +speed. But you may adjust the weight for more aggressive optimization.

                                                          + +
                                                          * (defun max-original (a b)
                                                          +    (max a b))
                                                          +MAX-ORIGINAL
                                                          +
                                                          +* (disassemble 'max-original)
                                                          +; disassembly for MAX-ORIGINAL
                                                          +; Size: 144 bytes. Origin: #x52D450EF
                                                          +; 7A7:       8D46F1           lea eax, [rsi-15]               ; no-arg-parsing entry point
                                                          +; 7AA:       A801             test al, 1
                                                          +; 7AC:       750E             jne L0
                                                          +; 7AE:       3C0A             cmp al, 10
                                                          +; 7B0:       740A             jeq L0
                                                          +; 7B2:       A80F             test al, 15
                                                          +; 7B4:       7576             jne L5
                                                          +; 7B6:       807EF11D         cmp byte ptr [rsi-15], 29
                                                          +; 7BA:       7770             jnbe L5
                                                          +; 7BC: L0:   8D43F1           lea eax, [rbx-15]
                                                          +; 7BF:       A801             test al, 1
                                                          +; 7C1:       750E             jne L1
                                                          +; 7C3:       3C0A             cmp al, 10
                                                          +; 7C5:       740A             jeq L1
                                                          +; 7C7:       A80F             test al, 15
                                                          +; 7C9:       755A             jne L4
                                                          +; 7CB:       807BF11D         cmp byte ptr [rbx-15], 29
                                                          +; 7CF:       7754             jnbe L4
                                                          +; 7D1: L1:   488BD3           mov rdx, rbx
                                                          +; 7D4:       488BFE           mov rdi, rsi
                                                          +; 7D7:       B9C1030020       mov ecx, 536871873              ; generic->
                                                          +; 7DC:       FFD1             call rcx
                                                          +; 7DE:       488B75F0         mov rsi, [rbp-16]
                                                          +; 7E2:       488B5DF8         mov rbx, [rbp-8]
                                                          +; 7E6:       7E09             jle L3
                                                          +; 7E8:       488BD3           mov rdx, rbx
                                                          +; 7EB: L2:   488BE5           mov rsp, rbp
                                                          +; 7EE:       F8               clc
                                                          +; 7EF:       5D               pop rbp
                                                          +; 7F0:       C3               ret
                                                          +; 7F1: L3:   4C8BCB           mov r9, rbx
                                                          +; 7F4:       4C894DE8         mov [rbp-24], r9
                                                          +; 7F8:       4C8BC6           mov r8, rsi
                                                          +; 7FB:       4C8945E0         mov [rbp-32], r8
                                                          +; 7FF:       488BD3           mov rdx, rbx
                                                          +; 802:       488BFE           mov rdi, rsi
                                                          +; 805:       B929040020       mov ecx, 536871977              ; generic-=
                                                          +; 80A:       FFD1             call rcx
                                                          +; 80C:       4C8B45E0         mov r8, [rbp-32]
                                                          +; 810:       4C8B4DE8         mov r9, [rbp-24]
                                                          +; 814:       488B75F0         mov rsi, [rbp-16]
                                                          +; 818:       488B5DF8         mov rbx, [rbp-8]
                                                          +; 81C:       498BD0           mov rdx, r8
                                                          +; 81F:       490F44D1         cmoveq rdx, r9
                                                          +; 823:       EBC6             jmp L2
                                                          +; 825: L4:   CC0A             break 10                        ; error trap
                                                          +; 827:       04               byte #X04
                                                          +; 828:       13               byte #X13                       ; OBJECT-NOT-REAL-ERROR
                                                          +; 829:       FE9B01           byte #XFE, #X9B, #X01           ; RBX
                                                          +; 82C: L5:   CC0A             break 10                        ; error trap
                                                          +; 82E:       04               byte #X04
                                                          +; 82F:       13               byte #X13                       ; OBJECT-NOT-REAL-ERROR
                                                          +; 830:       FE1B03           byte #XFE, #X1B, #X03           ; RSI
                                                          +; 833:       CC0A             break 10                        ; error trap
                                                          +; 835:       02               byte #X02
                                                          +; 836:       19               byte #X19                       ; INVALID-ARG-COUNT-ERROR
                                                          +; 837:       9A               byte #X9A                       ; RCX
                                                          +
                                                          +* (defun max-with-speed-3 (a b)
                                                          +    (declare (optimize (speed 3) (safety 0)))
                                                          +    (max a b))
                                                          +MAX-WITH-SPEED-3
                                                          +
                                                          +* (disassemble 'max-with-speed-3)
                                                          +; disassembly for MAX-WITH-SPEED-3
                                                          +; Size: 92 bytes. Origin: #x52D452C3
                                                          +; 3B:       48895DE0         mov [rbp-32], rbx                ; no-arg-parsing entry point
                                                          +; 3F:       488945E8         mov [rbp-24], rax
                                                          +; 43:       488BD0           mov rdx, rax
                                                          +; 46:       488BFB           mov rdi, rbx
                                                          +; 49:       B9C1030020       mov ecx, 536871873               ; generic->
                                                          +; 4E:       FFD1             call rcx
                                                          +; 50:       488B45E8         mov rax, [rbp-24]
                                                          +; 54:       488B5DE0         mov rbx, [rbp-32]
                                                          +; 58:       7E0C             jle L1
                                                          +; 5A:       4C8BC0           mov r8, rax
                                                          +; 5D: L0:   498BD0           mov rdx, r8
                                                          +; 60:       488BE5           mov rsp, rbp
                                                          +; 63:       F8               clc
                                                          +; 64:       5D               pop rbp
                                                          +; 65:       C3               ret
                                                          +; 66: L1:   488945E8         mov [rbp-24], rax
                                                          +; 6A:       488BF0           mov rsi, rax
                                                          +; 6D:       488975F0         mov [rbp-16], rsi
                                                          +; 71:       4C8BC3           mov r8, rbx
                                                          +; 74:       4C8945F8         mov [rbp-8], r8
                                                          +; 78:       488BD0           mov rdx, rax
                                                          +; 7B:       488BFB           mov rdi, rbx
                                                          +; 7E:       B929040020       mov ecx, 536871977               ; generic-=
                                                          +; 83:       FFD1             call rcx
                                                          +; 85:       488B45E8         mov rax, [rbp-24]
                                                          +; 89:       488B75F0         mov rsi, [rbp-16]
                                                          +; 8D:       4C8B45F8         mov r8, [rbp-8]
                                                          +; 91:       4C0F44C6         cmoveq r8, rsi
                                                          +; 95:       EBC6             jmp L0
                                                          +
                                                          + +

                                                          As you can see, the generated assembly code is much shorter (92 bytes VS 144). +The compiler was able to perform optimizations. Yet we can do better by +declaring types.

                                                          + +

                                                          Type Hints

                                                          + +

                                                          As mentioned in the Type System chapter, Lisp has a relatively +powerful type system. You may provide type hints so that the compiler may +reduce the size of the generated code.

                                                          + +
                                                          * (defun max-with-type (a b)
                                                          +    (declare (optimize (speed 3) (safety 0)))
                                                          +    (declare (type integer a b))
                                                          +    (max a b))
                                                          +MAX-WITH-TYPE
                                                          +
                                                          +* (disassemble 'max-with-type)
                                                          +; disassembly for MAX-WITH-TYPE
                                                          +; Size: 42 bytes. Origin: #x52D48A23
                                                          +; 1B:       488BF7           mov rsi, rdi                     ; no-arg-parsing entry point
                                                          +; 1E:       488975F0         mov [rbp-16], rsi
                                                          +; 22:       488BD8           mov rbx, rax
                                                          +; 25:       48895DF8         mov [rbp-8], rbx
                                                          +; 29:       488BD0           mov rdx, rax
                                                          +; 2C:       B98C030020       mov ecx, 536871820               ; generic-<
                                                          +; 31:       FFD1             call rcx
                                                          +; 33:       488B75F0         mov rsi, [rbp-16]
                                                          +; 37:       488B5DF8         mov rbx, [rbp-8]
                                                          +; 3B:       480F4CDE         cmovl rbx, rsi
                                                          +; 3F:       488BD3           mov rdx, rbx
                                                          +; 42:       488BE5           mov rsp, rbp
                                                          +; 45:       F8               clc
                                                          +; 46:       5D               pop rbp
                                                          +; 47:       C3               ret
                                                          +
                                                          + +

                                                          The size of generated assembly code shrunk to about 1/3 of the size. What +about speed?

                                                          + +
                                                          * (time (dotimes (i 10000) (max-original 100 200)))
                                                          +Evaluation took:
                                                          +  0.000 seconds of real time
                                                          +  0.000107 seconds of total run time (0.000088 user, 0.000019 system)
                                                          +  100.00% CPU
                                                          +  361,088 processor cycles
                                                          +  0 bytes consed
                                                          +
                                                          +* (time (dotimes (i 10000) (max-with-type 100 200)))
                                                          +Evaluation took:
                                                          +  0.000 seconds of real time
                                                          +  0.000044 seconds of total run time (0.000036 user, 0.000008 system)
                                                          +  100.00% CPU
                                                          +  146,960 processor cycles
                                                          +  0 bytes consed
                                                          +
                                                          + +

                                                          You see, by specifying type hints, our code runs much faster!

                                                          + +

                                                          But wait…What happens if we declare wrong types? The answer is: it depends.

                                                          + +

                                                          For example, SBCL treats type declarations in a special way. It +performs different levels of type checking according to the safety level. If +safety level is set to 0, no type checking will be performed. Thus a wrong +type specifier might cause a lot of damage.

                                                          + +

                                                          More on Type Declaration with declaim

                                                          + +

                                                          If you try to evaluate a declare form in the top level, you might get the +following error:

                                                          + +
                                                          Execution of a form compiled with errors.
                                                          +Form:
                                                          +  (DECLARE (SPEED 3))
                                                          +Compile-time error:
                                                          +  There is no function named DECLARE.  References to DECLARE in some contexts
                                                          +(like starts of blocks) are unevaluated expressions, but here the expression is
                                                          +being evaluated, which invokes undefined behaviour.
                                                          +   [Condition of type SB-INT:COMPILED-PROGRAM-ERROR]
                                                          +
                                                          + +

                                                          This is because type declarations have scopes. In the +examples above, we have seen type declarations applied to a function.

                                                          + +

                                                          During development it is usually useful to raise the importance of safety in +order to find out potential problems as soon as possible. On the contrary, +speed might be more important after deployment. However, it might be too +verbose to specify declaration expression for each single function.

                                                          + +

                                                          The macro declaim provides such possibility. It can be used as a +top level form in a file and the declarations will be made at compile-time.

                                                          + +
                                                          * (declaim (optimize (speed 0) (safety 3)))
                                                          +NIL
                                                          +
                                                          +* (defun max-original (a b)
                                                          +    (max a b))
                                                          +MAX-ORIGINAL
                                                          +
                                                          +* (disassemble 'max-original)
                                                          +; disassembly for MAX-ORIGINAL
                                                          +; Size: 181 bytes. Origin: #x52D47D9C
                                                          +...
                                                          +
                                                          +* (declaim (optimize (speed 3) (safety 3)))
                                                          +NIL
                                                          +
                                                          +* (defun max-original (a b)
                                                          +    (max a b))
                                                          +MAX-ORIGINAL
                                                          +
                                                          +* (disassemble 'max-original)
                                                          +; disassembly for MAX-ORIGINAL
                                                          +; Size: 142 bytes. Origin: #x52D4815D
                                                          +
                                                          + +

                                                          Please note that declaim works in compile-time of a file. It is mostly +used to make some declares local to that file. And it is unspecified whether +or not the compile-time side-effects of a declaim persist after the file has +been compiled.

                                                          + +

                                                          Declaring function types

                                                          +

                                                          Another useful declaration is a ftype declaration which establishes +the relationship between the function argument types and the return value type. +If the type of passed arguments matches the declared types, the return value type +is expected to match the declared one. Because of that, a function can have more +than one ftype declaration associated with it. A ftype declaration restricts +the type of the argument every time the function is called. It has the following form:

                                                          + +
                                                           (declare (ftype (function (arg1 arg2 ...) return-value) function-name1))
                                                          +
                                                          + +

                                                          If the function returns nil, its return type is null. +This declaration does not put any restriction on the types of arguments by itself. +It only takes effect if the provided arguments have the specified types – otherwise +no error is signaled and declaration has no effect. For example, +the following declamation states that if the argument to the function square +is a fixnum, the value of the function will also be a fixnum:

                                                          + +
                                                          (declaim (ftype (function (fixnum) fixnum) square))
                                                          +(defun square (x) (* x x))
                                                          +
                                                          +

                                                          If we provide it with the argument which is not declared to be of type fixnum, +no optimization will take place:

                                                          + +
                                                          (defun do-some-arithmetic (x)
                                                          +  (the fixnum (+ x (square x))))
                                                          +
                                                          + +

                                                          Now let’s try to optimize the speed. The compiler will state that there is type uncertainty:

                                                          + +
                                                          (defun do-some-arithmetic (x)
                                                          +  (declare (optimize (speed 3) (debug 0) (safety 0)))
                                                          +  (the fixnum (+ x (square x))))
                                                          +
                                                          +; compiling (DEFUN DO-SOME-ARITHMETIC ...)
                                                          +
                                                          +; file: /tmp/slimeRzDh1R
                                                          + in: DEFUN DO-SOME-ARITHMETIC
                                                          +;     (+ TEST-FRAMEWORK::X (TEST-FRAMEWORK::SQUARE TEST-FRAMEWORK::X))
                                                          +;
                                                          +; note: forced to do GENERIC-+ (cost 10)
                                                          +;       unable to do inline fixnum arithmetic (cost 2) because:
                                                          +;       The first argument is a NUMBER, not a FIXNUM.
                                                          +;       unable to do inline (signed-byte 64) arithmetic (cost 5) because:
                                                          +;       The first argument is a NUMBER, not a (SIGNED-BYTE 64).
                                                          +;       etc.
                                                          +;
                                                          +; compilation unit finished
                                                          +;   printed 1 note
                                                          +
                                                          +
                                                          +      (disassemble 'do-some-arithmetic)
                                                          +; disassembly for DO-SOME-ARITHMETIC
                                                          +; Size: 53 bytes. Origin: #x52CD1D1A
                                                          +; 1A:       488945F8         MOV [RBP-8], RAX                 ; no-arg-parsing entry point
                                                          +; 1E:       488BD0           MOV RDX, RAX
                                                          +; 21:       4883EC10         SUB RSP, 16
                                                          +; 25:       B902000000       MOV ECX, 2
                                                          +; 2A:       48892C24         MOV [RSP], RBP
                                                          +; 2E:       488BEC           MOV RBP, RSP
                                                          +; 31:       E8C2737CFD       CALL #x504990F8                  ; #<FDEFN SQUARE>
                                                          +; 36:       480F42E3         CMOVB RSP, RBX
                                                          +; 3A:       488B45F8         MOV RAX, [RBP-8]
                                                          +; 3E:       488BFA           MOV RDI, RDX
                                                          +; 41:       488BD0           MOV RDX, RAX
                                                          +; 44:       E807EE42FF       CALL #x52100B50                  ; GENERIC-+
                                                          +; 49:       488BE5           MOV RSP, RBP
                                                          +; 4C:       F8               CLC
                                                          +; 4D:       5D               POP RBP
                                                          +; 4E:       C3               RET
                                                          +NIL
                                                          +
                                                          + +

                                                          Now we can add a type declaration for x, so the compiler can assume +that the expression (square x) is a fixnum, and use the fixnum-specific +:

                                                          + +
                                                          (defun do-some-arithmetic (x)
                                                          +  (declare (optimize (speed 3) (debug 0) (safety 0)))
                                                          +  (declare (type fixnum x))
                                                          +  (the fixnum (+ x (square x))))
                                                          +
                                                          +       (disassemble 'do-some-arithmetic)
                                                          +
                                                          +; disassembly for DO-SOME-ARITHMETIC
                                                          +; Size: 48 bytes. Origin: #x52C084DA
                                                          +; 4DA:       488945F8         MOV [RBP-8], RAX                ; no-arg-parsing entry point
                                                          +; 4DE:       4883EC10         SUB RSP, 16
                                                          +; 4E2:       488BD0           MOV RDX, RAX
                                                          +; 4E5:       B902000000       MOV ECX, 2
                                                          +; 4EA:       48892C24         MOV [RSP], RBP
                                                          +; 4EE:       488BEC           MOV RBP, RSP
                                                          +; 4F1:       E8020C89FD       CALL #x504990F8                 ; #<FDEFN SQUARE>
                                                          +; 4F6:       480F42E3         CMOVB RSP, RBX
                                                          +; 4FA:       488B45F8         MOV RAX, [RBP-8]
                                                          +; 4FE:       4801D0           ADD RAX, RDX
                                                          +; 501:       488BD0           MOV RDX, RAX
                                                          +; 504:       488BE5           MOV RSP, RBP
                                                          +; 507:       F8               CLC
                                                          +; 508:       5D               POP RBP
                                                          +; 509:       C3               RET
                                                          +NIL
                                                          +
                                                          + +

                                                          Code Inline

                                                          + +

                                                          The declaration inline replaces function calls with function body, +if the compiler supports it. It will save the cost of function calls but will +potentially increase the code size. The best situation to use inline might +be those small but frequently used functions. The following snippet shows how +to encourage and prohibit code inline.

                                                          + +
                                                          ;; The globally defined function DISPATCH should be open-coded,
                                                          +;; if the implementation supports inlining, unless a NOTINLINE
                                                          +;; declaration overrides this effect.
                                                          +(declaim (inline dispatch))
                                                          +(defun dispatch (x) (funcall (get (car x) 'dispatch) x))
                                                          +
                                                          +;; Here is an example where inlining would be encouraged.
                                                          +;; Because function DISPATCH was defined as INLINE, the code
                                                          +;; inlining will be encouraged by default.
                                                          +(defun use-dispatch-inline-by-default ()
                                                          +  (dispatch (read-command)))
                                                          +
                                                          +;; Here is an example where inlining would be prohibited.
                                                          +;; The NOTINLINE here only affects this function.
                                                          +(defun use-dispatch-with-declare-notinline  ()
                                                          +  (declare (notinline dispatch))
                                                          +  (dispatch (read-command)))
                                                          +
                                                          +;; Here is an example where inlining would be prohibited.
                                                          +;; The NOTINLINE here affects all following code.
                                                          +(declaim (notinline dispatch))
                                                          +(defun use-dispatch-with-declaim-noinline ()
                                                          +  (dispatch (read-command)))
                                                          +
                                                          +;; Inlining would be encouraged because you specified it.
                                                          +;; The INLINE here only affects this function.
                                                          +(defun use-dispatch-with-inline ()
                                                          +  (declare (inline dispatch))
                                                          +  (dispatch (read-command)))
                                                          +
                                                          + +

                                                          Please note that when the inlined functions change, all the callers must be +re-compiled.

                                                          + +

                                                          Optimizing Generic Functions

                                                          + +

                                                          Using Static Dispatch

                                                          + +

                                                          Generic functions provide much convenience and flexibility during +development. However, the flexibility comes with cost: generic methods are +much slower than trivial functions. The performance cost becomes a burden +especially when the flexibility is not needed.

                                                          + +

                                                          The package inlined-generic-function provides +functions to convert generic functions to static dispatch, moving the dispatch +cost to compile-time. You just need to define generic function as a +inlined-generic-function.

                                                          + +

                                                          Caution

                                                          + +

                                                          This package is declared as experimental thus is not recommended to be used in +a serious software production. Use it at your own risk!

                                                          + +
                                                          * (defgeneric plus (a b)
                                                          +    (:generic-function-class inlined-generic-function))
                                                          +#<INLINED-GENERIC-FUNCTION HELLO::PLUS (2)>
                                                          +
                                                          +* (defmethod plus ((a fixnum) (b fixnum))
                                                          +    (+ a b))
                                                          +#<INLINED-METHOD HELLO::PLUS (FIXNUM FIXNUM) {10056D7513}>
                                                          +
                                                          +* (defun func-using-plus (a b)
                                                          +    (plus a b))
                                                          +FUNC-USING-PLUS
                                                          +
                                                          +* (defun func-using-plus-inline (a b)
                                                          +    (declare (inline plus))
                                                          +    (plus a b))
                                                          +FUNC-USING-PLUS-INLINE
                                                          +
                                                          +* (time
                                                          +   (dotimes (i 100000)
                                                          +     (func-using-plus 100 200)))
                                                          +Evaluation took:
                                                          +  0.018 seconds of real time
                                                          +  0.017819 seconds of total run time (0.017800 user, 0.000019 system)
                                                          +  100.00% CPU
                                                          +  3 lambdas converted
                                                          +  71,132,440 processor cycles
                                                          +  6,586,240 bytes consed
                                                          +
                                                          +* (time
                                                          +   (dotimes (i 100000)
                                                          +     (func-using-plus-inline 100 200)))
                                                          +Evaluation took:
                                                          +  0.001 seconds of real time
                                                          +  0.000326 seconds of total run time (0.000326 user, 0.000000 system)
                                                          +  0.00% CPU
                                                          +  1,301,040 processor cycles
                                                          +  0 bytes consed
                                                          +
                                                          + +

                                                          The inlining is not enabled by default because once inlined, changes made to +methods will not be reflected.

                                                          + +

                                                          It can be enabled globally by adding :inline-generic-function flag in +*features*.

                                                          + +
                                                          * (push :inline-generic-function *features*)
                                                          +(:INLINE-GENERIC-FUNCTION :SLYNK :CLOSER-MOP :CL-FAD :BORDEAUX-THREADS
                                                          +:THREAD-SUPPORT :CL-PPCRE ALEXANDRIA.0.DEV::SEQUENCE-EMPTYP :QUICKLISP
                                                          +:QUICKLISP-SUPPORT-HTTPS :SB-BSD-SOCKETS-ADDRINFO :ASDF3.3 :ASDF3.2 :ASDF3.1
                                                          +:ASDF3 :ASDF2 :ASDF :OS-UNIX :NON-BASE-CHARS-EXIST-P :ASDF-UNICODE :ROS.INIT
                                                          +:X86-64 :64-BIT :64-BIT-REGISTERS :ALIEN-CALLBACKS :ANSI-CL :AVX2
                                                          +:C-STACK-IS-CONTROL-STACK :CALL-SYMBOL :COMMON-LISP :COMPACT-INSTANCE-HEADER
                                                          +:COMPARE-AND-SWAP-VOPS :CYCLE-COUNTER :ELF :FP-AND-PC-STANDARD-SAVE ..)
                                                          +
                                                          + +

                                                          When this feature is present, all inlinable generic functions are inlined +unless it is declared notinline.

                                                          + +

                                                          Block compilation

                                                          + +

                                                          SBCL got block compilation on version 2.0.2, which was in CMUCL since 1991 but a little forgotten since.

                                                          + +

                                                          You can enable block compilation with a one-liner:

                                                          + +
                                                          (setq *block-compile-default* t)
                                                          +
                                                          + +

                                                          But what is it?

                                                          + +

                                                          Block compilation addresses a known aspect of dynamic languages: function calls to global, top-level functions are expensive.

                                                          + +
                                                          +

                                                          Much more expensive than in a statically compiled language. They’re slow because of the late-bound nature of top-level defined functions, allowing arbitrary redefinition while the program is running and forcing runtime checks on whether the function is being called with the right number or types of arguments. This type of call is known as a “full call†in Python (the compiler used in CMUCL and SBCL, not to be confused with the programming language), and their calling convention permits the most runtime flexibility.

                                                          +
                                                          + +

                                                          But local calls, the ones inside a top-level functions (for example lambdas, labels and flets) are fast.

                                                          + +
                                                          +

                                                          These calls are more ‘static’ in the sense that they are treated more like function calls in static languages, being compiled “together†and at the same time as the local functions they reference, allowing them to be optimized at compile-time. For example, argument checking can be done at compile time because the number of arguments of the callee is known at compile time, unlike in the full call case where the function, and hence the number of arguments it takes, can change dynamically at runtime at any point. Additionally, the local call calling convention can allow for passing unboxed values like floats around, as they are put into unboxed registers never used in the full call convention, which must use boxed argument and return value registers.

                                                          +
                                                          + +

                                                          So enabling block compilation kind of turns your code into a giant labels form.

                                                          + +

                                                          One evident possible drawback, dependending on your application, is that you can’t redefine functions at runtime anymore.

                                                          + +

                                                          We can also enable block compilation with the :block-compile keyword to compile-file:

                                                          + +
                                                          (defun foo (x y)
                                                          +  (print (bar x y))
                                                          +  (bar x y))
                                                          +
                                                          +(defun bar (x y)
                                                          +  (+ x y))
                                                          +
                                                          +(defun fact (n)
                                                          +  (if (zerop n)
                                                          +      1
                                                          +      (* n (fact (1- n)))))
                                                          +
                                                          +> (compile-file "foo.lisp" :block-compile t :entry-points nil)
                                                          +> (load "foo.fasl")
                                                          +
                                                          +> (sb-disassem:disassemble-code-component #'foo)
                                                          +
                                                          + +

                                                          If you inspect the assembly,

                                                          + +
                                                          +

                                                          you [will] see that FOO and BAR are now compiled into the same component (with local calls), and both have valid external entry points. This improves locality of code quite a bit and still allows calling both FOO and BAR externally from the file (e.g. in the REPL). […]

                                                          +
                                                          + +

                                                          But there is one more goody block compilation adds…

                                                          + +
                                                          +

                                                          Notice we specified :entry-points nil above. That’s telling the compiler to still create external entry points to every function in the file, since we’d like to be able to call them normally from outside the code component (i.e. the compiled compilation unit, here the entire file).

                                                          +
                                                          + +

                                                          For more explanations, I refer you to the mentioned blog post, the current de-facto documentation for SBCL, in addition to CMUCL’s documentation (note that the form-by-form level granularity in CMUCL ( (declaim (start-block ...)) ... (declaim (end-block ..))) is missing in SBCL, at the time of writing).

                                                          + +

                                                          Finally, be aware that “block compiling and inlining currently does not interact very well [in SBCL]â€.

                                                          + + + +

                                                          + Page source: performance.md +

                                                          +
                                                          + + + + + +
                                                          +
                                                          +
                                                          + © 2002–2021 the Common Lisp Cookbook Project +
                                                          + +
                                                          +
                                                          T
                                                          O
                                                          C
                                                          +
                                                          + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/process.html b/clones/lispcookbook.github.io/cl-cookbook/process.html new file mode 100644 index 00000000..377e4272 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/process.html @@ -0,0 +1,2348 @@ + + + + + Threads + + + + + + + + + + + + + + +

                                                          The Common Lisp Cookbook – Threads

                                                          +
                                                          + + + + +
                                                          +
                                                          + +
                                                          +
                                                          + +
                                                          +
                                                          Table of Contents
                                                          +
                                                            +
                                                            +
                                                            + +
                                                            +

                                                            The Common Lisp Cookbook – Threads

                                                            + + +

                                                            + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                            +

                                                            + 📕 Get the EPUB and PDF +

                                                            + + +

                                                            + +

                                                            Introduction

                                                            + +

                                                            By threads, we mean separate execution strands within a single Lisp +process, sharing the same address space. Typically, execution is +automatically switched between these strands by the system (either by +the lisp kernel or by the operating system) so that tasks appear to be +completed in parallel (asynchronously). This page discusses the +creation and management of threads and some aspects of interactions +between them. For information about the interaction between lisp and +other processes, see Interfacing with your OS.

                                                            + +

                                                            An instant pitfall for the unwary is that most implementations refer +(in nomenclature) to threads as processes - this is a historical +feature of a language which has been around for much longer than the +term thread. Call this maturity a sign of stable implementations, if +you will.

                                                            + +

                                                            The ANSI Common Lisp standard doesn’t mention this topic. We will +present here the portable +bordeaux-threads +library, an example implementation via SBCL threads from the SBCL Manual, and the lparallel +library.

                                                            + +

                                                            Bordeaux-threads is a de-facto standard portable library, that exposes +rather low-level primitives. Lparallel builds on it and features:

                                                            + +
                                                              +
                                                            • a simple model of task submission with receiving queue
                                                            • +
                                                            • constructs for expressing fine-grained parallelism
                                                            • +
                                                            • asynchronous condition handling across thread boundaries
                                                            • +
                                                            • parallel versions of map, reduce, sort, remove, and many others
                                                            • +
                                                            • promises, futures, and delayed evaluation constructs
                                                            • +
                                                            • computation trees for parallelizing interconnected tasks
                                                            • +
                                                            • bounded and unbounded FIFO queues
                                                            • +
                                                            • channels
                                                            • +
                                                            • high and low priority tasks
                                                            • +
                                                            • task killing by category
                                                            • +
                                                            • integrated timeouts
                                                            • +
                                                            + +

                                                            For more libraries on parallelism and concurrency, see the Awesome CL list +and Quickdocs such as quickdocks on thread and concurrency.

                                                            + +

                                                            + +

                                                            Why bother?

                                                            + +

                                                            The first question to resolve is: why bother with threads? Sometimes +your answer will simply be that your application is so straightforward +that you need not concern yourself with threads at all. But in many +other cases it’s difficult to imagine how a sophisticated application +can be written without multi-threading. For example:

                                                            + +
                                                              +
                                                            • you might be writing a server which needs to be able to respond to +more than one user / connection at a time (for instance: a web +server) on the Sockets page);
                                                            • +
                                                            • you might want to perform some background activity, without +halting the main application while this is going on;
                                                            • +
                                                            • you might want your application to be notified when a certain time +has elapsed;
                                                            • +
                                                            • you might want to keep the application running and active while +waiting for some system resource to become available;
                                                            • +
                                                            • you might need to interface with some other system which requires +multithreading (for example, “windows†under Windows which +generally run in their own threads);
                                                            • +
                                                            • you might want to associate different contexts (e.g. different +dynamic bindings) with different parts of the application;
                                                            • +
                                                            • you might even have the simple need to do two things at once.
                                                            • +
                                                            + +

                                                            + +

                                                            What is Concurrency? What is Parallelism?

                                                            + +

                                                            Credit: The following was first written on +z0ltan.wordpress.com +by Timmy Jose.

                                                            + +

                                                            Concurrency is a way of running different, possibly related, tasks +seemingly simultaneously. What this means is that even on a single +processor machine, you can simulate simultaneity using threads (for +instance) and context-switching them.

                                                            + +

                                                            In the case of system (native OS) threads, the scheduling and context +switching is ultimately determined by the OS. This is the case with +Java threads and Common Lisp threads.

                                                            + +

                                                            In the case of “green†threads, that is to say threads that are +completely managed by the program, the scheduling can be completely +controlled by the program itself. Erlang is a great example of this +approach.

                                                            + +

                                                            So what is the difference between Concurrency and Parallelism? +Parallelism is usually defined in a very strict sense to mean +independent tasks being run in parallel, simultaneously, on different +processors or on different cores. In this narrow sense, you really +cannot have parallelism on a single-core, single-processor machine.

                                                            + +

                                                            It rather helps to differentiate between these two related concepts on +a more abstract level – concurrency primarily deals with providing the +illusion of simultaneity to clients so that the system doesn’t appear +locked when a long running operation is underway. GUI systems are a +wonderful example of this kind of system. Concurrency is therefore +concerned with providing good user experience and not necessarily +concerned with performance benefits.

                                                            + +

                                                            Java’s Swing toolkit and JavaScript are both single-threaded, and yet +they can give the appearance of simultaneity because of the context +switching behind the scenes. Of course, concurrency is implemented +using multiple threads/processes in most cases.

                                                            + +

                                                            Parallelism, on the other hand, is mostly concerned with pure +performance gains. For instance, if we are given a task to find the +squares of all the even numbers in a given range, we could divide the +range into chunks which are then run in parallel on different cores or +different processors, and then the results can be collated together to +form the final result. This is an example of Map-Reduce in action.

                                                            + +

                                                            So now that we have separated the abstract meaning of Concurrency from +that of Parallelism, we can talk a bit about the actual mechanism used +to implement them. This is where most of the confusion arise for a lot +of people. They tend to tie down abstract concepts with specific means +of implementing them. In essence, both abstract concepts may be +implemented using the same mechanisms! For instance, we may implement +concurrent features and parallel features using the same basic thread +mechanism in Java. It’s only the conceptual intertwining or +independence of tasks at an abstract level that makes the difference +for us.

                                                            + +

                                                            For instance, if we have a task where part of the work can be done on +a different thread (possibly on a different core/processor), but the +thread which spawns this thread is logically dependent on the results +of the spawned thread (and as such has to “join†on that thread), it +is still Concurrency!

                                                            + +

                                                            So the bottomline is this – Concurrency and Parallelism are different +concepts, but their implementations may be done using the same +mechanisms — threads, processes, etc.

                                                            + +

                                                            Bordeaux threads

                                                            + +

                                                            The Bordeaux library provides a platform independent way to handle +basic threading on multiple Common Lisp implementations. The +interesting bit is that it itself does not really create any native +threads — it relies entirely on the underlying implementation to do +so.

                                                            + +

                                                            On the other hand, it does provide some useful extra features in its +own abstractions over the lower-level threads.

                                                            + +

                                                            Also, you can see from the demo programs that a lot of the Bordeaux +functions seem quite similar to those used in SBCL. I don’t really +think that this is a coincidence.

                                                            + +

                                                            You can refer to the documentation for more details (check the +“Wrap-up†section).

                                                            + +

                                                            Installing Bordeaux Threads

                                                            + +

                                                            First let’s load up the Bordeaux library using Quicklisp:

                                                            + +
                                                            CL-USER> (ql:quickload "bt-semaphore")
                                                            +To load "bt-semaphore":
                                                            +  Load 1 ASDF system:
                                                            +    bt-semaphore
                                                            +; Loading "bt-semaphore"
                                                            +
                                                            +(:BT-SEMAPHORE)
                                                            +
                                                            + +

                                                            Checking for thread support in Common Lisp

                                                            + +

                                                            Regardless of the Common Lisp implementation, there is a standard way +to check for thread support availability:

                                                            + +
                                                            CL-USER> (member :thread-support *FEATURES*)
                                                            +(:THREAD-SUPPORT :SWANK :QUICKLISP :ASDF-PACKAGE-SYSTEM :ASDF3.1 :ASDF3 :ASDF2
                                                            + :ASDF :OS-MACOSX :OS-UNIX :NON-BASE-CHARS-EXIST-P :ASDF-UNICODE :64-BIT
                                                            + :64-BIT-REGISTERS :ALIEN-CALLBACKS :ANSI-CL :ASH-RIGHT-VOPS :BSD
                                                            + :C-STACK-IS-CONTROL-STACK :COMMON-LISP :COMPARE-AND-SWAP-VOPS
                                                            + :COMPLEX-FLOAT-VOPS :CYCLE-COUNTER :DARWIN :DARWIN9-OR-BETTER :FLOAT-EQL-VOPS
                                                            + :FP-AND-PC-STANDARD-SAVE :GENCGC :IEEE-FLOATING-POINT :INLINE-CONSTANTS
                                                            + :INODE64 :INTEGER-EQL-VOP :LINKAGE-TABLE :LITTLE-ENDIAN
                                                            + :MACH-EXCEPTION-HANDLER :MACH-O :MEMORY-BARRIER-VOPS :MULTIPLY-HIGH-VOPS
                                                            + :OS-PROVIDES-BLKSIZE-T :OS-PROVIDES-DLADDR :OS-PROVIDES-DLOPEN
                                                            + :OS-PROVIDES-PUTWC :OS-PROVIDES-SUSECONDS-T :PACKAGE-LOCAL-NICKNAMES
                                                            + :PRECISE-ARG-COUNT-ERROR :RAW-INSTANCE-INIT-VOPS :SB-DOC :SB-EVAL :SB-LDB
                                                            + :SB-PACKAGE-LOCKS :SB-SIMD-PACK :SB-SOURCE-LOCATIONS :SB-TEST :SB-THREAD
                                                            + :SB-UNICODE :SBCL :STACK-ALLOCATABLE-CLOSURES :STACK-ALLOCATABLE-FIXED-OBJECTS
                                                            + :STACK-ALLOCATABLE-LISTS :STACK-ALLOCATABLE-VECTORS
                                                            + :STACK-GROWS-DOWNWARD-NOT-UPWARD :SYMBOL-INFO-VOPS :UD2-BREAKPOINTS :UNIX
                                                            + :UNWIND-TO-FRAME-AND-CALL-VOP :X86-64)
                                                            +
                                                            + +

                                                            If there were no thread support, it would show “NIL†as the value of the expression.

                                                            + +

                                                            Depending on the specific library being used, we may also have +different ways of checking for concurrency support, which may be used +instead of the common check mentioned above.

                                                            + +

                                                            For instance, in our case, we are interested in using the Bordeaux +library. To check whether there is support for threads using this +library, we can see whether the *supports-threads-p* global variable +is set to NIL (no support) or T (support available):

                                                            + +
                                                            CL-USER> bt:*supports-threads-p*
                                                            +T
                                                            +
                                                            + +

                                                            Okay, now that we’ve got that out of the way, let’s test out both the +platform-independent library (Bordeaux) as well as the +platform-specific support (SBCL in this case).

                                                            + +

                                                            To do this, let us work our way through a number of simple examples:

                                                            + +
                                                              +
                                                            • Basics — list current thread, list all threads, get thread name
                                                            • +
                                                            • Update a global variable from a thread
                                                            • +
                                                            • Print a message onto the top-level using a thread
                                                            • +
                                                            • Print a message onto the top-level — fixed
                                                            • +
                                                            • Print a message onto the top-level — better
                                                            • +
                                                            • Modify a shared resource from multiple threads
                                                            • +
                                                            • Modify a shared resource from multiple threads — fixed using locks
                                                            • +
                                                            • Modify a shared resource from multiple threads — using atomic operations
                                                            • +
                                                            • Joining on a thread, destroying a thread example
                                                            • +
                                                            + +

                                                            Basics — list current thread, list all threads, get thread name

                                                            + +
                                                                ;;; Print the current thread, all the threads, and the current thread's name
                                                            +    (defun print-thread-info ()
                                                            +      (let* ((curr-thread (bt:current-thread))
                                                            +             (curr-thread-name (bt:thread-name curr-thread))
                                                            +             (all-threads (bt:all-threads)))
                                                            +        (format t "Current thread: ~a~%~%" curr-thread)
                                                            +        (format t "Current thread name: ~a~%~%" curr-thread-name)
                                                            +        (format t "All threads:~% ~{~a~%~}~%" all-threads))
                                                            +      nil)
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (print-thread-info)
                                                            +    Current thread: #<THREAD "repl-thread" RUNNING {10043B8003}>
                                                            +
                                                            +    Current thread name: repl-thread
                                                            +
                                                            +    All threads:
                                                            +     #<THREAD "repl-thread" RUNNING {10043B8003}>
                                                            +    #<THREAD "auto-flush-thread" RUNNING {10043B7DA3}>
                                                            +    #<THREAD "swank-indentation-cache-thread" waiting on: #<WAITQUEUE  {1003A28103}> {1003A201A3}>
                                                            +    #<THREAD "reader-thread" RUNNING {1003A20063}>
                                                            +    #<THREAD "control-thread" waiting on: #<WAITQUEUE  {1003A19E53}> {1003A18C83}>
                                                            +    #<THREAD "Swank Sentinel" waiting on: #<WAITQUEUE  {1003790043}> {1003788023}>
                                                            +    #<THREAD "main thread" RUNNING {1002991CE3}>
                                                            +
                                                            +    NIL
                                                            +
                                                            + +

                                                            Update a global variable from a thread:

                                                            + +
                                                                (defparameter *counter* 0)
                                                            +
                                                            +    (defun test-update-global-variable ()
                                                            +      (bt:make-thread
                                                            +       (lambda ()
                                                            +         (sleep 1)
                                                            +         (incf *counter*)))
                                                            +      *counter*)
                                                            +
                                                            + +

                                                            We create a new thread using bt:make-thread, which takes a lambda +abstraction as a parameter. Note that this lambda abstraction cannot +take any parameters.

                                                            + +

                                                            Another point to note is that unlike some other languages (Java, for +instance), there is no separation from creating the thread object and +starting/running it. In this case, as soon as the thread is created, +it is executed.

                                                            + +

                                                            The output:

                                                            + +
                                                                CL-USER> (test-update-global-variable)
                                                            +
                                                            +    0
                                                            +    CL-USER> *counter*
                                                            +    1
                                                            +
                                                            + +

                                                            As we can see, because the main thread returned immediately, the +initial value of *counter* is 0, and then around a second later, it +gets updated to 1 by the anonymous thread.

                                                            + +

                                                            Create a thread: print a message onto the top-level

                                                            + +
                                                                ;;; Print a message onto the top-level using a thread
                                                            +    (defun print-message-top-level-wrong ()
                                                            +      (bt:make-thread
                                                            +       (lambda ()
                                                            +         (format *standard-output* "Hello from thread!"))
                                                            +       :name "hello")
                                                            +      nil)
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (print-message-top-level-wrong)
                                                            +    NIL
                                                            +
                                                            + +

                                                            So what went wrong? The problem is variable binding. Now, the ’t’ +parameter to the format function refers to the top-level, which is a +Common Lisp term for the main console stream, also referred to by the +global variable *standard-output*. So we could have expected the +output to be shown on the main console screen.

                                                            + +

                                                            The same code would have run fine if we had not run it in a separate + thread. What happens is that each thread has its own stack where + the variables are rebound. In this case, even for + *standard-output*, which being a global variable, we would assume + should be available to all threads, is rebound inside each thread! + This is similar to the concept of ThreadLocal storage in Java.

                                                            + + + +

                                                            So how do we fix the problem of the previous example? By binding the top-level at the time of thread creation of course. Pure lexical scoping to the rescue!

                                                            + +
                                                                ;;; Print a message onto the top-level using a thread — fixed
                                                            +    (defun print-message-top-level-fixed ()
                                                            +      (let ((top-level *standard-output*))
                                                            +        (bt:make-thread
                                                            +         (lambda ()
                                                            +           (format top-level "Hello from thread!"))
                                                            +         :name "hello")))
                                                            +      nil)
                                                            +
                                                            + +

                                                            Which produces:

                                                            + +
                                                                CL-USER> (print-message-top-level-fixed)
                                                            +    Hello from thread!
                                                            +    NIL
                                                            +
                                                            + +

                                                            Phew! However, there is another way of producing the same result using +a very interesting reader macro as we’ll see next.

                                                            + + + +

                                                            Let’s take a look at the code first:

                                                            + +
                                                                ;;; Print a message onto the top-level using a thread - reader macro
                                                            +
                                                            +    (eval-when (:compile-toplevel)
                                                            +      (defun print-message-top-level-reader-macro ()
                                                            +        (bt:make-thread
                                                            +         (lambda ()
                                                            +           (format #.*standard-output* "Hello from thread!")))
                                                            +        nil))
                                                            +
                                                            +    (print-message-top-level-reader-macro)
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (print-message-top-level-reader-macro)
                                                            +    Hello from thread!
                                                            +    NIL
                                                            +
                                                            + +

                                                            So it works, but what’s the deal with the eval-when and what is that +strange #. symbol before *standard-output*?

                                                            + +

                                                            eval-when controls when evaluation of Lisp expressions takes place. We +can have three targets — :compile-toplevel, :load-toplevel, and +:execute.

                                                            + +

                                                            The #. symbol is what is called a “Reader macroâ€. A reader (or read) +macro is called so because it has special meaning to the Common Lisp +Reader, which is the component that is responsible for reading in +Common Lisp expressions and making sense out of them. This specific +reader macro ensures that the binding of *standard-output* is done +at read time.

                                                            + +

                                                            Binding the value at read-time ensures that the original value of +*standard-output* is maintained when the thread is run, and the output +is shown on the correct top-level.

                                                            + +

                                                            Now this is where the eval-when bit comes into play. By wrapping the +whole function definition inside the eval-when, and ensuring that +evaluation takes place during compile time, the correct value of +*standard-output* is bound. If we had skipped the eval-when, we would +see the following error:

                                                            + +
                                                                  error:
                                                            +        don't know how to dump #<SWANK/GRAY::SLIME-OUTPUT-STREAM {100439EEA3}> (default MAKE-LOAD-FORM method called).
                                                            +        ==>
                                                            +          #<SWANK/GRAY::SLIME-OUTPUT-STREAM {100439EEA3}>
                                                            +
                                                            +      note: The first argument never returns a value.
                                                            +      note:
                                                            +        deleting unreachable code
                                                            +        ==>
                                                            +          "Hello from thread!"
                                                            +
                                                            +
                                                            +    Compilation failed.
                                                            +
                                                            + +

                                                            And that makes sense because SBCL cannot make sense of what this +output stream returns since it is a stream and not really a defined +value (which is what the ‘format’ function expects). That is why we +see the “unreachable code†error.

                                                            + +

                                                            Note that if the same code had been run on the REPL directly, there +would be no problem since the resolution of all the symbols would be +done correctly by the REPL thread.

                                                            + +

                                                            Modify a shared resource from multiple threads

                                                            + +

                                                            Suppose we have the following setup with a minimal bank-account class (no error checks):

                                                            + +
                                                                ;;; Modify a shared resource from multiple threads
                                                            +
                                                            +    (defclass bank-account ()
                                                            +      ((id :initarg :id
                                                            +           :initform (error "id required")
                                                            +           :accessor :id)
                                                            +       (name :initarg :name
                                                            +             :initform (error "name required")
                                                            +             :accessor :name)
                                                            +       (balance :initarg :balance
                                                            +                :initform 0
                                                            +                :accessor :balance)))
                                                            +
                                                            +    (defgeneric deposit (account amount)
                                                            +      (:documentation "Deposit money into the account"))
                                                            +
                                                            +    (defgeneric withdraw (account amount)
                                                            +      (:documentation "Withdraw amount from account"))
                                                            +
                                                            +    (defmethod deposit ((account bank-account) (amount real))
                                                            +      (incf (:balance account) amount))
                                                            +
                                                            +    (defmethod withdraw ((account bank-account) (amount real))
                                                            +      (decf (:balance account) amount))
                                                            +
                                                            + +

                                                            And we have a simple client which apparently does not believe in any form of synchronisation:

                                                            + +
                                                                (defparameter *rich*
                                                            +      (make-instance 'bank-account
                                                            +                     :id 1
                                                            +                     :name "Rich"
                                                            +                     :balance 0))
                                                            +    ; compiling (DEFPARAMETER *RICH* ...)
                                                            +
                                                            +    (defun demo-race-condition ()
                                                            +      (loop repeat 100
                                                            +         do
                                                            +           (bt:make-thread
                                                            +            (lambda ()
                                                            +              (loop repeat 10000 do (deposit *rich* 100))
                                                            +              (loop repeat 10000 do (withdraw *rich* 100))))))
                                                            +
                                                            + +

                                                            This is all we are doing – create a new bank account instance (balance +0), and then create a 100 threads, each of which simply deposits an +amount of 100 10000 times, and then withdraws the same amount the same +number of times. So the final result should be the same as that of the +opening balance, which is 0, right? Let’s check that and see.

                                                            + +

                                                            On a sample run, we might get the following results:

                                                            + +
                                                                CL-USER> (:balance *rich*)
                                                            +    0
                                                            +    CL-USER> (dotimes (i 5)
                                                            +               (demo-race-condition))
                                                            +    NIL
                                                            +    CL-USER> (:balance *rich*)
                                                            +    22844600
                                                            +
                                                            + +

                                                            Whoa! The reason for this discrepancy is that incf and decf are not +atomic operations — they consist of multiple sub-operations, and the +order in which they are executed is not in our control.

                                                            + +

                                                            This is what is called a “race condition†— multiple threads +contending for the same shared resource with at least one modifying +thread which, more likely than not, reads the wrong value of the +object while modifying it. How do we fix it? One simple way it to use +locks (mutex in this case, could be semaphores for more complex +situations).

                                                            + +

                                                            Modify a shared resource from multiple threads — fixed using locks

                                                            + +

                                                            Let’s rest the balance for the account back to 0 first:

                                                            + +
                                                                CL-USER> (setf (:balance *rich*) 0)
                                                            +    0
                                                            +    CL-USER> (:balance *rich*)
                                                            +    0
                                                            +
                                                            + +

                                                            Now let’s modify the demo-race-condition function to access the shared resource using locks (created using bt:make-lock and used as shown):

                                                            + +
                                                                (defvar *lock* (bt:make-lock))
                                                            +    ; compiling (DEFVAR *LOCK* …)
                                                            +
                                                            +    (defun demo-race-condition-locks ()
                                                            +      (loop repeat 100
                                                            +         do
                                                            +           (bt:make-thread
                                                            +            (lambda ()
                                                            +              (loop repeat 10000 do (bt:with-lock-held (*lock*)
                                                            +                                      (deposit *rich* 100)))
                                                            +              (loop repeat 10000 do (bt:with-lock-held (*lock*)
                                                            +                                      (withdraw *rich* 100)))))))
                                                            +    ; compiling (DEFUN DEMO-RACE-CONDITION-LOCKS ...)
                                                            +
                                                            + +

                                                            And let’s do a bigger sample run this time around:

                                                            + +
                                                                CL-USER> (dotimes (i 100)
                                                            +               (demo-race-condition-locks))
                                                            +    NIL
                                                            +    CL-USER> (:balance *rich*)
                                                            +    0
                                                            +
                                                            + +

                                                            Excellent! Now this is better. Of course, one has to remember that +using a mutex like this is bound to affect performance. There is a +better way in quite a few circumstances — using atomic operations when +possible. We’ll cover that next.

                                                            + +

                                                            Modify a shared resource from multiple threads — using atomic operations

                                                            + +

                                                            Atomic operations are operations that are guaranteed by the system to +all occur inside a conceptual transaction, i.e., all the +sub-operations of the main operation all take place together without +any interference from outside. The operation succeeds completely or +fails completely. There is no middle ground, and there is no +inconsistent state.

                                                            + +

                                                            Another advantage is that performance is far superior to using locks +to protect access to the shared state. We will see this difference in +the actual demo run.

                                                            + +

                                                            The Bordeaux library does not provide any real support for atomics, so +we will have to depend on the specific implementation support for +that. In our case, that is SBCL, and so we will have to defer this +demo to the SBCL section.

                                                            + +

                                                            Joining on a thread, destroying a thread

                                                            + +

                                                            To join on a thread, we use the bt:join-thread function, and for +destroying a thread (not a recommended operation), we can use the +bt:destroy-thread function.

                                                            + +

                                                            A simple demo:

                                                            + +
                                                                (defmacro until (condition &body body)
                                                            +      (let ((block-name (gensym)))
                                                            +        `(block ,block-name
                                                            +           (loop
                                                            +               (if ,condition
                                                            +                   (return-from ,block-name nil)
                                                            +                   (progn
                                                            +                       ,@body))))))
                                                            +
                                                            +    (defun join-destroy-thread ()
                                                            +      (let* ((s *standard-output*)
                                                            +            (joiner-thread (bt:make-thread
                                                            +                            (lambda ()
                                                            +                              (loop for i from 1 to 10
                                                            +                                 do
                                                            +                                   (format s "~%[Joiner Thread]  Working...")
                                                            +                                   (sleep (* 0.01 (random 100)))))))
                                                            +            (destroyer-thread (bt:make-thread
                                                            +                               (lambda ()
                                                            +                                 (loop for i from 1 to 1000000
                                                            +                                    do
                                                            +                                      (format s "~%[Destroyer Thread] Working...")
                                                            +                                      (sleep (* 0.01 (random 10000))))))))
                                                            +        (format t "~%[Main Thread] Waiting on joiner thread...")
                                                            +        (bt:join-thread joiner-thread)
                                                            +        (format t "~%[Main Thread] Done waiting on joiner thread")
                                                            +        (if (bt:thread-alive-p destroyer-thread)
                                                            +            (progn
                                                            +              (format t "~%[Main Thread] Destroyer thread alive... killing it")
                                                            +              (bt:destroy-thread destroyer-thread))
                                                            +            (format t "~%[Main Thread] Destroyer thread is already dead"))
                                                            +        (until (bt:thread-alive-p destroyer-thread)
                                                            +               (format t "[Main Thread] Waiting for destroyer thread to die..."))
                                                            +        (format t "~%[Main Thread] Destroyer thread dead")
                                                            +        (format t "~%[Main Thread] Adios!~%")))
                                                            +
                                                            + +

                                                            And the output on a run:

                                                            + +
                                                                CL-USER> (join-destroy-thread)
                                                            +
                                                            +    [Joiner Thread]  Working...
                                                            +    [Destroyer Thread] Working...
                                                            +    [Main Thread] Waiting on joiner thread...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Main Thread] Done waiting on joiner thread
                                                            +    [Main Thread] Destroyer thread alive... killing it
                                                            +    [Main Thread] Destroyer thread dead
                                                            +    [Main Thread] Adios!
                                                            +    NIL
                                                            +
                                                            + +

                                                            The until macro simply loops around until the condition becomes +true. The rest of the code is pretty much self-explanatory — the main +thread waits for the joiner-thread to finish, but it immediately +destroys the destroyer-thread.

                                                            + +

                                                            Again, it is not recommended to use bt:destroy-thread. Any conceivable +situation which requires this function can probably be done better +with another approach.

                                                            + +

                                                            Now let’s move onto some more comprehensive examples which tie +together all the concepts discussed thus far.

                                                            + +

                                                            Useful functions

                                                            + +

                                                            Here is a summary of the functions, macros and global variables which +were used in the demo examples along with some extras. These should +cover most of the basic programming scenarios:

                                                            + +
                                                              +
                                                            • bt:*supports-thread-p* (to check for basic thread support)
                                                            • +
                                                            • bt:make-thread (create a new thread)
                                                            • +
                                                            • bt:current-thread (return the current thread object)
                                                            • +
                                                            • bt:all-threads (return a list of all running threads)
                                                            • +
                                                            • bt:thread-alive-p (checks if the thread is still alive)
                                                            • +
                                                            • bt:thread-name (return the name of the thread)
                                                            • +
                                                            • bt:join-thread (join on the supplied thread)
                                                            • +
                                                            • bt:interrupt-thread (interrupt the given thread)
                                                            • +
                                                            • bt:destroy-thread (attempt to abort the thread)
                                                            • +
                                                            • bt:make-lock (create a mutex)
                                                            • +
                                                            • bt:with-lock-held (use the supplied lock to protect critical code)
                                                            • +
                                                            + +

                                                            SBCL threads

                                                            + +

                                                            SBCL provides support for native threads via its sb-thread +package. These are very low-level functions, but we can build our own +abstractions on top of these as shown in the demo examples.

                                                            + +

                                                            You can refer to the documentation for more details (check the +“Wrap-up†section).

                                                            + +

                                                            You can see from the examples below that there is a strong +correspondence between Bordeaux and SBCL Thread functions. In most +cases, the only difference is the change of package name from bt to +sb-thread.

                                                            + +

                                                            It is evident that the Bordeaux thread library was more or less based +on the SBCL implementation. As such, explanation will be provided only +in those cases where there is a major difference in syntax or +semantics.

                                                            + +

                                                            Basics — list current thread, list all threads, get thread name

                                                            + +

                                                            The code:

                                                            + +
                                                                ;;; Print the current thread, all the threads, and the current thread's name
                                                            +
                                                            +    (defun print-thread-info ()
                                                            +      (let* ((curr-thread sb-thread:*current-thread*)
                                                            +             (curr-thread-name (sb-thread:thread-name curr-thread))
                                                            +             (all-threads (sb-thread:list-all-threads)))
                                                            +        (format t "Current thread: ~a~%~%" curr-thread)
                                                            +        (format t "Current thread name: ~a~%~%" curr-thread-name)
                                                            +        (format t "All threads:~% ~{~a~%~}~%" all-threads))
                                                            +      nil)
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (print-thread-info)
                                                            +    Current thread: #<THREAD "repl-thread" RUNNING {10043B8003}>
                                                            +
                                                            +    Current thread name: repl-thread
                                                            +
                                                            +    All threads:
                                                            +     #<THREAD "repl-thread" RUNNING {10043B8003}>
                                                            +    #<THREAD "auto-flush-thread" RUNNING {10043B7DA3}>
                                                            +    #<THREAD "swank-indentation-cache-thread" waiting on: #<WAITQUEUE  {1003A28103}> {1003A201A3}>
                                                            +    #<THREAD "reader-thread" RUNNING {1003A20063}>
                                                            +    #<THREAD "control-thread" waiting on: #<WAITQUEUE  {1003A19E53}> {1003A18C83}>
                                                            +    #<THREAD "Swank Sentinel" waiting on: #<WAITQUEUE  {1003790043}> {1003788023}>
                                                            +    #<THREAD "main thread" RUNNING {1002991CE3}>
                                                            +
                                                            +    NIL
                                                            +
                                                            + +

                                                            Update a global variable from a thread

                                                            + +

                                                            The code:

                                                            + +
                                                                ;;; Update a global variable from a thread
                                                            +
                                                            +    (defparameter *counter* 0)
                                                            +
                                                            +    (defun test-update-global-variable ()
                                                            +      (sb-thread:make-thread
                                                            +       (lambda ()
                                                            +         (sleep 1)
                                                            +         (incf *counter*)))
                                                            +      *counter*)
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (test-update-global-variable)
                                                            +    0
                                                            +
                                                            + + + +

                                                            The code:

                                                            + +
                                                                ;;; Print a message onto the top-level using a thread
                                                            +
                                                            +    (defun print-message-top-level-wrong ()
                                                            +      (sb-thread:make-thread
                                                            +       (lambda ()
                                                            +         (format *standard-output* "Hello from thread!")))
                                                            +      nil)
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (print-message-top-level-wrong)
                                                            +    NIL
                                                            +
                                                            + +

                                                            Print a message onto the top-level — fixed:

                                                            + +

                                                            The code:

                                                            + +
                                                                ;;; Print a message onto the top-level using a thread - fixed
                                                            +
                                                            +    (defun print-message-top-level-fixed ()
                                                            +      (let ((top-level *standard-output*))
                                                            +        (sb-thread:make-thread
                                                            +         (lambda ()
                                                            +           (format top-level "Hello from thread!"))))
                                                            +      nil)
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (print-message-top-level-fixed)
                                                            +    Hello from thread!
                                                            +    NIL
                                                            +
                                                            + + + +

                                                            The code:

                                                            + +
                                                                ;;; Print a message onto the top-level using a thread - reader macro
                                                            +
                                                            +    (eval-when (:compile-toplevel)
                                                            +      (defun print-message-top-level-reader-macro ()
                                                            +        (sb-thread:make-thread
                                                            +         (lambda ()
                                                            +           (format #.*standard-output* "Hello from thread!")))
                                                            +        nil))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (print-message-top-level-reader-macro)
                                                            +    Hello from thread!
                                                            +    NIL
                                                            +
                                                            + +

                                                            Modify a shared resource from multiple threads

                                                            + +

                                                            The code:

                                                            + +
                                                                ;;; Modify a shared resource from multiple threads
                                                            +
                                                            +    (defclass bank-account ()
                                                            +      ((id :initarg :id
                                                            +           :initform (error "id required")
                                                            +           :accessor :id)
                                                            +       (name :initarg :name
                                                            +             :initform (error "name required")
                                                            +             :accessor :name)
                                                            +       (balance :initarg :balance
                                                            +                :initform 0
                                                            +                :accessor :balance)))
                                                            +
                                                            +    (defgeneric deposit (account amount)
                                                            +      (:documentation "Deposit money into the account"))
                                                            +
                                                            +    (defgeneric withdraw (account amount)
                                                            +      (:documentation "Withdraw amount from account"))
                                                            +
                                                            +    (defmethod deposit ((account bank-account) (amount real))
                                                            +      (incf (:balance account) amount))
                                                            +
                                                            +    (defmethod withdraw ((account bank-account) (amount real))
                                                            +      (decf (:balance account) amount))
                                                            +
                                                            +    (defparameter *rich*
                                                            +      (make-instance 'bank-account
                                                            +                     :id 1
                                                            +                     :name "Rich"
                                                            +                     :balance 0))
                                                            +
                                                            +    (defun demo-race-condition ()
                                                            +      (loop repeat 100
                                                            +         do
                                                            +           (sb-thread:make-thread
                                                            +            (lambda ()
                                                            +              (loop repeat 10000 do (deposit *rich* 100))
                                                            +              (loop repeat 10000 do (withdraw *rich* 100))))))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (:balance *rich*)
                                                            +    0
                                                            +    CL-USER> (demo-race-condition)
                                                            +    NIL
                                                            +    CL-USER> (:balance *rich*)
                                                            +    3987400
                                                            +
                                                            + +

                                                            Modify a shared resource from multiple threads — fixed using locks

                                                            + +

                                                            The code:

                                                            + +
                                                                (defvar *lock* (sb-thread:make-mutex))
                                                            +
                                                            +    (defun demo-race-condition-locks ()
                                                            +      (loop repeat 100
                                                            +         do
                                                            +           (sb-thread:make-thread
                                                            +            (lambda ()
                                                            +              (loop repeat 10000 do (sb-thread:with-mutex (*lock*)
                                                            +                                      (deposit *rich* 100)))
                                                            +              (loop repeat 10000 do (sb-thread:with-mutex (*lock*)
                                                            +                                      (withdraw *rich* 100)))))))
                                                            +
                                                            + +

                                                            The only difference here is that instead of make-lock as in Bordeaux, +we have make-mutex and that is used along with the macro with-mutex as +shown in the example.

                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (:balance *rich*)
                                                            +    0
                                                            +    CL-USER> (demo-race-condition-locks)
                                                            +    NIL
                                                            +    CL-USER> (:balance *rich*)
                                                            +    0
                                                            +
                                                            + +

                                                            Modify a shared resource from multiple threads — using atomic operations

                                                            + +

                                                            First, the code:

                                                            + +
                                                                ;;; Modify a shared resource from multiple threads - atomics
                                                            +
                                                            +    (defgeneric atomic-deposit (account amount)
                                                            +      (:documentation "Atomic version of the deposit method"))
                                                            +
                                                            +    (defgeneric atomic-withdraw (account amount)
                                                            +      (:documentation "Atomic version of the withdraw method"))
                                                            +
                                                            +    (defmethod atomic-deposit ((account bank-account) (amount real))
                                                            +      (sb-ext:atomic-incf (car (cons (:balance account) nil)) amount))
                                                            +
                                                            +    (defmethod atomic-withdraw ((account bank-account) (amount real))
                                                            +      (sb-ext:atomic-decf (car (cons (:balance account) nil)) amount))
                                                            +
                                                            +    (defun demo-race-condition-atomics ()
                                                            +      (loop repeat 100
                                                            +         do (sb-thread:make-thread
                                                            +             (lambda ()
                                                            +               (loop repeat 10000 do (atomic-deposit *rich* 100))
                                                            +               (loop repeat 10000 do (atomic-withdraw *rich* 100))))))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (dotimes (i 5)
                                                            +               (format t "~%Opening: ~d" (:balance *rich*))
                                                            +               (demo-race-condition-atomics)
                                                            +               (format t "~%Closing: ~d~%" (:balance *rich*)))
                                                            +
                                                            +    Opening: 0
                                                            +    Closing: 0
                                                            +
                                                            +    Opening: 0
                                                            +    Closing: 0
                                                            +
                                                            +    Opening: 0
                                                            +    Closing: 0
                                                            +
                                                            +    Opening: 0
                                                            +    Closing: 0
                                                            +
                                                            +    Opening: 0
                                                            +    Closing: 0
                                                            +    NIL
                                                            +
                                                            + +

                                                            As you can see, SBCL’s atomic functions are a bit quirky. The two +functions used here: sb-ext:incf and sb-ext:atomic-decf have the +following signatures:

                                                            + +
                                                            Macro: atomic-incf [sb-ext] place &optional diff
                                                            +
                                                            + +

                                                            and

                                                            + +
                                                            Macro: atomic-decf [sb-ext] place &optional diff
                                                            +
                                                            + +

                                                            The interesting bit is that the “place†parameter must be any of the +following (as per the documentation):

                                                            + +
                                                              +
                                                            • a defstruct slot with declared type (unsigned-byte 64) or aref of a (simple-array (unsigned-byte 64) (*)) The type sb-ext:word can be used for these purposes.
                                                            • +
                                                            • car or cdr (respectively first or REST) of a cons.
                                                            • +
                                                            • a variable defined using defglobal with a proclaimed type of fixnum.
                                                            • +
                                                            + +

                                                            This is the reason for the bizarre construct used in the +atomic-deposit and atomic-decf methods.

                                                            + +

                                                            One major incentive to use atomic operations as much as possible is +performance. Let’s do a quick run of the demo-race-condition-locks and +demo-race-condition-atomics functions over 1000 times and check the +difference in performance (if any):

                                                            + +

                                                            With locks:

                                                            + +
                                                                CL-USER> (time
                                                            +                        (loop repeat 100
                                                            +                          do (demo-race-condition-locks)))
                                                            +    Evaluation took:
                                                            +      57.711 seconds of real time
                                                            +      431.451639 seconds of total run time (408.014746 user, 23.436893 system)
                                                            +      747.61% CPU
                                                            +      126,674,011,941 processor cycles
                                                            +      3,329,504 bytes consed
                                                            +
                                                            +    NIL
                                                            +
                                                            + +

                                                            With atomics:

                                                            + +
                                                                CL-USER> (time
                                                            +                        (loop repeat 100
                                                            +                         do (demo-race-condition-atomics)))
                                                            +    Evaluation took:
                                                            +      2.495 seconds of real time
                                                            +      8.175454 seconds of total run time (6.124259 user, 2.051195 system)
                                                            +      [ Run times consist of 0.420 seconds GC time, and 7.756 seconds non-GC time. ]
                                                            +      327.66% CPU
                                                            +      5,477,039,706 processor cycles
                                                            +      3,201,582,368 bytes consed
                                                            +
                                                            +    NIL
                                                            +
                                                            + +

                                                            The results? The locks version took around 57s whereas the lockless +atomics version took just 2s! This is a massive difference indeed!

                                                            + +

                                                            Joining on a thread, destroying a thread example

                                                            + +

                                                            The code:

                                                            + +
                                                                ;;; Joining on and destroying a thread
                                                            +
                                                            +    (defmacro until (condition &body body)
                                                            +      (let ((block-name (gensym)))
                                                            +        `(block ,block-name
                                                            +           (loop
                                                            +               (if ,condition
                                                            +                   (return-from ,block-name nil)
                                                            +                   (progn
                                                            +                       ,@body))))))
                                                            +
                                                            +    (defun join-destroy-thread ()
                                                            +      (let* ((s *standard-output*)
                                                            +            (joiner-thread (sb-thread:make-thread
                                                            +                            (lambda ()
                                                            +                              (loop for i from 1 to 10
                                                            +                                 do
                                                            +                                   (format s "~%[Joiner Thread]  Working...")
                                                            +                                   (sleep (* 0.01 (random 100)))))))
                                                            +            (destroyer-thread (sb-thread:make-thread
                                                            +                               (lambda ()
                                                            +                                 (loop for i from 1 to 1000000
                                                            +                                    do
                                                            +                                      (format s "~%[Destroyer Thread] Working...")
                                                            +                                      (sleep (* 0.01 (random 10000))))))))
                                                            +        (format t "~%[Main Thread] Waiting on joiner thread...")
                                                            +        (bt:join-thread joiner-thread)
                                                            +        (format t "~%[Main Thread] Done waiting on joiner thread")
                                                            +        (if (sb-thread:thread-alive-p destroyer-thread)
                                                            +            (progn
                                                            +              (format t "~%[Main Thread] Destroyer thread alive... killing it")
                                                            +              (sb-thread:terminate-thread destroyer-thread))
                                                            +            (format t "~%[Main Thread] Destroyer thread is already dead"))
                                                            +        (until (sb-thread:thread-alive-p destroyer-thread)
                                                            +               (format t "[Main Thread] Waiting for destroyer thread to die..."))
                                                            +        (format t "~%[Main Thread] Destroyer thread dead")
                                                            +        (format t "~%[Main Thread] Adios!~%")))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                                CL-USER> (join-destroy-thread)
                                                            +
                                                            +    [Joiner Thread]  Working...
                                                            +    [Destroyer Thread] Working...
                                                            +    [Main Thread] Waiting on joiner thread...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Joiner Thread]  Working...
                                                            +    [Main Thread] Done waiting on joiner thread
                                                            +    [Main Thread] Destroyer thread alive... killing it
                                                            +    [Main Thread] Destroyer thread dead
                                                            +    [Main Thread] Adios!
                                                            +    NIL
                                                            +
                                                            + +

                                                            Useful functions

                                                            + +

                                                            Here is a summarised list of the functions, macros and global +variables used in the examples along with some extras:

                                                            + +
                                                              +
                                                            • (member :thread-support *features*) (check thread support)
                                                            • +
                                                            • sb-thread:make-thread (create a new thread)
                                                            • +
                                                            • sb-thread:*current-thread* (holds the current thread object)
                                                            • +
                                                            • sb-thread:list-all-threads (return a list of all running threads)
                                                            • +
                                                            • sb-thread:thread-alive-p (checks if the thread is still alive)
                                                            • +
                                                            • sb-thread:thread-name (return the name of the thread)
                                                            • +
                                                            • sb-thread:join-thread (join on the supplied thread)
                                                            • +
                                                            • sb-thread:interrupt-thread (interrupt the given thread)
                                                            • +
                                                            • sb-thread:destroy-thread (attempt to abort the thread)
                                                            • +
                                                            • sb-thread:make-mutex (create a mutex)
                                                            • +
                                                            • sb-thread:with-mutex (use supplied lock to protect critical code)
                                                            • +
                                                            + +

                                                            Wrap-up

                                                            + +

                                                            As you can see, concurrency support is rather primitive in Common +Lisp, but that’s primarily due to the glaring absence of this +important feature in the ANSI Common Lisp specification. That does not +detract in the least from the support provided by Common Lisp +implementations, nor wonderful libraries like the Bordeaux library.

                                                            + +

                                                            You should follow up on your own by reading a lot more on this +topic. I share some of my own references here:

                                                            + + + +

                                                            Next up, the final post in this mini-series: parallelism in Common +Lisp using the lparallel library.

                                                            + +

                                                            Parallel programming with lparallel

                                                            + +

                                                            It is important to note that lparallel also provides extensive support +for asynchronous programming, and is not a purely parallel programming +library. As stated before, parallelism is merely an abstract concept +in which tasks are conceptually independent of one another.

                                                            + +

                                                            The lparallel library is built on top of the Bordeaux threading +library.

                                                            + +

                                                            As mentioned previously, parallelism and concurrency can be +(and usually are) implemented using the same means — threads, +processes, etc. The difference between lies in their conceptual +differences.

                                                            + +

                                                            Note that not all the examples shown in this post are necessarily +parallel. Asynchronous constructs such as Promises and Futures are, in +particular, more suited to concurrent programming than parallel +programming.

                                                            + +

                                                            The modus operandi of using the lparallel library (for a basic use case) is as follows:

                                                            + +
                                                              +
                                                            • Create an instance of what the library calls a kernel using +lparallel:make-kernel. The kernel is the component that schedules +and executes tasks.
                                                            • +
                                                            • Design the code in terms of futures, promises and other higher +level functional concepts. To this end, lparallel provides +support for channels, promises, futures, and cognates.
                                                            • +
                                                            • Perform operations using what the library calls cognates, which +are simply functions which have equivalents in the Common Lisp +language itself. For instance, the lparallel:pmap function is +the parallel equivalent of the Common Lisp map function.
                                                            • +
                                                            • Finally, close the kernel created in the first step using +lparallel:end-kernel.
                                                            • +
                                                            + +

                                                            Note that the onus of ensuring that the tasks being carried out are +logically parallelisable as well as taking care of all mutable state +is on the developer.

                                                            + +

                                                            Credit: this article first appeared on +z0ltan.wordpress.com.

                                                            + +

                                                            Installation

                                                            + +

                                                            Let’s check if lparallel is available for download using Quicklisp:

                                                            + +
                                                            CL-USER> (ql:system-apropos "lparallel")
                                                            +#<SYSTEM lparallel / lparallel-20160825-git / quicklisp 2016-08-25>
                                                            +#<SYSTEM lparallel-bench / lparallel-20160825-git / quicklisp 2016-08-25>
                                                            +#<SYSTEM lparallel-test / lparallel-20160825-git / quicklisp 2016-08-25>
                                                            +; No value
                                                            +
                                                            + +

                                                            Looks like it is. Let’s go ahead and install it:

                                                            + +
                                                            CL-USER> (ql:quickload "lparallel")
                                                            +To load "lparallel":
                                                            +  Load 2 ASDF systems:
                                                            +    alexandria bordeaux-threads
                                                            +  Install 1 Quicklisp release:
                                                            +    lparallel
                                                            +; Fetching #<URL "http://beta.quicklisp.org/archive/lparallel/2016-08-25/lparallel-20160825-git.tgz">
                                                            +; 76.71KB
                                                            +==================================================
                                                            +78,551 bytes in 0.62 seconds (124.33KB/sec)
                                                            +; Loading "lparallel"
                                                            +[package lparallel.util]..........................
                                                            +[package lparallel.thread-util]...................
                                                            +[package lparallel.raw-queue].....................
                                                            +[package lparallel.cons-queue]....................
                                                            +[package lparallel.vector-queue]..................
                                                            +[package lparallel.queue].........................
                                                            +[package lparallel.counter].......................
                                                            +[package lparallel.spin-queue]....................
                                                            +[package lparallel.kernel]........................
                                                            +[package lparallel.kernel-util]...................
                                                            +[package lparallel.promise].......................
                                                            +[package lparallel.ptree].........................
                                                            +[package lparallel.slet]..........................
                                                            +[package lparallel.defpun]........................
                                                            +[package lparallel.cognate].......................
                                                            +[package lparallel]
                                                            +(:LPARALLEL)
                                                            +
                                                            + +

                                                            And that’s all it took! Now let’s see how this library actually works.

                                                            + +

                                                            Preamble - get the number of cores

                                                            + +

                                                            First, let’s get hold of the number of threads that we are going to +use for our parallel examples. Ideally, we’d like to have a 1:1 match +between the number of worker threads and the number of available +cores.

                                                            + +

                                                            We can use the great Serapeum library to this end, which has a +count-cpus function, that works on all major platforms.

                                                            + +

                                                            Install it:

                                                            + +
                                                            CL-USER> (ql:quickload "serapeum")
                                                            +
                                                            + +

                                                            and call it:

                                                            + +
                                                            CL-USER> (serapeum:count-cpus)
                                                            +8
                                                            +
                                                            + +

                                                            and check that is correct.

                                                            + +

                                                            Common Setup

                                                            + +

                                                            In this example, we will go through the initial setup bit, and also +show some useful information once the setup is done.

                                                            + +

                                                            Load the library:

                                                            + +
                                                            CL-USER> (ql:quickload "lparallel")
                                                            +To load "lparallel":
                                                            +  Load 1 ASDF system:
                                                            +    lparallel
                                                            +; Loading "lparallel"
                                                            +
                                                            +(:LPARALLEL)
                                                            +
                                                            + +

                                                            Initialise the lparallel kernel:

                                                            + +
                                                            CL-USER> (setf lparallel:*kernel* (lparallel:make-kernel 8 :name "custom-kernel"))
                                                            +#<LPARALLEL.KERNEL:KERNEL :NAME "custom-kernel" :WORKER-COUNT 8 :USE-CALLER NIL :ALIVE T :SPIN-COUNT 2000 {1003141F03}>
                                                            +
                                                            + +

                                                            Note that the *kernel* global variable can be rebound — this allows +multiple kernels to co-exist during the same run. Now, some useful +information about the kernel:

                                                            + +
                                                            CL-USER> (defun show-kernel-info ()
                                                            +           (let ((name (lparallel:kernel-name))
                                                            +                 (count (lparallel:kernel-worker-count))
                                                            +                 (context (lparallel:kernel-context))
                                                            +                 (bindings (lparallel:kernel-bindings)))
                                                            +             (format t "Kernel name = ~a~%" name)
                                                            +             (format t "Worker threads count = ~d~%" count)
                                                            +             (format t "Kernel context = ~a~%" context)
                                                            +             (format t "Kernel bindings = ~a~%" bindings)))
                                                            +
                                                            +
                                                            +WARNING: redefining COMMON-LISP-USER::SHOW-KERNEL-INFO in DEFUN
                                                            +SHOW-KERNEL-INFO
                                                            +
                                                            +CL-USER> (show-kernel-info)
                                                            +Kernel name = custom-kernel
                                                            +Worker threads count = 8
                                                            +Kernel context = #<FUNCTION FUNCALL>
                                                            +Kernel bindings = ((*STANDARD-OUTPUT* . #<SLIME-OUTPUT-STREAM {10044EEEA3}>)
                                                            +                   (*ERROR-OUTPUT* . #<SLIME-OUTPUT-STREAM {10044EEEA3}>))
                                                            +NIL
                                                            +
                                                            + +

                                                            End the kernel (this is important since *kernel* does not get +garbage collected until we explicitly end it):

                                                            + +
                                                            CL-USER> (lparallel:end-kernel :wait t)
                                                            +(#<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {100723FA83}>
                                                            + #<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {100723FE23}>
                                                            + #<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {10072581E3}>
                                                            + #<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {1007258583}>
                                                            + #<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {1007258923}>
                                                            + #<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {1007258CC3}>
                                                            + #<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {1007259063}>
                                                            + #<SB-THREAD:THREAD "custom--kernel" FINISHED values: NIL {1007259403}>)
                                                            +
                                                            + +

                                                            Let’s move on to some more examples of different aspects of the lparallel library.

                                                            + +

                                                            For these demos, we will be using the following initial setup from a coding perspective:

                                                            + +
                                                            (require ‘lparallel)
                                                            +(require ‘bt-semaphore)
                                                            +
                                                            +(defpackage :lparallel-user
                                                            +  (:use :cl :lparallel :lparallel.queue :bt-semaphore))
                                                            +
                                                            +(in-package :lparallel-user)
                                                            +
                                                            +;;; initialise the kernel
                                                            +(defun init ()
                                                            +  (setf *kernel* (make-kernel 8 :name "channel-queue-kernel")))
                                                            +
                                                            +(init)
                                                            +
                                                            + +

                                                            So we will be using a kernel with 8 worker threads (one for each CPU core on the machine).

                                                            + +

                                                            And once we’re done will all the examples, the following code will be +run to close the kernel and free all used system resources:

                                                            + +
                                                            ;;; shut the kernel down
                                                            +(defun shutdown ()
                                                            +  (end-kernel :wait t))
                                                            +
                                                            +(shutdown)
                                                            +
                                                            + +

                                                            Using channels and queues

                                                            + +

                                                            First some definitions are in order.

                                                            + +

                                                            A task is a job that is submitted to the kernel. It is simply a +function object along with its arguments.

                                                            + +

                                                            A channel in lparallel is similar to the same concept in Go. A channel +is simply a means of communication with a worker thread. In our case, +it is one particular way of submitting tasks to the kernel.

                                                            + +

                                                            A channel is created in lparallel using lparallel:make-channel. A +task is submitted using lparallel:submit-task, and the results +received via lparallel:receive-result.

                                                            + +

                                                            For instance, we can calculate the square of a number as:

                                                            + +
                                                            (defun calculate-square (n)
                                                            +  (let* ((channel (lparallel:make-channel))
                                                            +         (res nil))
                                                            +    (lparallel:submit-task channel #'(lambda (x)
                                                            +                                       (* x x))
                                                            +                           n)
                                                            +    (setf res (lparallel:receive-result channel))
                                                            +    (format t "Square of ~d = ~d~%" n res)))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                            LPARALLEL-USER> (calculate-square 100)
                                                            +Square of 100 = 10000
                                                            +NIL
                                                            +
                                                            + +

                                                            Now let’s try submitting multiple tasks to the same channel. In this +simple example, we are simply creating three tasks that square, triple, +and quadruple the supplied input respectively.

                                                            + +

                                                            Note that in case of multiple tasks, the output will be in non-deterministic order:

                                                            + +
                                                            (defun test-basic-channel-multiple-tasks ()
                                                            +  (let ((channel (make-channel))
                                                            +        (res '()))
                                                            +    (submit-task channel #'(lambda (x)
                                                            +                             (* x x))
                                                            +                 10)
                                                            +    (submit-task channel #'(lambda (y)
                                                            +                             (* y y y))
                                                            +                 10)
                                                            +    (submit-task channel #'(lambda (z)
                                                            +                             (* z z z z))
                                                            +                 10)
                                                            +     (dotimes (i 3 res)
                                                            +       (push (receive-result channel) res))))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                            LPARALLEL-USER> (dotimes (i 3)
                                                            +                              (print (test-basic-channel-multiple-tasks)))
                                                            +
                                                            +(100 1000 10000)
                                                            +(100 1000 10000)
                                                            +(10000 1000 100)
                                                            +NIL
                                                            +
                                                            + +

                                                            lparallel also provides support for creating a blocking queue in order +to enable message passing between worker threads. A queue is created +using lparallel.queue:make-queue.

                                                            + +

                                                            Some useful functions for using queues are:

                                                            + +
                                                              +
                                                            • lparallel.queue:make-queue: create a FIFO blocking queue
                                                            • +
                                                            • lparallel.queue:push-queue: insert an element into the queue
                                                            • +
                                                            • lparallel.queue:pop-queue: pop an item from the queue
                                                            • +
                                                            • lparallel.queue:peek-queue: inspect value without popping it
                                                            • +
                                                            • lparallel.queue:queue-count: the number of entries in the queue
                                                            • +
                                                            • lparallel.queue:queue-full-p: check if the queue is full
                                                            • +
                                                            • lparallel.queue:queue-empty-p:check if the queue is empty
                                                            • +
                                                            • lparallel.queue:with-locked-queue: lock the queue during access
                                                            • +
                                                            + +

                                                            A basic demo showing basic queue properties:

                                                            + +
                                                                (defun test-queue-properties ()
                                                            +      (let ((queue (make-queue :fixed-capacity 5)))
                                                            +        (loop
                                                            +           when (queue-full-p queue)
                                                            +           do (return)
                                                            +           do (push-queue (random 100) queue))
                                                            +         (print (queue-full-p queue))
                                                            +        (loop
                                                            +           when (queue-empty-p queue)
                                                            +           do (return)
                                                            +           do (print (pop-queue queue)))
                                                            +        (print (queue-empty-p queue)))
                                                            +      nil)
                                                            +
                                                            + +

                                                            Which produces:

                                                            + +
                                                                LPARALLEL-USER> (test-queue-properties)
                                                            +
                                                            +    T
                                                            +    17
                                                            +    51
                                                            +    55
                                                            +    42
                                                            +    82
                                                            +    T
                                                            +    NIL
                                                            +
                                                            + +

                                                            Note: lparallel.queue:make-queue is a generic interface which is +actually backed by different types of queues. For instance, in the +previous example, the actual type of the queue is +lparallel.vector-queue since we specified it to be of fixed size using +the :fixed-capacity keyword argument.

                                                            + +

                                                            The documentation doesn’t actually specify what keyword arguments we +can pass to lparallel.queue:make-queue, so let’s and find that out in +a different way:

                                                            + +
                                                                LPARALLEL-USER> (describe 'lparallel.queue:make-queue)
                                                            +    LPARALLEL.QUEUE:MAKE-QUEUE
                                                            +      [symbol]
                                                            +
                                                            +    MAKE-QUEUE names a compiled function:
                                                            +      Lambda-list: (&REST ARGS)
                                                            +      Derived type: FUNCTION
                                                            +      Documentation:
                                                            +        Create a queue.
                                                            +
                                                            +        The queue contents may be initialized with the keyword argument
                                                            +        `initial-contents'.
                                                            +
                                                            +        By default there is no limit on the queue capacity. Passing a
                                                            +        `fixed-capacity' keyword argument limits the capacity to the value
                                                            +        passed. `push-queue' will block for a full fixed-capacity queue.
                                                            +      Source file: /Users/z0ltan/quicklisp/dists/quicklisp/software/lparallel-20160825-git/src/queue.lisp
                                                            +
                                                            +    MAKE-QUEUE has a compiler-macro:
                                                            +      Source file: /Users/z0ltan/quicklisp/dists/quicklisp/software/lparallel-20160825-git/src/queue.lisp
                                                            +    ; No value
                                                            +
                                                            + +

                                                            So, as we can see, it supports the following keyword arguments: +:fixed-capacity, and initial-contents.

                                                            + +

                                                            Now, if we do specify :fixed-capacity, then the actual type of the +queue will be lparallel.vector-queue, and if we skip that keyword +argument, the queue will be of type lparallel.cons-queue (which is a +queue of unlimited size), as can be seen from the output of the +following snippet:

                                                            + +
                                                                (defun check-queue-types ()
                                                            +      (let ((queue-one (make-queue :fixed-capacity 5))
                                                            +            (queue-two (make-queue)))
                                                            +        (format t "queue-one is of type: ~a~%" (type-of queue-one))
                                                            +        (format t "queue-two is of type: ~a~%" (type-of queue-two))))
                                                            +
                                                            +
                                                            +    LPARALLEL-USER> (check-queue-types)
                                                            +    queue-one is of type: VECTOR-QUEUE
                                                            +    queue-two is of type: CONS-QUEUE
                                                            +    NIL
                                                            +
                                                            + +

                                                            Of course, you can always create instances of the specific queue types +yourself, but it is always better, when you can, to stick to the +generic interface and letting the library create the proper type of +queue for you.

                                                            + +

                                                            Now, let’s just see the queue in action!

                                                            + +
                                                                (defun test-basic-queue ()
                                                            +      (let ((queue (make-queue))
                                                            +            (channel (make-channel))
                                                            +            (res '()))
                                                            +        (submit-task channel #'(lambda ()
                                                            +                         (loop for entry = (pop-queue queue)
                                                            +                            when (queue-empty-p queue)
                                                            +                            do (return)
                                                            +                            do (push (* entry entry) res))))
                                                            +        (dotimes (i 100)
                                                            +          (push-queue i queue))
                                                            +        (receive-result channel)
                                                            +        (format t "~{~d ~}~%" res)))
                                                            +
                                                            + +

                                                            Here we submit a single task that repeatedly scans the queue till it’s +empty, pops the available values, and pushes them into the res list.

                                                            + +

                                                            And the output:

                                                            + +
                                                                LPARALLEL-USER> (test-basic-queue)
                                                            +    9604 9409 9216 9025 8836 8649 8464 8281 8100 7921 7744 7569 7396 7225 7056 6889 6724 6561 6400 6241 6084 5929 5776 5625 5476 5329 5184 5041 4900 4761 4624 4489 4356 4225 4096 3969 3844 3721 3600 3481 3364 3249 3136 3025 2916 2809 2704 2601 2500 2401 2304 2209 2116 2025 1936 1849 1764 1681 1600 1521 1444 1369 1296 1225 1156 1089 1024 961 900 841 784 729 676 625 576 529 484 441 400 361 324 289 256 225 196 169 144 121 100 81 64 49 36 25 16 9 4 1 0
                                                            +    NIL
                                                            +
                                                            + +

                                                            Killing tasks

                                                            + +

                                                            A small note mentioning the lparallel:kill-task function would be +apropos at this juncture. This function is useful in those cases when +tasks are unresponsive. The lparallel documentation clearly states +that this must only be used as a last resort.

                                                            + +

                                                            All tasks which are created are by default assigned a category of +:default. The dynamic property, *task-category* holds this value, and +can be dynamically bound to different values (as we shall see).

                                                            + +
                                                            ;;; kill default tasks
                                                            +(defun test-kill-all-tasks ()
                                                            +  (let ((channel (make-channel))
                                                            +        (stream *query-io*))
                                                            +    (dotimes (i 10)
                                                            +      (submit-task channel #'(lambda (x)
                                                            +                               (sleep (random 10))
                                                            +                               (format stream "~d~%" (* x x))) (random 10)))
                                                            +    (sleep (random 2))
                                                            +    (kill-tasks :default)))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                            LPARALLEL-USER> (test-kill-all-tasks)
                                                            +16
                                                            +1
                                                            +8
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +
                                                            + +

                                                            Since we had created 10 tasks, all the 8 kernel worker threads were +presumably busy with a task each. When we killed tasks of category +:default, all these threads were killed as well and had to be +regenerated (which is an expensive operation). This is part of the +reason why lparallel:kill-tasks must be avoided.

                                                            + +

                                                            Now, in the example above, all running tasks were killed since all of +them belonged to the :default category. Suppose we wish to kill only +specific tasks, we can do that by binding *task-category* when we +create those tasks, and then specifying the category when we invoke +lparallel:kill-tasks.

                                                            + +

                                                            For example, suppose we have two categories of tasks – tasks which +square their arguments, and tasks which cube theirs. Let’s assign them +categories ’squaring-tasks and ’cubing-tasks respectively. Let’s then +kill tasks of a randomly chosen category ’squaring-tasks or +’cubing-tasks.

                                                            + +

                                                            Here is the code:

                                                            + +
                                                            ;;; kill tasks of a randomly chosen category
                                                            +(defun test-kill-random-tasks ()
                                                            +  (let ((channel (make-channel))
                                                            +        (stream *query-io*))
                                                            +    (let ((*task-category* 'squaring-tasks))
                                                            +      (dotimes (i 5)
                                                            +        (submit-task channel #'(lambda (x)
                                                            +                                 (sleep (random 5))
                                                            +                                 (format stream "~%[Squaring] ~d = ~d" x (* x x))) i)))
                                                            +    (let ((*task-category* 'cubing-tasks))
                                                            +      (dotimes (i 5)
                                                            +        (submit-task channel #'(lambda (x)
                                                            +                                 (sleep (random 5))
                                                            +                                 (format stream "~%[Cubing] ~d = ~d" x (* x x x))) i)))
                                                            +    (sleep 1)
                                                            +    (if (evenp (random 10))
                                                            +        (progn
                                                            +          (print "Killing squaring tasks")
                                                            +          (kill-tasks 'squaring-tasks))
                                                            +        (progn
                                                            +          (print "Killing cubing tasks")
                                                            +          (kill-tasks 'cubing-tasks)))))
                                                            +
                                                            + +

                                                            And here is a sample run:

                                                            + +
                                                            LPARALLEL-USER> (test-kill-random-tasks)
                                                            +
                                                            +[Cubing] 2 = 8
                                                            +[Squaring] 4 = 16
                                                            +[Cubing] 4
                                                            + = [Cubing] 643 = 27
                                                            +"Killing squaring tasks"
                                                            +4
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +
                                                            +[Cubing] 1 = 1
                                                            +[Cubing] 0 = 0
                                                            +
                                                            +LPARALLEL-USER> (test-kill-random-tasks)
                                                            +
                                                            +[Squaring] 1 = 1
                                                            +[Squaring] 3 = 9
                                                            +"Killing cubing tasks"
                                                            +5
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +
                                                            +[Squaring] 2 = 4
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +WARNING: lparallel: Replacing lost or dead worker.
                                                            +
                                                            +[Squaring] 0 = 0
                                                            +[Squaring] 4 = 16
                                                            +
                                                            + +

                                                            Using promises and futures

                                                            + +

                                                            Promises and Futures provide support for Asynchronous Programming.

                                                            + +

                                                            In lparallel-speak, a lparallel:promise is a placeholder for a +result which is fulfilled by providing it with a value. The promise +object itself is created using lparallel:promise, and the promise is +given a value using the lparallel:fulfill macro.

                                                            + +

                                                            To check whether the promise has been fulfilled yet or not, we can use the +lparallel:fulfilledp predicate function. Finally, the lparallel:force +function is used to extract the value out of the promise. Note that this +function blocks until the operation is complete.

                                                            + +

                                                            Let’s solidify these concepts with a very simple example first:

                                                            + +
                                                            (defun test-promise ()
                                                            +  (let ((p (promise)))
                                                            +    (loop
                                                            +       do (if (evenp (read))
                                                            +              (progn
                                                            +                (fulfill p 'even-received!)
                                                            +                (return))))
                                                            +    (force p)))
                                                            +
                                                            + +

                                                            Which generates the output:

                                                            + +
                                                            LPARALLEL-USER> (test-promise)
                                                            +5
                                                            +1
                                                            +3
                                                            +10
                                                            +EVEN-RECEIVED!
                                                            +
                                                            + +

                                                            Explanation: This simple example simply keeps looping forever until an +even number has been entered. The promise is fulfilled inside the loop +using lparallel:fulfill, and the value is then returned from the +function by forcing it with lparallel:force.

                                                            + +

                                                            Now, let’s take a bigger example. Assuming that we don’t want to have +to wait for the promise to be fulfilled, and instead have the current +do some useful work, we can delegate the promise fulfillment to +external explicitly as seen in the next example.

                                                            + +

                                                            Consider we have a function that squares its argument. And, for the +sake of argument, it consumes a lot of time doing so. From our client +code, we want to invoke it, and wait till the squared value is +available.

                                                            + +
                                                            (defun promise-with-threads ()
                                                            +  (let ((p (promise))
                                                            +        (stream *query-io*)
                                                            +        (n (progn
                                                            +             (princ "Enter a number: ")
                                                            +             (read))))
                                                            +    (format t "In main function...~%")
                                                            +    (bt:make-thread
                                                            +     #'(lambda ()
                                                            +         (sleep (random 10))
                                                            +         (format stream "Inside thread... fulfilling promise~%")
                                                            +         (fulfill p (* n n))))
                                                            +    (bt:make-thread
                                                            +     #'(lambda ()
                                                            +         (loop
                                                            +            when (fulfilledp p)
                                                            +            do (return)
                                                            +            do (progn
                                                            +                 (format stream "~d~%" (random 100))
                                                            +                 (sleep (* 0.01 (random 100)))))))
                                                            +    (format t "Inside main function, received value: ~d~%" (force p))))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                            LPARALLEL-USER> (promise-with-threads)
                                                            +Enter a number: 19
                                                            +In main function...
                                                            +44
                                                            +59
                                                            +90
                                                            +34
                                                            +30
                                                            +76
                                                            +Inside thread... fulfilling promise
                                                            +Inside main function, received value: 361
                                                            +NIL
                                                            +
                                                            + +

                                                            Explanation: There is nothing much in this example. We create a +promise object p, and we spawn off a thread that sleeps for some +random time and then fulfills the promise by giving it a value.

                                                            + +

                                                            Meanwhile, in the main thread, we spawn off another thread that keeps +checking if the promise has been fulfilled or not. If not, it prints +some random number and continues checking. Once the promise has been +fulfilled, we can extract the value using lparallel:force in the main +thread as shown.

                                                            + +

                                                            This shows that promises can be fulfilled by different threads while +the code that created the promise need not wait for the promise to be +fulfilled. This is especially important since, as mentioned before, +lparallel:force is a blocking call. We want to delay forcing the +promise until the value is actually available.

                                                            + +

                                                            Another point to note when using promises is that once a promise has +been fulfilled, invoking force on the same object will always return +the same value. That is to say, a promise can be successfully +fulfilled only once.

                                                            + +

                                                            For instance:

                                                            + +
                                                            (defun multiple-fulfilling ()
                                                            +  (let ((p (promise)))
                                                            +    (dotimes (i 10)
                                                            +      (fulfill p (random 100))
                                                            +      (format t "~d~%" (force p)))))
                                                            +
                                                            + +

                                                            Which produces:

                                                            + +
                                                            LPARALLEL-USER> (multiple-fulfilling)
                                                            +15
                                                            +15
                                                            +15
                                                            +15
                                                            +15
                                                            +15
                                                            +15
                                                            +15
                                                            +15
                                                            +15
                                                            +NIL
                                                            +
                                                            + +

                                                            So how does a future differ from a promise?

                                                            + +

                                                            A lparallel:future is simply a promise that is run in parallel, and as +such, it does not block the main thread like a default use of +lparallel:promise would. It is executed in its own thread (by +the lparallel library, of course).

                                                            + +

                                                            Here is a simple example of a future:

                                                            + +
                                                            (defun test-future ()
                                                            +  (let ((f (future
                                                            +             (sleep (random 5))
                                                            +             (print "Hello from future!"))))
                                                            +    (loop
                                                            +       when (fulfilledp f)
                                                            +       do (return)
                                                            +       do (sleep (* 0.01 (random 100)))
                                                            +         (format t "~d~%" (random 100)))
                                                            +    (format t "~d~%" (force f))))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                            LPARALLEL-USER> (test-future)
                                                            +5
                                                            +19
                                                            +91
                                                            +11
                                                            +Hello from future!
                                                            +NIL
                                                            +
                                                            + +

                                                            Explanation: This exactly is similar to the promise-with-threads +example. Observe two differences, however - first of all, the +lparallel:future macro has a body as well. This allows the future to +fulfill itself! What this means is that as soon as the body of the +future is done executing, lparallel:fulfilledp will always return true +for the future object.

                                                            + +

                                                            Secondly, the future itself is spawned off on a separate thread by the +library, so it does not interfere with the execution of the current +thread very much unlike promises as could be seen in the +promise-with-threads example (which needed an explicit thread for the +fulfilling code in order to avoid blocking the current thread).

                                                            + +

                                                            The most interesting bit is that (even in terms of the actual theory +propounded by Dan Friedman and others), a Future is conceptually +something that fulfills a Promise. That is to say, a promise is a +contract that some value will be generated sometime in the future, and +a future is precisely that “something†that does that job.

                                                            + +

                                                            What this means is that even when using the lparallel library, the +basic use of a future would be to fulfill a promise. This means that +hacks like promise-with-threads need not be made by the user.

                                                            + +

                                                            Let’s take a small example to demonstrate this point (a pretty +contrived example, I must admit!).

                                                            + +

                                                            Here’s the scenario: we want to read in a number and calculate its +square. So we offload this work to another function, and continue with +our own work. When the result is ready, we want it to be printed on +the console without any intervention from us.

                                                            + +

                                                            Here’s how the code looks:

                                                            + +
                                                            ;;; Callback example using promises and futures
                                                            +(defun callback-promise-future-demo ()
                                                            +  (let* ((p (promise))
                                                            +         (stream *query-io*)
                                                            +         (n (progn
                                                            +              (princ "Enter a number: ")
                                                            +              (read)))
                                                            +         (f (future
                                                            +              (sleep (random 10))
                                                            +              (fulfill p (* n n))
                                                            +              (force (future
                                                            +                       (format stream "Square of ~d = ~d~%" n (force p)))))))
                                                            +    (loop
                                                            +       when (fulfilledp f)
                                                            +       do (return)
                                                            +       do (sleep (* 0.01 (random 100))))))
                                                            +
                                                            + +

                                                            And the output:

                                                            + +
                                                            LPARALLEL-USER> (callback-promise-future-demo)
                                                            +Enter a number: 19
                                                            +Square of 19 = 361
                                                            +NIL
                                                            +
                                                            + +

                                                            Explanation: All right, so first off, we create a promise to hold the +squared value when it is generated. This is the p object. The input +value is stored in the local variable n.

                                                            + +

                                                            Then we create a future object f. This future simply squares the input +value and fulfills the promise with this value. Finally, since we want +to print the output in its own time, we force an anonymous future +which simply prints the output string as shown.

                                                            + +

                                                            Note that this is very similar to the situation in an environment like +Node, where we pass callback functions to other functions with the +understanding that the callback will be called when the invoked +function is done with its work.

                                                            + +

                                                            Finally note that the following snippet is still fine (even if it uses +the blocking lparallel:force call because it’s on a separate thread):

                                                            + +
                                                            (force (future
                                                            +(format stream "Square of ~d = ~d~%" n (force p))))
                                                            +
                                                            + +

                                                            To summarise, the general idiom of usage is: define objects which will +hold the results of asynchronous computations in promises, and use +futures to fulfill those promises.

                                                            + +

                                                            Using cognates - parallel equivalents of Common Lisp counterparts

                                                            + +

                                                            Cognates are arguably the raison d’etre of the lparallel +library. These constructs are what truly provide parallelism in the +lparallel. Note, however, that most (if not all) of these constructs +are built on top of futures and promises.

                                                            + +

                                                            To put it in a nutshell, cognates are simply functions that are +intended to be the parallel equivalents of their Common Lisp +counterparts. However, there are a few extra lparallel cognates that +have no Common Lisp equivalents.

                                                            + +

                                                            At this juncture, it is important to know that cognates come in two basic flavours:

                                                            + +
                                                              +
                                                            • Constructs for fine-grained parallelism: defpun, plet, plet-if, etc.
                                                            • +
                                                            • Explicit functions and macros for performing parallel operations - +pmap, preduce, psort, pdotimes, etc.
                                                            • +
                                                            + +

                                                            In the first case we don’t have much explicit control over the +operations themselves. We mostly rely on the fact that the library +itself will optimise and parallelise the forms to whatever extent it +can. In this post, we will focus on the second category of cognates.

                                                            + +

                                                            Take, for instance, the cognate function lparallel:pmap is exactly +the same as the Common Lisp equivalent, map, but it runs in +parallel. Let’s demonstrate that through an example.

                                                            + +

                                                            Suppose we had a list of random strings of length varying from 3 to +10, and we wished to collect their lengths in a vector.

                                                            + +

                                                            Let’s first set up the helper functions that will generate the random strings:

                                                            + +
                                                            (defvar *chars*
                                                            +  (remove-duplicates
                                                            +   (sort
                                                            +    (loop for c across "The quick brown fox jumps over the lazy dog"
                                                            +       when (alpha-char-p c)
                                                            +       collect (char-downcase c))
                                                            +    #'char<)))
                                                            +
                                                            +(defun get-random-strings (&optional (count 100000))
                                                            +  "generate random strings between lengths 3 and 10"
                                                            +  (loop repeat count
                                                            +     collect
                                                            +       (concatenate 'string  (loop repeat (+ 3 (random 8))
                                                            +                           collect (nth (random 26) *chars*)))))
                                                            +
                                                            + +

                                                            And here’s how the Common Lisp map version of the solution might look like:

                                                            + +
                                                            ;;; map demo
                                                            +(defun test-map ()
                                                            +  (map 'vector #'length (get-random-strings 100)))
                                                            +
                                                            + +

                                                            And let’s have a test run:

                                                            + +
                                                            LPARALLEL-USER> (test-map)
                                                            +#(7 5 10 8 7 5 3 4 4 10)
                                                            +
                                                            + +

                                                            And here’s the lparallel:pmap equivalent:

                                                            + +
                                                            ;;;pmap demo
                                                            +(defun test-pmap ()
                                                            +  (pmap 'vector #'length (get-random-strings 100)))
                                                            +
                                                            + +

                                                            which produces:

                                                            + +
                                                            LPARALLEL-USER> (test-pmap)
                                                            +#(8 7 6 7 6 4 5 6 5 7)
                                                            +LPARALLEL-USER>
                                                            +
                                                            + +

                                                            As you can see from the definitions of test-map and test-pmap, the +syntax of the lparallel:map and lparallel:pmap functions are exactly +the same (well, almost - lparallel:pmap has a few more optional +arguments).

                                                            + +

                                                            Some useful cognate functions and macros (all of them are functions +except when marked so explicitly. Note that there are quite a few +cognates, and I have chosen a few to try and represent every category +through an example:

                                                            + +

                                                            lparallel:pmap: parallel version of map.

                                                            + +

                                                            Note that all the mapping functions (lparallel:pmap, +lparallel:pmapc,lparallel:pmapcar, etc.) take two special keyword +arguments

                                                            +
                                                              +
                                                            • :size, specifying the number of elements of the input +sequence(s) to process, and
                                                            • +
                                                            • :parts which specifies the number of parallel parts to divide the +sequence(s) into.
                                                            • +
                                                            + +
                                                                ;;; pmap - function
                                                            +    (defun test-pmap ()
                                                            +      (let ((numbers (loop for i below 10
                                                            +                        collect i)))
                                                            +        (pmap 'vector #'(lambda (x)
                                                            +                          (* x x))
                                                            +              :parts (length numbers)
                                                            +              numbers)))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-pmap)
                                                            +
                                                            +    #(0 1 4 9 16 25 36 49 64 81)
                                                            +
                                                            + +

                                                            lparallel:por: parallel version of or.

                                                            + +

                                                            The behaviour is that it returns the first non-nil element amongst its +arguments. However, due to the parallel nature of this macro, that +element varies.

                                                            + +
                                                                ;;; por - macro
                                                            +    (defun test-por ()
                                                            +      (let ((a 100)
                                                            +            (b 200)
                                                            +            (c nil)
                                                            +            (d 300))
                                                            +        (por a b c d)))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (dotimes (i 10)
                                                            +                      (print (test-por)))
                                                            +
                                                            +    300
                                                            +    300
                                                            +    100
                                                            +    100
                                                            +    100
                                                            +    300
                                                            +    100
                                                            +    100
                                                            +    100
                                                            +    100
                                                            +    NIL
                                                            +
                                                            + +

                                                            In the case of the normal or operator, it would always have returned +the first non-nil element viz. 100.

                                                            + +

                                                            lparallel:pdotimes: parallel version of dotimes.

                                                            + +

                                                            Note that this macro also take an optional :parts argument.

                                                            + +
                                                                ;;; pdotimes - macro
                                                            +    (defun test-pdotimes ()
                                                            +      (pdotimes (i 5)
                                                            +        (declare (ignore i))
                                                            +        (print (random 100))))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-pdotimes)
                                                            +
                                                            +    39
                                                            +    29
                                                            +    81
                                                            +    42
                                                            +    56
                                                            +    NIL
                                                            +
                                                            + +

                                                            lparallel:pfuncall: parallel version of funcall.

                                                            + +
                                                                ;;; pfuncall - macro
                                                            +    (defun test-pfuncall ()
                                                            +      (pfuncall #'* 1 2 3 4 5))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-pfuncall)
                                                            +
                                                            +    120
                                                            +
                                                            + +

                                                            lparallel:preduce: parallel version of reduce.

                                                            + +

                                                            This very important function also takes two optional keyword +arguments: :parts (same meaning as explained), and :recurse. If +:recurse is non-nil, it recursively applies lparallel:preduce to its +arguments, otherwise it default to using reduce.

                                                            + +
                                                                ;;; preduce - function
                                                            +    (defun test-preduce ()
                                                            +      (let ((numbers (loop for i from 1 to 100
                                                            +                        collect i)))
                                                            +        (preduce #'+
                                                            +                 numbers
                                                            +                 :parts (length numbers)
                                                            +                 :recurse t)))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-preduce)
                                                            +
                                                            +    5050
                                                            +
                                                            + +

                                                            lparallel:premove-if-not: parallel version of remove-if-not.

                                                            + +

                                                            This is essentially equivalent to “filter†in Functional Programming parlance.

                                                            + +
                                                                ;;; premove-if-not
                                                            +    (defun test-premove-if-not ()
                                                            +      (let ((numbers (loop for i from 1 to 100
                                                            +                        collect i)))
                                                            +        (premove-if-not #'evenp numbers)))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-premove-if-not)
                                                            +
                                                            +    (2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54
                                                            +     56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100)
                                                            +
                                                            + +

                                                            lparallel:pevery: parallel version of every.

                                                            + +
                                                                ;;; pevery - function
                                                            +    (defun test-pevery ()
                                                            +      (let ((numbers (loop for i from 1 to 100
                                                            +                        collect i)))
                                                            +        (list (pevery #'evenp numbers)
                                                            +              (pevery #'integerp numbers))))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-pevery)
                                                            +
                                                            +    (NIL T)
                                                            +
                                                            + +

                                                            In this example, we are performing two checks - firstly, whether all +the numbers in the range [1,100] are even, and secondly, whether all +the numbers in the same range are integers.

                                                            + +

                                                            lparallel:count: parallel version of count.

                                                            + +
                                                                ;;; pcount - function
                                                            +    (defun test-pcount ()
                                                            +      (let ((chars "The quick brown fox jumps over the lazy dog"))
                                                            +        (pcount #\e chars)))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-pcount)
                                                            +
                                                            +    3
                                                            +
                                                            + +

                                                            lparallel:psort: parallel version of sort.

                                                            + +
                                                                ;;; psort - function
                                                            +    (defstruct person
                                                            +      name
                                                            +      age)
                                                            +
                                                            +    (defun test-psort ()
                                                            +      (let* ((names (list "Rich" "Peter" "Sybil" "Basil" "Candy" "Slava" "Olga"))
                                                            +             (people (loop for name in names
                                                            +                        collect (make-person :name name :age (+ (random 20) 20)))))
                                                            +        (print "Before sorting...")
                                                            +        (print people)
                                                            +        (fresh-line)
                                                            +        (print "After sorting...")
                                                            +        (psort
                                                            +         people
                                                            +         #'(lambda (x y)
                                                            +             (< (person-age x)
                                                            +                (person-age y)))
                                                            +         :test #'=)))
                                                            +
                                                            + +

                                                            Sample run:

                                                            + +
                                                                LPARALLEL-USER> (test-psort)
                                                            +
                                                            +    "Before sorting..."
                                                            +    (#S(PERSON :NAME "Rich" :AGE 38) #S(PERSON :NAME "Peter" :AGE 24)
                                                            +     #S(PERSON :NAME "Sybil" :AGE 20) #S(PERSON :NAME "Basil" :AGE 22)
                                                            +     #S(PERSON :NAME "Candy" :AGE 23) #S(PERSON :NAME "Slava" :AGE 37)
                                                            +     #S(PERSON :NAME "Olga" :AGE 33))
                                                            +
                                                            +    "After sorting..."
                                                            +    (#S(PERSON :NAME "Sybil" :AGE 20) #S(PERSON :NAME "Basil" :AGE 22)
                                                            +     #S(PERSON :NAME "Candy" :AGE 23) #S(PERSON :NAME "Peter" :AGE 24)
                                                            +     #S(PERSON :NAME "Olga" :AGE 33) #S(PERSON :NAME "Slava" :AGE 37)
                                                            +     #S(PERSON :NAME "Rich" :AGE 38))
                                                            +
                                                            + +

                                                            In this example, we first define a structure of type person for +storing information about people. Then we create a list of 7 people +with randomly generated ages (between 20 and 39). Finally, we sort +them by age in non-decreasing order.

                                                            + +

                                                            Error handling

                                                            + +

                                                            To see how lparallel handles error handling (hint: with +lparallel:task-handler-bind), please read +https://z0ltan.wordpress.com/2016/09/10/basic-concurrency-and-parallelism-in-common-lisp-part-4b-parallelism-using-lparallel-error-handling/.

                                                            + +

                                                            Monitoring and controlling threads with Slime

                                                            + +

                                                            M-x slime-list-threads (you can also access it through the +slime-selector, shortcut t) will list running threads by their +names, and their statuses.

                                                            + +

                                                            The thread on the current line can be killed with k, or if there’s a +lot of threads to kill, several lines can be selected and k will kill +all the threads in the selected region.

                                                            + +

                                                            g will update the thread list, but when you have a lot of threads +starting and stopping it may be too cumbersome to always press g, so +there’s a variable slime-threads-update-interval, when set to a number +X the thread list will be automatically updated each X seconds, a +reasonable value would be 0.5.

                                                            + +

                                                            Thanks to Slime tips.

                                                            + +

                                                            References

                                                            + +

                                                            There are, of course, a lot more functions, objects, and idiomatic +ways of performing parallel computations using the lparallel +library. This post barely scratches the surface on those. However, the +general flow of operation is amply demonstrated here, and for further +reading, you may find the following resources useful:

                                                            + + + + +

                                                            + Page source: process.md +

                                                            +
                                                            + + + + + +
                                                            +
                                                            +
                                                            + © 2002–2021 the Common Lisp Cookbook Project +
                                                            + +
                                                            +
                                                            T
                                                            O
                                                            C
                                                            +
                                                            + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/regexp.html b/clones/lispcookbook.github.io/cl-cookbook/regexp.html new file mode 100644 index 00000000..bbd94044 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/regexp.html @@ -0,0 +1,234 @@ + + + + + Regular Expressions + + + + + + + + + + + + + + +

                                                            The Common Lisp Cookbook – Regular Expressions

                                                            +
                                                            + + + + +
                                                            +
                                                            + +
                                                            +
                                                            + +
                                                            +
                                                            Table of Contents
                                                            +
                                                              +
                                                              +
                                                              + +
                                                              +

                                                              The Common Lisp Cookbook – Regular Expressions

                                                              + + +

                                                              + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                              +

                                                              + 📕 Get the EPUB and PDF +

                                                              + + +
                                                              The ANSI Common Lisp +standard +does not include facilities for regular expressions, but a couple of +libraries exist for this task, for instance: +cl-ppcre.

                                                              + +

                                                              See also the respective Cliki: +regexp page for more +links.

                                                              + +

                                                              Note that some CL implementations include regexp facilities, notably +CLISP and +ALLEGRO +CL. If +in doubt, check your manual or ask your vendor.

                                                              + +

                                                              The description provided below is far from complete, so don’t forget +to check the reference manual that comes along with the CL-PPCRE +library.

                                                              + +

                                                              PPCRE

                                                              + +

                                                              Using PPCRE

                                                              + +

                                                              CL-PPCRE (abbreviation for +Portable Perl-compatible regular expressions) is a portable regular +expression library for Common Lisp with a broad set of features and +good performance. It has been ported to a number of Common Lisp +implementations and can be easily installed (or added as a dependency) +via Quicklisp:

                                                              + +
                                                              (ql:quickload "cl-ppcre")
                                                              +
                                                              + +

                                                              Basic operations with the CL-PPCRE library functions are described +below.

                                                              + +

                                                              Looking for matching patterns

                                                              + +

                                                              The scan function tries to match the given pattern and on success +returns four multiple-values values - the start of the match, the end +of the match, and two arrays denoting the beginnings and ends of +register matches. On failure returns NIL.

                                                              + +

                                                              A regular expression pattern can be compiled with the create-scanner +function call. A “scanner†will be created that can be used by other +functions.

                                                              + +

                                                              For example:

                                                              + +
                                                              (let ((ptrn (ppcre:create-scanner "(a)*b")))
                                                              +  (ppcre:scan ptrn "xaaabd"))
                                                              +
                                                              + +

                                                              will yield the same results as:

                                                              + +
                                                              (ppcre:scan "(a)*b" "xaaabd")
                                                              +
                                                              + +

                                                              but will require less time for repeated scan calls as parsing the +expression and compiling it is done only once.

                                                              + +

                                                              Replacing text

                                                              + +
                                                              (ppcre:regex-replace "a" "abc" "A") ;; => "Abc"
                                                              +;; or
                                                              +(let ((pat (ppcre:create-scanner "a")))
                                                              +  (ppcre:regex-replace pat "abc" "A"))
                                                              +
                                                              + +

                                                              Extracting information

                                                              + +

                                                              CL-PPCRE provides a several ways to extract matching fragments, among +them: the scan-to-strings and register-groups-bind functions.

                                                              + +

                                                              The scan-to-strings function is similar to scan but returns +substrings of target-string instead of positions. This function +returns two values on success: the whole match as a string plus an +array of substrings (or NILs) corresponding to the matched registers.

                                                              + +

                                                              The register-groups-bind function tries to match the given pattern +against the target string and binds matching fragments with the given +variables.

                                                              + +
                                                              (ppcre:register-groups-bind (first second third fourth)
                                                              +      ("((a)|(b)|(c))+" "abababc" :sharedp t)
                                                              +    (list first second third fourth))
                                                              +;; => ("c" "a" "b" "c")
                                                              +
                                                              + +

                                                              CL-PPCRE also provides a shortcut for calling a function before +assigning the matching fragment to the variable:

                                                              + +
                                                              (ppcre:register-groups-bind (fname lname (#'parse-integer date month year))
                                                              +      ("(\\w+)\\s+(\\w+)\\s+(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})" "Frank Zappa 21.12.1940")
                                                              +    (list fname lname (encode-universal-time 0 0 0 date month year 0)))
                                                              +;; => ("Frank" "Zappa" 1292889600)
                                                              +
                                                              + +

                                                              Syntactic sugar

                                                              + +

                                                              It might be more convenient to use CL-PPCRE with the +CL-INTERPOL +library. CL-INTERPOL is a library for Common Lisp which modifies the +reader in a way that introduces interpolation within strings similar +to Perl, Scala, or Unix Shell scripts.

                                                              + +

                                                              In addition to loading the CL-INTERPOL library, initialization call +must be made to properly configure the Lisp reader. This is +accomplished by either calling the enable-interpol-syntax function +from the REPL or placing that call in the source file before using any +of its features:

                                                              + +
                                                              (interpol:enable-interpol-syntax)
                                                              +
                                                              + + +

                                                              + Page source: regexp.md +

                                                              +
                                                              + + + + + +
                                                              +
                                                              +
                                                              + © 2002–2021 the Common Lisp Cookbook Project +
                                                              + +
                                                              +
                                                              T
                                                              O
                                                              C
                                                              +
                                                              + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/scripting.html b/clones/lispcookbook.github.io/cl-cookbook/scripting.html new file mode 100644 index 00000000..e1e41ae2 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/scripting.html @@ -0,0 +1,595 @@ + + + + + Scripting. Command line arguments. Executables. + + + + + + + + + + + + + + +

                                                              The Common Lisp Cookbook – Scripting. Command line arguments. Executables.

                                                              +
                                                              + + + + +
                                                              +
                                                              + +
                                                              +
                                                              + +
                                                              +
                                                              Table of Contents
                                                              +
                                                                +
                                                                +
                                                                + +
                                                                +

                                                                The Common Lisp Cookbook – Scripting. Command line arguments. Executables.

                                                                + + +

                                                                + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                +

                                                                + 📕 Get the EPUB and PDF +

                                                                + + +
                                                                Using a program from a REPL is fine and well, but if we want to +distribute our program easily, we’ll want to build an executable.

                                                                + +

                                                                Lisp implementations differ in their processes, but they all create +self-contained executables, for the architecture they are built on. The +final user doesn’t need to install a Lisp implementation, he can run +the software right away.

                                                                + +

                                                                Start-up times are near to zero, specially with SBCL and CCL.

                                                                + +

                                                                Binaries size are large-ish. They include the whole Lisp +including its libraries, the names of all symbols, information about +argument lists to functions, the compiler, the debugger, source code +location information, and more.

                                                                + +

                                                                Note that we can similarly build self-contained executables for web apps.

                                                                + +

                                                                Building a self-contained executable

                                                                + +

                                                                With SBCL - Images and Executables

                                                                + +

                                                                How to build (self-contained) executables is, by default, implementation-specific (see +below for portable ways). With SBCL, as says +its documentation, +it is a matter of calling save-lisp-and-die with the executable argument to T:

                                                                + +
                                                                (sb-ext:save-lisp-and-die #P"path/name-of-executable" :toplevel #'my-app:main-function :executable t)
                                                                +
                                                                + +

                                                                sb-ext is an SBCL extension to run external processes. See other +SBCL extensions +(many of them are made implementation-portable in other libraries).

                                                                + +

                                                                :executable t tells to build an executable instead of an +image. We could build an image to save the state of our current +Lisp image, to come back working with it later. This is especially useful if +we made a lot of work that is computing intensive. +In that case, we re-use the image with sbcl --core name-of-image.

                                                                + +

                                                                :toplevel gives the program’s entry point, here my-app:main-function. Don’t forget to export the symbol, or use my-app::main-function (with two colons).

                                                                + +

                                                                If you try to run this in Slime, you’ll get an error about threads running:

                                                                + +
                                                                +

                                                                Cannot save core with multiple threads running.

                                                                +
                                                                + +

                                                                So we must run the command from a simple SBCL repl.

                                                                + +

                                                                I suppose your project has Quicklisp dependencies. You must then:

                                                                + +
                                                                  +
                                                                • ensure Quicklisp is installed and loaded at the Lisp startup (you +completed Quicklisp installation),
                                                                • +
                                                                • load the project’s .asd,
                                                                • +
                                                                • install the dependencies,
                                                                • +
                                                                • build the executable.
                                                                • +
                                                                + +

                                                                That gives:

                                                                + +
                                                                (load "my-app.asd")
                                                                +(ql:quickload "my-app")
                                                                +(sb-ext:save-lisp-and-die #p"my-app-binary" :toplevel #'my-app:main :executable t)
                                                                +
                                                                + +

                                                                From the command line, or from a Makefile, use --load and --eval:

                                                                + +
                                                                build:
                                                                +	sbcl --load my-app.asd \
                                                                +	     --eval '(ql:quickload :my-app)' \
                                                                +         --eval "(sb-ext:save-lisp-and-die #p\"my-app\" :toplevel #'my-app:main :executable t)"
                                                                +
                                                                + +

                                                                With ASDF

                                                                + +

                                                                Now that we’ve seen the basics, we need a portable method. Since its +version 3.1, ASDF allows to do that. It introduces the make command, +that reads parameters from the .asd. Add this to your .asd declaration:

                                                                + +
                                                                :build-operation "program-op" ;; leave as is
                                                                +:build-pathname "<binary-name>"
                                                                +:entry-point "<my-package:main-function>"
                                                                +
                                                                + +

                                                                and call asdf:make :my-package.

                                                                + +

                                                                So, in a Makefile:

                                                                + +
                                                                LISP ?= sbcl
                                                                +
                                                                +build:
                                                                +    $(LISP) --load my-app.asd \
                                                                +    	--eval '(ql:quickload :my-app)' \
                                                                +		--eval '(asdf:make :my-app)' \
                                                                +		--eval '(quit)'
                                                                +
                                                                + +

                                                                With Roswell or Buildapp

                                                                + +

                                                                Roswell, an implementation manager, script launcher and +much more, has the ros build command, that should work for many +implementations.

                                                                + +

                                                                This is how we can make our application easily installable by others, with a ros install +my-app. See Roswell’s documentation.

                                                                + +

                                                                Be aware that ros build adds core compression by default. That adds +a significant startup overhead of the order of 150ms (for a simple +app, startup time went from about 30ms to 180ms). You can disable it +with ros build <app.ros> --disable-compression. Of course, core +compression reduces your binary size significantly. See the table +below, “Size and startup times of executables per implementationâ€.

                                                                + +

                                                                We’ll finish with a word on +Buildapp, a battle-tested and +still popular “application for SBCL or CCL that configures and saves +an executable Common Lisp imageâ€.

                                                                + +

                                                                Example usage:

                                                                + +
                                                                buildapp --output myapp \
                                                                +         --asdf-path . \
                                                                +         --asdf-tree ~/quicklisp/dists \
                                                                +         --load-system my-app \
                                                                +         --entry my-app:main
                                                                +
                                                                + +

                                                                Many applications use it (for example, +pgloader), it is available on +Debian: apt install buildapp, but you shouldn’t need it now with asdf:make or Roswell.

                                                                + +

                                                                For web apps

                                                                + +

                                                                We can similarly build a self-contained executable for our web appplication. It +would thus contain a web server and would be able to run on the +command line:

                                                                + +
                                                                $ ./my-web-app
                                                                +Hunchentoot server is started.
                                                                +Listening on localhost:9003.
                                                                +
                                                                + +

                                                                Note that this runs the production webserver, not a development one, +so we can run the binary on our VPS right away and access the application from +the outside.

                                                                + +

                                                                We have one thing to take care of, it is to find and put the thread of +the running web server on the foreground. In our main function, we +can do something like this:

                                                                + +
                                                                (defun main ()
                                                                +  (start-app :port 9003) ;; our start-app, for example clack:clack-up
                                                                +  ;; let the webserver run.
                                                                +  ;; warning: hardcoded "hunchentoot".
                                                                +  (handler-case (bt:join-thread (find-if (lambda (th)
                                                                +                                            (search "hunchentoot" (bt:thread-name th)))
                                                                +                                         (bt:all-threads)))
                                                                +    ;; Catch a user's C-c
                                                                +    (#+sbcl sb-sys:interactive-interrupt
                                                                +      #+ccl  ccl:interrupt-signal-condition
                                                                +      #+clisp system::simple-interrupt-condition
                                                                +      #+ecl ext:interactive-interrupt
                                                                +      #+allegro excl:interrupt-signal
                                                                +      () (progn
                                                                +           (format *error-output* "Aborting.~&")
                                                                +           (clack:stop *server*)
                                                                +           (uiop:quit)))
                                                                +    (error (c) (format t "Woops, an unknown error occured:~&~a~&" c))))
                                                                +
                                                                + +

                                                                We used the bordeaux-threads library ((ql:quickload +"bordeaux-threads"), alias bt) and uiop, which is part of ASDF so +already loaded, in order to exit in a portable way (uiop:quit, with +an optional return code, instead of sb-ext:quit).

                                                                + +

                                                                Size and startup times of executables per implementation

                                                                + +

                                                                SBCL isn’t the only Lisp implementation. +ECL, Embeddable +Common Lisp, transpiles Lisp programs to C. That creates a smaller +executable.

                                                                + +

                                                                According to +this reddit source, ECL produces indeed the smallest executables of all, +an order of magnitude smaller than SBCL, but with a longer startup time.

                                                                + +

                                                                CCL’s binaries seem to be as fast to start up as SBCL and nearly half the size.

                                                                + +
                                                                | program size | implementation |  CPU | startup time |
                                                                +|--------------+----------------+------+--------------|
                                                                +|           28 | /bin/true      |  15% |        .0004 |
                                                                +|         1005 | ecl            | 115% |        .5093 |
                                                                +|        48151 | sbcl           |  91% |        .0064 |
                                                                +|        27054 | ccl            |  93% |        .0060 |
                                                                +|        10162 | clisp          |  96% |        .0170 |
                                                                +|         4901 | ecl.big        | 113% |        .8223 |
                                                                +|        70413 | sbcl.big       |  93% |        .0073 |
                                                                +|        41713 | ccl.big        |  95% |        .0094 |
                                                                +|        19948 | clisp.big      |  97% |        .0259 |
                                                                +
                                                                + +

                                                                You’ll also want to investigate the proprietary Lisps’ tree shakers capabilities.

                                                                + +

                                                                Regarding compilation times, CCL is famous for being fast in that regards. +ECL is more involved and takes the longer to compile of these three implementations.

                                                                + +

                                                                Building a smaller binary with SBCL’s core compression

                                                                + +

                                                                Building with SBCL’s core compression can dramatically reduce your +application binary’s size. In our case, we passed from 120MB to 23MB, +for a loss of a dozen milliseconds of start-up time, which was still +under 50ms!

                                                                + +

                                                                Your SBCL must be built with core compression, see the documentation: http://www.sbcl.org/manual/#Saving-a-Core-Image

                                                                + +

                                                                Is it the case ?

                                                                + +
                                                                (find :sb-core-compression *features*)
                                                                +:SB-CORE-COMPRESSION
                                                                +
                                                                + +

                                                                Yes, it is the case with this SBCL installed from Debian.

                                                                + +

                                                                With SBCL

                                                                + +

                                                                In SBCL, we would give an argument to save-lisp-and-die, where +:compression

                                                                + +
                                                                +

                                                                may be an integer from -1 to 9, corresponding to zlib compression levels, or t (which is equivalent to the default compression level, -1).

                                                                +
                                                                + +

                                                                We experienced a 1MB difference between levels -1 and 9.

                                                                + +

                                                                With ASDF

                                                                + +

                                                                However, we prefer to do this with ASDF (or rather, UIOP). Add this in your .asd:

                                                                + +
                                                                #+sb-core-compression
                                                                +(defmethod asdf:perform ((o asdf:image-op) (c asdf:system))
                                                                +  (uiop:dump-image (asdf:output-file o c) :executable t :compression t))
                                                                +
                                                                + +

                                                                With Deploy

                                                                + +

                                                                Also, the Deploy library can be used +to build a fully standalone application. It will use compression if available.

                                                                + +

                                                                Deploy is specifically geared towards applications with foreign +library dependencies. It collects all the foreign shared libraries of +dependencies, such as libssl.so in the bin subdirectory.

                                                                + +

                                                                And voilà !

                                                                + +

                                                                Parsing command line arguments

                                                                + +

                                                                SBCL stores the command line arguments into sb-ext:*posix-argv*.

                                                                + +

                                                                But that variable name differs from implementations, so we want a +way to handle the differences for us.

                                                                + +

                                                                We have uiop:command-line-arguments, shipped in ASDF and included in +nearly all implementations. +From anywhere in your code, you can simply check if a given string is present in this list:

                                                                + +
                                                                (member "-h" (uiop:command-line-arguments) :test #'string-equal)
                                                                +
                                                                + +

                                                                That’s good, but we also want to parse the arguments, have facilities to check short and long options, build a help message automatically, etc.

                                                                + +

                                                                A quick look at the +awesome-cl#scripting +list made us choose the +unix-opts library.

                                                                + +
                                                                (ql:quickload "unix-opts")
                                                                +
                                                                + +

                                                                We can call it with its opts alias (a global nickname).

                                                                + +

                                                                As often work happens in two phases:

                                                                + +
                                                                  +
                                                                • declaring the options that our application accepts, their optional argument, defining their type +(string, integer,…), their long and short names, and the required ones
                                                                • +
                                                                • parsing them (and handling missing or malformed parameters).
                                                                • +
                                                                + +

                                                                Declaring arguments

                                                                + +

                                                                We define the arguments with opts:define-opts:

                                                                + +
                                                                (opts:define-opts
                                                                +    (:name :help
                                                                +           :description "print this help text"
                                                                +           :short #\h
                                                                +           :long "help")
                                                                +    (:name :nb
                                                                +           :description "here we want a number argument"
                                                                +           :short #\n
                                                                +           :long "nb"
                                                                +           :arg-parser #'parse-integer) ;; <- takes an argument
                                                                +    (:name :info
                                                                +           :description "info"
                                                                +           :short #\i
                                                                +           :long "info"))
                                                                +
                                                                + +

                                                                Here parse-integer is a built-in CL function. If the argument you expect is a string, you don’t have to define an arg-parser.

                                                                + +

                                                                Here is an example output on the command line after we build and run a binary of our application. The help message was auto-generated:

                                                                + +
                                                                $ my-app -h
                                                                +my-app. Usage:
                                                                +
                                                                +Available options:
                                                                +  -h, --help               print this help text
                                                                +  -n, --nb ARG             here we want a number argument
                                                                +  -i, --info               info
                                                                +
                                                                + +

                                                                Parsing

                                                                + +

                                                                We parse and get the arguments with opts:get-opts, which returns two +values: the list of valid options and the remaining free arguments. We +then must use multiple-value-bind to assign both into variables:

                                                                + +
                                                                  (multiple-value-bind (options free-args)
                                                                +      ;; There is no error handling yet.
                                                                +      (opts:get-opts)
                                                                +      ...
                                                                +
                                                                + +

                                                                We can test this by giving a list of strings to get-opts:

                                                                + +
                                                                (multiple-value-bind (options free-args)
                                                                +                   (opts:get-opts '("hello" "-h" "-n" "1"))
                                                                +                 (format t "Options: ~a~&" options)
                                                                +                 (format t "free args: ~a~&" free-args))
                                                                +Options: (HELP T NB-RESULTS 1)
                                                                +free args: (hello)
                                                                +NIL
                                                                +
                                                                + +

                                                                If we put an unknown option, we get into the debugger. We’ll see +error handling in a moment.

                                                                + +

                                                                So options is a +property list. We +use getf and setf with plists, so that’s how we do our +logic. Below we print the help with opts:describe and then we quit +(in a portable way).

                                                                + +
                                                                  (multiple-value-bind (options free-args)
                                                                +      (opts:get-opts)
                                                                +
                                                                +    (if (getf options :help)
                                                                +        (progn
                                                                +          (opts:describe
                                                                +           :prefix "You're in my-app. Usage:"
                                                                +           :args "[keywords]") ;; to replace "ARG" in "--nb ARG"
                                                                +          (uiop:quit)))
                                                                +    (if (getf options :nb)
                                                                +       ...)
                                                                +
                                                                + +

                                                                For a full example, see its +official example +and +cl-torrents’ tutorial.

                                                                + +

                                                                The example in the unix-opts repository suggests a macro to do +slightly better. Now to error handling.

                                                                + +

                                                                Handling malformed or missing arguments

                                                                + +

                                                                There are 4 situations that unix-opts doesn’t handle, but signals +conditions for us to take care of:

                                                                + +
                                                                  +
                                                                • when it sees an unknown argument, an unknown-option condition is signaled.
                                                                • +
                                                                • when an argument is missing, it signals a missing-arg condition.
                                                                • +
                                                                • when it can’t parse an argument, it signals arg-parser-failed. For example, if it expected an integer but got text.
                                                                • +
                                                                • when it doesn’t see a required option, it signals missing-required-option.
                                                                • +
                                                                + +

                                                                So, we must create simple functions to handle those conditions, and +surround the parsing of the options with an handler-bind form:

                                                                + +
                                                                  (multiple-value-bind (options free-args)
                                                                +      (handler-bind ((opts:unknown-option #'unknown-option) ;; the condition / our function
                                                                +                     (opts:missing-arg #'missing-arg)
                                                                +                     (opts:arg-parser-failed #'arg-parser-failed)
                                                                +                     (opts:missing-required-option))
                                                                +         (opts:get-opts))
                                                                +    …
                                                                +    ;; use "options" and "free-args"
                                                                +
                                                                + +

                                                                Here we suppose we want one function to handle each case, but it could +be a simple one. They take the condition as argument.

                                                                + +
                                                                (defun handle-arg-parser-condition (condition)
                                                                +  (format t "Problem while parsing option ~s: ~a .~%" (opts:option condition) ;; reader to get the option from the condition.
                                                                +                                                       condition)
                                                                +  (opts:describe) ;; print help
                                                                +  (uiop:quit 1))
                                                                +
                                                                + +

                                                                For more about condition handling, see error and condition handling.

                                                                + +

                                                                Catching a C-c termination signal

                                                                + +

                                                                Let’s build a simple binary, run it, try a C-c and read the stacktrace:

                                                                + +
                                                                $ ./my-app
                                                                +sleep…
                                                                +^C
                                                                +debugger invoked on a SB-SYS:INTERACTIVE-INTERRUPT in thread   <== condition name
                                                                +#<THREAD "main thread" RUNNING {1003156A03}>:
                                                                +  Interactive interrupt at #x7FFFF6C6C170.
                                                                +
                                                                +Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
                                                                +
                                                                +restarts (invokable by number or by possibly-abbreviated name):
                                                                +  0: [CONTINUE     ] Return from SB-UNIX:SIGINT.               <== it was a SIGINT indeed
                                                                +  1: [RETRY-REQUEST] Retry the same request.
                                                                +
                                                                + +

                                                                The signaled condition is named after our implementation: +sb-sys:interactive-interrupt. We just have to surround our +application code with a handler-case:

                                                                + +
                                                                (handler-case
                                                                +    (run-my-app free-args)
                                                                +  (sb-sys:interactive-interrupt () (progn
                                                                +                                     (format *error-output* "Abort.~&")
                                                                +                                     (opts:exit))))
                                                                +
                                                                + +

                                                                This code is only for SBCL though. We know about +trivial-signal, +but we were not satisfied with our test yet. So we can use something +like this:

                                                                + +
                                                                (handler-case
                                                                +    (run-my-app free-args)
                                                                +  (#+sbcl sb-sys:interactive-interrupt
                                                                +   #+ccl  ccl:interrupt-signal-condition
                                                                +   #+clisp system::simple-interrupt-condition
                                                                +   #+ecl ext:interactive-interrupt
                                                                +   #+allegro excl:interrupt-signal
                                                                +   ()
                                                                +   (opts:exit)))
                                                                +
                                                                + +

                                                                here #+ includes the line at compile time depending on +the implementation. There’s also #-. What #+ does is to look for +symbols in the *features* list. We can also combine symbols with +and, or and not.

                                                                + +

                                                                Continuous delivery of executables

                                                                + +

                                                                We can make a Continuous Integration system (Travis CI, Gitlab CI,…) +build binaries for us at every commit, or at every tag pushed or at +whichever other policy.

                                                                + +

                                                                See Continuous Integration.

                                                                + +

                                                                Credit

                                                                + + + + +

                                                                + Page source: scripting.md +

                                                                +
                                                                + + + + + +
                                                                +
                                                                +
                                                                + © 2002–2021 the Common Lisp Cookbook Project +
                                                                + +
                                                                +
                                                                T
                                                                O
                                                                C
                                                                +
                                                                + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/simple-restarts.png b/clones/lispcookbook.github.io/cl-cookbook/simple-restarts.png new file mode 100644 index 0000000000000000000000000000000000000000..2ffb3a9a7f5333abb2bbb5706cab89678930a0bb GIT binary patch literal 35627 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

                                                                wvn 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 z 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 literal 0 HcmV?d00001 diff --git a/clones/lispcookbook.github.io/cl-cookbook/sockets.html b/clones/lispcookbook.github.io/cl-cookbook/sockets.html new file mode 100644 index 00000000..fe8fcfa8 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/sockets.html @@ -0,0 +1,270 @@ + + + + + TCP/UDP programming with sockets + + + + + + + + + + + + + + +

                                                                The Common Lisp Cookbook – TCP/UDP programming with sockets

                                                                +
                                                                + + + + +
                                                                +
                                                                + +
                                                                +
                                                                + +
                                                                +
                                                                Table of Contents
                                                                +
                                                                  +
                                                                  +
                                                                  + +
                                                                  +

                                                                  The Common Lisp Cookbook – TCP/UDP programming with sockets

                                                                  + + +

                                                                  + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                  +

                                                                  + 📕 Get the EPUB and PDF +

                                                                  + + +
                                                                  This is a short guide to TCP/IP and UDP/IP client/server programming in Common +Lisp using usockets.

                                                                  + +

                                                                  TCP/IP

                                                                  + +

                                                                  As usual, we will use quicklisp to load usocket.

                                                                  + +
                                                                  (ql:quickload "usocket")
                                                                  +
                                                                  + +

                                                                  Now we need to create a server. There are 2 primary functions that we need +to call. usocket:socket-listen and usocket:socket-accept.

                                                                  + +

                                                                  usocket:socket-listen binds to a port and listens on it. It returns a socket +object. We need to wait with this object until we get a connection that we +accept. That’s where usocket:socket-accept comes in. It’s a blocking call +that returns only when a connection is made. This returns a new socket object +that is specific to that connection. We can then use that connection to +communicate with our client.

                                                                  + +

                                                                  So, what were the problems I faced due to my mistakes? +Mistake 1 - My initial understanding was that socket-accept would return +a stream object. NO…. It returns a socket object. In hindsight, its correct +and my own mistake cost me time. So, if you want to write to the socket, you +need to actually get the corresponding stream from this new socket. The socket +object has a stream slot and we need to explicitly use that. And how does one +know that? (describe connection) is your friend!

                                                                  + +

                                                                  Mistake 2 - You need to close both the new socket and the server socket. +Again this is pretty obvious but since my initial code was only closing +the connection, I kept running into a socket in use problem. Of course +one more option is to reuse the socket when we listen.

                                                                  + +

                                                                  Once you get past these mistakes, it’s pretty easy to do the rest. Close +the connections and the server socket and boom you are done!

                                                                  + +
                                                                  (defun create-server (port)
                                                                  +  (let* ((socket (usocket:socket-listen "127.0.0.1" port))
                                                                  +	 (connection (usocket:socket-accept socket :element-type 'character)))
                                                                  +    (unwind-protect
                                                                  +        (progn
                                                                  +	      (format (usocket:socket-stream connection) "Hello World~%")
                                                                  +	      (force-output (usocket:socket-stream connection)))
                                                                  +      (progn
                                                                  +	    (format t "Closing sockets~%")
                                                                  +	    (usocket:socket-close connection)
                                                                  +        (usocket:socket-close socket)))))
                                                                  +
                                                                  + +

                                                                  Now for the client. This part is easy. Just connect to the server port +and you should be able to read from the server. The only silly mistake I +made here was to use read and not read-line. So, I ended up seeing only a +“Hello†from the server. I went for a walk and came back to find the issue +and fix it.

                                                                  + +
                                                                  (defun create-client (port)
                                                                  +  (usocket:with-client-socket (socket stream "127.0.0.1" port :element-type 'character)
                                                                  +    (unwind-protect
                                                                  +         (progn
                                                                  +           (usocket:wait-for-input socket)
                                                                  +           (format t "Input is: ~a~%" (read-line stream)))
                                                                  +      (usocket:socket-close socket))))
                                                                  +
                                                                  + +

                                                                  So, how do you run this? You need two REPLs, one for the server +and one for the client. Load this file in both REPLs. Create the +server in the first REPL.

                                                                  + +
                                                                  (create-server 12321)
                                                                  +
                                                                  + +

                                                                  Now you are ready to run the client on the second REPL

                                                                  + +
                                                                  (create-client 12321)
                                                                  +
                                                                  + +

                                                                  Voilà! You should see “Hello World†on the second REPL.

                                                                  + +

                                                                  UDP/IP

                                                                  + +

                                                                  As a protocol, UDP is connection-less, and therefore there is no +concept of binding and accepting a connection. Instead we only do a +socket-connect but pass a specific set of parameters to make sure that +we create an UDP socket that’s waiting for data on a particular port.

                                                                  + +

                                                                  So, what were the problems I faced due to my mistakes? +Mistake 1 - Unlike TCP, you don’t pass host and port to socket-connect. +If you do that, then you are indicating that you want to send a packet. +Instead, you pass nil but you set :local-host and :local-port to the address +and port that you want to receive data on. This part took some time to +figure out, because the documentation didn’t cover it. Instead reading +a bit of code from +https://code.google.com/p/blackthorn-engine-3d/source/browse/src/examples/usocket/usocket.lisp helped a lot.

                                                                  + +

                                                                  Also, since UDP is connectionless, anyone can send data to it at any +time. So, we need to know which host/port did we get data from so +that we can respond on it. So we bind multiple values to socket-receive +and use those values to send back data to our peer “clientâ€.

                                                                  + +
                                                                  (defun create-server (port buffer)
                                                                  +  (let* ((socket (usocket:socket-connect nil nil
                                                                  +					:protocol :datagram
                                                                  +					:element-type '(unsigned-byte 8)
                                                                  +					:local-host "127.0.0.1"
                                                                  +					:local-port port)))
                                                                  +    (unwind-protect
                                                                  +	 (multiple-value-bind (buffer size client receive-port)
                                                                  +	     (usocket:socket-receive socket buffer 8)
                                                                  +	   (format t "~A~%" buffer)
                                                                  +	   (usocket:socket-send socket (reverse buffer) size
                                                                  +				:port receive-port
                                                                  +				:host client))
                                                                  +      (usocket:socket-close socket))))
                                                                  +
                                                                  + +

                                                                  Now for the sender/receiver. This part is pretty easy. Create a socket, +send data on it and receive data back.

                                                                  + +
                                                                  (defun create-client (port buffer)
                                                                  +  (let ((socket (usocket:socket-connect "127.0.0.1" port
                                                                  +					 :protocol :datagram
                                                                  +					 :element-type '(unsigned-byte 8))))
                                                                  +    (unwind-protect
                                                                  +	 (progn
                                                                  +	   (format t "Sending data~%")
                                                                  +	   (replace buffer #(1 2 3 4 5 6 7 8))
                                                                  +	   (format t "Receiving data~%")
                                                                  +	   (usocket:socket-send socket buffer 8)
                                                                  +	   (usocket:socket-receive socket buffer 8)
                                                                  +	   (format t "~A~%" buffer))
                                                                  +      (usocket:socket-close socket))))
                                                                  +
                                                                  + +

                                                                  So, how do you run this? You need again two REPLs, one for the server +and one for the client. Load this file in both REPLs. Create the +server in the first REPL.

                                                                  + +
                                                                  (create-server 12321 (make-array 8 :element-type '(unsigned-byte 8)))
                                                                  +
                                                                  + +

                                                                  Now you are ready to run the client on the second REPL

                                                                  + +
                                                                  (create-client 12321 (make-array 8 :element-type '(unsigned-byte 8)))
                                                                  +
                                                                  + +

                                                                  Voilà! You should see a vector #(1 2 3 4 5 6 7 8) on the first REPL +and #(8 7 6 5 4 3 2 1) on the second one.

                                                                  + +

                                                                  Credit

                                                                  + +

                                                                  This guide originally comes from https://gist.github.com/shortsightedsid/71cf34282dfae0dd2528

                                                                  + + +

                                                                  + Page source: sockets.md +

                                                                  +
                                                                  + + + + + +
                                                                  +
                                                                  +
                                                                  + © 2002–2021 the Common Lisp Cookbook Project +
                                                                  + +
                                                                  +
                                                                  T
                                                                  O
                                                                  C
                                                                  +
                                                                  + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/strings.html b/clones/lispcookbook.github.io/cl-cookbook/strings.html new file mode 100644 index 00000000..0991233f --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/strings.html @@ -0,0 +1,1229 @@ + + + + + Strings + + + + + + + + + + + + + + +

                                                                  The Common Lisp Cookbook – Strings

                                                                  +
                                                                  + + + + +
                                                                  +
                                                                  + +
                                                                  +
                                                                  + +
                                                                  +
                                                                  Table of Contents
                                                                  +
                                                                    +
                                                                    +
                                                                    + +
                                                                    +

                                                                    The Common Lisp Cookbook – Strings

                                                                    + + +

                                                                    + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                    +

                                                                    + 📕 Get the EPUB and PDF +

                                                                    + + +
                                                                    The most important thing to know about strings in Common Lisp is probably that +they are arrays and thus also sequences. This implies that all concepts that are +applicable to arrays and sequences also apply to strings. If you can’t find a +particular string function, make sure you’ve also searched for the more general +array or sequence functions. We’ll only cover a fraction of what can be done +with and to strings here.

                                                                    + +

                                                                    ASDF3, which is included with almost all Common Lisp implementations, +includes +Utilities for Implementation- and OS- Portability (UIOP), +which defines functions to work on strings (strcat, +string-prefix-p, string-enclosed-p, first-char, last-char, +split-string, stripln).

                                                                    + +

                                                                    Some external libraries available on Quicklisp bring some more +functionality or some shorter ways to do.

                                                                    + +
                                                                      +
                                                                    • str defines trim, words, +unwords, lines, unlines, concat, split, shorten, repeat, +replace-all, starts-with?, ends-with?, blankp, emptyp, …
                                                                    • +
                                                                    • Serapeum is a large set of utilities with many string manipulation functions.
                                                                    • +
                                                                    • cl-change-case +has functions to convert strings between camelCase, param-case, +snake_case and more. They are also included into str.
                                                                    • +
                                                                    • mk-string-metrics +has functions to calculate various string metrics efficiently +(Damerau-Levenshtein, Hamming, Jaro, Jaro-Winkler, Levenshtein, etc),
                                                                    • +
                                                                    • and cl-ppcre can come in handy, for example +ppcre:replace-regexp-all. See the regexp section.
                                                                    • +
                                                                    + +

                                                                    Last but not least, when you’ll need to tackle the format construct, +don’t miss the following resources:

                                                                    + + + +

                                                                    Creating strings

                                                                    + +

                                                                    A string is created with double quotes, all right, but we can recall +these other ways:

                                                                    + +
                                                                      +
                                                                    • using format nil doesn’t print but returns a new string (see +more examples of format below):
                                                                    • +
                                                                    + +
                                                                    (defparameter *person* "you")
                                                                    +(format nil "hello ~a" *person*) ;; => "hello you"
                                                                    +
                                                                    + +
                                                                      +
                                                                    • make-string count creates a string of the given length. The +:initial-element character is repeated count times:
                                                                    • +
                                                                    + +
                                                                    (make-string 3 :initial-element #\♥) ;; => "♥♥♥"
                                                                    +
                                                                    + +

                                                                    Accessing Substrings

                                                                    + +

                                                                    As a string is a sequence, you can access substrings with the SUBSEQ +function. The index into the string is, as always, zero-based. The third, +optional, argument is the index of the first character which is not a part of +the substring, it is not the length of the substring.

                                                                    + +
                                                                    * (defparameter *my-string* (string "Groucho Marx"))
                                                                    +*MY-STRING*
                                                                    +* (subseq *my-string* 8)
                                                                    +"Marx"
                                                                    +* (subseq *my-string* 0 7)
                                                                    +"Groucho"
                                                                    +* (subseq *my-string* 1 5)
                                                                    +"rouc"
                                                                    +
                                                                    + +

                                                                    You can also manipulate the substring if you use SUBSEQ together with SETF.

                                                                    + +
                                                                    * (defparameter *my-string* (string "Harpo Marx"))
                                                                    +*MY-STRING*
                                                                    +* (subseq *my-string* 0 5)
                                                                    +"Harpo"
                                                                    +* (setf (subseq *my-string* 0 5) "Chico")
                                                                    +"Chico"
                                                                    +* *my-string*
                                                                    +"Chico Marx"
                                                                    +
                                                                    + +

                                                                    But note that the string isn’t “stretchableâ€. To cite from the HyperSpec: “If +the subsequence and the new sequence are not of equal length, the shorter length +determines the number of elements that are replaced.†For example:

                                                                    + +
                                                                    * (defparameter *my-string* (string "Karl Marx"))
                                                                    +*MY-STRING*
                                                                    +* (subseq *my-string* 0 4)
                                                                    +"Karl"
                                                                    +* (setf (subseq *my-string* 0 4) "Harpo")
                                                                    +"Harpo"
                                                                    +* *my-string*
                                                                    +"Harp Marx"
                                                                    +* (subseq *my-string* 4)
                                                                    +" Marx"
                                                                    +* (setf (subseq *my-string* 4) "o Marx")
                                                                    +"o Marx"
                                                                    +* *my-string*
                                                                    +"Harpo Mar"
                                                                    +
                                                                    + +

                                                                    Accessing Individual Characters

                                                                    + +

                                                                    You can use the function CHAR to access individual characters of a string. CHAR +can also be used in conjunction with SETF.

                                                                    + +
                                                                    * (defparameter *my-string* (string "Groucho Marx"))
                                                                    +*MY-STRING*
                                                                    +* (char *my-string* 11)
                                                                    +#\x
                                                                    +* (char *my-string* 7)
                                                                    +#\Space
                                                                    +* (char *my-string* 6)
                                                                    +#\o
                                                                    +* (setf (char *my-string* 6) #\y)
                                                                    +#\y
                                                                    +* *my-string*
                                                                    +"Grouchy Marx"
                                                                    +
                                                                    + +

                                                                    Note that there’s also SCHAR. If efficiency is important, SCHAR can be a bit +faster where appropriate.

                                                                    + +

                                                                    Because strings are arrays and thus sequences, you can also use the more generic +functions AREF and ELT (which are more general while CHAR might be implemented +more efficiently).

                                                                    + +
                                                                    * (defparameter *my-string* (string "Groucho Marx"))
                                                                    +*MY-STRING*
                                                                    +* (aref *my-string* 3)
                                                                    +#\u
                                                                    +* (elt *my-string* 8)
                                                                    +#\M
                                                                    +
                                                                    + +

                                                                    Each character in a string has an integer code. The range of recognized codes +and Lisp’s ability to print them is directed related to your implementation’s +character set support, e.g. ISO-8859-1, or Unicode. Here are some examples in +SBCL of UTF-8 which encodes characters as 1 to 4 8 bit bytes. The first example +shows a character outside the first 128 chars, or what is considered the normal +Latin character set. The second example shows a multibyte encoding (beyond the +value 255). Notice the Lisp reader can round-trip characters by name.

                                                                    + +
                                                                    * (stream-external-format *standard-output*)
                                                                    +
                                                                    +:UTF-8
                                                                    +* (code-char 200)
                                                                    +
                                                                    +#\LATIN_CAPITAL_LETTER_E_WITH_GRAVE
                                                                    +* (char-code #\LATIN_CAPITAL_LETTER_E_WITH_GRAVE)
                                                                    +
                                                                    +200
                                                                    +* (code-char 1488)
                                                                    +#\HEBREW_LETTER_ALEF
                                                                    +
                                                                    +* (char-code #\HEBREW_LETTER_ALEF)
                                                                    +1488
                                                                    +
                                                                    + +

                                                                    Check out the UTF-8 Wikipedia article for the range of supported characters and +their encodings.

                                                                    + +

                                                                    Remove or replace characters from a string

                                                                    + +

                                                                    There’s a slew of (sequence) functions that can be used to manipulate a string +and we’ll only provide some examples here. See the sequences dictionary in the +HyperSpec for more.

                                                                    + +

                                                                    remove one character from a string:

                                                                    + +
                                                                    * (remove #\o "Harpo Marx")
                                                                    +"Harp Marx"
                                                                    +* (remove #\a "Harpo Marx")
                                                                    +"Hrpo Mrx"
                                                                    +* (remove #\a "Harpo Marx" :start 2)
                                                                    +"Harpo Mrx"
                                                                    +* (remove-if #'upper-case-p "Harpo Marx")
                                                                    +"arpo arx"
                                                                    +
                                                                    + +

                                                                    Replace one character with substitute (non destructive) or replace (destructive):

                                                                    + +
                                                                    * (substitute #\u #\o "Groucho Marx")
                                                                    +"Gruuchu Marx"
                                                                    +* (substitute-if #\_ #'upper-case-p "Groucho Marx")
                                                                    +"_roucho _arx"
                                                                    +* (defparameter *my-string* (string "Zeppo Marx"))
                                                                    +*MY-STRING*
                                                                    +* (replace *my-string* "Harpo" :end1 5)
                                                                    +"Harpo Marx"
                                                                    +* *my-string*
                                                                    +"Harpo Marx"
                                                                    +
                                                                    + +

                                                                    Concatenating Strings

                                                                    + +

                                                                    The name says it all: CONCATENATE is your friend. Note that this is a generic +sequence function and you have to provide the result type as the first argument.

                                                                    + +
                                                                    * (concatenate 'string "Karl" " " "Marx")
                                                                    +"Karl Marx"
                                                                    +* (concatenate 'list "Karl" " " "Marx")
                                                                    +(#\K #\a #\r #\l #\Space #\M #\a #\r #\x)
                                                                    +
                                                                    + +

                                                                    With UIOP, use strcat:

                                                                    + +
                                                                    * (uiop:strcat "karl" " " marx")
                                                                    +
                                                                    + +

                                                                    or with the library str, use concat:

                                                                    + +
                                                                    * (str:concat "foo" "bar")
                                                                    +
                                                                    + +

                                                                    If you have to construct a string out of many parts, all of these calls to +CONCATENATE seem wasteful, though. There are at least three other good ways to +construct a string piecemeal, depending on what exactly your data is. If you +build your string one character at a time, make it an adjustable VECTOR (a +one-dimensional ARRAY) of type character with a fill-pointer of zero, then use +VECTOR-PUSH-EXTEND on it. That way, you can also give hints to the system if you +can estimate how long the string will be. (See the optional third argument to +VECTOR-PUSH-EXTEND.)

                                                                    + +
                                                                    * (defparameter *my-string* (make-array 0
                                                                    +                                        :element-type 'character
                                                                    +                                        :fill-pointer 0
                                                                    +                                        :adjustable t))
                                                                    +*MY-STRING*
                                                                    +* *my-string*
                                                                    +""
                                                                    +* (dolist (char '(#\Z #\a #\p #\p #\a))
                                                                    +    (vector-push-extend char *my-string*))
                                                                    +NIL
                                                                    +* *my-string*
                                                                    +"Zappa"
                                                                    +
                                                                    + +

                                                                    If the string will be constructed out of (the printed representations of) +arbitrary objects, (symbols, numbers, characters, strings, …), you can use +FORMAT with an output stream argument of NIL. This directs FORMAT to return the +indicated output as a string.

                                                                    + +
                                                                    * (format nil "This is a string with a list ~A in it"
                                                                    +          '(1 2 3))
                                                                    +"This is a string with a list (1 2 3) in it"
                                                                    +
                                                                    + +

                                                                    We can use the looping constructs of the FORMAT mini language to emulate +CONCATENATE.

                                                                    + +
                                                                    * (format nil "The Marx brothers are:~{ ~A~}."
                                                                    +          '("Groucho" "Harpo" "Chico" "Zeppo" "Karl"))
                                                                    +"The Marx brothers are: Groucho Harpo Chico Zeppo Karl."
                                                                    +
                                                                    + +

                                                                    FORMAT can do a lot more processing but it has a relatively arcane syntax. After +this last example, you can find the details in the CLHS section about formatted +output.

                                                                    + +
                                                                    * (format nil "The Marx brothers are:~{ ~A~^,~}."
                                                                    +          '("Groucho" "Harpo" "Chico" "Zeppo" "Karl"))
                                                                    +"The Marx brothers are: Groucho, Harpo, Chico, Zeppo, Karl."
                                                                    +
                                                                    + +

                                                                    Another way to create a string out of the printed representation of various +object is using WITH-OUTPUT-TO-STRING. The value of this handy macro is a string +containing everything that was output to the string stream within the body to +the macro. This means you also have the full power of FORMAT at your disposal, +should you need it.

                                                                    + +
                                                                    * (with-output-to-string (stream)
                                                                    +    (dolist (char '(#\Z #\a #\p #\p #\a #\, #\Space))
                                                                    +      (princ char stream))
                                                                    +    (format stream "~S - ~S" 1940 1993))
                                                                    +"Zappa, 1940 - 1993"
                                                                    +
                                                                    + +

                                                                    Processing a String One Character at a Time

                                                                    + +

                                                                    Use the MAP function to process a string one character at a time.

                                                                    + +
                                                                    * (defparameter *my-string* (string "Groucho Marx"))
                                                                    +*MY-STRING*
                                                                    +* (map 'string #'(lambda (c) (print c)) *my-string*)
                                                                    +#\G
                                                                    +#\r
                                                                    +#\o
                                                                    +#\u
                                                                    +#\c
                                                                    +#\h
                                                                    +#\o
                                                                    +#\Space
                                                                    +#\M
                                                                    +#\a
                                                                    +#\r
                                                                    +#\x
                                                                    +"Groucho Marx"
                                                                    +
                                                                    + +

                                                                    Or do it with LOOP.

                                                                    + +
                                                                    * (loop for char across "Zeppo"
                                                                    +        collect char)
                                                                    +(#\Z #\e #\p #\p #\o)
                                                                    +
                                                                    + +

                                                                    Reversing a String by Word or Character

                                                                    + +

                                                                    Reversing a string by character is easy using the built-in REVERSE function (or +its destructive counterpart NREVERSE).

                                                                    + +
                                                                    *(defparameter *my-string* (string "DSL"))
                                                                    +*MY-STRING*
                                                                    +* (reverse *my-string*)
                                                                    +"LSD"
                                                                    +
                                                                    + +

                                                                    There’s no one-liner in CL to reverse a string by word (like you would do it in +Perl with split and join). You either have to use functions from an external +library like SPLIT-SEQUENCE or you have to roll your own solution.

                                                                    + +

                                                                    Here’s an attempt with the str library:

                                                                    + +
                                                                    * (defparameter *singing* "singing in the rain")
                                                                    +*SINGING*
                                                                    +* (str:words *SINGING*)
                                                                    +("singing" "in" "the" "rain")
                                                                    +* (reverse *)
                                                                    +("rain" "the" "in" "singing")
                                                                    +* (str:unwords *)
                                                                    +"rain the in singing"
                                                                    +
                                                                    + +

                                                                    And here’s another one with no external dependencies:

                                                                    + +
                                                                    * (defun split-by-one-space (string)
                                                                    +    "Returns a list of substrings of string
                                                                    +    divided by ONE space each.
                                                                    +    Note: Two consecutive spaces will be seen as
                                                                    +    if there were an empty string between them."
                                                                    +    (loop for i = 0 then (1+ j)
                                                                    +          as j = (position #\Space string :start i)
                                                                    +          collect (subseq string i j)
                                                                    +          while j))
                                                                    +SPLIT-BY-ONE-SPACE
                                                                    +* (split-by-one-space "Singing in the rain")
                                                                    +("Singing" "in" "the" "rain")
                                                                    +* (split-by-one-space "Singing in the  rain")
                                                                    +("Singing" "in" "the" "" "rain")
                                                                    +* (split-by-one-space "Cool")
                                                                    +("Cool")
                                                                    +* (split-by-one-space " Cool ")
                                                                    +("" "Cool" "")
                                                                    +* (defun join-string-list (string-list)
                                                                    +    "Concatenates a list of strings
                                                                    +and puts spaces between the elements."
                                                                    +    (format nil "~{~A~^ ~}" string-list))
                                                                    +JOIN-STRING-LIST
                                                                    +* (join-string-list '("We" "want" "better" "examples"))
                                                                    +"We want better examples"
                                                                    +* (join-string-list '("Really"))
                                                                    +"Really"
                                                                    +* (join-string-list '())
                                                                    +""
                                                                    +* (join-string-list
                                                                    +   (nreverse
                                                                    +    (split-by-one-space
                                                                    +     "Reverse this sentence by word")))
                                                                    +"word by sentence this Reverse"
                                                                    +
                                                                    + +

                                                                    Dealing with unicode strings

                                                                    + +

                                                                    We’ll use here SBCL’s string operations. More generally, see SBCL’s unicode support.

                                                                    + +

                                                                    Sorting unicode strings alphabetically

                                                                    + +

                                                                    Sorting unicode strings with string-lessp as the comparison function +isn’t satisfying:

                                                                    + +
                                                                    (sort '("Aaa" "Ééé" "Zzz") #'string-lessp)
                                                                    +;; ("Aaa" "Zzz" "Ééé")
                                                                    +
                                                                    + +

                                                                    With SBCL, use sb-unicode:unicode<:

                                                                    + +
                                                                    (sort '("Aaa" "Ééé" "Zzz") #'sb-unicode:unicode<)
                                                                    +;; ("Aaa" "Ééé" "Zzz")
                                                                    +
                                                                    + +

                                                                    Breaking strings into graphenes, sentences, lines and words

                                                                    + +

                                                                    These functions use SBCL’s sb-unicode: they are SBCL specific.

                                                                    + +

                                                                    Use sb-unicode:sentences to break a string into sentences according +to the default sentence breaking rules.

                                                                    + +

                                                                    Use sb-unicode:lines to break a string into lines that are no wider +than the :margin keyword argument. Combining marks will always be kept together with their base characters, and spaces (but not other types of whitespace) will be removed from the end of lines. If :margin is unspecified, it defaults to 80 characters

                                                                    + +
                                                                    (sb-unicode:lines "A first sentence. A second somewhat long one." :margin 10)
                                                                    +;; => ("A first"
                                                                    +       "sentence."
                                                                    +       "A second"
                                                                    +       "somewhat"
                                                                    +       "long one.")
                                                                    +
                                                                    + +

                                                                    See also sb-unicode:words and sb-unicode:graphenes.

                                                                    + +

                                                                    Tip: you can ensure these functions are run only in SBCL with a feature flag:

                                                                    + +
                                                                    #+sbcl
                                                                    +(runs on sbcl)
                                                                    +#-sbcl
                                                                    +(runs on other implementations)
                                                                    +
                                                                    + +

                                                                    Controlling Case

                                                                    + +

                                                                    Common Lisp has a couple of functions to control the case of a string.

                                                                    + +
                                                                    * (string-upcase "cool")
                                                                    +"COOL"
                                                                    +* (string-upcase "Cool")
                                                                    +"COOL"
                                                                    +* (string-downcase "COOL")
                                                                    +"cool"
                                                                    +* (string-downcase "Cool")
                                                                    +"cool"
                                                                    +* (string-capitalize "cool")
                                                                    +"Cool"
                                                                    +* (string-capitalize "cool example")
                                                                    +"Cool Example"
                                                                    +
                                                                    + +

                                                                    These functions take the :start and :end keyword arguments so you can optionally +only manipulate a part of the string. They also have destructive counterparts +whose names starts with “Nâ€.

                                                                    + +
                                                                    * (string-capitalize "cool example" :start 5)
                                                                    +"cool Example"
                                                                    +* (string-capitalize "cool example" :end 5)
                                                                    +"Cool example"
                                                                    +* (defparameter *my-string* (string "BIG"))
                                                                    +*MY-STRING*
                                                                    +* (defparameter *my-downcase-string* (nstring-downcase *my-string*))
                                                                    +*MY-DOWNCASE-STRING*
                                                                    +* *my-downcase-string*
                                                                    +"big"
                                                                    +* *my-string*
                                                                    +"big"
                                                                    +
                                                                    + +

                                                                    Note this potential caveat: according to the HyperSpec,

                                                                    + +
                                                                    +

                                                                    for STRING-UPCASE, STRING-DOWNCASE, and STRING-CAPITALIZE, string is not modified. However, if no characters in string require conversion, the result may be either string or a copy of it, at the implementation’s discretion.

                                                                    +
                                                                    + +

                                                                    This implies that the last result in +the following example is implementation-dependent - it may either be “BIG†or +“BUGâ€. If you want to be sure, use COPY-SEQ.

                                                                    + +
                                                                    * (defparameter *my-string* (string "BIG"))
                                                                    +*MY-STRING*
                                                                    +* (defparameter *my-upcase-string* (string-upcase *my-string*))
                                                                    +*MY-UPCASE-STRING*
                                                                    +* (setf (char *my-string* 1) #\U)
                                                                    +#\U
                                                                    +* *my-string*
                                                                    +"BUG"
                                                                    +* *my-upcase-string*
                                                                    +"BIG"
                                                                    +
                                                                    + +

                                                                    With the format function

                                                                    + +

                                                                    The format function has directives to change the case of words:

                                                                    + +

                                                                    To lower case: ~( ~)

                                                                    + +
                                                                    (format t "~(~a~)" "HELLO WORLD")
                                                                    +;; => hello world
                                                                    +
                                                                    + +

                                                                    Capitalize every word: ~:( ~)

                                                                    + +
                                                                    (format t "~:(~a~)" "HELLO WORLD")
                                                                    +Hello World
                                                                    +NIL
                                                                    +
                                                                    + +

                                                                    Capitalize the first word: ~@( ~)

                                                                    + +
                                                                    (format t "~@(~a~)" "hello world")
                                                                    +Hello world
                                                                    +NIL
                                                                    +
                                                                    + +

                                                                    To upper case: ~@:( ~)

                                                                    + +

                                                                    Where we re-use the colon and the @:

                                                                    + +
                                                                    (format t "~@:(~a~)" "hello world")
                                                                    +HELLO WORLD
                                                                    +NIL
                                                                    +
                                                                    + +

                                                                    Trimming Blanks from the Ends of a String

                                                                    + +

                                                                    Not only can you trim blanks, but you can get rid of arbitrary characters. The +functions STRING-TRIM, STRING-LEFT-TRIM and STRING-RIGHT-TRIM return a substring +of their second argument where all characters that are in the first argument are +removed off the beginning and/or the end. The first argument can be any sequence +of characters.

                                                                    + +
                                                                    * (string-trim " " " trim me ")
                                                                    +"trim me"
                                                                    +* (string-trim " et" " trim me ")
                                                                    +"rim m"
                                                                    +* (string-left-trim " et" " trim me ")
                                                                    +"rim me "
                                                                    +* (string-right-trim " et" " trim me ")
                                                                    +" trim m"
                                                                    +* (string-right-trim '(#\Space #\e #\t) " trim me ")
                                                                    +" trim m"
                                                                    +* (string-right-trim '(#\Space #\e #\t #\m) " trim me ")
                                                                    +
                                                                    + +

                                                                    Note: The caveat mentioned in the section about Controlling Case also applies +here.

                                                                    + +

                                                                    Converting between Symbols and Strings

                                                                    + +

                                                                    The function INTERN will “convert†a string to a symbol. Actually, it will check +whether the symbol denoted by the string (its first argument) is already +accessible in the package (its second, optional, argument which defaults to the +current package) and enter it, if necessary, into this package. It is beyond the +scope of this chapter to explain all the concepts involved and to address the +second return value of this function. See the CLHS chapter about packages for +details.

                                                                    + +

                                                                    Note that the case of the string is relevant.

                                                                    + +
                                                                    * (in-package "COMMON-LISP-USER")
                                                                    +#<The COMMON-LISP-USER package, 35/44 internal, 0/9 external>
                                                                    +* (intern "MY-SYMBOL")
                                                                    +MY-SYMBOL
                                                                    +NIL
                                                                    +* (intern "MY-SYMBOL")
                                                                    +MY-SYMBOL
                                                                    +:INTERNAL
                                                                    +* (export 'MY-SYMBOL)
                                                                    +T
                                                                    +* (intern "MY-SYMBOL")
                                                                    +MY-SYMBOL
                                                                    +:EXTERNAL
                                                                    +* (intern "My-Symbol")
                                                                    +|My-Symbol|
                                                                    +NIL
                                                                    +* (intern "MY-SYMBOL" "KEYWORD")
                                                                    +:MY-SYMBOL
                                                                    +NIL
                                                                    +* (intern "MY-SYMBOL" "KEYWORD")
                                                                    +:MY-SYMBOL
                                                                    +:EXTERNAL
                                                                    +
                                                                    + +

                                                                    To do the opposite, convert from a symbol to a string, use SYMBOL-NAME or +STRING.

                                                                    + +
                                                                    * (symbol-name 'MY-SYMBOL)
                                                                    +"MY-SYMBOL"
                                                                    +* (symbol-name 'my-symbol)
                                                                    +"MY-SYMBOL"
                                                                    +* (symbol-name '|my-symbol|)
                                                                    +"my-symbol"
                                                                    +* (string 'howdy)
                                                                    +"HOWDY"
                                                                    +
                                                                    + +

                                                                    Converting between Characters and Strings

                                                                    + +

                                                                    You can use COERCE to convert a string of length 1 to a character. You can also +use COERCE to convert any sequence of characters into a string. You can not use +COERCE to convert a character to a string, though - you’ll have to use STRING +instead.

                                                                    + +
                                                                    * (coerce "a" 'character)
                                                                    +#\a
                                                                    +* (coerce (subseq "cool" 2 3) 'character)
                                                                    +#\o
                                                                    +* (coerce "cool" 'list)
                                                                    +(#\c #\o #\o #\l)
                                                                    +* (coerce '(#\h #\e #\y) 'string)
                                                                    +"hey"
                                                                    +* (coerce (nth 2 '(#\h #\e #\y)) 'character)
                                                                    +#\y
                                                                    +* (defparameter *my-array* (make-array 5 :initial-element #\x))
                                                                    +*MY-ARRAY*
                                                                    +* *my-array*
                                                                    +#(#\x #\x #\x #\x #\x)
                                                                    +* (coerce *my-array* 'string)
                                                                    +"xxxxx"
                                                                    +* (string 'howdy)
                                                                    +"HOWDY"
                                                                    +* (string #\y)
                                                                    +"y"
                                                                    +* (coerce #\y 'string)
                                                                    +#\y can't be converted to type STRING.
                                                                    +   [Condition of type SIMPLE-TYPE-ERROR]
                                                                    +
                                                                    + +

                                                                    Finding an Element of a String

                                                                    + +

                                                                    Use FIND, POSITION, and their -IF counterparts to find characters in a string.

                                                                    + +
                                                                    * (find #\t "The Hyperspec contains approximately 110,000 hyperlinks." :test #'equal)
                                                                    +#\t
                                                                    +* (find #\t "The Hyperspec contains approximately 110,000 hyperlinks." :test #'equalp)
                                                                    +#\T
                                                                    +* (find #\z "The Hyperspec contains approximately 110,000 hyperlinks." :test #'equalp)
                                                                    +NIL
                                                                    +* (find-if #'digit-char-p "The Hyperspec contains approximately 110,000 hyperlinks.")
                                                                    +#\1
                                                                    +* (find-if #'digit-char-p "The Hyperspec contains approximately 110,000 hyperlinks." :from-end t)
                                                                    +#\0
                                                                    +* (position #\t "The Hyperspec contains approximately 110,000 hyperlinks." :test #'equal)
                                                                    +17
                                                                    +* (position #\t "The Hyperspec contains approximately 110,000 hyperlinks." :test #'equalp)
                                                                    +0
                                                                    +* (position-if #'digit-char-p "The Hyperspec contains approximately 110,000 hyperlinks.")
                                                                    +37
                                                                    +* (position-if #'digit-char-p "The Hyperspec contains approximately 110,000 hyperlinks." :from-end t)
                                                                    +43
                                                                    +
                                                                    + +

                                                                    Or use COUNT and friends to count characters in a string.

                                                                    + +
                                                                    * (count #\t "The Hyperspec contains approximately 110,000 hyperlinks." :test #'equal)
                                                                    +2
                                                                    +* (count #\t "The Hyperspec contains approximately 110,000 hyperlinks." :test #'equalp)
                                                                    +3
                                                                    +* (count-if #'digit-char-p "The Hyperspec contains approximately 110,000 hyperlinks.")
                                                                    +6
                                                                    +* (count-if #'digit-char-p "The Hyperspec contains approximately 110,000 hyperlinks." :start 38)
                                                                    +5
                                                                    +
                                                                    + +

                                                                    Finding a Substring of a String

                                                                    + +

                                                                    The function SEARCH can find substrings of a string.

                                                                    + +
                                                                    * (search "we" "If we can't be free we can at least be cheap")
                                                                    +3
                                                                    +* (search "we" "If we can't be free we can at least be cheap" :from-end t)
                                                                    +20
                                                                    +* (search "we" "If we can't be free we can at least be cheap" :start2 4)
                                                                    +20
                                                                    +* (search "we" "If we can't be free we can at least be cheap" :end2 5 :from-end t)
                                                                    +3
                                                                    +* (search "FREE" "If we can't be free we can at least be cheap")
                                                                    +NIL
                                                                    +* (search "FREE" "If we can't be free we can at least be cheap" :test #'char-equal)
                                                                    +15
                                                                    +
                                                                    + +

                                                                    Converting a String to a Number

                                                                    + +

                                                                    To an integer: parse-integer

                                                                    + +

                                                                    CL provides the parse-integer function to convert a string representation of an integer +to the corresponding numeric value. The second return value is the index into +the string where the parsing stopped.

                                                                    + +
                                                                    * (parse-integer "42")
                                                                    +42
                                                                    +2
                                                                    +* (parse-integer "42" :start 1)
                                                                    +2
                                                                    +2
                                                                    +* (parse-integer "42" :end 1)
                                                                    +4
                                                                    +1
                                                                    +* (parse-integer "42" :radix 8)
                                                                    +34
                                                                    +2
                                                                    +* (parse-integer " 42 ")
                                                                    +42
                                                                    +3
                                                                    +* (parse-integer " 42 is forty-two" :junk-allowed t)
                                                                    +42
                                                                    +3
                                                                    +* (parse-integer " 42 is forty-two")
                                                                    +
                                                                    +Error in function PARSE-INTEGER:
                                                                    +   There's junk in this string: " 42 is forty-two".
                                                                    +
                                                                    + +

                                                                    parse-integer doesn’t understand radix specifiers like #X, nor is there a +built-in function to parse other numeric types. You could use read-from-string +in this case.

                                                                    + +

                                                                    To any number: read-from-string

                                                                    + +

                                                                    Be aware that the full reader is in effect if you’re using this +function. This can lead to vulnerability issues.

                                                                    + +
                                                                    * (read-from-string "#X23")
                                                                    +35
                                                                    +4
                                                                    +* (read-from-string "4.5")
                                                                    +4.5
                                                                    +3
                                                                    +* (read-from-string "6/8")
                                                                    +3/4
                                                                    +3
                                                                    +* (read-from-string "#C(6/8 1)")
                                                                    +#C(3/4 1)
                                                                    +9
                                                                    +* (read-from-string "1.2e2")
                                                                    +120.00001
                                                                    +5
                                                                    +* (read-from-string "symbol")
                                                                    +SYMBOL
                                                                    +6
                                                                    +* (defparameter *foo* 42)
                                                                    +*FOO*
                                                                    +* (read-from-string "#.(setq *foo* \"gotcha\")")
                                                                    +"gotcha"
                                                                    +23
                                                                    +* *foo*
                                                                    +"gotcha"
                                                                    +
                                                                    + +

                                                                    To a float: the parse-float library

                                                                    + +

                                                                    There is no built-in function similar to parse-integer to parse +other number types. The external library +parse-float does exactly +that. It doesn’t use read-from-string so it is safe to use.

                                                                    + +
                                                                    (ql:quickload "parse-float")
                                                                    +(parse-float:parse-float "1.2e2")
                                                                    +;; 120.00001
                                                                    +;; 5
                                                                    +
                                                                    + +

                                                                    LispWorks also has a parse-float function.

                                                                    + +

                                                                    See also parse-number.

                                                                    + +

                                                                    Converting a Number to a String

                                                                    + +

                                                                    The general function WRITE-TO-STRING or one of its simpler variants +PRIN1-TO-STRING or PRINC-TO-STRING may be used to convert a number to a +string. With WRITE-TO-STRING, the :base keyword argument may be used to change +the output base for a single call. To change the output base globally, set +print-base which defaults to 10. Remember in Lisp, rational numbers are +represented as quotients of two integers even when converted to strings.

                                                                    + +
                                                                    * (write-to-string 250)
                                                                    +"250"
                                                                    +* (write-to-string 250.02)
                                                                    +"250.02"
                                                                    +* (write-to-string 250 :base 5)
                                                                    +"2000"
                                                                    +* (write-to-string (/ 1 3))
                                                                    +"1/3"
                                                                    +*
                                                                    +
                                                                    + +

                                                                    Comparing Strings

                                                                    + +

                                                                    The general functions EQUAL and EQUALP can be used to test whether two strings +are equal. The strings are compared element-by-element, either in a +case-sensitive manner (EQUAL) or not (EQUALP). There’s also a bunch of +string-specific comparison functions. You’ll want to use these if you’re +deploying implementation-defined attributes of characters. Check your vendor’s +documentation in this case.

                                                                    + +

                                                                    Here are a few examples. Note that all functions that test for inequality return the position of the first mismatch as a generalized boolean. You can also use the generic sequence function MISMATCH if you need more versatility.

                                                                    + +
                                                                    * (string= "Marx" "Marx")
                                                                    +T
                                                                    +* (string= "Marx" "marx")
                                                                    +NIL
                                                                    +* (string-equal "Marx" "marx")
                                                                    +T
                                                                    +* (string< "Groucho" "Zeppo")
                                                                    +0
                                                                    +* (string< "groucho" "Zeppo")
                                                                    +NIL
                                                                    +* (string-lessp "groucho" "Zeppo")
                                                                    +0
                                                                    +* (mismatch "Harpo Marx" "Zeppo Marx" :from-end t :test #'char=)
                                                                    +3
                                                                    +
                                                                    + +

                                                                    String formatting

                                                                    + +

                                                                    The format function has a lot of directives to print strings, +numbers, lists, going recursively, even calling Lisp functions, +etc. We’ll focus here on a few things to print and format strings.

                                                                    + +

                                                                    The need of our examples arise when we want to print many strings and +justify them. Let’s work with this list of movies:

                                                                    + +
                                                                    (defparameter movies '(
                                                                    +    (1 "Matrix" 5)
                                                                    +    (10 "Matrix Trilogy swe sub" 3.3)
                                                                    +    ))
                                                                    +
                                                                    + +

                                                                    We want an aligned and justified result like this:

                                                                    + +
                                                                     1 Matrix                  5
                                                                    +10 Matrix Trilogy swe sub  3.3
                                                                    +
                                                                    + +

                                                                    We’ll use mapcar to iterate over our movies and experiment with the +format constructs.

                                                                    + +
                                                                    (mapcar (lambda (it)
                                                                    +          (format t "~a ~a ~a~%" (first it) (second it) (third it)))
                                                                    +        movies)
                                                                    +
                                                                    + +

                                                                    which prints:

                                                                    + +
                                                                    1 Matrix 5
                                                                    +10 Matrix Trilogy swe sub 3.3
                                                                    +
                                                                    + +

                                                                    Structure of format

                                                                    + +

                                                                    Format directives start with ~. A final character like A or a +(they are case insensitive) defines the directive. In between, it can +accept coma-separated options and parameters.

                                                                    + +

                                                                    Print a tilde with ~~, or 10 with ~10~.

                                                                    + +

                                                                    Other directives include:

                                                                    + +
                                                                      +
                                                                    • R: Roman (e.g., prints in English): (format t "~R" 20) => “twentyâ€.
                                                                    • +
                                                                    • $: monetary: (format t "~$" 21982) => 21982.00
                                                                    • +
                                                                    • D, B, O, X: Decimal, Binary, Octal, Hexadecimal.
                                                                    • +
                                                                    • F: fixed-format Floating point.
                                                                    • +
                                                                    • P: plural: (format nil "~D famil~:@P/~D famil~:@P" 7 1) => “7 families/1 familyâ€
                                                                    • +
                                                                    + +

                                                                    Basic primitive: ~A or ~a (Aesthetics)

                                                                    + +

                                                                    (format t "~a" movies) is the most basic primitive.

                                                                    + +
                                                                    (format nil "~a" movies)
                                                                    +;; => "((1 Matrix 5) (10 Matrix Trilogy swe sub 3.3))"
                                                                    +
                                                                    + +

                                                                    Newlines: ~% and ~&

                                                                    + +

                                                                    ~% is the newline character. ~10% prints 10 newlines.

                                                                    + +

                                                                    ~& does not print a newline if the output stream is already at one.

                                                                    + +

                                                                    Tabs

                                                                    + +

                                                                    with ~T. Also ~10T works.

                                                                    + +

                                                                    Also i for indentation.

                                                                    + +

                                                                    Justifying text / add padding on the right

                                                                    + +

                                                                    Use a number as parameter, like ~2a:

                                                                    + +
                                                                    (format nil "~20a" "yo")
                                                                    +;; "yo                  "
                                                                    +
                                                                    + +
                                                                    (mapcar (lambda (it)
                                                                    +           (format t "~2a ~a ~a~%" (first it) (second it) (third it)))
                                                                    +         movies)
                                                                    +
                                                                    + +
                                                                    1  Matrix 5
                                                                    +10 Matrix Trilogy swe sub 3.3
                                                                    +
                                                                    + +

                                                                    So, expanding:

                                                                    + +
                                                                    (mapcar (lambda (it)
                                                                    +          (format t "~2a ~25a ~2a~%" (first it) (second it) (third it)))
                                                                    +        movies)
                                                                    +
                                                                    + +
                                                                    1  Matrix                    5
                                                                    +10 Matrix Trilogy swe sub    3.3
                                                                    +
                                                                    + +

                                                                    text is justified on the right (this would be with option :).

                                                                    + +

                                                                    Justifying on the left: @

                                                                    + +

                                                                    Use a @ as in ~2@A:

                                                                    + +
                                                                    (format nil "~20@a" "yo")
                                                                    +;; "                  yo"
                                                                    +
                                                                    + +
                                                                    (mapcar (lambda (it)
                                                                    +           (format nil "~2@a ~25@a ~2a~%" (first it) (second it) (third it)))
                                                                    +        movies)
                                                                    +
                                                                    + +
                                                                     1                    Matrix 5
                                                                    +10    Matrix Trilogy swe sub 3.3
                                                                    +
                                                                    + +

                                                                    Justifying decimals

                                                                    + +

                                                                    In ~,2F, 2 is the number of decimals and F the floats directive: +(format t "~,2F" 20.1) => “20.10â€.

                                                                    + +

                                                                    With ~2,2f:

                                                                    + +
                                                                    (mapcar (lambda (it)
                                                                    +          (format t "~2@a ~25a ~2,2f~%" (first it) (second it) (third it)))
                                                                    +        movies)
                                                                    +
                                                                    + +
                                                                     1 Matrix                    5.00
                                                                    +10 Matrix Trilogy swe sub    3.30
                                                                    +
                                                                    + +

                                                                    And we’re happy with this result.

                                                                    + +

                                                                    Iteration

                                                                    + +

                                                                    Create a string from a list with iteration construct ~{str~}:

                                                                    + +
                                                                    (format nil "~{~A, ~}" '(a b c))
                                                                    +;; "A, B, C, "
                                                                    +
                                                                    + +

                                                                    using ~^ to avoid printing the comma and space after the last element:

                                                                    + +
                                                                    (format nil "~{~A~^, ~}" '(a b c))
                                                                    +;; "A, B, C"
                                                                    +
                                                                    + +

                                                                    ~:{str~} is similar but for a list of sublists:

                                                                    + +
                                                                    (format nil "~:{~S are ~S. ~}" '((pigeons birds) (dogs mammals) (bees insects)))
                                                                    +;; "PIGEONS are BIRDS. DOGS are MAMMALS. BEES are INSECTS. "
                                                                    +
                                                                    + +

                                                                    ~@{str~} is similar to ~{str~}, but instead of using one argument that is a list, all the remaining arguments are used as the list of arguments for the iteration:

                                                                    + +
                                                                    (format nil "~@{~S are ~S. ~}" 'pigeons 'birds 'dogs 'mammals 'bees 'insects)
                                                                    +;; "PIGEONS are BIRDS. DOGS are MAMMALS. BEES are INSECTS. "
                                                                    +
                                                                    + +

                                                                    Formatting a format string (~v, ~?)

                                                                    + +

                                                                    Sometimes you want to justify a string, but the length is a variable +itself. You can’t hardcode its value as in (format nil "~30a" +"foo"). Enters the v directive. We can use it in place of the +comma-separated prefix parameters:

                                                                    + +
                                                                    (let ((padding 30))
                                                                    +    (format nil "~va" padding "foo"))
                                                                    +;; "foo                           "
                                                                    +
                                                                    + +

                                                                    Other times, you would like to insert a complete format directive +at run time. Enters the ? directive.

                                                                    + +
                                                                    (format nil "~?" "~30a" '("foo"))
                                                                    +;;                       ^ a list
                                                                    +
                                                                    + +

                                                                    or, using ~@?:

                                                                    + +
                                                                    (format nil "~@?" "~30a" "foo" )
                                                                    +;;                       ^ not a list
                                                                    +
                                                                    + +

                                                                    Of course, it is always possible to format a format string beforehand:

                                                                    + +
                                                                    (let* ((length 30)
                                                                    +      (directive (format nil "~~~aa" length)))
                                                                    + (format nil directive "foo"))
                                                                    +
                                                                    + +

                                                                    Conditional Formatting

                                                                    + +

                                                                    Choose one value out of many options by specifying a number:

                                                                    + +
                                                                    (format nil "~[dog~;cat~;bird~:;default~]" 0)
                                                                    +;; "dog"
                                                                    +
                                                                    +(format nil "~[dog~;cat~;bird~:;default~]" 1)
                                                                    +;; "cat"
                                                                    +
                                                                    + +

                                                                    If the number is out of range, the default option (after ~:;) is returned:

                                                                    + +
                                                                    (format nil "~[dog~;cat~;bird~:;default~]" 9)
                                                                    +;; "default"
                                                                    +
                                                                    + +

                                                                    Combine it with ~:* to implement irregular plural:

                                                                    + +
                                                                    (format nil "I saw ~r el~:*~[ves~;f~:;ves~]." 0) ==> "I saw zero elves."
                                                                    +(format nil "I saw ~r el~:*~[ves~;f~:;ves~]." 1) ==> "I saw one elf."
                                                                    +(format nil "I saw ~r el~:*~[ves~;f~:;ves~]." 2) ==> "I saw two elves."
                                                                    +
                                                                    + +

                                                                    Capturing what is is printed into a stream

                                                                    + +

                                                                    Inside (with-output-to-string (mystream) …), everything that is +printed into the stream mystream is captured and returned as a +string:

                                                                    + +
                                                                    (defun greet (name &key (stream t))
                                                                    +   ;; by default, print to standard output.
                                                                    +   (format stream "hello ~a" name))
                                                                    +
                                                                    +(let ((output (with-output-to-string (stream)
                                                                    +                (greet "you" :stream stream))))
                                                                    +   (format t "Output is: '~a'. It is indeed a ~a, aka a string.~&" output (type-of output)))
                                                                    +;; Output is: 'hello you'. It is indeed a (SIMPLE-ARRAY CHARACTER (9)), aka a string.
                                                                    +;; NIL
                                                                    +
                                                                    + +

                                                                    Cleaning up strings

                                                                    + +

                                                                    The following examples use the +cl-slug library which, +internally, iterates over the characters of the string and uses +ppcre:regex-replace-all.

                                                                    + +
                                                                    (ql:quickload "cl-slug")
                                                                    +
                                                                    + +

                                                                    Then it can be used with the slug prefix.

                                                                    + +

                                                                    Its main function is to transform a string to a slug, suitable for a website’s url:

                                                                    + +
                                                                    (slug:slugify "My new cool article, for the blog (V. 2).")
                                                                    +;; "my-new-cool-article-for-the-blog-v-2"
                                                                    +
                                                                    + +

                                                                    Removing accentuated letters

                                                                    + +

                                                                    Use slug:asciify to replace accentuated letters by their ascii equivalent:

                                                                    + +
                                                                    (slug:asciify "ñ é ß ğ ö")
                                                                    +;; => "n e ss g o"
                                                                    +
                                                                    + +

                                                                    This function supports many (western) languages:

                                                                    + +
                                                                    slug:*available-languages*
                                                                    +((:TR . "Türkçe (Turkish)") (:SV . "Svenska (Swedish)") (:FI . "Suomi (Finnish)")
                                                                    + (:UK . "українÑька (Ukrainian)") (:RU . "РуÌÑÑкий (Russian)") (:RO . "Română (Romanian)")
                                                                    + (:RM . "Rumàntsch (Romansh)") (:PT . "Português (Portuguese)") (:PL . "Polski (Polish)")
                                                                    + (:NO . "Norsk (Norwegian)") (:LT . "Lietuvių (Lithuanian)") (:LV . "Latviešu (Latvian)")
                                                                    + (:LA . "Lingua Latīna (Latin)") (:IT . "Italiano (Italian)") (:EL . "ελληνικά (Greek)")
                                                                    + (:FR . "Français (French)") (:EO . "Esperanto") (:ES . "Español (Spanish)") (:EN . "English")
                                                                    + (:DE . "Deutsch (German)") (:DA . "Dansk (Danish)") (:CS . "Čeština (Czech)")
                                                                    + (:CURRENCY . "Currency"))
                                                                    +
                                                                    + +

                                                                    Removing punctuation

                                                                    + +

                                                                    Use (str:remove-punctuation s) or (str:no-case s) (same as +(cl-change-case:no-case s)):

                                                                    + +
                                                                    (str:remove-punctuation "HEY! What's up ??")
                                                                    +;; "HEY What s up"
                                                                    +
                                                                    +(str:no-case "HEY! What's up ??")
                                                                    +;; "hey what s up"
                                                                    +
                                                                    + +

                                                                    They strip the punctuation with one ppcre unicode regexp +((ppcre:regex-replace-all "[^\\p{L}\\p{N}]+" where p{L} is the +“letter†category and p{N} any kind of numeric character).

                                                                    + +

                                                                    See also

                                                                    + + + + +

                                                                    + Page source: strings.md +

                                                                    +
                                                                    + + + + + +
                                                                    +
                                                                    +
                                                                    + © 2002–2021 the Common Lisp Cookbook Project +
                                                                    + +
                                                                    +
                                                                    T
                                                                    O
                                                                    C
                                                                    +
                                                                    + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/systems.html b/clones/lispcookbook.github.io/cl-cookbook/systems.html new file mode 100644 index 00000000..f23ddaae --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/systems.html @@ -0,0 +1,294 @@ + + + + + Defining Systems + + + + + + + + + + + + + + +

                                                                    The Common Lisp Cookbook – Defining Systems

                                                                    +
                                                                    + + + + +
                                                                    +
                                                                    + +
                                                                    +
                                                                    + +
                                                                    +
                                                                    Table of Contents
                                                                    +
                                                                      +
                                                                      +
                                                                      + +
                                                                      +

                                                                      The Common Lisp Cookbook – Defining Systems

                                                                      + + +

                                                                      + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                      +

                                                                      + 📕 Get the EPUB and PDF +

                                                                      + + +
                                                                      A system is a collection of Lisp files that together constitute an application or a library, and that should therefore be managed as a whole. A system definition describes which source files make up the system, what the dependencies among them are, and the order they should be compiled and loaded in.

                                                                      + +

                                                                      ASDF

                                                                      + +

                                                                      ASDF is the standard build +system for Common Lisp. It is shipped in most Common Lisp +implementations. It includes +UIOP, +“the Utilities for Implementation- and OS- Portabilityâ€. You can read +its manual and the +tutorial and best practices.

                                                                      + +

                                                                      + +

                                                                      Simple examples

                                                                      + +

                                                                      Loading a system

                                                                      + +

                                                                      The most trivial use of ASDF is by calling (asdf:make "foobar") (or load-system) +to load your library. +Then you can use it. +For instance, if it exports a function some-fun in its package foobar, +then you will be able to call it with (foobar:some-fun ...) or with:

                                                                      + +
                                                                      (in-package :foobar)
                                                                      +(some-fun ...)
                                                                      +
                                                                      + +

                                                                      You can also use Quicklisp:

                                                                      + +
                                                                      (ql:quickload "foobar")
                                                                      +
                                                                      + +

                                                                      Also, you can use SLIME to load a system, using the M-x slime-load-system Emacs command. +The interesting thing about this way of doing it is that SLIME collects all the system warnings and errors in the process, +and puts them in the *slime-compilation* buffer, from which you can interactively inspect them after the loading finishes.

                                                                      + +

                                                                      Testing a system

                                                                      + +

                                                                      To run the tests for a system, you may use:

                                                                      + +
                                                                      (asdf:test-system :foobar)
                                                                      +
                                                                      + +

                                                                      The convention is that an error SHOULD be signalled if tests are unsuccessful.

                                                                      + +

                                                                      Designating a system

                                                                      + +

                                                                      The proper way to designate a system in a program is with lower-case +strings, not symbols, as in:

                                                                      + +
                                                                      (asdf:make "foobar")
                                                                      +(asdf:test-system "foobar")
                                                                      +
                                                                      + +

                                                                      How to write a trivial system definition

                                                                      + +

                                                                      A trivial system would have a single Lisp file called foobar.lisp, located at the project’s root. +That file would depend on some existing libraries, +say alexandria for general purpose utilities, +and trivia for pattern-matching. +To make this system buildable using ASDF, +you create a system definition file called foobar.asd, +with the following contents:

                                                                      + +
                                                                      (defsystem "foobar"
                                                                      +  :depends-on ("alexandria" "trivia")
                                                                      +  :components ((:file "foobar")))
                                                                      +
                                                                      + +

                                                                      Note how the type lisp of foobar.lisp +is implicit in the name of the file above. +As for contents of that file, they would look like this:

                                                                      + +
                                                                      (defpackage :foobar
                                                                      +  (:use :common-lisp :alexandria :trivia)
                                                                      +  (:export
                                                                      +   #:some-function
                                                                      +   #:another-function
                                                                      +   #:call-with-foobar
                                                                      +   #:with-foobar))
                                                                      +
                                                                      +(in-package :foobar)
                                                                      +
                                                                      +(defun some-function (...)
                                                                      +    ...)
                                                                      +...
                                                                      +
                                                                      + +

                                                                      Instead of using multiple complete packages, you might want to just import parts of them:

                                                                      + +
                                                                      (defpackage :foobar
                                                                      +  (:use #:common-lisp)
                                                                      +  (:import-from #:alexandria
                                                                      +                #:some-function
                                                                      +                #:another-function))
                                                                      +  (:import-from #:trivia
                                                                      +                #:some-function
                                                                      +                #:another-function))
                                                                      +...)
                                                                      +
                                                                      + +

                                                                      Using the system you defined

                                                                      + +

                                                                      Assuming your system is installed under ~/common-lisp/, +~/quicklisp/local-projects/ or some other filesystem hierarchy +already configured for ASDF, you can load it with: (asdf:make "foobar").

                                                                      + +

                                                                      If your Lisp was already started when you created that file, +you may have to, either:

                                                                      + +
                                                                        +
                                                                      • load the new .asd file: (load "path/to/foobar.asd"), or with C-c C-k in Slime to compile and load the whole file.
                                                                      • +
                                                                      • (asdf:clear-configuration) to re-process the configuration.
                                                                      • +
                                                                      + +

                                                                      How to write a trivial testing definition

                                                                      + +

                                                                      Even the most trivial of systems needs some tests, +if only because it will have to be modified eventually, +and you want to make sure those modifications don’t break client code. +Tests are also a good way to document expected behavior.

                                                                      + +

                                                                      The simplest way to write tests is to have a file foobar-tests.lisp +and modify the above foobar.asd as follows:

                                                                      + +
                                                                      (defsystem "foobar"
                                                                      +    :depends-on ("alexandria" "trivia")
                                                                      +    :components ((:file "foobar"))
                                                                      +    :in-order-to ((test-op (test-op "foobar/tests"))))
                                                                      +
                                                                      +(defsystem "foobar/tests"
                                                                      +    :depends-on ("foobar" "fiveam")
                                                                      +    :components ((:file "foobar-tests"))
                                                                      +    :perform (test-op (o c) (symbol-call :fiveam '#:run! :foobar)))
                                                                      +
                                                                      + +

                                                                      The :in-order-to clause in the first system +allows you to use (asdf:test-system :foobar) +which will chain into foobar/tests. +The :perform clause in the second system does the testing itself.

                                                                      + +

                                                                      In the test system, fiveam is the name of a popular test library, +and the content of the perform method is how to invoke this library +to run the test suite :foobar. +Obvious YMMV if you use a different library.

                                                                      + +

                                                                      Create a project skeleton

                                                                      + +

                                                                      cl-project can be used to +generate a project skeleton. It will create a default ASDF definition, + generate a system for unit testing, etc.

                                                                      + +

                                                                      Install with

                                                                      + +
                                                                      (ql:quickload "cl-project")
                                                                      +
                                                                      + +

                                                                      Create a project:

                                                                      + +
                                                                      (cl-project:make-project #p"lib/cl-sample/"
                                                                      +:author "Eitaro Fukamachi"
                                                                      +:email "e.arrows@gmail.com"
                                                                      +:license "LLGPL"
                                                                      +:depends-on '(:clack :cl-annot))
                                                                      +;-> writing /Users/fukamachi/Programs/lib/cl-sample/.gitignore
                                                                      +;   writing /Users/fukamachi/Programs/lib/cl-sample/README.markdown
                                                                      +;   writing /Users/fukamachi/Programs/lib/cl-sample/cl-sample-test.asd
                                                                      +;   writing /Users/fukamachi/Programs/lib/cl-sample/cl-sample.asd
                                                                      +;   writing /Users/fukamachi/Programs/lib/cl-sample/src/hogehoge.lisp
                                                                      +;   writing /Users/fukamachi/Programs/lib/cl-sample/t/hogehoge.lisp
                                                                      +;=> T
                                                                      +
                                                                      + +

                                                                      And you’re done.

                                                                      + + +

                                                                      + Page source: systems.md +

                                                                      +
                                                                      + + + + + +
                                                                      +
                                                                      +
                                                                      + © 2002–2021 the Common Lisp Cookbook Project +
                                                                      + +
                                                                      +
                                                                      T
                                                                      O
                                                                      C
                                                                      +
                                                                      + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/testing.html b/clones/lispcookbook.github.io/cl-cookbook/testing.html new file mode 100644 index 00000000..3c327f3e --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/testing.html @@ -0,0 +1,904 @@ + + + + + Testing + + + + + + + + + + + + + + +

                                                                      The Common Lisp Cookbook – Testing

                                                                      +
                                                                      + + + + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      + +
                                                                      +
                                                                      Table of Contents
                                                                      +
                                                                        +
                                                                        +
                                                                        + +
                                                                        +

                                                                        The Common Lisp Cookbook – Testing

                                                                        + + +

                                                                        + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                        +

                                                                        + 📕 Get the EPUB and PDF +

                                                                        + + +
                                                                        So you want to easily test the code you’re writing? The following +recipe covers how to write automated tests and see their code +coverage. We also give pointers to plug those in modern continuous +integration services like GitHub Actions, Gitlab CI, Travis CI or Coveralls.

                                                                        + +

                                                                        We will be using a mature testing framework called +FiveAM. It supports test suites, +random testing, test fixtures (to a certain extent) and, of course, +interactive development.

                                                                        + +

                                                                        Previously on the Cookbook, the recipe was cooked with Prove. It used to be a widely liked testing framework but, because of some shortcomings, its repository was later archived. Its successor Rove is not stable enough and lacks some features, so we didn’t pick it. There are also some other testing frameworks to explore if you feel like it.

                                                                        + +

                                                                        FiveAM has an API documentation. You may inspect it or simply read the docstrings in code. Most of the time, they would provide sufficient information that answers your questions… if you didn’t find them here. Let’s get started.

                                                                        + +

                                                                        Testing with FiveAM

                                                                        + +

                                                                        FiveAM has 3 levels of abstraction: check, test and suite. As you may have guessed:

                                                                        + +
                                                                          +
                                                                        1. A check is a single assertion that checks that its argument is truthy. The most used check is is. For example, (is (= 2 (+ 1 1))).
                                                                        2. +
                                                                        3. A test is the smallest runnable unit. A test case may contain multiple checks. Any check failure leads to the failure of the whole test.
                                                                        4. +
                                                                        5. A suite is a collection of tests. When a suite is run, all tests inside would be performed. A suite allows paternity, which means that running a suite will run all the tests defined in it and in its children suites.
                                                                        6. +
                                                                        + +

                                                                        A simple code sample containing the 3 basic blocks mentioned above can be shown as follows:

                                                                        + +
                                                                        (def-suite* my-suite)
                                                                        +
                                                                        +(test my-test
                                                                        +  (is (= 2 (+ 1 1))))
                                                                        +
                                                                        + +

                                                                        It is totally up to the user to decide the hierarchy of tests and suites. Here we mainly focus on the usage of FiveAM.

                                                                        + +

                                                                        Suppose we have built a rather complex system and the following functions are part of it:

                                                                        + +
                                                                        ;; We have a custom "file doesn't exist" condition.
                                                                        +(define-condition file-not-existing-error (error)
                                                                        +  ((filename :type string :initarg :filename :reader filename)))
                                                                        +
                                                                        +;; We have a function that tries to read a file and signals the above condition
                                                                        +;; if the file doesn't exist.
                                                                        +(defun read-file-as-string (filename &key (error-if-not-exists t))
                                                                        +  "Read file content as string. FILENAME specifies the path of file.
                                                                        +
                                                                        +Keyword ERROR-IF-NOT-EXISTS specifies the operation to perform when the file
                                                                        +is not found. T (by default) means an error will be signaled. When given NIL,
                                                                        +the function will return NIL in that case."
                                                                        +  (cond
                                                                        +    ((uiop:file-exists-p filename)
                                                                        +     (uiop:read-file-string filename))
                                                                        +    (error-if-not-exists
                                                                        +     (error 'file-not-existing-error :filename filename))
                                                                        +    (t nil)))
                                                                        +
                                                                        + +

                                                                        We will write tests for that code. In particular, we must ensure:

                                                                        + +
                                                                          +
                                                                        • that the content read in a file is the expected content,
                                                                        • +
                                                                        • that the condition is signaled if the file doesn’t exist.
                                                                        • +
                                                                        + +

                                                                        Install and load

                                                                        + +

                                                                        FiveAM is in Quicklisp and can be loaded with the following command:

                                                                        + +
                                                                        (ql:quickload "fiveam")
                                                                        +
                                                                        + +

                                                                        The package is named fiveam with a nickname 5am. For the sake of simplicity, we will ignore the package prefix in the following code samples.

                                                                        + +

                                                                        It is like we :used fiveam in our test package definition. You +can also follow along in the REPL with (use-package :fiveam).

                                                                        + +

                                                                        Here is a package definition you can use:

                                                                        + +
                                                                        (in-package :cl-user)
                                                                        +(defpackage my-fiveam-test
                                                                        +  (:use :cl
                                                                        +        :fiveam))
                                                                        +(in-package :my-fiveam-test)
                                                                        +
                                                                        + +

                                                                        Defining suites (def-suite, def-suite*)

                                                                        + +

                                                                        Testing in FiveAM usually starts by defining a suite. A suite helps separating tests to smaller collections that makes them more organized. It is highly recommended to define a single root suite for the sake of ASDF integration. We will talk about it later, now let’s focus on the testing itself.

                                                                        + +

                                                                        The code below defines a suite named my-system. We will use it as the root suite for the whole system.

                                                                        + +
                                                                        (def-suite my-system
                                                                        +  :description "Test my system")
                                                                        +
                                                                        + +

                                                                        Then let’s define another suite for testing the read-file-as-string function.

                                                                        + +
                                                                        ;; Define a suite and set it as the default for the following tests.
                                                                        +(def-suite read-file-as-string
                                                                        +  :description "Test the read-file-as-string function."
                                                                        +  :in my-system)
                                                                        +(in-suite read-file-as-string)
                                                                        +
                                                                        +;; Alternatively, the following line is a combination of the 2 lines above.
                                                                        +(def-suite* read-file-as-string :in my-system)
                                                                        +
                                                                        + +

                                                                        Here a new suite named read-file-as-string has been defined. It is declared to be a child suite of my-system as specified by the :in keyword. The macro in-suite sets it as the default suite for the tests defined later.

                                                                        + +

                                                                        Defining tests

                                                                        + +

                                                                        Before diving into tests, here is a brief introduction of the available checks you may use inside tests:

                                                                        + +
                                                                          +
                                                                        • The is macro is likely the most used check. It simply checks if the given expression returns a true value and generates a test-passed or test-failure result accordingly.
                                                                        • +
                                                                        • The skip macro takes a reason and generates a test-skipped result.
                                                                        • +
                                                                        • The signals macro checks if the given condition was signaled during execution.
                                                                        • +
                                                                        + +

                                                                        There is also:

                                                                        + +
                                                                          +
                                                                        • finishes: passes if the assertion body executes to normal completion. In other words if body does signal, return-from or throw, then this test fails.
                                                                        • +
                                                                        • pass: just make the test pass.
                                                                        • +
                                                                        • is-true: like is, but unlike it this check does not inspect the assertion body to determine how to report the failure. Similarly, there is is-false.
                                                                        • +
                                                                        + +

                                                                        Please note that all the checks accept an optional reason, as string, that can be formatted with format directives (see more below). When omitted, FiveAM generates a report that explains the failure according to the arguments passed to the function.

                                                                        + +

                                                                        The test macro provides a simple way to define a test with a name.

                                                                        + +

                                                                        Note that below, we expect two files to exist: /tmp/hello.txt should contain “hello†and /tmp/empty.txt should be empty.

                                                                        + +
                                                                        ;; Our first "base" case: we read a file that contains "hello".
                                                                        +(test read-file-as-string-normal-file
                                                                        +  (let ((result (read-file-as-string "/tmp/hello.txt")))
                                                                        +    ;; Tip: put the expected value as the first argument of = or equal, string= etc.
                                                                        +    ;; FiveAM generates a more readable report following this convention.
                                                                        +    (is (string= "hello" result))))
                                                                        +
                                                                        +;; We read an empty file.
                                                                        +(test read-file-as-string-empty-file
                                                                        +  (let ((result (read-file-as-string "/tmp/empty.txt")))
                                                                        +    (is (not (null result)))
                                                                        +    ;; The reason can be used to provide formatted text.
                                                                        +    (is (= 0 (length result)))
                                                                        +        "Empty string expected but got ~a" result))
                                                                        +
                                                                        +;; Now we test that reading a non-existing file signals our condition.
                                                                        +(test read-file-as-string-non-existing-file
                                                                        +  (let ((result (read-file-as-string "/tmp/non-existing-file.txt"
                                                                        +                                     :error-if-not-exists nil)))
                                                                        +    (is (null result)
                                                                        +      "Reading a file should return NIL when :ERROR-IF-NOT-EXISTS is set to NIL"))
                                                                        +  ;; SIGNALS accepts the unquoted name of a condition and a body to evaluate.
                                                                        +  ;; Here it checks if FILE-NOT-EXISTING-ERROR is signaled.
                                                                        +  (signals file-not-existing-error
                                                                        +    (read-file-as-string "/tmp/non-existing-file.txt"
                                                                        +                         :error-if-not-exists t)))
                                                                        +
                                                                        + +

                                                                        In the above code, 3 test were defined with 5 checks in total. Some checks were actually redundant for the sake of demonstration. You may put all the checks in one big test, or in multiple scenarios. It is up to you.

                                                                        + +

                                                                        The macro test is a convenience for def-test to define simple tests. You may read its docstring for a more complete introduction, for example to read about :depends-on.

                                                                        + +

                                                                        Running tests

                                                                        + +

                                                                        FiveAm provides multiple ways to run tests. The macro run! is a good start point during development. It accepts a name of suite or test and run it, then prints testing report in standard output. Let’s run the tests now!

                                                                        + +
                                                                        (run! 'my-system)
                                                                        +; Running test suite MY-SYSTEM
                                                                        +;  Running test READ-FILE-AS-STRING-EMPTY-FILE ..
                                                                        +;  Running test READ-FILE-AS-STRING-NON-EXISTING-FILE ..
                                                                        +;  Running test READ-FILE-AS-STRING-NORMAL-FILE .
                                                                        +;  Did 5 checks.
                                                                        +;     Pass: 5 (100%)
                                                                        +;     Skip: 0 ( 0%)
                                                                        +;     Fail: 0 ( 0%)
                                                                        +;  => T, NIL, NIL
                                                                        +
                                                                        + +

                                                                        If we mess read-file-as-string-non-existing-file up by replacing /tmp/non-existing-file.txt with /tmp/hello.txt, the test would fail (sure!) as expected:

                                                                        + +
                                                                        (run! 'read-file-as-string-non-existing-file)
                                                                        +; Running test READ-FILE-AS-STRING-NON-EXISTING-FILE ff
                                                                        +;  Did 2 checks.
                                                                        +;     Pass: 0 ( 0%)
                                                                        +;     Skip: 0 ( 0%)
                                                                        +;     Fail: 2 (100%)
                                                                        +;  Failure Details:
                                                                        +;  --------------------------------
                                                                        +;  READ-FILE-AS-STRING-NON-EXISTING-FILE []: 
                                                                        +;       Should return NIL when :ERROR-IF-NOT-EXISTS is set to NIL.
                                                                        +;  --------------------------------
                                                                        +;  --------------------------------
                                                                        +;  READ-FILE-AS-STRING-NON-EXISTING-FILE []: 
                                                                        +;       Failed to signal a FILE-NOT-EXISTING-ERROR.
                                                                        +;  --------------------------------
                                                                        +;  => NIL
                                                                        +; (#<IT.BESE.FIVEAM::TEST-FAILURE {10064485F3}>
                                                                        +;  #<IT.BESE.FIVEAM::TEST-FAILURE {1006438663}>)
                                                                        +; NIL
                                                                        +
                                                                        + +

                                                                        The behavior of the suite/test runner can be customized by the *on-failure* variable, which controls what to do when a check failure happens. It can be set to one of the following values:

                                                                        + +
                                                                          +
                                                                        • :debug to drop to the debugger.
                                                                        • +
                                                                        • :backtrace to print a backtrace and continue.
                                                                        • +
                                                                        • NIL (default) to simply continue and print the report.
                                                                        • +
                                                                        + +

                                                                        There is also *on-error*.

                                                                        + +

                                                                        Running tests as they are compiled

                                                                        + +

                                                                        Under normal circumstances, a test is written and compiled (with the +usual C-c C-c in Slime) separately from the moment it is run. If you +want to run the test when it is defined (with C-c C-c), set this:

                                                                        + +
                                                                        (setf fiveam:*run-test-when-defined* t)
                                                                        +
                                                                        + +

                                                                        Custom and shorter tests explanations

                                                                        + +

                                                                        We said earlier that a check accepts an optional custom reason that can be formatted with format directives. Here’s a simple example.

                                                                        + +

                                                                        We are testing a math function:

                                                                        + +
                                                                        (test simple-maths
                                                                        +  (is (= 3 (+ 1 1))))
                                                                        +
                                                                        + +

                                                                        When we run! it, we see this somewhat lengthy but informative output (and that’s very important):

                                                                        + +
                                                                        Running test suite NIL
                                                                        + Running test SIMPLE-MATHS f
                                                                        + Did 1 check.
                                                                        +    Pass: 0 ( 0%)
                                                                        +    Skip: 0 ( 0%)
                                                                        +    Fail: 1 (100%)
                                                                        +
                                                                        + Failure Details:
                                                                        + --------------------------------
                                                                        + SIMPLE-MATHS []:
                                                                        +
                                                                        +(+ 1 1)
                                                                        +
                                                                        + evaluated to
                                                                        +
                                                                        +2
                                                                        +
                                                                        + which is not
                                                                        +
                                                                        +=
                                                                        +
                                                                        + to
                                                                        +
                                                                        +3
                                                                        +
                                                                        +
                                                                        + --------------------------------
                                                                        +
                                                                        + +

                                                                        Now, we can give it a custom reason:

                                                                        + +
                                                                        (test simple-maths
                                                                        +  (is (= 3 (+ 1 1))
                                                                        +      "Maths should work, right? ~a. Another parameter is: ~S" t :foo))
                                                                        +
                                                                        + +

                                                                        And we will see:

                                                                        + +
                                                                        Running test suite NIL
                                                                        + Running test SIMPLE-MATHS f
                                                                        + Did 1 check.
                                                                        +    Pass: 0 ( 0%)
                                                                        +    Skip: 0 ( 0%)
                                                                        +    Fail: 1 (100%)
                                                                        +
                                                                        + Failure Details:
                                                                        + --------------------------------
                                                                        + SIMPLE-MATHS []:
                                                                        +      Maths should work, right? T. Another parameter is: :FOO
                                                                        + --------------------------------
                                                                        +
                                                                        + +

                                                                        Fixtures

                                                                        + +

                                                                        FiveAM also provides a feature called fixtures for setting up +testing context. The goal is to ensure that some functions are not +called and always return the same result. Think functions hitting the +network: you want to isolate the network call in a small function and +write a fixture so that in your tests, this function always returns +the same, known result. (But if you do so, you might also need an “end +to end†test that tests with real data and all your code…)

                                                                        + +

                                                                        However, FiveAM’s fixture system is nothing more than a macro, it is +not fully-featured compared to other libraries such as +Mockingbird, and even +FiveAM’s maintainer encourages to “just use a macro†instead.

                                                                        + +

                                                                        Mockingbird (and maybe other libraries), in addition to the basic +feature descibed above, also allows to count the number of times a +function was called, with what arguments, and so on.

                                                                        + +

                                                                        Random checking

                                                                        + +

                                                                        The goal of random testing is to assist the developer in generating +test cases, and thus, to find cases that the developer would not have +thought about.

                                                                        + +

                                                                        We have a few data generators at our disposal, for example:

                                                                        + +
                                                                        (gen-float)
                                                                        +#<CLOSURE (LAMBDA () :IN GEN-FLOAT) {1005A906AB}>
                                                                        +
                                                                        +(funcall (gen-float))
                                                                        +9.220082e37
                                                                        +
                                                                        +(funcall (gen-integer :max 27 :min -16))
                                                                        +26
                                                                        +
                                                                        + +

                                                                        or again, gen-string, gen-list, gen-tree, gen-buffer, gen-character.

                                                                        + +

                                                                        And we have a function to run 100 checks, taking each turn a new value from the given generators: for-all:

                                                                        + +
                                                                        (test randomtest
                                                                        +  (for-all ((a (gen-integer :min 1 :max 10))
                                                                        +            (b (gen-integer :min 1 :max 10)))
                                                                        +    "Test random tests."
                                                                        +    (is (<= a b))))
                                                                        +
                                                                        + +

                                                                        When you run! 'randomtest this, I expect you will hit an error. You can’t +possibly always get a lower than b, can you?

                                                                        + +

                                                                        For more, see FiveAM’s documentation.

                                                                        + +

                                                                        See also cl-quickcheck and Check-it, inspired by Haskell’s QuickCheck test framework.

                                                                        + +

                                                                        ASDF integration

                                                                        + +

                                                                        So it would be nice to provide a one-line trigger to test our my-system system. Recall that we said it is better to provide a root suite? Here is the reason:

                                                                        + +
                                                                        (defsystem my-system
                                                                        +  ;; Parts omitted.
                                                                        +  :in-order-to ((test-op (test-op :my-system/test))))
                                                                        +
                                                                        +(defsystem mitogrator/test
                                                                        +  ;; Parts omitted.
                                                                        +  :perform (test-op (op c)
                                                                        +                    (symbol-call :fiveam :run!
                                                                        +                                 (find-symbol* :my-system :my-system/test))))
                                                                        +
                                                                        + +

                                                                        The last line tells ASDF to load symbol :my-system from my-system/test package and call fiveam:run!. It fact, it is equivalent to (run! 'my-system) as mentioned above.

                                                                        + +

                                                                        Running tests on the terminal

                                                                        + +

                                                                        Until now, we ran our tests from our editor’s REPL. How can we run them from a terminal window?

                                                                        + +

                                                                        As always, the required steps are as follow:

                                                                        + +
                                                                          +
                                                                        • start our Lisp
                                                                        • +
                                                                        • make sure Quicklisp is enabled (if we have external dependencies)
                                                                        • +
                                                                        • load our main system
                                                                        • +
                                                                        • load the test system
                                                                        • +
                                                                        • run the FiveAM tests.
                                                                        • +
                                                                        + +

                                                                        You could put them in a new run-tests.lisp file:

                                                                        + +
                                                                        (load "mysystem.lisp")
                                                                        +(load "mysystem-tests.lisp") ;; <-- where all the FiveAM tests are written.
                                                                        +(in-package :mysystem-tests)
                                                                        +
                                                                        +(run!)  ;; <-- run all the tests and print the report.
                                                                        +
                                                                        + +

                                                                        and you could invoke it like so, from a source file or from a Makefile:

                                                                        + +
                                                                        rlwrap sbcl --non-interactive --load mysystem.asd --eval '(ql:quickload :mysystem)' --load run-tests.lisp
                                                                        +;; we assume Quicklisp is installed and loaded. This can be done in the Lisp startup file like .sbclrc.
                                                                        +
                                                                        + +

                                                                        Before going that route however, have a look at the CI-Utils tool +that we use in the Continuous Integration section below. It provides a +run-fiveam command that can do all that for you.

                                                                        + +

                                                                        But let us highlight something you’ll have to take care of if you ran +your tests like this: the exit code. Indeed, (run!) prints a +report, but it doesn’t say to your Lisp wether the tests were +successful or not, and wether to exit with an exit code of 0 (for +success) or more (for errors). So, if your testst were run on a CI +system, the CI status would be always green, even if tests failed. To +remedy that, replace run! by:

                                                                        + +
                                                                        (let ((result (run!)))
                                                                        +  (cond
                                                                        +    ((null result)
                                                                        +     (log:info "Tests failed!")  ;; FiveAM printed the report already.
                                                                        +     (uiop:quit 1))
                                                                        +    (t
                                                                        +     (log:info "All pass.")
                                                                        +     (uiop:quit))))
                                                                        +
                                                                        + +

                                                                        Check with echo $? on your shell that the exit code is correct.

                                                                        + +

                                                                        Testing report customization

                                                                        + +

                                                                        It is possible to generate our own testing report. The macro run! is nothing more than a composition of explain! and run.

                                                                        + +

                                                                        Instead of generating a testing report like its cousin run!, the function run runs suite or test passed in and returns a list of test-result instance, usually instances of test-failure or test-passed sub-classes.

                                                                        + +

                                                                        A class text-explainer is defined as a basic class for testing report generator. A generic function explain is defined to take a text-plainer instance and a test-result instance (returned by run) and generate testing report. The following 2 code snippets are equivalent:

                                                                        + +
                                                                        (run! 'read-file-as-string-non-existing-file)
                                                                        +
                                                                        +(explain (make-instance '5am::detailed-text-explainer)
                                                                        +         (run 'read-file-as-string-non-existing-file))
                                                                        +
                                                                        + +

                                                                        By creating a new sub-class of text-explainer and a method explain for it, it is possible to define a new test reporting system.

                                                                        + +

                                                                        The following code just provides a proof-of-concept implementation. You may need to read the source code of 5am::detailed-text-explainer to fully understand it.

                                                                        + +
                                                                        (defclass my-explainer (5am::text-explainer)
                                                                        +  ())
                                                                        +
                                                                        +(defmethod 5am:explain ((explainer my-explainer) results &optional (stream *standard-output*) recursive-deps)
                                                                        +  (loop for result in results
                                                                        +        do (case (type-of result)
                                                                        +             ('5am::test-passed
                                                                        +              (format stream "~%Test ~a passed" (5am::name (5am::test-case result))))
                                                                        +             ('5am::test-failure
                                                                        +              (format stream "~%Test ~a failed" (5am::name (5am::test-case result)))))))
                                                                        +
                                                                        +(explain (make-instace 'my-explainer)
                                                                        +         (run 'read-file-as-string-non-existing-file))
                                                                        +; Test READ-FILE-AS-STRING-NON-EXISTING-FILE failed
                                                                        +; Test READ-FILE-AS-STRING-NON-EXISTING-FILE passed => NIL
                                                                        +
                                                                        + +

                                                                        Interactively fixing unit tests

                                                                        + +

                                                                        Common Lisp is interactive by nature (or so are most implementations), +and testing frameworks make use of it. It is possible to ask the +framework to open the debugger on a failing test, so that we can +inspect the stack trace and go to the erroneous line instantly, fix it +and re-run the test from where it left off, by choosing the suggested +restart.

                                                                        + +

                                                                        With FiveAM, set fiveam:*on-failure* to :debug:

                                                                        + +
                                                                        (setf fiveam:*on-failure* :debug)
                                                                        +
                                                                        + +

                                                                        You will be dropped into the interactive debugger if an error occurs.

                                                                        + +

                                                                        Use :backtrace to print a backtrace, continue to run the following tests and print FiveAM’s report.

                                                                        + +

                                                                        The default is nil: carry on the tests execution and print the report.

                                                                        + + + +

                                                                        Below is a short screencast showing all this in action:

                                                                        + + + + + +

                                                                        Note that in the debugger:

                                                                        + +
                                                                          +
                                                                        • <enter> on a backtrace shows more of it
                                                                        • +
                                                                        • v on a backtrace goes to the corresponding line or function.
                                                                        • +
                                                                        • you can discover more options with the menu.
                                                                        • +
                                                                        + +

                                                                        Code coverage

                                                                        + +

                                                                        A code coverage tool produces a visual output that allows to see what +parts of our code were tested or not:

                                                                        + +

                                                                        + +

                                                                        Such capabilities are included into Lisp implementations. For example, SBCL has the +sb-cover module +and the feature is also built-in in CCL +or LispWorks.

                                                                        + +

                                                                        Generating an html test coverage output

                                                                        + +

                                                                        Let’s do it with SBCL’s sb-cover.

                                                                        + +

                                                                        Coverage reports are only generated for code compiled using +compile-file with the value of the sb-cover:store-coverage-data +optimization quality set to 3.

                                                                        + +
                                                                        ;;; Load SB-COVER
                                                                        +(require :sb-cover)
                                                                        +
                                                                        +;;; Turn on generation of code coverage instrumentation in the compiler
                                                                        +(declaim (optimize sb-cover:store-coverage-data))
                                                                        +
                                                                        +;;; Load some code, ensuring that it's recompiled with the new optimization
                                                                        +;;; policy.
                                                                        +(asdf:oos 'asdf:load-op :cl-ppcre-test :force t)
                                                                        +
                                                                        +;;; Run the test suite.
                                                                        +(fiveam:run! yoursystem-test)
                                                                        +
                                                                        + +

                                                                        Produce a coverage report, set the output directory:

                                                                        + +
                                                                        (sb-cover:report "coverage/")
                                                                        +
                                                                        + +

                                                                        Finally, turn off instrumentation:

                                                                        + +
                                                                        (declaim (optimize (sb-cover:store-coverage-data 0)))
                                                                        +
                                                                        + +

                                                                        You can open your browser at +../yourproject/t/coverage/cover-index.html to see the report like +the capture above or like +this code coverage of cl-ppcre.

                                                                        + +

                                                                        Continuous Integration

                                                                        + +

                                                                        Continuous Integration is important to run automatic tests after a +commit or before a pull request, to run code quality checks, to build +and distribute your software… well, to automate everything about software.

                                                                        + +

                                                                        We want our programs to be portable across Lisp implementations, so +we’ll set up our CI pipeline to run our tests against several of them (it +could be SBCL and CCL of course, but while we’re at it ABCL, ECL and +possibly more).

                                                                        + +

                                                                        We have a choice of Continuous Integration services: Travis CI, Circle, Gitlab CI, now also GitHub Actions, etc (many existed before GitHub Actions, if you wonder). We’ll have a look at how to configure a CI pipeline for Common Lisp, and we’ll focus a little more on Gitlab CI on the last part.

                                                                        + +

                                                                        We’ll also quickly show how to publish coverage reports to the Coveralls service. cl-coveralls helps to post our coverage to the service.

                                                                        + +

                                                                        GitHub Actions, Circle CI, Travis… with CI-Utils

                                                                        + +

                                                                        We’ll use CI-Utils, a set of utilities that comes with many examples. It also explains more precisely what is a CI system and compares a dozen of services.

                                                                        + +

                                                                        It relies on Roswell to install the Lisp implementations and to run the tests. They all are installed with a bash one-liner:

                                                                        + +
                                                                        curl -L https://raw.githubusercontent.com/roswell/roswell/release/scripts/install-for-ci.sh | bash
                                                                        +
                                                                        + +

                                                                        (note that on the Gitlab CI example, we use a ready-to-use Docker image that contains them all)

                                                                        + +

                                                                        It also ships with a test runner for FiveAM, which eases some rough parts (like returning the right error code to the terminal). We install ci-utils with Roswell, and we get the run-fiveam executable.

                                                                        + +

                                                                        Then we can run our tests:

                                                                        + +
                                                                        run-fiveam -e t -l foo/test :foo-tests  # foo is our project
                                                                        +
                                                                        + +

                                                                        Following is the complete .travis.yml file.

                                                                        + +

                                                                        The first part should be self-explanatory:

                                                                        + +
                                                                        ### Example configuration for Travis CI ###
                                                                        +language: generic
                                                                        +
                                                                        +addons:
                                                                        +  homebrew:
                                                                        +    update: true
                                                                        +    packages:
                                                                        +    - roswell
                                                                        +  apt:
                                                                        +    packages:
                                                                        +      - libc6-i386 # needed for a couple implementations
                                                                        +      - default-jre # needed for abcl
                                                                        +
                                                                        +# Runs each lisp implementation on each of the listed OS
                                                                        +os:
                                                                        +  - linux
                                                                        +#  - osx # OSX has a long setup on travis, so it's likely easier to just run select implementations on OSX
                                                                        +
                                                                        + +

                                                                        This is how we configure the implementations matrix, to run our tests on several Lisp implementations. We also send the test coverage made with SBCL to Coveralls.

                                                                        + +
                                                                        env:
                                                                        +  global:
                                                                        +    - PATH=~/.roswell/bin:$PATH
                                                                        +    - ROSWELL_INSTALL_DIR=$HOME/.roswell
                                                                        +#    - COVERAGE_EXCLUDE=t  # for rove
                                                                        +  jobs:
                                                                        +    # The implementation and whether coverage is send to coveralls are controlled with these environmental variables
                                                                        +    - LISP=sbcl-bin COVERALLS=true
                                                                        +    - LISP=ccl-bin
                                                                        +    - LISP=abcl
                                                                        +    - LISP=ecl   # warn: in our experience, compilations times can be long on ECL.
                                                                        +
                                                                        +# Additional OS/Lisp combinations can be added to those generated above
                                                                        +jobs:
                                                                        +  include:
                                                                        +    - os: osx
                                                                        +      env: LISP=sbcl-bin
                                                                        +    - os: osx
                                                                        +      env: LISP=ccl-bin
                                                                        +
                                                                        + +

                                                                        Some jobs can be marked as allowed to fail:

                                                                        + +
                                                                        # Note that this should only be used if there is no interest for the library to work on that system
                                                                        +#  allow_failures:
                                                                        +#    - env: LISP=abcl
                                                                        +#    - env: LISP=ecl
                                                                        +#    - env: LISP=cmucl
                                                                        +#    - env: LISP=alisp
                                                                        +#      os: osx
                                                                        +
                                                                        +  fast_finish: true
                                                                        +
                                                                        + +

                                                                        We finally install Roswell, the implementations, and we run our tests.

                                                                        + +
                                                                        cache:
                                                                        +  directories:
                                                                        +    - $HOME/.roswell
                                                                        +    - $HOME/.config/common-lisp
                                                                        +
                                                                        +install:
                                                                        +  - curl -L https://raw.githubusercontent.com/roswell/roswell/release/scripts/install-for-ci.sh | sh
                                                                        +  - ros install ci-utils #for run-fiveam
                                                                        +#  - ros install rove #for [run-] rove
                                                                        +
                                                                        +  # If asdf 3.16 or higher is needed, uncomment the following lines
                                                                        +  #- mkdir -p ~/common-lisp
                                                                        +  #- if [ "$LISP" == "ccl-bin" ]; then git clone https://gitlab.common-lisp.net/asdf/asdf.git ~/common-lisp; fi
                                                                        +
                                                                        +script:
                                                                        +  - run-fiveam -e t -l foo/test :foo-tests
                                                                        +  #- rove foo.asd
                                                                        +
                                                                        + +

                                                                        Below with Gitlab CI, we’ll use a Docker image that already contains the Lisp binaries and every Debian package required to build Quicklisp libraries.

                                                                        + +

                                                                        Gitlab CI

                                                                        + +

                                                                        Gitlab CI is part of +Gitlab and is available on Gitlab.com, for +public and private repositories. Let’s see straight away a simple +.gitlab-ci.yml:

                                                                        + +
                                                                        variables:
                                                                        +  QUICKLISP_ADD_TO_INIT_FILE: "true"
                                                                        +
                                                                        +image: clfoundation/sbcl:latest
                                                                        +
                                                                        +before_script:
                                                                        +  - install-quicklisp
                                                                        +  - git clone https://github.com/foo/bar ~/quicklisp/local-projects/
                                                                        +
                                                                        +test:
                                                                        +  script:
                                                                        +    - make test
                                                                        +
                                                                        + +

                                                                        Gitlab CI is based on Docker. With image we tell it to use the latest tag +of the clfoundation/sbcl +image. This includes the latest version of SBCL, many OS packages useful for CI +purposes, and a script to install Quicklisp. Gitlab will load the image, clone +our project and put us at the project root with administrative rights to run +the rest of the commands.

                                                                        + +

                                                                        test is a “job†we define, script is a +recognized keywords that takes a list of commands to run.

                                                                        + +

                                                                        Suppose we must install dependencies before running our tests: before_script +will run before each job. Here we install Quicklisp (adding it to SBCL’s init +file), and clone a library where Quicklisp can find it.

                                                                        + +

                                                                        We can try locally ourselves. If we already installed Docker and +started its daemon (sudo service docker start), we can do:

                                                                        + +
                                                                        docker run --rm -it -v /path/to/local/code:/usr/local/share/common-lisp/source clfoundation/sbcl:latest bash
                                                                        +
                                                                        + +

                                                                        This will download the lisp image (±300MB compressed), mount some local code in +the image where indicated, and drop us in bash. Now we can try a make test.

                                                                        + +

                                                                        Here is a more complete example that tests against several CL implementations +in parallel:

                                                                        + +
                                                                        variables:
                                                                        +  IMAGE_TAG: latest
                                                                        +  QUICKLISP_ADD_TO_INIT_FILE: "true"
                                                                        +  QUICKLISP_DIST_VERSION: latest
                                                                        +
                                                                        +image: clfoundation/$LISP:$IMAGE_TAG
                                                                        +
                                                                        +stages:
                                                                        +  - test
                                                                        +  - build
                                                                        +
                                                                        +before_script:
                                                                        +  - install-quicklisp
                                                                        +  - git clone https://github.com/foo/bar ~/quicklisp/local-projects/
                                                                        +
                                                                        +.test:
                                                                        +  stage: test
                                                                        +  script:
                                                                        +    - make test
                                                                        +
                                                                        +abcl test:
                                                                        +  extends: .test
                                                                        +  variables:
                                                                        +    LISP: abcl
                                                                        +
                                                                        +ccl test:
                                                                        +  extends: .test
                                                                        +  variables:
                                                                        +    LISP: ccl
                                                                        +
                                                                        +ecl test:
                                                                        +  extends: .test
                                                                        +  variables:
                                                                        +    LISP: ecl
                                                                        +
                                                                        +sbcl test:
                                                                        +  extends: .test
                                                                        +  variables:
                                                                        +    LISP: sbcl
                                                                        +
                                                                        +build:
                                                                        +  stage: build
                                                                        +  variables:
                                                                        +    LISP: sbcl
                                                                        +  only:
                                                                        +    - tags
                                                                        +  script:
                                                                        +    - make build
                                                                        +  artifacts:
                                                                        +    paths:
                                                                        +      - some-file-name
                                                                        +
                                                                        + +

                                                                        Here we defined two stages (see +environments), +“test†and “buildâ€, defined to run one after another. A “build†stage +will start only if the “test†one succeeds.

                                                                        + +

                                                                        “build†is asked to run only when a +new tag is pushed, not at every commit. When it succeeds, it will make +the files listed in artifacts’s paths available for download. We can +download them from Gitlab’s Pipelines UI, or with an url. This one will download +the file “some-file-name†from the latest “build†job:

                                                                        + +
                                                                        https://gitlab.com/username/project-name/-/jobs/artifacts/master/raw/some-file-name?job=build
                                                                        +
                                                                        + +

                                                                        When the pipelines pass, you will see:

                                                                        + +

                                                                        + +

                                                                        You now have a ready to use Gitlab CI.

                                                                        + +

                                                                        Emacs integration: running tests using Slite

                                                                        + +

                                                                        Slite stands for SLIme TEst runner. It allows you to see the summary of test failures, jump to test definitions, rerun tests with the debugger… all from inside Emacs. We get a dashboard-like buffer with green and red badges, from where we can act on tests. It makes the testing process even more integrated and interactive.

                                                                        + +

                                                                        It consists of an ASDF system and an Emacs package. It is a new project (it appeared mid 2021) so, as of September 2021, neither can be installed via Quicklisp or MELPA yet. Please refer to its repository for instructions.

                                                                        + +

                                                                        References

                                                                        + + + +

                                                                        See also

                                                                        + + + + +

                                                                        + Page source: testing.md +

                                                                        +
                                                                        + + + + + +
                                                                        +
                                                                        +
                                                                        + © 2002–2021 the Common Lisp Cookbook Project +
                                                                        + +
                                                                        +
                                                                        T
                                                                        O
                                                                        C
                                                                        +
                                                                        + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/type.html b/clones/lispcookbook.github.io/cl-cookbook/type.html new file mode 100644 index 00000000..e699582b --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/type.html @@ -0,0 +1,602 @@ + + + + + Type System + + + + + + + + + + + + + + +

                                                                        The Common Lisp Cookbook – Type System

                                                                        +
                                                                        + + + + +
                                                                        +
                                                                        + +
                                                                        +
                                                                        + +
                                                                        +
                                                                        Table of Contents
                                                                        +
                                                                          +
                                                                          +
                                                                          + +
                                                                          +

                                                                          The Common Lisp Cookbook – Type System

                                                                          + + +

                                                                          + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                          +

                                                                          + 📕 Get the EPUB and PDF +

                                                                          + + +
                                                                          Common Lisp has a complete and flexible type system and corresponding +tools to inspect, check and manipulate types. It allows creating +custom types, adding type declarations to variables and functions and +thus to get compile-time warnings and errors.

                                                                          + +

                                                                          Values Have Types, Not Variables

                                                                          + +

                                                                          Being different from some languages such as C/C++, variables in Lisp are just +placeholders for objects1. When you setf a variable, an object +is “placed†in it. You can place another value to the same variable later, as +you wish.

                                                                          + +

                                                                          This implies a fact that in Common Lisp objects have types, while +variables do not. This might be surprising at first if you come from a C/C++ +background.

                                                                          + +

                                                                          For example:

                                                                          + +
                                                                          (defvar *var* 1234)
                                                                          +*VAR*
                                                                          +
                                                                          +(type-of *var*)
                                                                          +(INTEGER 0 4611686018427387903)
                                                                          +
                                                                          + +

                                                                          The function type-of returns the type of the given object. The +returned result is a type-specifier. In this case the first +element is the type and the remaining part is extra information (lower and +upper bound) of that type. You can safely ignore it for now. Also remember +that integers in Lisp have no limit!

                                                                          + +

                                                                          Now let’s try to setf the variable:

                                                                          + +
                                                                          * (setf *var* "hello")
                                                                          +"hello"
                                                                          +
                                                                          +* (type-of *var*)
                                                                          +(SIMPLE-ARRAY CHARACTER (5))
                                                                          +
                                                                          + +

                                                                          You see, type-of returns a different result: simple-array +of length 5 with contents of type character. This is because +*var* is evaluated to string "hello" and the function type-of actually +returns the type of object "hello" instead of variable *var*.

                                                                          + +

                                                                          Type Hierarchy

                                                                          + +

                                                                          The inheritance relationship of Lisp types consists a type graph and the root +of all types is T. For example:

                                                                          + +
                                                                          * (describe 'integer)
                                                                          +COMMON-LISP:INTEGER
                                                                          +  [symbol]
                                                                          +
                                                                          +INTEGER names the built-in-class #<BUILT-IN-CLASS COMMON-LISP:INTEGER>:
                                                                          +  Class precedence-list: INTEGER, RATIONAL, REAL, NUMBER, T
                                                                          +  Direct superclasses: RATIONAL
                                                                          +  Direct subclasses: FIXNUM, BIGNUM
                                                                          +  No direct slots.
                                                                          +
                                                                          +INTEGER names a primitive type-specifier:
                                                                          +  Lambda-list: (&OPTIONAL (SB-KERNEL::LOW '*) (SB-KERNEL::HIGH '*))
                                                                          +
                                                                          + +

                                                                          The function describe shows that the symbol integer +is a primitive type-specifier that has optional information lower bound and +upper bound. Meanwhile, it is a built-in class. But why?

                                                                          + +

                                                                          Most common Lisp types are implemented as CLOS classes. Some types are simply +“wrappers†of other types. Each CLOS class maps to a corresponding type. In +Lisp types are referred to indirectly by the use of type +specifiers.

                                                                          + +

                                                                          There are some differences between the function type-of and +class-of. The function type-of returns the type of a given +object in type specifier format while class-of returns the implementation +details.

                                                                          + +
                                                                          * (type-of 1234)
                                                                          +(INTEGER 0 4611686018427387903)
                                                                          +
                                                                          +* (class-of 1234)
                                                                          +#<BUILT-IN-CLASS COMMON-LISP:FIXNUM>
                                                                          +
                                                                          + +

                                                                          Checking Types

                                                                          + +

                                                                          The function typep can be used to check if the first argument is of +the given type specified by the second argument.

                                                                          + +
                                                                          * (typep 1234 'integer)
                                                                          +T
                                                                          +
                                                                          + +

                                                                          The function subtypep can be used to inspect if a type inherits +from the another one. It returns 2 values:

                                                                          +
                                                                            +
                                                                          • T, T means first argument is sub-type of the second one.
                                                                          • +
                                                                          • NIL, T means first argument is not sub-type of the second one.
                                                                          • +
                                                                          • NIL, NIL means “not determinedâ€.
                                                                          • +
                                                                          + +

                                                                          For example:

                                                                          + +
                                                                          * (subtypep 'integer 'number)
                                                                          +T
                                                                          +T
                                                                          +
                                                                          +* (subtypep 'string 'number)
                                                                          +NIL
                                                                          +T
                                                                          +
                                                                          + +

                                                                          Sometimes you may want to perform different actions according to the type of +an argument. The macro typecase is your friend:

                                                                          + +
                                                                          * (defun plus1 (arg)
                                                                          +    (typecase arg
                                                                          +      (integer (+ arg 1))
                                                                          +      (string (concatenate 'string arg "1"))
                                                                          +      (t 'error)))
                                                                          +PLUS1
                                                                          +
                                                                          +* (plus1 100)
                                                                          +101 (7 bits, #x65, #o145, #b1100101)
                                                                          +
                                                                          +* (plus1 "hello")
                                                                          +"hello1"
                                                                          +
                                                                          +* (plus1 'hello)
                                                                          +ERROR
                                                                          +
                                                                          + +

                                                                          Type Specifier

                                                                          + +

                                                                          A type specifier is a form specifying a type. As mentioned above, returning +value of the function type-of and the second argument of typep are both +type specifiers.

                                                                          + +

                                                                          As shown above, (type-of 1234) returns (INTEGER 0 +4611686018427387903). This kind of type specifiers are called compound type +specifier. It is a list whose head is a symbol indicating the type. The rest +part of it is complementary information.

                                                                          + +
                                                                          * (typep '#(1 2 3) '(vector number 3))
                                                                          +T
                                                                          +
                                                                          + +

                                                                          Here the complementary information of the type vector is its elements type +and size respectively.

                                                                          + +

                                                                          The rest part of a compound type specifier can be a *, which means +“anythingâ€. For example, the type specifier (vector number *) denotes a +vector consisting of any number of numbers.

                                                                          + +
                                                                          * (typep '#(1 2 3) '(vector number *))
                                                                          +T
                                                                          +
                                                                          + +

                                                                          The trailing parts can be omitted, the omitted elements are treated as +*s:

                                                                          + +
                                                                          * (typep '#(1 2 3) '(vector number))
                                                                          +T
                                                                          +
                                                                          +* (typep '#(1 2 3) '(vector))
                                                                          +T
                                                                          +
                                                                          + +

                                                                          As you may have guessed, the type specifier above can be shortened as +following:

                                                                          + +
                                                                          * (typep '#(1 2 3) 'vector)
                                                                          +T
                                                                          +
                                                                          + +

                                                                          You may refer to the CLHS page for more information.

                                                                          + +

                                                                          Defining New Types

                                                                          + +

                                                                          You can use the macro deftype to define a new type-specifier.

                                                                          + +

                                                                          Its argument list can be understood as a direct mapping to elements of rest +part of a compound type specifier. They are defined as optional to allow +symbol type specifier.

                                                                          + +

                                                                          Its body should be a macro checking whether given argument is of this type +(see defmacro).

                                                                          + +

                                                                          Now let us define a new data type. The data type should be a array with at +most 10 elements. Also each element should be a number smaller than 10. See +following code for an example:

                                                                          + +
                                                                          * (defun small-number-array-p (thing)
                                                                          +    (and (arrayp thing)
                                                                          +      (<= (length thing) 10)
                                                                          +      (every #'numberp thing)
                                                                          +      (every (lambda (x) (< x 10)) thing)))
                                                                          +
                                                                          +* (deftype small-number-array (&optional type)
                                                                          +    `(and (array ,type 1)
                                                                          +          (satisfies small-number-array-p)))
                                                                          +
                                                                          +* (typep '#(1 2 3 4) '(small-number-array number))
                                                                          +T
                                                                          +
                                                                          +* (typep '#(1 2 3 4) 'small-number-array)
                                                                          +T
                                                                          +
                                                                          +* (typep '#(1 2 3 4 100) 'small-number-array)
                                                                          +NIL
                                                                          +
                                                                          +* (small-number-array-p '#(1 2 3 4 5 6 7 8 9 0 1))
                                                                          +NIL
                                                                          +
                                                                          + +

                                                                          Type Checking

                                                                          + +

                                                                          Common Lisp supports run-time type checking via the macro +check-type. It accepts a place and a type specifier +as arguments and signals an type-error if the contents of +place are not of the given type.

                                                                          + +
                                                                          * (defun plus1 (arg)
                                                                          +    (check-type arg number)
                                                                          +    (1+ arg))
                                                                          +PLUS1
                                                                          +
                                                                          +* (plus1 1)
                                                                          +2 (2 bits, #x2, #o2, #b10)
                                                                          +
                                                                          +* (plus1 "hello")
                                                                          +; Debugger entered on #<SIMPLE-TYPE-ERROR expected-type: NUMBER datum: "Hello">
                                                                          +
                                                                          +The value of ARG is "Hello", which is not of type NUMBER.
                                                                          +   [Condition of type SIMPLE-TYPE-ERROR]
                                                                          +...
                                                                          +
                                                                          + +

                                                                          Compile-time type checking

                                                                          + +

                                                                          You may provide type information for variables, function arguments +etc via proclaim, declaim and declare. +However, similar to the :type slot +introduced in CLOS section, the effects of type declarations are +undefined in Lisp standard and are implementation specific. So there is no +guarantee that the Lisp compiler will perform compile-time type checking.

                                                                          + +

                                                                          However, it is possible, and SBCL is an implementation that does +thorough type checking.

                                                                          + +

                                                                          Let’s recall first that Lisp already warns about simple type +warnings. The following function wrongly wants to concatenate a string +and a number. When we compile it, we get a type warning.

                                                                          + +
                                                                          (defconstant +foo+ 3)
                                                                          +(defun bar ()
                                                                          +  (concatenate 'string "+" +foo+))
                                                                          +; caught WARNING:
                                                                          +;   Constant 3 conflicts with its asserted type SEQUENCE.
                                                                          +;   See also:
                                                                          +;     The SBCL Manual, Node "Handling of Types"
                                                                          +
                                                                          + +

                                                                          The example is simple, but it already shows a capacity some other +languages don’t have, and it is actually useful during development ;) +Now, we’ll do better.

                                                                          + +

                                                                          Declaring the type of variables

                                                                          + +

                                                                          Use the macro declaim.

                                                                          + +

                                                                          Let’s declare that our global variable *name* is a string (you can +type the following in any order in the REPL):

                                                                          + +
                                                                          (declaim (type (string) *name*))
                                                                          +(defparameter *name* "book")
                                                                          +
                                                                          + +

                                                                          Now if we try to set it with a bad type, we get a simple-type-error:

                                                                          + +
                                                                          (setf *name* :me)
                                                                          +Value of :ME in (THE STRING :ME) is :ME, not a STRING.
                                                                          +   [Condition of type SIMPLE-TYPE-ERROR]
                                                                          +
                                                                          + +

                                                                          We can do the same with our custom types. Let’s quickly declare the type list-of-strings:

                                                                          + +
                                                                          (defun list-of-strings-p (list)
                                                                          +  "Return t if LIST is non nil and contains only strings."
                                                                          +  (and (consp list)
                                                                          +       (every #'stringp list)))
                                                                          +
                                                                          +(deftype list-of-strings ()
                                                                          +  `(satisfies list-of-strings-p))
                                                                          +
                                                                          + +

                                                                          Now let’s declare that our *all-names* variables is a list of strings:

                                                                          + +
                                                                          (declaim (type (list-of-strings) *all-names*))
                                                                          +;; and with a wrong value:
                                                                          +(defparameter *all-names* "")
                                                                          +;; we get an error:
                                                                          +Cannot set SYMBOL-VALUE of *ALL-NAMES* to "", not of type
                                                                          +(SATISFIES LIST-OF-STRINGS-P).
                                                                          +   [Condition of type SIMPLE-TYPE-ERROR]
                                                                          +
                                                                          + +

                                                                          We can compose types:

                                                                          + +
                                                                          (declaim (type (or null list-of-strings) *all-names*))
                                                                          +
                                                                          + +

                                                                          Declaring the input and output types of functions

                                                                          + +

                                                                          We use again the declaim macro, with ftype (function …) instead of just type:

                                                                          + +
                                                                          (declaim (ftype (function (fixnum) fixnum) add))
                                                                          +;;                         ^^input ^^output [optional]
                                                                          +(defun add (n)
                                                                          +  (+ n  1))
                                                                          +
                                                                          + +

                                                                          With this we get nice type warnings at compile time.

                                                                          + +

                                                                          If we change the function to erroneously return a string instead of a +fixnum, we get a warning:

                                                                          + +
                                                                          (defun add (n)
                                                                          +  (format nil "~a" (+ n  1)))
                                                                          +; caught WARNING:
                                                                          +;   Derived type of ((GET-OUTPUT-STREAM-STRING STREAM)) is
                                                                          +;     (VALUES SIMPLE-STRING &OPTIONAL),
                                                                          +;   conflicting with the declared function return type
                                                                          +;     (VALUES FIXNUM &REST T).
                                                                          +
                                                                          + +

                                                                          If we use add inside another function, to a place that expects a +string, we get a warning:

                                                                          + +
                                                                          (defun bad-concat (n)
                                                                          +  (concatenate 'string (add n)))
                                                                          +; caught WARNING:
                                                                          +;   Derived type of (ADD N) is
                                                                          +;     (VALUES FIXNUM &REST T),
                                                                          +;   conflicting with its asserted type
                                                                          +;     SEQUENCE.
                                                                          +
                                                                          + +

                                                                          If we use add inside another function, and that function declares +its argument types which appear to be incompatible with those of +add, we get a warning:

                                                                          + +
                                                                          (declaim (ftype (function (string)) bad-arg))
                                                                          +(defun bad-arg (n)
                                                                          +    (add n))
                                                                          +; caught WARNING:
                                                                          +;   Derived type of N is
                                                                          +;     (VALUES STRING &OPTIONAL),
                                                                          +;   conflicting with its asserted type
                                                                          +;     FIXNUM.
                                                                          +
                                                                          + +

                                                                          This all happens indeed at compile time, either in the REPL, +either with a simple C-c C-c in Slime, or when we load a file.

                                                                          + +

                                                                          Declaring &key parameters

                                                                          + +

                                                                          Use &key (:argument type).

                                                                          + +

                                                                          For example:

                                                                          + +
                                                                          (declaim (ftype (function (string &key (:n integer))) foo))
                                                                          +(defun foo (bar &key n) …)
                                                                          +
                                                                          + +

                                                                          Declaring class slots types

                                                                          + +

                                                                          A class slot accepts a :type slot option. It is however generally +not used to check the type of the initform. SBCL, starting with +version 1.5.9 released on +november 2019, now gives those warnings, meaning that this:

                                                                          + +
                                                                          (defclass foo ()
                                                                          +  ((name :type number :initform "17")))
                                                                          +
                                                                          + +

                                                                          throws a warning at compile time.

                                                                          + +

                                                                          Note: see also sanity-clause, a data +serialization/contract library to check slots’ types during +make-instance (which is not compile time).

                                                                          + +

                                                                          Alternative type checking syntax: defstar, serapeum

                                                                          + +

                                                                          The Serapeum library provides a shortcut that looks like this:

                                                                          + +
                                                                           (-> mod-fixnum+ (fixnum fixnum) fixnum)
                                                                          + (defun mod-fixnum+ (x y) ...)
                                                                          +
                                                                          + +

                                                                          The Defstar library provides +a defun* macro that allows to add the type declarations into the +lambda list. It looks like this:

                                                                          + +
                                                                          (defun* sum ((a real) (b real))
                                                                          +   (+ a b))
                                                                          +
                                                                          + +

                                                                          It also allows:

                                                                          + +
                                                                            +
                                                                          • to declare the return type, either in the function definition or in its body
                                                                          • +
                                                                          • to quickly declare variables that are ignored, with the _ placeholder
                                                                          • +
                                                                          • to add assertions for each arguments
                                                                          • +
                                                                          • to do the same with defmethod, defparameter, defvar, flet, labels, let* and lambda.
                                                                          • +
                                                                          + +

                                                                          Limitations

                                                                          + +

                                                                          Complex types involving satisfies are not checked inside a function +body, only at its boundaries. Even if it does a lot, SBCL doesn’t do +as much as a statically typed language.

                                                                          + +

                                                                          Consider this example, where we badly increment an integer with a +string:

                                                                          + +
                                                                          (declaim (ftype (function () string) bad-adder))
                                                                          +(defun bad-adder ()
                                                                          +  (let ((res 10))
                                                                          +    (loop for name in '("alice")
                                                                          +       do (incf res name))  ;; bad
                                                                          +    (format nil "finally doing sth with ~a" res)))
                                                                          +
                                                                          + +

                                                                          Compiling this function doesn’t throw a type warning.

                                                                          + +

                                                                          However, if we had the problematic line at the function’s boundary +we’d get the warning:

                                                                          + +
                                                                          (defun bad-adder ()
                                                                          +  (let ((res 10))
                                                                          +    (loop for name in  '("alice")
                                                                          +       return (incf res name))))
                                                                          +; in: DEFUN BAD-ADDER
                                                                          +;     (SB-INT:NAMED-LAMBDA BAD-ADDER
                                                                          +;         NIL
                                                                          +;       (BLOCK BAD-ADDER
                                                                          +;         (LET ((RES 10))
                                                                          +;           (LOOP FOR NAME IN *ALL-NAMES* RETURN (INCF RES NAME)))))
                                                                          +;
                                                                          +; caught WARNING:
                                                                          +;   Derived type of ("a hairy form" NIL (SETQ RES (+ NAME RES))) is
                                                                          +;     (VALUES (OR NULL NUMBER) &OPTIONAL),
                                                                          +;   conflicting with the declared function return type
                                                                          +;     (VALUES STRING &REST T).
                                                                          +
                                                                          + +

                                                                          What can we conclude? This is yet another reason to decompose your +code into small functions.

                                                                          + +

                                                                          See also

                                                                          + +
                                                                            +
                                                                          • the article Static type checking in SBCL, by Martin Cracauer
                                                                          • +
                                                                          • the article Typed List, a Primer - let’s explore Lisp’s fine-grained type hierarchy! with a shallow comparison to Haskell.
                                                                          • +
                                                                          • the Coalton library: an +efficient, statically typed functional programming language that +supercharges Common Lisp. It is as an embedded DSL in Lisp that +resembles Haskell or Standard ML, but lets you seamlessly +interoperate with non-statically-typed Lisp code (and vice versa).
                                                                          • +
                                                                          + +
                                                                          + +
                                                                          +
                                                                            +
                                                                          1. +

                                                                            The term object here has nothing to do with Object-Oriented or so. It +means “any Lisp datumâ€. 

                                                                            +
                                                                          2. +
                                                                          +
                                                                          + + +

                                                                          + Page source: type.md +

                                                                          +
                                                                          + + + + + +
                                                                          +
                                                                          +
                                                                          + © 2002–2021 the Common Lisp Cookbook Project +
                                                                          + +
                                                                          +
                                                                          T
                                                                          O
                                                                          C
                                                                          +
                                                                          + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/vscode-alive.html b/clones/lispcookbook.github.io/cl-cookbook/vscode-alive.html new file mode 100644 index 00000000..bd41b1a0 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/vscode-alive.html @@ -0,0 +1,669 @@ + + + + + Using VSCode with Alive + + + + + + + + + + + + + + +

                                                                          The Common Lisp Cookbook – Using VSCode with Alive

                                                                          +
                                                                          + + + + +
                                                                          +
                                                                          + +
                                                                          +
                                                                          + +
                                                                          +
                                                                          Table of Contents
                                                                          +
                                                                            +
                                                                            +
                                                                            + +
                                                                            +

                                                                            The Common Lisp Cookbook – Using VSCode with Alive

                                                                            + + +

                                                                            + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                            +

                                                                            + 📕 Get the EPUB and PDF +

                                                                            + + +
                                                                            The +Alive +extension makes VSCode a powerful +Common Lisp development platform. Alive hooks directly into the Swank +server that Emacs Slime uses and is fully compatible with VSCode’s +ability to develop remotely in containers, WSL, Remote machines, etc. +It has no dependencies beyond a version of Common Lisp running on the +target platform that can run the Swank server. It currently supports:

                                                                            + +
                                                                              +
                                                                            • Syntax highlighting
                                                                            • +
                                                                            • Code completion
                                                                            • +
                                                                            • Code formatter
                                                                            • +
                                                                            • Jump to definition
                                                                            • +
                                                                            • Snippets
                                                                            • +
                                                                            • REPL integration
                                                                            • +
                                                                            • Interactive Debugger
                                                                            • +
                                                                            • REPL history
                                                                            • +
                                                                            • Inline evaluation
                                                                            • +
                                                                            • Macro expand
                                                                            • +
                                                                            • Disassemble
                                                                            • +
                                                                            • Inspector
                                                                            • +
                                                                            • Hover Text
                                                                            • +
                                                                            • Rename function args and let bindings
                                                                            • +
                                                                            • Code folding
                                                                            • +
                                                                            + +

                                                                            + +

                                                                            Prerequisites

                                                                            + +

                                                                            The Alive extension in VSCode is compatible with ANSI Common Lisp, +and these instructions should work for any of them as long as the Alive +REPL starts up successfully. The examples all use SBCL.

                                                                            + + + +

                                                                            Connect VSCode to a REPL

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. Inside of VSCode, open a lisp file that you want to edit. +
                                                                                +
                                                                              • If you don’t have one, create a new one called hello.lisp
                                                                              • +
                                                                              +
                                                                            2. +
                                                                            3. Inside of VSCode, open the Command Palette on the menu at the top +where it says View/Command Palette and start an instance of SBCL +running a Swank server attached to your VSCode REPL by choosing: +Alive: Start REPL And Attach. +
                                                                                +
                                                                              • You will see a small window pop up that says REPL Connected
                                                                              • +
                                                                              • If you don’t get a REPL Connected message, open up VSCode’s +Output on the menu at the top where it says View:Output and +choose Swank Trace from the pulldown. This output is the output +from the running lisp image and will get you started on figuring +out what might be going wrong.
                                                                              • +
                                                                              +
                                                                            4. +
                                                                            + +

                                                                            Congrats, You now have a VSCode instance running a REPL attached to a +Swank server running on port 4005 of a running SBCL image. You can +now evaluate statements in your file and they will be processed in +your running SBCL instance.

                                                                            + +

                                                                            To disconnect your REPL and shut down your SBCL instance, open the +Command Palette on the menu at the top where it says View/Command +Palette and choose: Alive: Detach from REPL

                                                                            + +

                                                                            There are keybindings for every operation, feel free to explore and +modify those as needed.

                                                                            + +

                                                                            Recipes

                                                                            + +

                                                                            All recipes assume you have a file open in VSCode running with an attached +REPL unless otherwise stated.

                                                                            + +

                                                                            When evaluating an expression, you choose the expression to evaluate by +putting your cursor anywhere in or immediately following the +s-expression that you wish to evaluate.

                                                                            + +

                                                                            Evaluate a statement in-line

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. In your open file in your editor window, enter:
                                                                            2. +
                                                                            + +
                                                                            (+ 2 2)
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Inline Eval
                                                                            2. +
                                                                            3. +

                                                                              You will see a small pop up that says => 4 (3 bits, #x4, #o4, +#b100), which is the result

                                                                              + +

                                                                              Evaluating a statement in-line is exactly the same as sending it to +the REPL. The only difference is how it is displayed.

                                                                              +
                                                                            4. +
                                                                            + +

                                                                            Evaluate a statement

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. In your open file in your editor window, enter:
                                                                            2. +
                                                                            + +
                                                                            (+ 2 2)
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Send To REPL
                                                                            2. +
                                                                            3. You will see the expression show up in the REPL along with the result.
                                                                            4. +
                                                                            + +
                                                                            CL-USER>
                                                                            +(+ 2 2)
                                                                            +4
                                                                            +CL-USER>
                                                                            +
                                                                            + +

                                                                            Compile a file

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. In your open file in your editor window, enter:
                                                                            2. +
                                                                            + +
                                                                            (+ 2 2)
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Compile
                                                                            2. +
                                                                            3. You will see details about the compile in your repl, and a fasl file +in your filesystem.
                                                                            4. +
                                                                            + +
                                                                            CL-USER>
                                                                            +
                                                                            +; compiling file "/Users/jason/Desktop/hello.lisp" (written 14 SEP 2021 04:24:37 AM):
                                                                            +
                                                                            +
                                                                            +; wrote /Users/jason/Desktop/hello.fasl
                                                                            +
                                                                            +; compilation finished in 0:00:00.001
                                                                            +
                                                                            + +

                                                                            Use the Interactive Debugger to abort

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. In your open file in your editor window, enter:
                                                                            2. +
                                                                            + +
                                                                            (defun divide (x y)
                                                                            +  (/ x y))
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Put your cursor after the last parenthesis if it isn’t already there. +Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Inline Eval to load your define +function into your image.
                                                                            2. +
                                                                            3. In your open file, add another new line and enter:
                                                                            4. +
                                                                            + +
                                                                            (divide 1 0)
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Put your cursor after the last parenthesis if it isn’t already there. +Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Inline Eval to run your divide function +in your image.
                                                                            2. +
                                                                            3. You will see the Interactive Debugger pop up. In the Restarts +section, choose option 2 to Abort.
                                                                            4. +
                                                                            5. You’re now back to your editor and still-running REPL and can +continue like it never happened.
                                                                            6. +
                                                                            + +

                                                                            Use the Interactive Debugger to fix a problem at runtime

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. In your open file in your editor window, enter:
                                                                            2. +
                                                                            + +
                                                                            (defun divide (x y)
                                                                            +  (assert (not (zerop y))
                                                                            +          (y)
                                                                            +          "The second argument can not be zero. Please change it.")
                                                                            +  (/ x y))
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Put your cursor after the last parenthesis if it isn’t already there. +Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Inline Eval to load your define +function into your image.
                                                                            2. +
                                                                            3. In your open file, add another new line and enter:
                                                                            4. +
                                                                            + +
                                                                            (divide 1 0)
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Put your cursor after the last parenthesis if it isn’t already there. +Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Inline Eval to run your divide function +in your image.
                                                                            2. +
                                                                            3. You will see the Interactive Debugger pop up. In the Restarts +section, choose option 0 to “Retry assertion with new value for Yâ€.
                                                                            4. +
                                                                            5. In the popup menu, enter `y’
                                                                            6. +
                                                                            7. In the next popup menu, enter 1
                                                                            8. +
                                                                            9. You should now see a small pop up that says => 1 (1 bit, #x1, #o1, +#b1), which is the result of the new value. You’re now back to your +editor and still-running REPL after crashing out into the debugger, +having it let you change the value that caused the crash, and then +proceeding like you never typed that bad 0 value.
                                                                            10. +
                                                                            + +

                                                                            More ideas for what can be done with the debugger can be found on the error handling page.

                                                                            + +

                                                                            Expand a macro

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. In your open file in your editor window, enter:
                                                                            2. +
                                                                            + +
                                                                            (loop for x in '(a b c d e) do
                                                                            +     (print x))
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Put your cursor after the last parenthesis if it isn’t already there. +Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Macro Expand to expand the for-loop macro.
                                                                            2. +
                                                                            3. You should see something like this:
                                                                            4. +
                                                                            + +
                                                                            (BLOCK NIL
                                                                            +  (LET ((X NIL)
                                                                            +        (#:LOOP-LIST-559
                                                                            +         (SB-KERNEL:THE* (LIST :USE-ANNOTATIONS T :SOURCE-FORM '(A B C D E))
                                                                            +                         '(A B C D E))))
                                                                            +    (DECLARE (IGNORABLE #:LOOP-LIST-559)
                                                                            +             (IGNORABLE X))
                                                                            +    (TAGBODY
                                                                            +     SB-LOOP::NEXT-LOOP
                                                                            +      (SETQ X (CAR #:LOOP-LIST-559))
                                                                            +      (SETQ #:LOOP-LIST-559 (CDR #:LOOP-LIST-559))
                                                                            +      (PRINT X)
                                                                            +      (IF (ENDP #:LOOP-LIST-559)
                                                                            +          (GO SB-LOOP::END-LOOP))
                                                                            +      (GO SB-LOOP::NEXT-LOOP)
                                                                            +     SB-LOOP::END-LOOP)))
                                                                            +
                                                                            + +

                                                                            Disassemble a function

                                                                            + +

                                                                            + +
                                                                              +
                                                                            1. In your open file in your editor window, enter:
                                                                            2. +
                                                                            + +
                                                                            (defun hello (name)
                                                                            +  (format t "Hello, ~A~%" name))
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Put your cursor after the last parenthesis if it isn’t already there. +Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Inline Eval to load the function into +your image.
                                                                            2. +
                                                                            3. Put your cursor after the last parenthesis if it isn’t already there. +Open the Command Palette on the menu at the top View/Command +Palette and choose Alive: Disassemble print out the machine code +of your compiled function.
                                                                            4. +
                                                                            5. It will start something like this:
                                                                            6. +
                                                                            + +
                                                                            ; disassembly for HELLO
                                                                            +; Size: 172 bytes. Origin: #x70052478B4                       ; HELLO
                                                                            +; 8B4:       AC0A40F9         LDR R2, [THREAD, #16]           ; binding-stack-pointer
                                                                            +; 8B8:       4C0F00F9         STR R2, [CFP, #24]
                                                                            +; 8BC:       AC4642F9         LDR R2, [THREAD, #1160]         ; tls: *STANDARD-OUTPUT*
                                                                            +; 8C0:       9F8501F1         CMP R2, #97
                                                                            +; 8C4:       61000054         BNE L0
                                                                            +; 8C8:       4AFDFF58         LDR R0, #x7005247870            ; '*STANDARD-OUTPUT*
                                                                            +; 8CC:       4C1140F8         LDR R2, [R0, #1]
                                                                            +; 8D0: L0:   4C1700F9         STR R2, [CFP, #40]
                                                                            +; 8D4:       E0031BAA         MOV NL0, CSP
                                                                            +; 8D8:       7A0701F8         STR CFP, [CSP], #16
                                                                            +; 8DC:       EAFCFF58         LDR R0, #x7005247878            ; "Hello, "
                                                                            +; 8E0:       4B1740F9         LDR R1, [CFP, #40]
                                                                            +; 8E4:       B6FBFF58         LDR LEXENV, #x7005247858        ; #<SB-KERNEL:FDEFN WRITE-STRING>
                                                                            +; 8E8:       970080D2         MOVZ NARGS, #4
                                                                            +; 8EC:       FA0300AA         MOV CFP, NL0
                                                                            +; 8F0:       DE9240F8         LDR LR, [LEXENV, #9]
                                                                            +; 8F4:       C0033FD6         BLR LR
                                                                            +; 8F8:       3B039B9A         CSEL CSP, OCFP, CSP, EQ
                                                                            +; 8FC:       E0031BAA         MOV NL0, CSP
                                                                            +; 900:       7A0701F8         STR CFP, [CSP], #16
                                                                            +; 904:       4A2F42A9         LDP R0, R1, [CFP, #32]
                                                                            +; 908:       D6FAFF58         LDR LEXENV, #x7005247860        ; #<SB-KERNEL:FDEFN PRINC>
                                                                            +; 90C:       970080D2         MOVZ NARGS, #4
                                                                            +; 910:       FA0300AA         MOV CFP, NL0
                                                                            +; 914:       DE9240F8         LDR LR, [LEXENV, #9]
                                                                            +; 918:       C0033FD6         BLR LR
                                                                            +; 91C:       3B039B9A         CSEL CSP, OCFP, CSP, EQ
                                                                            +; 920:       E0031BAA         MOV NL0, CSP
                                                                            +; 924:       7A0701F8         STR CFP, [CSP], #16
                                                                            +; 928:       2A4981D2         MOVZ R0, #2633
                                                                            +; 92C:       4B1740F9         LDR R1, [CFP, #40]
                                                                            +; 930:       D6F9FF58         LDR LEXENV, #x7005247868        ; #<SB-KERNEL:FDEFN WRITE-CHAR>
                                                                            +; 934:       970080D2         MOVZ NARGS, #4
                                                                            +; 938:       FA0300AA         MOV CFP, NL0
                                                                            +; 93C:       DE9240F8         LDR LR, [LEXENV, #9]
                                                                            +; 940:       C0033FD6         BLR LR
                                                                            +; 944:       3B039B9A         CSEL CSP, OCFP, CSP, EQ
                                                                            +; 948:       EA031DAA         MOV R0, NULL
                                                                            +; 94C:       FB031AAA         MOV CSP, CFP
                                                                            +; 950:       5A7B40A9         LDP CFP, LR, [CFP]
                                                                            +; 954:       BF0300F1         CMP NULL, #0
                                                                            +; 958:       C0035FD6         RET
                                                                            +; 95C:       E00120D4         BRK #15                         ; Invalid argument count trap
                                                                            +
                                                                            + +

                                                                            Create a skeleton Common Lisp system

                                                                            + +

                                                                            + +

                                                                            This recipe creates a new Common Lisp System, so it does not need a +running REPL.

                                                                            + +
                                                                              +
                                                                            1. Create a folder called experiment for your new project
                                                                            2. +
                                                                            3. Open vscode in your newly created directory
                                                                            4. +
                                                                            + +
                                                                            cd experiment
                                                                            +code .
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Create new Common Lisp System. +
                                                                                +
                                                                              • Inside of VSCode, Open Command Palette on the menu at the top + View/Command Palette and generate a system skeleton: Alive: System Skeleton
                                                                              • +
                                                                              • The previous command should have generated the following directory + structure:
                                                                              • +
                                                                              +
                                                                                +
                                                                              • experiment.asd
                                                                              • +
                                                                              • src/ +
                                                                                  +
                                                                                • app.lisp
                                                                                • +
                                                                                +
                                                                              • +
                                                                              • test/ +
                                                                                  +
                                                                                • all.lisp
                                                                                • +
                                                                                +
                                                                              • +
                                                                              +
                                                                            2. +
                                                                            + +

                                                                            The content of those files is as follows:

                                                                            + +

                                                                            experiment.asd:

                                                                            + +
                                                                            (in-package :asdf-user)
                                                                            +
                                                                            +(defsystem "experiment"
                                                                            +  :class :package-inferred-system
                                                                            +  :depends-on ("experiment/src/app")
                                                                            +  :description ""
                                                                            +  :in-order-to ((test-op (load-op "experiment/test/all")))
                                                                            +  :perform (test-op (o c) (symbol-call :test/all :test-suite)))
                                                                            +
                                                                            +(defsystem "experiment/test"
                                                                            +  :depends-on ("experiment/test/all"))
                                                                            +
                                                                            +(register-system-packages "experiment/src/app" '(:app))
                                                                            +(register-system-packages "experiment/test/all" '(:test/all))
                                                                            +
                                                                            + +

                                                                            src/app.lisp:

                                                                            + +
                                                                            (defpackage :app
                                                                            +  (:use :cl))
                                                                            +
                                                                            +(in-package :app)
                                                                            +
                                                                            + +

                                                                            test/all.lisp:

                                                                            + +
                                                                            (defpackage :test/all
                                                                            +  (:use :cl
                                                                            +        :app)
                                                                            +  (:export :test-suite))
                                                                            +
                                                                            +(in-package :test/all)
                                                                            +
                                                                            +(defun test-suite ()
                                                                            +  (format T "Test Suite~%"))
                                                                            +
                                                                            + +

                                                                            Optional Custom Configurations

                                                                            + +

                                                                            Configuring VSCode Alive to work with Quicklisp

                                                                            + +

                                                                            Assuming that you have quicklisp installed and configured to load on +init, quicklisp just works.

                                                                            + +

                                                                            Configuring VSCode Alive to work with CLPM in the default context

                                                                            + +

                                                                            Assuming that you have CLPM installed and +configured, modify your vscode settings to +look like this:

                                                                            + +
                                                                              +
                                                                            1. Add the following to to your VSCode settings:
                                                                            2. +
                                                                            + +
                                                                              "alive.swank.startupCommand":[
                                                                            +    "clpm",
                                                                            +    "exec",
                                                                            +    "--",
                                                                            +    "sbcl",
                                                                            +    "--eval",
                                                                            +    "(asdf:load-system :swank)",
                                                                            +    "--eval",
                                                                            +    "(swank:create-server)"
                                                                            +  ],
                                                                            +
                                                                            + +

                                                                            This will start up sbcl in the default clpm context

                                                                            + +

                                                                            Configuring VSCode Alive to work with CLPM using a bundle clpmfile

                                                                            + +

                                                                            Assuming that you have CLPM installed and configured +and a bundle configured in the root of your home directory that contains +swank as a dev dependency, modify your vscode +settings to +look like this:

                                                                            + +
                                                                              +
                                                                            1. Add the following to your VSCode settings:
                                                                            2. +
                                                                            + +
                                                                              "alive.swank.startupCommand":[
                                                                            +    "clpm",
                                                                            +    "bundle",
                                                                            +    "exec",
                                                                            +    "--",
                                                                            +    "sbcl",
                                                                            +    "--eval",
                                                                            +    "(asdf:load-system :swank)",
                                                                            +    "--eval",
                                                                            +    "(swank:create-server)"
                                                                            +  ],
                                                                            +
                                                                            + +

                                                                            This will start up sbcl in your bundle’s clpm context

                                                                            + +

                                                                            Configuring VSCode Alive to work with Roswell

                                                                            + +

                                                                            Assuming that you have Roswell installed, +modify your vscode +settings to +look like this:

                                                                            + +
                                                                              "alive.swank.startupCommand": [
                                                                            +    "ros",
                                                                            +    "run",
                                                                            +    "--eval",
                                                                            +    "(require :asdf)",
                                                                            +    "--eval",
                                                                            +    "(asdf:load-system :swank)",
                                                                            +    "--eval",
                                                                            +    "(swank:create-server)"
                                                                            +  ]
                                                                            +
                                                                            + +

                                                                            Connecting VSCode Alive to a Docker container

                                                                            + +

                                                                            + +

                                                                            These instructions will work for remote connections, wsl connections, +and github Codespaces as well using the Remote - SSH and Remote - +WSL, and Github Codespaces extensions, respectively assuming you have +the extensions installed. For this example, make sure you have the +Containers extension installed and +configured.

                                                                            + +
                                                                              +
                                                                            1. Pull a docker image that has sbcl installed, in this example, we’ll use +the latest clfoundations sbcl.
                                                                            2. +
                                                                            + +
                                                                            docker pull clfoundation/sbcl
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. Run bash in the docker image to start it up and keep it running.
                                                                            2. +
                                                                            + +
                                                                            docker run -it clfoundation/sbcl bash
                                                                            +
                                                                            + +
                                                                              +
                                                                            1. In the VSCode Side Bar, click the Remote Explorer icon.
                                                                            2. +
                                                                            3. In the list of Dev Containers, right click on clfoundation/sbcl and choose +Attach to Container.
                                                                            4. +
                                                                            5. In the VSCode Side Bar of the new VSCode window that opens up, click +on Explorer. You may need to tell it to view the files in your +container if it isn’t already showing them.
                                                                            6. +
                                                                            7. Once you’re viewing the files in the container, right click in the +VSCode Side Bar and choose New File. Name the file hello.lisp
                                                                            8. +
                                                                            9. In the VSCode Site Bar, click the Extensions icon
                                                                            10. +
                                                                            11. Click the Install in Container... button for the Alive plugin
                                                                            12. +
                                                                            13. Open up your hello.lisp file and follow the “Connect VSCode to a +REPL†instructions at the beginning of these recipes
                                                                            14. +
                                                                            15. You now have VSCode running a REPL hooked to a Slime server running +on an SBCL image in a docker container.
                                                                            16. +
                                                                            + + +

                                                                            + Page source: vscode-alive.md +

                                                                            +
                                                                            + + + + + +
                                                                            +
                                                                            +
                                                                            + © 2002–2021 the Common Lisp Cookbook Project +
                                                                            + +
                                                                            +
                                                                            T
                                                                            O
                                                                            C
                                                                            +
                                                                            + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/web-scraping.html b/clones/lispcookbook.github.io/cl-cookbook/web-scraping.html new file mode 100644 index 00000000..db4fd28f --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/web-scraping.html @@ -0,0 +1,436 @@ + + + + + Web Scraping + + + + + + + + + + + + + + +

                                                                            The Common Lisp Cookbook – Web Scraping

                                                                            +
                                                                            + + + + +
                                                                            +
                                                                            + +
                                                                            +
                                                                            + +
                                                                            +
                                                                            Table of Contents
                                                                            +
                                                                              +
                                                                              +
                                                                              + +
                                                                              +

                                                                              The Common Lisp Cookbook – Web Scraping

                                                                              + + +

                                                                              + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                              +

                                                                              + 📕 Get the EPUB and PDF +

                                                                              + + +
                                                                              The set of tools to do web scraping in Common Lisp is pretty complete +and pleasant. In this short tutorial we’ll see how to make http +requests, parse html, extract content and do asynchronous requests.

                                                                              + +

                                                                              Our simple task will be to extract the list of links on the CL +Cookbook’s index page and check if they are reachable.

                                                                              + +

                                                                              We’ll use the following libraries:

                                                                              + +
                                                                                +
                                                                              • Dexador - an HTTP client +(that aims at replacing the venerable Drakma),
                                                                              • +
                                                                              • Plump - a markup parser, that works on malformed HTML,
                                                                              • +
                                                                              • Lquery - a DOM manipulation +library, to extract content from our Plump result,
                                                                              • +
                                                                              • lparallel - a library for parallel programming (read more in the process section).
                                                                              • +
                                                                              + +

                                                                              Before starting let’s install those libraries with Quicklisp:

                                                                              + +
                                                                              (ql:quickload '("dexador" "plump" "lquery" "lparallel"))
                                                                              +
                                                                              + +

                                                                              HTTP Requests

                                                                              + +

                                                                              Easy things first. Install Dexador. Then we use the get function:

                                                                              + +
                                                                              (defvar *url* "https://lispcookbook.github.io/cl-cookbook/")
                                                                              +(defvar *request* (dex:get *url*))
                                                                              +
                                                                              + +

                                                                              This returns a list of values: the whole page content, the return code +(200), the response headers, the uri and the stream.

                                                                              + +
                                                                              "<!DOCTYPE html>
                                                                              + <html lang=\"en\">
                                                                              +  <head>
                                                                              +    <title>Home &ndash; the Common Lisp Cookbook</title>
                                                                              +    […]
                                                                              +    "
                                                                              +200
                                                                              +#<HASH-TABLE :TEST EQUAL :COUNT 19 {1008BF3043}>
                                                                              +#<QURI.URI.HTTP:URI-HTTPS https://lispcookbook.github.io/cl-cookbook/>
                                                                              +#<CL+SSL::SSL-STREAM for #<FD-STREAM for "socket 192.168.0.23:34897, peer: 151.101.120.133:443" {100781C133}>>
                                                                              +
                                                                              +
                                                                              + +

                                                                              Remember, in Slime we can inspect the objects with a right-click on +them.

                                                                              + +

                                                                              Parsing and extracting content with CSS selectors

                                                                              + +

                                                                              We’ll use lquery to parse the html and extract the +content.

                                                                              + + + +

                                                                              We first need to parse the html into an internal data structure. Use +(lquery:$ (initialize <html>)):

                                                                              + +
                                                                              (defvar *parsed-content* (lquery:$ (initialize *request*)))
                                                                              +;; => #<PLUMP-DOM:ROOT {1009EE5FE3}>
                                                                              +
                                                                              + +

                                                                              lquery uses Plump internally.

                                                                              + +

                                                                              Now we’ll extract the links with CSS selectors.

                                                                              + +

                                                                              Note: to find out what should be the CSS selector of the element +I’m interested in, I right click on an element in the browser and I +choose “Inspect elementâ€. This opens up the inspector of my browser’s +web dev tool and I can study the page structure.

                                                                              + +

                                                                              So the links I want to extract are in a page with an id of value +“contentâ€, and they are in regular list elements (li).

                                                                              + +

                                                                              Let’s try something:

                                                                              + +
                                                                              (lquery:$ *parsed-content* "#content li")
                                                                              +;; => #(#<PLUMP-DOM:ELEMENT li {100B3263A3}> #<PLUMP-DOM:ELEMENT li {100B3263E3}>
                                                                              +;;  #<PLUMP-DOM:ELEMENT li {100B326423}> #<PLUMP-DOM:ELEMENT li {100B326463}>
                                                                              +;;  #<PLUMP-DOM:ELEMENT li {100B3264A3}> #<PLUMP-DOM:ELEMENT li {100B3264E3}>
                                                                              +;;  #<PLUMP-DOM:ELEMENT li {100B326523}> #<PLUMP-DOM:ELEMENT li {100B326563}>
                                                                              +;;  #<PLUMP-DOM:ELEMENT li {100B3265A3}> #<PLUMP-DOM:ELEMENT li {100B3265E3}>
                                                                              +;;  #<PLUMP-DOM:ELEMENT li {100B326623}> #<PLUMP-DOM:ELEMENT li {100B326663}>
                                                                              +;;  […]
                                                                              +
                                                                              + +

                                                                              Wow it works ! We get here a vector of plump elements.

                                                                              + +

                                                                              I’d like to easily check what those elements are. To see the entire +html, we can end our lquery line with (serialize):

                                                                              + +
                                                                              (lquery:$  *parsed-content* "#content li" (serialize))
                                                                              +#("<li><a href=\"license.html\">License</a></li>"
                                                                              +  "<li><a href=\"getting-started.html\">Getting started</a></li>"
                                                                              +  "<li><a href=\"editor-support.html\">Editor support</a></li>"
                                                                              +  […]
                                                                              +
                                                                              + +

                                                                              And to see their textual content (the user-visible text inside the +html), we can use (text) instead:

                                                                              + +
                                                                              (lquery:$  *parsed-content* "#content" (text))
                                                                              +#("License" "Editor support" "Strings" "Dates and Times" "Hash Tables"
                                                                              +  "Pattern Matching / Regular Expressions" "Functions" "Loop" "Input/Output"
                                                                              +  "Files and Directories" "Packages" "Macros and Backquote"
                                                                              +  "CLOS (the Common Lisp Object System)" "Sockets" "Interfacing with your OS"
                                                                              +  "Foreign Function Interfaces" "Threads" "Defining Systems"
                                                                              +  […]
                                                                              +  "Pascal Costanza’s Highly Opinionated Guide to Lisp"
                                                                              +  "Loving Lisp - the Savy Programmer’s Secret Weapon by Mark Watson"
                                                                              +  "FranzInc, a company selling Common Lisp and Graph Database solutions.")
                                                                              +
                                                                              + +

                                                                              All right, so we see we are manipulating what we want. Now to get their +href, a quick look at lquery’s doc and we’ll use (attr +"some-name"):

                                                                              + +
                                                                              (lquery:$  *parsed-content* "#content li a" (attr :href))
                                                                              +;; => #("license.html" "editor-support.html" "strings.html" "dates_and_times.html"
                                                                              +;;  "hashes.html" "pattern_matching.html" "functions.html" "loop.html" "io.html"
                                                                              +;;  "files.html" "packages.html" "macros.html"
                                                                              +;;  "/cl-cookbook/clos-tutorial/index.html" "os.html" "ffi.html"
                                                                              +;;  "process.html" "systems.html" "win32.html" "testing.html" "misc.html"
                                                                              +;;  […]
                                                                              +;;  "http://www.nicklevine.org/declarative/lectures/"
                                                                              +;;  "http://www.p-cos.net/lisp/guide.html" "https://leanpub.com/lovinglisp/"
                                                                              +;;  "https://franz.com/")
                                                                              +
                                                                              + +

                                                                              Note: using (serialize) after attr leads to an error.

                                                                              + +

                                                                              Nice, we now have the list (well, a vector) of links of the +page. We’ll now write an async program to check and validate they are +reachable.

                                                                              + +

                                                                              External resources:

                                                                              + + + +

                                                                              Async requests

                                                                              + +

                                                                              In this example we’ll take the list of url from above and we’ll check +if they are reachable. We want to do this asynchronously, but to see +the benefits we’ll first do it synchronously !

                                                                              + +

                                                                              We need a bit of filtering first to exclude the email addresses (maybe +that was doable in the CSS selector ?).

                                                                              + +

                                                                              We put the vector of urls in a variable:

                                                                              + +
                                                                              (defvar *urls* (lquery:$  *parsed-content* "#content li a" (attr :href)))
                                                                              +
                                                                              + +

                                                                              We remove the elements that start with “mailto:â€: (a quick look at the +strings page will help)

                                                                              + +
                                                                              (remove-if (lambda (it) (string= it "mailto:" :start1 0 :end1 (length "mailto:"))) *urls*)
                                                                              +;; => #("license.html" "editor-support.html" "strings.html" "dates_and_times.html"
                                                                              +;;  […]
                                                                              +;;  "process.html" "systems.html" "win32.html" "testing.html" "misc.html"
                                                                              +;;  "license.html" "http://lisp-lang.org/"
                                                                              +;;  "https://github.com/CodyReichert/awesome-cl"
                                                                              +;;  "http://www.lispworks.com/documentation/HyperSpec/Front/index.htm"
                                                                              +;;  […]
                                                                              +;;  "https://franz.com/")
                                                                              +
                                                                              + +

                                                                              Actually before writing the remove-if (which works on any sequence, +including vectors) I tested with a (map 'vector …) to see that the +results where indeed nil or t.

                                                                              + +

                                                                              As a side note, there is a handy starts-with function in +cl-strings, +available in Quicklisp. So we could do:

                                                                              + +
                                                                              (map 'vector (lambda (it) (cl-strings:starts-with it "mailto:")) *urls*)
                                                                              +
                                                                              + +

                                                                              it also has an option to ignore or respect the case.

                                                                              + +

                                                                              While we’re at it, we’ll only consider links starting with “httpâ€, in +order not to write too much stuff irrelevant to web scraping:

                                                                              + +
                                                                              (remove-if-not (lambda (it) (string= it "http" :start1 0 :end1 (length "http"))) *) ;; note the remove-if-NOT
                                                                              +
                                                                              + +

                                                                              All right, we put this result in another variable:

                                                                              + +
                                                                              (defvar *filtered-urls* *)
                                                                              +
                                                                              + +

                                                                              and now to the real work. For every url, we want to request it and +check that its return code is 200. We have to ignore certain +errors. Indeed, a request can timeout, be redirected (we don’t want +that) or return an error code.

                                                                              + +

                                                                              To be in real conditions we’ll add a link that times out in our list:

                                                                              + +
                                                                              (setf (aref *filtered-urls* 0) "http://lisp.org")  ;; too bad indeed
                                                                              +
                                                                              + +

                                                                              We’ll take the simple approach to ignore errors and return nil in +that case. If all goes well, we return the return code, that should be +200.

                                                                              + +

                                                                              As we saw at the beginning, dex:get returns many values, including +the return code. We’ll catch only this one with nth-value (instead +of all of them with multiple-value-bind) and we’ll use +ignore-errors, that returns nil in case of an error. We could also +use handler-case and catch specific error types (see examples in +dexador’s documentation) or (better yet ?) use handler-bind to catch +any condition.

                                                                              + +

                                                                              (ignore-errors has the caveat that when there’s an error, we can not +return the element it comes from. We’ll get to our ends though.)

                                                                              + +
                                                                              (map 'vector (lambda (it)
                                                                              +  (ignore-errors
                                                                              +    (nth-value 1 (dex:get it))))
                                                                              +  *filtered-urls*)
                                                                              +
                                                                              + +

                                                                              we get:

                                                                              + +
                                                                              #(NIL 200 200 200 200 200 200 200 200 200 200 NIL 200 200 200 200 200 200 200
                                                                              +  200 200 200 200)
                                                                              +
                                                                              + +

                                                                              it works, but it took a very long time. How much time precisely ? +with (time …):

                                                                              + +
                                                                              Evaluation took:
                                                                              +  21.554 seconds of real time
                                                                              +  0.188000 seconds of total run time (0.172000 user, 0.016000 system)
                                                                              +  0.87% CPU
                                                                              +  55,912,081,589 processor cycles
                                                                              +  9,279,664 bytes consed
                                                                              +
                                                                              + +

                                                                              21 seconds ! Obviously this synchronous method isn’t efficient. We +wait 10 seconds for links that time out. It’s time to write and +measure and async version.

                                                                              + +

                                                                              After installing lparallel and looking at +its documentation, we see that the parallel +map pmap seems to be what we +want. And it’s only a one word edit. Let’s try:

                                                                              + +
                                                                              (time (lparallel:pmap 'vector
                                                                              +  (lambda (it)
                                                                              +    (ignore-errors (let ((status (nth-value 1 (dex:get it)))) status)))
                                                                              +  *filtered-urls*)
                                                                              +;;  Evaluation took:
                                                                              +;;  11.584 seconds of real time
                                                                              +;;  0.156000 seconds of total run time (0.136000 user, 0.020000 system)
                                                                              +;;  1.35% CPU
                                                                              +;;  30,050,475,879 processor cycles
                                                                              +;;  7,241,616 bytes consed
                                                                              +;;
                                                                              +;;#(NIL 200 200 200 200 200 200 200 200 200 200 NIL 200 200 200 200 200 200 200
                                                                              +;;  200 200 200 200)
                                                                              +
                                                                              + +

                                                                              Bingo. It still takes more than 10 seconds because we wait 10 seconds +for one request that times out. But otherwise it proceeds all the http +requests in parallel and so it is much faster.

                                                                              + +

                                                                              Shall we get the urls that aren’t reachable, remove them from our list +and measure the execution time in the sync and async cases ?

                                                                              + +

                                                                              What we do is: instead of returning only the return code, we check it +is valid and we return the url:

                                                                              + +
                                                                              ... (if (and status (= 200 status)) it) ...
                                                                              +(defvar *valid-urls* *)
                                                                              +
                                                                              + +

                                                                              we get a vector of urls with a couple of nils: indeed, I thought I +would have only one unreachable url but I discovered another +one. Hopefully I have pushed a fix before you try this tutorial.

                                                                              + +

                                                                              But what are they ? We saw the status codes but not the urls :S We +have a vector with all the urls and another with the valid ones. We’ll +simply treat them as sets and compute their difference. This will show +us the bad ones. We must transform our vectors to lists for that.

                                                                              + +
                                                                              (set-difference (coerce *filtered-urls* 'list)
                                                                              +                (coerce *valid-urls* 'list))
                                                                              +;; => ("http://lisp-lang.org/" "http://www.psg.com/~dlamkins/sl/cover.html")
                                                                              +
                                                                              + +

                                                                              Gotcha !

                                                                              + +

                                                                              BTW it takes 8.280 seconds of real time to me to check the list of +valid urls synchronously, and 2.857 seconds async.

                                                                              + +

                                                                              Have fun doing web scraping in CL !

                                                                              + +

                                                                              More helpful libraries:

                                                                              + +
                                                                                +
                                                                              • we could use VCR, a store and +replay utility to set up repeatable tests or to speed up a bit our +experiments in the REPL.
                                                                              • +
                                                                              • cl-async, +carrier and others +network, parallelism and concurrency libraries to see on the +awesome-cl list, +Cliki or +Quickdocs.
                                                                              • +
                                                                              + + +

                                                                              + Page source: web-scraping.md +

                                                                              +
                                                                              + + + + + +
                                                                              +
                                                                              +
                                                                              + © 2002–2021 the Common Lisp Cookbook Project +
                                                                              + +
                                                                              +
                                                                              T
                                                                              O
                                                                              C
                                                                              +
                                                                              + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/web.html b/clones/lispcookbook.github.io/cl-cookbook/web.html new file mode 100644 index 00000000..a7328237 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/web.html @@ -0,0 +1,1166 @@ + + + + + Web development + + + + + + + + + + + + + + +

                                                                              The Common Lisp Cookbook – Web development

                                                                              +
                                                                              + + + + +
                                                                              +
                                                                              + +
                                                                              +
                                                                              + +
                                                                              +
                                                                              Table of Contents
                                                                              +
                                                                                +
                                                                                +
                                                                                + +
                                                                                +

                                                                                The Common Lisp Cookbook – Web development

                                                                                + + +

                                                                                + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                                +

                                                                                + 📕 Get the EPUB and PDF +

                                                                                + + +
                                                                                For web development as for any other task, one can leverage Common Lisp’s +advantages: the unmatched REPL that even helps to interact with a running web +app, the exception handling system, performance, the ability to build a +self-contained executable, stability, good threads story, strong typing, etc. We +can, say, define a new route and try it right away, there is no need to restart +any running server. We can change and compile one function at a time (the +usual C-c C-c in Slime) and try it. The feedback is immediate. We can choose +the degree of interactivity: the web server can catch exceptions and fire the +interactive debugger, or print lisp backtraces on the browser, or display a 404 +error page and print logs on standard output. The ability to build +self-contained executables eases deployment tremendously (compared to, for +example, npm-based apps), in that we just copy the executable to a server and +run it.

                                                                                + +

                                                                                And when we have deployed our app, we can still interact with it, +allowing for hot reload, that even works when new dependencies have to +be installed. If you are careful and don’t want to use full live +reload, you might still enjoy this capability to reload, for example, a user’s +configuration file.

                                                                                + +

                                                                                We’ll present here some established web frameworks and other common +libraries to help you getting started in developing a web +application. We do not aim to be exhaustive nor to replace the +upstream documentation. Your feedback and contributions are +appreciated.

                                                                                + + + + + +

                                                                                Overview

                                                                                + +

                                                                                Hunchentoot and Clack are two projects that +you’ll often hear about.

                                                                                + +

                                                                                Hunchentoot is

                                                                                + +
                                                                                +

                                                                                a web server and at the same time a toolkit for building dynamic websites. As a stand-alone web server, Hunchentoot is capable of HTTP/1.1 chunking (both directions), persistent connections (keep-alive), and SSL. It provides facilities like automatic session handling (with and without cookies), logging, customizable error handling, and easy access to GET and POST parameters sent by the client.

                                                                                +
                                                                                + +

                                                                                It is a software written by Edi Weitz (“Common Lisp Recipesâ€, +cl-ppcre and much more), it’s used and +proven solid. One can achieve a lot with it, but sometimes with more +friction than with a traditional web framework. For example, +dispatching a route by the HTTP method is a bit convoluted, one must +write a function for the :uri parameter that does the check, when it +is a built-in keyword in other frameworks like Caveman.

                                                                                + +

                                                                                Clack is

                                                                                + +
                                                                                +

                                                                                a web application environment for Common Lisp inspired by Python’s WSGI and Ruby’s Rack.

                                                                                +
                                                                                + +

                                                                                Also written by a prolific lisper +(E. Fukamachi), it actually uses +Hunchentoot by default as the server, but thanks to its pluggable +architecture one can use another web server, like the asynchronous +Woo, built on the +libev event loop, maybe +“the fastest web server written in any programming languageâ€.

                                                                                + +

                                                                                We’ll cite also Wookie, an asynchronous HTTP server, and its +companion library +cl-async, for general +purpose, non-blocking programming in Common Lisp, built on libuv, the +backend library in Node.js.

                                                                                + +

                                                                                Clack being more recent and less documented, and Hunchentoot a +de-facto standard, we’ll concentrate on the latter for this +recipe. Your contributions are of course welcome.

                                                                                + +

                                                                                Web frameworks build upon web servers and can provide facilities for +common activities in web development, like a templating system, access +to a database, session management, or facilities to build a REST api.

                                                                                + +

                                                                                Some web frameworks include:

                                                                                + +
                                                                                  +
                                                                                • Caveman, by E. Fukamachi. It provides, out of the box, +database management, a templating engine (Djula), a project skeleton +generator, a routing system à la Flask or Sinatra, deployment options +(mod_lisp or FastCGI), support for Roswell on the command line, etc.
                                                                                • +
                                                                                • Radiance, by Shinmera +(Qtools, Portacle, lquery, …), is a web application environment, +more general than usual web frameworks. It lets us write and tie +websites and applications together, easing their deployment as a +whole. It has thorough documentation, a tutorial, modules, pre-written applications such as an image board or a blogging platform, and more. +For example websites, see +https://shinmera.com/, +reader.tymoon.eu and events.tymoon.eu.
                                                                                • +
                                                                                • Snooze, by João Távora (Sly, Emacs’ Yasnippet, Eglot, …), +is “an URL router designed around REST web servicesâ€. It is +different because in Snooze, routes are just functions and HTTP +conditions are just Lisp conditions.
                                                                                • +
                                                                                • cl-rest-server is a library for writing REST web +APIs. It features validation with schemas, annotations for logging, +caching, permissions or authentication, documentation via OpenAPI (Swagger), +etc.
                                                                                • +
                                                                                • last but not least, Weblocks is a venerable Common Lisp +web framework that permits to write ajax-based dynamic web +applications without writing any JavaScript, nor writing some lisp +that would transpile to JavaScript. It is seeing an extensive +rewrite and update since 2017. We present it in more details below.
                                                                                • +
                                                                                + +

                                                                                For a full list of libraries for the web, please see the awesome-cl +list +#network-and-internet +and Cliki. If you are looking for a +featureful static site generator, see +Coleslaw.

                                                                                + +

                                                                                Installation

                                                                                + +

                                                                                Let’s install the libraries we’ll use:

                                                                                + +
                                                                                (ql:quickload '("hunchentoot" "caveman2" "spinneret" "djula"))
                                                                                +
                                                                                + +

                                                                                To try Weblocks, please see its documentation. The Weblocks in +Quicklisp is not yet, as of writing, the one we are interested in.

                                                                                + +

                                                                                We’ll start by serving local files and we’ll run more than one local +server in the running image.

                                                                                + +

                                                                                Simple webserver

                                                                                + +

                                                                                Serve local files

                                                                                + +

                                                                                Hunchentoot

                                                                                + +

                                                                                Create and start a webserver like this:

                                                                                + +
                                                                                (defvar *acceptor* (make-instance 'hunchentoot:easy-acceptor :port 4242))
                                                                                +(hunchentoot:start *acceptor*)
                                                                                +
                                                                                + +

                                                                                We create an instance of easy-acceptor on port 4242 and we start +it. We can now access http://127.0.0.1:4242/. You should get a welcome +screen with a link to the documentation and logs to the console.

                                                                                + +

                                                                                By default, Hunchentoot serves the files from the www/ directory in +its source tree. Thus, if you go to the source of +easy-acceptor (M-. in Slime), which is probably +~/quicklisp/dists/quicklisp/software/hunchentoot-v1.2.38/, you’ll +find the root/ directory. It contains:

                                                                                + +
                                                                                  +
                                                                                • an errors/ directory, with the error templates 404.html and 500.html,
                                                                                • +
                                                                                • an img/ directory,
                                                                                • +
                                                                                • an index.html file.
                                                                                • +
                                                                                + +

                                                                                To serve another directory, we give the option document-root to +easy-acceptor. We can also set the slot with its accessor:

                                                                                + +
                                                                                (setf (hunchentoot:acceptor-document-root *acceptor*) #p"path/to/www")
                                                                                +
                                                                                + +

                                                                                Let’s create our index.html first. Put this in a new +www/index.html at the current directory (of the lisp repl):

                                                                                + +
                                                                                <html>
                                                                                +  <head>
                                                                                +    <title>Hello!</title>
                                                                                +  </head>
                                                                                +  <body>
                                                                                +    <h1>Hello local server!</h1>
                                                                                +    <p>
                                                                                +    We just served our own files.
                                                                                +    </p>
                                                                                +  </body>
                                                                                +</html>
                                                                                +
                                                                                + +

                                                                                Let’s start a new acceptor on a new port:

                                                                                + +
                                                                                (defvar *my-acceptor* (make-instance 'hunchentoot:easy-acceptor :port 4444
                                                                                +                                   :document-root #p"www/"))
                                                                                +(hunchentoot:start *my-acceptor*)
                                                                                +
                                                                                + +

                                                                                go to http://127.0.0.1:4444/ and see the difference.

                                                                                + +

                                                                                Note that we just created another acceptor on a different port on +the same lisp image. This is already pretty cool.

                                                                                + +

                                                                                Access your server from the internet

                                                                                + +

                                                                                Hunchentoot

                                                                                + +

                                                                                With Hunchentoot we have nothing to do, we can see the server from the +internet right away.

                                                                                + +

                                                                                If you evaluate this on your VPS:

                                                                                + +
                                                                                (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242))
                                                                                +
                                                                                + +

                                                                                You can see it right away on your server’s IP.

                                                                                + +

                                                                                Stop it with (hunchentoot:stop *).

                                                                                + +

                                                                                Routing

                                                                                + +

                                                                                Simple routes

                                                                                + +

                                                                                Hunchentoot

                                                                                + +

                                                                                To bind an existing function to a route, we create a “prefix dispatch†+that we push onto the *dispatch-table* list:

                                                                                + +
                                                                                (defun hello ()
                                                                                +   (format nil "Hello, it works!"))
                                                                                +
                                                                                +(push
                                                                                +  (hunchentoot:create-prefix-dispatcher "/hello.html" #'hello)
                                                                                +  hunchentoot:*dispatch-table*)
                                                                                +
                                                                                + +

                                                                                To create a route with a regexp, we use create-regex-dispatcher, where +the url-as-regexp can be a string, an s-expression or a cl-ppcre scanner.

                                                                                + +

                                                                                If you didn’t yet, create an acceptor and start the server:

                                                                                + +
                                                                                (defvar *server* (make-instance 'hunchentoot:easy-acceptor :port 4242))
                                                                                +(hunchentoot:start *server*)
                                                                                +
                                                                                + +

                                                                                and access it on http://localhost:4242/hello.html.

                                                                                + +

                                                                                We can see logs on the REPL:

                                                                                + +
                                                                                127.0.0.1 - [2018-10-27 23:50:09] "get / http/1.1" 200 393 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"
                                                                                +127.0.0.1 - [2018-10-27 23:50:10] "get /img/made-with-lisp-logo.jpg http/1.1" 200 12583 "http://localhost:4242/" "Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"
                                                                                +127.0.0.1 - [2018-10-27 23:50:10] "get /favicon.ico http/1.1" 200 1406 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"
                                                                                +127.0.0.1 - [2018-10-27 23:50:19] "get /hello.html http/1.1" 200 20 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"
                                                                                +
                                                                                + +
                                                                                + +

                                                                                define-easy-handler allows to create a function and to bind it to an uri at once.

                                                                                + +

                                                                                Its form follows

                                                                                + +
                                                                                define-easy-handler (function-name :uri <uri> …) (lambda list parameters)
                                                                                +
                                                                                + +

                                                                                where <uri> can be a string or a function.

                                                                                + +

                                                                                Example:

                                                                                + +
                                                                                (hunchentoot:define-easy-handler (say-yo :uri "/yo") (name)
                                                                                +  (setf (hunchentoot:content-type*) "text/plain")
                                                                                +  (format nil "Hey~@[ ~A~]!" name))
                                                                                +
                                                                                + +

                                                                                Visit it at p://localhost:4242/yo and add parameters on the url: +http://localhost:4242/yo?name=Alice.

                                                                                + +

                                                                                Just a thought… we didn’t explicitly ask Hunchentoot to add this +route to our first acceptor of the port 4242. Let’s try another acceptor (see +previous section), on port 4444: http://localhost:4444/yo?name=Bob It +works too ! In fact, define-easy-handler accepts an acceptor-names +parameter:

                                                                                + +
                                                                                +

                                                                                acceptor-names (which is evaluated) can be a list of symbols which means that the handler will only be returned by DISPATCH-EASY-HANDLERS in acceptors which have one of these names (see ACCEPTOR-NAME). acceptor-names can also be the symbol T which means that the handler will be returned by DISPATCH-EASY-HANDLERS in every acceptor.

                                                                                +
                                                                                + +

                                                                                So, define-easy-handler has the following signature:

                                                                                + +
                                                                                define-easy-handler (function-name &key uri acceptor-names default-request-type) (lambda list parameters)
                                                                                +
                                                                                + +

                                                                                It also has a default-parameter-type which we’ll use in a minute to get url parameters.

                                                                                + +

                                                                                There are also keys to know for the lambda list. Please see the documentation.

                                                                                + +

                                                                                Easy-routes (Hunchentoot)

                                                                                + +

                                                                                easy-routes is a route +handling extension on top of Hunchentoot. It provides:

                                                                                + +
                                                                                  +
                                                                                • dispatch based on HTTP method (otherwise cumbersome in Hunchentoot)
                                                                                • +
                                                                                • arguments extraction from the url path
                                                                                • +
                                                                                • and decorators.
                                                                                • +
                                                                                + +

                                                                                To use it, don’t create a server with hunchentoot:easy-acceptor but +with easy-routes:easy-routes-acceptor:

                                                                                + +
                                                                                (setf *server* (make-instance 'easy-routes:easy-routes-acceptor))
                                                                                +
                                                                                + +

                                                                                Note: there is also routes-acceptor. The difference is that +easy-routes-acceptor iterates over Hunchentoot’s *dispatch-table* +if no route is found by easy-routes. That allows us, for example, to +serve static content the usual way with Hunchentoot.

                                                                                + +

                                                                                Then define a route like this:

                                                                                + +
                                                                                (easy-routes:defroute name ("/foo/:x" :method :get) (y &get z)
                                                                                +    (format nil "x: ~a y: ~a z: ~a" x y z))
                                                                                +
                                                                                + +

                                                                                Here, :x captures the path parameter and binds it to the x +variable into the route body. y and &get z define url parameters, +and we can have &post parameters to extract from the HTTP request +body.

                                                                                + +

                                                                                These parameters can take an :init-form and :parameter-type +options as in define-easy-handler.

                                                                                + +

                                                                                Decorators are functions that are executed before the route body. They +should call the next parameter function to continue executing the +decoration chain and the route body finally. Examples:

                                                                                + +
                                                                                (defun @auth (next)
                                                                                +  (let ((*user* (hunchentoot:session-value 'user)))
                                                                                +    (if (not *user*)
                                                                                +	(hunchentoot:redirect "/login")
                                                                                +	(funcall next))))
                                                                                +
                                                                                +(defun @html (next)
                                                                                +  (setf (hunchentoot:content-type*) "text/html")
                                                                                +  (funcall next))
                                                                                +
                                                                                +(defun @json (next)
                                                                                +  (setf (hunchentoot:content-type*) "application/json")
                                                                                +  (funcall next))
                                                                                +(defun @db (next)
                                                                                +  (postmodern:with-connection *db-spec*
                                                                                +    (funcall next)))
                                                                                +
                                                                                + +

                                                                                See easy-routes’ readme for more.

                                                                                + +

                                                                                Caveman

                                                                                + +

                                                                                Caveman provides two ways to +define a route: the defroute macro and the @route pythonic +annotation:

                                                                                + +
                                                                                (defroute "/welcome" (&key (|name| "Guest"))
                                                                                +  (format nil "Welcome, ~A" |name|))
                                                                                +
                                                                                +@route GET "/welcome"
                                                                                +(lambda (&key (|name| "Guest"))
                                                                                +  (format nil "Welcome, ~A" |name|))
                                                                                +
                                                                                + +

                                                                                A route with an url parameter (note :name in the url):

                                                                                + +
                                                                                (defroute "/hello/:name" (&key name)
                                                                                +  (format nil "Hello, ~A" name))
                                                                                +
                                                                                + +

                                                                                It is also possible to define “wildcards†parameters. It works with +the splat key:

                                                                                + +
                                                                                (defroute "/say/*/to/*" (&key splat)
                                                                                +  ; matches /say/hello/to/world
                                                                                +  (format nil "~A" splat))
                                                                                +;=> (hello world)
                                                                                +
                                                                                + +

                                                                                We must enable regexps with :regexp t:

                                                                                + +
                                                                                (defroute ("/hello/([\\w]+)" :regexp t) (&key captures)
                                                                                +  (format nil "Hello, ~A!" (first captures)))
                                                                                +
                                                                                + +

                                                                                Accessing GET and POST parameters

                                                                                + +

                                                                                Hunchentoot

                                                                                + +

                                                                                First of all, note that we can access query parameters anytime with

                                                                                + +
                                                                                (hunchentoot:parameter "my-param")
                                                                                +
                                                                                + +

                                                                                It acts on the default *request* object which is passed to all handlers.

                                                                                + +

                                                                                There is also get-parameter and post-parameter.

                                                                                + +

                                                                                Earlier we saw some key parameters to define-easy-handler. We now +introduce default-parameter-type.

                                                                                + +

                                                                                We defined the following handler:

                                                                                + +
                                                                                (hunchentoot:define-easy-handler (say-yo :uri "/yo") (name)
                                                                                +  (setf (hunchentoot:content-type*) "text/plain")
                                                                                +  (format nil "Hey~@[ ~A~]!" name))
                                                                                +
                                                                                + +

                                                                                The variable name is a string by default. Let’s check it out:

                                                                                + +
                                                                                (hunchentoot:define-easy-handler (say-yo :uri "/yo") (name)
                                                                                +  (setf (hunchentoot:content-type*) "text/plain")
                                                                                +  (format nil "Hey~@[ ~A~] you are of type ~a" name (type-of name)))
                                                                                +
                                                                                + +

                                                                                Going to http://localhost:4242/yo?name=Alice returns

                                                                                + +
                                                                                Hey Alice you are of type (SIMPLE-ARRAY CHARACTER (5))
                                                                                +
                                                                                + +

                                                                                To automatically bind it to another type, we use default-parameter-type. It can be +one of those simple types:

                                                                                + +
                                                                                  +
                                                                                • 'string (default),
                                                                                • +
                                                                                • 'integer,
                                                                                • +
                                                                                • 'character (accepting strings of length 1 only, otherwise it is nil)
                                                                                • +
                                                                                • or 'boolean
                                                                                • +
                                                                                + +

                                                                                or a compound list:

                                                                                + +
                                                                                  +
                                                                                • '(:list <type>)
                                                                                • +
                                                                                • '(:array <type>)
                                                                                • +
                                                                                • '(:hash-table <type>)
                                                                                • +
                                                                                + +

                                                                                where <type> is a simple type.

                                                                                + + + + + + + +

                                                                                Error handling

                                                                                + +

                                                                                In all frameworks, we can choose the level of interactivity. The web +framework can return a 404 page and print output on the repl, it can +catch errors and invoke the interactive lisp debugger, or it can show +the lisp backtrace on the html page.

                                                                                + +

                                                                                Hunchentoot

                                                                                + +

                                                                                The global variables to set to choose the error handling behaviour are:

                                                                                + +
                                                                                  +
                                                                                • *catch-errors-p*: set to nil if you want errors to be caught in +the interactive debugger (for development only, of course):
                                                                                • +
                                                                                + +
                                                                                (setf hunchentoot:*catch-errors-p* nil)
                                                                                +
                                                                                + +

                                                                                See also the generic function maybe-invoke-debugger if you want to +fine-tune this behaviour. You might want to specialize it on specific +condition classes (see below) for debugging purposes. The default method invokes +the debugger +if *catch-errors-p* is nil.

                                                                                + +
                                                                                  +
                                                                                • *show-lisp-errors-p*: set to t if you want to see errors in HTML output in the browser.
                                                                                • +
                                                                                • *show-lisp-backtraces-p*: set to nil if the errors shown in HTML +output (when *show-lisp-errors-p* is t) should not contain +backtrace information (defaults to t, shows the backtrace).
                                                                                • +
                                                                                + +

                                                                                Hunchentoot defines condition classes. The superclass of all +conditions is hunchentoot-condition. The superclass of errors is hunchentoot-error (itself a subclass of hunchentoot-condition).

                                                                                + +

                                                                                See the documentation: https://edicl.github.io/hunchentoot/#conditions.

                                                                                + +

                                                                                Clack

                                                                                + +

                                                                                Clack users might make a good use of plugins, like the clack-errors middleware: https://github.com/CodyReichert/awesome-cl#clack-plugins.

                                                                                + +

                                                                                + +

                                                                                Weblocks - solving the “JavaScript problemâ€Â©

                                                                                + +

                                                                                Weblocks is a widgets-based and +server-based framework with a built-in ajax update mechanism. It +allows to write dynamic web applications without the need to write +JavaScript or to write lisp code that would transpile to JavaScript.

                                                                                + +

                                                                                + +

                                                                                Weblocks is an old framework developed by Slava Akhmechet, Stephen +Compall and Leslie Polzer. After nine calm years, it is seeing a very +active update, refactoring and rewrite effort by Alexander Artemenko.

                                                                                + +

                                                                                It was initially based on continuations (they were removed to date) +and thus a lispy cousin of Smalltalk’s +Seaside. We can +also relate it to Haskell’s Haste, OCaml’s Eliom, +Elixir’s Phoenix LiveView and others.

                                                                                + +

                                                                                The Ultralisp website is an example Weblocks +website in production known in the CL community.

                                                                                + +
                                                                                + +

                                                                                Weblock’s unit of work is the widget. They look like a class definition:

                                                                                + +
                                                                                (defwidget task ()
                                                                                +   ((title
                                                                                +     :initarg :title
                                                                                +     :accessor title)
                                                                                +    (done
                                                                                +     :initarg :done
                                                                                +     :initform nil
                                                                                +     :accessor done)))
                                                                                +
                                                                                + +

                                                                                Then all we have to do is to define the render method for this widget:

                                                                                + +
                                                                                (defmethod render ((task task))
                                                                                +  "Render a task."
                                                                                +  (with-html
                                                                                +        (:span (if (done task)
                                                                                +                   (with-html
                                                                                +                         (:s (title task)))
                                                                                +                 (title task)))))
                                                                                +
                                                                                + +

                                                                                It uses the Spinneret template engine by default, but we can bind any +other one of our choice.

                                                                                + +

                                                                                To trigger an ajax event, we write lambdas in full Common Lisp:

                                                                                + +
                                                                                ...
                                                                                +(with-html
                                                                                +  (:p (:input :type "checkbox"
                                                                                +    :checked (done task)
                                                                                +    :onclick (make-js-action
                                                                                +              (lambda (&key &allow-other-keys)
                                                                                +                (toggle task))))
                                                                                +...
                                                                                +
                                                                                + +

                                                                                The function make-js-action creates a simple javascript function +that calls the lisp one on the server, and automatically refreshes the +HTML of the widgets that need it. In our example, it re-renders one +task only.

                                                                                + +

                                                                                Is it appealing ? Carry on this quickstart guide here: http://40ants.com/weblocks/quickstart.html.

                                                                                + +

                                                                                Templates

                                                                                + +

                                                                                Djula - HTML markup

                                                                                + +

                                                                                Djula is a port of Python’s +Django template engine to Common Lisp. It has excellent documentation.

                                                                                + +

                                                                                Caveman uses it by default, but otherwise it is not difficult to +setup. We must declare where our templates are with something like

                                                                                + +
                                                                                (djula:add-template-directory (asdf:system-relative-pathname "webapp" "templates/"))
                                                                                +
                                                                                + +

                                                                                and then we can declare and compile the ones we use, for example::

                                                                                + +
                                                                                (defparameter +base.html+ (djula:compile-template* "base.html"))
                                                                                +(defparameter +welcome.html+ (djula:compile-template* "welcome.html"))
                                                                                +
                                                                                + +

                                                                                A Djula template looks like this (forgive the antislash in {\%, this +is a Jekyll limitation):

                                                                                + +
                                                                                {\% extends "base.html" \%}
                                                                                +{\% block title %}Memberlist{\% endblock \%}
                                                                                +{\% block content \%}
                                                                                +  <ul>
                                                                                +  {\% for user in users \%}
                                                                                +    <li><a href=""></a></li>
                                                                                +  {\% endfor \%}
                                                                                +  </ul>
                                                                                +{\% endblock \%}
                                                                                +
                                                                                + +

                                                                                At last, to render the template, call djula:render-template* inside a route.

                                                                                + +
                                                                                (easy-routes:defroute root ("/" :method :get) ()
                                                                                +  (djula:render-template* +welcome.html+ nil
                                                                                +                          :users (get-users)
                                                                                +
                                                                                + +

                                                                                Note that for efficiency Djula compiles the templates before rendering them.

                                                                                + +

                                                                                It is, along with its companion +access library, one of +the most downloaded libraries of Quicklisp.

                                                                                + +

                                                                                Djula filters

                                                                                + +

                                                                                Filters allow to modify how a variable is displayed. Djula comes with +a good set of built-in filters and they are well documented. They are not to be confused with tags.

                                                                                + +

                                                                                They look like this: ``, where lower is an +existing filter, which renders the text into lowercase.

                                                                                + +

                                                                                Filters sometimes take arguments. For example: `` calls +the add filter with arguments value and 2.

                                                                                + +

                                                                                Moreover, it is very easy to define custom filters. All we have to do +is to use the def-filter macro, which takes the variable as first +argument, and which can take more optional arguments.

                                                                                + +

                                                                                Its general form is:

                                                                                + +
                                                                                (def-filter :myfilter-name (value arg) ;; arg is optional
                                                                                +   (body))
                                                                                +
                                                                                + +

                                                                                and it is used like this: ``.

                                                                                + +

                                                                                Here’s how the add filter is defined:

                                                                                + +
                                                                                (def-filter :add (it n)
                                                                                +  (+ it (parse-integer n)))
                                                                                +
                                                                                + +

                                                                                Once you have written a custom filter, you can use it right away +throughout the application.

                                                                                + +

                                                                                Filters are very handy to move non-trivial formatting or logic from the +templates to the backend.

                                                                                + +

                                                                                Spinneret - lispy templates

                                                                                + +

                                                                                Spinneret is a “lispy†+HTML5 generator. It looks like this:

                                                                                + +
                                                                                (with-page (:title "Home page")
                                                                                +  (:header
                                                                                +   (:h1 "Home page"))
                                                                                +  (:section
                                                                                +   ("~A, here is *your* shopping list: " *user-name*)
                                                                                +   (:ol (dolist (item *shopping-list*)
                                                                                +          (:li (1+ (random 10)) item))))
                                                                                +  (:footer ("Last login: ~A" *last-login*)))
                                                                                +
                                                                                + +

                                                                                The author finds it is easier to compose the HTML in separate +functions and macros than with the more famous cl-who. But it +has more features under it sleeves:

                                                                                + +
                                                                                  +
                                                                                • it warns on invalid tags and attributes
                                                                                • +
                                                                                • it can automatically number headers, given their depth
                                                                                • +
                                                                                • it pretty prints html per default, with control over line breaks
                                                                                • +
                                                                                • it understands embedded markdown
                                                                                • +
                                                                                • it can tell where in the document a generator function is (see get-html-tag)
                                                                                • +
                                                                                + +

                                                                                Serve static assets

                                                                                + +

                                                                                Hunchentoot

                                                                                + +

                                                                                With Hunchentoot, use create-folder-dispatcher-and-handler prefix directory.

                                                                                + +

                                                                                For example:

                                                                                + +
                                                                                (push (hunchentoot:create-folder-dispatcher-and-handler
                                                                                +       "/static/" (merge-pathnames "src/static"  ;; starts without a /
                                                                                +                                   (asdf:system-source-directory :myproject)))
                                                                                +      hunchentoot:*dispatch-table*)
                                                                                +
                                                                                + +

                                                                                Now our project’s static files located under +/path/to/myproject/src/static/ are served with the /static/ prefix:

                                                                                + +
                                                                                <img src="/static/img/banner.jpg" />
                                                                                +
                                                                                + +

                                                                                Connecting to a database

                                                                                + +

                                                                                Please see the databases section. The Mito ORM +supports SQLite3, PostgreSQL, MySQL, it has migrations and db schema +versioning, etc.

                                                                                + +

                                                                                In Caveman, a database connection is alive during the Lisp session and is +reused in each HTTP requests.

                                                                                + +

                                                                                Checking a user is logged-in

                                                                                + +

                                                                                A framework will provide a way to work with sessions. We’ll create a +little macro to wrap our routes to check if the user is logged in.

                                                                                + +

                                                                                In Caveman, *session* is a hash table that represents the session’s +data. Here are our login and logout functions:

                                                                                + +
                                                                                (defun login (user)
                                                                                +  "Log the user into the session"
                                                                                +  (setf (gethash :user *session*) user))
                                                                                +
                                                                                +(defun logout ()
                                                                                +  "Log the user out of the session."
                                                                                +  (setf (gethash :user *session*) nil))
                                                                                +
                                                                                + +

                                                                                We define a simple predicate:

                                                                                + +
                                                                                (defun logged-in-p ()
                                                                                +  (gethash :user cm:*session*))
                                                                                +
                                                                                + +

                                                                                and we define our with-logged-in macro:

                                                                                + +
                                                                                (defmacro with-logged-in (&body body)
                                                                                +  `(if (logged-in-p)
                                                                                +       (progn ,@body)
                                                                                +       (render #p"login.html"
                                                                                +               '(:message "Please log-in to access this page."))))
                                                                                +
                                                                                + +

                                                                                If the user isn’t logged in, there will nothing in the session store, +and we render the login page. When all is well, we execute the macro’s +body. We use it like this:

                                                                                + +
                                                                                (defroute "/account/logout" ()
                                                                                +  "Show the log-out page, only if the user is logged in."
                                                                                +  (with-logged-in
                                                                                +    (logout)
                                                                                +    (render #p"logout.html")))
                                                                                +
                                                                                +(defroute ("/account/review" :method :get) ()
                                                                                +  (with-logged-in
                                                                                +    (render #p"review.html"
                                                                                +            (list :review (get-review (gethash :user *session*))))))
                                                                                +
                                                                                + +

                                                                                and so on.

                                                                                + +

                                                                                Encrypting passwords

                                                                                + +

                                                                                With cl-pass

                                                                                + +

                                                                                cl-pass is a password hashing and verification library. It is as simple to use as this:

                                                                                + +
                                                                                (cl-pass:hash "test")
                                                                                +;; "PBKDF2$sha256:20000$5cf6ee792cdf05e1ba2b6325c41a5f10$19c7f2ccb3880716bf7cdf999b3ed99e07c7a8140bab37af2afdc28d8806e854"
                                                                                +(cl-pass:check-password "test" *)
                                                                                +;; t
                                                                                +(cl-pass:check-password "nope" **)
                                                                                +;; nil
                                                                                +
                                                                                + +

                                                                                You might also want to look at +hermetic, a simple +authentication system for Clack-based applications.

                                                                                + +

                                                                                Manually (with Ironclad)

                                                                                + +

                                                                                In this recipe we do the encryption and verification ourselves. We use the de-facto standard +Ironclad cryptographic toolkit +and the Babel charset +encoding/decoding library.

                                                                                + +

                                                                                The following snippet creates the password hash that should be stored in your +database. Note that Ironclad expects a byte-vector, not a string.

                                                                                + +
                                                                                (defun password-hash (password)
                                                                                +  (ironclad:pbkdf2-hash-password-to-combined-string
                                                                                +   (babel:string-to-octets password)))
                                                                                +
                                                                                + +

                                                                                pbkdf2 is defined in RFC2898. +It uses a pseudorandom function to derive a secure encryption key +based on the password.

                                                                                + +

                                                                                The following function checks if a user is active and verifies the +entered password. It returns the user-id if active and verified and +nil in all other cases even if an error occurs. Adapt it to your +application.

                                                                                + +
                                                                                (defun check-user-password (user password)
                                                                                +  (handler-case
                                                                                +      (let* ((data (my-get-user-data user))
                                                                                +             (hash (my-get-user-hash data))
                                                                                +             (active (my-get-user-active data)))
                                                                                +        (when (and active (ironclad:pbkdf2-check-password (babel:string-to-octets password)
                                                                                +                                                          hash))
                                                                                +          (my-get-user-id data)))
                                                                                +    (condition () nil)))
                                                                                +
                                                                                + +

                                                                                And the following is an example on how to set the password on the +database. Note that we use (password-hash password) to save the +password. The rest is specific to the web framework and to the DB +library.

                                                                                + +
                                                                                (defun set-password (user password)
                                                                                +  (with-connection (db)
                                                                                +    (execute
                                                                                +     (make-statement :update :web_user
                                                                                +                     (set= :hash (password-hash password))
                                                                                +                     (make-clause :where
                                                                                +                                  (make-op := (if (integerp user)
                                                                                +                                                  :id_user
                                                                                +                                                  :email)
                                                                                +                                           user))))))
                                                                                +
                                                                                + +

                                                                                Credit: /u/arvid on /r/learnlisp.

                                                                                + +

                                                                                Runnning and building

                                                                                + +

                                                                                Running the application from source

                                                                                + +

                                                                                To run our Lisp code from source, as a script, we can use the --load +switch from our implementation.

                                                                                + +

                                                                                We must ensure:

                                                                                + +
                                                                                  +
                                                                                • to load the project’s .asd system declaration (if any)
                                                                                • +
                                                                                • to install the required dependencies (this demands we have installed Quicklisp previously)
                                                                                • +
                                                                                • and to run our application’s entry point.
                                                                                • +
                                                                                + +

                                                                                We could use such commands:

                                                                                + +
                                                                                ;; run.lisp
                                                                                +
                                                                                +(load "myproject.asd")
                                                                                +
                                                                                +(ql:quickload "myproject")
                                                                                +
                                                                                +(in-package :myproject)
                                                                                +(handler-case
                                                                                +    ;; The START function starts the web server.
                                                                                +    (myproject::start :port (ignore-errors (parse-integer (uiop:getenv "PROJECT_PORT"))))
                                                                                +  (error (c)
                                                                                +    (format *error-output* "~&An error occured: ~a~&" c)
                                                                                +    (uiop:quit 1)))
                                                                                +
                                                                                + +

                                                                                In addition we have allowed the user to set the application’s port +with an environment variable.

                                                                                + +

                                                                                We can run the file like so:

                                                                                + +
                                                                                sbcl --load run.lisp
                                                                                +
                                                                                + +

                                                                                After loading the project, the web server is started in the +background. We are offered the usual Lisp REPL, from which we can +interact with the running application.

                                                                                + +

                                                                                We can also connect to the running application from our preferred +editor, from home, and compile the changes in our editor to the +running instance. See the following section +#connecting-to-a-remote-lisp-image.

                                                                                + +

                                                                                Building a self-contained executable

                                                                                + +

                                                                                As for all Common Lisp applications, we can bundle our web app in one +single executable, including the assets. It makes deployment very +easy: copy it to your server and run it.

                                                                                + +
                                                                                $ ./my-web-app
                                                                                +Hunchentoot server is started.
                                                                                +Listening on localhost:9003.
                                                                                +
                                                                                + +

                                                                                See this recipe on scripting#for-web-apps.

                                                                                + +

                                                                                Continuous delivery with Travis CI or Gitlab CI

                                                                                + +

                                                                                Please see the section on testing#continuous-integration.

                                                                                + +

                                                                                Multi-platform delivery with Electron

                                                                                + +

                                                                                Ceramic makes all the work for us.

                                                                                + +

                                                                                It is as simple as this:

                                                                                + +
                                                                                ;; Load Ceramic and our app
                                                                                +(ql:quickload '(:ceramic :our-app))
                                                                                +
                                                                                +;; Ensure Ceramic is set up
                                                                                +(ceramic:setup)
                                                                                +(ceramic:interactive)
                                                                                +
                                                                                +;; Start our app (here based on the Lucerne framework)
                                                                                +(lucerne:start our-app.views:app :port 8000)
                                                                                +
                                                                                +;; Open a browser window to it
                                                                                +(defvar window (ceramic:make-window :url "http://localhost:8000/"))
                                                                                +
                                                                                +;; start Ceramic
                                                                                +(ceramic:show-window window)
                                                                                +
                                                                                + +

                                                                                and we can ship this on Linux, Mac and Windows.

                                                                                + +

                                                                                There is more:

                                                                                + +
                                                                                +

                                                                                Ceramic applications are compiled down to native code, ensuring both performance and enabling you to deliver closed-source, commercial applications.

                                                                                +
                                                                                + +

                                                                                Thus, no need to minify our JS.

                                                                                + +

                                                                                Deployment

                                                                                + +

                                                                                Deploying manually

                                                                                + +

                                                                                We can start our executable in a shell and send it to the background (C-z bg), or run it inside a tmux session. These are not the best but hey, it works©.

                                                                                + +

                                                                                Daemonizing, restarting in case of crashes, handling logs with Systemd

                                                                                + +

                                                                                This is actually a system-specific task. See how to do that on your system.

                                                                                + +

                                                                                Most GNU/Linux distros now come with Systemd, so here’s a little example.

                                                                                + +

                                                                                Deploying an app with Systemd is as simple as writing a configuration file:

                                                                                + +
                                                                                $ emacs -nw /etc/systemd/system/my-app.service
                                                                                +[Unit]
                                                                                +Description=stupid simple example
                                                                                +
                                                                                +[Service]
                                                                                +WorkingDirectory=/path/to/your/app
                                                                                +ExecStart=/usr/local/bin/sthg sthg
                                                                                +Type=simple
                                                                                +Restart=on-failure
                                                                                +
                                                                                + +

                                                                                Then we have a command to start it:

                                                                                + +
                                                                                sudo systemctl start my-app.service
                                                                                +
                                                                                + +

                                                                                a command to check its status:

                                                                                + +
                                                                                systemctl status my-app.service
                                                                                +
                                                                                + +

                                                                                and Systemd can handle logging (we write to stdout or stderr, it writes logs):

                                                                                + +
                                                                                journalctl -f -u my-app.service
                                                                                +
                                                                                + +

                                                                                and it handles crashes and restarts the app:

                                                                                + +
                                                                                Restart=on-failure
                                                                                +
                                                                                + +

                                                                                and it can start the app after a reboot:

                                                                                + +
                                                                                [Install]
                                                                                +WantedBy=basic.target
                                                                                +
                                                                                + +

                                                                                to enable it:

                                                                                + +
                                                                                sudo systemctl enable my-app.service
                                                                                +
                                                                                + +

                                                                                See more: https://www.freedesktop.org/software/systemd/man/systemd.service.html.

                                                                                + +

                                                                                With Docker

                                                                                + +

                                                                                There are several Docker images for Common +Lisp. For example:

                                                                                + +
                                                                                  +
                                                                                • clfoundation/sbcl +includes the latest version of SBCL, many OS packages useful for CI +purposes, and a script to install Quicklisp.
                                                                                • +
                                                                                • 40ants/base-lisp-image +is based on Ubuntu LTS and includes SBCL, CCL, Quicklisp, Qlot and +Roswell.
                                                                                • +
                                                                                • container-lisp/s2i-lisp +is CentOs based and contains the source for building a Quicklisp based +Common Lisp application as a reproducible docker image using OpenShift’s +source-to-image.
                                                                                • +
                                                                                + +

                                                                                With Guix

                                                                                + +

                                                                                GNU Guix is a transactional +package manager, that can be installed on top of an existing OS, and a +whole distro that supports declarative system configuration. It allows +to ship self-contained tarballs, which also contain system +dependencies. For an example, see the Nyxt browser.

                                                                                + +

                                                                                Deploying on Heroku and other services

                                                                                + +

                                                                                See heroku-buildpack-common-lisp and the Awesome CL#deploy section for interface libraries for Kubernetes, OpenShift, AWS, etc.

                                                                                + +

                                                                                Monitoring

                                                                                + +

                                                                                See Prometheus.cl +for a Grafana dashboard for SBCL and Hunchentoot metrics (memory, +threads, requests per second,…).

                                                                                + +

                                                                                Connecting to a remote Lisp image

                                                                                + +

                                                                                This this section: debugging#remote-debugging.

                                                                                + +

                                                                                Hot reload

                                                                                + +

                                                                                This is an example from Quickutil. It is actually an automated version of the precedent section.

                                                                                + +

                                                                                It has a Makefile target:

                                                                                + +
                                                                                hot_deploy:
                                                                                +	$(call $(LISP), \
                                                                                +		(ql:quickload :quickutil-server) (ql:quickload :swank-client), \
                                                                                +		(swank-client:with-slime-connection (conn "localhost" $(SWANK_PORT)) \
                                                                                +			(swank-client:slime-eval (quote (handler-bind ((error (function continue))) \
                                                                                +				(ql:quickload :quickutil-utilities) (ql:quickload :quickutil-server) \
                                                                                +				(funcall (symbol-function (intern "STOP" :quickutil-server))) \
                                                                                +				(funcall (symbol-function (intern "START" :quickutil-server)) $(start_args)))) conn)) \
                                                                                +		$($(LISP)-quit))
                                                                                +
                                                                                + +

                                                                                It has to be run on the server (a simple fabfile command can call this +through ssh). Beforehand, a fab update has run git pull on the +server, so new code is present but not running. It connects to the +local swank server, loads the new code, stops and starts the app in a +row.

                                                                                + +

                                                                                See also

                                                                                + +
                                                                                  +
                                                                                • Feather, a template for web +application development, shows a functioning Hello World app +with an HTML page, a JSON API, a passing test suite, a Postgres DB +and DB migrations. Uses Qlot, Buildapp, SystemD for deployment.
                                                                                • +
                                                                                • lisp-web-template-productlist, +a simple project template with Hunchentoot, Easy-Routes, Djula and Bulma CSS.
                                                                                • +
                                                                                • lisp-web-live-reload-example - +a toy project to show how to interact with a running web app.
                                                                                • +
                                                                                + +

                                                                                Credits

                                                                                + + + + + +

                                                                                + Page source: web.md +

                                                                                +
                                                                                + + + + + +
                                                                                +
                                                                                +
                                                                                + © 2002–2021 the Common Lisp Cookbook Project +
                                                                                + +
                                                                                +
                                                                                T
                                                                                O
                                                                                C
                                                                                +
                                                                                + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/websockets.html b/clones/lispcookbook.github.io/cl-cookbook/websockets.html new file mode 100644 index 00000000..b03ccc7f --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/websockets.html @@ -0,0 +1,416 @@ + + + + + WebSockets + + + + + + + + + + + + + + +

                                                                                The Common Lisp Cookbook – WebSockets

                                                                                +
                                                                                + + + + +
                                                                                +
                                                                                + +
                                                                                +
                                                                                + +
                                                                                +
                                                                                Table of Contents
                                                                                +
                                                                                  +
                                                                                  +
                                                                                  + +
                                                                                  +

                                                                                  The Common Lisp Cookbook – WebSockets

                                                                                  + + +

                                                                                  + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                                  +

                                                                                  + 📕 Get the EPUB and PDF +

                                                                                  + + +
                                                                                  The Common Lisp ecosystem boasts a few approaches to building WebSocket servers. +First, there is the excellent +Hunchensocket that is written as +an extension to Hunchentoot, the classic +web server for Common Lisp. I have used both and I find them to be wonderful.

                                                                                  + +

                                                                                  Today, however, you will be using the equally excellent +websocket-driver to build a WebSocket server with +Clack. The Common Lisp web development community has expressed a +slight preference for the Clack ecosystem because Clack provides a uniform interface to +a variety of backends, including Hunchentoot. That is, with Clack, you can pick and choose the +backend you prefer.

                                                                                  + +

                                                                                  In what follows, you will build a simple chat server and connect to it from a +web browser. The tutorial is written so that you can enter the code into your +REPL as you go, but in case you miss something, the full code listing can be found at the end.

                                                                                  + +

                                                                                  As a first step, you should load the needed libraries via quicklisp:

                                                                                  + +
                                                                                  
                                                                                  +(ql:quickload '(clack websocket-driver alexandria))
                                                                                  +
                                                                                  +
                                                                                  + +

                                                                                  The websocket-driver Concept

                                                                                  + +

                                                                                  In websocket-driver, a WebSocket connection is an instance of the ws class, +which exposes an event-driven API. You register event handlers by passing your +WebSocket instance as the second argument to a method called on. For example, +calling (on :message my-websocket #'some-message-handler) would invoke +some-message-handler whenever a new message arrives.

                                                                                  + +

                                                                                  The websocket-driver API provides handlers for the following events:

                                                                                  + +
                                                                                    +
                                                                                  • :open: When a connection is opened. Expects a handler with zero arguments.
                                                                                  • +
                                                                                  • :message When a message arrives. Expects a handler with one argument, the message received.
                                                                                  • +
                                                                                  • :close When a connection closes. Expects a handler with two keyword args, a +“code†and a “reason†for the dropped connection.
                                                                                  • +
                                                                                  • :error When some kind of protocol level error occurs. Expects a handler with +one argument, the error message.
                                                                                  • +
                                                                                  + +

                                                                                  For the purposes of your chat server, you will want to handle three cases: when +a new user arrives to the channel, when a user sends a message to the channel, +and when a user leaves.

                                                                                  + +

                                                                                  Defining Handlers for Chat Server Logic

                                                                                  + +

                                                                                  In this section you will define the functions that your event handlers will +eventually call. These are helper functions that manage the chat server logic. +You will define the WebSocket server in the next section.

                                                                                  + +

                                                                                  First, when a user connects to the server, you need to give that user a nickname +so that other users know whose chats belong to whom. You will also need a data +structure to map individual WebSocket connections to nicknames:

                                                                                  + +
                                                                                  
                                                                                  +;; make a hash table to map connections to nicknames
                                                                                  +(defvar *connections* (make-hash-table))
                                                                                  +
                                                                                  +;; and assign a random nickname to a user upon connection
                                                                                  +(defun handle-new-connection (con)
                                                                                  +  (setf (gethash con *connections*)
                                                                                  +        (format nil "user-~a" (random 100000))))
                                                                                  +
                                                                                  +
                                                                                  + +

                                                                                  Next, when a user sends a chat to the room, the rest of the room should be +notified. The message that the server receives is prepended with the nickname of +the user who sent it.

                                                                                  + +
                                                                                  
                                                                                  +(defun broadcast-to-room (connection message)
                                                                                  +  (let ((message (format nil "~a: ~a"
                                                                                  +                         (gethash connection *connections*)
                                                                                  +                         message)))
                                                                                  +    (loop :for con :being :the :hash-key :of *connections* :do
                                                                                  +          (websocket-driver:send con message))))
                                                                                  +
                                                                                  + +

                                                                                  Finally, when a user leaves the channel, by closing the browser tab or +navigating away, the room should be notified of that change, and the user’s +connection should be dropped from the *connections* table.

                                                                                  + +
                                                                                  (defun handle-close-connection (connection)
                                                                                  +  (let ((message (format nil " .... ~a has left."
                                                                                  +                         (gethash connection *connections*))))
                                                                                  +    (remhash connection *connections*)
                                                                                  +    (loop :for con :being :the :hash-key :of *connections* :do
                                                                                  +          (websocket-driver:send con message))))
                                                                                  +
                                                                                  + +

                                                                                  Defining A Server

                                                                                  + +

                                                                                  Using Clack, a server is started by passing a function to clack:clackup. You +will define a function called chat-server that you will start by +calling (clack:clackup #'chat-server :port 12345).

                                                                                  + +

                                                                                  A Clack server function accepts a single plist as its argument. That plist +contains environment information about a request and is provided by the system. +Your chat server will not make use of that environment, but if you want to learn +more you can check out Clack’s documentation.

                                                                                  + +

                                                                                  When a browser connects to your server, a websocket will be instantiated and +handlers will be defined on it for each of the the events you want to support. +A WebSocket “handshake†will then be sent back to the browser, indicating +that the connection has been made. Here’s how it works:

                                                                                  + +
                                                                                  (defun chat-server (env)
                                                                                  +  (let ((ws (websocket-driver:make-server env)))
                                                                                  +
                                                                                  +    (websocket-driver:on :open ws
                                                                                  +                         (lambda () (handle-new-connection ws)))
                                                                                  +
                                                                                  +    (websocket-driver:on :message ws
                                                                                  +                         (lambda (msg) (broadcast-to-room ws msg)))
                                                                                  +
                                                                                  +    (websocket-driver:on :close ws
                                                                                  +                         (lambda (&key code reason)
                                                                                  +                           (declare (ignore code reason))
                                                                                  +                           (handle-close-connection ws)))
                                                                                  +
                                                                                  +    (lambda (responder)
                                                                                  +      (declare (ignore responder))
                                                                                  +      (websocket-driver:start-connection ws)))) ; send the handshake
                                                                                  +
                                                                                  +
                                                                                  + +

                                                                                  You may now start your server, running on port 12345:

                                                                                  + +
                                                                                  ;; keep the handler around so that you can stop your server later on
                                                                                  +
                                                                                  +(defvar *chat-handler* (clack:clackup #'chat-server :port 12345))
                                                                                  +
                                                                                  + +

                                                                                  A Quick HTML Chat Client

                                                                                  + +

                                                                                  So now you need a way to talk to your server. Using Clack, define a simple +application that serves a web page to display and send chats. First the web page:

                                                                                  + +
                                                                                  
                                                                                  +(defvar *html*
                                                                                  +  "<!doctype html>
                                                                                  +
                                                                                  +<html lang=\"en\">
                                                                                  +<head>
                                                                                  +  <meta charset=\"utf-8\">
                                                                                  +  <title>LISP-CHAT</title>
                                                                                  +</head>
                                                                                  +
                                                                                  +<body>
                                                                                  +    <ul id=\"chat-echo-area\">
                                                                                  +    </ul>
                                                                                  +    <div style=\"position:fixed; bottom:0;\">
                                                                                  +        <input id=\"chat-input\" placeholder=\"say something\" >
                                                                                  +    </div>
                                                                                  +    <script>
                                                                                  +     window.onload = function () {
                                                                                  +         const inputField = document.getElementById(\"chat-input\");
                                                                                  +
                                                                                  +         function receivedMessage(msg) {
                                                                                  +             let li = document.createElement(\"li\");
                                                                                  +             li.textContent = msg.data;
                                                                                  +             document.getElementById(\"chat-echo-area\").appendChild(li);
                                                                                  +         }
                                                                                  +
                                                                                  +         const ws = new WebSocket(\"ws://localhost:12345/chat\");
                                                                                  +         ws.addEventListener('message', receivedMessage);
                                                                                  +
                                                                                  +         inputField.addEventListener(\"keyup\", (evt) => {
                                                                                  +             if (evt.key === \"Enter\") {
                                                                                  +                 ws.send(evt.target.value);
                                                                                  +                 evt.target.value = \"\";
                                                                                  +             }
                                                                                  +         });
                                                                                  +     };
                                                                                  +
                                                                                  +    </script>
                                                                                  +</body>
                                                                                  +</html>
                                                                                  +")
                                                                                  +
                                                                                  +
                                                                                  +(defun client-server (env)
                                                                                  +    (declare (ignore env))
                                                                                  +    `(200 (:content-type "text/html")
                                                                                  +          (,*html*)))
                                                                                  +
                                                                                  +
                                                                                  + +

                                                                                  You might prefer to put the HTML into a file, as escaping quotes is kind of annoying. +Keeping the page data in a defvar was simpler for the purposes of this +tutorial.

                                                                                  + +

                                                                                  You can see that the client-server function just serves the HTML content. Go +ahead and start it, this time on port 8080:

                                                                                  + +
                                                                                  (defvar *client-handler* (clack:clackup #'client-server :port 8080))
                                                                                  +
                                                                                  + +

                                                                                  Check it out!

                                                                                  + +

                                                                                  Now open up two browser tabs and point them to http://localhost:8080 and you +should see your chat app!

                                                                                  + +

                                                                                  + +

                                                                                  All The Code

                                                                                  + +
                                                                                  (ql:quickload '(clack websocket-driver alexandria))
                                                                                  +
                                                                                  +(defvar *connections* (make-hash-table))
                                                                                  +
                                                                                  +(defun handle-new-connection (con)
                                                                                  +  (setf (gethash con *connections*)
                                                                                  +        (format nil "user-~a" (random 100000))))
                                                                                  +
                                                                                  +(defun broadcast-to-room (connection message)
                                                                                  +  (let ((message (format nil "~a: ~a"
                                                                                  +                         (gethash connection *connections*)
                                                                                  +                         message)))
                                                                                  +    (loop :for con :being :the :hash-key :of *connections* :do
                                                                                  +          (websocket-driver:send con message))))
                                                                                  +
                                                                                  +(defun handle-close-connection (connection)
                                                                                  +  (let ((message (format nil " .... ~a has left."
                                                                                  +                         (gethash connection *connections*))))
                                                                                  +    (remhash connection *connections*)
                                                                                  +    (loop :for con :being :the :hash-key :of *connections* :do
                                                                                  +          (websocket-driver:send con message))))
                                                                                  +
                                                                                  +(defun chat-server (env)
                                                                                  +  (let ((ws (websocket-driver:make-server env)))
                                                                                  +    (websocket-driver:on :open ws
                                                                                  +                         (lambda () (handle-new-connection ws)))
                                                                                  +
                                                                                  +    (websocket-driver:on :message ws
                                                                                  +                         (lambda (msg) (broadcast-to-room ws msg)))
                                                                                  +
                                                                                  +    (websocket-driver:on :close ws
                                                                                  +                         (lambda (&key code reason)
                                                                                  +                           (declare (ignore code reason))
                                                                                  +                           (handle-close-connection ws)))
                                                                                  +    (lambda (responder)
                                                                                  +      (declare (ignore responder))
                                                                                  +      (websocket-driver:start-connection ws))))
                                                                                  +
                                                                                  +(defvar *html*
                                                                                  +  "<!doctype html>
                                                                                  +
                                                                                  +<html lang=\"en\">
                                                                                  +<head>
                                                                                  +  <meta charset=\"utf-8\">
                                                                                  +  <title>LISP-CHAT</title>
                                                                                  +</head>
                                                                                  +
                                                                                  +<body>
                                                                                  +    <ul id=\"chat-echo-area\">
                                                                                  +    </ul>
                                                                                  +    <div style=\"position:fixed; bottom:0;\">
                                                                                  +        <input id=\"chat-input\" placeholder=\"say something\" >
                                                                                  +    </div>
                                                                                  +    <script>
                                                                                  +     window.onload = function () {
                                                                                  +         const inputField = document.getElementById(\"chat-input\");
                                                                                  +
                                                                                  +         function receivedMessage(msg) {
                                                                                  +             let li = document.createElement(\"li\");
                                                                                  +             li.textContent = msg.data;
                                                                                  +             document.getElementById(\"chat-echo-area\").appendChild(li);
                                                                                  +         }
                                                                                  +
                                                                                  +         const ws = new WebSocket(\"ws://localhost:12345/\");
                                                                                  +         ws.addEventListener('message', receivedMessage);
                                                                                  +
                                                                                  +         inputField.addEventListener(\"keyup\", (evt) => {
                                                                                  +             if (evt.key === \"Enter\") {
                                                                                  +                 ws.send(evt.target.value);
                                                                                  +                 evt.target.value = \"\";
                                                                                  +             }
                                                                                  +         });
                                                                                  +     };
                                                                                  +
                                                                                  +    </script>
                                                                                  +</body>
                                                                                  +</html>
                                                                                  +")
                                                                                  +
                                                                                  +(defun client-server (env)
                                                                                  +  (declare (ignore env))
                                                                                  +  `(200 (:content-type "text/html")
                                                                                  +     (,*html*)))
                                                                                  +
                                                                                  +(defvar *chat-handler* (clack:clackup #'chat-server :port 12345))
                                                                                  +(defvar *client-handler* (clack:clackup #'client-server :port 8080))
                                                                                  +
                                                                                  + + +

                                                                                  + Page source: websockets.md +

                                                                                  +
                                                                                  + + + + + +
                                                                                  +
                                                                                  +
                                                                                  + © 2002–2021 the Common Lisp Cookbook Project +
                                                                                  + +
                                                                                  +
                                                                                  T
                                                                                  O
                                                                                  C
                                                                                  +
                                                                                  + + + + + + + + + diff --git a/clones/lispcookbook.github.io/cl-cookbook/win32.html b/clones/lispcookbook.github.io/cl-cookbook/win32.html new file mode 100644 index 00000000..5f5cd0a9 --- /dev/null +++ b/clones/lispcookbook.github.io/cl-cookbook/win32.html @@ -0,0 +1,1311 @@ + + + + + Using the Win32 API + + + + + + + + + + + + + + +

                                                                                  The Common Lisp Cookbook – Using the Win32 API

                                                                                  +
                                                                                  + + + + +
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  Table of Contents
                                                                                  +
                                                                                    +
                                                                                    +
                                                                                    + +
                                                                                    +

                                                                                    The Common Lisp Cookbook – Using the Win32 API

                                                                                    + + +

                                                                                    + 📹 NEW! Learn Lisp in videos and support our contributors with this 40% discount. +

                                                                                    +

                                                                                    + 📕 Get the EPUB and PDF +

                                                                                    + + +

                                                                                    + +

                                                                                    Introduction and Scope

                                                                                    + +

                                                                                    This chapter introduces the basics of the Win32 API, demonstrates how it can be called from Lisp, and shows how Lisp can be used to create a powerful Win32 programming environment optimized for a specific application domain. Any such Lisp environment exposing every option in the Win32 API must be at least as complex as the Win32 API. However, it is hard to imagine a given application domain needing every option of every function in the Win32 API. Extending Lisp’s syntax in a domain-specific manner hides those parts of the Win32 API superfluous to the domain. (Most likely the majority of the Win32 API will be hidden.) The programmer then deals with and thinks about only those pieces of the API needed for the task at hand. Pieces of the Win32 API needed later are easily exposed at any time.

                                                                                    + +

                                                                                    A single environment is not easily optimized for both simple and complex applications. The methods outlined in this chapter can be used to construct environments, from simple to complex, appropriate for a range of application domains.

                                                                                    + +

                                                                                    The beginning sections of the chapter introduce concepts and ideas leading to the penultimate section, which concludes with a “Hello†program:

                                                                                    + +
                                                                                    (require "win-header")
                                                                                    +(in-package :wh)
                                                                                    +(export '(initialize-appendix-b))
                                                                                    +
                                                                                    +(DefMsgHandler appendix-b-proc MsgMap ()
                                                                                    +               (WM_PAINT
                                                                                    +                (text-out "Hello from Lisp!" 0 0 :color (RGB 0 0 255))
                                                                                    +                0))
                                                                                    +
                                                                                    +(defun initialize-appendix-b ()
                                                                                    +  (DefActiveTopWindow "Hello" 'appendix-b-proc
                                                                                    +    :style ws_overlappedwindow :width 150 :height 200 :title "Hello Program"))
                                                                                    +
                                                                                    + +

                                                                                    Lispworks for Windows version 4.2.7 is used. (The Personal Edition is available for free download.) No attempt is made to accommodate other Lisps and no thought is given to cross-platform compatibility. These ideas were discussed when outlining this document and the current approach decided upon because:

                                                                                    + +
                                                                                      +
                                                                                    • It is good to publish early and publish often. Reducing the scope fits this philosophy. Other Lisps can be included at a later time. I know that Corman Lisp is one that includes a lot of Win32 API capabilities. I don’t have experience with other vendor’s Lisps, so look at them all.
                                                                                    • +
                                                                                    • The information presented should apply generally to other vendor’s Lisps. The foreign language interface may change but Win32 remains the same.
                                                                                    • +
                                                                                    + +

                                                                                    The Cookbook welcomes contributions broadening coverage in these (and other) areas.

                                                                                    + +

                                                                                    Anyone programming for the Win32 API should be familiar with Programming Windows, The Definitive Guide to the Win32 API by Charles Petzold, or a comparable book.

                                                                                    + +

                                                                                    The code presented here has been tested only with Lispworks for Windows 4.2.7 Professional Edition under Windows XP.

                                                                                    + +

                                                                                    + +

                                                                                    Why Use Lisp with Win32?

                                                                                    + +

                                                                                    If a program can be cross-platform, it should be. The Common in Common Lisp is a tribute to the cross-platform, and cross-vendor, nature of Common Lisp. The advantages of this portability are not ignored lightly. However, writing programs which take advantage of the Win32 API in a non-portable fashion is not a mandate for doing so without the power of Lisp at one’s fingertips.

                                                                                    + +

                                                                                    One concern some may have is the perception that Lisp executables are large. Microsoft operating systems are written in C and C++. The supporting libraries for C/C++ programs come with the operating system. Lisp run-time support looks large only because it does not come with the OS. It is possible to ship Lisp programs in delivery mode, especially with Lispworks for Windows which requires no royalties for this, and it is possible to ship the run-time once and then ship small, compiled programs as they become available.

                                                                                    + +

                                                                                    If the requirement is to create small programs suitable for public download in large volumes, the fact that Lisp runtime support is not loaded on most computers is a limitation. However, Lispworks for Windows allows aggressive pruning during the delivery stage and programs can sometimes be reduced below two megabytes, which is suitable for many download situations. Situations requiring the full Lisp run-time are most likely large applications where it makes sense to deliver the runtime on CD, or via a large one-time download, and later deliver individually-compiled components which are loaded during program or component initialization.

                                                                                    + +

                                                                                    It is my understanding that the lower limit on delivered program size is not inherent to Lisp as a language but only a result of current market demand. As market demand grows for truly small stand-alone executable programs written in Lisp, vendors will have incentive to spend time developing better pruners and shakers. (Lisp starts with a lot and removes what’s not needed to produce a deliverable while C/C++ starts with a little and adds what’s needed during the link phase. A freshly-run Lisp begins with a REPL, a read-eval-print loop, with the full power of Lisp available interactively and ready for use.)

                                                                                    + +

                                                                                    Seeing the gory details of Lispwork’s Foreign Language Interface, or FLI, may seem strange at first. The OS is written in C/C++, so OS calls from C/C++ are not foreign calls, just as Lisp functions called from Lisp functions are not foreign calls.

                                                                                    + +

                                                                                    + +

                                                                                    A (Very) Brief Overview of a Win32 Program’s Life

                                                                                    + +

                                                                                    The OS treats a Win32 GUI program as a set of subroutines, or functions.

                                                                                    + +
                                                                                      +
                                                                                    • The first of these functions, WinMain, is called when the program is initialized.
                                                                                    • +
                                                                                    • WinMain calls the Win32 function RegisterClass to inform the OS of the location of a callback function. Several calls may be made to RegisterClass but only one of these calls, naming one callback function, serves the primary window of the application. After RegisterClass is called, the OS knows about the newly-defined class.
                                                                                    • +
                                                                                    • The Win32 function CreateWindowEx is called and given the class name specified on a previous RegisterClass call. Now the window exists and, depending upon the parameters passed to CreateWindowEx, is visible.
                                                                                    • +
                                                                                    • The OS begins queueing messages relating to the newly-created window. The queue is saved for delivery to WinMain.
                                                                                    • +
                                                                                    • WinMain accesses the message queue in a loop referred to as a message pump. The message pump loop calls GetMessage, TranslateMessage, and DispatchMessage.
                                                                                    • +
                                                                                    • GetMessage retrieves one message from the queue. There is some method or dependability to the sequence in which messages are queued. A certain sequence of messages is queued when a window is created, for instance. Events, such as mouse movements, cause other messages to be queued.
                                                                                    • +
                                                                                    • TranslateMessage translates virtual-key messages to character messages. DispatchMessage is a call to the OS requesting the OS to handle the message. The OS handles the message by calling another subroutine, or function, in the application program. The application function which is called is the function specified in a call to RegisterClass, which included a class name parameter, where that class name was specified in the call to CreateWindowEx. (Phew).
                                                                                    • +
                                                                                    • The application function specified in the RegisterClass call takes four parameters: +
                                                                                        +
                                                                                      1. a handle to the window associated with the message
                                                                                      2. +
                                                                                      3. the message id, an integer
                                                                                      4. +
                                                                                      5. a wParam unsigned long
                                                                                      6. +
                                                                                      7. an lParam unsigned long
                                                                                      8. +
                                                                                      +
                                                                                    • +
                                                                                    • The semantics of wParam and lParam vary depending upon the message id.
                                                                                    • +
                                                                                    • The application function contains the equivalent of a case statement, switching on the message id. There are many (hundreds of) message ids. Common ones include wm_create, sent when a window is created, wm_paint, sent when a window’s contents are to be drawn, and wm_destroy, sent when a window is about to go away. Other messages are generated in response to events such as key presses, mouse movements, and mouse button clicks. There are windows messages related to displaying video from attached cameras, capturing or playing sound files, dialing telephones, and much more. There are thousands of these messages in the OS but any given program normally deals with a small subset of them. When a message function receives a message with which it does not deal explicitly, the message is passed to a Win32 default function.
                                                                                    • +
                                                                                    • When a menu command or other event causes the program to enter code which calls the Win32 function PostQuitMessage, the message pump returns zero from GetMessage, which is the cue to exit the message pump loop. WinMain then exits and the program ends.
                                                                                    • +
                                                                                    + +

                                                                                    + +

                                                                                    Windows Character Systems and Lisp

                                                                                    + +

                                                                                    Some Microsoft operating systems use a single-byte, ASCII, character set and others use a double-byte, Unicode, character set. Use

                                                                                    + +
                                                                                    (defun external-format ()
                                                                                    +  (if (string= (software-type) "Windows NT")
                                                                                    +      :unicode
                                                                                    +    :ascii)
                                                                                    +
                                                                                    + +

                                                                                    to determine which format is in use. Win32 functions taking or returning characters or strings come in two flavors: 1) those ending in A for ASCII characters and 2) those ending in W for wide Unicode characters. This external-format function is useful primarily when calling fli:with-foreign-string, part of the Lispworks foreign function interface. When defining Win32 functions in the Foreign Function Interface, or FLI, the presence of the keyword :dbcs indicates that the function has both a single-byte and a double-byte version. When :dbcs is present, Lispworks appends an “A†to the function name in single-byte Windows 95 and a “W†in double-byte Windows NT/2000/XP. (I wrote and tested the example program (see Appendix A) under Windows XP.) Without :dbcs, Lispworks leaves the foreign function name unchanged.

                                                                                    + +

                                                                                    One FLI definition for the Win32 TextOut function is:

                                                                                    + +
                                                                                    (fli:define-foreign-function
                                                                                    +    (TextOut "TextOut" :dbcs :calling-convention :stdcall)
                                                                                    +    ((HDC (:unsigned :long)) (nXStart (:unsigned :int)) (nYStart (:unsigned :int))
                                                                                    +     (lpString :pointer) (cbString (:unsigned :int)))
                                                                                    +  :result-type (:unsigned :long))
                                                                                    +
                                                                                    + +

                                                                                    which is equivalent to:

                                                                                    + +
                                                                                    (fli:define-foreign-function
                                                                                    +    (TextOut "TextOutW" :calling-convention :stdcall)
                                                                                    +    ((HDC (:unsigned :long)) (nXStart (:unsigned :int)) (nYStart (:unsigned :int))
                                                                                    +     (lpString :pointer) (cbString (:unsigned :int)))
                                                                                    +  :result-type (:unsigned :long))
                                                                                    +
                                                                                    + +

                                                                                    under NT/2000/XP (the second example would use “TextOutA†under 95).

                                                                                    + +

                                                                                    To demonstrate this, let’s use a simple FLI definition which is easy to call interactively for testing purposes. We are trying only to see if a given Win32 function is known to the OS. In the following REPL interaction, the return result is important only when the Lisp restart handler is invoked. When the restart handler is not invoked, the Win32 function was found, loaded and called. Trying to call a Win32 function which the FLI cannot find results in an invocation of the restart handler. (The correct define-foreign-function definition for textout can be found in Appendix A

                                                                                    + +
                                                                                    CL-USER 9 > (fli:define-foreign-function
                                                                                    +                (TextOut-1 "TextOut" :dbcs :calling-convention :stdcall)
                                                                                    +                () :result-type :int)
                                                                                    +TEXTOUT-1
                                                                                    +
                                                                                    +CL-USER 10 > (textout-1)
                                                                                    +1
                                                                                    +
                                                                                    +CL-USER 11 > (fli:define-foreign-function
                                                                                    +                 (TextOut-2 "TextOut" :dbcs :calling-convention :stdcall)
                                                                                    +                 () :result-type :int)
                                                                                    +TEXTOUT-2
                                                                                    +
                                                                                    +CL-USER 12 > (textout-2)
                                                                                    +0
                                                                                    +
                                                                                    + +

                                                                                    The TextOut function was found both times. This shows that a given Win32 function can be named in more than one FLI definition. This technique is sometimes useful when more than one Lisp datatype can satisfy the requirements for a parameter of the Win32 function.

                                                                                    + +
                                                                                    CL-USER 13 > (fli:define-foreign-function
                                                                                    +                 (TextOut-3 "TextOutW" :dbcs :calling-convention :stdcall)
                                                                                    +                 () :result-type :int)
                                                                                    +
                                                                                    +TEXTOUT-3
                                                                                    +
                                                                                    +CL-USER 14 > (textout-3)
                                                                                    +
                                                                                    +Error: Foreign function TEXTOUT-3 trying to call to unresolved
                                                                                    +external function "TextOutWW".
                                                                                    +
                                                                                    +1 (abort) Return to level 0.
                                                                                    +2 Return to top-level loop.
                                                                                    +3 Return from multiprocessing.
                                                                                    +
                                                                                    +Type :b for backtrace, :c  to proceed,  or :? for other
                                                                                    +options
                                                                                    +
                                                                                    +CL-USER 15 : 1 > :top
                                                                                    +
                                                                                    +CL-USER 16 > (fli:define-foreign-function
                                                                                    +                 (TextOut-4 "TextOutW" :calling-convention :stdcall)
                                                                                    +                 () :result-type :int)
                                                                                    +
                                                                                    +TEXTOUT-4
                                                                                    +
                                                                                    +CL-USER 17 > (textout-4)
                                                                                    +1
                                                                                    +
                                                                                    +CL-USER 18 > (fli:define-foreign-function
                                                                                    +                 (TextOut-5 "TextOutA" :calling-convention :stdcall)
                                                                                    +                 () :result-type :int)
                                                                                    +TEXTOUT-5
                                                                                    +
                                                                                    +CL-USER 19 > (textout-5)
                                                                                    +0
                                                                                    +
                                                                                    +CL-USER 20 >
                                                                                    +
                                                                                    + +

                                                                                    I elided a warning Lispworks gives after multiple definitions of a foreign function when the previous definition differs in its use of the :dbcs keyword from the current definition’s use. After CL-USER 14, Lispworks complains about “TextOutWWâ€, which shows that using the :dbcs keyword causes Lispworks to append a ‘W’ to the foreign function’s name, although the existence of the foreign function itself is not verified until an actual call is made. TextOut-5 verifies the existence of the Win32 function TextOutA, which is the ASCII version of TextOut.

                                                                                    + +

                                                                                    I have seen strange character sets in titles and other places and have been able to resolve those problems by ensuring I made consistent use of the :dbcs and/or W/A declarations.

                                                                                    + +

                                                                                    Edi Weitz asked if the :dbcs keyword decides at compile time or at run time which function to call, the …A or the …W. I wrote the following program:

                                                                                    + +
                                                                                    (in-package :cl-user)
                                                                                    +
                                                                                    +(fli:define-foreign-function
                                                                                    +    (MessageBox "MessageBox" :dbcs :calling-convention :stdcall)
                                                                                    +    ((hwnd (:unsigned :long)) (text (:unsigned :long)) (title (:unsigned :long)) (flags (:unsigned :long)))
                                                                                    +  :result-type (:unsigned :long))
                                                                                    +
                                                                                    +(defun external-format ()
                                                                                    +  (if (string= (software-type) "Windows NT")
                                                                                    +      :unicode
                                                                                    +      :ascii))
                                                                                    +
                                                                                    +(defun display-format-used ()
                                                                                    +  (fli:with-foreign-string
                                                                                    +      (unicode-p u-ec u-bc :external-format (external-format)) "Unicode"
                                                                                    +      (fli:with-foreign-string
                                                                                    +	  (ascii-p a-ec a-bc :external-format (external-format)) "Ascii"
                                                                                    +	  (fli:with-foreign-string
                                                                                    +              (title-p t-ec t-bc :external-format (external-format)) "External Format"
                                                                                    +              (if (eq (external-format) :unicode)
                                                                                    +                  (messagebox 0 (fli:pointer-address unicode-p)
                                                                                    +                              (fli:pointer-address title-p) 0)
                                                                                    +                  (messagebox 0 (fli:pointer-address ascii-p)
                                                                                    +                              (fli:pointer-address title-p) 0))))))
                                                                                    +
                                                                                    +(compile 'external-format)
                                                                                    +(compile 'display-format-used)
                                                                                    +
                                                                                    +(deliver 'display-format-used "dbcs-run" 5)
                                                                                    +(quit)
                                                                                    +
                                                                                    +; We then have dbcs-run.exe. When run on Windows XP, dbcs-run pops up a messagebox
                                                                                    +; displaying "Unicode". The same dbcs-run.exe file, ftp'd to a Macintosh running OS 9 with
                                                                                    +; Virtual PC running Windows 98, pops up a message box displaying "Ascii".
                                                                                    +
                                                                                    + +

                                                                                    + +

                                                                                    FLI - The Foreign Language Interface - Translating C Header Files to Lisp

                                                                                    + +

                                                                                    When calling the Win32 API from C/C++, header files provided with the compiler are #included in the program. The header files contain the definitions of constants, structures, and functions comprising the API. These definitions must be available to the Lisp program. I find it most straightforward to do this conversion by hand. Although there are automated methods, doing it manually does not take long on a per-function basis.

                                                                                    + +

                                                                                    In C/C++, the #defines exist in the preprocessor. Only those defines used by the program are included in the object code. With Lisp, the defconstants are all loaded into the Lisp image, whether or not they are subsequently used. I do not know a clean solution for this issue.

                                                                                    + +

                                                                                    In the meantime, I make a base, or core, win-header.lisp and use other .lisp files, grouped by functionality, for less-frequently-used definitions, loading those .lisp files when I need them.

                                                                                    + +

                                                                                    FLI Data Types

                                                                                    + +

                                                                                    The Win32 C/C++ header files include many typedefs for OS-specific data types, including HINSTANCE, HANDLE, HMENU, LPCTSTR, and more. Regarding Lisp, these essentially boil down to signed or unsigned, long or char, and singleton or array, or C structures composed of those types. (Int seems to be the same as long.)

                                                                                    + +

                                                                                    Lisp does not know or care about the difference between an HINSTANCE and an HMENU. They both are simply 32-bit values. Lisp pays attention to these values at two different points in time: 1) when moving Lisp data to a foreign field and 2) when moving the foreign data to Lisp. Lispworks attempts coercion at those points and conditions result when incorrect attempts are made to do conversions like stuffing a negative value into an unsigned field. If more hints about type are given to Lisp, such as declaring a foreign field to be of type :pointer, Lisp will complain when trying to stuff zero into the pointer. That is not handy if one is trying to pass a null pointer to the OS. Thus, I find it easier to call most parameters long, although I bend that rule from time to time.

                                                                                    + +

                                                                                    Lispworks FLI pointers are actually a Lisp structure containing an address retrieved, or unboxed, by fli:pointer-address. When passing a pointer value to the OS, for example when passing the address of a RECT to GetClientRect, there are two steps that need to happen: 1) allocate the foreign structure and 2) pass the address of that allocated structure to the OS. Most of the time these allocations are best handled with fli:with-dynamic-foreign-objects enclosing calls to fli:allocate-dynamic-foreign-object because one doesn’t have to worry about deallocations. I pass the address of the allocated structure using fli:pointer-address (unboxing the pointer value) and define the field in the foreign function’s parameter list as an unsigned long.

                                                                                    + +

                                                                                    The FLI allows things to be defined such that Lispworks will try automatic coercion (unboxing). Try defining the parameter type as :pointer. However, Lispworks complains when trying to pass a NULL pointer, although I did not try creating a FLI pointer with address zero. The approach I chose, calling pointers unsigned longs, is clear to me and works well in both directions (OS->Lisp, Lisp->OS). This may simply be a result of my current lack of complete understanding and there may be a better way.

                                                                                    + +

                                                                                    On occasion is it helpful to define C arrays inside C structures, in particular in sPAINTSTRUCT. This works but I don’t like my current method of obtaining the address of structure members or array entries. I find myself counting byte offsets by hand and using something like:

                                                                                    + +
                                                                                    (defun interior-copy (to-struct-ptr byte-offset src-ptr)
                                                                                    +  (let ((ptr (fli:make-pointer
                                                                                    +              :address (fli:pointer-address to-struct-ptr :type :char))))
                                                                                    +    (fli:incf-pointer ptr byte-offset)
                                                                                    +    (wcscpy (fli:pointer-address ptr) (fli:pointer-address src-ptr))))
                                                                                    +
                                                                                    + +

                                                                                    where wcscpy, the wide-character version of strcpy, is defined through the FLI. I hope there’s a better way to do this and that someone quickly teaches me. I haven’t worked enough with different OSes and Lispworks to know the best way to choose strcpy vs. wcscpy, other than to use (software-type) to decide which to call. (Or use (external-format), defined in Appendix A.)

                                                                                    + +

                                                                                    Although the data types defined to Lisp are kept a minimum, it is very useful for documentation purposes to mimic the typedef names used in the C/C++ header files. Thus fli:define-c-typedef is used to define BOOL, DWORD, HANDLE, HDC, and other similar Win32 data types.

                                                                                    + +

                                                                                    Many OS-specific constants must be made available to the Lisp program:

                                                                                    + +
                                                                                    (defconstant CW_USEDEFAULT       #x80000000)
                                                                                    +(defconstant IDC_ARROW                32512)
                                                                                    +(defconstant SW_SHOW                      5)
                                                                                    +(defconstant WM_CLOSE            #x00000010)
                                                                                    +(defconstant WM_DESTROY          #x00000002)
                                                                                    +
                                                                                    + +

                                                                                    These constants are given by name, without values, in the MSDN documentation. The Lisp program needs not only the name but also the value. An easy way to find the necessary values is to grep through the VC98/Include directory. Visual Studio contains a “find in files†function on its toolbar which allows this kind of search. Kenny Tilton says, “What I did was grab any VC++ project that builds (the NeHe OpenGL site is full of VC++ projects (see OpenGL tutorials in sidebar to left of the page at http:///nehe.gamedev.net) which built without a problem for me) and then right-click on the symbol I was curious about. (Of > course first you have to find a reference .) VC++ then offers 'find definition' and will jump right to a header entry for a function or constant or macro or whatever."

                                                                                    + +

                                                                                    FLI Data Structures

                                                                                    + +

                                                                                    I usually define the structure and a typedef for it:

                                                                                    + +
                                                                                    ; PAINTSTRUCT
                                                                                    +(fli:define-c-struct sPAINTSTRUCT
                                                                                    +    (HDC hdc)
                                                                                    +  (fErase bool)
                                                                                    +  (rcPaint-x uint)
                                                                                    +  (rcPaint-y uint)
                                                                                    +  (rcPaint-width uint)
                                                                                    +  (rcPaint-height uint)
                                                                                    +  (fRestore bool)
                                                                                    +  (fIncUpdate bool)
                                                                                    +  (rgbReserved (:c-array wBYTE 32)))
                                                                                    +(fli:define-c-typedef PAINTSTRUCT sPAINTSTRUCT)
                                                                                    +
                                                                                    + +

                                                                                    and then can do something like:

                                                                                    + +
                                                                                    (fli:with-dynamic-foreign-objects ()
                                                                                    +  (let ((ps-ptr (fli:allocate-dynamic-foreign-object :type 'paintstruct)))
                                                                                    +    (format t "~&Pointer value: ~a" (fli:pointer-address ps-ptr))))
                                                                                    +
                                                                                    + +

                                                                                    although I’m not clear on why the typedef is valuable. Lisp is not C and in Lisp the typedef does not save me from typing struct sPAINTSTRUCT, for example. I think the typedefs are superfluous and I probably will stop using them.

                                                                                    + +

                                                                                    FLI Functions

                                                                                    + +

                                                                                    It is very easy to define OS calls in the FLI. I start with the API definition in the OS documentation. If Visual C++ is available, the MSDN documentation is probably loaded on the machine. The documentation is available on the MSDN website. I go to the Win32 documentation page for the desired function and do a simple translation:

                                                                                    + +
                                                                                    ; LoadCursor
                                                                                    +(fli:define-foreign-function
                                                                                    +    (LoadCursor "LoadCursor" :dbcs :calling-convention :stdcall)
                                                                                    +    ((hInstance handle) (param ulong))
                                                                                    +  :result-type handle)
                                                                                    +
                                                                                    + +

                                                                                    All the Win32 calls I’ve seen so far are :calling-convention :stdcall. If I know the function includes a text parameter, I include the :dbcs keyword. If I don’t know, I try it without :dbcs. The actual function called in this example is LoadCursorA or LoadCursorW.

                                                                                    + +

                                                                                    + +

                                                                                    Callbacks from Windows to Lisp

                                                                                    + +

                                                                                    Once the message pump is up and going, the OS delivers the messages by calling a Lisp function repeatedly. Lisp functions callable from the foreign environment can be defined in the following manner:

                                                                                    + +
                                                                                    ; WndProc -- Window procedure for the window we will create
                                                                                    +(fli:define-foreign-callable
                                                                                    +    (wndproc :result-type :long :calling-convention :stdcall)
                                                                                    +    ((hwnd hwnd) (msg ulong)
                                                                                    +     (wparam ulong) (lparam ulong))
                                                                                    +  (case msg
                                                                                    +    (#.WM_PAINT (wndproc-paint hwnd msg wparam lparam))
                                                                                    +    #+console (#.WM_DESTROY (PostQuitMessage 0) 0)
                                                                                    +    (t (DefWindowProc hwnd msg wparam lparam))))
                                                                                    +
                                                                                    + +

                                                                                    This wndproc function is the message dispatcher. The OS calls wndproc once for every message sent to the program. Wndproc is responsible for understanding the message and calling the appropriate function.

                                                                                    + +

                                                                                    The #. reader macro returns the value of WM_PAINT and WM_DESTROY at compile-time, allowing case to work. #+console means “include the next form only if :console is a member of featuresâ€.

                                                                                    + +

                                                                                    The example Win32 Lisp program in Appendix A may be run either from the Lispworks IDE or from console mode, such as ILISP in Emacs. If PostQuitMessage is called from the IDE, the IDE shuts down. If PostQuitMessage is not called in console mode, the Win32 window does not close.

                                                                                    + +

                                                                                    + +

                                                                                    Starting the Program

                                                                                    + +

                                                                                    Multiprocessing is always running under the Lispworks IDE but may or may not be running using ILISP under Emacs. Using multiprocessing is great because one can peek and poke at the program and its variables, provide new or redefined functions which take effect immediately, and even make Win32 API calls, all while the program is running and the window is visible with all its buttons and menus active.

                                                                                    + +

                                                                                    Using multiprocessing has not proven so nice for me under ILISP. I love the ILISP and Emacs environment. The Lispworks IDE is very nice, and I keep a copy of it going for certain tasks such as finding online manuals and using debug tools such as the inspector. For editing and most running, though, I prefer Emacs and ILISP. However, I have not learned how to view multiple processes under ILISP, nor do I know how to switch between them. When I use multiprocessing with ILISP, it appears to me that any thread with a condition grabs standard-output and standard-input. I don’t know how to switch back to the other thread. This is enough of a problem that I don’t use multiprocessing under ILISP and when I need or want the interactive debug capabilities possible with multiprocessing, or need multiprocessing in any form, I switch to the Lispworks IDE.

                                                                                    + +

                                                                                    When running under the IDE, Lispworks provides the message pump. When running under Emacs/ILISP (or in console mode, as would happen in a delivered application), the Lisp program itself must provide the message pump.

                                                                                    + +

                                                                                    Thus in the example program in Appendix A, the function create-toplevel-window ensures multiprocessing is running when in console mode. The function create-toplevel-window-run performs the message pump operation in console mode but not otherwise.

                                                                                    + +

                                                                                    The program in Appendix A makes a call to register-class when the file is loaded. The call needs to be made only once and so I make the call at the top-level:

                                                                                    + +
                                                                                    (defvar *reg-class-atom* (register-class))
                                                                                    +
                                                                                    + +

                                                                                    create-toplevel-window-run then only needs to call CreateWindowEx and optionally start the message pump.

                                                                                    + +

                                                                                    + +

                                                                                    The Lisp REPL and Win32 Development

                                                                                    + +

                                                                                    When a Win32 application is running from within the Lispworks IDE, one is able to enter Lisp forms at the IDE’s REPL prompt. One can view any variable, redefine any function, and make calls to SendMessage or any other Win32 function that doesn’t require context from the OS, such as being within a WM_PAINT. If one redefines the function called when a button is clicked, the next click of the button gets the new function. The Lispworks debug tools are available. Other Lisp programs can be run simultaneously. Individual functions within the running Win32 program can be called from the REPL. Functions can be traced and untraced, advice can be added or removed, and CLOS classes can be redefined on the fly with Lisp guaranteeing that the slot additions or deletions happen in an orderly fashion within the running program.

                                                                                    + +

                                                                                    Lisp is designed to allow programs to run for years at a time, with careful management, and to allow the programs to be maintained, with bugs fixed, new functions defined, and CLOS objects redefined, during that time.

                                                                                    + +

                                                                                    + +

                                                                                    Making Direct Win32 Calls from CAPI

                                                                                    + +

                                                                                    Lispworks includes CAPI, a cross-platform API for GUI program development. CAPI is powerful and easy to use. For true cross-platform capability, it is important to stay with 100%-pure CAPI.

                                                                                    + +

                                                                                    However, even in a pure Win32 environment it is reasonable to want to use CAPI’s features quickly to generate advanced GUI programs without having to recreate every wheel. It is possible to use Win32-specific features from within a CAPI program.

                                                                                    + +
                                                                                    (defclass image-pane (output-pane) ()
                                                                                    +  (:default-initargs
                                                                                    +   :display-callback 'draw-image))
                                                                                    +
                                                                                    +...
                                                                                    +
                                                                                    +(let ((pane-1 (make-instance 'image-pane))
                                                                                    +      ...
                                                                                    +      (contain (make-instance 'column-layout
                                                                                    +                              :description (list pane-1 other-pane))
                                                                                    +        :best-width 640
                                                                                    +        :best-height 480)))
                                                                                    +
                                                                                    +...
                                                                                    +
                                                                                    +(defun draw-image (pane x y width height)
                                                                                    +  (let ((hwnd (capi:simple-pane-handle pane)))
                                                                                    +    ;; This returns the actual Win32 window handle
                                                                                    +    ;; Now call CreateWindowEx with hwnd as the new window's parent
                                                                                    +    ;; The Win32-defined window then covers the
                                                                                    +    ;; CAPI window. After destroying or hiding the Win32 window, the
                                                                                    +    ;; CAPI window is revealed.
                                                                                    +    ;; Be careful not to create the window if it already is created.
                                                                                    +
                                                                                    +    ....
                                                                                    +
                                                                                    + +

                                                                                    Note the connections from image-pane to pane-1 and from image-pane to draw-image, and that pane-1 is contained in the CAPI window. Draw-image gets called when it is time to … well, when it is time to draw the image!

                                                                                    + +

                                                                                    Certainly calls to Win32 functions which don’t require handles to windows or other interaction with the CAPI environment work just fine.

                                                                                    + +

                                                                                    Many good programs use primarily local variables. If one wishes to use the multiprocessing environment to operate upon the program from the Lispworks IDE while the Windows program is running, it is important to have access to symbols and variables for the window handles and other Windows resources. If SendMessage is to be called from the REPL, a valid hwnd must be available. A way to have the hwnd available is to do a setf from within a function to which the OS passes the hwnd. This may be used as a debug-only technique or left as a permanent part of the program.

                                                                                    + +

                                                                                    + +

                                                                                    Interfacing to C

                                                                                    + +

                                                                                    The OS makes many of the Win32 functions available always. Other functions, for example the avicap32 video functions, exist in DLLs which must be explicitly loaded. Third-party or custom-built DLLs also require explicit loading.

                                                                                    + +

                                                                                    Make a def file, such as avicap32.def, named after the desired DLL:

                                                                                    + +
                                                                                    exports capCreateCaptureWindow=capCreateCaptureWindowW
                                                                                    +exports capGetDriverDescription=capGetDriverDescriptionW
                                                                                    +
                                                                                    + +

                                                                                    and in Lisp

                                                                                    + +
                                                                                    ;; capCreateCaptureWindow
                                                                                    +(fli:define-foreign-function
                                                                                    +    (capCreateCaptureWindow "capCreateCaptureWindowW")
                                                                                    +    ((lpszWindowName :pointer) (dwStyle fli-dword) (x :int) (y :int)
                                                                                    +     (nWidth :int) (nHeight :int) (HWND fli-hwnd) (nID :int))
                                                                                    +  :result-type (:unsigned :long)
                                                                                    +  :module :avicap32
                                                                                    +  :documentation "Opens a video capture window.")
                                                                                    +
                                                                                    +(fli:register-module "avicap32")
                                                                                    +
                                                                                    + +

                                                                                    Windows created using functions in DLLs can be given a CAPI window as a parent, as previously shown. The def file may or may not be required, depending upon what functions are desired. Maybe :dbcs should be used here, eliminating the need for the hard-coded ‘W’ in the foreign function name.

                                                                                    + +

                                                                                    + +

                                                                                    RAII and GC

                                                                                    + +

                                                                                    A common C++ idiom is “Resource Acquisition Is Initializationâ€, in which a C++ object acquires an operating system resource, perhaps an open file, in the constructor and releases the resource in the object’s destructor. These objects may have dynamic or indefinite extent.

                                                                                    + +

                                                                                    Objects with dynamic extent are declared local at the beginning of a C++ function and the object’s destructor is called when the function returns and the object goes out of scope. The corresponding Lisp idiom is the use of a with-... macro. The macro is responsible for acquiring the resource and releasing it under an unwind-protect.

                                                                                    + +

                                                                                    In C++, objects with indefinite extent must have their destructor called explicitly, with delete or delete []. The destructor tears down the object, first releasing any acquired resources via explicitly programmed C++ code, then releasing the object’s memory via compiler-generated code as the destructor exits.

                                                                                    + +

                                                                                    Lisp is garbage collected, which means that Lisp is responsible for freeing the object’s memory. However, that may not happen for a very long time after the last reference to the object has disappeared. The garbage collector runs only as memory fills or when it is explicitly called. If an object holds an acquired resource, almost always there is a proper time to release the resource and not releasing it at that time leads to resource exhaustion.

                                                                                    + +

                                                                                    Lisp is not responsible for acquired resources, such as window handles, which the programmer acquired with explicit Lisp code. The programmer must define a function, something like (defun release-resources..., and call the release function at the point where the destructor would have been called in C++. After the release function returns and there are no references to the object, Lisp will free the object’s memory during a future garbage collection.

                                                                                    + +

                                                                                    Another issue with the Win32/Lisp environment concerns the GC, which is free to move Lisp data. One cannot give the OS the address of Lisp data which may be moved by the GC. Any data given to the OS should be allocated through the FLI, which is responsible for making the data immovable.

                                                                                    + +

                                                                                    + +

                                                                                    COM

                                                                                    + +

                                                                                    COM is widely used in Windows programming. Lispworks for Windows includes a COM/Automation User Guide and Reference Manual and the associated functions. I have not played with COM under Lisp and only note the availability of the manuals and functions. Actually, I did require com and automation and called the com:midl form, which loaded a huge series of IDL files, amazing in breadth and extent. I didn’t actually make things happen with COM, though.

                                                                                    + +

                                                                                    + +

                                                                                    Beginning to Use the Power of Lisp

                                                                                    + +

                                                                                    My first thought, when I finally completed my demo program, was “That looks like any other Win32 program.†There was nothing Lispy about it. It was just Win32 code, programmable in any language. Different languages are good for different problem sets. When I think of Perl, I think of text. I think of numbers along with Fortran. When I think of Lisp, I think of defining my own language. Macros are one of the tools used to define embedded languages within Lisp and are part of what makes Lisp the programmable programming language.

                                                                                    + +

                                                                                    Win32 API programming cries out for new languages. It is a very powerful and flexible API but in a given application context, only certain subsets are used and they are used in repetitive fashions. This does not mean that the APIs should be redefined, were that possible. What works for one application may not work for the next. There probably are some language extensions that will be used in nearly all Win32 programs. Other extensions will apply only to certain applications.

                                                                                    + +

                                                                                    One beauty of Lisp is that the programmer can define a new extension at any time. See the Common Lisp Cookbook’s chapter on macros. I also recommend Paul Graham’s On Lisp for learning to write macros and a whole lot more.

                                                                                    + +

                                                                                    When writing code, notice when the same pattern is typed over and over. Then think, sooner rather than later, “it’s time for a macro or a function.†Notice the repetitive coding even when you’re writing macros. Macros can be built upon macros, and macros can generate macros.

                                                                                    + +

                                                                                    Knowing whether to choose a macro or a function is partly a function of code bloat. Macros are evaluated in place and cause new code to be created, where functions do not. The advantage of macros is that they can create closures, capturing variable values present in the environment when the macro is expanded, thus eliminating much of the need for simple objects. If the macro creates defvar or defparameter forms, other functions the macro creates can use those vars and parameters, although closures can also be used for that purpose. The use of defvars allows reference to those defvars at the REPL in a multiprocessing environment while the Win32 program has an open window and is executing. Whether defvars or closures are used, absolutely zero store-and-retrieve infrastructure is needed.

                                                                                    + +

                                                                                    If macros are not used in this way, then functions that would have been created by the macro must have some form of object look-up code to retrieve window handles, captions, and other resources specific to the object in question.

                                                                                    + +

                                                                                    Be aware that functions can be declaimed inline and can be passed as parameters, while macros cannot.

                                                                                    + +

                                                                                    Many of the macros defined in On Lisp are very useful in Win32 programming. I use the symbol creation macros extensively.

                                                                                    + +

                                                                                    One set of needed macros make using the Foreign Language Interface easier, more compact, and more readable. I have a macro with-foreign-strings which takes a list of pointer-name/string pairs and creates a nested series of (fli:with-foreign-string... calls, including creation of the element-count and byte-count parameters with unique, predictable names for each string. My setf-foreign-slot-values, and with-foreign-slot-values macros also make for more compact and readable code.

                                                                                    + +

                                                                                    Another set of macros is useful for defining the Windows message handler functions. I prefer to create a CLOS class for windows messages and let the CLOS method dispatcher find the proper function for each message. This allows message handlers to be inherited and more-specific handlers defined for selected messages in the derived class. CLOS handles this nicely. I have a DefMsgHandler macro that calls RegisterClass, defines the CLOS method for each message to be handled, takes care of necessary housekeeping in ubiquitous functions such as WM_PAINT, and allows easy definition of function bodies to be executed for each desired type of message. Other macros are useful for defining pushbuttons, edit boxes, list views, and other Win32 controls.

                                                                                    + +

                                                                                    Look at Appendix B. Compare it to Appendix A. Of course, an extended version of the header-file portion of Appendix A is used in Appendix B but not shown there. All but a little of the program in Appendix A has been reduced to a library which is invoked in Appendix B. All of the application-specific information is contained in the very small program in Appendix B.

                                                                                    + +

                                                                                    The program in Appendix C uses these macros to define a window including radio buttons, pushbuttons, a check box, text drawn on the background window, and a listview with columns.

                                                                                    + +

                                                                                    + +

                                                                                    Conclusion

                                                                                    + +

                                                                                    The example code presented in the text and in appendices A-C places an emphasis on staying in Lisp and accessing the Win32 API from there. Paul Tarvydas has code in Appendix D which demonstrates cooperation and interaction between C and Lisp. In Paul’s well-documented example, a C dll is used to drive the message loop. The Lisp callback function’s address is placed from within Lisp into a variable in the dll.

                                                                                    + +

                                                                                    Lisp provides an interactive and rich programming environment. The judicious use of macros to create language extensions in Lisp concentrates application-specific information into small local areas of the overall system. This simplifies the effort of understanding the application, increases the reliability of the application, reduces maintenance time, and increases the reliability of maintenance changes. Lisp is designed to make this easy.

                                                                                    + +
                                                                                    + +

                                                                                    + +

                                                                                    Appendix A: “Hello, Lisp†Program #1

                                                                                    + +

                                                                                    Here is a Win32 Lisp program that opens a GUI window displaying “Hello, Lisp!â€. A detailed discussion of program specifics follows the listing. The program listing contains necessary lines from the header files which are #included in a C/C++ program.

                                                                                    + +

                                                                                    It may be advantageous to open a separate window with the program source code visible while reading the text.

                                                                                    + +
                                                                                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                                                                    +;
                                                                                    +; Header-file kinds of code
                                                                                    +;
                                                                                    +
                                                                                    +; Determine character type
                                                                                    +(defun external-format ()
                                                                                    +  (if (string= (software-type) "Windows NT")
                                                                                    +      :unicode
                                                                                    +      :ascii))
                                                                                    +
                                                                                    +(defparameter *class-name* "LWTestClass")
                                                                                    +
                                                                                    +;--- Win32 SDK Constants
                                                                                    +
                                                                                    +; Not all of these are verified by testing in code
                                                                                    +; More are included than are used to allow play
                                                                                    +(defconstant COLOR_WINDOW                 5)
                                                                                    +(defconstant CS_HREDRAW                   1)
                                                                                    +(defconstant CS_VREDRAW                   2)
                                                                                    +(defconstant CW_USEDEFAULT       #x80000000)
                                                                                    +(defconstant IDC_ARROW                32512)
                                                                                    +(defconstant SW_SHOW                      5)
                                                                                    +(defconstant WM_CLOSE            #x00000010)
                                                                                    +(defconstant WM_DESTROY          #x00000002)
                                                                                    +(defconstant WM_PAINT            #x0000000f)
                                                                                    +(defconstant WS_BORDER           #x00080000)
                                                                                    +(defconstant WS_CAPTION          #x00C00000)
                                                                                    +(defconstant WS_CHILD            #x40000000)
                                                                                    +(defconstant WS_DISABLED         #x08000000)
                                                                                    +(defconstant WS_EX_CONTROLPARENT #x00010000)
                                                                                    +(defconstant WS_EX_APPWINDOW     #x00040000)
                                                                                    +(defconstant WS_MAXIMIZEBOX      #x00010000)
                                                                                    +(defconstant WS_MINIMIZEBOX      #x00020000)
                                                                                    +(defconstant WS_OVERLAPPED       #x00000000)
                                                                                    +(defconstant WS_POPUP            #x80000000)
                                                                                    +(defconstant WS_SYSMENU          #x00080000)
                                                                                    +(defconstant WS_THICKFRAME       #x00040000)
                                                                                    +(defconstant WS_VISIBLE          #x10000000)
                                                                                    +
                                                                                    +; Aggregates
                                                                                    +(defconstant WS_POPUPWINDOW (logior ws_popup ws_border ws_sysmenu))
                                                                                    +(defconstant WS_OVERLAPPEDWINDOW (logior ws_overlapped ws_caption
                                                                                    +                                         ws_sysmenu ws_thickframe
                                                                                    +                                         ws_minimizebox ws_maximizebox))
                                                                                    +
                                                                                    +;--- Win32 SDK data types
                                                                                    +
                                                                                    +(fli:define-c-typedef BOOL (:unsigned :long))
                                                                                    +(fli:define-c-typedef DWORD (:unsigned :long))
                                                                                    +(fli:define-c-typedef HANDLE (:unsigned :long))
                                                                                    +(fli:define-c-typedef HDC (:unsigned :long))
                                                                                    +(fli:define-c-typedef HINSTANCE (:unsigned :long))
                                                                                    +(fli:define-c-typedef HMENU (:unsigned :long))
                                                                                    +(fli:define-c-typedef HWND (:unsigned :long))
                                                                                    +(fli:define-c-typedef INT :int)
                                                                                    +(fli:define-c-typedef LONG :long)
                                                                                    +(fli:define-c-typedef LPCTSTR :pointer)
                                                                                    +(fli:define-c-typedef LPSTR :pointer)
                                                                                    +(fli:define-c-typedef LPVOID :long)
                                                                                    +(fli:define-c-typedef LPFN :long) ;; Doesn't work as :pointer
                                                                                    +(fli:define-c-typedef UINT (:unsigned :int))
                                                                                    +(fli:define-c-typedef ULONG (:unsigned :long))
                                                                                    +(fli:define-c-typedef wBYTE (:unsigned :char))
                                                                                    +(fli:define-c-typedef PTR (:unsigned :long))
                                                                                    +
                                                                                    +;--- Win32 SDK structures
                                                                                    +
                                                                                    +; POINT
                                                                                    +(fli:define-c-struct sPOINT
                                                                                    +    (x int)
                                                                                    +  (y int))
                                                                                    +(fli:define-c-typedef POINT sPOINT)
                                                                                    +
                                                                                    +; MSG
                                                                                    +(fli:define-c-struct sMSG
                                                                                    +    (hwnd hwnd)
                                                                                    +  (wParam ulong)
                                                                                    +  (lParam ulong)
                                                                                    +  (time dword)
                                                                                    +  (point point))
                                                                                    +(fli:define-c-typedef MSG sMSG)
                                                                                    +
                                                                                    +; PAINTSTRUCT
                                                                                    +(fli:define-c-struct sPAINTSTRUCT
                                                                                    +    (HDC hdc)
                                                                                    +  (fErase bool)
                                                                                    +  (rcPaint-x uint)
                                                                                    +  (rcPaint-y uint)
                                                                                    +  (rcPaint-width uint)
                                                                                    +  (rcPaint-height uint)
                                                                                    +  (fRestore bool)
                                                                                    +  (fIncUpdate bool)
                                                                                    +  (rgbReserved (:c-array wBYTE 32)))
                                                                                    +(fli:define-c-typedef PAINTSTRUCT sPAINTSTRUCT)
                                                                                    +
                                                                                    +; WndClass
                                                                                    +(fli:define-c-struct sWNDCLASS
                                                                                    +    (style uint)
                                                                                    +  (lpfnWndProc lpfn)
                                                                                    +  (cbClsExtra int)
                                                                                    +  (cbWndExtra int)
                                                                                    +  (hInstance handle)
                                                                                    +  (hIcon handle)
                                                                                    +  (hCursor handle)
                                                                                    +  (hBrBackground handle)
                                                                                    +  (lpszMenuName ulong) ;; ulong so it can be set to null without error
                                                                                    +  (lpszClassName lpctstr))
                                                                                    +(fli:define-c-typedef WNDCLASS sWNDCLASS)
                                                                                    +
                                                                                    +;--- Win32 SDK functions
                                                                                    +
                                                                                    +; BeginPaint
                                                                                    +(fli:define-foreign-function
                                                                                    +    (BeginPaint "BeginPaint" :calling-convention :stdcall)
                                                                                    +    ((hwnd hwnd) (lpPaintStruct ptr))
                                                                                    +  :result-type hdc)
                                                                                    +
                                                                                    +; CreateWindowEx
                                                                                    +(fli:define-foreign-function
                                                                                    +    (CreateWindowEx "CreateWindowEx" :dbcs :calling-convention :stdcall)
                                                                                    +    ((dwExStyle dword) (lpClassName lpctstr) (lpWindowName lpctstr)
                                                                                    +     (dwStyle dword) (x uint) (y uint) (nWidth uint) (nHeight uint)
                                                                                    +     (hwndParent hwnd) (hMenu hmenu) (hInstance hinstance) (lpParam lpvoid))
                                                                                    +  :result-type hwnd)
                                                                                    +
                                                                                    +; DefWindowProc
                                                                                    +(fli:define-foreign-function
                                                                                    +    (DefWindowProc "DefWindowProc" :dbcs :calling-convenction :stdcall)
                                                                                    +    ((hwnd ulong) (msg ulong) (wparam ulong) (lparam ulong))
                                                                                    +  :result-type ulong)
                                                                                    +
                                                                                    +; DispatchMessage
                                                                                    +(fli:define-foreign-function
                                                                                    +    (DispatchMessage "DispatchMessage" :dbcs :calling-convention :stdcall)
                                                                                    +    ((MsgPtr ptr)) ;; We're passing a pointer but Lisp doesn't know
                                                                                    +  :result-type ulong)
                                                                                    +
                                                                                    +; EndPaint
                                                                                    +(fli:define-foreign-function
                                                                                    +    (EndPaint "EndPaint" :calling-convention :stdcall)
                                                                                    +    ((hwnd hwnd) (lpPaintStruct ptr))
                                                                                    +  :result-type bool)
                                                                                    +
                                                                                    +; GetLastError
                                                                                    +(fli:define-foreign-function
                                                                                    +    (GetLastError "GetLastError" :calling-convention :stdcall)
                                                                                    +    ()
                                                                                    +  :result-type dword)
                                                                                    +
                                                                                    +; GetMessage
                                                                                    +(fli:define-foreign-function
                                                                                    +    (GetMessage "GetMessage" :dbcs :calling-convention :stdcall)
                                                                                    +    ((lpMsg ptr) (hwnd ulong) (MsgFiltMin ulong) (MsgFiltMax ulong))
                                                                                    +  :result-type bool)
                                                                                    +
                                                                                    +; GetModuleHandle - with no module name specified; pass this a zero i.e. NULL
                                                                                    +(fli:define-foreign-function
                                                                                    +    (GetModuleHandle-current "GetModuleHandle"
                                                                                    +                             :dbcs :calling-convenction :stdcall)
                                                                                    +    ((lpModuleName :long))
                                                                                    +  :result-type handle)
                                                                                    +
                                                                                    +; Lisp helper
                                                                                    +(defmacro current-module-handle ()
                                                                                    +  `(GetModuleHandle-current 0))
                                                                                    +
                                                                                    +; GetModuleHandle - pass this a foreign string naming the desired module
                                                                                    +(fli:define-foreign-function
                                                                                    +    (GetModuleHandle "GetModuleHandle" :dbcs :calling-convenction :stdcall)
                                                                                    +    ((lpModuleName lpctstr))
                                                                                    +  :result-type handle)
                                                                                    +
                                                                                    +; LoadCursor
                                                                                    +(fli:define-foreign-function
                                                                                    +    (LoadCursor "LoadCursor" :dbcs)
                                                                                    +    ((hInstance handle) (param (:unsigned :long)))
                                                                                    +  :result-type handle)
                                                                                    +
                                                                                    +; PostQuitMessage
                                                                                    +(fli:define-foreign-function
                                                                                    +    (PostQuitMessage "PostQuitMessage" :calling-convention :stdcall)
                                                                                    +    ((nExitCode :int))
                                                                                    +  :result-type :void)
                                                                                    +
                                                                                    +; RegisterClass
                                                                                    +(fli:define-foreign-function
                                                                                    +    (RegisterClass "RegisterClass" :dbcs :calling-convention :stdcall)
                                                                                    +    ((WndClass ptr))
                                                                                    +  :result-type bool)
                                                                                    +
                                                                                    +; TextOut
                                                                                    +(fli:define-foreign-function
                                                                                    +    (TextOut "TextOut" :dbcs :calling-convention :stdcall)
                                                                                    +    ((HDC hdc) (nXStart uint) (nYStart uint)
                                                                                    +     (lpString lpctstr) (cbString uint))
                                                                                    +  :result-type bool)
                                                                                    +
                                                                                    +; TranslateMessage
                                                                                    +(fli:define-foreign-function
                                                                                    +    (TranslateMessage "TranslateMessage" :calling-convention :stdcall)
                                                                                    +    ((msg-ptr ulong))
                                                                                    +  :result-type bool)
                                                                                    +
                                                                                    +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                                                                    +;
                                                                                    +; Code specific to one program
                                                                                    +;
                                                                                    +
                                                                                    +;--- Win32 SDK Callbacks
                                                                                    +
                                                                                    +; WndProc -- Window procedure for the window we will create
                                                                                    +(fli:define-foreign-callable
                                                                                    +    (wndproc :result-type :long :calling-convention :stdcall)
                                                                                    +    ((hwnd hwnd) (msg (:unsigned :long))
                                                                                    +     (wparam (:unsigned :long)) (lparam (:unsigned :long)))
                                                                                    +  (case msg
                                                                                    +    (#.WM_PAINT (wndproc-paint hwnd msg wparam lparam))
                                                                                    +    #+console (#.WM_DESTROY (PostQuitMessage 0) 0)
                                                                                    +    (t (DefWindowProc hwnd msg wparam lparam))))
                                                                                    +
                                                                                    +;--- Functions called from WndProc
                                                                                    +
                                                                                    +(defun wndproc-paint (hwnd msg wparam lparam)
                                                                                    +  (fli:with-dynamic-foreign-objects ()
                                                                                    +    (let* ((ps (fli:allocate-dynamic-foreign-object :type 'paintstruct))
                                                                                    +           (hdc (beginpaint hwnd (fli:pointer-address ps))))
                                                                                    +                                        ; Paint here
                                                                                    +      (fli:with-foreign-string (text-ptr ec bc :external-format (external-format))
                                                                                    +        "Hello, Lisp!"
                                                                                    +        (textout hdc 0 0 text-ptr ec))
                                                                                    +      (endpaint hwnd (fli:pointer-address ps))
                                                                                    +      0)))
                                                                                    +
                                                                                    +;--- Main Functions
                                                                                    +
                                                                                    +(defun register-class ()
                                                                                    +  (fli:with-foreign-string (cn-p ec bc :external-format (external-format))
                                                                                    +    *class-name*
                                                                                    +    ;; Below - use with-dynamic... for automatic freeing. Make some pointers.
                                                                                    +    (let (rslt
                                                                                    +          (wc-p (fli:allocate-foreign-object :type 'wndclass))
                                                                                    +          (wp-p (fli:make-pointer :symbol-name "wndproc")))
                                                                                    +      (unwind-protect
                                                                                    +           (progn
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'style) (logior cs_hredraw cs_vredraw))
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'lpfnWndProc)
                                                                                    +                   (fli:pointer-address wp-p))
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'cbClsExtra) 0)
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'cbWndExtra) 0)
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'hInstance) (current-module-handle))
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'hIcon) 0)
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'hCursor) (LoadCursor 0 IDC_ARROW))
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'hbrBackground) (1+ color_window))
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'lpszMenuName) 0)
                                                                                    +             (setf (fli:foreign-slot-value wc-p 'lpszClassName) cn-p)
                                                                                    +             (setq rslt (RegisterClass (fli:pointer-address wc-p))))
                                                                                    +        (fli:free-foreign-object wp-p)
                                                                                    +        (fli:free-foreign-object wc-p)
                                                                                    +        (if (/= rslt 0)
                                                                                    +            rslt
                                                                                    +            (error (format nil "~&RegisterClass failed in reg-class. Error: ~a"
                                                                                    +                           (GetLastError))))))))
                                                                                    +
                                                                                    +(defvar *reg-class-atom* (register-class))
                                                                                    +
                                                                                    +; CreateWindow
                                                                                    +(defun create-toplevel-window-run (window-name)
                                                                                    +  "See create-window."
                                                                                    +  (fli:with-foreign-string ;; class name pointer
                                                                                    +      (cn-p ec bc :external-format (external-format)) *class-name*
                                                                                    +      (fli:with-foreign-string ;; window name pointer
                                                                                    +          (wn-p ec bc :external-format (external-format)) window-name
                                                                                    +          (let ((hwnd (createwindowex 0 cn-p wn-p
                                                                                    +                                      (logior ws_visible ws_overlappedwindow)
                                                                                    +                                      cw_usedefault cw_usedefault cw_usedefault cw_usedefault
                                                                                    +                                        ;0 0 640 480
                                                                                    +                                      0 0 (GetModuleHandle-current 0) 0)))
                                                                                    +            (when (zerop hwnd)
                                                                                    +              (error (format nil "CreateWindow failed. GetLastError is ~a"
                                                                                    +                             (GetLastError))))
                                                                                    +            #-console hwnd ;; Should return wParam in thread, what about here?
                                                                                    +            #+console ;; Message pump the thread
                                                                                    +            (fli:with-dynamic-foreign-objects ()
                                                                                    +	      (let ((ms (fli:allocate-dynamic-foreign-object :type 'msg)))
                                                                                    +                (do ((gm (GetMessage (fli:pointer-address ms) 0 0 0)
                                                                                    +                         (GetMessage (fli:pointer-address ms) 0 0 0)))
                                                                                    +                    ((zerop gm) (fli:foreign-slot-value ms 'wParam))
                                                                                    +                  (TranslateMessage (fli:pointer-address ms))
                                                                                    +                  (DispatchMessage (fli:pointer-address ms)))))))))
                                                                                    +
                                                                                    +; CloseWindow
                                                                                    +(defun close-window (hwnd)
                                                                                    +  (sendmessage hwnd WM_CLOSE 0 0))
                                                                                    +
                                                                                    +(defmacro create-toplevel-window (window-name)
                                                                                    +  "Creates an overlapped window with title WINDOW-NAME.
                                                                                    +	      Returns the window handle."
                                                                                    +  #-console `(create-toplevel-window-run ,window-name)
                                                                                    +  #+console  `(progn
                                                                                    +                (when (null (mp:list-all-processes))
                                                                                    +                  (mp:initialize-multiprocessing))
                                                                                    +                (mp:process-run-function ,window-name nil
                                                                                    +                                         'create-toplevel-window-run ,window-name)))
                                                                                    +
                                                                                    +
                                                                                    + +

                                                                                    + +
                                                                                    + +

                                                                                    + +

                                                                                    Appendix B: “Hello, Lisp!†Program #2

                                                                                    + +
                                                                                    (require "win-header")
                                                                                    +
                                                                                    +(in-package :wh)
                                                                                    +(export '(initialize-appendix-b))
                                                                                    +
                                                                                    +(DefMsgHandler appendix-b-proc MsgMap ()
                                                                                    +               (WM_PAINT
                                                                                    +                (text-out "Hello, Lisp!" 0 0 :color (RGB 0 0 255))
                                                                                    +                0))
                                                                                    +
                                                                                    +(defun initialize-appendix-b ()
                                                                                    +  (DefActiveTopWindow "Hello" 'appendix-b-proc
                                                                                    +    :style ws_overlappedwindow :width 200 :height 100 :title "Hello Program"))
                                                                                    +
                                                                                    +
                                                                                    + +

                                                                                    + +
                                                                                    + +

                                                                                    + +

                                                                                    Appendix C: Program #3

                                                                                    + +
                                                                                    (require "win-header")
                                                                                    +
                                                                                    +(in-package :wh)
                                                                                    +(export '(initialize-appendix-c))
                                                                                    +
                                                                                    +; Following helps group the radio buttons
                                                                                    +(defparameter *radio-list* nil)
                                                                                    +
                                                                                    +; Define a message handler routine named testproc, inheriting
                                                                                    +;  from the base MsgMap. Others could inherit from this one...
                                                                                    +(DefMsgHandler appendix-c-proc MsgMap (:hbrbackground (1+ color_btnface))
                                                                                    +               (WM_CREATE
                                                                                    +
                                                                                    +                (DefGroupBox hwndGroupBox "Wish List" 25 30 300 70) ;; left top width height
                                                                                    +
                                                                                    +                (DefPushButton hwndB1 "More Money" 30 48 90 40
                                                                                    +                               ((mMessageBox "Quit buying Lisp books." "You requested more money.")))
                                                                                    +
                                                                                    +                (DefPushButton hwndB2 "Youth" 121 48 90 40
                                                                                    +                               ((mMessageBox "Sorry, not even Lisp can help you there." "You requested Youth.")))
                                                                                    +
                                                                                    +                (DefPushButton hwndB3 "Better Lisp Skills" 212 48 90 40
                                                                                    +                               ((mMessageBox "Keep practising." "You requested better Lisp skills.")))
                                                                                    +
                                                                                    +                (DefRadioButton hwndRB1 "Lisp is cool" 40 105 100 20
                                                                                    +                                :hwndlist *radio-list*)
                                                                                    +
                                                                                    +                (DefRadioButton hwndRB2 "Lisp is boss" 200 105 100 20
                                                                                    +                                :hwndlist *radio-list*)
                                                                                    +
                                                                                    +                (SetCheck *hwndRB1*)
                                                                                    +
                                                                                    +                (with-listview (DefListView hwndListView "" 25 150 300 200)
                                                                                    +                  ((col "Lisp Book Title" 90)
                                                                                    +                   (col "ISBN" 66)
                                                                                    +                   (col "Author" 150)))
                                                                                    +
                                                                                    +                (DefEdit hwndEdit "Learning Lisp is fun" 40 372 160 20 ())
                                                                                    +
                                                                                    +                (DefAutoCheckBox hwndCheckBox "I like it" 210 372 70 20
                                                                                    +                                 ((if (IsChecked *hwndCheckBox*)
                                                                                    +                                      (mMessageBox "I'm glad you like it" "Atta boy!")
                                                                                    +                                      (mMessageBox "Don't you like it?" "Whatsamatta U."))))
                                                                                    +                0)
                                                                                    +
                                                                                    +               (WM_PAINT
                                                                                    +                (with-font "Arial" -20 font-normal 0 0 0 ;; points weight italic bold underline
                                                                                    +                           (text-out "I Like Lisp" 70 5 :color (RGB 0 0 255)))
                                                                                    +                (with-font "Arial" -11 font-bold 0 0 0
                                                                                    +                           (text-out "Try it, you might like it, too!" 170 10
                                                                                    +                                     :color (RGB 255 0 0)))
                                                                                    +                0))
                                                                                    +
                                                                                    +(defun initialize-appendix-c ()
                                                                                    +  (DefActiveTopWindow "Test" 'appendix-c-proc
                                                                                    +    :style ws_overlappedwindow :width 360 :height 450
                                                                                    +    :title "First Lisp Screenshot"))
                                                                                    +
                                                                                    +
                                                                                    + +

                                                                                    + +
                                                                                    + +

                                                                                    + +

                                                                                    Appendix D: Paul Tarvydas’s Example

                                                                                    + +

                                                                                    Here’s an example that creates a windows class (in C) and gets invoked and +handled from LWW. It is similar to the “Hello†example in Petzhold, except +that it hooks to the LWW mainloop instead of creating its own. Probably it +ain’t as pretty as it might be, due to my rustiness with Win32 (and my lack +of patience with it :-).

                                                                                    + +

                                                                                    To use:

                                                                                    + +

                                                                                    1) create a DevStudio Win32 DLL project called “wintest†+2) put the wintest.c file into the project +3) copy the run.lisp file into the project directory (so that the Debug +directory is a subdirectory) +4) Build the C project. +5) Set Project»Settings»Debug»Executable for debug session to point +to the +lispworksxxx.exe. +6) Run the project - this should bring up lispworks. +7) Open run.lisp, compile and load it. +8) In the listener, type “(run)â€. +9) You should then see a window with “hello†in the middle of it.

                                                                                    + +

                                                                                    The example window class is built and initialized in C (called from the lisp +mainline). The windows callbacks to this window are handled in lisp (eg. the +WM_PAINT message) - windows has been given a pointer to a lisp function +(Lisp_WndProc) and has been told to use it for callbacks. The lisp code +makes direct Win32 calls that display the “hello†text. Lisp uses FLI +foreign functions and foreign variables to set this up. [If one were doing +this on a real project, a less contrived flow of control would be chosen, but +this one appears to exercise the FLI calls that you were asking about].

                                                                                    + +

                                                                                    [I welcome comments from anyone, re. style, simplification, etc.]

                                                                                    + +

                                                                                    Paul Tarvydas +tarvydas at spamoff-attcanada dotca

                                                                                    + +
                                                                                    //
                                                                                    +// Example of creating a windows class in
                                                                                    +// a DLL, then invoking it from Lisp.
                                                                                    +//
                                                                                    +// Convention for this example - routines
                                                                                    +// that are written in C and are called by
                                                                                    +// lisp are prefixed by "C_" and routines
                                                                                    +// written in lisp called by C are prefixed
                                                                                    +// by "Lisp_".  Note that, using LWW's FLI functions
                                                                                    +// and declarations everything could be done in Lisp.
                                                                                    +// This example shows how to bounce between Lisp and
                                                                                    +// C in the event that one might wish to "reuse"
                                                                                    +// existing C code.
                                                                                    +
                                                                                    +//
                                                                                    +// The routines C_CreateClass and C_CreateWindow are
                                                                                    +// written in C and exported from the DLL to be called
                                                                                    +// by Lisp.  Note that routines exported from a DLL
                                                                                    +// are expected to use the :stdcall calling convention.
                                                                                    +//
                                                                                    +// The routine Lisp_WndProc is written in Lisp and
                                                                                    +// exported (via FLI) so that it may be called
                                                                                    +// by Windows.  Note that Windows expects Lisp_WndProc
                                                                                    +// to use the :stdcall calling convention.
                                                                                    +
                                                                                    +#include <windows.h>
                                                                                    +#include <stdio.h>
                                                                                    +
                                                                                    +BOOL APIENTRY DllMain( HANDLE hModule,
                                                                                    +                       DWORD  ul_reason_for_call,
                                                                                    +                       LPVOID lpReserved )
                                                                                    +{
                                                                                    +  return TRUE;
                                                                                    +}
                                                                                    +
                                                                                    +// Windows calls a WndProc function to deliver a windows
                                                                                    +// event to a widget.  In this example, this callback
                                                                                    +// function is written in lisp.  If the WndProc function
                                                                                    +// decides to handle the event, it should return 0, else
                                                                                    +// it should call DefWindowProc.
                                                                                    +//
                                                                                    +// To get at the function, C uses a function pointer.
                                                                                    +// Lisp must set this function pointer before calling
                                                                                    +// C_CreateClass.  This variable is exported from
                                                                                    +// the dll, allowing lisp to see it and to put a value
                                                                                    +// into it.
                                                                                    +//
                                                                                    +// [Obviously, we could do this in other ways, for
                                                                                    +// example, we could pass the pointer to C_CreateClass as
                                                                                    +// a parameter.  Choosing to use a pointer variable shows
                                                                                    +// off more of the FLI - the fact that lisp can manipulate
                                                                                    +// C variables which reside in the DLL itself.]
                                                                                    +//
                                                                                    +__declspec(dllexport) LRESULT (CALLBACK *Lisp_WndProc)(HWND window,
                                                                                    +UINT eventType, UINT wParam, LONG lParam);
                                                                                    +
                                                                                    +//
                                                                                    +// Example Window (ExWindow)
                                                                                    +//
                                                                                    +
                                                                                    +__declspec(dllexport) void C_CreateClass (void) {
                                                                                    +WNDCLASS wClass;
                                                                                    +
                                                                                    +/* setup the window class data and register the class */
                                                                                    +
                                                                                    +  wClass.style = CS_HREDRAW | CS_VREDRAW;
                                                                                    +  wClass.lpfnWndProc = Lisp_WndProc;
                                                                                    +  wClass.cbClsExtra = wClass.cbWndExtra = 0;
                                                                                    +  wClass.hInstance = GetModuleHandle (NULL);
                                                                                    +  wClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
                                                                                    +  wClass.hCursor = LoadCursor(NULL,IDC_ARROW);
                                                                                    +  wClass.hbrBackground = GetStockObject(LTGRAY_BRUSH);
                                                                                    +  wClass.lpszMenuName = NULL;
                                                                                    +  wClass.lpszClassName = "ExWindow";
                                                                                    +  RegisterClass(&wClass);
                                                                                    +}
                                                                                    +
                                                                                    +//
                                                                                    +// create and display a window and returns its HWND
                                                                                    +//
                                                                                    +__declspec(dllexport) HWND C_CreateWindow (void) {
                                                                                    +  HWND mainWindow;
                                                                                    +  STARTUPINFO startup;
                                                                                    +  mainWindow = CreateWindow("ExWindow",// window class name
                                                                                    +                            "ExWindow", // Window caption
                                                                                    +                            WS_OVERLAPPEDWINDOW, // style
                                                                                    +                            CW_USEDEFAULT, // initial x position
                                                                                    +                            CW_USEDEFAULT, // initial y position
                                                                                    +                            CW_USEDEFAULT, // initial x extent
                                                                                    +                            CW_USEDEFAULT, // initial y extent
                                                                                    +                            NULL, //(HWND)parent, // parent window
                                                                                    +                            NULL, // menu handle
                                                                                    +                            GetModuleHandle (NULL), // program instance
                                                                                    +handle
                                                                                    +                            NULL); // creation parameters
                                                                                    +  if (NULL == mainWindow) {
                                                                                    +        long r = GetLastError();
                                                                                    +  } else {
                                                                                    +        GetStartupInfo (&startup);
                                                                                    +        ShowWindow(mainWindow,startup.wShowWindow);
                                                                                    +        UpdateWindow(mainWindow);
                                                                                    +  }
                                                                                    +  return mainWindow;
                                                                                    +}
                                                                                    +
                                                                                    +
                                                                                    + +
                                                                                    ;
                                                                                    +; Driver that initializes and calls a C dll
                                                                                    +; to display a window.
                                                                                    +;
                                                                                    +
                                                                                    +; Define some Win32 types
                                                                                    +(fli:define-c-typedef HWND (:unsigned :long))
                                                                                    +(fli:define-c-typedef HANDLE (:pointer :void))
                                                                                    +(fli:define-c-typedef HDC (:pointer :void))
                                                                                    +(fli:define-c-typedef BOOL :int)
                                                                                    +(fli:define-c-typedef wBYTE (:unsigned :char))
                                                                                    +(fli:define-c-struct sRECT
                                                                                    +  (left :LONG)
                                                                                    +  (top  :LONG)
                                                                                    +  (right :LONG)
                                                                                    +  (bottom :LONG))
                                                                                    +(fli:define-c-typedef RECT sRECT)
                                                                                    +(fli:define-c-struct sPAINTSTRUCT ;; from winuser.h
                                                                                    +  (hdc HDC)
                                                                                    +  (fErase BOOL)
                                                                                    +  (rcPaint RECT)
                                                                                    +  (fRestore BOOL)
                                                                                    +  (fIncUpdate BOOL)
                                                                                    +  (rbgReserved (:c-array wBYTE 32)))
                                                                                    +(fli:define-c-typedef PAINTSTRUCT sPAINTSTRUCT)
                                                                                    +
                                                                                    +; some constants from WINUSER.H
                                                                                    +(eval-when (compile load)
                                                                                    +  (defconstant WM_COMMAND #x0111)
                                                                                    +  (defconstant WM_PAINT #x000F)
                                                                                    +  (defconstant WM_DESTROY #x0002))
                                                                                    +(defconstant DT_TOP              #x00000000)
                                                                                    +(defconstant DT_LEFT             #x00000000)
                                                                                    +(defconstant DT_CENTER           #x00000001)
                                                                                    +(defconstant DT_RIGHT            #x00000002)
                                                                                    +(defconstant DT_VCENTER          #x00000004)
                                                                                    +(defconstant DT_BOTTOM           #x00000008)
                                                                                    +(defconstant DT_WORDBREAK        #x00000010)
                                                                                    +(defconstant DT_SINGLELINE       #x00000020)
                                                                                    +(defconstant DT_EXPANDTABS       #x00000040)
                                                                                    +(defconstant DT_TABSTOP          #x00000080)
                                                                                    +(defconstant DT_NOCLIP           #x00000100)
                                                                                    +(defconstant DT_EXTERNALLEADING  #x00000200)
                                                                                    +(defconstant DT_CALCRECT         #x00000400)
                                                                                    +(defconstant DT_NOPREFIX         #x00000800)
                                                                                    +(defconstant DT_INTERNAL         #x00001000)
                                                                                    +
                                                                                    +; some Win32 calls
                                                                                    +(fli:define-foreign-function (get-last-error "GetLastError")
                                                                                    +    () :result-type :long :calling-convention :stdcall)
                                                                                    +
                                                                                    +(fli:define-foreign-function (GetClientRect "GetClientRect")
                                                                                    +    ((h HWND) (l (:pointer RECT)))
                                                                                    +  :result-type :long :calling-convention :stdcall)
                                                                                    +
                                                                                    +(fli:define-foreign-function (DrawText "DrawText" :dbcs)
                                                                                    +    ((h HDC) (s :pointer) (nCount :int) (lprect :pointer)
                                                                                    +     (uFormat (:unsigned :int)))
                                                                                    +  :result-type :long :calling-convention :stdcall)
                                                                                    +
                                                                                    +(fli:define-foreign-function (BeginPaint "BeginPaint")
                                                                                    +    ((h HWND) (lpPaint :pointer))
                                                                                    +  :result-type HDC :calling-convention :stdcall)
                                                                                    +
                                                                                    +(fli:define-foreign-function (EndPaint "EndPaint")
                                                                                    +    ((h HWND) (lpPaint :pointer))
                                                                                    +  :result-type BOOL :calling-convention :stdcall)
                                                                                    +
                                                                                    +(fli:define-foreign-function (DefWindowProc "DefWindowProc" :dbcs)
                                                                                    +    ((h HWND) (msg (:unsigned :int))
                                                                                    +     (wParam (:unsigned :int)) (lParam (:unsigned :int)))
                                                                                    +  :result-type :long :calling-convention :stdcall)
                                                                                    +
                                                                                    +;
                                                                                    +; Exports from the DLL
                                                                                    +;
                                                                                    +; definition of pointer variable exported from the DLL
                                                                                    +(fli:define-foreign-variable (Lisp_WndProc "Lisp_WndProc") :type
                                                                                    +  :pointer)
                                                                                    +
                                                                                    +; definition of routines exported from the DLL
                                                                                    +(fli:define-foreign-function (C_CreateClass "C_CreateClass")
                                                                                    +    () :result-type :void :calling-convention :stdcall)
                                                                                    +
                                                                                    +(fli:define-foreign-function (C_CreateWindow "C_CreateWindow")
                                                                                    +    () :result-type HWND :calling-convention :stdcall)
                                                                                    +
                                                                                    +;
                                                                                    +; Exports from Lisp
                                                                                    +;
                                                                                    +
                                                                                    +; The WndProc that Windows will call when an event is
                                                                                    +; sent to the window.  Written in lisp, made callable
                                                                                    +; from C/Windows (using :stdcall convention).
                                                                                    +; The function closely resembles the hellowin.c code
                                                                                    +; found in Petzhold (page 45, 5th ed), except that
                                                                                    +; the "WM_CREATE" stuff is handled in C.
                                                                                    +; (nb: we don't care what the name is - we use
                                                                                    +; a pointer to this function)
                                                                                    +(fli:define-foreign-callable
                                                                                    +    ("func_Lisp_WndProc" :result-type :long
                                                                                    +                         :calling-convention :stdcall)
                                                                                    +    ((window HWND) (message (:unsigned :int))
                                                                                    +     (wParam (:unsigned :int)) (lParam (:unsigned :int)))
                                                                                    +
                                                                                    +  (case message
                                                                                    +
                                                                                    +    (#.WM_PAINT
                                                                                    +     (fli:with-dynamic-foreign-objects ((hdc HDC)
                                                                                    +                                        (ps PAINTSTRUCT)
                                                                                    +                                        (rect RECT))
                                                                                    +       (fli:with-coerced-pointer (p-ps) ps
                                                                                    +         (fli:with-coerced-pointer (p-rect) rect
                                                                                    +                                   (setf hdc (BeginPaint window p-ps))
                                                                                    +                                   (GetClientRect window p-rect)
                                                                                    +                                   (fli:with-foreign-string
                                                                                    +                                       (p-str ecount bcount :external-format (ext-format))
                                                                                    +                                     "Hello" (declare (ignore ecount bcount))
                                                                                    +                                     (DrawText hdc p-str -1 p-rect
                                                                                    +                                               (logior DT_SINGLELINE DT_CENTER DT_VCENTER))
                                                                                    +                                     (EndPaint window p-ps)
                                                                                    +                                     0)))))
                                                                                    +
                                                                                    +    (#.WM_DESTROY 0)  ;; if we use PostQuitMessage here, LWW will also
                                                                                    +    exit
                                                                                    +
                                                                                    +    (otherwise (DefWindowProc window message wParam lParam))))
                                                                                    +
                                                                                    +(defun ext-format ()
                                                                                    +  (if (string= (software-type) "Windows NT")
                                                                                    +      :unicode
                                                                                    +      :ascii))
                                                                                    +
                                                                                    +;
                                                                                    +; The test program
                                                                                    +;
                                                                                    +
                                                                                    +(defun run ()
                                                                                    +  ; set up the DLL
                                                                                    +  (fli:register-module "debug/wintest.dll")
                                                                                    +
                                                                                    +  ; poke the function pointer for the lisp windows proc
                                                                                    +  (setf (Lisp_WndProc)
                                                                                    +        (fli:make-pointer :symbol-name "func_Lisp_WndProc"))
                                                                                    +
                                                                                    +  ; create the Windows class for ExWindow
                                                                                    +  (C_CreateClass)
                                                                                    +
                                                                                    +  ; instantiate an ExWindow
                                                                                    +  (C_CreateWindow)
                                                                                    +
                                                                                    +  ; the windows loop takes care of the rest
                                                                                    +  ; nb - we've hooked to the windows loop of LWW by
                                                                                    +  ; using GetWindowHandle(0) in the C code.
                                                                                    +  )
                                                                                    +
                                                                                    +
                                                                                    + + +

                                                                                    + Page source: win32.md +

                                                                                    +
                                                                                    + + + + + +
                                                                                    +
                                                                                    +
                                                                                    + © 2002–2021 the Common Lisp Cookbook Project +
                                                                                    + +
                                                                                    +
                                                                                    T
                                                                                    O
                                                                                    C
                                                                                    +
                                                                                    + + + + + + + + + diff --git a/clones/sicp/mitpress.mit.edu/robots.txt b/clones/sicp/mitpress.mit.edu/robots.txt new file mode 100644 index 00000000..18f8df8e --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/robots.txt @@ -0,0 +1,61 @@ +# +# robots.txt +# +# This file is to prevent the crawling and indexing of certain parts +# of your site by web crawlers and spiders run by sites like Yahoo! +# and Google. By telling these "robots" where not to go on your site, +# you save bandwidth and server resources. +# +# This file will be ignored unless it is at the root of your host: +# Used: http://example.com/robots.txt +# Ignored: http://example.com/site/robots.txt +# +# For more information about the robots.txt standard, see: +# http://www.robotstxt.org/robotstxt.html + +User-agent: * +# CSS, JS, Images +Allow: /core/*.css$ +Allow: /core/*.css? +Allow: /core/*.js$ +Allow: /core/*.js? +Allow: /core/*.gif +Allow: /core/*.jpg +Allow: /core/*.jpeg +Allow: /core/*.png +Allow: /core/*.svg +Allow: /profiles/*.css$ +Allow: /profiles/*.css? +Allow: /profiles/*.js$ +Allow: /profiles/*.js? +Allow: /profiles/*.gif +Allow: /profiles/*.jpg +Allow: /profiles/*.jpeg +Allow: /profiles/*.png +Allow: /profiles/*.svg +# Directories +Disallow: /core/ +Disallow: /profiles/ +# Files +Disallow: /README.txt +Disallow: /web.config +# Paths (clean URLs) +Disallow: /admin/ +Disallow: /comment/reply/ +Disallow: /filter/tips +Disallow: /node/add/ +Disallow: /search/ +Disallow: /user/register +Disallow: /user/password +Disallow: /user/login +Disallow: /user/logout +# Paths (no clean URLs) +Disallow: /index.php/admin/ +Disallow: /index.php/comment/reply/ +Disallow: /index.php/filter/tips +Disallow: /index.php/node/add/ +Disallow: /index.php/search/ +Disallow: /index.php/user/password +Disallow: /index.php/user/register +Disallow: /index.php/user/login +Disallow: /index.php/user/logout diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-C.css b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-C.css new file mode 100644 index 00000000..205d973a --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-C.css @@ -0,0 +1,80 @@ + + +body { + color: black; +/* background-color: #e5e5e5; */ +/* background-color: beige;*/ +background-color: white; + margin-top: 2em; + margin-left: 8%; + margin-right: 8%; +} + +h1,h2,h3,h4,h5,h6 { + margin-top: .5em; +} + +.partheading { + font-size: 70%; +} + +.chapterheading { + font-size: 70%; +} + +ol { + list-style-type: decimal; +} + +ol ol { + list-style-type: lower-alpha; +} + +ol ol ol { + list-style-type: lower-roman; +} + +ol ol ol ol { + list-style-type: upper-alpha; +} + +.footnote { + font-size: 75%; +} + +.epigraph { +/* text-align: right; */ + font-size: 75%; +} + +.figure { + background-color: lavender; +} + +.table { +background-color: pink; +} + +.navigation { + color: red; + text-align: right; + font-style: italic; +} + +.smallprint { + color: gray; + font-size: 75%; + text-align: right; +} + +.smallprint hr { + text-align: left; + width: 40%; +} + +.disable { + /* color: #e5e5e5; */ +color: gray; +} + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-11.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-11.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8f9803657663f332dc8293e654930d82f8342e6 GIT binary patch literal 61 zcmZ?wbhEHbWM|-EXkY+=|Ns9h{$ycfU|?j>0r5dH3``0r5dH3`{~jyvtYaWuL(#ysILz`%dh7 INmd4H0EUkaYXATM literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-13.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-13.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bbe7ec90f3b2cf79c9f0c572cc4ab9d689cafd2 GIT binary patch literal 65 zcmZ?wbhEHb0r5dH3``O|{SDHmp2ba`e2jztMrQ1{ PO0H`YXWi6gWv~VS3JenC literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-14.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-14.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5bcc7401e6499ae2b28bc54a0274d7ad54f3d27 GIT binary patch literal 52 zcmZ?wbhEHb0r5dH3{2cU2`k%nGc4{ozLtr>8UQCF B3>N?Z literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-15.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-15.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2aa1f8cbff8a39d7f0b0ea20044e78faf69a07f GIT binary patch literal 51 zcmZ?wbhEHb0r5dH3`|@-{SDa<_!Ye;i!oRO02oyY A0r5dH3{1Q}32Y~pzZ9BOVAu6tm%$nU DKQj#C literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-17.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-17.gif new file mode 100644 index 0000000000000000000000000000000000000000..270c2e9796bee36687bfb6d462615b12f2c8c915 GIT binary patch literal 56 zcmZ?wbhEHb0r5dH3{3nkeUi&E?ugCUa;-uxZXpAM FH2_>J4TJyy literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-18.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-18.gif new file mode 100644 index 0000000000000000000000000000000000000000..594bec29bad9a3b7aaae1a9393d2b443cf772a50 GIT binary patch literal 46 ucmZ?wbhEHbWMbfCXkY+=|Ns9h{$ycfU|?j>0r5dH3{0#peTkJ}4AubM`3TGa literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-19.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-19.gif new file mode 100644 index 0000000000000000000000000000000000000000..db889eba8da2dc0df018ea1b8b08002d573d4c5c GIT binary patch literal 55 zcmZ?wbhEHbWMklFXkY+=|Ns9h{$ycfU|?j>0r5dH3`~4I%mr09?%k-mbVVd`5-Wo> E09W7+3IG5A literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-20.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-20.gif new file mode 100644 index 0000000000000000000000000000000000000000..d842b4dc559327b575bf59cf783c257046ffbf84 GIT binary patch literal 54 zcmZ?wbhEHb0r5dH3{1Q{ax-^aSjRVc)y?pw+6>kJ DK!Ob* literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-3.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..073eb5ea5536766938714591644b763e1b80f4ed GIT binary patch literal 61 zcmZ?wbhEHb0r5dH3``0r5dH3`~MOjbfa)ZVSb{Q~0)`=ElhY H1_o;YfA|kd literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-6.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-6.gif new file mode 100644 index 0000000000000000000000000000000000000000..190ede13a8266551777c1144e3e5faa84b461fd8 GIT binary patch literal 56 zcmZ?wbhEHbWM|-FXkY+=|Ns9h{$ycfU|?j>0r5dH3{3n!36(3Z|C=$1Eg&WPkgy1Y FH2`9_4Y~jT literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-9.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-G-D-9.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d17b514dcf65738d1913a4f02fbd1a125d7cc5f GIT binary patch literal 52 zcmZ?wbhEHbWM^PwXkY+=|Ns9h{$ycfU|?j>0r5dH3{2cD{DL!gt&eKHw3Ug$8UP~Z B3*Z0% literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-1.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-1.html new file mode 100644 index 00000000..0f7830af --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-1.html @@ -0,0 +1,70 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + +

                                                                                    + + + +                 +

                                                                                    + + +

                                                                                    + +

                                                                                    + + + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    Structure and Interpretation
                                                                                    +of Computer Programs

                                                                                    second edition 
                                                                                    + +





                                                                                    Harold Abelson and Gerald Jay Sussman
                                                                                    +with Julie Sussman 
                                                                                    + +

                                                                                    foreword by Alan J. Perlis 
                                                                                    + +







                                                                                    The MIT Press
                                                                                    +Cambridge, Massachusetts     London, England +

                                                                                    McGraw-Hill Book Company
                                                                                    +New York     St. Louis     San Francisco +    Montreal     Toronto 

                                                                                    + +

                                                                                    + + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-10.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-10.html new file mode 100644 index 00000000..dc1a2915 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-10.html @@ -0,0 +1,1404 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    1.1  The Elements of Programming

                                                                                    + + + +A powerful programming language is more than just a means for +instructing a computer to perform tasks. The language also serves as +a framework within which we organize our ideas about processes. Thus, +when we describe a language, we should pay particular attention to the +means that the language provides for combining simple ideas to form +more complex ideas. Every powerful language has three mechanisms for +accomplishing this:

                                                                                    + +

                                                                                      +
                                                                                    • primitive expressions, which represent the simplest +entities the language is concerned with,

                                                                                      + +

                                                                                    • means of combination, by which compound +elements are built from simpler ones, and

                                                                                      + +

                                                                                    • means of abstraction, by +which compound elements can be named and manipulated as units.

                                                                                      + +

                                                                                    + +In programming, we deal with two kinds of elements: procedures and +data. (Later we will discover that they are really not so distinct.) +Informally, data is ``stuff'' that we want to manipulate, and +procedures are descriptions of the rules for manipulating the data. +Thus, any powerful programming language should be able to describe +primitive data and primitive procedures and should have methods for +combining and abstracting procedures and data.

                                                                                    + +In this chapter we will deal only with simple numerical data so that +we can focus on the rules for building procedures.4 In later chapters we will see that +these same rules allow us to build procedures to manipulate compound +data as well.

                                                                                    + + +

                                                                                    1.1.1  Expressions

                                                                                    + +

                                                                                    + +One easy way to get started at programming is to examine some typical +interactions with an interpreter for the Scheme dialect of Lisp. +Imagine that you are sitting at a computer terminal. You type an +expression, and the interpreter responds by displaying the result of +its evaluating that expression.

                                                                                    + +One kind of primitive expression you might type is a number. (More +precisely, the expression that you type consists of the numerals that +represent the number in base 10.) If you present Lisp with +a number

                                                                                    + +

                                                                                    486
                                                                                    +

                                                                                    +the interpreter will respond by printing5

                                                                                    + +

                                                                                    486
                                                                                    +

                                                                                    + +Expressions representing numbers may be combined with an expression +representing a primitive procedure (such as + or *) to form a +compound expression that represents the +application of the procedure to those numbers. For example:

                                                                                    + +

                                                                                    (+ 137 349)
                                                                                    +486
                                                                                    +(- 1000 334)
                                                                                    +666
                                                                                    +(* 5 99)
                                                                                    +495
                                                                                    +(/ 10 5)
                                                                                    +2
                                                                                    +(+ 2.7 10)
                                                                                    +12.7
                                                                                    +

                                                                                    + +Expressions such as these, formed by delimiting a list of expressions +within parentheses in order to denote procedure application, +are called combinations. The leftmost +element in the list is called the operator, and the other +elements are called operands. The value of a combination is +obtained by applying the procedure specified by the operator to the +arguments that are the values of the operands.

                                                                                    + +The convention of placing the operator to the left of the operands is +known as prefix notation, and it may be somewhat confusing at +first because it departs significantly from the customary mathematical +convention. Prefix notation has several advantages, however. One of +them is that it can accommodate procedures that may take an arbitrary +number of arguments, as in the following examples:

                                                                                    + +

                                                                                    (+ 21 35 12 7)
                                                                                    +75
                                                                                    +
                                                                                    +(* 25 4 12)
                                                                                    +1200
                                                                                    +

                                                                                    +No ambiguity can arise, because the operator is always the leftmost +element and the entire combination is delimited by the +parentheses.

                                                                                    + +A second advantage of prefix notation is that it extends in a +straightforward way to allow combinations to be nested, that is, +to have combinations whose elements are themselves +combinations:

                                                                                    + +

                                                                                    (+ (* 3 5) (- 10 6))
                                                                                    +19
                                                                                    +

                                                                                    + +There is no limit (in principle) to the depth of such nesting and to +the overall complexity of the expressions that the Lisp interpreter +can evaluate. +It is we humans who get confused by still relatively +simple expressions such as

                                                                                    + +

                                                                                    (+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))
                                                                                    +

                                                                                    +which the interpreter would readily evaluate to be 57. We can help +ourselves by writing such an expression in the form

                                                                                    + +

                                                                                    (+ (* 3
                                                                                    +      (+ (* 2 4)
                                                                                    +         (+ 3 5)))
                                                                                    +   (+ (- 10 7)
                                                                                    +      6))
                                                                                    +

                                                                                    +following a formatting convention known as pretty-printing, in +which each long combination is written so that the operands are +aligned vertically. The resulting indentations display clearly the +structure of the expression.6

                                                                                    + +Even with complex expressions, the interpreter always operates in the +same basic cycle: It reads an expression from the terminal, +evaluates the expression, and prints the result. +This mode of operation is often expressed by saying that the +interpreter runs in a read-eval-print loop. +Observe in particular that it is not necessary to explicitly +instruct the interpreter to print the value of the expression.7

                                                                                    + + +

                                                                                    1.1.2  Naming and the Environment

                                                                                    + +A critical aspect of a programming language is the means it provides +for using names to refer to computational objects. We say that the +name identifies a variable whose value is the object.

                                                                                    + +In the Scheme dialect of Lisp, we +name things with define. Typing

                                                                                    + +

                                                                                    (define size 2)
                                                                                    +

                                                                                    +causes the interpreter to associate the value 2 with the +name size.8 +Once the name size has been associated with the number 2, we can +refer to the value 2 by name:

                                                                                    + +

                                                                                    size
                                                                                    +2
                                                                                    +(* 5 size)
                                                                                    +10
                                                                                    +

                                                                                    + +Here are further examples of the use of define:

                                                                                    + +

                                                                                    (define pi 3.14159)
                                                                                    +(define radius 10)
                                                                                    +(* pi (* radius radius))
                                                                                    +314.159
                                                                                    +(define circumference (* 2 pi radius))
                                                                                    +circumference
                                                                                    +62.8318
                                                                                    +

                                                                                    + +Define is our language's +simplest means of abstraction, for it allows us to use simple names to +refer to the results of compound operations, such as the +circumference computed above. +In general, computational objects may have very complex +structures, and it would be extremely inconvenient to have to remember +and repeat their details each time we want to use them. Indeed, +complex programs are constructed by building, step by step, +computational objects of increasing complexity. The +interpreter makes this step-by-step program construction particularly +convenient because name-object associations can be created +incrementally in successive interactions. This feature encourages the +incremental development and testing of programs and is largely +responsible for the fact that a Lisp program usually consists of a large +number of relatively simple procedures.

                                                                                    + +It should be clear that the possibility of associating values with +symbols and later retrieving them means that the interpreter must +maintain some sort of memory that keeps track of the name-object +pairs. This memory is called the environment (more precisely +the global environment, since we will see later that a +computation may involve a number of different +environments).9

                                                                                    + + +

                                                                                    1.1.3  Evaluating Combinations

                                                                                    + + + +One of our goals in this chapter is to isolate issues about thinking +procedurally. As a case in point, let us consider that, in evaluating +combinations, the interpreter is itself following a procedure.

                                                                                    + +

                                                                                      +
                                                                                    • To evaluate a combination, do the following: +

                                                                                    + +

                                                                                    +

                                                                                    1.  Evaluate the subexpressions of the combination.

                                                                                    + +

                                                                                    2.  Apply the procedure that is the value of the leftmost +subexpression (the operator) to the arguments that are the values of +the other subexpressions (the operands). +

                                                                                    + +Even this simple rule illustrates some important points about +processes in general. First, observe that the first step dictates +that in order to accomplish the evaluation process for a combination +we must first perform the evaluation process on each element of the +combination. Thus, the evaluation rule is recursive in nature; +that is, it includes, as one of its steps, the need to invoke the rule +itself.10

                                                                                    + +Notice how succinctly the idea of recursion can be used to express +what, in the case of a deeply nested combination, would otherwise be +viewed as a rather complicated process. For example, evaluating

                                                                                    + +

                                                                                    (* (+ 2 (* 4 6))
                                                                                    +   (+ 3 5 7))
                                                                                    +

                                                                                    +requires that the evaluation rule be applied to four different +combinations. We can obtain a picture of this process by representing +the combination in the form of a tree, as shown in +figure 1.1. Each combination is represented by a +node with branches corresponding to the operator and the +operands of the combination stemming from it. +The terminal nodes (that is, nodes with +no branches stemming from them) represent either operators or numbers. +Viewing evaluation in terms of the tree, we can imagine that the +values of the operands percolate upward, starting from the terminal +nodes and then combining at higher and higher levels. In general, we +shall see that recursion is a very powerful technique for dealing with +hierarchical, treelike objects. In fact, the ``percolate values +upward'' form of the evaluation rule is an example of a general kind +of process known as tree accumulation.

                                                                                    + +

                                                                                    +
                                                                                    Figure 1.1:  Tree representation, showing the value of each subcombination.
                                                                                    + +

                                                                                    + +Next, observe that the repeated application of the first step brings +us to the point where we need to evaluate, not combinations, but +primitive expressions such as numerals, built-in operators, or other +names. We take care of the primitive cases by stipulating that

                                                                                    + +

                                                                                      +
                                                                                    • the values of numerals are the numbers that they name,

                                                                                      + +

                                                                                    • the values of built-in operators are the machine +instruction sequences that carry out the corresponding operations, and

                                                                                      + +

                                                                                    • the values of other names are the objects associated +with those names in the environment. +

                                                                                    + +We may regard the second rule as a special case of the third one by +stipulating that symbols such as + and * are also included +in the global environment, and are associated with the sequences of +machine instructions that are their ``values.'' The key point to +notice is the role of the environment in determining the meaning of +the symbols in expressions. In an interactive language such as +Lisp, it is meaningless to speak of the value of an expression such as +(+ x 1) without specifying any information about the environment +that would provide a meaning for the symbol x (or even for the +symbol +). As we shall see in chapter 3, the general notion of +the environment as providing a context in which evaluation takes place +will play an important role in our understanding of program execution.

                                                                                    + +Notice that the +evaluation rule given above does not handle definitions. +For instance, evaluating +(define x 3) does not apply define to two arguments, one +of which is the value of the symbol x and the other of which is +3, since the purpose of the define is precisely to associate +x with a value. +(That is, (define x 3) is not a combination.)

                                                                                    + +Such exceptions to the general evaluation rule are called special +forms. Define is the only example of a special form that we +have seen so far, but we will meet others shortly. Each special form +has its own evaluation rule. The various kinds of expressions (each +with its associated evaluation rule) constitute the syntax of the +programming language. In comparison with most other programming +languages, Lisp has a very simple syntax; that is, the evaluation rule +for expressions can be described by a simple general rule together +with specialized rules for a small number of special +forms.11

                                                                                    + + +

                                                                                    1.1.4  Compound Procedures

                                                                                    + +

                                                                                    + +We have identified in Lisp some of the elements that must appear in +any powerful programming language:

                                                                                    + + +

                                                                                      +
                                                                                    • Numbers and arithmetic operations are +primitive data and procedures.

                                                                                      + +

                                                                                    • Nesting of combinations provides a means of +combining operations.

                                                                                      + +

                                                                                    • Definitions that associate names with values provide a +limited means of abstraction. +

                                                                                    + +Now we will learn about +procedure definitions, a much more powerful abstraction +technique by which a compound operation can be given a name and then +referred to as a unit.

                                                                                    + +We begin by examining how to express the idea of ``squaring.'' We +might say, ``To square something, multiply it by itself.'' This is +expressed in our language as

                                                                                    + +

                                                                                    (define (square x) (* x x))
                                                                                    +

                                                                                    + +We can understand this in the following way:

                                                                                    + + + +

                                                                                    (define (square  x)        (*         x     x))
                                                                                    +                                       
                                                                                    + To      square something, multiply   it by itself.
                                                                                    +

                                                                                    +We have here a compound procedure, which has been given the name +square. The procedure represents the operation of multiplying +something by itself. The thing to be multiplied is given a local +name, x, which plays the same role that a pronoun plays in +natural language. Evaluating the definition creates this +compound procedure and associates it with the name square.12

                                                                                    + +The general form of a procedure definition is

                                                                                    + +

                                                                                    (define (<name> <formal parameters>) <body>)
                                                                                    +

                                                                                    +The <name> is a symbol to be associated with the procedure +definition in the environment.13 +The <formal parameters> are +the names used within the body of the procedure to refer to the +corresponding arguments of the procedure. The +<body> is an expression that will yield the value of +the procedure application when the formal parameters are replaced by +the actual arguments to which the procedure is applied.14 +The <name> +and the <formal parameters> +are grouped within parentheses, just as they +would be in an actual call to the procedure being defined.

                                                                                    + +Having defined square, we can now use it:

                                                                                    + +

                                                                                    (square 21)
                                                                                    +441
                                                                                    +
                                                                                    +(square (+ 2 5))
                                                                                    +49
                                                                                    +
                                                                                    +(square (square 3))
                                                                                    +81
                                                                                    +

                                                                                    + +We can also use square as a building block in defining other +procedures. For example, x2 + y2 can be expressed as

                                                                                    + +

                                                                                    (+ (square x) (square y))
                                                                                    +

                                                                                    +We can easily define a procedure +sum-of-squares that, given any two numbers as arguments, produces the +sum of their squares:

                                                                                    + +

                                                                                    (define (sum-of-squares x y)
                                                                                    +  (+ (square x) (square y)))
                                                                                    +
                                                                                    +(sum-of-squares 3 4)
                                                                                    +25
                                                                                    +

                                                                                    +Now we can use sum-of-squares as a building block in constructing +further procedures:

                                                                                    + +

                                                                                    (define (f a)
                                                                                    +  (sum-of-squares (+ a 1) (* a 2)))
                                                                                    +
                                                                                    +(f 5)
                                                                                    +136
                                                                                    +

                                                                                    +Compound procedures are used in exactly the same way as primitive +procedures. Indeed, one could not tell by looking at the definition +of sum-of-squares given above whether square was built into +the interpreter, like + and *, or defined as a compound procedure.

                                                                                    + + +

                                                                                    1.1.5  The Substitution Model for Procedure Application

                                                                                    + + + +To evaluate a combination whose operator names a compound procedure, the +interpreter follows much the same process as for combinations whose +operators name primitive procedures, which we described in +section 1.1.3. That is, the interpreter +evaluates the elements of the combination and applies the procedure +(which is the value of the operator of the combination) to the +arguments (which are the values of the operands of the combination).

                                                                                    + +We can assume that the mechanism for applying primitive procedures to +arguments is built into the interpreter. For compound procedures, the +application process is as follows:

                                                                                    + +

                                                                                      +
                                                                                    • To apply a compound procedure to arguments, evaluate the body of the +procedure with each formal parameter replaced by the corresponding +argument. +

                                                                                    + +To illustrate this process, let's evaluate the combination

                                                                                    + +

                                                                                    (f 5)
                                                                                    +

                                                                                    +where f is the procedure defined in +section 1.1.4. We begin by retrieving the +body of f:

                                                                                    + +

                                                                                    (sum-of-squares (+ a 1) (* a 2))
                                                                                    +

                                                                                    +Then we replace the formal parameter a by the argument 5:

                                                                                    + +

                                                                                    (sum-of-squares (+ 5 1) (* 5 2))
                                                                                    +

                                                                                    +Thus the problem reduces to the evaluation of a combination with two +operands and an operator sum-of-squares. Evaluating this +combination involves three subproblems. We must evaluate the +operator to get the procedure to be applied, and we must evaluate the +operands to get the arguments. Now (+ 5 1) produces 6 and +(* 5 2) produces 10, so we must apply the +sum-of-squares procedure to 6 and 10. These values are substituted +for the formal parameters x and y in the body of sum-of-squares, +reducing the expression to

                                                                                    + +

                                                                                    (+ (square 6) (square 10))
                                                                                    +

                                                                                    +If we use the definition of square, this reduces to

                                                                                    + +

                                                                                    (+ (* 6 6) (* 10 10))
                                                                                    +

                                                                                    +which reduces by multiplication to

                                                                                    + +

                                                                                    (+ 36 100)
                                                                                    +

                                                                                    +and finally to

                                                                                    + +

                                                                                    136
                                                                                    +

                                                                                    +

                                                                                    + +The process we have just described is called the substitution +model for procedure application. It can be taken as a model that +determines the ``meaning'' of procedure application, insofar as the +procedures in this chapter are concerned. However, there are two +points that should be stressed:

                                                                                    + +

                                                                                      +
                                                                                    • The purpose of the substitution is to help us think about +procedure application, not to provide a description of how +the interpreter really works. Typical interpreters do not evaluate +procedure applications by manipulating the text of a procedure to +substitute values for the formal parameters. In practice, the +``substitution'' is accomplished by using a local environment for the +formal parameters. We will discuss this more fully in chapters 3 and +4 when we examine the implementation of an interpreter in detail.

                                                                                      + +

                                                                                    • Over the course of this book, we will present a sequence of +increasingly elaborate models of how interpreters work, culminating +with a complete implementation of an interpreter and compiler in +chapter 5. The substitution model is only the first of these +models -- a way to get started thinking formally about the evaluation +process. In general, when modeling phenomena in science and +engineering, we begin with simplified, incomplete models. As we +examine things in greater detail, these simple models become +inadequate and must be replaced by more refined models. The +substitution model is no exception. In particular, when we address in +chapter 3 the use of procedures with ``mutable data,'' we will see that +the substitution model breaks down and must be replaced by a more +complicated model of procedure application.15 +

                                                                                    + + +

                                                                                    Applicative order versus normal order

                                                                                    + +According to the description of evaluation given in +section 1.1.3, the interpreter first +evaluates the operator and operands and then applies the resulting procedure +to the resulting arguments. This is not the only way to perform +evaluation. An alternative evaluation model would not evaluate the +operands until their values were needed. Instead it would first substitute +operand expressions for parameters until +it obtained an expression involving only primitive operators, and +would then perform the evaluation. If we used this method, the +evaluation of

                                                                                    + +

                                                                                    (f 5)
                                                                                    +

                                                                                    +would proceed according to the sequence of expansions

                                                                                    + +

                                                                                    (sum-of-squares (+ 5 1) (* 5 2))
                                                                                    +
                                                                                    +(+    (square (+ 5 1))      (square (* 5 2))  )
                                                                                    +
                                                                                    +(+    (* (+ 5 1) (+ 5 1))   (* (* 5 2) (* 5 2)))
                                                                                    +

                                                                                    +followed by the reductions

                                                                                    + +

                                                                                    (+         (* 6 6)             (* 10 10))
                                                                                    +
                                                                                    +(+           36                   100)
                                                                                    +
                                                                                    +                    136
                                                                                    +

                                                                                    +This gives the same answer as our previous evaluation model, but the +process is different. In particular, the evaluations +of (+ 5 1) and (* 5 2) are each performed twice here, +corresponding to the reduction of the expression

                                                                                    + +

                                                                                    (* x x)
                                                                                    +

                                                                                    +with x replaced respectively by (+ 5 1) and (* 5 2).

                                                                                    + +This alternative ``fully expand and then reduce'' evaluation method is +known as normal-order evaluation, in contrast to the ``evaluate +the arguments and then apply'' method that the interpreter actually +uses, which is called applicative-order evaluation. It can be +shown that, for procedure applications that can be modeled using +substitution (including all the procedures in the first two chapters +of this book) and that yield legitimate values, normal-order and +applicative-order evaluation produce the same value. (See +exercise 1.5 for an instance of +an ``illegitimate'' value where normal-order and applicative-order +evaluation do not give the same result.)

                                                                                    + +Lisp uses applicative-order evaluation, partly because of the +additional efficiency obtained from avoiding multiple evaluations of +expressions such as those illustrated with (+ 5 1) and (* 5 +2) above and, more significantly, because normal-order evaluation +becomes much more complicated to deal with when we leave the realm of +procedures that can be modeled by substitution. On the other hand, +normal-order evaluation can be an extremely valuable tool, and we will +investigate some of its implications in chapters 3 and 4.16

                                                                                    + + +

                                                                                    1.1.6  Conditional Expressions and Predicates

                                                                                    + +

                                                                                    + +The expressive power of the class of procedures that we can define at +this point is very limited, because we have no way to make tests and +to perform different operations depending on the result of a test. +For instance, we cannot define a procedure that computes the absolute +value of a number by testing whether the number is positive, negative, +or zero and taking different actions in the different cases according +to the rule

                                                                                    + +

                                                                                    + +This construct is called a case analysis, and +there is a special form in Lisp for notating such a case +analysis. It is called cond (which stands for +``conditional''), and it is used as follows:

                                                                                    + +

                                                                                    (define (abs x)
                                                                                    +  (cond ((> x 0) x)
                                                                                    +        ((= x 0) 0)
                                                                                    +        ((< x 0) (- x))))
                                                                                    +

                                                                                    +The general form of a conditional expression is

                                                                                    + +

                                                                                    (cond (<p1> <e1>)
                                                                                    +      (<p2> <e2>)
                                                                                    +      
                                                                                    +      (<pn> <en>))
                                                                                    +

                                                                                    +consisting of the symbol cond followed by +parenthesized pairs of expressions (<p> <e>) +called clauses. The first expression in each pair is a predicate -- that is, an expression whose value is interpreted as +either true or false.17

                                                                                    + +Conditional expressions are evaluated as follows. The predicate +<p1> is evaluated first. If its value is false, then +<p2> is evaluated. If <p2>'s value is also false, then +<p3> is evaluated. This process continues until a predicate is +found whose value is true, in which case the interpreter returns the +value of the corresponding consequent expression <e> of the +clause as the value of the conditional expression. If none of the +<p>'s is found to be true, the value of the cond is +undefined.

                                                                                    + +The word predicate is used for procedures that return true +or false, as well as for expressions that evaluate to true or false. +The absolute-value procedure abs makes use of the primitive +predicates >, <, and =.18 These take two +numbers as arguments and test whether the first number is, +respectively, greater than, less than, or equal to the second number, +returning true or false accordingly.

                                                                                    + +Another way to write the absolute-value procedure is

                                                                                    + +

                                                                                    (define (abs x)
                                                                                    +  (cond ((< x 0) (- x))
                                                                                    +        (else x)))
                                                                                    +

                                                                                    +which could be expressed in English as ``If x is less than zero +return - x; otherwise return x.'' Else is a special symbol +that can be used in place of the <p> in the final clause of a cond. This causes the cond to return as its value the value of +the corresponding <e> whenever all previous clauses have been +bypassed. In fact, any expression that always evaluates to a true +value could be used as the <p> here.

                                                                                    + +Here is yet another way to write the absolute-value procedure:

                                                                                    + +

                                                                                    (define (abs x)
                                                                                    +  (if (< x 0)
                                                                                    +      (- x)
                                                                                    +      x))
                                                                                    +

                                                                                    +This uses the special form if, a restricted type of conditional +that can be used when there are precisely two cases in the case +analysis. The general form of an if expression is

                                                                                    + +

                                                                                    (if <predicate> <consequent> <alternative>)
                                                                                    +

                                                                                    +To evaluate an if expression, the interpreter starts by evaluating +the <predicate> part of the expression. If the <predicate> +evaluates to a true value, the interpreter then evaluates +the <consequent> and returns its value. Otherwise it evaluates +the <alternative> and returns its value.19

                                                                                    + +In addition to primitive +predicates such as <, =, and >, there are logical +composition operations, which enable us to construct compound +predicates. The three most frequently used are these:

                                                                                    + +

                                                                                      +
                                                                                    • (and <e1> ... <en>)

                                                                                      + +The interpreter +evaluates the expressions <e> one at a time, in left-to-right order. If +any <e> evaluates to false, the value of the and +expression is false, and the rest of the <e>'s are not evaluated. +If all <e>'s evaluate to true values, the value of the and +expression is the value of the last one.

                                                                                      + +

                                                                                    • (or <e1> ... <en>)

                                                                                      + +The interpreter +evaluates the expressions <e> one at a time, in left-to-right order. If +any <e> evaluates to a true value, that value is +returned as the value of the or expression, +and the rest of the <e>'s are not evaluated. +If all <e>'s evaluate to false, +the value of the or expression is false.

                                                                                      + +

                                                                                    • (not <e>)

                                                                                      + +The value of a not expression is true +when the expression <e> evaluates to false, and false otherwise. +

                                                                                    + +Notice that and and or are special forms, not procedures, +because the subexpressions are not necessarily all evaluated. +Not is an ordinary procedure.

                                                                                    + +As an example of how these are used, the condition that a number x +be in the range 5 < x < 10 may be expressed as

                                                                                    + +

                                                                                    (and (> x 5) (< x 10))
                                                                                    +

                                                                                    +As another example, we can define a predicate to test whether one +number is greater than or equal to another as

                                                                                    + +

                                                                                    (define (>= x y)
                                                                                    +  (or (> x y) (= x y)))
                                                                                    +

                                                                                    +or alternatively as

                                                                                    + +

                                                                                    (define (>= x y)
                                                                                    +  (not (< x y)))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 1.1.  Below is a sequence of expressions. +What is the result printed by the interpreter in response to each +expression? Assume that the sequence is to be evaluated in the order +in which it is presented.

                                                                                    + +

                                                                                    10
                                                                                    +(+ 5 3 4)
                                                                                    +(- 9 1)
                                                                                    +(/ 6 2)
                                                                                    +(+ (* 2 4) (- 4 6))
                                                                                    +(define a 3)
                                                                                    +(define b (+ a 1))
                                                                                    +(+ a b (* a b))
                                                                                    +(= a b)
                                                                                    +(if (and (> b a) (< b (* a b)))
                                                                                    +    b
                                                                                    +    a)
                                                                                    +(cond ((= a 4) 6)
                                                                                    +      ((= b 4) (+ 6 7 a))
                                                                                    +      (else 25))
                                                                                    +(+ 2 (if (> b a) b a))
                                                                                    +(* (cond ((> a b) a)
                                                                                    +         ((< a b) b)
                                                                                    +         (else -1))
                                                                                    +   (+ a 1))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 1.2.  Translate the following expression into prefix form +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 1.3.  Define a procedure that takes three numbers as arguments and returns +the sum of the squares of the two larger numbers. +

                                                                                    + +

                                                                                    +Exercise 1.4.  Observe that our model of evaluation allows for combinations whose +operators are compound expressions. Use this observation to +describe the behavior of the following procedure: +

                                                                                    (define (a-plus-abs-b a b)
                                                                                    +  ((if (> b 0) + -) a b))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 1.5.  Ben Bitdiddle has invented a test to determine whether the interpreter +he is faced with is using applicative-order evaluation or normal-order +evaluation. He defines the following two procedures: +

                                                                                    (define (p) (p))
                                                                                    +
                                                                                    +(define (test x y)
                                                                                    +  (if (= x 0)
                                                                                    +      0
                                                                                    +      y))
                                                                                    +

                                                                                    +Then he evaluates the expression +

                                                                                    (test 0 (p))
                                                                                    +

                                                                                    +What behavior will Ben observe with an interpreter that uses +applicative-order evaluation? What behavior will he observe with an +interpreter that uses normal-order evaluation? Explain your answer. +(Assume that the evaluation rule for the special form if is the +same whether the interpreter is using normal or applicative order: +The predicate expression is evaluated first, and the result +determines whether to evaluate +the consequent or the alternative expression.) + +

                                                                                    + + + +

                                                                                    1.1.7  Example: Square Roots by Newton's Method

                                                                                    + +

                                                                                    + +Procedures, as introduced above, are much like ordinary mathematical +functions. They specify a value that is determined by one or more +parameters. But there is an important difference between +mathematical functions and computer procedures. Procedures must be +effective.

                                                                                    + +As a case in point, consider the problem of computing square +roots. We can define the square-root function as +

                                                                                    + +This describes a perfectly legitimate mathematical function. We could +use it to recognize whether one number is the square root of another, or +to derive facts about square roots in general. On the other hand, the +definition does not describe a procedure. Indeed, it tells us almost +nothing about how to actually find the square root of a given number. It +will not help matters to rephrase this definition in pseudo-Lisp:

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (the y (and (>= y 0)
                                                                                    +              (= (square y) x))))
                                                                                    +

                                                                                    +This only begs the question.

                                                                                    + +The contrast between function and procedure is a reflection of the +general distinction between describing properties of things and +describing how to do things, or, as it is sometimes referred to, the +distinction between declarative knowledge and imperative knowledge. +In mathematics we are usually concerned with declarative (what is) +descriptions, whereas in computer science we are usually concerned +with imperative (how to) descriptions.20

                                                                                    + +How does one compute square roots? The most common way is to use +Newton's method of successive approximations, which says that whenever +we have a guess y for the value of the square root of a number x, +we can perform a simple manipulation to get a better guess (one closer +to the actual square root) by averaging y with +x/y.21 For example, we can compute +the square root of 2 as follows. Suppose our initial guess is 1:

                                                                                    + + + + + + + + + + +
                                                                                    Guess Quotient Average
                                                                                      
                                                                                    1 (2/1) = 2 +((2 + 1)/2) = 1.5
                                                                                      
                                                                                    1.5 (2/1.5) = 1.3333 +((1.3333 + 1.5)/2) = 1.4167
                                                                                      
                                                                                    1.4167 (2/1.4167) = 1.4118 +((1.4167 + 1.4118)/2) = 1.4142
                                                                                      
                                                                                    1.4142 ......

                                                                                    + +Continuing this process, we obtain better and better +approximations to the square root.

                                                                                    + +Now let's formalize the process in terms of procedures. We start with +a value for the radicand (the number whose square root we are trying +to compute) and a value for the guess. If the guess is good enough +for our purposes, we are done; if not, we must repeat the process with an +improved guess. We write this basic strategy as a procedure:

                                                                                    + +

                                                                                    (define (sqrt-iter guess x)
                                                                                    +  (if (good-enough? guess x)
                                                                                    +      guess
                                                                                    +      (sqrt-iter (improve guess x)
                                                                                    +                 x)))
                                                                                    +

                                                                                    +A guess is improved by averaging +it with the quotient of the radicand and the old guess:

                                                                                    + +

                                                                                    (define (improve guess x)
                                                                                    +  (average guess (/ x guess)))
                                                                                    +

                                                                                    +where

                                                                                    + +

                                                                                    (define (average x y)
                                                                                    +  (/ (+ x y) 2))
                                                                                    +

                                                                                    +We also have to say what we mean by ``good enough.'' The +following will do for illustration, but it is not really a very good +test. (See exercise 1.7.) +The idea is to improve the answer until it is close enough so that its +square differs from the radicand by less than a predetermined +tolerance (here 0.001):22

                                                                                    + +

                                                                                    (define (good-enough? guess x)
                                                                                    +  (< (abs (- (square guess) x)) 0.001))
                                                                                    +

                                                                                    +Finally, we need a way to get started. For instance, we can +always guess that the square root of any number is 1:23

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (sqrt-iter 1.0 x))
                                                                                    +

                                                                                    +If we type these definitions to the interpreter, we can use sqrt +just as we can use any procedure:

                                                                                    + +

                                                                                    (sqrt 9)
                                                                                    +3.00009155413138
                                                                                    +(sqrt (+ 100 37))
                                                                                    +11.704699917758145
                                                                                    +(sqrt (+ (sqrt 2) (sqrt 3)))
                                                                                    +1.7739279023207892
                                                                                    +(square (sqrt 1000))
                                                                                    +1000.000369924366
                                                                                    +

                                                                                    +

                                                                                    + +The sqrt program also illustrates that the simple procedural +language we have introduced so far is sufficient for writing any +purely numerical program that one could write in, say, C or +Pascal. This might seem surprising, since we have not included in +our language any iterative (looping) constructs that direct the +computer to do something over and over again. Sqrt-iter, on the +other hand, demonstrates how iteration can be accomplished using no +special construct other than the ordinary ability to call a +procedure.24 + +

                                                                                    +Exercise 1.6.  Alyssa P. Hacker doesn't see why if needs +to be provided as a special form. ``Why can't I just define it as an +ordinary procedure in terms of cond?'' she asks. +Alyssa's friend Eva Lu Ator claims this can indeed be done, and +she defines a new version of if:

                                                                                    + +

                                                                                    (define (new-if predicate then-clause else-clause)
                                                                                    +  (cond (predicate then-clause)
                                                                                    +        (else else-clause)))
                                                                                    +

                                                                                    +Eva demonstrates the program for Alyssa:

                                                                                    + +

                                                                                    (new-if (= 2 3) 0 5)
                                                                                    +5
                                                                                    +
                                                                                    +(new-if (= 1 1) 0 5)
                                                                                    +0
                                                                                    +

                                                                                    +Delighted, Alyssa uses new-if to rewrite the square-root +program:

                                                                                    + +

                                                                                    (define (sqrt-iter guess x)
                                                                                    +  (new-if (good-enough? guess x)
                                                                                    +          guess
                                                                                    +          (sqrt-iter (improve guess x)
                                                                                    +                     x)))
                                                                                    +

                                                                                    +What happens when Alyssa attempts to use this to compute square roots? +Explain. + +

                                                                                    + +

                                                                                    +Exercise 1.7.  The good-enough? test used in computing square roots will not be +very effective for finding the square roots of very small numbers. +Also, in real computers, arithmetic operations are almost always +performed with limited precision. This makes our test inadequate for +very large numbers. Explain these statements, with examples showing +how the test fails for small and large numbers. An alternative +strategy for implementing good-enough? is to watch how guess changes from one iteration to the next and to stop when the +change is a very small fraction of the guess. Design a square-root +procedure that uses this kind of end test. Does this work better for +small and large numbers? +

                                                                                    + +

                                                                                    +Exercise 1.8.  Newton's method for cube roots is based on the fact that if y is an +approximation to the cube root of x, then a better approximation is +given by the value +

                                                                                    +Use this formula to implement a cube-root procedure analogous to the +square-root procedure. (In section 1.3.4 we +will see how to implement Newton's method in general as an abstraction +of these square-root and cube-root procedures.) +

                                                                                    + + +

                                                                                    1.1.8  Procedures as Black-Box Abstractions

                                                                                    + +

                                                                                    + +Sqrt is our first example of a process defined by a set of +mutually defined procedures. Notice that the definition of sqrt-iter is recursive; that is, the procedure is defined in +terms of itself. The idea of being able to define a procedure in +terms of itself may be disturbing; it may seem unclear how such a +``circular'' definition could make sense at all, much less specify a +well-defined process to be carried out by a computer. This will be +addressed more carefully in +section 1.2. But first let's consider +some other important points illustrated by the sqrt example.

                                                                                    + +Observe that the problem of computing square roots breaks up naturally +into a number of subproblems: how to tell whether a guess is good +enough, how to improve a guess, and so on. Each of these tasks is +accomplished by a separate procedure. The entire sqrt program +can be viewed as a cluster of procedures (shown in +figure 1.2) that mirrors the decomposition of +the problem into subproblems.

                                                                                    + +

                                                                                    +
                                                                                    Figure 1.2:  Procedural decomposition of the sqrt program.
                                                                                    + +

                                                                                    + +The importance of this decomposition strategy is not simply that one +is dividing the program into parts. After all, we could take any +large program and divide it into parts -- the first ten lines, the next +ten lines, the next ten lines, and so on. Rather, it is crucial that +each procedure accomplishes an identifiable task that can be used as a +module in defining other procedures. For example, when we define the +good-enough? procedure in terms of square, we are able to +regard the square procedure as a ``black box.'' We are not at +that moment concerned with how the procedure computes its +result, only with the fact that it computes the square. The details +of how the square is computed can be suppressed, to be considered at a +later time. Indeed, as far as the good-enough? procedure is +concerned, square is not quite a procedure but rather an +abstraction of a procedure, a so-called procedural abstraction. +At this level of abstraction, any procedure that computes the square +is equally good.

                                                                                    + +Thus, considering only the values they return, the following two procedures for +squaring a number should be indistinguishable. Each takes a numerical +argument and produces the square of that number as the +value.25

                                                                                    + +

                                                                                    (define (square x) (* x x))
                                                                                    +
                                                                                    +(define (square x) 
                                                                                    +  (exp (double (log x))))
                                                                                    +
                                                                                    +(define (double x) (+ x x))
                                                                                    +

                                                                                    + +So a procedure definition should be able to suppress detail. The +users of the procedure may not have written the procedure themselves, +but may have obtained it from another programmer as a black box. A +user should not need to know how the procedure is implemented in order +to use it.

                                                                                    + + +

                                                                                    Local names

                                                                                    + + +One detail of a procedure's implementation that should not matter to +the user of the procedure is the implementer's choice of names for the +procedure's formal parameters. Thus, the following procedures should +not be distinguishable:

                                                                                    + +

                                                                                    (define (square x) (* x x))
                                                                                    +
                                                                                    +(define (square y) (* y y))
                                                                                    +

                                                                                    +This principle -- that the meaning of a procedure should be independent +of the parameter names used by its author -- seems on the surface to be +self-evident, but its consequences are profound. The simplest +consequence is that the parameter names of a procedure must be local +to the body of the procedure. For example, we used square in +the definition of good-enough? in our square-root procedure:

                                                                                    + +

                                                                                    (define (good-enough? guess x)
                                                                                    +  (< (abs (- (square guess) x)) 0.001))
                                                                                    +

                                                                                    +The intention of the author of good-enough? is to determine if +the square of the first argument is within a given tolerance of the +second argument. We see that the author of good-enough? used +the name guess to refer to the first argument and x to +refer to the second argument. The argument of square is guess. If the author of square used x (as above) +to refer to that argument, we see that the x in good-enough? must be a different x than the one in square. Running the procedure square must not affect the value +of x that is used by good-enough?, because that value of +x may be needed by good-enough? after square is done +computing.

                                                                                    + +If the parameters were not local to the bodies of their respective +procedures, then the parameter x in square could be +confused with the parameter x in good-enough?, and the +behavior of good-enough? would depend upon which version of +square we used. Thus, square would not be the black box +we desired.

                                                                                    + +A formal parameter of a procedure has a very special role in the +procedure definition, in that it doesn't matter what name the formal +parameter has. Such a name is called a bound variable, and we +say that the procedure definition binds its formal parameters. +The meaning of a procedure definition is unchanged if a bound variable +is consistently renamed throughout the definition.26 If a variable is not bound, we say that it is free. The +set of expressions for which a binding defines a name is called the +scope of that name. +In a procedure definition, the bound variables +declared as the formal parameters of the procedure have the body of +the procedure as their scope.

                                                                                    + +In the definition of good-enough? above, guess and x are +bound variables but <, -, abs, and square are free. +The meaning of good-enough? should be independent of the names we +choose for guess and x so long as they are distinct and +different from <, -, abs, and square. (If we renamed +guess to abs we would have introduced a bug by capturing +the variable abs. It would have changed from free to bound.) The +meaning of good-enough? is not independent of the names of its +free variables, however. It surely depends upon the fact (external to +this definition) that the symbol abs names a procedure for +computing the absolute value of a number. Good-enough? will +compute a different function if we substitute cos for abs in +its definition.

                                                                                    + + +

                                                                                    Internal definitions and block structure

                                                                                    + +

                                                                                    + +We have one kind of name isolation available to us so far: The formal +parameters of a procedure are local to the body of the procedure. The +square-root program illustrates another way in which we would like to +control the use of names. The existing program consists of +separate procedures:

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (sqrt-iter 1.0 x))
                                                                                    +(define (sqrt-iter guess x)
                                                                                    +  (if (good-enough? guess x)
                                                                                    +      guess
                                                                                    +      (sqrt-iter (improve guess x) x)))
                                                                                    +(define (good-enough? guess x)
                                                                                    +  (< (abs (- (square guess) x)) 0.001))
                                                                                    +(define (improve guess x)
                                                                                    +  (average guess (/ x guess)))
                                                                                    +

                                                                                    + +The problem with this program is that the only procedure that is +important to users of sqrt is sqrt. The other +procedures (sqrt-iter, good-enough?, and improve) +only clutter up their minds. They may not define any other procedure +called good-enough? as part of another program to work together +with the square-root program, because sqrt needs it. The +problem is especially severe in the construction of large systems by +many separate programmers. For example, in the construction of a +large library of numerical procedures, many numerical functions are +computed as successive approximations and thus might have procedures +named good-enough? and improve as auxiliary procedures. +We would like to localize the subprocedures, hiding them inside sqrt so that sqrt could coexist with other successive +approximations, each having its own private +good-enough? procedure. To make this possible, we allow a +procedure to have +internal definitions that are local to that procedure. For example, +in the square-root problem we can write

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (define (good-enough? guess x)
                                                                                    +    (< (abs (- (square guess) x)) 0.001))
                                                                                    +  (define (improve guess x)
                                                                                    +    (average guess (/ x guess)))
                                                                                    +  (define (sqrt-iter guess x)
                                                                                    +    (if (good-enough? guess x)
                                                                                    +        guess
                                                                                    +        (sqrt-iter (improve guess x) x)))
                                                                                    +  (sqrt-iter 1.0 x))
                                                                                    +

                                                                                    + +Such nesting of definitions, called block structure, +is basically the right solution to the simplest +name-packaging problem. But there is a better idea lurking here. In +addition to internalizing the definitions of the auxiliary procedures, +we can simplify them. Since x is bound in the definition of +sqrt, the procedures good-enough?, improve, and +sqrt-iter, which are defined internally to sqrt, are in the +scope of x. Thus, it is not necessary to pass x explicitly to +each of these procedures. Instead, we allow x to be a free +variable in the internal definitions, as shown below. Then x +gets its value from the argument with which the enclosing +procedure sqrt is called. This discipline is called lexical +scoping.27

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (define (good-enough? guess)
                                                                                    +    (< (abs (- (square guess) x)) 0.001))
                                                                                    +  (define (improve guess)
                                                                                    +    (average guess (/ x guess)))
                                                                                    +  (define (sqrt-iter guess)
                                                                                    +    (if (good-enough? guess)
                                                                                    +        guess
                                                                                    +        (sqrt-iter (improve guess))))
                                                                                    +  (sqrt-iter 1.0))
                                                                                    +

                                                                                    + +We will use block structure extensively to help us break +up large programs into tractable pieces.28 +The idea of block structure originated with the +programming language Algol 60. It appears in most advanced +programming languages and is an important tool for helping to organize +the construction of large programs.

                                                                                    + +


                                                                                    +

                                                                                    4 The +characterization of numbers as ``simple data'' is a barefaced bluff. +In fact, the treatment of numbers is one of the trickiest and most +confusing aspects of any programming language. Some typical issues +involved are these: +Some computer systems distinguish integers, such as 2, from +real numbers, such as 2.71. Is the real number 2.00 different +from the integer 2? +Are the arithmetic operations used +for integers the same as the operations used for real numbers? Does 6 +divided by 2 produce 3, or 3.0? How large a number can we represent? +How many decimal places of accuracy can we represent? Is the range of +integers the same as the range of real numbers? Above and beyond +these questions, of course, lies a collection of issues concerning +roundoff and truncation errors -- the entire science of numerical +analysis. Since our focus in this book is on large-scale program +design rather than on numerical techniques, we are going to ignore +these problems. The numerical examples in this chapter will exhibit +the usual roundoff behavior that one observes when using arithmetic +operations that preserve a limited number of decimal places of +accuracy in noninteger operations. + +

                                                                                    5 Throughout this book, +when we wish to emphasize the distinction between the input typed by +the user and the response printed by the interpreter, we will show the +latter in slanted characters. + +

                                                                                    6 Lisp systems typically provide +features to aid the user in formatting expressions. Two especially +useful features are one that automatically indents to the proper +pretty-print position whenever a new line is started and one that +highlights the matching left parenthesis whenever a right parenthesis +is typed. + +

                                                                                    7 Lisp obeys the convention that every +expression has a value. This convention, together with the old +reputation of Lisp as an inefficient language, is the source of the +quip by Alan Perlis (paraphrasing Oscar Wilde) +that ``Lisp programmers know the value of +everything but the cost of nothing.'' + +

                                                                                    8 In this book, we do not show the interpreter's response to +evaluating definitions, since this is highly +implementation-dependent. + +

                                                                                    9 Chapter 3 will show that this notion of +environment is crucial, both for understanding how the interpreter +works and for implementing interpreters. + +

                                                                                    10 It may seem strange that the evaluation rule says, as +part of the first step, that we should evaluate the leftmost element +of a combination, since at this point that can only be an operator +such as + or * +representing a built-in primitive procedure such as addition or +multiplication. We will see later that it is useful to be able to work with +combinations whose operators are themselves compound expressions. + +

                                                                                    11 Special syntactic forms that are simply convenient +alternative surface structures for things that can be written in more +uniform ways are sometimes called syntactic sugar, to use a +phrase coined by Peter Landin. In comparison with users of other +languages, Lisp programmers, as a rule, are less concerned with +matters of syntax. (By contrast, examine any Pascal manual and notice +how much of it is devoted to descriptions of syntax.) This disdain +for syntax is due partly to the flexibility of Lisp, which makes it +easy to change surface syntax, and partly to the observation that many +``convenient'' syntactic constructs, which make the language less +uniform, end up causing more trouble than they are worth when programs +become large and complex. In the words of Alan Perlis, ``Syntactic +sugar causes cancer of the semicolon.'' + +

                                                                                    12 Observe that there are two different operations +being combined here: we are creating the procedure, and we are giving +it the name square. It is possible, indeed important, to be +able to separate these two notions -- to create procedures without +naming them, and to give names to procedures that have already been +created. We will see how to do this in section 1.3.2. + +

                                                                                    13 Throughout this book, we will +describe the general syntax of expressions by using italic symbols +delimited by angle brackets -- e.g., <name> -- to denote the +``slots'' in the expression to be filled in when such an expression is +actually used. + +

                                                                                    14 More +generally, the body of the procedure can be a sequence of expressions. +In this case, the interpreter evaluates each expression in the +sequence in turn and returns the value of the final expression as the +value of the procedure application. + +

                                                                                    15 Despite the +simplicity of the substitution idea, it turns out to be surprisingly +complicated to give a rigorous mathematical definition of the +substitution process. The problem arises from the possibility of +confusion between the names used for the formal parameters of a +procedure and the (possibly identical) names used in the expressions +to which the procedure may be applied. Indeed, there is a long +history of erroneous definitions of substitution in the +literature of logic and programming semantics. See Stoy 1977 for a +careful discussion of substitution. + +

                                                                                    16 In +chapter 3 we will introduce stream processing, which is a way of +handling apparently ``infinite'' data structures by incorporating a +limited form of normal-order evaluation. In +section 4.2 we will modify the Scheme +interpreter to produce a normal-order variant of Scheme. + +

                                                                                    17 ``Interpreted as either true or false'' +means this: In Scheme, there are two distinguished values that are +denoted by the constants #t and #f. When the interpreter +checks a predicate's value, it interprets #f as false. Any other value +is treated as true. (Thus, providing #t is logically +unnecessary, but it is convenient.) In this book we will use +names true and false, which are associated +with the values #t and #f respectively. + +

                                                                                    18 Abs also uses +the ``minus'' operator -, which, when used with a single +operand, as in (- x), indicates negation. + +

                                                                                    19 A minor difference +between if and cond is that the +<e> part of each cond clause may be a sequence of expressions. +If the corresponding <p> is found to be true, the expressions +<e> are evaluated in sequence and the value of the final +expression in the sequence is returned as the value of the cond. +In an if expression, however, the <consequent> and +<alternative> must be single expressions. + +

                                                                                    20 Declarative and +imperative descriptions are intimately related, as indeed are +mathematics and computer science. For instance, to say that the +answer produced by a program is ``correct'' is to make a declarative +statement about the program. There is a large amount of research +aimed at establishing techniques for proving that programs are +correct, and much of the technical difficulty of this subject has to +do with negotiating the transition between imperative statements (from +which programs are constructed) and declarative statements (which can +be used to deduce things). In a related vein, an important current +area in programming-language design is the exploration of so-called +very high-level languages, in which one actually programs in terms of +declarative statements. The idea is to make interpreters +sophisticated enough so that, given ``what is'' knowledge specified by +the programmer, they can generate ``how to'' knowledge automatically. +This cannot be done in general, but there are important areas where +progress has been made. We shall revisit this idea in chapter 4. + +

                                                                                    21 This square-root algorithm is actually a special case +of Newton's method, which is a general technique for finding roots of +equations. The square-root algorithm itself was developed by Heron of +Alexandria in the first century A.D. We will see how to express +the general Newton's method as a Lisp procedure in +section 1.3.4. + +

                                                                                    22 We will usually give +predicates names ending with question marks, to help us +remember that they are predicates. This +is just a stylistic convention. As far as the interpreter is +concerned, the question mark is just an ordinary character. + +

                                                                                    23 Observe that we express our initial guess as 1.0 rather than +1. This would not make any difference in many Lisp implementations. +MIT Scheme, however, distinguishes between exact integers and decimal +values, and dividing two integers produces a rational number rather +than a decimal. For example, dividing 10 by 6 yields 5/3, while +dividing 10.0 by 6.0 yields 1.6666666666666667. (We will learn how to +implement arithmetic on rational numbers in +section 2.1.1.) If we start with an initial guess of 1 +in our square-root program, and x is an exact integer, all +subsequent values produced in the square-root computation will be +rational numbers rather than decimals. Mixed operations on rational +numbers and decimals always yield decimals, so starting with an +initial guess of 1.0 forces all subsequent values to be decimals. + +

                                                                                    24 Readers who are worried about the efficiency +issues involved in using procedure calls to implement iteration should +note the remarks on ``tail recursion'' in +section 1.2.1. + +

                                                                                    25 It is not even clear which of these procedures is a +more efficient implementation. This depends upon the hardware +available. There are machines for which the ``obvious'' +implementation is the less efficient one. Consider a machine that has +extensive tables of logarithms and antilogarithms stored in a very +efficient manner. + +

                                                                                    26 The +concept of consistent renaming is actually subtle and difficult to +define formally. Famous logicians have made embarrassing errors +here. + +

                                                                                    27 Lexical +scoping dictates that free variables in a procedure are taken to refer to +bindings made by enclosing procedure definitions; +that is, they are looked up in +the environment in which the procedure was defined. We will see how +this works in detail in chapter 3 when we study environments and the +detailed behavior of the interpreter. + +

                                                                                    28 Embedded definitions +must come first in a procedure body. The management is not responsible +for the consequences of running programs that intertwine definition +and use. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-11.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-11.html new file mode 100644 index 00000000..3e661044 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-11.html @@ -0,0 +1,1324 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    1.2  Procedures and the Processes They Generate

                                                                                    + +

                                                                                    + + +We have now considered the elements of programming: We have used +primitive arithmetic operations, we have combined these operations, and +we have abstracted these composite operations by defining them as compound +procedures. But that is not enough to enable us to say that we know +how to program. Our situation is analogous to that of someone who has +learned the rules for how the pieces move in chess but knows nothing +of typical openings, tactics, or strategy. Like the novice chess +player, we don't yet know the common patterns of usage in the domain. +We lack the knowledge of which moves are worth making (which +procedures are worth defining). We lack the experience to predict the +consequences of making a move (executing a procedure).

                                                                                    + +The ability to visualize the consequences of the actions under +consideration is crucial to becoming an expert programmer, just as it +is in any synthetic, creative activity. In becoming an expert +photographer, for example, one must learn how to look at a scene and +know how dark each region will appear on a print for each possible +choice of exposure and development conditions. Only then can one +reason backward, planning framing, lighting, exposure, and development +to obtain the desired effects. So it is with programming, where we +are planning the course of action to be taken by a process and where +we control the process by means of a program. To become experts, we +must learn to visualize the processes generated by various types of +procedures. Only after we have developed such a skill can we learn +to reliably construct programs that exhibit the desired behavior.

                                                                                    + +A procedure is a pattern for the local evolution of a +computational process. It specifies how each stage of the process is +built upon the previous stage. We would like to be able to make +statements about the overall, or global, behavior of a +process whose local evolution has been specified by a procedure. This +is very difficult to do in general, but we can at least try to +describe some typical patterns of process evolution.

                                                                                    + +In this section we will examine some common ``shapes'' for processes +generated by simple procedures. We will also investigate the +rates at which these processes consume the important computational +resources of time and space. The procedures we will consider +are very simple. Their role is like that played by test patterns in +photography: as oversimplified prototypical patterns, rather than +practical examples in their own right.

                                                                                    + + +

                                                                                    1.2.1  Linear Recursion and Iteration

                                                                                    + + + +

                                                                                    +
                                                                                    Figure 1.3:  A linear recursive process for computing 6!.
                                                                                    + +

                                                                                    + +We begin by considering the factorial function, defined by

                                                                                    + +

                                                                                    + +There are many ways to compute factorials. One way is to make use of +the observation that n! is equal to n times (n - 1)! for +any positive integer n:

                                                                                    + +

                                                                                    + +Thus, we can compute n! by computing (n - 1)! and multiplying the +result by n. If we add the stipulation that 1! is equal to 1, +this observation translates directly into a procedure:

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* n (factorial (- n 1)))))
                                                                                    +

                                                                                    +We can use the substitution model of +section 1.1.5 to watch this procedure in action +computing 6!, as shown in figure 1.3.

                                                                                    + + +Now let's take a different perspective on computing factorials. We +could describe a rule for computing n! by specifying that we +first multiply 1 by 2, then multiply the result by 3, then by 4, +and so on until we reach n. +More formally, we maintain a running product, together with a counter +that counts from 1 up to n. We can describe the computation by +saying that the counter and the product simultaneously change from one +step to the next according to the rule

                                                                                    + +

                                                                                    product counter · product

                                                                                    + +

                                                                                    counter counter + 1

                                                                                    + +

                                                                                    + +and stipulating that n! is the value of the product when +the counter exceeds n.

                                                                                    + +

                                                                                    +
                                                                                    Figure 1.4:  A linear iterative process for computing 6!.
                                                                                    + +

                                                                                    + +Once again, we can recast our description as a procedure for computing +factorials:29

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (fact-iter 1 1 n))
                                                                                    +
                                                                                    +(define (fact-iter product counter max-count)
                                                                                    +  (if (> counter max-count)
                                                                                    +      product
                                                                                    +      (fact-iter (* counter product)
                                                                                    +                 (+ counter 1)
                                                                                    +                 max-count)))
                                                                                    +

                                                                                    + + +As before, we can use the substitution model to visualize the process +of computing 6!, as shown in figure 1.4.

                                                                                    + +Compare the two processes. From one point of view, they seem hardly +different at all. Both compute the same mathematical function on the +same domain, and each requires a number of steps proportional to n +to compute n!. Indeed, both processes even carry out the same +sequence of multiplications, obtaining the same sequence of partial +products. On the other hand, when we consider the ``shapes'' of the +two processes, we find that they evolve quite differently.

                                                                                    + +Consider the first process. The substitution model reveals a shape of +expansion followed by contraction, indicated by the arrow in +figure 1.3. The expansion occurs as the +process builds up a chain of deferred operations (in this case, +a chain of multiplications). The contraction occurs as +the operations are +actually performed. This type of process, characterized by a chain of +deferred operations, is called a recursive process. Carrying +out this process requires that the interpreter keep track of the +operations to be performed later on. In the computation of n!, +the length of the chain of deferred multiplications, and hence the amount +of information needed to keep track of it, grows linearly with n +(is proportional to n), just like the number of steps. +Such a process is called a linear recursive process.

                                                                                    + +By contrast, the second process does not grow and shrink. At each +step, all we need to keep track of, for any n, are the current +values of the variables product, counter, and max-count. We call this an iterative process. In general, an +iterative process is one whose state can be summarized by a fixed +number of state variables, together with a fixed rule that +describes how the state variables should be updated as the process +moves from state to state and an (optional) end test that specifies +conditions under which the process should terminate. In computing +n!, the number of steps required grows linearly with n. Such a process is +called a linear iterative process.

                                                                                    + +The contrast between the two processes can be seen in another way. In +the iterative case, the program variables provide a complete +description of the state of the process at any point. If we stopped +the computation between steps, all we would need to do to resume the +computation is to supply the interpreter with the values of the three +program variables. Not so with the recursive process. In this case +there is some additional ``hidden'' information, maintained by the +interpreter and not contained in the program variables, which +indicates ``where the process is'' in negotiating the chain of +deferred operations. The longer the chain, the more information must +be maintained.30

                                                                                    + +In contrasting iteration and recursion, we must be careful not to +confuse the notion of a recursive process with the notion of a +recursive procedure. When we describe a procedure as recursive, +we are referring to the syntactic fact that the procedure definition +refers (either directly or indirectly) to the procedure itself. But +when we describe a process as following a pattern that is, say, +linearly recursive, we are speaking about how the process evolves, not +about the syntax of how a procedure is written. It may seem +disturbing that we refer to a recursive procedure such as fact-iter as generating an iterative process. However, the process +really is iterative: Its state is captured completely by its three +state variables, and an interpreter need keep track of only three +variables in order to execute the process.

                                                                                    + +One reason that the distinction between process and procedure may be +confusing is that most implementations of common languages (including +Ada, Pascal, and C) are designed in such a way that the +interpretation of any recursive procedure consumes an amount of memory +that grows with the number of procedure calls, even when the process +described is, in principle, iterative. As a consequence, these +languages can describe iterative processes only by resorting to +special-purpose ``looping constructs'' such as do, repeat, +until, for, and while. The implementation of Scheme +we shall consider in chapter 5 does not share this defect. It will +execute an iterative process in constant space, even if the iterative +process is described by a recursive procedure. An implementation with +this property is called tail-recursive. With a tail-recursive +implementation, iteration can be expressed using the ordinary +procedure call mechanism, so that special iteration constructs are +useful only as syntactic sugar.31

                                                                                    + +

                                                                                    +Exercise 1.9.  Each of the following two procedures defines a method for adding two +positive integers in terms of the procedures inc, +which increments its argument by 1, and dec, which decrements +its argument by 1.

                                                                                    + +

                                                                                    (define (+ a b)
                                                                                    +  (if (= a 0)
                                                                                    +      b
                                                                                    +      (inc (+ (dec a) b))))
                                                                                    +
                                                                                    +(define (+ a b)
                                                                                    +  (if (= a 0)
                                                                                    +      b
                                                                                    +      (+ (dec a) (inc b))))
                                                                                    +

                                                                                    +Using the substitution model, illustrate the process generated by each +procedure in evaluating (+ 4 5). Are these processes +iterative or recursive? +

                                                                                    + +

                                                                                    +Exercise 1.10.  The following procedure computes a mathematical function called +Ackermann's function.

                                                                                    + +

                                                                                    (define (A x y)
                                                                                    +  (cond ((= y 0) 0)
                                                                                    +        ((= x 0) (* 2 y))
                                                                                    +        ((= y 1) 2)
                                                                                    +        (else (A (- x 1)
                                                                                    +                 (A x (- y 1))))))
                                                                                    +

                                                                                    +What are the values of the following expressions?

                                                                                    + +

                                                                                    (A 1 10)
                                                                                    +
                                                                                    +(A 2 4)
                                                                                    +
                                                                                    +(A 3 3)
                                                                                    +

                                                                                    +Consider the following procedures, where A is the procedure +defined above: +

                                                                                    (define (f n) (A 0 n))
                                                                                    +
                                                                                    +(define (g n) (A 1 n))
                                                                                    +
                                                                                    +(define (h n) (A 2 n))
                                                                                    +
                                                                                    +(define (k n) (* 5 n n))
                                                                                    +

                                                                                    +Give concise mathematical definitions for the functions computed by +the procedures f, g, and h for positive integer +values of n. For example, (k n) computes 5n2. +

                                                                                    + + +

                                                                                    1.2.2  Tree Recursion

                                                                                    + + + +Another common pattern of computation is called tree recursion. +As an example, consider computing the sequence of Fibonacci numbers, +in which each number is the sum of the preceding two:

                                                                                    + +

                                                                                    + +In general, the Fibonacci numbers can be defined by the rule +

                                                                                    +We can immediately translate this definition into a recursive +procedure for computing Fibonacci numbers:

                                                                                    + +

                                                                                    (define (fib n)
                                                                                    +  (cond ((= n 0) 0)
                                                                                    +        ((= n 1) 1)
                                                                                    +        (else (+ (fib (- n 1))
                                                                                    +                 (fib (- n 2))))))
                                                                                    +

                                                                                    + +

                                                                                    +
                                                                                    Figure 1.5:  The tree-recursive process generated in computing (fib 5).
                                                                                    + +

                                                                                    + +Consider the pattern of this computation. To compute (fib 5), +we compute (fib 4) and (fib 3). To compute (fib 4), +we compute (fib 3) and (fib 2). In general, the evolved +process looks like a tree, as shown in figure 1.5. +Notice that the branches split into two at each level (except at the +bottom); this reflects the fact that the fib procedure calls +itself twice each time it is invoked.

                                                                                    + + +This procedure is instructive as a prototypical tree recursion, but it +is a terrible way to compute Fibonacci numbers because it does so much +redundant computation. Notice in figure 1.5 that +the entire computation of (fib 3) -- almost half the work -- is +duplicated. In fact, it is not hard to show that the number of times +the procedure will compute (fib 1) or (fib 0) (the number +of leaves in the above tree, in general) is precisely +Fib(n + 1). To get an idea of how bad this is, one can show that the +value of Fib(n) grows exponentially with n. More precisely +(see exercise 1.13), Fib(n) is the closest +integer to n /5, where

                                                                                    + +

                                                                                    +is the golden ratio, which satisfies the equation

                                                                                    + +

                                                                                    + +Thus, the process uses a number of steps that grows exponentially +with the input. On the other hand, the space required grows only +linearly with the input, because we need keep track only of which +nodes are above us in the tree at any point in the computation. In +general, the number of steps required by a tree-recursive process will be +proportional to the number of nodes in the tree, while the space +required will be proportional to the maximum depth of the tree.

                                                                                    + +We can also formulate an iterative process for computing the +Fibonacci numbers. The idea is to use a pair of integers a and +b, initialized to Fib(1) = 1 and Fib(0) = 0, +and to repeatedly apply the simultaneous +transformations +

                                                                                    +It is not hard to show that, after applying this transformation n +times, a and b will be equal, respectively, to Fib(n + 1) and + Fib(n). Thus, we can compute Fibonacci numbers iteratively using +the procedure

                                                                                    + +

                                                                                    (define (fib n)
                                                                                    +  (fib-iter 1 0 n))
                                                                                    +
                                                                                    +(define (fib-iter a b count)
                                                                                    +  (if (= count 0)
                                                                                    +      b
                                                                                    +      (fib-iter (+ a b) a (- count 1))))
                                                                                    +

                                                                                    +This second method for computing Fib(n) is a linear iteration. The +difference in number of steps required by the two methods -- one linear in n, +one growing as fast as Fib(n) itself -- is enormous, even for +small inputs.

                                                                                    + +One should not conclude from this that tree-recursive processes are +useless. When we consider processes that operate on hierarchically +structured data rather than numbers, we will find that tree recursion +is a natural and powerful tool.32 But even in numerical operations, +tree-recursive processes can be useful in helping us to understand and +design programs. For instance, although the first fib procedure +is much less efficient than the second one, it is more +straightforward, being little more than a translation into Lisp of the +definition of the Fibonacci sequence. To formulate the iterative +algorithm required noticing that the computation could be recast as an +iteration with three state variables.

                                                                                    + + +

                                                                                    Example: Counting change

                                                                                    + + +It takes only a bit of cleverness to come up with the iterative +Fibonacci algorithm. In contrast, consider the +following problem: How many different ways can we make change of $ 1.00, +given half-dollars, quarters, dimes, nickels, and pennies? More +generally, can we write a procedure to compute the number of ways to +change any given amount of money?

                                                                                    + +This problem has a simple solution as a recursive procedure. Suppose +we think of the types of coins available as arranged in some order. +Then the following relation holds:

                                                                                    + +

                                                                                    The number of ways to change amount a using n kinds of coins equals

                                                                                    + +

                                                                                      +
                                                                                    • the number of ways to change amount a using all but the first +kind of coin, plus

                                                                                      + +

                                                                                    • the number of ways to change amount a - d using all n kinds of +coins, where d is the denomination of the first kind of coin. +

                                                                                    + +To see why this is true, observe that the ways to make change can be +divided into two groups: those that do not use any of the first kind +of coin, and those that do. Therefore, the total number of ways to +make change for some amount is equal to the number of ways to make +change for the amount without using any of the first kind of coin, +plus the number of ways to make change assuming that we do use the +first kind of coin. But the latter number is equal to the number of +ways to make change for the amount that remains after using a coin of +the first kind.

                                                                                    + +Thus, we can recursively reduce the problem of changing a given amount +to the problem of changing smaller amounts using fewer kinds of coins. +Consider this reduction rule carefully, and convince yourself that we +can use it to describe an algorithm if we specify the following +degenerate cases:33

                                                                                    + +

                                                                                      +
                                                                                    • If a is exactly 0, we should count that as 1 way to make change.

                                                                                      + +

                                                                                    • If a is less than 0, we should count that as 0 ways to make change.

                                                                                      + +

                                                                                    • If n is 0, we should count that as 0 ways to make change. +

                                                                                    + +We can easily translate this description into a recursive +procedure:

                                                                                    + +

                                                                                    (define (count-change amount)
                                                                                    +  (cc amount 5))
                                                                                    +(define (cc amount kinds-of-coins)
                                                                                    +  (cond ((= amount 0) 1)
                                                                                    +        ((or (< amount 0) (= kinds-of-coins 0)) 0)
                                                                                    +        (else (+ (cc amount
                                                                                    +                     (- kinds-of-coins 1))
                                                                                    +                 (cc (- amount
                                                                                    +                        (first-denomination kinds-of-coins))
                                                                                    +                     kinds-of-coins)))))
                                                                                    +(define (first-denomination kinds-of-coins)
                                                                                    +  (cond ((= kinds-of-coins 1) 1)
                                                                                    +        ((= kinds-of-coins 2) 5)
                                                                                    +        ((= kinds-of-coins 3) 10)
                                                                                    +        ((= kinds-of-coins 4) 25)
                                                                                    +        ((= kinds-of-coins 5) 50)))
                                                                                    +

                                                                                    +(The first-denomination procedure takes as input the number of +kinds of coins available and returns the denomination of the first +kind. Here we are thinking of the coins as arranged in order from +largest to smallest, but any order would do as well.) We can now +answer our original question about changing a dollar:

                                                                                    + +

                                                                                    (count-change 100)
                                                                                    +292
                                                                                    +

                                                                                    + +Count-change generates a tree-recursive process with +redundancies similar to those in our first implementation of fib. (It will take quite a while for that 292 to be computed.) On +the other hand, it is not obvious how to design a better algorithm +for computing the result, and we leave this problem as a challenge. +The observation that a tree-recursive process may be highly +inefficient but often easy to specify and understand has led people to +propose that one could get the best of both worlds by designing a +``smart compiler'' that could transform tree-recursive procedures into +more efficient procedures that compute the same result.34

                                                                                    + +

                                                                                    +Exercise 1.11.  A function f is defined by the rule that f(n) = n if n<3 and +f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3) if n> 3. Write a procedure that +computes f by means of a recursive process. Write a procedure that +computes f by means of an iterative process. +

                                                                                    + +

                                                                                    +Exercise 1.12.  The following pattern of numbers is called +Pascal's triangle.

                                                                                    + +

                                                                                    +The numbers at the edge of the triangle are all 1, and +each number inside the triangle is the sum of the two numbers above it.35 +Write a procedure that computes elements of Pascal's triangle by means +of a recursive process. +

                                                                                    + +

                                                                                    +Exercise 1.13.  Prove that Fib(n) is the closest integer to n/5, +where = (1 + 5)/2. Hint: Let = (1 - 5)/2. Use +induction and the definition of the Fibonacci numbers (see +section 1.2.2) to prove that Fib(n) = (n + - n)/5. + +

                                                                                    + + +

                                                                                    1.2.3  Orders of Growth

                                                                                    + + + +The previous examples illustrate that processes can differ +considerably in the rates at which they consume computational +resources. One convenient way to describe this difference is to use +the notion of order of growth to obtain a gross measure of the +resources required by a process as the inputs become larger.

                                                                                    + + +Let n be a parameter that measures the size of the problem, and let +R(n) be the amount of resources the process requires for a problem +of size n. In our previous examples we took n to be the number +for which a given function is to be computed, but there are other +possibilities. For instance, if our goal is to compute an +approximation to the square root of a number, we might take n to be +the number of digits accuracy required. For matrix multiplication we +might take n to be the number of rows in the matrices. In general +there are a number of properties of the problem with respect to which +it will be desirable to analyze a given process. Similarly, R(n) +might measure the number of internal storage registers used, the +number of elementary machine operations performed, and so on. In +computers that do only a fixed number of operations at a time, the +time required will be proportional to the number of elementary machine +operations performed.

                                                                                    + +We say that R(n) has order of growth (f(n)), written +R(n) = (f(n)) (pronounced ``theta of f(n)''), if there are +positive constants k1 and k2 independent of n such that +

                                                                                    +for any sufficiently large value of n. (In other +words, for large n, the value R(n) is sandwiched between k1f(n) +and k2f(n).)

                                                                                    + +For instance, with the linear recursive process for computing +factorial described in section 1.2.1 the +number of steps grows proportionally to the input n. Thus, the +steps required for this process grows as (n). We also saw +that the space required grows as (n). For the iterative +factorial, the number of steps is still (n) but the space is +(1) -- that is, constant.36 The tree-recursive Fibonacci computation requires +(n) steps and space (n), where is the +golden ratio described in section 1.2.2.

                                                                                    + + +Orders of growth provide only a crude description of the behavior of a +process. For example, a process requiring n2 steps and a process +requiring 1000n2 steps and a process requiring 3n2 + 10n + 17 steps +all have (n2) order of growth. On the other hand, order of +growth provides a useful indication of how we may expect the behavior +of the process to change as we change the size of the problem. For a +(n) (linear) process, doubling the size will roughly double the amount +of resources used. For an exponential process, each increment in +problem size will multiply the resource utilization by a constant +factor. In the remainder of section 1.2 +we will examine two +algorithms whose order of growth is logarithmic, so that doubling the +problem size increases the resource requirement by a constant amount.

                                                                                    + +

                                                                                    +Exercise 1.14.  Draw the tree illustrating the process generated by the count-change procedure of section 1.2.2 in making +change for 11 cents. What are the orders of growth of the space and +number of steps used by this process as the amount to be changed +increases? +

                                                                                    + +

                                                                                    +Exercise 1.15.  The sine of an angle (specified in +radians) can be computed by making use of the approximation +sin x x +if x is +sufficiently small, and the trigonometric identity +

                                                                                    +to reduce the size of the argument of sin. (For +purposes of this exercise an angle is considered ``sufficiently +small'' if its magnitude is not greater than 0.1 radians.) These +ideas are incorporated in the following procedures:

                                                                                    + +

                                                                                    (define (cube x) (* x x x))
                                                                                    +(define (p x) (- (* 3 x) (* 4 (cube x))))
                                                                                    +(define (sine angle)
                                                                                    +   (if (not (> (abs angle) 0.1))
                                                                                    +       angle
                                                                                    +       (p (sine (/ angle 3.0)))))
                                                                                    +

                                                                                    + +a.  How many times is the procedure p +applied when (sine 12.15) is evaluated?

                                                                                    + +b.  What is the order of growth in space and number of steps (as a +function of a) used by the process generated by the sine +procedure when (sine a) is evaluated? +

                                                                                    + + +

                                                                                    1.2.4  Exponentiation

                                                                                    + + + + +Consider the problem of computing the exponential of a given number. +We would like a procedure that takes as arguments a base b and a +positive integer exponent n and computes bn. One way to do this +is via the recursive definition +

                                                                                    +which translates readily into the procedure

                                                                                    + +

                                                                                    (define (expt b n)
                                                                                    +  (if (= n 0)
                                                                                    +      1
                                                                                    +      (* b (expt b (- n 1)))))
                                                                                    +

                                                                                    +This is a linear recursive process, which requires (n) steps +and (n) space. Just as with factorial, we can readily +formulate an equivalent linear iteration:

                                                                                    + + +

                                                                                    (define (expt b n)
                                                                                    +  (expt-iter b n 1))
                                                                                    +
                                                                                    +(define (expt-iter b counter product)
                                                                                    +  (if (= counter 0)
                                                                                    +      product
                                                                                    +      (expt-iter b
                                                                                    +                (- counter 1)
                                                                                    +                (* b product)))) 
                                                                                    +

                                                                                    +This version requires (n) steps and (1) space.

                                                                                    + +We can compute exponentials in fewer steps by using successive +squaring. For instance, rather than computing b8 as +

                                                                                    +we can compute it using three multiplications: +

                                                                                    + +This method works fine for exponents that are powers of 2. We can +also take advantage of successive squaring in computing exponentials +in general if we use the rule

                                                                                    + +

                                                                                    +We can express this method as a procedure:

                                                                                    + + +

                                                                                    (define (fast-expt b n)
                                                                                    +  (cond ((= n 0) 1)
                                                                                    +        ((even? n) (square (fast-expt b (/ n 2))))
                                                                                    +        (else (* b (fast-expt b (- n 1))))))
                                                                                    +

                                                                                    +where the predicate to test whether an integer is even is defined in terms of +the primitive procedure remainder by +

                                                                                    + + +

                                                                                    (define (even? n)
                                                                                    +  (= (remainder n 2) 0))
                                                                                    +

                                                                                    +The process evolved by fast-expt grows logarithmically with n +in both space and number of steps. To see this, observe that +computing b2n using fast-expt requires only one more +multiplication than computing bn. The size of the exponent we can +compute therefore doubles (approximately) with every new +multiplication we are allowed. Thus, the number of multiplications +required for an exponent of n grows about as fast as the logarithm +of n to the base 2. The process has (log n) +growth.37

                                                                                    + +The difference between (log n) growth and (n) growth +becomes striking as n becomes large. For example, fast-expt +for n = 1000 requires only 14 multiplications.38 It is also possible to use the idea of +successive squaring to devise an iterative algorithm that computes +exponentials with a logarithmic number of steps +(see exercise 1.16), although, as is often +the case with iterative algorithms, this is not written down so +straightforwardly as the recursive algorithm.39 + +

                                                                                    + +

                                                                                    +Exercise 1.16.  Design a procedure that evolves an iterative exponentiation process +that uses successive squaring and uses a logarithmic number of steps, +as does fast-expt. (Hint: Using the observation that +(bn/2)2 = (b2)n/2, keep, along with the exponent n and the +base b, an additional state variable a, and define the state +transformation in such a way that the product a bn is unchanged +from state to state. At the beginning of the process a is taken to +be 1, and the answer is given by the value of a at the end of the +process. In general, the technique of defining an invariant +quantity that remains unchanged from state to state is a powerful way +to think about the design of iterative algorithms.) + +

                                                                                    + +

                                                                                    +Exercise 1.17.  The exponentiation algorithms in this section are based on performing +exponentiation by means of repeated multiplication. In a similar way, +one can perform integer multiplication by means of repeated addition. +The following multiplication procedure (in which it is assumed that +our language can only add, not multiply) is analogous to the expt procedure:

                                                                                    + +

                                                                                    (define (* a b)
                                                                                    +  (if (= b 0)
                                                                                    +      0
                                                                                    +      (+ a (* a (- b 1)))))
                                                                                    +

                                                                                    + +This algorithm takes a number of steps that is linear in b. +Now suppose we include, together with addition, operations double, +which doubles an integer, and halve, which divides an (even) +integer by 2. Using these, design a multiplication procedure analogous +to fast-expt that uses a logarithmic number of steps. +

                                                                                    + +

                                                                                    +Exercise 1.18.  Using the results of exercises 1.16 +and 1.17, devise a procedure that generates an iterative +process for multiplying two integers in terms of adding, doubling, and +halving and uses a logarithmic number of steps.40 + +

                                                                                    + +

                                                                                    +Exercise 1.19.   +There is a clever algorithm for computing the Fibonacci numbers in +a logarithmic number of steps. +Recall the transformation of the state variables +a and b in the fib-iter process of +section 1.2.2: a a + b and b +a. Call this transformation T, and observe that applying T over +and over again n times, starting with 1 and 0, produces the pair + Fib(n + 1) and Fib(n). In other words, the Fibonacci +numbers are produced by applying Tn, the nth power of the +transformation T, starting with the pair (1,0). Now consider T +to be the special case of p = 0 and q = 1 in a family of +transformations Tpq, where Tpq transforms the pair (a,b) +according to a bq + aq + ap and b bp + aq. Show +that if we apply such a transformation Tpq twice, the effect is +the same as using a single transformation Tp'q' of the same form, +and compute p' and q' in terms of p and q. This gives us an +explicit way to square these transformations, and thus we can compute +Tn using successive squaring, as in the fast-expt +procedure. Put this all together to complete the following procedure, +which runs in a logarithmic number of steps:41

                                                                                    + +

                                                                                    (define (fib n)
                                                                                    +  (fib-iter 1 0 0 1 n))
                                                                                    +(define (fib-iter a b p q count)
                                                                                    +  (cond ((= count 0) b)
                                                                                    +        ((even? count)
                                                                                    +         (fib-iter a
                                                                                    +                   b
                                                                                    +                   <??>      ; compute p'
                                                                                    +                   <??>      ; compute q'
                                                                                    +                   (/ count 2)))
                                                                                    +        (else (fib-iter (+ (* b q) (* a q) (* a p))
                                                                                    +                        (+ (* b p) (* a q))
                                                                                    +                        p
                                                                                    +                        q
                                                                                    +                        (- count 1)))))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    1.2.5  Greatest Common Divisors

                                                                                    + + + +The greatest common divisor (GCD) of two integers a and b is +defined to be the largest integer that divides both a and +b with no remainder. For example, the GCD of 16 and 28 is 4. In chapter 2, +when we investigate how to implement rational-number arithmetic, we +will need to be able to compute GCDs in order to reduce +rational numbers to lowest terms. (To reduce a rational number to +lowest terms, we must divide both the numerator and the denominator by their +GCD. For example, 16/28 reduces to 4/7.) One way to find the +GCD of two integers is to factor them and search for common +factors, but there is a famous algorithm that is much more efficient.

                                                                                    + +The idea of the algorithm is based on the observation that, if r is +the remainder when a is divided by b, then the common divisors of +a and b are precisely the same as the common divisors of b and +r. Thus, we can use the equation +

                                                                                    +to successively reduce the problem of computing a GCD to the +problem of computing the GCD of smaller and smaller pairs of +integers. For example, +

                                                                                    +reduces GCD(206,40) to GCD(2,0), which is 2. It is +possible to show that starting with any two positive integers and +performing repeated reductions will always eventually produce a pair +where the second number is 0. Then the GCD is the other +number in the pair. This method for computing the GCD is +known as Euclid's Algorithm.42

                                                                                    + +It is easy to express Euclid's Algorithm as a procedure: +

                                                                                    (define (gcd a b)
                                                                                    +  (if (= b 0)
                                                                                    +      a
                                                                                    +      (gcd b (remainder a b))))
                                                                                    +

                                                                                    +This generates an iterative process, whose number of steps grows as +the logarithm of the numbers involved.

                                                                                    + +The fact that the number of steps required by Euclid's Algorithm has +logarithmic growth bears an interesting relation to the Fibonacci +numbers:

                                                                                    + +

                                                                                    Lamé's Theorem: If Euclid's Algorithm requires k steps to +compute the GCD of some pair, then the smaller number in the pair +must be greater than or equal to the kth Fibonacci +number.43

                                                                                    + +

                                                                                    + +We can use this theorem to get an order-of-growth estimate for Euclid's +Algorithm. Let n be the smaller of the two inputs to the +procedure. If the process takes k steps, then we must have +n> Fib (k) k/5. Therefore +the number of steps k grows as the logarithm (to the base +) of n. Hence, the order of growth is (log n).

                                                                                    + +

                                                                                    +Exercise 1.20.  The process that a procedure generates is of course dependent on the +rules used by the interpreter. As an example, consider the iterative +gcd procedure given above. +Suppose we were to interpret this procedure using normal-order +evaluation, as discussed in section 1.1.5. +(The normal-order-evaluation rule for if is described in +exercise 1.5.) Using the +substitution method (for normal order), illustrate the process +generated in evaluating (gcd 206 40) and indicate the +remainder operations that are actually performed. +How many remainder operations are actually performed +in the normal-order evaluation of (gcd 206 40)? +In the applicative-order evaluation? +

                                                                                    + + +

                                                                                    1.2.6  Example: Testing for Primality

                                                                                    + + + +This section describes two methods for checking the primality of an +integer n, one with order of growth (n), and a +``probabilistic'' algorithm with order of growth (log n). The +exercises at the end of this section suggest programming +projects based on these algorithms.

                                                                                    + + +

                                                                                    Searching for divisors

                                                                                    + +Since ancient times, mathematicians have been fascinated by problems +concerning prime numbers, and many people have worked on the problem +of determining ways to test if numbers are prime. One way +to test if a number is prime is to find the number's divisors. The +following program finds the smallest integral divisor (greater than 1) +of a given number n. It does this in a straightforward way, by +testing n for divisibility by successive integers starting with 2.

                                                                                    + +

                                                                                    (define (smallest-divisor n)
                                                                                    +  (find-divisor n 2))
                                                                                    +(define (find-divisor n test-divisor)
                                                                                    +  (cond ((> (square test-divisor) n) n)
                                                                                    +        ((divides? test-divisor n) test-divisor)
                                                                                    +        (else (find-divisor n (+ test-divisor 1)))))
                                                                                    +(define (divides? a b)
                                                                                    +  (= (remainder b a) 0))
                                                                                    +

                                                                                    + +We can test whether a number is prime as follows: n is prime if +and only if n is its own smallest divisor.

                                                                                    + +

                                                                                    (define (prime? n)
                                                                                    +  (= n (smallest-divisor n)))
                                                                                    +

                                                                                    + +The end test for find-divisor is based on the fact that if n +is not prime it must have a divisor less than or equal to +n.44 This +means that the algorithm need only test divisors between 1 and +n. Consequently, the number of steps required to identify +n as prime will have order of growth (n).

                                                                                    + + +

                                                                                    The Fermat test

                                                                                    + +The (log n) primality test is based on a result from number +theory known as Fermat's Little Theorem.45

                                                                                    + +

                                                                                    Fermat's Little Theorem: If n is a prime number and +a is any positive integer less than n, then a raised to the +nth power is congruent to a modulo n.

                                                                                    + +

                                                                                    (Two numbers are said to be congruent modulo n if +they both have the same remainder when divided by n. The +remainder of a number a when divided by n is also referred to as +the remainder of a modulo n, or simply as a +modulo n.)

                                                                                    + +If n is not prime, then, in general, most of the numbers a< n will not +satisfy the above relation. This leads to the following algorithm for +testing primality: Given a number n, pick a random number a < n and +compute the remainder of an modulo n. If the result is not equal to +a, then n is certainly not prime. If it is a, then chances are good +that n is prime. Now pick another random number a and test it with the +same method. If it also satisfies the equation, then we can be even more +confident that n is prime. By trying more and more values of a, we can +increase our confidence in the result. This algorithm is known as the +Fermat test.

                                                                                    + +To implement the Fermat test, we need a procedure that computes the +exponential of a number modulo another number:

                                                                                    + +

                                                                                    (define (expmod base exp m)
                                                                                    +  (cond ((= exp 0) 1)
                                                                                    +        ((even? exp)
                                                                                    +         (remainder (square (expmod base (/ exp 2) m))
                                                                                    +                    m))
                                                                                    +        (else
                                                                                    +         (remainder (* base (expmod base (- exp 1) m))
                                                                                    +                    m))))        
                                                                                    +

                                                                                    +This is very similar to the fast-expt procedure of +section 1.2.4. It uses successive squaring, so +that the number of steps grows logarithmically with the +exponent.46

                                                                                    + +The Fermat test is performed by choosing at random a number a +between 1 and n - 1 inclusive and checking whether the remainder +modulo n of the nth power of a is equal to a. The random +number a is chosen using the procedure random, which we assume is +included as a primitive in Scheme. Random returns a +nonnegative integer less than its integer input. Hence, to obtain a random +number between 1 and n - 1, we call random with an input of +n - 1 and add 1 to the result:

                                                                                    + +

                                                                                    (define (fermat-test n)
                                                                                    +  (define (try-it a)
                                                                                    +    (= (expmod a n n) a))
                                                                                    +  (try-it (+ 1 (random (- n 1)))))
                                                                                    +

                                                                                    + +The following procedure runs the test a given number of times, as +specified by a parameter. Its value is true if the test succeeds +every time, and false otherwise.

                                                                                    + +

                                                                                    (define (fast-prime? n times)
                                                                                    +  (cond ((= times 0) true)
                                                                                    +        ((fermat-test n) (fast-prime? n (- times 1)))
                                                                                    +        (else false)))
                                                                                    +

                                                                                    + + +

                                                                                    Probabilistic methods

                                                                                    + + +The Fermat test differs in character from most familiar algorithms, in +which one computes an answer that is guaranteed to be correct. Here, +the answer obtained is only probably correct. More precisely, if n +ever fails the Fermat test, we can be certain that n is not prime. +But the fact that n passes the test, while an extremely strong +indication, is still not a guarantee that n is prime. What we would +like to say is that for any number n, if we perform the test enough +times and find that n always passes the test, then the probability +of error in our primality test can be made as small as we like.

                                                                                    + + +Unfortunately, this assertion is not quite correct. There do exist +numbers that fool the Fermat test: numbers n that are not prime and +yet have the property that an is congruent to a modulo n for +all integers a < n. Such numbers are extremely rare, so the Fermat +test is quite reliable in practice.47 +There are variations of the Fermat test that cannot be fooled. In +these tests, as with the Fermat method, one tests the primality of an +integer n by choosing a random integer a<n and checking some +condition that depends upon n and a. (See +exercise 1.28 for an example of such a test.) On the +other hand, in contrast to the Fermat test, one can prove that, for +any n, the condition does not hold for most of the integers a<n +unless n is prime. Thus, if n passes the test for some random +choice of a, the chances are better than even that n is prime. If +n passes the test for two random choices of a, the chances are better +than 3 out of 4 that n is prime. By running the test with more and +more randomly chosen values of a we can make the probability of +error as small as we like.

                                                                                    + +The existence of tests for which one can prove that the chance of +error becomes arbitrarily small has sparked interest in algorithms of +this type, which have come to be known as probabilistic +algorithms. There is a great deal of research activity in this area, +and probabilistic algorithms have been fruitfully applied to many +fields.48

                                                                                    + +

                                                                                    +Exercise 1.21.  Use the smallest-divisor procedure to find the smallest divisor +of each of the following numbers: 199, 1999, 19999. +

                                                                                    + +

                                                                                    +Exercise 1.22.  Most Lisp implementations include a primitive called runtime +that returns an integer that specifies the amount of time the system +has been running (measured, for example, in microseconds). The +following timed-prime-test procedure, when called with an +integer n, prints n and checks to see if n is prime. If n is +prime, the procedure prints three asterisks followed by the amount of time +used in performing the test.

                                                                                    + +

                                                                                    (define (timed-prime-test n)
                                                                                    +  (newline)
                                                                                    +  (display n)
                                                                                    +  (start-prime-test n (runtime)))
                                                                                    +(define (start-prime-test n start-time)
                                                                                    +  (if (prime? n)
                                                                                    +      (report-prime (- (runtime) start-time))))
                                                                                    +(define (report-prime elapsed-time)
                                                                                    +  (display " *** ")
                                                                                    +  (display elapsed-time))
                                                                                    +

                                                                                    +Using this procedure, write a procedure search-for-primes that +checks the primality of consecutive odd integers in a specified range. +Use your procedure to find the three smallest primes larger than 1000; +larger than 10,000; larger than 100,000; larger than 1,000,000. Note +the time needed to test each prime. Since the testing algorithm has +order of growth of (n), you should expect that testing +for primes around 10,000 should take about 10 times as long +as testing for primes around 1000. Do your timing data bear this out? +How well do the data for 100,000 and 1,000,000 support the n +prediction? Is your result compatible with the notion that programs +on your machine run in time proportional to the number of steps +required for the computation? + +

                                                                                    + +

                                                                                    +Exercise 1.23.  The smallest-divisor procedure shown at the start of this section +does lots of needless testing: After it checks to see if the +number is divisible by 2 there is no point in checking to see if +it is divisible by any larger even numbers. This suggests that the +values used for test-divisor should not be 2, 3, 4, 5, 6, +..., but rather 2, 3, 5, 7, 9, .... To implement this +change, define a procedure next that returns 3 if its input is +equal to 2 and otherwise returns its input plus 2. Modify the smallest-divisor procedure to use (next test-divisor) instead +of (+ test-divisor 1). With timed-prime-test +incorporating this modified version of smallest-divisor, run the +test for each of the 12 primes found in +exercise 1.22. Since this modification halves the +number of test steps, you should expect it to run about twice as fast. +Is this expectation confirmed? If not, what is the observed ratio of +the speeds of the two algorithms, and how do you explain the fact that +it is different from 2? +

                                                                                    + +

                                                                                    +Exercise 1.24.  Modify the timed-prime-test procedure of +exercise 1.22 to use fast-prime? (the +Fermat method), and test each of the 12 primes you found in that +exercise. Since the Fermat test has (log n) growth, how +would you expect the time to test primes near 1,000,000 to compare +with the time needed to test primes near 1000? Do your data bear this +out? Can you explain any discrepancy you find? + +

                                                                                    + +

                                                                                    +Exercise 1.25.  Alyssa P. Hacker complains that we went to a lot of extra work in +writing expmod. After all, she says, since we already know how +to compute exponentials, we could have simply written

                                                                                    + +

                                                                                    (define (expmod base exp m)
                                                                                    +  (remainder (fast-expt base exp) m))
                                                                                    +

                                                                                    +Is she correct? Would this procedure serve as well for our fast prime +tester? Explain. + +

                                                                                    + +

                                                                                    +Exercise 1.26.  Louis Reasoner is having great difficulty doing +exercise 1.24. His fast-prime? test +seems to run more slowly than his prime? test. Louis calls his +friend Eva Lu Ator over to help. When they examine Louis's code, they +find that he has rewritten the expmod procedure to use an +explicit multiplication, rather than calling square:

                                                                                    + +

                                                                                    (define (expmod base exp m)
                                                                                    +  (cond ((= exp 0) 1)
                                                                                    +        ((even? exp)
                                                                                    +         (remainder (* (expmod base (/ exp 2) m)
                                                                                    +                       (expmod base (/ exp 2) m))
                                                                                    +                    m))
                                                                                    +        (else
                                                                                    +         (remainder (* base (expmod base (- exp 1) m))
                                                                                    +                    m))))
                                                                                    +

                                                                                    +``I don't see what difference that could make,'' says Louis. ``I +do.'' says Eva. ``By writing the procedure like that, you have +transformed the (log n) process into a (n) process.'' +Explain. +

                                                                                    + +

                                                                                    +Exercise 1.27.  Demonstrate that the Carmichael numbers listed in +footnote 47 really do fool +the Fermat test. That is, write a procedure that takes an integer n +and tests whether an is congruent to a modulo n for every +a<n, and try your procedure on the given Carmichael numbers. +

                                                                                    + + +

                                                                                    +Exercise 1.28.  One variant of the Fermat test that cannot be fooled is called the +Miller-Rabin test (Miller 1976; Rabin 1980). This starts from +an alternate form of Fermat's Little Theorem, which states that if n +is a prime number and a is any positive integer less than n, then +a raised to the (n - 1)st power is congruent to 1 modulo n. To test +the primality of a number n by the Miller-Rabin test, we pick a +random number a<n and raise a to the (n - 1)st power modulo n +using the expmod procedure. However, whenever we perform the +squaring step in expmod, we check to see if we have discovered a +``nontrivial square root of 1 modulo n,'' that is, a number not +equal to 1 or n - 1 whose square is equal to 1 modulo n. It is +possible to prove that if such a nontrivial square root of 1 exists, +then n is not prime. It is also possible to prove that if n is an +odd number that is not prime, then, for at least half the numbers +a<n, computing an-1 in this way will reveal a nontrivial +square root of 1 modulo n. (This is why the Miller-Rabin test +cannot be fooled.) Modify the expmod procedure to signal if it +discovers a nontrivial square root of 1, and use this to implement +the Miller-Rabin test with a procedure analogous to fermat-test. +Check your procedure by testing various known primes and non-primes. +Hint: One convenient way to make expmod signal is to have it +return 0. + +

                                                                                    + +


                                                                                    +

                                                                                    29 In a real program we would probably use the +block structure introduced in the last section to hide the definition +of fact-iter: +

                                                                                    (define (factorial n)
                                                                                    +  (define (iter product counter)
                                                                                    +    (if (> counter n)
                                                                                    +        product
                                                                                    +        (iter (* counter product)
                                                                                    +              (+ counter 1))))
                                                                                    +  (iter 1 1))
                                                                                    +

                                                                                    +We avoided doing this here so as to minimize the number of things to +think about at once. + +

                                                                                    30 When we discuss the implementation of +procedures on register machines in chapter 5, we will see that any +iterative process can be realized ``in hardware'' as a machine that +has a fixed set of registers and no auxiliary memory. In contrast, +realizing a recursive process requires a machine that uses an +auxiliary data structure known as a stack. + +

                                                                                    31 Tail recursion has long been +known as a compiler optimization trick. A coherent semantic basis for +tail recursion was provided by Carl Hewitt (1977), who explained it in +terms of the ``message-passing'' model of computation that we shall +discuss in chapter 3. Inspired by this, Gerald Jay Sussman and Guy +Lewis Steele Jr. (see Steele 1975) constructed a tail-recursive +interpreter for Scheme. Steele later showed how tail recursion is a +consequence of the natural way to compile procedure calls (Steele +1977). The IEEE standard for Scheme requires that Scheme implementations +be tail-recursive. + +

                                                                                    32 An example of this was hinted +at in section 1.1.3: +The interpreter itself evaluates expressions +using a tree-recursive process. + +

                                                                                    33 For example, work through in detail how the +reduction rule applies to the problem of making change for 10 cents +using pennies and nickels. + +

                                                                                    34 One +approach to coping with redundant computations is to arrange matters +so that we automatically construct a table of values as they +are computed. Each time we are asked to apply the procedure to some +argument, we first look to see if the value is already stored in the +table, in which case we avoid performing the redundant computation. +This strategy, known as tabulation or memoization, can be +implemented in a straightforward way. Tabulation can sometimes be +used to transform processes that require an exponential number of +steps (such as count-change) into processes whose space and time +requirements grow linearly with the input. See +exercise 3.27. + +

                                                                                    35 The elements of Pascal's triangle are called the binomial +coefficients, because the nth row consists of +the coefficients of the terms in the +expansion of (x + y)n. This pattern for computing the coefficients +appeared in Blaise Pascal's 1653 seminal work on probability theory, Traité du triangle arithmétique. According to +Knuth (1973), the same pattern appears in the Szu-yuen +Yü-chien (``The Precious Mirror of the Four Elements''), published +by the Chinese mathematician Chu Shih-chieh in 1303, in the +works of the twelfth-century Persian poet and mathematician Omar +Khayyam, and in the works of the twelfth-century Hindu mathematician +Bháscara Áchárya. + +

                                                                                    36 These statements mask a +great deal of oversimplification. For instance, if we count process +steps as ``machine operations'' we are making the assumption that the +number of machine operations needed to perform, say, a multiplication +is independent of the size of the numbers to be multiplied, which is +false if the numbers are sufficiently large. Similar remarks hold for +the estimates of space. Like the design and description of a process, +the analysis of a process can be carried out at various levels of +abstraction. + +

                                                                                    37 More precisely, the number of multiplications +required is equal to 1 less than the log base 2 of n plus the number +of ones in the binary representation of n. This total is always +less than twice the log base 2 of n. The arbitrary constants +k1 and k2 in +the definition of order notation imply that, for a logarithmic +process, the base to which logarithms are taken does not matter, so +all such processes are described as (log n). + +

                                                                                    38 You may wonder +why anyone would care about raising numbers to the 1000th power. See +section 1.2.6. + +

                                                                                    39 This iterative +algorithm is ancient. It appears in the Chandah-sutra by +Áchárya Pingala, written before 200 B.C. See Knuth 1981, section +4.6.3, for a full discussion and analysis of this and other methods of +exponentiation. + +

                                                                                    40 This +algorithm, which is sometimes known as the ``Russian peasant method'' +of multiplication, is ancient. Examples of its use are found in the +Rhind Papyrus, one of the two oldest mathematical documents in +existence, written about 1700 B.C. (and copied from an even +older document) by an Egyptian scribe named A'h-mose. + +

                                                                                    41 This exercise was +suggested to us by Joe Stoy, based on an example in Kaldewaij 1990. + +

                                                                                    42 Euclid's Algorithm is so +called because it appears in Euclid's Elements (Book 7, ca. 300 +B.C.). According to Knuth (1973), it can be considered the +oldest known nontrivial algorithm. The ancient Egyptian method of +multiplication (exercise 1.18) is surely older, +but, as Knuth explains, Euclid's algorithm is the oldest known to have +been presented as a general algorithm, rather than as a set of +illustrative examples. + +

                                                                                    43 This theorem was proved in 1845 by Gabriel Lamé, a +French mathematician and engineer known chiefly for his contributions +to mathematical physics. To prove the theorem, we consider pairs +(ak ,bk), where ak> bk, for which Euclid's Algorithm +terminates in k steps. The proof is based on the claim that, if +(ak+1, bk+1) (ak, bk) + (ak-1, bk-1) are three successive pairs in the +reduction process, then we must have bk+1> bk + bk-1. +To verify the claim, consider that a reduction step is defined by +applying the transformation ak-1 = bk, bk-1 = + remainder of ak divided by bk. +The second equation means that ak = qbk + bk-1 for some +positive integer q. And since q must be at least 1 we have ak + = qbk + bk-1 > bk + bk-1. But in the previous +reduction step we have bk+1 = ak. Therefore, bk+1 = +ak> bk + bk-1. This verifies the claim. Now we can +prove the theorem by induction on k, the number of steps that the +algorithm requires to terminate. The result is true for k = 1, since +this merely requires that b be at least as large as +Fib(1) = 1. Now, assume that the result is true for all integers less +than or equal to k and establish the result for k + 1. Let +(ak+1, bk+1) (ak, bk) + (ak-1, bk-1) be successive pairs in the +reduction process. By our induction hypotheses, we have bk-1> + Fib(k - 1) and bk> Fib(k). Thus, applying the claim we just +proved together with the definition of the Fibonacci numbers gives +bk+1 > bk + bk-1> Fib(k) + Fib(k - 1) = Fib(k + 1), which +completes the proof of Lamé's Theorem. + +

                                                                                    44 If d is a divisor of n, then so is n/d. +But d and n/d cannot both be greater than n. + +

                                                                                    45 Pierre de Fermat (1601-1665) is considered to be the founder of +modern number theory. He obtained many important number-theoretic +results, but he usually announced just the results, without providing +his proofs. Fermat's Little Theorem was stated in a letter he wrote in +1640. The first published proof was given by Euler in 1736 (and an +earlier, identical proof was discovered in the unpublished manuscripts +of Leibniz). The most famous of Fermat's results -- known as Fermat's +Last Theorem -- was jotted down in 1637 in his copy of the book Arithmetic (by the third-century Greek mathematician Diophantus) with the +remark ``I have discovered a truly remarkable proof, but this margin is +too small to contain it.'' Finding a proof of Fermat's Last Theorem +became one of the most famous challenges in number theory. A complete +solution was finally given in 1995 by Andrew Wiles of Princeton University. + +

                                                                                    46 The reduction steps in the cases where the exponent +e is greater than 1 are based on the fact that, for any integers +x, y, and m, we can find the remainder of x times y modulo +m by computing separately the remainders of x modulo m and y +modulo m, multiplying these, and then taking the remainder of the +result modulo m. For instance, in the case where e is even, we +compute the remainder of be/2 modulo m, square this, and take +the remainder modulo m. This technique is useful because it means +we can perform our computation without ever having to deal with +numbers much larger than m. (Compare +exercise 1.25.) + +

                                                                                    47 Numbers that fool the +Fermat test are called Carmichael numbers, and little is known +about them other than that they are extremely rare. There are 255 +Carmichael numbers below 100,000,000. The smallest few are 561, 1105, +1729, 2465, 2821, and 6601. In testing primality of very large +numbers chosen at random, the chance of stumbling upon a value that +fools the Fermat test is less than the chance that cosmic radiation +will cause the computer to make an error in carrying out a ``correct'' +algorithm. Considering an algorithm to be inadequate for the first +reason but not for the second illustrates the difference between +mathematics and engineering. + +

                                                                                    48 One of the most striking applications of +probabilistic prime testing has been to the field of cryptography. +Although it is now computationally infeasible to factor an arbitrary +200-digit number, the primality of such a number can be checked in a +few seconds with the Fermat test. This fact forms the basis of a +technique for constructing ``unbreakable codes'' suggested by Rivest, +Shamir, and Adleman (1977). The resulting RSA algorithm has +become a widely used technique for enhancing the security of +electronic communications. Because of this and related developments, +the study of prime numbers, once considered the epitome of a topic in +``pure'' mathematics to be studied only for its own sake, now turns +out to have important practical applications to cryptography, +electronic funds transfer, and information retrieval. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html new file mode 100644 index 00000000..55f3ac5e --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html @@ -0,0 +1,1250 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    1.3  Formulating Abstractions with Higher-Order Procedures

                                                                                    + +

                                                                                    + + +We have seen that procedures are, in effect, abstractions that describe +compound operations on numbers independent of the particular numbers. +For example, when we

                                                                                    + + +

                                                                                    (define (cube x) (* x x x))
                                                                                    +

                                                                                    +we are not talking about the cube of a particular number, but rather +about a method for obtaining the cube of any number. Of course we +could get along without ever defining this procedure, by +always writing expressions such as

                                                                                    + +

                                                                                    (* 3 3 3)
                                                                                    +(* x x x)
                                                                                    +(* y y y)        
                                                                                    +

                                                                                    +and never mentioning cube explicitly. This would place us at a +serious disadvantage, forcing us to work always at the level of the +particular operations that happen to be primitives in the language +(multiplication, in this case) rather than in terms of higher-level +operations. Our programs would be able to compute cubes, but our +language would lack the ability to express the concept of cubing. One +of the things we should demand from a powerful programming language is +the ability to build abstractions by assigning names to common +patterns and then to work in terms of the abstractions directly. +Procedures provide this ability. This is why all but the most +primitive programming languages include mechanisms for defining +procedures.

                                                                                    + +Yet even in numerical processing we will be severely limited in our +ability to create abstractions if we are restricted to procedures +whose parameters must be numbers. Often the same programming pattern +will be used with a number of different procedures. To express such +patterns as concepts, we will need to construct procedures that can +accept procedures as arguments or return procedures as values. +Procedures that manipulate procedures are called higher-order +procedures. This section shows how higher-order procedures can serve +as powerful abstraction mechanisms, vastly increasing the expressive +power of our language.

                                                                                    + + +

                                                                                    1.3.1  Procedures as Arguments

                                                                                    + + + + +Consider the following three procedures. The first computes the sum +of the integers from a through b:

                                                                                    + +

                                                                                    (define (sum-integers a b)
                                                                                    +  (if (> a b)
                                                                                    +      0
                                                                                    +      (+ a (sum-integers (+ a 1) b))))
                                                                                    +

                                                                                    +The second computes the sum of the cubes of the integers in the given range:

                                                                                    + +

                                                                                    (define (sum-cubes a b)
                                                                                    +  (if (> a b)
                                                                                    +      0
                                                                                    +      (+ (cube a) (sum-cubes (+ a 1) b))))
                                                                                    +

                                                                                    +The third computes the sum of a sequence of terms in the +series +

                                                                                    +which converges to /8 (very slowly):49

                                                                                    + +

                                                                                    (define (pi-sum a b)
                                                                                    +  (if (> a b)
                                                                                    +      0
                                                                                    +      (+ (/ 1.0 (* a (+ a 2))) (pi-sum (+ a 4) b))))
                                                                                    +

                                                                                    + +These three procedures clearly share a common underlying pattern. +They are for the most part identical, differing only in the name of +the procedure, the function of a used to compute the term to be added, +and the function that provides the next value of a. We could generate +each of the procedures by filling in slots in the same template:

                                                                                    + +

                                                                                    (define (<name> a b)
                                                                                    +  (if (> a b)
                                                                                    +      0
                                                                                    +      (+ (<term> a)
                                                                                    +         (<name> (<next> a) b))))
                                                                                    +

                                                                                    + +The presence of such a common pattern is strong evidence that there is +a useful abstraction waiting to be brought to the surface. Indeed, +mathematicians long ago identified the abstraction of +summation of a series and invented ``sigma +notation,'' for example

                                                                                    + +

                                                                                    + +to express this concept. The power of sigma notation is that it +allows mathematicians to deal with the concept of summation +itself rather than only with particular sums -- for example, to +formulate general results about sums that are independent of the +particular series being summed.

                                                                                    + +Similarly, as program designers, we would like our language to +be powerful enough so that we can write a procedure that expresses the +concept of summation itself rather than only procedures +that compute particular sums. We can do so readily in our +procedural language by taking the common template shown above and +transforming the ``slots'' into formal parameters:

                                                                                    + +

                                                                                    (define (sum term a next b)
                                                                                    +  (if (> a b)
                                                                                    +      0
                                                                                    +      (+ (term a)
                                                                                    +         (sum term (next a) next b))))
                                                                                    +

                                                                                    +Notice that sum takes as its arguments the lower and upper bounds +a and b together with the procedures term and next. +We can use sum just as we would any procedure. For example, we can +use it (along with a procedure inc that increments its argument by 1) +to define sum-cubes:

                                                                                    + +

                                                                                    (define (inc n) (+ n 1))
                                                                                    +(define (sum-cubes a b)
                                                                                    +  (sum cube a inc b))
                                                                                    +

                                                                                    +Using this, we can compute the sum of the cubes of the integers from 1 +to 10:

                                                                                    + + +

                                                                                    (sum-cubes 1 10)
                                                                                    +3025
                                                                                    +

                                                                                    +With the aid of an identity procedure to compute the term, we can define +sum-integers in terms of sum:

                                                                                    + + +

                                                                                    (define (identity x) x)
                                                                                    +
                                                                                    +(define (sum-integers a b)
                                                                                    +  (sum identity a inc b))
                                                                                    +

                                                                                    +Then we can add up the integers from 1 to 10:

                                                                                    + + +

                                                                                    (sum-integers 1 10)
                                                                                    +55
                                                                                    +

                                                                                    +We can also define pi-sum in the same way:50

                                                                                    + + +

                                                                                    (define (pi-sum a b)
                                                                                    +  (define (pi-term x)
                                                                                    +    (/ 1.0 (* x (+ x 2))))
                                                                                    +  (define (pi-next x)
                                                                                    +    (+ x 4))
                                                                                    +  (sum pi-term a pi-next b))
                                                                                    +

                                                                                    +Using these procedures, we can compute an approximation to +:

                                                                                    + + +

                                                                                    (* 8 (pi-sum 1 1000))
                                                                                    +3.139592655589783
                                                                                    +

                                                                                    + + +Once we have sum, we can use it as a building block in +formulating further concepts. For instance, the definite integral of a +function f between the limits a and b can be approximated +numerically using the formula +

                                                                                    +for small values of dx. We can express this directly as a +procedure:

                                                                                    + +

                                                                                    (define (integral f a b dx)
                                                                                    +  (define (add-dx x) (+ x dx))
                                                                                    +  (* (sum f (+ a (/ dx 2.0)) add-dx b)
                                                                                    +     dx))
                                                                                    +(integral cube 0 1 0.01)
                                                                                    +.24998750000000042
                                                                                    +(integral cube 0 1 0.001)
                                                                                    +.249999875000001
                                                                                    +

                                                                                    +(The exact value of the integral of cube between 0 and 1 is 1/4.)

                                                                                    + +

                                                                                    +Exercise 1.29.  Simpson's Rule is a more accurate method of numerical integration than +the method illustrated above. Using Simpson's Rule, the integral of a +function f between a and b is approximated as +

                                                                                    + +where h = (b - a)/n, for some even integer n, and yk = f(a + kh). +(Increasing n increases the accuracy of the approximation.) Define +a procedure that takes as arguments f, a, b, and n and returns +the value of the integral, computed using Simpson's Rule. +Use your procedure to integrate cube between 0 and 1 +(with n = 100 and n = 1000), and compare the results to those of the +integral procedure shown above. +

                                                                                    + +

                                                                                    +Exercise 1.30.  The sum procedure above generates a linear recursion. The +procedure can be rewritten so that the sum is performed iteratively. +Show how to do this by filling in the missing expressions in the +following definition:

                                                                                    + +

                                                                                    (define (sum term a next b)
                                                                                    +  (define (iter a result)
                                                                                    +    (if <??>
                                                                                    +        <??>
                                                                                    +        (iter <??> <??>)))
                                                                                    +  (iter <??> <??>))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 1.31.   +
                                                                                    a.  The sum procedure is only the simplest of a vast number of +similar abstractions that can be captured as higher-order procedures.51 Write an analogous procedure +called product that returns the product of the values of a +function at points over a given range. +Show how to define factorial in terms of +product. Also use product to compute approximations to + using the formula52 +

                                                                                    + +b.  If your product +procedure generates a recursive process, write one that generates +an iterative process. +If it generates an iterative process, write one that generates +a recursive process. + +

                                                                                    + +

                                                                                    +Exercise 1.32.  a. Show that sum and product +(exercise 1.31) are both special cases of a still more +general notion called accumulate that combines a collection of +terms, using some general accumulation function:

                                                                                    + +

                                                                                    (accumulate combiner null-value term a next b)
                                                                                    +

                                                                                    +Accumulate takes as arguments the same term and range +specifications as sum and product, together with a combiner +procedure (of two arguments) that specifies how the current +term is to be combined with the accumulation of the preceding terms +and a null-value that specifies what base value to use +when the terms run out. Write accumulate +and show how sum and product can both +be defined as simple calls to accumulate.

                                                                                    + +

                                                                                    b. If your accumulate +procedure generates a recursive process, write one that generates +an iterative process. +If it generates an iterative process, write one that generates +a recursive process. + +

                                                                                    + +

                                                                                    +Exercise 1.33.  You can obtain an even more general version of accumulate +(exercise 1.32) by introducing the notion of a filter on the terms to be combined. That is, combine only those +terms derived from values in the range that satisfy a specified +condition. The resulting filtered-accumulate abstraction takes +the same arguments as accumulate, together with an additional +predicate of one argument that specifies the filter. Write filtered-accumulate as a procedure. Show how to express the +following using filtered-accumulate:

                                                                                    + +

                                                                                    a. the sum of the squares of the prime numbers in the interval a to +b (assuming that you have a prime? predicate already written)

                                                                                    + +

                                                                                    b. the product of all the positive integers less than n +that are relatively prime to n (i.e., all positive integers +i < n such that GCD(i,n) = 1). + +

                                                                                    + + +

                                                                                    1.3.2  Constructing Procedures Using Lambda

                                                                                    + + +

                                                                                    + +In using sum as in section 1.3.1, +it seems terribly awkward to have to define trivial procedures such as +pi-term and pi-next just so we can use them as arguments to +our higher-order procedure. Rather than define pi-next and pi-term, it would be more convenient +to have a way to directly specify ``the procedure that returns its +input incremented by 4'' and ``the procedure that returns the +reciprocal of its input times its input plus 2.'' We can do this by +introducing the special form lambda, which creates procedures. +Using lambda we can describe what we want as

                                                                                    + +

                                                                                    (lambda (x) (+ x 4))
                                                                                    +

                                                                                    +and

                                                                                    + +

                                                                                    (lambda (x) (/ 1.0 (* x (+ x 2))))
                                                                                    +

                                                                                    +Then our pi-sum procedure can be expressed without defining any +auxiliary procedures as

                                                                                    + +

                                                                                    (define (pi-sum a b)
                                                                                    +  (sum (lambda (x) (/ 1.0 (* x (+ x 2))))
                                                                                    +       a
                                                                                    +       (lambda (x) (+ x 4))
                                                                                    +       b))
                                                                                    +

                                                                                    + +Again using lambda, we can write the integral procedure +without having to define the auxiliary procedure add-dx:

                                                                                    + +

                                                                                    (define (integral f a b dx)
                                                                                    +  (* (sum f
                                                                                    +          (+ a (/ dx 2.0))
                                                                                    +          (lambda (x) (+ x dx))
                                                                                    +          b)
                                                                                    +     dx))
                                                                                    +

                                                                                    + +In general, lambda is used to create procedures in the same way as +define, except that no name is specified for the procedure:

                                                                                    + +

                                                                                    (lambda (<formal-parameters>) <body>)
                                                                                    +

                                                                                    +The resulting procedure is just as much a procedure as one that is +created using define. The only difference is that it has not +been associated with any name in the environment. In fact,

                                                                                    + +

                                                                                    (define (plus4 x) (+ x 4))
                                                                                    +

                                                                                    +is equivalent to

                                                                                    + +

                                                                                    (define plus4 (lambda (x) (+ x 4)))
                                                                                    +

                                                                                    +We can read a lambda expression as follows: +

                                                                                        (lambda             (x)             (+    x     4))
                                                                                    +                                                
                                                                                    + the procedure   of an argument x  that adds  x and 4
                                                                                    +

                                                                                    + +Like any expression that has a procedure as its value, a +lambda expression can be used as the operator in a combination such as

                                                                                    + +

                                                                                    ((lambda (x y z) (+ x y (square z))) 1 2 3)
                                                                                    +12
                                                                                    +

                                                                                    +or, more generally, in any context where we would normally use a +procedure name.53

                                                                                    + + +

                                                                                    Using let to create local variables

                                                                                    + + + +Another use of lambda is in creating local variables. +We often need local variables in our procedures other than those that have +been bound as formal parameters. For example, suppose we wish to +compute the function

                                                                                    + +

                                                                                    + +which we could also express as +

                                                                                    +In writing a procedure to compute f, we would like to include as +local variables not only x and y but also the names of +intermediate quantities like a and b. One way to +accomplish this is to +use an auxiliary procedure to bind the local variables:

                                                                                    + + +

                                                                                    (define (f x y)
                                                                                    +  (define (f-helper a b)
                                                                                    +    (+ (* x (square a))
                                                                                    +       (* y b)
                                                                                    +       (* a b)))
                                                                                    +  (f-helper (+ 1 (* x y)) 
                                                                                    +            (- 1 y)))
                                                                                    +

                                                                                    + +Of course, we could use a lambda expression to specify an +anonymous procedure for binding our local variables. The body of +f then becomes a single call to that procedure:

                                                                                    + + +

                                                                                    (define (f x y)
                                                                                    +  ((lambda (a b)
                                                                                    +     (+ (* x (square a))
                                                                                    +        (* y b)
                                                                                    +        (* a b)))
                                                                                    +   (+ 1 (* x y))
                                                                                    +   (- 1 y)))
                                                                                    +

                                                                                    +This construct is so useful that there is a special form called +let to make its use more convenient. Using let, the f +procedure could be written as

                                                                                    + + +

                                                                                    (define (f x y)
                                                                                    +  (let ((a (+ 1 (* x y)))
                                                                                    +        (b (- 1 y)))
                                                                                    +    (+ (* x (square a))
                                                                                    +       (* y b)
                                                                                    +       (* a b))))
                                                                                    +

                                                                                    +The general form of a let expression is

                                                                                    + + +

                                                                                    (let ((<var1> <exp1>)
                                                                                    +      (<var2> <exp2>)
                                                                                    +      
                                                                                    +      (<varn> <expn>))
                                                                                    +   <body>)
                                                                                    +

                                                                                    +which can be thought of as saying

                                                                                    + + + + + +
                                                                                    let <var1> have the value <exp1> and
                                                                                    <var2> have the value <exp2> and
                                                                                    <varn> have the value <expn>
                                                                                    in <body> +

                                                                                    + +The first part of the let expression is a list of +name-expression pairs. When the let is evaluated, each name is +associated with the value of the corresponding expression. The body +of the let is evaluated with +these names bound as local variables. The way this happens is that the let expression is interpreted as an alternate syntax for

                                                                                    + +

                                                                                    ((lambda (<var1...<varn>)
                                                                                    +    <body>)
                                                                                    + <exp1>

                                                                                    + <expn>)
                                                                                    +

                                                                                    +No new mechanism is required in the interpreter in order to +provide local variables. A let expression is simply syntactic sugar for +the underlying lambda application.

                                                                                    + +We can see from this equivalence that +the scope of a variable specified by a let expression is the body of +the let. +This implies that:

                                                                                    + +

                                                                                      +
                                                                                    • Let allows one to +bind variables as locally as possible to where they +are to be used. For example, if the value of x is 5, +the value of the expression

                                                                                      + +

                                                                                      (+ (let ((x 3))
                                                                                      +     (+ x (* x 10)))
                                                                                      +   x)
                                                                                      +

                                                                                      + +is 38. Here, the x in the body of the let is 3, +so the value of the let expression is 33. On the other hand, the +x that is the second argument to the outermost + is still 5.

                                                                                      + +

                                                                                    • The variables' values are computed outside the let. +This matters when the expressions that +provide the values for the local variables depend upon +variables having the same names as the local variables themselves. +For example, if the value of x is 2, the expression

                                                                                      + +

                                                                                      (let ((x 3)
                                                                                      +      (y (+ x 2)))
                                                                                      +  (* x y))
                                                                                      +

                                                                                      +will have the value 12 because, inside the body of the let, +x will be 3 and y will be 4 (which is the +outer x plus 2). +

                                                                                    + + +Sometimes we can use internal definitions to get the same effect as +with let. For example, we could have defined the procedure f above as +

                                                                                    (define (f x y)
                                                                                    +  (define a (+ 1 (* x y)))
                                                                                    +  (define b (- 1 y))
                                                                                    +  (+ (* x (square a))
                                                                                    +     (* y b)
                                                                                    +     (* a b)))
                                                                                    +

                                                                                    +We prefer, however, to use let in situations like this +and to use internal define only for internal procedures.54

                                                                                    + +

                                                                                    +Exercise 1.34.  Suppose we define the procedure

                                                                                    + +

                                                                                    (define (f g)
                                                                                    +  (g 2))
                                                                                    +

                                                                                    +Then we have

                                                                                    + +

                                                                                    (f square)
                                                                                    +4
                                                                                    +
                                                                                    +(f (lambda (z) (* z (+ z 1))))
                                                                                    +6
                                                                                    +

                                                                                    +What happens if we (perversely) ask the interpreter to evaluate the +combination (f f)? Explain. +

                                                                                    + + +

                                                                                    1.3.3  Procedures as General Methods

                                                                                    + + + +We introduced compound procedures in +section 1.1.4 as a mechanism for abstracting +patterns of numerical operations so as to make them independent of the +particular numbers involved. With higher-order procedures, such as +the integral procedure of +section 1.3.1, we began to see a more +powerful kind of abstraction: procedures used to express general +methods of computation, independent of the particular functions +involved. In this section we discuss two more elaborate +examples -- general methods for finding zeros and fixed points of +functions -- and show how these methods can be expressed directly as +procedures.

                                                                                    + + +

                                                                                    Finding roots of equations by the half-interval method

                                                                                    + + +The half-interval method is a simple but powerful technique for +finding roots of an equation f(x) = 0, where f is a continuous +function. The idea is that, if we are given points a and b such +that f(a) < 0 < f(b), then f must have at least one zero between +a and b. To locate a zero, let x be the average of a and b +and compute f(x). If f(x) > 0, then f must have a zero between +a and x. If f(x) < 0, then f must have a zero between x and +b. Continuing in this way, we can identify smaller and smaller +intervals on which f must have a zero. When we reach a point where +the interval is small enough, the process stops. Since the interval +of uncertainty is reduced by half at each step of the process, the +number of steps required grows as (log( L/T)), where L is the +length of the original interval and T is the error tolerance +(that is, the size of the interval we will consider ``small enough''). +Here is a procedure that implements this strategy:

                                                                                    + + +

                                                                                    (define (search f neg-point pos-point)
                                                                                    +  (let ((midpoint (average neg-point pos-point)))
                                                                                    +    (if (close-enough? neg-point pos-point)
                                                                                    +        midpoint
                                                                                    +        (let ((test-value (f midpoint)))
                                                                                    +          (cond ((positive? test-value)
                                                                                    +                 (search f neg-point midpoint))
                                                                                    +                ((negative? test-value)
                                                                                    +                 (search f midpoint pos-point))
                                                                                    +                (else midpoint))))))
                                                                                    +

                                                                                    + +We assume that we are initially given the function f together with +points at which its values are negative and positive. We first +compute the midpoint of the two given points. Next we check to see if +the given interval is small enough, and if so we simply return the +midpoint as our answer. Otherwise, we compute as a test value the +value of f at the midpoint. If the test value is positive, then +we continue the process with a new interval running from the original +negative point to the midpoint. If the test value is negative, we +continue with the interval from the midpoint to the positive point. +Finally, there is the possibility that the test value is 0, in which +case the midpoint is itself the root we are searching for.

                                                                                    + + +To test whether the endpoints are ``close enough'' we can use a +procedure similar to the one used in section 1.1.7 for +computing square roots:55

                                                                                    + +

                                                                                    (define (close-enough? x y)
                                                                                    +  (< (abs (- x y)) 0.001))
                                                                                    +

                                                                                    + +Search is awkward to use directly, because +we can accidentally give it points at which f's +values do not have the required sign, in which case we get a wrong answer. +Instead we will use search via the following procedure, which +checks to see which of the endpoints has a negative function value and +which has a positive value, and calls the search procedure +accordingly. If the function has the same sign on the two given +points, the half-interval method cannot be used, in which case the +procedure signals an error.56

                                                                                    + +

                                                                                    (define (half-interval-method f a b)
                                                                                    +  (let ((a-value (f a))
                                                                                    +        (b-value (f b)))
                                                                                    +    (cond ((and (negative? a-value) (positive? b-value))
                                                                                    +           (search f a b))
                                                                                    +          ((and (negative? b-value) (positive? a-value))
                                                                                    +           (search f b a))
                                                                                    +          (else
                                                                                    +           (error "Values are not of opposite sign" a b)))))
                                                                                    +

                                                                                    + +The following example uses the half-interval method to approximate +as the root between 2 and 4 of sin x = 0:

                                                                                    + +

                                                                                    (half-interval-method sin 2.0 4.0)
                                                                                    +3.14111328125
                                                                                    +

                                                                                    + +Here is another example, using the half-interval method +to search for a root of the equation x3 - 2x - 3 = 0 +between 1 and 2:

                                                                                    + +

                                                                                    (half-interval-method (lambda (x) (- (* x x x) (* 2 x) 3))
                                                                                    +                      1.0
                                                                                    +                      2.0)
                                                                                    +1.89306640625
                                                                                    +

                                                                                    + + +

                                                                                    Finding fixed points of functions

                                                                                    + + +A number x is called a fixed point of a function f if x +satisfies the equation f(x) = x. For some functions f we can locate +a fixed point by beginning with an initial guess and applying f +repeatedly,

                                                                                    + +

                                                                                    + +until the value does not change very much. Using this idea, we can +devise a procedure fixed-point that takes as inputs a function +and an initial guess and produces an approximation to a fixed point of +the function. We apply the function repeatedly until we find two +successive values whose difference is less than some prescribed +tolerance:

                                                                                    + + +

                                                                                    (define tolerance 0.00001)
                                                                                    +(define (fixed-point f first-guess)
                                                                                    +  (define (close-enough? v1 v2)
                                                                                    +    (< (abs (- v1 v2)) tolerance))
                                                                                    +  (define (try guess)
                                                                                    +    (let ((next (f guess)))
                                                                                    +      (if (close-enough? guess next)
                                                                                    +          next
                                                                                    +          (try next))))
                                                                                    +  (try first-guess))
                                                                                    +

                                                                                    +For example, we can use this method to approximate the fixed point of +the cosine function, starting with 1 as an initial approximation:57

                                                                                    + + +

                                                                                    (fixed-point cos 1.0)
                                                                                    +.7390822985224023
                                                                                    +

                                                                                    +Similarly, we can find a solution to the equation +y = sin y + cos y:

                                                                                    + + +

                                                                                    (fixed-point (lambda (y) (+ (sin y) (cos y)))
                                                                                    +             1.0)
                                                                                    +1.2587315962971173
                                                                                    +

                                                                                    + + +The fixed-point process is reminiscent of the process we used for +finding square roots in section 1.1.7. Both are based on the +idea of repeatedly improving a guess until the result satisfies some +criterion. In fact, we can readily formulate the square-root +computation as a fixed-point search. Computing the square root of +some number x requires finding a y such that y2 = x. Putting +this equation into the equivalent form y = x/y, we recognize that we +are looking for a fixed point of the function58 y x/y, and we +can therefore try to compute square roots as

                                                                                    + + +

                                                                                    (define (sqrt x)
                                                                                    +  (fixed-point (lambda (y) (/ x y))
                                                                                    +               1.0))
                                                                                    +

                                                                                    + +Unfortunately, this fixed-point search does not converge. Consider an +initial guess y1. The next guess is y2 = x/y1 and the next +guess is y3 = x/y2 = x/(x/y1) = y1. This results in an infinite +loop in which the two guesses y1 and y2 repeat over and over, +oscillating about the answer.

                                                                                    + +One way to control such oscillations is to prevent the guesses from +changing so much. +Since the answer is always between our guess y +and x/y, we can make a new guess that is not as far from y as x/y +by averaging y with x/y, so that the next guess after +y is (1/2)(y + x/y) instead of x/y. +The process of making such a sequence of guesses is simply the process +of looking for a fixed point of y (1/2)(y + x/y):

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (fixed-point (lambda (y) (average y (/ x y)))
                                                                                    +               1.0))
                                                                                    +

                                                                                    +(Note that y = (1/2)(y + x/y) is a simple transformation of the +equation y = x/y; to derive it, add y to both sides of the equation +and divide by 2.)

                                                                                    + +With this modification, the square-root procedure works. In fact, if +we unravel the definitions, we can see that the sequence of +approximations to the square root generated here is precisely the +same as the one generated by our original square-root procedure of +section 1.1.7. This approach of averaging +successive approximations to a solution, a technique we that we call +average damping, often aids the convergence of fixed-point +searches.

                                                                                    + +

                                                                                    +Exercise 1.35.  Show that the golden ratio (section 1.2.2) +is a fixed point of the transformation x 1 + 1/x, and use +this fact to compute by means of the fixed-point +procedure. +

                                                                                    + +

                                                                                    +Exercise 1.36.  Modify fixed-point so that it prints the sequence of +approximations it generates, using +the newline and display primitives shown in +exercise 1.22. Then find a solution to xx = +1000 by finding a fixed point of x log(1000)/log(x). (Use +Scheme's primitive log procedure, which computes natural +logarithms.) Compare the number of steps this takes with and without +average damping. (Note that you cannot start fixed-point with a +guess of 1, as this would cause division by log(1) = 0.) + +

                                                                                    + +

                                                                                    +Exercise 1.37.  a. An infinite continued fraction is an expression of the form +

                                                                                    +As an example, one can show that the infinite continued fraction +expansion with the Ni and the Di all equal to 1 produces +1/, where is the golden ratio (described in +section 1.2.2). +One way to approximate an +infinite continued fraction is to truncate the expansion after a given +number of terms. Such a truncation -- a so-called k-term finite +continued fraction -- has the form +

                                                                                    +Suppose that n and d are procedures of one argument (the +term index i) that return the Ni and Di of the terms of the +continued fraction. Define a procedure cont-frac +such that evaluating (cont-frac n d k) +computes the value of the k-term finite +continued fraction. Check your procedure by approximating 1/ using +

                                                                                    (cont-frac (lambda (i) 1.0)
                                                                                    +           (lambda (i) 1.0)
                                                                                    +           k)
                                                                                    +

                                                                                    +for successive values of k. How large must you make k +in order to get an approximation that is accurate to 4 decimal places?

                                                                                    + +

                                                                                    b. If your cont-frac +procedure generates a recursive process, write one that generates +an iterative process. +If it generates an iterative process, write one that generates +a recursive process. + +

                                                                                    + +

                                                                                    +Exercise 1.38.  In 1737, the Swiss mathematician Leonhard Euler published a memoir +De Fractionibus Continuis, which included a continued fraction +expansion for e - 2, where e is the base of the natural logarithms. +In this fraction, the Ni are all 1, and the Di are successively +1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, .... Write a program that uses +your cont-frac procedure from +exercise 1.37 to approximate e, based on +Euler's expansion. +

                                                                                    + +

                                                                                    +Exercise 1.39.  A continued fraction representation of the tangent function was +published in 1770 by the German mathematician J.H. Lambert: +

                                                                                    +where x is in radians. +Define a procedure (tan-cf x k) that computes an approximation +to the tangent function based on Lambert's +formula. K specifies the number of terms to compute, as in +exercise 1.37. +

                                                                                    + + +

                                                                                    1.3.4  Procedures as Returned Values

                                                                                    + + + +The above examples demonstrate how +the ability to pass procedures as arguments significantly enhances +the expressive power of our programming language. We can achieve even +more expressive power by creating procedures whose returned values are +themselves procedures.

                                                                                    + +We can illustrate this idea by looking again at the fixed-point +example described at the end of +section 1.3.3. We formulated a new version +of the square-root procedure as a fixed-point search, starting with +the observation that x is a fixed-point of the function +y x/y. Then we used average damping to make the +approximations converge. Average damping is a useful general +technique in itself. Namely, given a function f, we consider the +function whose value at x is equal to the average of x and f(x).

                                                                                    + + +We can express the idea of average damping by means of the +following procedure:

                                                                                    + +

                                                                                    (define (average-damp f)
                                                                                    +  (lambda (x) (average x (f x))))
                                                                                    +

                                                                                    +Average-damp is a procedure that takes as its argument a +procedure f and returns as its value a procedure (produced by +the lambda) that, when applied to a number x, produces the +average of x and (f x). For example, applying average-damp to the square procedure produces a procedure whose +value at some number x is the average of x and x2. Applying +this resulting procedure to 10 returns the average of 10 and 100, or +55:59

                                                                                    + + +

                                                                                    ((average-damp square) 10)
                                                                                    +55
                                                                                    +

                                                                                    + +Using average-damp, we can reformulate the square-root procedure +as follows:

                                                                                    + + +

                                                                                    (define (sqrt x)
                                                                                    +  (fixed-point (average-damp (lambda (y) (/ x y)))
                                                                                    +               1.0))
                                                                                    +

                                                                                    +Notice how this formulation makes explicit the three ideas in the +method: fixed-point search, average damping, and the function +y x/y. It is instructive to compare this formulation of the +square-root method with the original version given in +section 1.1.7. Bear in mind that these procedures express +the same process, and notice how much clearer the idea becomes when we +express the process in terms of these abstractions. In general, there +are many ways to formulate a process as a procedure. Experienced +programmers know how to choose procedural formulations that are +particularly perspicuous, and where useful elements of the process are +exposed as separate entities that can be reused in other applications. +As a simple example of reuse, notice that the cube root of x is a +fixed point of the function y x/y2, so we can immediately +generalize our square-root procedure to one that extracts cube +roots:60

                                                                                    + + +

                                                                                    (define (cube-root x)
                                                                                    +  (fixed-point (average-damp (lambda (y) (/ x (square y))))
                                                                                    +               1.0))
                                                                                    +

                                                                                    + + + +

                                                                                    Newton's method

                                                                                    + + +When we first introduced the square-root procedure, in +section 1.1.7, we mentioned that this was a special case of +Newton's method. +If x g(x) is a differentiable function, then a solution of +the equation g(x) = 0 is a fixed point of the function x f(x) +where +

                                                                                    +and +Dg(x) is the derivative of g evaluated at x. Newton's +method is the use of the fixed-point method we saw above to +approximate a solution of the equation by finding a fixed point of +the function f.61 +For many functions g and for sufficiently good initial guesses for +x, Newton's method converges very rapidly to a solution of +g(x) = 0.62

                                                                                    + +In order to implement Newton's method as a procedure, we must first +express the idea of derivative. Note that ``derivative,'' like +average damping, is something that transforms a function into another +function. For instance, the derivative of the function x +x3 is the function x 3x2. In general, if g is a +function and dx is a small number, then the derivative Dg of g is +the function whose value at any number x is given (in the limit of +small dx) by +

                                                                                    +Thus, we can express the idea of derivative (taking dx to be, say, +0.00001) as the procedure

                                                                                    + +

                                                                                    (define (deriv g)
                                                                                    +  (lambda (x)
                                                                                    +    (/ (- (g (+ x dx)) (g x))
                                                                                    +       dx)))
                                                                                    +

                                                                                    +along with the definition

                                                                                    + +

                                                                                    (define dx 0.00001)
                                                                                    +

                                                                                    + +Like average-damp, deriv is a procedure that takes a +procedure as argument and returns a procedure as value. For example, +to approximate the derivative of x x3 at 5 (whose exact +value is 75) we can evaluate

                                                                                    + +

                                                                                    (define (cube x) (* x x x))
                                                                                    +((deriv cube) 5)
                                                                                    +75.00014999664018
                                                                                    +

                                                                                    + +With the aid of deriv, we can express Newton's method as a +fixed-point process:

                                                                                    + +

                                                                                    (define (newton-transform g)
                                                                                    +  (lambda (x)
                                                                                    +    (- x (/ (g x) ((deriv g) x)))))
                                                                                    +(define (newtons-method g guess)
                                                                                    +  (fixed-point (newton-transform g) guess))
                                                                                    +

                                                                                    +The newton-transform procedure expresses the formula at the +beginning of this section, and newtons-method is readily defined +in terms of this. It takes as arguments a procedure that computes the +function for which we want to find a zero, together with an initial +guess. For instance, to find the square root of x, we can use +Newton's method to find a zero of the function y y2 - x starting with +an initial guess of 1.63 +This provides yet another form of the square-root +procedure:

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (newtons-method (lambda (y) (- (square y) x))
                                                                                    +                  1.0))
                                                                                    +

                                                                                    + + +

                                                                                    Abstractions and first-class procedures

                                                                                    + +We've seen two ways to express the square-root +computation as an instance of a more general method, once as a fixed-point +search and once using Newton's method. Since Newton's method +was itself expressed as a fixed-point process, +we actually saw two ways to compute square roots as fixed points. +Each method begins with a function and finds a fixed +point of some transformation of the function. We can express this +general idea itself as a procedure:

                                                                                    + +

                                                                                    (define (fixed-point-of-transform g transform guess)
                                                                                    +  (fixed-point (transform g) guess))
                                                                                    +

                                                                                    +This very general procedure takes as its arguments a procedure g +that computes some function, a procedure that transforms g, and +an initial guess. The returned result is a fixed point of the +transformed function.

                                                                                    + +Using this abstraction, we can recast the first square-root +computation from this section (where we look for +a fixed point of the average-damped version of y x/y) +as an instance of this general method:

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (fixed-point-of-transform (lambda (y) (/ x y))
                                                                                    +                            average-damp
                                                                                    +                            1.0))
                                                                                    +

                                                                                    +Similarly, we can express the second square-root computation from this section +(an instance +of Newton's method that finds a fixed point of the +Newton transform of y y2 - x) as

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (fixed-point-of-transform (lambda (y) (- (square y) x))
                                                                                    +                            newton-transform
                                                                                    +                            1.0))
                                                                                    +

                                                                                    + +We began section 1.3 with the observation +that compound procedures +are a crucial abstraction mechanism, because they permit us to +express general methods of computing as explicit elements in our +programming language. Now we've seen how higher-order +procedures permit us to manipulate these general methods +to create further abstractions.

                                                                                    + +As programmers, we should be alert to opportunities to identify the +underlying abstractions in our programs and to build upon them and +generalize them to create more powerful abstractions. This is not to +say that one should always write programs in the most abstract way +possible; expert programmers know how to choose the level of +abstraction appropriate to their task. But it is important to be able +to think in terms of these abstractions, so that we can be ready to +apply them in new contexts. The significance of higher-order +procedures is that they enable us to represent these abstractions +explicitly as elements in our programming language, so that they can +be handled just like other computational elements.

                                                                                    + +In general, programming languages impose restrictions on the ways in +which computational elements can be manipulated. Elements with the +fewest restrictions are said to have first-class status. Some +of the ``rights and privileges'' of first-class elements are:64 +

                                                                                      +
                                                                                    • They may be named by variables. +
                                                                                    • They may be passed as arguments to procedures. +
                                                                                    • They may be returned as the results of procedures. +
                                                                                    • They may be included in data structures.65 +

                                                                                    +Lisp, unlike other common programming languages, awards procedures +full first-class status. This poses challenges for efficient +implementation, but the resulting gain in expressive power is +enormous.66

                                                                                    + +

                                                                                    +Exercise 1.40.  Define a procedure cubic that can be used together with the newtons-method procedure in expressions of the form

                                                                                    + + +

                                                                                    (newtons-method (cubic a b c) 1)
                                                                                    +

                                                                                    +to approximate zeros of the cubic x3 + ax2 + bx + c. +

                                                                                    + +

                                                                                    +Exercise 1.41.  Define a procedure double that takes a procedure of one +argument as argument and +returns a procedure that applies the original procedure twice. For +example, if inc is a procedure that adds 1 to its argument, +then (double inc) should be a procedure that adds 2. What +value is returned by

                                                                                    + + +

                                                                                    (((double (double double)) inc) 5)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 1.42.  Let f and g be two one-argument functions. The composition +f after g is defined to be the function x f(g(x)). +Define a procedure compose that implements composition. For +example, if inc is a procedure that adds 1 to its argument, + +

                                                                                    ((compose square inc) 6)
                                                                                    +49
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    +Exercise 1.43.  If f is a numerical function and n is a positive integer, then we +can form the nth repeated application of f, which is defined to be +the function whose value at x is f(f(...(f(x))...)). For +example, if f is the function x x + 1, +then the nth repeated application of f is +the function x x + n. If f is the operation of +squaring a number, then the nth repeated application of f is the +function that raises its argument to the 2nth power. Write a +procedure that takes as inputs a procedure that computes f and a +positive integer n and returns the procedure that computes the nth +repeated application of f. Your procedure should be able to be used +as follows:

                                                                                    + + +

                                                                                    ((repeated square 2) 5)
                                                                                    +625
                                                                                    +

                                                                                    +Hint: You may find it convenient to use compose from +exercise 1.42. + +

                                                                                    + +

                                                                                    +Exercise 1.44.  The idea of smoothing a function is an important concept in +signal processing. If f is a function and dx is some small number, +then the smoothed version of f is the function whose value at a +point x is the average of f(x - dx), f(x), and f(x + dx). Write a +procedure smooth that takes as input a procedure that computes +f and returns a procedure that computes the smoothed f. It is +sometimes valuable to repeatedly smooth a function (that is, smooth +the smoothed function, and so on) to obtained the n-fold +smoothed function. Show how to generate the n-fold smoothed +function of any given function using smooth and repeated +from exercise 1.43. +

                                                                                    + +

                                                                                    +Exercise 1.45.  We saw in section 1.3.3 +that attempting to compute square roots by naively finding a +fixed point of y x/y does not converge, and that this can be +fixed by average damping. The same method works for finding cube +roots as fixed points of the average-damped y x/y2. +Unfortunately, the process does not work for fourth roots -- a single +average damp is not enough to make a fixed-point search for y +x/y3 converge. On the other hand, if we average damp twice (i.e., +use the average damp of the average damp of y x/y3) the +fixed-point search does converge. Do some experiments to determine +how many average damps are required to compute nth roots as a +fixed-point search based upon repeated average damping of y +x/yn-1. Use this to implement a simple procedure for computing +nth roots using fixed-point, average-damp, and the repeated procedure of exercise 1.43. +Assume that any arithmetic operations you need are available as primitives. + +

                                                                                    + +

                                                                                    +Exercise 1.46.  Several of the numerical methods described in this chapter are instances +of an extremely general computational strategy known as iterative +improvement. Iterative improvement says that, to compute something, +we start with an initial guess for the answer, test if the guess is +good enough, and otherwise improve the guess and continue the process +using the improved guess as the new guess. Write a procedure iterative-improve that takes two procedures as arguments: a method +for telling whether a guess is good enough and a method for improving +a guess. Iterative-improve should return as its value a +procedure that takes a guess as argument and keeps improving the guess +until it is good enough. Rewrite the sqrt procedure of +section 1.1.7 and the fixed-point procedure of +section 1.3.3 in terms of iterative-improve. +

                                                                                    +

                                                                                    + + +


                                                                                    +

                                                                                    49 This series, +usually written in the equivalent form (/4) = 1 - (1/3) + (1/5) - (1/7) + ···, is due to Leibniz. We'll see how +to use this as the basis for some fancy numerical tricks in +section 3.5.3. + +

                                                                                    50 Notice +that we have used block structure (section 1.1.8) to +embed the definitions of pi-next and pi-term within pi-sum, since these procedures are unlikely to be useful for any +other purpose. We will see how to get rid of them altogether in +section 1.3.2. + +

                                                                                    51 The intent of +exercises 1.31-1.33 is to +demonstrate the expressive power that is attained by using an +appropriate abstraction to consolidate many seemingly disparate +operations. However, though accumulation and filtering are elegant +ideas, our hands are somewhat tied in using them at this point since +we do not yet have data structures to provide suitable means of +combination for these abstractions. We will return to these ideas in +section 2.2.3 when we show how +to use sequences as interfaces for combining filters and +accumulators to build even more powerful abstractions. We will see +there how these methods really come into their own as a powerful and +elegant approach to designing programs. + +

                                                                                    52 This formula was discovered by the seventeenth-century +English mathematician John Wallis. + +

                                                                                    53 It would be clearer and less intimidating to +people learning Lisp if a name more obvious than lambda, such as +make-procedure, were used. But the convention is firmly +entrenched. The notation is adopted from the calculus, a +mathematical formalism introduced by the mathematical logician Alonzo +Church (1941). Church developed the calculus to provide a +rigorous foundation for studying the notions of function and function +application. The calculus has become a basic tool for +mathematical investigations of the semantics of programming +languages. + +

                                                                                    54 Understanding internal definitions well enough to be sure a +program means what we intend it to mean requires a more elaborate +model of the evaluation process than we have presented in this +chapter. The subtleties do not arise with internal definitions of +procedures, however. We will return to this issue in +section 4.1.6, after we learn more about +evaluation. + +

                                                                                    55 We have used 0.001 as a representative ``small'' number to indicate a +tolerance for the acceptable error in a calculation. The appropriate +tolerance for a real calculation depends upon the problem to be solved +and the limitations of the computer and the algorithm. This is often +a very subtle consideration, requiring help from a numerical analyst +or some other kind of magician. + +

                                                                                    56 This +can be accomplished using error, which takes as +arguments a number of items that are printed as error +messages. + +

                                                                                    57 Try this during a boring lecture: Set your calculator to +radians mode and then repeatedly press the cos button until you +obtain the fixed point. + +

                                                                                    58 +(pronounced ``maps to'') is +the mathematician's way of writing lambda. +y x/y means (lambda(y) (/ x y)), that is, the +function whose value at y is x/y. + +

                                                                                    59 Observe that this is a combination whose operator is itself +a combination. Exercise 1.4 already demonstrated +the ability to form such combinations, but that was only a toy +example. Here we begin to see the real need for such +combinations -- when applying a procedure that is obtained as the value +returned by a higher-order procedure. + +

                                                                                    60 See exercise 1.45 for a further +generalization. + +

                                                                                    61 Elementary calculus books usually describe Newton's +method in terms of the sequence of approximations +xn+1 = xn - g(xn)/Dg(xn). Having language for talking about +processes and using the idea of fixed points simplifies the description +of the method. + +

                                                                                    62 Newton's method does not always converge to an answer, but +it can be shown that in favorable cases each iteration doubles the +number-of-digits accuracy of the approximation to the solution. +In such cases, Newton's method will converge much more +rapidly than the half-interval method. + +

                                                                                    63 For finding square roots, Newton's method converges rapidly to the +correct solution from any starting point. + +

                                                                                    64 The notion of first-class status of programming-language +elements is due to the British computer scientist Christopher +Strachey (1916-1975). + +

                                                                                    65 We'll see +examples of this after we introduce data structures in chapter 2. + +

                                                                                    66 The major implementation cost of first-class +procedures is that allowing procedures to be returned as values +requires reserving storage for a procedure's free variables even while +the procedure is not executing. In the Scheme implementation we will +study in section 4.1, these variables are stored in the +procedure's environment. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-13.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-13.html new file mode 100644 index 00000000..bfbfda14 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-13.html @@ -0,0 +1,218 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +

                                                                                    +Building Abstractions with Data

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + +

                                                                                    + +We now come to the decisive step of mathematical abstraction: we +forget about what the symbols stand for. ...[The mathematician] +need not be idle; there are many operations which he may carry out +with these symbols, without ever having to look at the things they +stand for.

                                                                                    + +Hermann Weyl, The Mathematical Way of Thinking

                                                                                    + + +

                                                                                    +
                                                                                    + +

                                                                                    + +We concentrated in chapter 1 on computational processes and on the +role of procedures in program design. We saw how to use primitive +data (numbers) and primitive operations (arithmetic operations), how to +combine procedures to form compound procedures through composition, +conditionals, and the use of parameters, and how to abstract +procedures by using define. We saw that a procedure can be +regarded as a pattern for the local evolution of a process, and we +classified, reasoned about, and performed simple algorithmic analyses +of some common patterns for processes as embodied in procedures. We +also saw that higher-order procedures enhance the power of our +language by enabling us to manipulate, and thereby to reason in terms +of, general methods of computation. This is much of the essence of +programming.

                                                                                    + +In this chapter we are going to look at more complex data. All the +procedures in chapter 1 operate on simple numerical data, and simple +data are not sufficient for many of the problems we wish to address +using computation. Programs are typically designed to model complex +phenomena, and more often than not one must construct computational +objects that have several parts in order to model real-world phenomena +that have several aspects. Thus, whereas our focus in chapter 1 was +on building abstractions by combining procedures to form compound +procedures, we turn in this chapter to another key aspect of any +programming language: the means it provides for building abstractions +by combining data objects to form compound data.

                                                                                    + +Why do we want compound data in a programming language? For the same +reasons that we want compound procedures: to elevate the conceptual +level at which we can design our programs, to increase the modularity +of our designs, and to enhance the expressive power of our language. +Just as the ability to define procedures enables us to deal with +processes at a higher conceptual level than that of the primitive +operations of the language, the ability to construct compound data +objects enables us to deal with data at a higher conceptual level than +that of the primitive data objects of the language.

                                                                                    + +Consider the task of designing a system to perform arithmetic with +rational numbers. We could imagine an operation add-rat that takes +two rational numbers and produces their sum. In terms of +simple data, a rational number can be thought of as two integers: a +numerator and a denominator. Thus, we could design a program in which +each rational number would be represented by two integers (a numerator +and a denominator) and where add-rat would be implemented by two +procedures (one producing the numerator of the sum and one producing +the denominator). But this would be awkward, because we would then +need to explicitly keep track of which numerators corresponded to +which denominators. In a system intended to perform many operations +on many rational numbers, such bookkeeping details would clutter the +programs substantially, to say nothing of what they would do to our +minds. It would be much better if we could ``glue together'' a +numerator and denominator to form a pair -- a compound data +object -- that our programs could manipulate in a way that would be +consistent with regarding a rational number as a single conceptual +unit.

                                                                                    + +The use of compound data also enables us to increase the modularity of +our programs. If we can manipulate rational numbers directly as +objects in their own right, then we can separate the part of our +program that deals with rational numbers per se from the details of +how rational numbers may be represented as pairs of integers. The +general technique of isolating the parts of a program that deal with +how data objects are represented from the parts of a program that deal +with how data objects are used is a powerful design methodology called +data abstraction. We will see how data abstraction makes +programs much easier to design, maintain, and modify.

                                                                                    + +The use of compound data leads to a real increase in the expressive +power of our programming language. Consider the idea of forming a +``linear combination'' ax + by. We might like to write a procedure +that would accept a, b, x, and y as arguments and return the +value of ax + by. This presents no difficulty if the arguments are to +be numbers, because we can readily define the procedure

                                                                                    + +

                                                                                    (define (linear-combination a b x y) 
                                                                                    +  (+ (* a x) (* b y)))
                                                                                    +

                                                                                    +But suppose we are not concerned only with numbers. Suppose we would +like to express, in procedural terms, the idea that one can form +linear combinations whenever addition and multiplication are +defined -- for rational numbers, complex numbers, polynomials, or +whatever. We could express this as a procedure of the form

                                                                                    + +

                                                                                    (define (linear-combination a b x y)     
                                                                                    +  (add (mul a x) (mul b y))) 
                                                                                    +

                                                                                    +where add and mul are not the primitive procedures + +and * but rather more complex things that will perform the +appropriate operations for whatever kinds of data we pass in as the +arguments a, b, x, and y. The key point is +that the only thing linear-combination should need to know about +a, b, x, and y is that the procedures add +and mul will perform the appropriate manipulations. From the +perspective of the procedure linear-combination, it is +irrelevant what a, b, x, and y are and even +more irrelevant how they might happen to be represented in terms of +more primitive data. This same example shows why it is important that +our programming language provide the ability to manipulate compound +objects directly: Without this, there is no way for a procedure such +as linear-combination to pass its arguments along to add +and mul without having to know their detailed +structure.1 + +We begin this chapter by implementing the rational-number arithmetic +system mentioned above. This will form the background for our +discussion of compound data and data abstraction. As with compound +procedures, the main issue to be addressed is that of abstraction as a +technique for coping with complexity, and we will see how data +abstraction enables us to erect suitable abstraction barriers +between different parts of a program.

                                                                                    + +We will see that the key to forming compound data is that a +programming language should provide some kind of ``glue'' so that data +objects can be combined to form more complex data objects. There are +many possible kinds of glue. Indeed, we will discover how to form +compound data using no special ``data'' operations at all, only +procedures. This will further blur the distinction between +``procedure'' and ``data,'' which was already becoming tenuous toward +the end of chapter 1. We will also explore some conventional +techniques for representing sequences and trees. One key idea in +dealing with compound data is the notion of closure -- that the +glue we use for combining data objects should allow us to combine not +only primitive data objects, but compound data objects as well. +Another key idea is that compound data objects can serve as conventional interfaces for combining program modules in +mix-and-match ways. We illustrate some of these ideas by presenting a +simple graphics language that exploits closure.

                                                                                    + +We will then augment the representational power of our language by +introducing symbolic expressions -- data whose elementary parts +can be arbitrary symbols rather than only numbers. We explore various +alternatives for representing sets of objects. We will find that, +just as a given numerical function can be computed by many different +computational processes, there are many ways in which a given data +structure can be represented in terms of simpler objects, and the +choice of representation can have significant impact on the time and +space requirements of processes that manipulate the data. We will +investigate these ideas in the context of symbolic differentiation, +the representation of sets, and the encoding of information.

                                                                                    + +Next we will take up the problem of working with data that may be +represented differently by different parts of a program. This leads +to the need to implement generic operations, which must handle +many different types of data. Maintaining modularity in the +presence of generic operations requires more powerful abstraction +barriers than can be erected with simple data abstraction alone. In +particular, we introduce data-directed programming as a +technique that allows individual data representations to be designed +in isolation and then combined additively (i.e., without +modification). To illustrate the power of this approach to system +design, we close the chapter by applying what we have learned to the +implementation of a package for performing symbolic arithmetic on +polynomials, in which the coefficients of the polynomials can be +integers, rational numbers, complex numbers, and even other +polynomials.

                                                                                    + +


                                                                                    +

                                                                                    1 The ability to directly manipulate procedures +provides an analogous increase in the expressive power of a +programming language. For example, in +section 1.3.1 we introduced the sum +procedure, which takes a procedure term as an argument and +computes the sum of the values of term over some specified +interval. In order to define sum, it is crucial that we be able +to speak of a procedure such as term as an entity in its own +right, without regard for how term might be expressed with more +primitive operations. Indeed, if we did not have the notion of ``a +procedure,'' it is doubtful that we would ever even think of the +possibility of defining an operation such as sum. Moreover, +insofar as performing the summation is concerned, the details of how +term may be constructed from more primitive operations are +irrelevant. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-14.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-14.html new file mode 100644 index 00000000..525665a0 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-14.html @@ -0,0 +1,765 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    2.1  Introduction to Data Abstraction

                                                                                    + +In section 1.1.8, we noted +that a procedure used as an element in creating a more complex +procedure could be regarded not only as a collection of particular +operations but also as a procedural abstraction. That is, the details +of how the procedure was implemented could be suppressed, and the +particular procedure itself could be replaced by any other procedure +with the same overall behavior. In other words, we could make an +abstraction that would separate the way the procedure would be used +from the details of how the procedure would be implemented in terms of +more primitive procedures. The analogous notion for compound data is +called data abstraction. Data abstraction is a methodology that +enables us to isolate how a compound data object is used from the +details of how it is constructed from more primitive data objects.

                                                                                    + +The basic idea of data abstraction is to structure the programs that +are to use compound data objects so that they operate on ``abstract +data.'' That is, our programs should use data in such a way as to make +no assumptions about the data that are not strictly necessary for +performing the task at hand. At the same time, a ``concrete'' data +representation is defined independent of the programs that use +the data. The interface between these two parts of our system will be +a set of procedures, called selectors and constructors, +that implement the abstract data in terms of the concrete +representation. To illustrate this technique, we will consider how to +design a set of procedures for manipulating rational numbers.

                                                                                    + + +

                                                                                    2.1.1  Example: Arithmetic Operations for Rational Numbers

                                                                                    + +

                                                                                    + +Suppose we want to do arithmetic with rational numbers. We want to be +able to add, subtract, multiply, and divide them and to test whether +two rational numbers are equal.

                                                                                    + +Let us begin by assuming that we already have a way of constructing a +rational number from a numerator and a denominator. We also assume +that, given a rational number, we have a way of extracting (or +selecting) its numerator and its denominator. Let us further assume +that the constructor and selectors are available as procedures:

                                                                                    + +

                                                                                      +
                                                                                    • (make-rat <n> <d>) returns the +rational number whose numerator is the integer <n> +and whose denominator is the integer <d>.

                                                                                      + +

                                                                                    • (numer <x>) returns the numerator of the rational +number <x>.

                                                                                      + +

                                                                                    • (denom <x>) returns the denominator of the +rational number <x>. +

                                                                                    + +We are using here a powerful strategy of synthesis: wishful thinking. +We haven't yet said how a rational number is represented, or how the +procedures numer, denom, and make-rat should be +implemented. Even so, if we did have these three procedures, we could +then add, subtract, multiply, divide, and test equality by using the +following relations:

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +We can express these rules as procedures:

                                                                                    + +

                                                                                    (define (add-rat x y)
                                                                                    +  (make-rat (+ (* (numer x) (denom y))
                                                                                    +               (* (numer y) (denom x)))
                                                                                    +            (* (denom x) (denom y))))
                                                                                    +(define (sub-rat x y)
                                                                                    +  (make-rat (- (* (numer x) (denom y))
                                                                                    +               (* (numer y) (denom x)))
                                                                                    +            (* (denom x) (denom y))))
                                                                                    +(define (mul-rat x y)
                                                                                    +  (make-rat (* (numer x) (numer y))
                                                                                    +            (* (denom x) (denom y))))
                                                                                    +(define (div-rat x y)
                                                                                    +  (make-rat (* (numer x) (denom y))
                                                                                    +            (* (denom x) (numer y))))
                                                                                    +(define (equal-rat? x y)
                                                                                    +  (= (* (numer x) (denom y))
                                                                                    +     (* (numer y) (denom x))))
                                                                                    +

                                                                                    + +Now we have the operations on rational numbers defined in terms of the +selector and constructor procedures +numer, denom, and make-rat. +But we haven't yet defined these. +What we need is some way to glue together a numerator and a +denominator to form a rational +number.

                                                                                    + + +

                                                                                    Pairs

                                                                                    + +To enable us to implement the concrete level of our data +abstraction, our language provides a compound structure called a pair, which can be constructed with the primitive procedure cons. This procedure takes two arguments and returns a compound data +object that contains the two arguments as parts. Given a pair, we can +extract the parts using the primitive procedures car and cdr.2 Thus, we can use cons, car, and cdr as follows:

                                                                                    + + + +

                                                                                    (define x (cons 1 2))
                                                                                    +
                                                                                    +(car x)
                                                                                    +1
                                                                                    +
                                                                                    +(cdr x)
                                                                                    +2
                                                                                    +

                                                                                    +Notice that a pair is a data object that can be given a name and +manipulated, just like a primitive data object. Moreover, cons +can be used to form pairs whose elements are pairs, and so on:

                                                                                    + + +

                                                                                    (define x (cons 1 2))
                                                                                    +
                                                                                    +(define y (cons 3 4))
                                                                                    +
                                                                                    +(define z (cons x y))
                                                                                    +
                                                                                    +(car (car z))
                                                                                    +1
                                                                                    +
                                                                                    +(car (cdr z))
                                                                                    +3
                                                                                    +

                                                                                    +In section 2.2 we will see how this ability to +combine pairs means that pairs can be used as general-purpose building +blocks to create all sorts of complex data structures. The single +compound-data primitive pair, implemented by the procedures cons, car, and cdr, is the only glue we need. Data +objects constructed from pairs are called list-structured data.

                                                                                    + + +

                                                                                    Representing rational numbers

                                                                                    + +Pairs offer a natural way to complete the rational-number system. +Simply represent a rational number as a pair of two integers: a +numerator and a denominator. Then make-rat, numer, and +denom are readily implemented as follows:3

                                                                                    + + +

                                                                                    (define (make-rat n d) (cons n d))
                                                                                    +
                                                                                    +(define (numer x) (car x))
                                                                                    +
                                                                                    +(define (denom x) (cdr x))
                                                                                    +

                                                                                    +Also, in order to display the results of our computations, +we can print rational numbers by printing the numerator, a +slash, and the denominator:4

                                                                                    + +

                                                                                    (define (print-rat x)
                                                                                    +  (newline)
                                                                                    +  (display (numer x))
                                                                                    +  (display "/")
                                                                                    +  (display (denom x)))
                                                                                    +

                                                                                    +Now we can try our rational-number procedures:

                                                                                    + +

                                                                                    (define one-half (make-rat 1 2))
                                                                                    +
                                                                                    +(print-rat one-half)
                                                                                    +1/2
                                                                                    +
                                                                                    +(define one-third (make-rat 1 3))
                                                                                    +(print-rat (add-rat one-half one-third))
                                                                                    +5/6
                                                                                    +
                                                                                    +(print-rat (mul-rat one-half one-third))
                                                                                    +1/6
                                                                                    +
                                                                                    +(print-rat (add-rat one-third one-third))
                                                                                    +6/9
                                                                                    +

                                                                                    + +As the final example shows, our rational-number implementation does +not reduce rational numbers to lowest terms. We can remedy this by +changing make-rat. If we have a gcd procedure like the one +in section 1.2.5 that produces the greatest common divisor of two +integers, we can use gcd to reduce the numerator and the +denominator to lowest terms before constructing the pair:

                                                                                    + +

                                                                                    (define (make-rat n d)
                                                                                    +  (let ((g (gcd n d)))
                                                                                    +    (cons (/ n g) (/ d g))))
                                                                                    +

                                                                                    +Now we have

                                                                                    + +

                                                                                    (print-rat (add-rat one-third one-third))
                                                                                    +2/3
                                                                                    +

                                                                                    +as desired. This modification was accomplished by changing the +constructor make-rat without changing any of the procedures +(such as add-rat and mul-rat) +that implement the actual operations.

                                                                                    + +

                                                                                    +Exercise 2.1.  Define a better version of make-rat that +handles both positive and negative arguments. Make-rat should +normalize the sign so that if the rational number is positive, both +the numerator and denominator are positive, and if the rational number +is negative, only the numerator is negative. +

                                                                                    + + +

                                                                                    2.1.2  Abstraction Barriers

                                                                                    + +

                                                                                    + +Before continuing with more examples of compound data and data +abstraction, let us consider some of the issues raised by the +rational-number example. We defined the rational-number operations in +terms of a constructor make-rat and selectors numer and +denom. In general, the underlying idea of data abstraction is +to identify for each type of data object a basic set of operations in +terms of which all manipulations of data objects of that type will be +expressed, and then to use only those operations in manipulating the +data.

                                                                                    + +We can envision the structure of the rational-number system as +shown in figure 2.1. The +horizontal lines represent abstraction barriers that isolate +different ``levels'' of the system. At each level, the barrier +separates the programs (above) that use the data abstraction from the +programs (below) that implement the data abstraction. Programs that +use rational numbers manipulate them solely in terms of the procedures +supplied ``for public use'' by the rational-number package: add-rat, sub-rat, mul-rat, div-rat, and equal-rat?. These, in turn, are implemented solely in terms of the +constructor and selectors make-rat, numer, and denom, which themselves are implemented in terms of pairs. The +details of how pairs are implemented are irrelevant to the rest of the +rational-number package so long as pairs can be manipulated by the use +of cons, car, and cdr. In effect, procedures at +each level are the interfaces that define the abstraction barriers and +connect the different levels.

                                                                                    + +

                                                                                     
                                                                                    + +
                                                                                    Figure 2.1:  Data-abstraction barriers in the rational-number package.
                                                                                    + +

                                                                                    + +This simple idea has many advantages. One advantage is that it makes +programs much easier to maintain and to modify. Any complex data +structure can be represented in a variety of ways with the primitive +data structures provided by a programming language. Of course, the +choice of representation influences the programs that operate on it; +thus, if the representation were to be changed at some later time, all +such programs might have to be modified accordingly. This task could +be time-consuming and expensive in the case of large programs unless +the dependence on the representation were to be confined by design to +a very few program modules.

                                                                                    + +For example, an alternate way to address the problem of reducing rational +numbers to lowest terms is to perform the reduction whenever we +access the parts of a rational number, rather than when we construct +it. This leads to different constructor and selector procedures:

                                                                                    + +

                                                                                    (define (make-rat n d)
                                                                                    +  (cons n d))
                                                                                    +(define (numer x)
                                                                                    +  (let ((g (gcd (car x) (cdr x))))
                                                                                    +    (/ (car x) g)))
                                                                                    +(define (denom x)
                                                                                    +  (let ((g (gcd (car x) (cdr x))))
                                                                                    +    (/ (cdr x) g)))
                                                                                    +

                                                                                    +The difference between this implementation and the previous one lies +in when we compute the gcd. +If in our typical use of rational numbers we access the +numerators and denominators of the same rational numbers many +times, it would be preferable +to compute the gcd when the rational numbers are constructed. +If not, we may be better off waiting until access +time to compute the gcd. In any case, when +we change from one representation to the other, the procedures add-rat, sub-rat, and so on do not have to be modified at all.

                                                                                    + + +Constraining the dependence on the representation to a few interface +procedures helps us design programs as well as modify them, +because it allows us to maintain the flexibility to consider alternate +implementations. To continue with our simple example, suppose we are +designing a rational-number package and we can't decide initially +whether to perform the gcd at construction time or at selection +time. The data-abstraction methodology gives us a way to defer that +decision without losing the ability to make progress on the rest of +the system.

                                                                                    + +

                                                                                    +Exercise 2.2.  Consider the problem of representing +line segments in a plane. Each segment is +represented as a pair of points: a starting point and an ending point. +Define a constructor make-segment and selectors start-segment +and end-segment that define the representation of segments in +terms of points. Furthermore, a point can be represented as a pair +of numbers: the x coordinate and the y coordinate. Accordingly, +specify a constructor make-point and selectors x-point and +y-point that define this representation. Finally, using your +selectors and constructors, define a procedure midpoint-segment +that takes a line segment as argument and returns its midpoint (the +point whose coordinates are the average of the coordinates of the +endpoints). +To try your procedures, you'll need a way to print points:

                                                                                    + +

                                                                                    (define (print-point p)
                                                                                    +  (newline)
                                                                                    +  (display "(")
                                                                                    +  (display (x-point p))
                                                                                    +  (display ",")
                                                                                    +  (display (y-point p))
                                                                                    +  (display ")"))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.3.  Implement a representation for rectangles in a plane. +(Hint: You may want to make use of exercise 2.2.) +In terms of +your constructors and selectors, create procedures that compute the +perimeter and the area of a given rectangle. Now implement a +different representation for rectangles. Can you design your system +with suitable abstraction barriers, so that the same perimeter and +area procedures will work using either representation? + +

                                                                                    +

                                                                                    + + +

                                                                                    2.1.3  What Is Meant by Data?

                                                                                    + + + +We began the rational-number implementation in +section 2.1.1 by implementing the rational-number +operations add-rat, sub-rat, and so on in terms of three +unspecified procedures: make-rat, numer, and denom. +At that point, we could think of the operations as being defined in +terms of data objects -- numerators, denominators, and rational +numbers -- whose behavior was specified by the latter three procedures.

                                                                                    + +But exactly what is meant by data? It is not enough to say +``whatever is implemented by the given selectors and constructors.'' +Clearly, not every arbitrary set of three procedures can serve as an +appropriate basis for the rational-number implementation. We need to +guarantee that, if we construct a rational number x from a pair +of integers n and d, then extracting the numer and the +denom of x and dividing them should yield the same result +as dividing n by d. In other words, make-rat, +numer, and denom must satisfy the condition that, for any +integer n and any non-zero integer d, if x is +(make-rat n d), then

                                                                                    + +

                                                                                    + +In fact, this is the only condition make-rat, numer, and +denom must fulfill in order to form a suitable basis for a +rational-number representation. In general, we can think of data as +defined by some collection of selectors and constructors, together +with specified conditions that these procedures must fulfill in order +to be a valid representation.5

                                                                                    + + +This point of view can serve to define not only ``high-level'' data +objects, such as rational numbers, but lower-level objects as well. +Consider the notion of a pair, which we used in order to define our +rational numbers. We never actually said what a pair was, only that +the language supplied procedures cons, car, and cdr +for operating on pairs. But the only thing we need to know about +these three operations is that if we glue two objects together using +cons we can retrieve the objects using car and cdr. +That is, the operations satisfy the condition that, for any objects +x and y, if z is (cons x y) then (car z) +is x and (cdr z) is y. Indeed, we mentioned that +these three procedures are included as primitives in our language. +However, any triple of procedures that satisfies the above condition +can be used as the basis for implementing pairs. This point is +illustrated strikingly by the fact that we could implement cons, +car, and cdr without using any data structures at all but +only using procedures. Here are the definitions:

                                                                                    + +

                                                                                    (define (cons x y)
                                                                                    +  (define (dispatch m)
                                                                                    +    (cond ((= m 0) x)
                                                                                    +          ((= m 1) y)
                                                                                    +          (else (error "Argument not 0 or 1 -- CONS" m))))
                                                                                    +  dispatch)
                                                                                    +
                                                                                    +(define (car z) (z 0))
                                                                                    +
                                                                                    +(define (cdr z) (z 1))
                                                                                    +

                                                                                    +This use of procedures corresponds to nothing like our intuitive +notion of what data should be. Nevertheless, all we need to do to +show that this is a valid way to represent pairs is to verify that +these procedures satisfy the condition given above.

                                                                                    + +The subtle point to notice is that the value returned by (cons x +y) is a procedure -- namely the internally defined procedure dispatch, which takes one argument and returns either x or y depending on whether the argument is 0 or 1. Correspondingly, (car z) is defined to apply z to 0. Hence, if z is the +procedure formed by (cons x y), then z applied to 0 will +yield x. Thus, we have shown that (car (cons x y)) yields +x, as desired. Similarly, (cdr (cons x y)) applies the +procedure returned by (cons x y) to 1, which returns y. +Therefore, this procedural implementation of pairs is a valid +implementation, and if we access pairs using only cons, car, and cdr we cannot distinguish this implementation from one +that uses ``real'' data structures.

                                                                                    + +The point of exhibiting the procedural representation of pairs is not +that our language works this way (Scheme, and Lisp systems in general, +implement pairs directly, for efficiency reasons) but that it could +work this way. The procedural representation, although obscure, is a +perfectly adequate way to represent pairs, since it fulfills the only +conditions that pairs need to fulfill. This example also demonstrates +that the ability to manipulate procedures as objects automatically +provides the ability to represent compound data. This may seem a +curiosity now, but procedural representations of data will play a +central role in our programming repertoire. This style of programming +is often called message passing, and we will be using it as a +basic tool in chapter 3 when we address the issues of modeling and +simulation.

                                                                                    + +

                                                                                    +Exercise 2.4.  Here is an alternative procedural representation of pairs. For this +representation, verify that (car (cons x y)) yields x for +any objects x and y.

                                                                                    + +

                                                                                    (define (cons x y)
                                                                                    +  (lambda (m) (m x y)))
                                                                                    +
                                                                                    +(define (car z)
                                                                                    +  (z (lambda (p q) p)))
                                                                                    +

                                                                                    +What is the corresponding definition of cdr? (Hint: To verify +that this works, make use of the substitution model of +section 1.1.5.) + +

                                                                                    + +

                                                                                    +Exercise 2.5.  Show that we can represent pairs of nonnegative integers using only +numbers and arithmetic operations if we represent the pair a and b +as the integer that is the product 2a 3b. Give the corresponding +definitions of the procedures cons, car, and cdr. +

                                                                                    + +

                                                                                    +Exercise 2.6.  In case representing pairs as procedures wasn't mind-boggling enough, +consider that, in a language that can manipulate procedures, we can +get by without numbers (at least insofar as nonnegative integers are +concerned) by implementing 0 and the operation of adding 1 as

                                                                                    + +

                                                                                    (define zero (lambda (f) (lambda (x) x)))
                                                                                    +
                                                                                    +(define (add-1 n)
                                                                                    +  (lambda (f) (lambda (x) (f ((n f) x)))))
                                                                                    +

                                                                                    +This representation is known as Church numerals, after its +inventor, Alonzo Church, the logician who invented the +calculus.

                                                                                    + +Define one and two directly (not in terms of zero +and add-1). (Hint: Use substitution to evaluate (add-1 zero)). +Give a direct definition of the addition procedure + (not in +terms of repeated application of add-1). +

                                                                                    + + +

                                                                                    2.1.4  Extended Exercise: Interval Arithmetic

                                                                                    + + +Alyssa P. Hacker is designing a system to help people solve +engineering problems. One feature she wants to provide in her system +is the ability to manipulate inexact quantities (such as measured +parameters of physical devices) with known precision, so that when +computations are done with such approximate quantities the results +will be numbers of known precision.

                                                                                    + +Electrical engineers will be using Alyssa's system to compute +electrical quantities. It is sometimes necessary for them to compute +the value of a parallel equivalent resistance Rp of two +resistors R1 and R2 using the formula + +

                                                                                    + +Resistance values are usually known only up to some tolerance +guaranteed by the manufacturer of the resistor. For example, if you +buy a resistor labeled ``6.8 ohms with 10% tolerance'' you can only +be sure that the resistor has a resistance between 6.8 - 0.68 = 6.12 and +6.8 + 0.68 = 7.48 ohms. Thus, if you have a 6.8-ohm 10% resistor in +parallel with a 4.7-ohm 5% resistor, the resistance of the +combination can range from about 2.58 ohms (if the two resistors are +at the lower bounds) to about 2.97 ohms (if the two resistors are at +the upper bounds).

                                                                                    + +Alyssa's idea is to implement ``interval arithmetic'' as a set of +arithmetic operations for combining ``intervals'' (objects +that represent the range of possible values of an inexact quantity). +The result of adding, subtracting, multiplying, or dividing two +intervals is itself an interval, representing the range of the +result.

                                                                                    + +Alyssa postulates the existence of an abstract object called an +``interval'' that has two endpoints: a lower bound and an upper bound. +She also presumes that, given the endpoints of an interval, she can +construct the interval using the data constructor make-interval. +Alyssa first writes a procedure for adding two intervals. She +reasons that the minimum value the sum could be is the sum of the two +lower bounds and the maximum value it could be is the sum of the two +upper bounds:

                                                                                    + +

                                                                                    (define (add-interval x y)
                                                                                    +  (make-interval (+ (lower-bound x) (lower-bound y))
                                                                                    +                 (+ (upper-bound x) (upper-bound y))))
                                                                                    +

                                                                                    +Alyssa also works out the product of two intervals by finding the +minimum and the maximum of the products of the bounds and using them +as the bounds of the resulting interval. (Min and max are +primitives that find the minimum or maximum of any number of +arguments.)

                                                                                    + +

                                                                                    (define (mul-interval x y)
                                                                                    +  (let ((p1 (* (lower-bound x) (lower-bound y)))
                                                                                    +        (p2 (* (lower-bound x) (upper-bound y)))
                                                                                    +        (p3 (* (upper-bound x) (lower-bound y)))
                                                                                    +        (p4 (* (upper-bound x) (upper-bound y))))
                                                                                    +    (make-interval (min p1 p2 p3 p4)
                                                                                    +                   (max p1 p2 p3 p4))))
                                                                                    +

                                                                                    +To divide two intervals, Alyssa multiplies the first by the reciprocal of +the second. Note that the bounds of the reciprocal interval are +the reciprocal of the upper bound and the reciprocal of the lower bound, in +that order.

                                                                                    + +

                                                                                    (define (div-interval x y)
                                                                                    +  (mul-interval x 
                                                                                    +                (make-interval (/ 1.0 (upper-bound y))
                                                                                    +                               (/ 1.0 (lower-bound y)))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.7.  Alyssa's program is incomplete because she has not specified the +implementation of the interval abstraction. Here is a definition of +the interval constructor:

                                                                                    + +

                                                                                    (define (make-interval a b) (cons a b))
                                                                                    +

                                                                                    +Define selectors upper-bound and lower-bound to complete +the implementation. +

                                                                                    + +

                                                                                    +Exercise 2.8.  Using reasoning analogous to Alyssa's, describe how the difference +of two intervals may be computed. Define a corresponding subtraction +procedure, called sub-interval. +

                                                                                    + +

                                                                                    +Exercise 2.9.  The width of an interval is half of the difference between its +upper and lower bounds. The width is a measure of the uncertainty of +the number specified by the interval. For some arithmetic operations +the width of the result of combining two intervals is a function only +of the widths of the argument intervals, whereas for others the width +of the combination is not a function of the widths of the argument +intervals. Show that the width of the sum (or difference) of two +intervals is a function only of the widths of the intervals being +added (or subtracted). Give examples to show that this is not true +for multiplication or division. +

                                                                                    + +

                                                                                    +Exercise 2.10.  Ben Bitdiddle, an expert systems programmer, looks over Alyssa's +shoulder and comments that it is not clear what it means to +divide by an interval that spans zero. Modify Alyssa's code to +check for this condition and to signal an error if it occurs. +

                                                                                    + +

                                                                                    +Exercise 2.11.  In passing, Ben also cryptically comments: ``By testing the signs of +the endpoints of the intervals, it is possible to break mul-interval into nine cases, only one of which requires more than +two multiplications.'' Rewrite this procedure using Ben's +suggestion. +

                                                                                    + +

                                                                                    +After debugging her program, Alyssa shows it to a potential user, +who complains that her program solves the wrong problem. He +wants a program that can deal with numbers represented as a center +value and an additive tolerance; for example, he wants to work with +intervals such as 3.5± 0.15 rather than [3.35, 3.65]. Alyssa +returns to her desk and fixes this problem by supplying an alternate +constructor and alternate selectors:

                                                                                    + +

                                                                                    (define (make-center-width c w)
                                                                                    +  (make-interval (- c w) (+ c w)))
                                                                                    +(define (center i)
                                                                                    +  (/ (+ (lower-bound i) (upper-bound i)) 2))
                                                                                    +(define (width i)
                                                                                    +  (/ (- (upper-bound i) (lower-bound i)) 2))
                                                                                    +

                                                                                    + +Unfortunately, most of Alyssa's users are engineers. Real engineering +situations usually involve measurements with only a small uncertainty, +measured as the ratio of the width of the interval to the midpoint of +the interval. Engineers usually specify percentage tolerances on the +parameters of devices, as in the resistor specifications given +earlier.

                                                                                    + +

                                                                                    +Exercise 2.12.  Define a constructor make-center-percent that takes a center and +a percentage tolerance and produces the desired interval. You must +also define a selector percent that produces the +percentage tolerance for a given interval. The center selector +is the same as the one shown above. + +

                                                                                    + +

                                                                                    +Exercise 2.13.  Show that under the assumption of small percentage tolerances there is +a simple formula for the approximate percentage tolerance of the +product of two intervals in terms of the tolerances of the factors. +You may simplify the problem by assuming that all numbers are +positive. +

                                                                                    + +

                                                                                    After considerable work, Alyssa P. Hacker delivers her finished +system. Several years later, after she has forgotten all about it, she +gets a frenzied call from an irate user, Lem E. Tweakit. +It seems that Lem has +noticed that the formula for parallel resistors can be written in two +algebraically equivalent ways:

                                                                                    + +

                                                                                    + +and

                                                                                    + +

                                                                                    + +He has written the following two programs, each of which computes the +parallel-resistors formula differently:

                                                                                    + +

                                                                                    (define (par1 r1 r2)
                                                                                    +  (div-interval (mul-interval r1 r2)
                                                                                    +                (add-interval r1 r2)))
                                                                                    +(define (par2 r1 r2)
                                                                                    +  (let ((one (make-interval 1 1))) 
                                                                                    +    (div-interval one
                                                                                    +                  (add-interval (div-interval one r1)
                                                                                    +                                (div-interval one r2)))))
                                                                                    +

                                                                                    +Lem complains that Alyssa's program gives different answers for +the two ways of computing. This is a serious complaint.

                                                                                    + +

                                                                                    +Exercise 2.14.  Demonstrate that Lem is right. Investigate the behavior of the +system on a variety of arithmetic expressions. Make some intervals A and B, +and use them in computing the expressions A/A and A/B. You will +get the most insight by using intervals whose width is a small +percentage of the center value. Examine the results of the computation +in center-percent form (see exercise 2.12). +

                                                                                    + +

                                                                                    +Exercise 2.15.  Eva Lu Ator, another user, has also noticed the different intervals +computed by different but algebraically equivalent expressions. She +says that a formula to compute with intervals using Alyssa's system +will produce tighter error bounds if it can be written in such a form +that no variable that represents an uncertain number is repeated. +Thus, she says, par2 is a ``better'' program for parallel +resistances than par1. Is she right? Why? +

                                                                                    + +

                                                                                    +Exercise 2.16.  Explain, in general, why equivalent algebraic expressions may lead to +different answers. Can you devise an interval-arithmetic package that +does not have this shortcoming, or is this task impossible? (Warning: +This problem is very difficult.) +

                                                                                    +

                                                                                    + +


                                                                                    +

                                                                                    2 The name cons stands for ``construct.'' The +names car and cdr derive from the original implementation of +Lisp on the IBM 704. That machine had an addressing scheme that +allowed one to reference the ``address'' and ``decrement'' parts of a +memory location. Car stands for ``Contents of Address part of +Register'' and cdr (pronounced ``could-er'') stands for +``Contents of Decrement part of Register.'' + +

                                                                                    3 Another way to define the selectors and constructor is +

                                                                                    (define make-rat cons)
                                                                                    +(define numer car)
                                                                                    +(define denom cdr)
                                                                                    +

                                                                                    +The first definition associates the name make-rat +with the value of the expression cons, which is the primitive +procedure that constructs pairs. Thus make-rat and cons +are names for the same primitive constructor.

                                                                                    + +Defining selectors and constructors in this way is efficient: +Instead of make-rat calling cons, make-rat +is cons, so there is only one procedure called, not two, +when make-rat is called. On the other hand, doing this defeats debugging +aids that trace procedure calls or put breakpoints on procedure calls: +You may want to watch make-rat being called, but you certainly +don't want to watch every call to cons.

                                                                                    + +We have chosen not to use this style of definition in this book. + +

                                                                                    4 Display is +the Scheme primitive for printing data. The Scheme primitive +newline starts a new line for printing. +Neither of these procedures returns a useful value, so in the uses of +print-rat below, we show only what print-rat prints, +not what the interpreter prints as the value returned by print-rat. + +

                                                                                    5 Surprisingly, this idea is very +difficult to formulate rigorously. There are two approaches to giving +such a formulation. One, pioneered by C. A. R. Hoare (1972), is known +as the method of abstract models. It formalizes the +``procedures plus conditions'' specification as outlined in the +rational-number example above. Note that the condition on the +rational-number representation was stated in terms of facts about +integers (equality and division). In general, abstract models define +new kinds of data objects in terms of previously defined types of data +objects. Assertions about data objects can therefore be checked by +reducing them to assertions about previously defined data objects. +Another approach, introduced by Zilles at MIT, by Goguen, Thatcher, +Wagner, and Wright at IBM (see Thatcher, Wagner, and Wright 1978), and by Guttag at Toronto (see Guttag 1977), +is called algebraic specification. It regards the ``procedures'' +as elements of an abstract algebraic system whose behavior is +specified by axioms that correspond to our ``conditions,'' and uses +the techniques of abstract algebra to check assertions about data +objects. Both methods are surveyed in the paper by Liskov and Zilles +(1975). + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-15.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-15.html new file mode 100644 index 00000000..2fbac28d --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-15.html @@ -0,0 +1,2242 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    2.2  Hierarchical Data and the Closure Property

                                                                                    + +

                                                                                    + +As we have seen, pairs provide a primitive ``glue'' that we can use to +construct compound data objects. +Figure 2.2 shows a standard way to +visualize a pair -- in this case, the pair formed by (cons 1 2). +In this representation, which is called box-and-pointer +notation, each object is shown as a pointer to a box. The box +for a primitive object contains a representation of the object. For +example, the box for a number contains a numeral. The box for a pair +is actually a double box, the left part containing (a pointer to) the +car of the pair and the right part containing the cdr.

                                                                                    + + +We have already seen that cons can be used to combine not +only numbers but pairs as well. (You made use of this fact, or +should have, in doing exercises 2.2 +and 2.3.) As a consequence, pairs provide a universal +building block from which we can construct all sorts of data +structures. Figure 2.3 shows two ways +to use pairs to combine the numbers 1, 2, 3, and 4.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.2:  Box-and-pointer representation of (cons 1 2).
                                                                                    + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.3:  Two ways to combine 1, 2, 3, and 4 using pairs.
                                                                                    + +

                                                                                    + +The ability to create pairs whose elements are pairs is the essence of +list structure's importance as a representational tool. We refer to +this ability as the closure property of cons. In general, +an operation for combining data objects satisfies the closure property +if the results of combining things with that operation can themselves +be combined using the same operation.6 +Closure is the key to power in +any means of combination because it permits us to create hierarchical structures -- structures made up of parts, which +themselves are made up of parts, and so on.

                                                                                    + +From the outset of chapter 1, we've made essential use of closure in +dealing with procedures, because all but the very simplest programs +rely on the fact that the elements of a combination can themselves be +combinations. In this section, we take up the consequences of closure +for compound data. We describe some conventional techniques for using +pairs to represent sequences and trees, and we exhibit a graphics +language that illustrates closure in a vivid way.7

                                                                                    + + +

                                                                                    2.2.1  Representing Sequences

                                                                                    + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.4:  The sequence 1, 2, 3, 4 represented as a chain of pairs.
                                                                                    + +

                                                                                    + +One of the useful structures we can build with pairs is a sequence -- an ordered collection of data objects. There are, of +course, many ways to represent sequences in terms of pairs. One +particularly straightforward representation is illustrated in +figure 2.4, where the sequence 1, 2, 3, 4 is +represented as a chain of pairs. The car of each pair is the +corresponding item in the chain, and the cdr of the pair is +the next pair in the chain. The cdr of the final pair +signals the end of the sequence by pointing to a distinguished +value that is not a pair, +represented in box-and-pointer diagrams as a diagonal line +and in programs as the value of the variable nil. +The entire sequence is constructed by nested cons operations:

                                                                                    + +

                                                                                    (cons 1
                                                                                    +      (cons 2
                                                                                    +            (cons 3
                                                                                    +                  (cons 4 nil))))
                                                                                    +

                                                                                    + + +Such a sequence of pairs, formed by nested conses, is called a +list, and Scheme provides a +primitive called list to help in constructing lists.8 +The above sequence could be produced by (list 1 2 3 4). In +general,

                                                                                    + + +

                                                                                    (list <a1> <a2... <an>)
                                                                                    +

                                                                                    +is equivalent to

                                                                                    + + +

                                                                                    (cons <a1> (cons <a2> (cons ... (cons <an> nil) ...)))
                                                                                    +

                                                                                    +Lisp systems conventionally print lists by printing the sequence of +elements, enclosed in parentheses. Thus, the data object in +figure 2.4 is printed as (1 2 3 4):

                                                                                    + + +

                                                                                    (define one-through-four (list 1 2 3 4))
                                                                                    +
                                                                                    +one-through-four
                                                                                    +(1 2 3 4)
                                                                                    +

                                                                                    +Be careful not to confuse the expression (list 1 2 3 4) with the +list (1 2 3 4), which is the result obtained when the expression +is evaluated. Attempting to evaluate the expression (1 2 3 4) will +signal an error when the interpreter tries to apply the procedure 1 to arguments 2, 3, and 4.

                                                                                    + + +We can think of car as selecting the first item in the list, and +of cdr as selecting the sublist consisting of all but the first +item. Nested applications of car and cdr can be used to +extract the second, third, and subsequent items in the +list.9 +The constructor cons makes a list like the original one, +but with an additional item at the beginning.

                                                                                    + + +

                                                                                    (car one-through-four)
                                                                                    +1
                                                                                    +
                                                                                    +(cdr one-through-four)
                                                                                    +(2 3 4)
                                                                                    +(car (cdr one-through-four))
                                                                                    +2
                                                                                    +
                                                                                    +(cons 10 one-through-four)
                                                                                    +(10 1 2 3 4)
                                                                                    +
                                                                                    +(cons 5 one-through-four)
                                                                                    +(5 1 2 3 4)
                                                                                    +

                                                                                    +The value of nil, used to terminate the chain of pairs, can be +thought of as a sequence of no elements, the empty list. The +word nil is a contraction of the Latin word nihil, which +means ``nothing.''10

                                                                                    + + +

                                                                                    List operations

                                                                                    + + +The use of pairs to represent sequences of elements as lists is +accompanied by conventional programming techniques for manipulating +lists by successively ``cdring down'' the lists. For example, +the procedure list-ref takes as arguments a list and a number +n and returns the nth item of the list. It is customary to +number the elements of the list beginning with 0. The method for +computing list-ref is the following:

                                                                                    + +

                                                                                      +
                                                                                    • For n = 0, list-ref should return the car of the list.

                                                                                      + +

                                                                                    • Otherwise, list-ref should return the (n - 1)st item of the +cdr of the list. +

                                                                                    + +

                                                                                    (define (list-ref items n)
                                                                                    +  (if (= n 0)
                                                                                    +      (car items)
                                                                                    +      (list-ref (cdr items) (- n 1))))
                                                                                    +(define squares (list 1 4 9 16 25))
                                                                                    +
                                                                                    +(list-ref squares 3)
                                                                                    +16
                                                                                    +

                                                                                    + +Often we cdr down the whole list. To aid in this, Scheme includes +a primitive predicate null?, which tests whether its argument is +the empty list. The procedure length, which +returns the number of items in a list, illustrates this typical +pattern of use:

                                                                                    + +

                                                                                    (define (length items)
                                                                                    +  (if (null? items)
                                                                                    +      0
                                                                                    +      (+ 1 (length (cdr items)))))
                                                                                    +(define odds (list 1 3 5 7))
                                                                                    +
                                                                                    +(length odds)
                                                                                    +4
                                                                                    +

                                                                                    +The length procedure implements a simple recursive plan. The +reduction step is:

                                                                                    + +

                                                                                      +
                                                                                    • The length of any list is 1 plus the length of the +cdr of the list. +

                                                                                    + +This is applied successively until we reach the base case:

                                                                                    + +

                                                                                      +
                                                                                    • The length of the empty list is 0. +

                                                                                    + +We could also compute length in an iterative style:

                                                                                    + +

                                                                                    (define (length items)
                                                                                    +  (define (length-iter a count)
                                                                                    +    (if (null? a)
                                                                                    +        count
                                                                                    +        (length-iter (cdr a) (+ 1 count))))
                                                                                    +  (length-iter items 0))
                                                                                    +

                                                                                    + +Another conventional programming technique is to ``cons up'' an +answer list while cdring down a list, as in the procedure append, which takes two lists as arguments and combines their +elements to make a new list:

                                                                                    + +

                                                                                    (append squares odds)
                                                                                    +(1 4 9 16 25 1 3 5 7)
                                                                                    +
                                                                                    +(append odds squares)
                                                                                    +(1 3 5 7 1 4 9 16 25)
                                                                                    +

                                                                                    +Append is also implemented using a recursive plan. To append +lists list1 and list2, do the following:

                                                                                    + +

                                                                                      +
                                                                                    • If list1 is the empty list, then the result is just list2.

                                                                                      + +

                                                                                    • Otherwise, append the cdr of list1 and +list2, and cons the car of list1 onto the result: +

                                                                                    + +

                                                                                    (define (append list1 list2)
                                                                                    +  (if (null? list1)
                                                                                    +      list2
                                                                                    +      (cons (car list1) (append (cdr list1) list2))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.17.  Define a procedure last-pair that returns the list that contains only +the last element of a given (nonempty) list:

                                                                                    + +

                                                                                    (last-pair (list 23 72 149 34))
                                                                                    +(34)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.18.  Define a procedure reverse that takes a list as argument and +returns a list of the same elements in reverse order:

                                                                                    + +

                                                                                    (reverse (list 1 4 9 16 25))
                                                                                    +(25 16 9 4 1)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.19.  Consider the change-counting program of +section 1.2.2. It would be nice to be able to +easily change the currency used by the program, so that we could +compute the number of ways to change a British pound, for example. As +the program is written, the knowledge of the currency is distributed +partly into the procedure first-denomination and partly into the +procedure count-change (which knows that there are five +kinds of U.S. coins). It would be nicer to be able to +supply a list of coins to be used for making change.

                                                                                    + +We want to rewrite the procedure cc so that its +second argument is a list of the values of the +coins to use rather than an integer specifying which coins to use. We +could then have lists that defined each kind of currency:

                                                                                    + +

                                                                                    (define us-coins (list 50 25 10 5 1))
                                                                                    +(define uk-coins (list 100 50 20 10 5 2 1 0.5))
                                                                                    +

                                                                                    +We could then call cc as follows:

                                                                                    + +

                                                                                    (cc 100 us-coins)
                                                                                    +292
                                                                                    +

                                                                                    +To do this will require changing the program cc somewhat. It will +still have the same form, but it will access its second argument +differently, as follows:

                                                                                    + +

                                                                                    (define (cc amount coin-values)
                                                                                    +  (cond ((= amount 0) 1)
                                                                                    +        ((or (< amount 0) (no-more? coin-values)) 0)
                                                                                    +        (else
                                                                                    +         (+ (cc amount
                                                                                    +                (except-first-denomination coin-values))
                                                                                    +            (cc (- amount
                                                                                    +                   (first-denomination coin-values))
                                                                                    +                coin-values)))))
                                                                                    +

                                                                                    +Define the procedures first-denomination, except-first-denomination, and no-more? in terms of primitive +operations on list structures. Does the order of the list coin-values affect the answer produced by cc? Why or why not? +

                                                                                    + + +

                                                                                    +Exercise 2.20.  The procedures +, *, and list take arbitrary numbers +of arguments. One way to define such procedures is to use define +with dotted-tail notation. In a procedure definition, a parameter +list that has a dot before the last parameter name indicates that, when the +procedure is called, the initial parameters (if any) will have as values +the initial arguments, +as usual, but the final parameter's value will be a list of +any remaining arguments. +For instance, given the definition + +

                                                                                    (define (f x y . z) <body>)
                                                                                    +

                                                                                    +the procedure f can be called with two or more arguments. +If we evaluate + +

                                                                                    (f 1 2 3 4 5 6)
                                                                                    +

                                                                                    +then in the body of f, x will be 1, y will be +2, and z will be the list (3 4 5 6). +Given the definition + +

                                                                                    (define (g . w) <body>)
                                                                                    +

                                                                                    +the procedure g can be called with zero or more arguments. +If we evaluate + +

                                                                                    (g 1 2 3 4 5 6)
                                                                                    +

                                                                                    +then in the body of g, w will be the +list (1 2 3 4 5 6).11

                                                                                    + +Use this notation +to write a procedure same-parity that takes one or more integers +and returns a list of all the arguments that have the same even-odd +parity as the first argument. For example, +

                                                                                    (same-parity 1 2 3 4 5 6 7)
                                                                                    +(1 3 5 7)
                                                                                    +
                                                                                    +(same-parity 2 3 4 5 6 7)
                                                                                    +(2 4 6)
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    Mapping over lists

                                                                                    + + +One extremely useful operation is to apply some transformation +to each element in a list and generate the list of results. +For instance, the following procedure scales each number in a list by +a given factor:

                                                                                    + +

                                                                                    (define (scale-list items factor)
                                                                                    +  (if (null? items)
                                                                                    +      nil
                                                                                    +      (cons (* (car items) factor)
                                                                                    +            (scale-list (cdr items) factor))))
                                                                                    +(scale-list (list 1 2 3 4 5) 10)
                                                                                    +(10 20 30 40 50)
                                                                                    +

                                                                                    + +We can abstract this general idea and capture it as a common pattern +expressed as a higher-order procedure, just as in +section 1.3. The higher-order procedure +here is called map. Map takes as arguments a procedure +of one argument +and a list, and returns a list of the results produced by +applying the procedure to each element in the list:12

                                                                                    + +

                                                                                    (define (map proc items)
                                                                                    +  (if (null? items)
                                                                                    +      nil
                                                                                    +      (cons (proc (car items))
                                                                                    +            (map proc (cdr items)))))
                                                                                    +(map abs (list -10 2.5 -11.6 17))
                                                                                    +(10 2.5 11.6 17)
                                                                                    +(map (lambda (x) (* x x))
                                                                                    +     (list 1 2 3 4))
                                                                                    +(1 4 9 16)
                                                                                    +

                                                                                    +Now we can give a new definition of scale-list in terms of map: +

                                                                                    (define (scale-list items factor)
                                                                                    +  (map (lambda (x) (* x factor))
                                                                                    +       items))
                                                                                    +

                                                                                    +

                                                                                    + +Map is an important construct, not only because it captures a +common pattern, but because it establishes a higher level of +abstraction in dealing with lists. In the original definition of scale-list, the recursive structure of the program draws attention to +the element-by-element processing of the list. Defining scale-list in terms of map suppresses that level of detail and +emphasizes that scaling transforms a list of elements to a list of +results. The difference between the two definitions is not that the +computer is performing a different process (it isn't) but that we +think about the process differently. In effect, map helps +establish an abstraction barrier that isolates the implementation of +procedures that transform lists from the details of how the +elements of the list are extracted and combined. Like the barriers +shown in figure 2.1, this abstraction gives +us the flexibility to change the low-level details of how sequences +are implemented, while preserving the conceptual framework of +operations that transform sequences to sequences. +Section 2.2.3 expands on this use +of sequences as a framework for organizing programs.

                                                                                    + +

                                                                                    +Exercise 2.21.  The procedure square-list takes a list of +numbers as argument and returns a list of the squares of those +numbers.

                                                                                    + +

                                                                                    (square-list (list 1 2 3 4))
                                                                                    +(1 4 9 16)
                                                                                    +

                                                                                    +Here are two different definitions of square-list. Complete +both of them by filling in the missing expressions:

                                                                                    + +

                                                                                    (define (square-list items)
                                                                                    +  (if (null? items)
                                                                                    +      nil
                                                                                    +      (cons <??> <??>)))
                                                                                    +(define (square-list items)
                                                                                    +  (map <??> <??>))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.22.  Louis Reasoner tries to rewrite the first square-list procedure of +exercise 2.21 so that it evolves an iterative +process:

                                                                                    + +

                                                                                    (define (square-list items)
                                                                                    +  (define (iter things answer)
                                                                                    +    (if (null? things)
                                                                                    +        answer
                                                                                    +        (iter (cdr things) 
                                                                                    +              (cons (square (car things))
                                                                                    +                    answer))))
                                                                                    +  (iter items nil))
                                                                                    +

                                                                                    +Unfortunately, defining square-list this way produces the answer +list in the reverse order of the one desired. Why?

                                                                                    + +Louis then tries to fix his bug by interchanging the arguments to +cons:

                                                                                    + +

                                                                                    (define (square-list items)
                                                                                    +  (define (iter things answer)
                                                                                    +    (if (null? things)
                                                                                    +        answer
                                                                                    +        (iter (cdr things)
                                                                                    +              (cons answer
                                                                                    +                    (square (car things))))))
                                                                                    +  (iter items nil))
                                                                                    +

                                                                                    +This doesn't work either. Explain. + +

                                                                                    + +

                                                                                    +Exercise 2.23.  The procedure for-each is similar to map. It takes as +arguments a procedure and a list of elements. However, rather than +forming a list of the results, for-each just applies the procedure +to each of the elements in turn, from left to right. The values +returned by applying the procedure to the elements are not used at +all -- for-each is used with procedures that perform an action, +such as printing. For example, +

                                                                                    (for-each (lambda (x) (newline) (display x))
                                                                                    +          (list 57 321 88))
                                                                                    +57
                                                                                    +321
                                                                                    +88
                                                                                    +

                                                                                    +The value returned by the call to for-each (not illustrated above) +can be something arbitrary, such as true. Give an +implementation of for-each. + +

                                                                                    +

                                                                                    + + +

                                                                                    2.2.2  Hierarchical Structures

                                                                                    + + + +The representation of sequences in terms of lists generalizes +naturally to represent sequences whose elements may +themselves be sequences. For example, we can regard the object +((1 2) 3 4) constructed by

                                                                                    + +

                                                                                    (cons (list 1 2) (list 3 4))
                                                                                    +

                                                                                    +as a list of three items, the first of which is itself a list, (1 2). Indeed, this is suggested by the form in which the result is +printed by the interpreter. Figure 2.5 shows +the representation of this structure in terms of pairs.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.5:  Structure formed by (cons (list 1 2) (list 3 4)).
                                                                                    + +

                                                                                    + +Another way to think of sequences whose elements are sequences is as +trees. The elements of the sequence are the branches of the +tree, and elements that are themselves sequences are subtrees. +Figure 2.6 shows the structure in +figure 2.5 viewed as a tree.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.6:  The list structure in figure 2.5 viewed as a tree.
                                                                                    + +

                                                                                    + + +Recursion is a natural tool for dealing with tree structures, since +we can often reduce operations on trees to operations on their +branches, which reduce in turn to operations on the branches of the +branches, and so on, until we reach the leaves of the tree. +As an example, compare the length procedure of +section 2.2.1 with the count-leaves procedure, which +returns the total number of leaves of a tree:

                                                                                    + + +

                                                                                    (define x (cons (list 1 2) (list 3 4)))
                                                                                    +
                                                                                    +(length x)
                                                                                    +3
                                                                                    +(count-leaves x)
                                                                                    +4
                                                                                    +
                                                                                    +(list x x)
                                                                                    +(((1 2) 3 4) ((1 2) 3 4))
                                                                                    +
                                                                                    +(length (list x x))
                                                                                    +2
                                                                                    +
                                                                                    +(count-leaves (list x x))
                                                                                    +8
                                                                                    +

                                                                                    + + +To implement count-leaves, recall the recursive plan for computing +length:

                                                                                    + + +

                                                                                      +
                                                                                    • Length of a list x is 1 plus length of the +cdr of x.

                                                                                      + +

                                                                                    • Length of the empty list is 0. +

                                                                                    + +Count-leaves is similar. The value for the empty list is the same:

                                                                                    + + +

                                                                                      +
                                                                                    • Count-leaves of the empty list is 0. +

                                                                                    + +But in the reduction step, where we strip off the car of the +list, we must take into account that the car may itself be a +tree whose leaves we need to count. Thus, the appropriate reduction +step is

                                                                                    + + +

                                                                                      +
                                                                                    • Count-leaves of a tree x is count-leaves of the car of x plus count-leaves of the +cdr of x. +

                                                                                    + +Finally, by taking cars we reach +actual leaves, so we need another base case:

                                                                                    + + +

                                                                                      +
                                                                                    • Count-leaves of a leaf is 1. +

                                                                                    + +To aid +in writing recursive procedures on trees, Scheme provides the primitive +predicate pair?, which tests whether its argument is a pair. +Here is the complete procedure:13

                                                                                    + + +

                                                                                    (define (count-leaves x)
                                                                                    +  (cond ((null? x) 0)  
                                                                                    +        ((not (pair? x)) 1)
                                                                                    +        (else (+ (count-leaves (car x))
                                                                                    +                 (count-leaves (cdr x))))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.24.  Suppose we evaluate the expression (list 1 (list 2 (list 3 4))). +Give the result printed by the interpreter, the corresponding +box-and-pointer structure, and the interpretation of this as a tree +(as in figure 2.6). +

                                                                                    + +

                                                                                    +Exercise 2.25.  Give combinations of cars and cdrs that will pick 7 from +each of the following lists:

                                                                                    + +

                                                                                    (1 3 (5 7) 9)
                                                                                    +
                                                                                    +((7))
                                                                                    +
                                                                                    +(1 (2 (3 (4 (5 (6 7))))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.26.  Suppose we define x and y to be two lists:

                                                                                    + +

                                                                                    (define x (list 1 2 3))
                                                                                    +(define y (list 4 5 6))
                                                                                    +

                                                                                    +What result is printed by the interpreter in response to evaluating +each of the following expressions:

                                                                                    + +

                                                                                    (append x y)
                                                                                    +
                                                                                    +(cons x y)
                                                                                    +
                                                                                    +(list x y)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.27.  Modify your reverse procedure of exercise 2.18 to +produce a deep-reverse procedure that takes a list as argument +and returns as its value the list with its elements reversed and with +all sublists deep-reversed as well. For example,

                                                                                    + +

                                                                                    (define x (list (list 1 2) (list 3 4)))
                                                                                    +
                                                                                    +x
                                                                                    +((1 2) (3 4))
                                                                                    +
                                                                                    +(reverse x)
                                                                                    +((3 4) (1 2))
                                                                                    +
                                                                                    +(deep-reverse x)
                                                                                    +((4 3) (2 1))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.28.  Write a procedure fringe that takes as argument a tree +(represented as a list) and returns a list whose elements are all the +leaves of the tree arranged in left-to-right order. For example,

                                                                                    + +

                                                                                    (define x (list (list 1 2) (list 3 4)))
                                                                                    +
                                                                                    +(fringe x)
                                                                                    +(1 2 3 4)
                                                                                    +
                                                                                    +(fringe (list x x))
                                                                                    +(1 2 3 4 1 2 3 4)
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    +Exercise 2.29.  A binary mobile consists of two branches, a left branch and a right +branch. Each branch is a rod of a certain length, from which hangs +either a weight or another binary mobile. We can represent a binary +mobile using compound data by constructing it from two branches (for +example, using list):

                                                                                    + + +

                                                                                    (define (make-mobile left right)
                                                                                    +  (list left right))
                                                                                    +

                                                                                    +A branch is constructed from a length (which must be a number) +together with a structure, which may be either a number +(representing a simple weight) or another mobile:

                                                                                    + + +

                                                                                    (define (make-branch length structure)
                                                                                    +  (list length structure))
                                                                                    +

                                                                                    + +a.  Write the corresponding selectors left-branch and +right-branch, which return the branches of a mobile, and +branch-length and branch-structure, which return +the components of a branch.

                                                                                    + +b.  Using your selectors, define a procedure total-weight +that returns the total weight of a mobile.

                                                                                    + +c.  A mobile is said to be balanced if the torque applied +by its top-left branch is equal to that applied by its top-right +branch (that is, if the length of the left rod multiplied by the +weight hanging from that rod is equal to the corresponding product for +the right side) and if each of the submobiles hanging off its branches +is balanced. Design a predicate that tests whether a binary mobile is +balanced.

                                                                                    + +d.  Suppose we change the representation of mobiles so that the +constructors are

                                                                                    + + +

                                                                                    (define (make-mobile left right)
                                                                                    +  (cons left right))
                                                                                    +(define (make-branch length structure)
                                                                                    +  (cons length structure))
                                                                                    +

                                                                                    +How much do you need to change your programs to convert to the new +representation? + +

                                                                                    +

                                                                                    + + +

                                                                                    Mapping over trees

                                                                                    + + +Just as map is a powerful abstraction for dealing with sequences, +map together with recursion is a powerful abstraction for +dealing with trees. For instance, the scale-tree +procedure, analogous to scale-list of +section 2.2.1, takes as arguments a numeric factor and a +tree whose leaves are numbers. It returns a tree of the same shape, +where each number is multiplied by the factor. +The recursive plan for scale-tree is similar to the one for +count-leaves:

                                                                                    + +

                                                                                    (define (scale-tree tree factor)
                                                                                    +  (cond ((null? tree) nil)
                                                                                    +        ((not (pair? tree)) (* tree factor))
                                                                                    +        (else (cons (scale-tree (car tree) factor)
                                                                                    +                    (scale-tree (cdr tree) factor)))))
                                                                                    +(scale-tree (list 1 (list 2 (list 3 4) 5) (list 6 7))
                                                                                    +            10)
                                                                                    +(10 (20 (30 40) 50) (60 70))
                                                                                    +

                                                                                    + +Another way to implement scale-tree is to regard the +tree as a sequence of sub-trees and use map. We map +over the sequence, scaling each sub-tree in turn, and return the list +of results. In the base case, where the tree is a leaf, we simply +multiply by the factor:

                                                                                    + +

                                                                                    (define (scale-tree tree factor)
                                                                                    +  (map (lambda (sub-tree)
                                                                                    +         (if (pair? sub-tree)
                                                                                    +             (scale-tree sub-tree factor)
                                                                                    +             (* sub-tree factor)))
                                                                                    +       tree))
                                                                                    +

                                                                                    +Many tree operations can be implemented by similar combinations of +sequence operations and recursion.

                                                                                    + +

                                                                                    +Exercise 2.30.  Define a procedure square-tree analogous to the square-list +procedure of exercise 2.21. That is, square-list should behave as follows:

                                                                                    + +

                                                                                    (square-tree
                                                                                    + (list 1
                                                                                    +       (list 2 (list 3 4) 5)
                                                                                    +       (list 6 7)))
                                                                                    +(1 (4 (9 16) 25) (36 49))
                                                                                    +

                                                                                    +Define square-tree both directly (i.e., without using any +higher-order procedures) and also by using map and recursion. + +

                                                                                    + +

                                                                                    +Exercise 2.31.  Abstract your answer to exercise 2.30 to produce a +procedure tree-map with the property that square-tree +could be defined as

                                                                                    + +

                                                                                    (define (square-tree tree) (tree-map square tree))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.32.  We can represent a set as a list of distinct elements, and we can +represent the set of all subsets of the set as a list of lists. For +example, if the set is (1 2 3), then the set of all subsets is +(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3)). Complete the +following definition of a procedure that generates the set of subsets +of a set and give a clear explanation of why it works: +

                                                                                    (define (subsets s)
                                                                                    +  (if (null? s)
                                                                                    +      (list nil)
                                                                                    +      (let ((rest (subsets (cdr s))))
                                                                                    +        (append rest (map <??> rest)))))
                                                                                    +

                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    2.2.3  Sequences as Conventional Interfaces

                                                                                    + + + +In working with compound data, we've stressed how data abstraction +permits us to design programs without becoming enmeshed in the details +of data representations, and how abstraction preserves for us the +flexibility to experiment with alternative representations. In this +section, we introduce another powerful design principle for working +with data structures -- the use of conventional interfaces.

                                                                                    + +In section 1.3 we saw how program +abstractions, implemented as higher-order procedures, can capture +common patterns in programs that deal with numerical data. Our +ability to formulate analogous operations for working with compound +data depends crucially on the style in which we manipulate our data +structures. Consider, for example, the following procedure, analogous +to the count-leaves procedure of section 2.2.2, which +takes a tree as argument and computes the sum of the squares of the +leaves that are odd: +

                                                                                    (define (sum-odd-squares tree)
                                                                                    +  (cond ((null? tree) 0)  
                                                                                    +        ((not (pair? tree))
                                                                                    +         (if (odd? tree) (square tree) 0))
                                                                                    +        (else (+ (sum-odd-squares (car tree))
                                                                                    +                 (sum-odd-squares (cdr tree))))))
                                                                                    +

                                                                                    + +On the surface, this procedure is very different from the following +one, which constructs a list of all the even Fibonacci numbers + Fib(k), where k is less than or equal to a given integer n: +

                                                                                    (define (even-fibs n)
                                                                                    +  (define (next k)
                                                                                    +    (if (> k n)
                                                                                    +        nil
                                                                                    +        (let ((f (fib k)))
                                                                                    +          (if (even? f)
                                                                                    +              (cons f (next (+ k 1)))
                                                                                    +              (next (+ k 1))))))
                                                                                    +  (next 0))
                                                                                    +

                                                                                    + + +Despite the fact that these two procedures are structurally very +different, a more abstract description of the two computations reveals +a great deal of similarity. The first program +

                                                                                      +
                                                                                    • enumerates the leaves of a tree; +
                                                                                    • filters them, selecting the odd ones; +
                                                                                    • squares each of the selected ones; and +
                                                                                    • accumulates the results using +, starting with 0. +

                                                                                    +The second program +

                                                                                      +
                                                                                    • enumerates the integers from 0 to n; +
                                                                                    • computes the Fibonacci number for each integer; +
                                                                                    • filters them, selecting the even ones; and +
                                                                                    • accumulates the results using cons, starting with the +empty list. +

                                                                                    + +A signal-processing engineer would find it natural to conceptualize +these processes in terms of signals flowing through a cascade of +stages, each of which implements part of the program plan, as shown in +figure 2.7. In sum-odd-squares, we +begin with an enumerator, which generates a ``signal'' +consisting of the leaves of a given tree. This signal is passed +through a filter, which eliminates all but the odd elements. +The resulting signal is in turn passed through a map, which is a +``transducer'' that applies the square procedure to each +element. The output of the map is then fed to an accumulator, +which combines the elements using +, starting from an initial 0. +The plan for even-fibs is analogous.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.7:  The signal-flow plans for the procedures sum-odd-squares (top) and even-fibs (bottom) reveal the +commonality between the two programs.
                                                                                    + +

                                                                                    + +Unfortunately, the two procedure definitions above fail to exhibit this +signal-flow structure. For instance, if we examine the sum-odd-squares procedure, we find that the enumeration is +implemented partly by the null? and pair? tests and partly +by the tree-recursive structure of the procedure. Similarly, the +accumulation is found partly in the tests and partly in the addition used +in the recursion. In general, there are no distinct parts of either +procedure that correspond to the elements in the signal-flow +description. +Our two procedures decompose the computations in a different way, +spreading the enumeration over the program and mingling it with the +map, the filter, and the accumulation. If we could organize our +programs to make the signal-flow structure manifest in the procedures +we write, this would increase the conceptual clarity of the resulting +code.

                                                                                    + + +

                                                                                    Sequence Operations

                                                                                    + + + +The key to organizing programs so as to more clearly reflect the +signal-flow structure is to concentrate on the ``signals'' that flow +from one stage in the process to the next. If we represent these +signals as lists, then we can use list operations to implement the +processing at each of the stages. For instance, we can implement the +mapping stages of the signal-flow diagrams using the map +procedure from section 2.2.1: + +

                                                                                    (map square (list 1 2 3 4 5))
                                                                                    +(1 4 9 16 25)
                                                                                    +

                                                                                    + +Filtering a sequence to select only those elements that satisfy a +given predicate is accomplished by + +

                                                                                    (define (filter predicate sequence)
                                                                                    +  (cond ((null? sequence) nil)
                                                                                    +        ((predicate (car sequence))
                                                                                    +         (cons (car sequence)
                                                                                    +               (filter predicate (cdr sequence))))
                                                                                    +        (else (filter predicate (cdr sequence)))))
                                                                                    +

                                                                                    +For example, +

                                                                                    (filter odd? (list 1 2 3 4 5))
                                                                                    +(1 3 5)
                                                                                    +

                                                                                    + +Accumulations can be implemented by +

                                                                                    (define (accumulate op initial sequence)
                                                                                    +  (if (null? sequence)
                                                                                    +      initial
                                                                                    +      (op (car sequence)
                                                                                    +          (accumulate op initial (cdr sequence)))))
                                                                                    +(accumulate + 0 (list 1 2 3 4 5))
                                                                                    +15
                                                                                    +(accumulate * 1 (list 1 2 3 4 5))
                                                                                    +120
                                                                                    +(accumulate cons nil (list 1 2 3 4 5))
                                                                                    +(1 2 3 4 5)
                                                                                    +

                                                                                    + + +All that remains to implement signal-flow diagrams is to enumerate the +sequence of elements to be processed. For even-fibs, we need to +generate the sequence of +integers in a given range, which we can do as follows: +

                                                                                    (define (enumerate-interval low high)
                                                                                    +  (if (> low high)
                                                                                    +      nil
                                                                                    +      (cons low (enumerate-interval (+ low 1) high))))
                                                                                    +(enumerate-interval 2 7)
                                                                                    +(2 3 4 5 6 7)
                                                                                    +

                                                                                    +To enumerate the leaves of a tree, we can use14 +

                                                                                    (define (enumerate-tree tree)
                                                                                    +  (cond ((null? tree) nil)
                                                                                    +        ((not (pair? tree)) (list tree))
                                                                                    +        (else (append (enumerate-tree (car tree))
                                                                                    +                      (enumerate-tree (cdr tree))))))
                                                                                    +(enumerate-tree (list 1 (list 2 (list 3 4)) 5))
                                                                                    +(1 2 3 4 5)
                                                                                    +

                                                                                    + +Now we can reformulate sum-odd-squares and even-fibs as in +the signal-flow diagrams. For sum-odd-squares, we enumerate the +sequence of leaves of the tree, filter this to keep only the odd +numbers in the sequence, square each element, and sum the results: + +

                                                                                    (define (sum-odd-squares tree)
                                                                                    +  (accumulate +
                                                                                    +              0
                                                                                    +              (map square
                                                                                    +                   (filter odd?
                                                                                    +                           (enumerate-tree tree)))))
                                                                                    +

                                                                                    +For even-fibs, we enumerate the integers from 0 to n, generate +the Fibonacci number for each of these integers, filter the resulting +sequence to keep only the even elements, and accumulate the results +into a list: + +

                                                                                    (define (even-fibs n)
                                                                                    +  (accumulate cons
                                                                                    +              nil
                                                                                    +              (filter even?
                                                                                    +                      (map fib
                                                                                    +                           (enumerate-interval 0 n)))))
                                                                                    +

                                                                                    + + +The value of expressing programs as sequence operations is that this +helps us make program designs that are modular, that is, designs that +are constructed by combining relatively independent pieces. We can +encourage modular design by providing a library of standard components +together with a conventional interface for connecting the components +in flexible ways.

                                                                                    + +Modular construction is a powerful strategy for +controlling complexity in engineering design. In real +signal-processing applications, for example, designers regularly build +systems by cascading elements selected from standardized families of +filters and transducers. Similarly, sequence operations provide a +library of standard program elements that we can mix and match. For +instance, we can reuse pieces from the sum-odd-squares and even-fibs procedures in a program that constructs a list of the +squares of the first n + 1 Fibonacci numbers: + +

                                                                                    (define (list-fib-squares n)
                                                                                    +  (accumulate cons
                                                                                    +              nil
                                                                                    +              (map square
                                                                                    +                   (map fib
                                                                                    +                        (enumerate-interval 0 n)))))
                                                                                    +(list-fib-squares 10)
                                                                                    +(0 1 1 4 9 25 64 169 441 1156 3025)
                                                                                    +

                                                                                    +We can rearrange the pieces and use them in computing the product of +the odd integers in a sequence: +

                                                                                    (define (product-of-squares-of-odd-elements sequence)
                                                                                    +  (accumulate *
                                                                                    +              1
                                                                                    +              (map square
                                                                                    +                   (filter odd? sequence))))
                                                                                    +(product-of-squares-of-odd-elements (list 1 2 3 4 5))
                                                                                    +225
                                                                                    +

                                                                                    + +We can also formulate conventional data-processing applications in +terms of sequence operations. Suppose we have a sequence of personnel +records and we want to find the salary of the highest-paid programmer. +Assume that we have a selector salary that returns the salary of +a record, and a predicate programmer? that tests if a record is +for a programmer. Then we can write +

                                                                                    (define (salary-of-highest-paid-programmer records)
                                                                                    +  (accumulate max
                                                                                    +              0
                                                                                    +              (map salary
                                                                                    +                   (filter programmer? records))))
                                                                                    +

                                                                                    +These examples give just a hint of the vast range of operations that +can be expressed as sequence operations.15

                                                                                    + +Sequences, implemented here as lists, serve +as a conventional interface that permits us to combine processing +modules. Additionally, when we uniformly represent structures as +sequences, we have localized the data-structure dependencies in our +programs to a small number of sequence operations. By changing these, +we can experiment with alternative representations of sequences, while +leaving the overall design of our programs intact. We will exploit +this capability in section 3.5, when we generalize the +sequence-processing paradigm to admit infinite sequences.

                                                                                    + +

                                                                                    +Exercise 2.33.  Fill in the missing expressions to complete the following definitions +of some basic list-manipulation operations as accumulations: +

                                                                                    (define (map p sequence)
                                                                                    +  (accumulate (lambda (x y) <??>) nil sequence))
                                                                                    +(define (append seq1 seq2)
                                                                                    +  (accumulate cons <??> <??>))
                                                                                    +(define (length sequence)
                                                                                    +  (accumulate <??> 0 sequence))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.34.  Evaluating a polynomial in x at a given value of x can be +formulated as an accumulation. We evaluate the polynomial +

                                                                                    +using a well-known algorithm called Horner's rule, which +structures the computation as +

                                                                                    +In other words, we start with an, multiply by x, add an-1, +multiply by x, and so on, until we reach a0.16 +Fill in the following template to produce a procedure that evaluates a +polynomial using Horner's rule. +Assume that the coefficients of the +polynomial are arranged in a sequence, from a0 through an. +

                                                                                    (define (horner-eval x coefficient-sequence)
                                                                                    +  (accumulate (lambda (this-coeff higher-terms) <??>)
                                                                                    +              0
                                                                                    +              coefficient-sequence))
                                                                                    +

                                                                                    +For example, to compute 1 + 3x + 5x3 + x5 at x = 2 you would evaluate +

                                                                                    (horner-eval 2 (list 1 3 0 5 0 1))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.35.  Redefine count-leaves from section 2.2.2 as an +accumulation: +

                                                                                    (define (count-leaves t)
                                                                                    +  (accumulate <??> <??> (map <??> <??>)))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.36.  The procedure accumulate-n is similar to accumulate except +that it takes as its third argument a sequence of sequences, which are all +assumed to have the same number of elements. It applies the +designated accumulation procedure to combine all the first elements of +the sequences, all the second elements of the sequences, and so on, and +returns a sequence of the results. For instance, if s is a sequence +containing four sequences, ((1 2 3) (4 5 6) (7 8 9) (10 11 12)), +then the value of (accumulate-n + 0 s) should be the sequence (22 26 30). Fill in the missing expressions +in the following definition of accumulate-n: +

                                                                                    (define (accumulate-n op init seqs)
                                                                                    +  (if (null? (car seqs))
                                                                                    +      nil
                                                                                    +      (cons (accumulate op init <??>)
                                                                                    +            (accumulate-n op init <??>))))
                                                                                    +

                                                                                    +

                                                                                    +

                                                                                    +Exercise 2.37.  Suppose we represent vectors v = (vi) as sequences of numbers, and +matrices m = (mij) as sequences of vectors (the rows of the matrix). +For example, the matrix +

                                                                                    +is represented as the sequence ((1 2 3 4) (4 5 6 6) (6 7 8 9)). +With this representation, we can use sequence operations to concisely +express the basic matrix and vector operations. These operations +(which are described in any book on matrix algebra) are the following:

                                                                                    + +

                                                                                    + +We can define the dot product as17 +

                                                                                    (define (dot-product v w)
                                                                                    +  (accumulate + 0 (map * v w)))
                                                                                    +

                                                                                    +Fill in the missing expressions in the following procedures for +computing the other matrix operations. (The procedure accumulate-n is +defined in exercise 2.36.) +

                                                                                    (define (matrix-*-vector m v)
                                                                                    +  (map <??> m))
                                                                                    +(define (transpose mat)
                                                                                    +  (accumulate-n <??> <??> mat))
                                                                                    +(define (matrix-*-matrix m n)
                                                                                    +  (let ((cols (transpose n)))
                                                                                    +    (map <??> m)))
                                                                                    +

                                                                                    +

                                                                                    +

                                                                                    +Exercise 2.38.  The accumulate procedure is also known as fold-right, +because it combines the first element of the sequence with the result +of combining all the elements to the right. There is also a fold-left, which is +similar to fold-right, except +that it combines elements working in the opposite direction: +

                                                                                    (define (fold-left op initial sequence)
                                                                                    +  (define (iter result rest)
                                                                                    +    (if (null? rest)
                                                                                    +        result
                                                                                    +        (iter (op result (car rest))
                                                                                    +              (cdr rest))))
                                                                                    +  (iter initial sequence))
                                                                                    +

                                                                                    +What are the values of +

                                                                                    (fold-right / 1 (list 1 2 3))
                                                                                    +(fold-left / 1 (list 1 2 3))
                                                                                    +(fold-right list nil (list 1 2 3))
                                                                                    +(fold-left list nil (list 1 2 3))
                                                                                    +

                                                                                    +Give a property that op should satisfy to guarantee that fold-right and fold-left will produce the same values for any +sequence. + +

                                                                                    + +

                                                                                    +Exercise 2.39.   +Complete the following definitions of reverse +(exercise 2.18) in terms of fold-right and fold-left from exercise 2.38: +

                                                                                    (define (reverse sequence)
                                                                                    +  (fold-right (lambda (x y) <??>) nil sequence))
                                                                                    +(define (reverse sequence)
                                                                                    +  (fold-left (lambda (x y) <??>) nil sequence))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    Nested Mappings

                                                                                    + + + +We can extend the sequence paradigm to include many +computations that are commonly expressed using nested loops.18 +Consider +this problem: Given a positive integer n, find all ordered pairs of +distinct positive integers i and j, where 1< j< i< n, such +that i + j is prime. For example, if n is 6, then the pairs are +the following: +

                                                                                    +A natural way to organize this computation is to generate the sequence +of all ordered pairs of positive integers less than or equal to n, +filter to select those pairs whose sum is prime, and +then, for each pair (i, j) that passes through the filter, produce the triple +(i,j,i + j).

                                                                                    + +Here is a way to generate the sequence of pairs: For each integer +i< n, enumerate the integers j<i, and for each such i and j +generate the pair (i,j). In terms of sequence operations, we map +along the sequence (enumerate-interval 1 n). For each i in +this sequence, we map along the sequence (enumerate-interval 1 (- +i 1)). For each j in this latter sequence, we generate the pair +(list i j). This gives us a sequence of pairs for each i. +Combining all the sequences for all the i (by accumulating with append) produces the required sequence of pairs:19 +

                                                                                    (accumulate append
                                                                                    +            nil
                                                                                    +            (map (lambda (i)
                                                                                    +                   (map (lambda (j) (list i j))
                                                                                    +                        (enumerate-interval 1 (- i 1))))
                                                                                    +                 (enumerate-interval 1 n)))
                                                                                    +

                                                                                    +The combination of mapping and accumulating with append is so common in this +sort of program that we will isolate it as a separate procedure: +

                                                                                    (define (flatmap proc seq)
                                                                                    +  (accumulate append nil (map proc seq)))
                                                                                    +

                                                                                    +Now filter this sequence of pairs to find those whose sum is prime. The +filter predicate is called for each element of the sequence; its +argument is a pair and it must extract the integers from the pair. +Thus, the predicate to apply to each element in the sequence is +

                                                                                    (define (prime-sum? pair)
                                                                                    +  (prime? (+ (car pair) (cadr pair))))
                                                                                    +

                                                                                    +Finally, generate the sequence of results by mapping over the filtered +pairs using the following procedure, which constructs a triple +consisting of the two elements of the pair along with their sum: +

                                                                                    (define (make-pair-sum pair)
                                                                                    +  (list (car pair) (cadr pair) (+ (car pair) (cadr pair))))
                                                                                    +

                                                                                    +Combining all these steps yields the complete procedure: +

                                                                                    (define (prime-sum-pairs n)
                                                                                    +  (map make-pair-sum
                                                                                    +       (filter prime-sum?
                                                                                    +               (flatmap
                                                                                    +                (lambda (i)
                                                                                    +                  (map (lambda (j) (list i j))
                                                                                    +                       (enumerate-interval 1 (- i 1))))
                                                                                    +                (enumerate-interval 1 n)))))
                                                                                    +

                                                                                    + +Nested mappings are also useful for sequences other than those that +enumerate intervals. Suppose we wish to generate all the permutations +of a set S; that is, all the ways of ordering the items in +the set. For instance, the permutations of {1,2,3} are +{1,2,3}, { 1,3,2}, {2,1,3}, { 2,3,1}, { 3,1,2}, and +{ 3,2,1}. Here is a plan for generating the permutations of S: +For each item x in S, recursively generate the sequence of +permutations of S - x,20 and adjoin +x to the front of each one. This yields, for each x in S, the sequence +of permutations of S that begin with x. Combining these +sequences for all x gives all the permutations of S:21

                                                                                    + + +

                                                                                    (define (permutations s)
                                                                                    +  (if (null? s)                    ; empty set?
                                                                                    +      (list nil)                   ; sequence containing empty set
                                                                                    +      (flatmap (lambda (x)
                                                                                    +                 (map (lambda (p) (cons x p))
                                                                                    +                      (permutations (remove x s))))
                                                                                    +               s)))
                                                                                    +

                                                                                    +Notice how this strategy reduces the problem of generating +permutations of S to the problem of generating the permutations of +sets with fewer elements than S. In the terminal case, we work our +way down to the empty list, which represents a set of no elements. +For this, we generate (list nil), which is a sequence with one +item, namely the set with no elements. The remove procedure +used in permutations returns all the items in a given sequence +except for a given item. This can be expressed as a simple filter: + +

                                                                                    (define (remove item sequence)
                                                                                    +  (filter (lambda (x) (not (= x item)))
                                                                                    +          sequence))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.40.  Define a procedure unique-pairs that, given an integer n, +generates the sequence of pairs (i,j) with 1< j< i< n. Use unique-pairs to simplify the definition of prime-sum-pairs +given above. +

                                                                                    + +

                                                                                    +Exercise 2.41.  Write a procedure to find all ordered +triples of distinct positive integers i, j, and k less than or +equal to a given integer n that sum to a given integer s. +

                                                                                    + + +

                                                                                    +Exercise 2.42.  

                                                                                    +
                                                                                    Figure 2.8:  A solution to the eight-queens puzzle.
                                                                                    + +

                                                                                    +The ``eight-queens puzzle'' asks how to place eight queens on a +chessboard so that no queen is in check from any other (i.e., no two +queens are in the same row, column, or diagonal). One possible +solution is shown in figure 2.8. One way to solve the +puzzle is to work across the board, placing a queen in each column. +Once we have placed k - 1 queens, we must place the kth queen in a +position where it does not check any of the queens already on the +board. We can formulate this approach recursively: Assume that we +have already generated the sequence of all possible ways to place +k - 1 queens in the first k - 1 columns of the board. For each of +these ways, generate an extended set of positions by placing a queen +in each row of the kth column. Now filter these, keeping only +the positions for which the queen in the kth column is safe with +respect to the other queens. This produces the sequence of all ways +to place k queens in the first k columns. By continuing this +process, we will produce not only one solution, but all solutions to +the puzzle.

                                                                                    + + +We implement this solution as a procedure queens, which returns +a sequence of all solutions to the problem of placing n queens on an +n× n chessboard. Queens has an internal procedure queen-cols that returns the sequence of all ways to place queens in +the first k columns of the board. + +

                                                                                    (define (queens board-size)
                                                                                    +  (define (queen-cols k)  
                                                                                    +    (if (= k 0)
                                                                                    +        (list empty-board)
                                                                                    +        (filter
                                                                                    +         (lambda (positions) (safe? k positions))
                                                                                    +         (flatmap
                                                                                    +          (lambda (rest-of-queens)
                                                                                    +            (map (lambda (new-row)
                                                                                    +                   (adjoin-position new-row k rest-of-queens))
                                                                                    +                 (enumerate-interval 1 board-size)))
                                                                                    +          (queen-cols (- k 1))))))
                                                                                    +  (queen-cols board-size))
                                                                                    +

                                                                                    +In this procedure rest-of-queens is a way to place k - 1 queens +in the first k - 1 columns, and new-row is a proposed row in +which to place the queen for the kth column. Complete the program +by implementing the representation for sets of board positions, +including the procedure adjoin-position, which adjoins a new row-column +position to a set of positions, and empty-board, which +represents an empty set of positions. You must also write the +procedure safe?, which determines for a set of positions, +whether the queen in the kth column is safe with respect to the +others. (Note that we need only check whether the new queen is +safe -- the other queens are already guaranteed safe with respect to +each other.) + +

                                                                                    + +

                                                                                    +Exercise 2.43.  Louis Reasoner is having a terrible time doing exercise 2.42. His +queens procedure seems to work, but it runs extremely slowly. +(Louis never does manage to wait long enough for it to solve even the +6× 6 case.) When Louis asks Eva Lu Ator for help, she points +out that he has interchanged the order of the nested mappings in the +flatmap, writing it as +

                                                                                    (flatmap
                                                                                    + (lambda (new-row)
                                                                                    +   (map (lambda (rest-of-queens)
                                                                                    +          (adjoin-position new-row k rest-of-queens))
                                                                                    +        (queen-cols (- k 1))))
                                                                                    + (enumerate-interval 1 board-size))
                                                                                    +

                                                                                    +Explain why this interchange makes the program run slowly. Estimate +how long it will take Louis's program to solve the eight-queens +puzzle, assuming that the program in exercise 2.42 solves +the puzzle in time T. +

                                                                                    + + +

                                                                                    2.2.4  Example: A Picture Language

                                                                                    + + + +This section presents a simple language for drawing +pictures that illustrates the +power of data abstraction and closure, +and also exploits higher-order procedures in +an essential way. The language +is designed to make it easy to experiment with patterns +such as the ones in figure 2.9, which are +composed of repeated elements that are shifted and scaled.22 In this language, +the data objects being combined +are represented as procedures rather than as list structure. +Just as cons, which satisfies the closure property, +allowed us to easily build arbitrarily complicated +list structure, the operations in this language, which also +satisfy the closure property, allow us to easily build +arbitrarily complicated patterns.

                                                                                    + +

                                                                                    +           + 
                                                                                    + +
                                                                                    Figure 2.9:  Designs generated with the picture language.
                                                                                    + +

                                                                                    + + +

                                                                                    The picture language

                                                                                    + +When we began our study of programming in +section 1.1, we emphasized the +importance of describing a language by focusing on the language's +primitives, its means of combination, and its means of abstraction. +We'll follow that framework here.

                                                                                    + +Part of the elegance of this picture language is that there is +only one kind of element, called a painter. A painter +draws an image that is shifted and scaled to fit within a designated +parallelogram-shaped frame. For example, there's a primitive painter +we'll call wave that makes a crude line drawing, as +shown in figure 2.10. +The actual shape of the drawing depends on the frame -- all +four images in figure 2.10 are produced by the same wave painter, but with respect to four different frames. Painters +can be more elaborate than this: +The primitive +painter called rogers paints a picture of MIT's founder, +William Barton Rogers, as shown in figure 2.11.23 +The four images in figure 2.11 +are drawn with respect to the same four frames +as the wave images in figure 2.10.

                                                                                    + + +To combine images, +we use various operations that construct new painters +from given painters. +For example, the beside operation takes two painters and produces a new, +compound painter that draws the first painter's image in the left half +of the frame and the second painter's image in the right half of the frame. +Similarly, below takes two painters and produces a compound +painter that draws the first painter's image below the second +painter's image. +Some operations transform a single painter to produce +a new painter. For example, flip-vert takes a painter and +produces a painter that draws its image upside-down, and +flip-horiz produces a painter that draws the original +painter's image left-to-right reversed.

                                                                                    + +

                                                                                    +           + 
                                                                                    + +
                                                                                    +           + 
                                                                                    + +
                                                                                    Figure 2.10:  Images produced by the wave painter, with respect +to four different frames. The frames, shown with dotted lines, are not +part of the images.
                                                                                    + +

                                                                                    + +

                                                                                    +           + 
                                                                                    + +
                                                                                    +           + 
                                                                                    + +
                                                                                    Figure 2.11:  Images of William Barton Rogers, founder and first +president of MIT, painted with respect to the same four frames as in +figure 2.10 (original image reprinted with the permission +of the MIT Museum).
                                                                                    + +

                                                                                    + + +Figure 2.12 shows the drawing of a painter called +wave4 that is built up in two stages starting from wave: +

                                                                                    (define wave2 (beside wave (flip-vert wave)))
                                                                                    +(define wave4 (below wave2 wave2))
                                                                                    +

                                                                                    + +

                                                                                    +           + 
                                                                                    + +

                                                                                    (define wave2                         (define wave4
                                                                                    +  (beside wave (flip-vert wave)))       (below wave2 wave2))
                                                                                    +

                                                                                    +

                                                                                    Figure 2.12:  Creating a complex figure, +starting from the wave painter of figure 2.10.
                                                                                    + +

                                                                                    + +In building up a complex image in this manner we are exploiting the +fact that painters are closed under the language's means of +combination. The beside or below of two painters is +itself a painter; therefore, we can use it as an element in making +more complex painters. As with building up list structure using cons, the closure of our data under the means of combination is +crucial to the ability to create complex structures while using only a +few operations.

                                                                                    + + +Once we can combine painters, we would like to be able to abstract +typical patterns of combining painters. +We will implement the painter operations as Scheme procedures. +This means that we don't need a special abstraction mechanism +in the picture language: +Since the means of combination +are ordinary Scheme procedures, we automatically have the capability +to do anything with painter operations that we can do with +procedures. +For example, we can abstract the pattern in wave4 as

                                                                                    + + +

                                                                                    (define (flipped-pairs painter)
                                                                                    +  (let ((painter2 (beside painter (flip-vert painter))))
                                                                                    +    (below painter2 painter2)))
                                                                                    +

                                                                                    +and define wave4 as an instance of this pattern:

                                                                                    + + +

                                                                                    (define wave4 (flipped-pairs wave))
                                                                                    +

                                                                                    + +We can also define recursive operations. +Here's one that makes painters split and branch +towards the right as shown in figures 2.13 +and  2.14: +

                                                                                    (define (right-split painter n)
                                                                                    +  (if (= n 0)
                                                                                    +      painter
                                                                                    +      (let ((smaller (right-split painter (- n 1))))
                                                                                    +        (beside painter (below smaller smaller)))))
                                                                                    +

                                                                                    + +

                                                                                    +           + 
                                                                                    + +

                                                                                         right-split n                   corner-split n
                                                                                    +

                                                                                    +

                                                                                    Figure 2.13:  Recursive plans for right-split and corner-split.
                                                                                    + +

                                                                                    + +We can produce balanced patterns by branching upwards +as well as towards the right (see exercise 2.44 +and figures 2.13 and  2.14):

                                                                                    + +

                                                                                    (define (corner-split painter n)
                                                                                    +  (if (= n 0)
                                                                                    +      painter
                                                                                    +      (let ((up (up-split painter (- n 1)))
                                                                                    +            (right (right-split painter (- n 1))))
                                                                                    +        (let ((top-left (beside up up))
                                                                                    +              (bottom-right (below right right))
                                                                                    +              (corner (corner-split painter (- n 1))))
                                                                                    +          (beside (below painter top-left)
                                                                                    +                  (below bottom-right corner))))))
                                                                                    +

                                                                                    + +

                                                                                    +           + 
                                                                                    + +

                                                                                         (right-split wave 4)         (right-split rogers 4)
                                                                                    +

                                                                                    +

                                                                                    +           + 
                                                                                    + +

                                                                                        (corner-split wave 4)         (corner-split rogers 4)
                                                                                    +

                                                                                    +

                                                                                    Figure 2.14:  The recursive operations right-split and corner-split applied to the painters wave and rogers. +Combining four corner-split figures produces +symmetric square-limit designs as shown +in figure 2.9.
                                                                                    + +

                                                                                    + +By placing four copies of a corner-split +appropriately, we obtain a pattern called square-limit, whose +application to wave and rogers is shown in +figure 2.9: +

                                                                                    (define (square-limit painter n)
                                                                                    +  (let ((quarter (corner-split painter n)))
                                                                                    +    (let ((half (beside (flip-horiz quarter) quarter)))
                                                                                    +      (below (flip-vert half) half))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.44.  Define the procedure up-split used by corner-split. +It is similar to right-split, except that it switches the +roles of below and beside. + +

                                                                                    + + + +

                                                                                    Higher-order operations

                                                                                    + + +In addition to abstracting patterns of combining painters, we can work +at a higher level, abstracting patterns of combining painter operations. +That is, we can view the painter operations as elements to manipulate +and can write means of combination for these elements -- procedures that +take painter operations as arguments and create new painter operations.

                                                                                    + +For example, flipped-pairs and square-limit each +arrange four copies of a painter's image in a square pattern; they differ +only in how they orient the copies. +One way to abstract this pattern of painter combination is with +the following procedure, which takes four one-argument painter operations +and produces a painter operation that transforms a given +painter with those four operations and arranges the results in a square. +Tl, tr, bl, and br are the +transformations to apply to the top left copy, the top right copy, +the bottom left copy, and the bottom right copy, respectively.

                                                                                    + +

                                                                                    (define (square-of-four tl tr bl br)
                                                                                    +  (lambda (painter)
                                                                                    +    (let ((top (beside (tl painter) (tr painter)))
                                                                                    +          (bottom (beside (bl painter) (br painter))))
                                                                                    +      (below bottom top))))
                                                                                    +

                                                                                    +Then flipped-pairs can be defined in terms +of square-of-four as follows:24

                                                                                    + +

                                                                                    (define (flipped-pairs painter)
                                                                                    +  (let ((combine4 (square-of-four identity flip-vert
                                                                                    +                                  identity flip-vert)))
                                                                                    +    (combine4 painter)))
                                                                                    +

                                                                                    +and square-limit can be expressed as25

                                                                                    + +

                                                                                    (define (square-limit painter n)
                                                                                    +  (let ((combine4 (square-of-four flip-horiz identity
                                                                                    +                                  rotate180 flip-vert)))
                                                                                    +    (combine4 (corner-split painter n))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.45.  Right-split and up-split can be expressed as +instances of a general splitting operation. +Define a procedure split with the property that evaluating +

                                                                                    (define right-split (split beside below))
                                                                                    +(define up-split (split below beside))
                                                                                    +

                                                                                    +produces procedures right-split and up-split with the same +behaviors as the ones already defined. + +

                                                                                    + + +

                                                                                    Frames

                                                                                    + + +Before we can show how to implement painters and their +means of combination, we must first consider +frames. A frame can be described by three vectors -- an origin vector +and two edge vectors. The origin vector specifies the offset of the +frame's origin from some absolute origin in the plane, and the edge +vectors specify the offsets of the frame's corners from its origin. +If the edges are perpendicular, the frame will be rectangular. +Otherwise the frame will be a more general parallelogram.

                                                                                    + +Figure 2.15 shows a frame and its associated vectors. In +accordance with data abstraction, we need not be +specific yet about how frames are represented, other than to say that +there is a constructor make-frame, which takes three vectors and +produces a frame, and three corresponding selectors origin-frame, edge1-frame, and edge2-frame (see +exercise 2.47).

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.15:  A frame is described by three vectors -- an +origin and two edges.
                                                                                    + +

                                                                                    + +We will use coordinates in the unit square (0< x,y< 1) +to specify images. +With each frame, we associate a frame coordinate map, which +will be used to shift and scale images to fit the frame. The map +transforms the unit square into the frame by +mapping the vector v = (x,y) to the vector sum +

                                                                                    +For example, (0,0) is mapped to the origin of the frame, (1,1) to +the vertex diagonally opposite the origin, and (0.5,0.5) to the +center of the frame. We can create a frame's coordinate map with the +following procedure:26

                                                                                    + +

                                                                                    (define (frame-coord-map frame)
                                                                                    +  (lambda (v)
                                                                                    +    (add-vect
                                                                                    +     (origin-frame frame)
                                                                                    +     (add-vect (scale-vect (xcor-vect v)
                                                                                    +                           (edge1-frame frame))
                                                                                    +               (scale-vect (ycor-vect v)
                                                                                    +                           (edge2-frame frame))))))
                                                                                    +

                                                                                    +Observe that applying frame-coord-map to a frame returns +a procedure that, given a vector, returns a vector. +If the argument vector is in the unit square, the result vector +will be in the frame. For example, +

                                                                                    ((frame-coord-map a-frame) (make-vect 0 0))
                                                                                    +

                                                                                    +returns the same vector as +

                                                                                    (origin-frame a-frame)
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.46.  A two-dimensional vector v running from the origin to a point +can be represented as a pair +consisting of an x-coordinate and a y-coordinate. Implement a data +abstraction for vectors by giving a constructor make-vect and +corresponding selectors xcor-vect and ycor-vect. In +terms of your selectors and constructor, implement procedures add-vect, sub-vect, and scale-vect that perform +the operations vector addition, vector subtraction, and multiplying a +vector by a scalar: +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.47.  Here are two possible constructors for frames: +

                                                                                    (define (make-frame origin edge1 edge2)
                                                                                    +  (list origin edge1 edge2))
                                                                                    +
                                                                                    +(define (make-frame origin edge1 edge2)
                                                                                    +  (cons origin (cons edge1 edge2)))
                                                                                    +

                                                                                    +For each constructor supply the appropriate selectors to produce an +implementation for frames. + +

                                                                                    + + +

                                                                                    Painters

                                                                                    + + +A painter is represented as a procedure that, given a frame +as argument, draws a particular image shifted and scaled to fit the frame. +That is to say, if p is a painter and f is a frame, then we +produce p's image in f by calling p with f as +argument.

                                                                                    + +The details of how primitive painters are implemented depend on the +particular characteristics of the graphics system and the type of +image to be drawn. For instance, suppose we have a procedure draw-line that draws a line on the screen between two specified +points. Then we can create painters for line drawings, such as the +wave painter in figure 2.10, from lists of line +segments as follows:27

                                                                                    (define (segments->painter segment-list)
                                                                                    +  (lambda (frame)
                                                                                    +    (for-each
                                                                                    +     (lambda (segment)
                                                                                    +       (draw-line
                                                                                    +        ((frame-coord-map frame) (start-segment segment))
                                                                                    +        ((frame-coord-map frame) (end-segment segment))))
                                                                                    +     segment-list)))
                                                                                    +

                                                                                    +The segments are given using coordinates with respect to the unit +square. For each segment in the list, the painter transforms the +segment endpoints with the frame coordinate map and draws a line +between the transformed points.

                                                                                    + +Representing painters as procedures erects a powerful abstraction +barrier in the picture language. We can create and intermix +all sorts of primitive painters, based on a variety of graphics +capabilities. The details of their implementation do not matter. Any +procedure can serve as a painter, provided that it takes a frame as +argument and draws something scaled to fit the frame.28 + +

                                                                                    +Exercise 2.48.  A directed line segment in the +plane can be represented as a pair of vectors -- the +vector running from the origin to the start-point of the segment, and +the vector running from the origin to the end-point of the segment. +Use your vector representation from exercise 2.46 to +define a representation for segments with a constructor make-segment and selectors start-segment and end-segment. + +

                                                                                    + +

                                                                                    +Exercise 2.49.  Use segments->painter to define the following primitive painters:

                                                                                    + +a.  The painter that draws the outline of the designated frame.

                                                                                    + +b.  The painter that draws an ``X'' by connecting opposite corners of +the frame.

                                                                                    + +c.  The painter that draws a diamond shape by connecting the midpoints of +the sides of the frame.

                                                                                    + +d.  The wave painter. + +

                                                                                    + + +

                                                                                    Transforming and combining painters

                                                                                    + + +An operation on painters (such as flip-vert or beside) +works by creating a painter that invokes the original painters +with respect to frames derived from the argument frame. +Thus, for example, flip-vert doesn't have to know how a painter +works in order to flip it -- it just has to know how to turn a frame +upside down: +The flipped painter just uses the original painter, +but in the inverted frame.

                                                                                    + +Painter operations are based on +the procedure transform-painter, which takes as arguments a painter and +information on how to transform a frame and +produces a new painter. The transformed painter, when called on a frame, +transforms the frame and +calls the original painter on the transformed frame. +The arguments to transform-painter are points (represented as vectors) +that specify the corners of the new frame: +When mapped into +the frame, the first point specifies the new frame's origin +and the other two specify the ends of its edge vectors. +Thus, arguments within the +unit square specify a frame contained within the original frame.

                                                                                    + +

                                                                                    (define (transform-painter painter origin corner1 corner2)
                                                                                    +  (lambda (frame)
                                                                                    +    (let ((m (frame-coord-map frame)))
                                                                                    +      (let ((new-origin (m origin)))
                                                                                    +        (painter
                                                                                    +         (make-frame new-origin
                                                                                    +                     (sub-vect (m corner1) new-origin)
                                                                                    +                     (sub-vect (m corner2) new-origin)))))))
                                                                                    +

                                                                                    + +Here's how to flip painter images vertically: +

                                                                                    (define (flip-vert painter)
                                                                                    +  (transform-painter painter
                                                                                    +                     (make-vect 0.0 1.0)   ; new origin
                                                                                    +                     (make-vect 1.0 1.0)   ; new end of edge1
                                                                                    +                     (make-vect 0.0 0.0))) ; new end of edge2
                                                                                    +

                                                                                    +Using transform-painter, we can easily define new transformations. +For example, we can define a painter that shrinks its image to the +upper-right quarter of the frame it is given: +

                                                                                    (define (shrink-to-upper-right painter)
                                                                                    +  (transform-painter painter
                                                                                    +                     (make-vect 0.5 0.5)
                                                                                    +                     (make-vect 1.0 0.5)
                                                                                    +                     (make-vect 0.5 1.0)))
                                                                                    +

                                                                                    +Other transformations rotate images counterclockwise by 90 degrees29 +

                                                                                    (define (rotate90 painter)
                                                                                    +  (transform-painter painter
                                                                                    +                     (make-vect 1.0 0.0)
                                                                                    +                     (make-vect 1.0 1.0)
                                                                                    +                     (make-vect 0.0 0.0)))
                                                                                    +

                                                                                    +or squash images towards the center of the frame:30 +

                                                                                    (define (squash-inwards painter)
                                                                                    +  (transform-painter painter
                                                                                    +                     (make-vect 0.0 0.0)
                                                                                    +                     (make-vect 0.65 0.35)
                                                                                    +                     (make-vect 0.35 0.65)))
                                                                                    +

                                                                                    + +Frame transformation is also the key to +defining means of combining two or more painters. +The beside procedure, +for example, takes two painters, transforms them +to paint in the left and right halves of an argument frame respectively, +and produces a new, compound painter. +When the compound painter is given a frame, it +calls the first transformed painter to paint in the left half of +the frame and calls the second transformed painter to paint in the +right half of the frame: +

                                                                                    (define (beside painter1 painter2)
                                                                                    +  (let ((split-point (make-vect 0.5 0.0)))
                                                                                    +    (let ((paint-left
                                                                                    +           (transform-painter painter1
                                                                                    +                              (make-vect 0.0 0.0)
                                                                                    +                              split-point
                                                                                    +                              (make-vect 0.0 1.0)))
                                                                                    +          (paint-right
                                                                                    +           (transform-painter painter2
                                                                                    +                              split-point
                                                                                    +                              (make-vect 1.0 0.0)
                                                                                    +                              (make-vect 0.5 1.0))))
                                                                                    +      (lambda (frame)
                                                                                    +        (paint-left frame)
                                                                                    +        (paint-right frame)))))
                                                                                    +

                                                                                    + +Observe how the painter data abstraction, and in particular the +representation of painters as procedures, makes beside easy to +implement. The beside procedure need not know anything +about the details of the component painters other than that each +painter will draw something in its designated frame.

                                                                                    + +

                                                                                    +Exercise 2.50.  Define the transformation flip-horiz, which flips +painters horizontally, and transformations that rotate +painters counterclockwise by 180 degrees and 270 degrees. + +

                                                                                    + +

                                                                                    +Exercise 2.51.  Define the below operation for painters. Below takes two +painters as arguments. The resulting painter, given a frame, +draws with the first painter in the +bottom of the frame and with the second painter in the top. Define below in two different ways -- first by writing a procedure that is +analogous to the beside procedure given above, and +again in terms of beside and suitable +rotation operations (from exercise 2.50). + +

                                                                                    + + +

                                                                                    Levels of language for robust design

                                                                                    + +The picture language exercises some of the critical ideas +we've introduced about abstraction with procedures and data. The +fundamental data abstractions, painters, are implemented using +procedural representations, which enables the language to +handle different basic drawing capabilities in a uniform way. The +means of combination satisfy the closure property, which permits us to +easily build up complex designs. Finally, all the tools for +abstracting procedures are available to us for abstracting means of +combination for painters.

                                                                                    + + +We have also obtained a glimpse of another crucial idea about +languages and program design. This is the approach of stratified +design, the notion that a complex system should be structured as a +sequence of levels that are described using a sequence of languages. +Each level is constructed by combining parts that are regarded as +primitive at that level, and the parts constructed at each level are +used as primitives at the next level. The language used at each level +of a stratified design has primitives, means of combination, and means +of abstraction appropriate to that level of detail.

                                                                                    + +Stratified design pervades the engineering of complex systems. For +example, in computer engineering, resistors and transistors are +combined (and described using a language of analog circuits) to +produce parts such as and-gates and or-gates, which form the +primitives of a language for digital-circuit design.31 +These parts are combined to build +processors, bus structures, and memory systems, which are in turn +combined to form computers, using languages appropriate to computer +architecture. Computers are combined to form distributed systems, +using languages appropriate for describing network interconnections, +and so on.

                                                                                    + +As a tiny example of stratification, our picture language uses +primitive elements (primitive painters) that are created using a +language that specifies points and lines to provide the lists of line +segments for segments->painter, or the +shading details for a painter like rogers. The bulk of our +description of the picture language focused on combining these +primitives, using geometric combiners such as beside and below. We also worked at a higher level, regarding beside and +below as primitives to be manipulated in a language whose +operations, such as square-of-four, capture common patterns of +combining geometric combiners.

                                                                                    + +Stratified design helps make programs robust, that is, it makes +it likely that small changes in a specification will require +correspondingly small changes in the program. For instance, suppose +we wanted to change the image based on wave shown in +figure 2.9. We could work at the lowest level +to change the detailed appearance of the wave element; we could +work at the middle level to change the way corner-split +replicates the wave; we could work at the highest level to +change how square-limit arranges the four copies of the corner. +In general, each level of a stratified design provides a different +vocabulary for expressing the characteristics of the system, and a +different kind of ability to change it.

                                                                                    + +

                                                                                    +Exercise 2.52.  Make changes to the square limit of wave shown in +figure 2.9 by working at each of the levels +described above. In particular:

                                                                                    + +a.  Add some segments to the primitive wave painter +of exercise  2.49 (to add a smile, for example).

                                                                                    + +b.  Change the pattern constructed by corner-split +(for example, by using only one copy of the +up-split and right-split images instead of two).

                                                                                    + +c.  Modify the version of square-limit that uses square-of-four +so as to assemble the corners in a different pattern. (For example, you +might make the big Mr. Rogers look outward from each corner of the square.) +

                                                                                    + +


                                                                                    +

                                                                                    6 The use of the word ``closure'' here comes from abstract algebra, +where a set of elements is said to be closed under an operation if +applying the operation to elements in the set produces an element that +is again an element of the set. The Lisp community +also (unfortunately) uses the word ``closure'' to describe a totally unrelated +concept: A closure is an implementation technique for representing +procedures with free variables. We do not use the word ``closure'' in +this second sense in this book. + +

                                                                                    7 The notion that a means of +combination should satisfy closure is a straightforward idea. +Unfortunately, the data combiners provided in many popular programming +languages do not satisfy closure, or make closure cumbersome to +exploit. In Fortran or Basic, one typically combines data elements by +assembling them into arrays -- but one cannot form arrays whose +elements are themselves arrays. Pascal and C admit structures whose +elements are structures. However, this requires that the programmer +manipulate pointers explicitly, and adhere to the restriction that +each field of a structure can contain only elements of a prespecified form. +Unlike +Lisp with its pairs, these languages have no built-in general-purpose +glue that makes it easy to manipulate compound data in a uniform way. +This limitation lies behind Alan Perlis's comment in his foreword to +this book: ``In Pascal the plethora of declarable data structures +induces a specialization within functions that inhibits and penalizes +casual cooperation. It is better to have 100 functions operate on one +data structure than to have 10 functions operate on 10 data +structures.'' + +

                                                                                    8 In this book, we use list to mean a chain of +pairs terminated by the end-of-list marker. In contrast, the term +list structure refers to any data structure made out of pairs, +not just to lists. + +

                                                                                    9 Since nested applications of car and cdr +are cumbersome to write, Lisp dialects provide abbreviations for +them -- for instance, +

                                                                                    +The names of all such procedures start with c and end with r. Each a between them stands for a car operation and +each d for a cdr operation, to be applied in the same order +in which they appear in the name. The names car and cdr +persist because simple combinations like cadr are +pronounceable. + +

                                                                                    10 It's remarkable how much energy in the +standardization of Lisp dialects has been dissipated in arguments that +are literally over nothing: Should nil be an ordinary name? +Should the value of nil be a symbol? Should it be a list? +Should it be a pair? In Scheme, nil is an ordinary name, +which we use in this section as a variable whose value is +the end-of-list marker (just as true is an ordinary variable +that has a true value). Other dialects of +Lisp, including Common Lisp, treat nil as a special symbol. The +authors of this book, who have endured too many language +standardization brawls, would like to avoid the entire issue. Once we +have introduced quotation in section 2.3, we will +denote the empty list as '() and dispense with the +variable nil entirely. + +

                                                                                    11 To define f and g using +lambda we would write +

                                                                                    (define f (lambda (x y . z) <body>))
                                                                                    +(define g (lambda w <body>))
                                                                                    +

                                                                                    + +

                                                                                    12 Scheme +standardly provides a map procedure that is more general +than the one described here. +This more general map +takes a procedure of n arguments, together with n lists, and +applies the procedure to all the first elements of +the lists, all the second elements of the lists, and so on, +returning a list of the results. For example: +

                                                                                    (map + (list 1 2 3) (list 40 50 60) (list 700 800 900))
                                                                                    +(741 852 963)
                                                                                    +
                                                                                    +(map (lambda (x y) (+ x (* 2 y)))
                                                                                    +     (list 1 2 3)
                                                                                    +     (list 4 5 6))
                                                                                    +(9 12 15)
                                                                                    +

                                                                                    + + + +

                                                                                    13 The order of the +first two clauses in the cond matters, since the empty list +satisfies null? and also is not a pair. + +

                                                                                    14 This is, in fact, precisely the fringe procedure from +exercise 2.28. Here we've renamed it to emphasize that +it is part of a family of general sequence-manipulation procedures. + +

                                                                                    15 Richard Waters (1979) +developed a program that automatically analyzes traditional Fortran +programs, viewing them in terms of maps, filters, and accumulations. +He found that fully 90 percent of the code in the Fortran Scientific +Subroutine Package fits neatly into this paradigm. One of the reasons +for the success of Lisp as a programming language is that lists +provide a standard medium for expressing ordered collections so that +they can be manipulated using higher-order operations. The +programming language APL owes much of its power and appeal to a +similar choice. In APL all data are represented as arrays, and there is a +universal and convenient set of generic operators for all sorts of +array operations. + +

                                                                                    16 According to Knuth (1981), this rule was formulated by +W. G. Horner early in the nineteenth century, but the method was +actually used by Newton over a hundred years earlier. Horner's rule +evaluates the polynomial using fewer additions and multiplications +than does the straightforward method of first computing an xn, +then adding an-1xn-1, and so on. In fact, it is possible to +prove that any algorithm for evaluating arbitrary polynomials must use +at least as many additions and multiplications as does Horner's rule, +and thus Horner's rule is an optimal algorithm for polynomial +evaluation. This was proved (for the number of additions) by +A. M. Ostrowski in a 1954 paper that essentially founded the modern +study of optimal algorithms. The analogous statement for +multiplications was proved by V. Y. Pan in 1966. The book by Borodin +and Munro (1975) provides an overview of these and other results about +optimal algorithms. + +

                                                                                    17 This definition uses the +extended version of map described in footnote 12. + +

                                                                                    18 This approach to nested mappings was shown +to us by David Turner, whose languages KRC and Miranda provide elegant +formalisms for dealing with these constructs. The examples in this +section (see also exercise 2.42) are adapted from Turner +1981. In section 3.5.3, we'll see how this +approach generalizes to infinite sequences. + +

                                                                                    19 We're +representing a pair here as a list of two elements rather than as a +Lisp pair. Thus, the ``pair'' (i,j) is represented as (list i +j), not (cons i j). + +

                                                                                    20 The set S - x is the set of all elements +of S, excluding x. + +

                                                                                    21 Semicolons in Scheme code are used to +introduce comments. Everything from the semicolon to the end of +the line is ignored by the interpreter. In this book we don't use +many comments; we try to make our programs self-documenting by using +descriptive names. + +

                                                                                    22 The picture language is based on the language +Peter Henderson created to construct +images like M.C. Escher's ``Square Limit'' woodcut (see Henderson 1982). +The woodcut incorporates a +repeated scaled pattern, similar to the arrangements drawn using +the square-limit procedure in this section. + +

                                                                                    23 William Barton Rogers (1804-1882) was the founder and first president +of MIT. A geologist and talented teacher, he taught at William and +Mary College and at the University of Virginia. In 1859 he moved to +Boston, where he had more time for research, worked on a plan +for establishing a ``polytechnic institute,'' and served as +Massachusetts's first State Inspector of Gas Meters.

                                                                                    + +When MIT was established in 1861, Rogers was elected its first +president. Rogers espoused an ideal of ``useful learning'' that was +different from the university education of the time, with its +overemphasis on the classics, which, as he wrote, ``stand in the way of +the broader, higher and more practical instruction and discipline of +the natural and social sciences.'' This education was likewise to be +different from narrow trade-school education. In Rogers's words: +

                                                                                    +

                                                                                    The world-enforced distinction between the practical and the +scientific worker is utterly futile, and the whole experience of +modern times has demonstrated its utter worthlessness. +

                                                                                    + +Rogers served as president of MIT until 1870, when he resigned due to +ill health. In 1878 the second president of MIT, John Runkle, +resigned under the pressure of a financial crisis brought on by the +Panic of 1873 and strain of fighting off attempts by Harvard to take +over MIT. Rogers returned to hold the office of president until +1881.

                                                                                    + +Rogers collapsed and died while addressing MIT's graduating class at +the commencement exercises of 1882. Runkle quoted Rogers's last +words in a memorial address delivered that same year: +

                                                                                    +

                                                                                    ``As I stand here today and see what the Institute is, ... I call +to mind the beginnings of science. I remember one hundred and fifty +years ago Stephen Hales published a pamphlet on the subject of +illuminating gas, in which he stated that his researches had +demonstrated that 128 grains of bituminous coal -- '' +

                                                                                    ``Bituminous coal,'' these were his last words on earth. Here he bent +forward, as if consulting some notes on the table before him, then +slowly regaining an erect position, threw up his hands, and was +translated from the scene of his earthly labors and triumphs to ``the +tomorrow of death,'' where the mysteries of life are solved, and the +disembodied spirit finds unending satisfaction in contemplating the +new and still unfathomable mysteries of the infinite future. +

                                                                                    +In the words of Francis A. Walker +(MIT's third president): +
                                                                                    +

                                                                                    All his life he had borne himself most faithfully and heroically, and +he died as so good a knight would surely have wished, in harness, at +his post, and in the very part and act of public duty. +

                                                                                    + +

                                                                                    24 Equivalently, we could +write +

                                                                                    (define flipped-pairs
                                                                                    +  (square-of-four identity flip-vert identity flip-vert))
                                                                                    +

                                                                                    + + +

                                                                                    25 Rotate180 +rotates a painter by 180 degrees (see exercise 2.50). +Instead of rotate180 we could say (compose flip-vert flip-horiz), using +the compose procedure from exercise 1.42. + +

                                                                                    26 Frame-coord-map uses +the vector operations described in exercise 2.46 below, which we +assume have been implemented using some representation for vectors. +Because of data abstraction, it doesn't matter what this vector +representation is, so long as the vector operations behave correctly. + +

                                                                                    27 Segments->painter uses the representation for line +segments described in exercise 2.48 below. +It also uses the for-each procedure described in exercise 2.23. + +

                                                                                    28 For example, the rogers painter of +figure 2.11 was constructed from a gray-level image. +For each point in a given frame, +the rogers painter determines the point in the image that is mapped to it +under the frame coordinate map, and shades it +accordingly. By allowing different types of painters, we are capitalizing on the +abstract data idea discussed in section 2.1.3, where we +argued that a rational-number representation could be anything at all that +satisfies an appropriate condition. Here we're using the fact that a +painter can be implemented in any way at all, so long as it draws +something in the designated frame. Section 2.1.3 also +showed how pairs could be implemented as procedures. Painters are our +second example of a procedural representation for data. + +

                                                                                    29 Rotate90 is a pure rotation only for square +frames, because it also stretches and shrinks the image to fit into +the rotated frame. + +

                                                                                    30 The diamond-shaped images in figures 2.10 +and 2.11 were created with squash-inwards applied to +wave and rogers. + +

                                                                                    31 Section 3.3.4 describes one such language. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-16.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-16.html new file mode 100644 index 00000000..ddf0534e --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-16.html @@ -0,0 +1,1423 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    2.3  Symbolic Data

                                                                                    + + + +All the compound data objects we have used so far were constructed +ultimately from numbers. In this section we extend the representational +capability of our language by introducing the ability to work with +arbitrary symbols as data.

                                                                                    + + +

                                                                                    2.3.1  Quotation

                                                                                    + + + +If we can form compound data using symbols, we can have lists such as

                                                                                    + +

                                                                                    (a b c d)
                                                                                    +(23 45 17)
                                                                                    +((Norah 12) (Molly 9) (Anna 7) (Lauren 6) (Charlotte 4))
                                                                                    +

                                                                                    +Lists containing symbols can look just like the expressions of our +language:

                                                                                    + +

                                                                                    (* (+ 23 45) (+ x 9))
                                                                                    +
                                                                                    +(define (fact n) (if (= n 1) 1 (* n (fact (- n 1)))))
                                                                                    +

                                                                                    + +In order to manipulate symbols we need a new element in our language: +the ability to quote a data object. Suppose we want to +construct the list (a b). We can't accomplish this with (list a b), because this expression constructs +a list of the values of a and b rather than +the symbols themselves. This issue is well known in the context of +natural languages, where words and sentences may be regarded either as +semantic entities or as character strings (syntactic entities). The +common practice in natural languages is to use quotation marks to +indicate that a word or a sentence is to be treated literally as a +string of characters. For instance, the first letter of ``John'' is +clearly ``J.'' If we tell somebody ``say your name aloud,'' we expect +to hear that person's name. However, if we tell somebody ``say `your +name' aloud,'' we expect to hear the words ``your name.'' Note that +we are forced to nest quotation marks to describe what somebody else +might say.32

                                                                                    + +We can follow this same practice to identify lists and symbols that are +to be treated as data objects rather than as expressions to be +evaluated. However, our format for quoting differs from that of +natural languages in that we place a quotation mark (traditionally, +the single quote symbol ') only at the beginning of the object +to be quoted. We can get away with this in Scheme syntax because we +rely on blanks and parentheses to delimit objects. Thus, the meaning +of the single quote character is to quote the next object.33

                                                                                    + +Now we can distinguish between symbols and their values:

                                                                                    + +

                                                                                    (define a 1)
                                                                                    +
                                                                                    +(define b 2)
                                                                                    +
                                                                                    +(list a b)
                                                                                    +(1 2)
                                                                                    +
                                                                                    +(list 'a 'b)
                                                                                    +(a b)
                                                                                    +
                                                                                    +(list 'a b)
                                                                                    +(a 2)
                                                                                    +

                                                                                    + +Quotation also allows us to type in compound objects, using the +conventional printed representation for lists:34

                                                                                    + +

                                                                                    (car '(a b c))
                                                                                    +a
                                                                                    +
                                                                                    +(cdr '(a b c))
                                                                                    +(b c)
                                                                                    +

                                                                                    +In keeping with this, we can obtain the empty list by evaluating '(), and thus dispense with the variable nil.

                                                                                    + +One additional primitive used in manipulating symbols is eq?, +which takes two symbols as arguments and tests whether they are the +same.35 Using eq?, +we can implement a useful procedure called memq. This takes two +arguments, a symbol and a list. If the symbol is not contained in the +list (i.e., is not eq? to any item in the list), then memq returns false. Otherwise, it returns the sublist of +the list beginning with the first occurrence of the symbol:

                                                                                    + +

                                                                                    (define (memq item x)
                                                                                    +  (cond ((null? x) false)
                                                                                    +        ((eq? item (car x)) x)
                                                                                    +        (else (memq item (cdr x)))))
                                                                                    +

                                                                                    +For example, the value of

                                                                                    + +

                                                                                    (memq 'apple '(pear banana prune))
                                                                                    +

                                                                                    +is false, whereas the value of

                                                                                    + +

                                                                                    (memq 'apple '(x (apple sauce) y apple pear))
                                                                                    +

                                                                                    +is (apple pear).

                                                                                    + +

                                                                                    +Exercise 2.53.  What would the interpreter print in response to evaluating each of the +following expressions?

                                                                                    + +

                                                                                    (list 'a 'b 'c)
                                                                                    +
                                                                                    +(list (list 'george))
                                                                                    +(cdr '((x1 x2) (y1 y2)))
                                                                                    +
                                                                                    +(cadr '((x1 x2) (y1 y2)))
                                                                                    +(pair? (car '(a short list)))
                                                                                    +(memq 'red '((red shoes) (blue socks)))
                                                                                    +
                                                                                    +(memq 'red '(red shoes blue socks))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.54.  Two lists are said to be equal? if they contain equal elements +arranged in the same order. For example,

                                                                                    + +

                                                                                    (equal? '(this is a list) '(this is a list))
                                                                                    +

                                                                                    +is true, but

                                                                                    + +

                                                                                    (equal? '(this is a list) '(this (is a) list))
                                                                                    +

                                                                                    +is false. To be more precise, we can define equal? +recursively in terms of the basic eq? equality of symbols by +saying that a and b are equal? if they are both +symbols and the symbols are eq?, or if they are both lists such +that (car a) is equal? to (car b) and (cdr +a) is equal? to (cdr b). Using this idea, implement +equal? as a procedure.36 +

                                                                                    + +

                                                                                    +Exercise 2.55.  Eva Lu Ator types to the interpreter the expression +

                                                                                    (car ''abracadabra)
                                                                                    +

                                                                                    +To her surprise, the interpreter prints back quote. Explain. + +

                                                                                    + + +

                                                                                    2.3.2  Example: Symbolic Differentiation

                                                                                    + + + +As an illustration of symbol manipulation and a further illustration +of data abstraction, consider the design of a procedure that performs +symbolic differentiation of algebraic expressions. We would like the +procedure to take as arguments an algebraic expression and a variable +and to return the derivative of the expression with respect to the +variable. For example, if the arguments to the procedure are ax2 + + bx + c and x, the procedure should return 2ax + b. Symbolic +differentiation is of special historical significance in Lisp. It was +one of the motivating examples behind the development of a computer +language for symbol manipulation. Furthermore, it marked the +beginning of the line of research that led to the development of +powerful systems for symbolic mathematical work, which are currently +being used by a growing number of applied mathematicians and +physicists.

                                                                                    + +In developing the symbolic-differentiation program, we will follow the +same strategy of data abstraction that we followed in developing the +rational-number system of section 2.1.1. That is, we will first +define a differentiation algorithm that operates on abstract +objects such as ``sums,'' ``products,'' and ``variables'' without +worrying about how these are to be represented. Only afterward will +we address the representation problem.

                                                                                    + + +

                                                                                    The differentiation program with abstract data

                                                                                    + + +In order to keep things simple, we will consider a very simple +symbolic-differentiation program that handles expressions that are +built up using only the operations of addition and multiplication with +two arguments. Differentiation of any such expression can be carried +out by applying the following reduction rules:

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +Observe that the latter two rules are recursive in nature. That is, +to obtain the derivative of a sum we first find the derivatives of the +terms and add them. Each of the terms may in turn be an +expression that needs to be decomposed. Decomposing into smaller and +smaller pieces will eventually produce pieces that are either +constants or variables, whose derivatives will be either 0 or 1.

                                                                                    + +To embody these rules in a procedure we indulge in a little wishful +thinking, as we did in designing the rational-number implementation. +If we had a means for representing algebraic expressions, we should be +able to tell whether an expression is a sum, a product, a constant, or +a variable. We should be able to extract the parts of an expression. +For a sum, for example we want to be able to extract the addend +(first term) and the augend (second term). We should also be able to +construct expressions from parts. Let us assume that we already have +procedures to implement the following selectors, constructors, and +predicates:

                                                                                    + + + + + + + + + + +
                                                                                    (variable? e) Is e a variable?
                                                                                    (same-variable? v1 v2) Are v1 and v2 the same variable?

                                                                                    + +(sum? e)

                                                                                    Is e a sum?
                                                                                    (addend e) Addend of the sum e.
                                                                                    (augend e) Augend of the sum e.
                                                                                    (make-sum a1 a2) Construct the sum of a1 and a2.

                                                                                    + +(product? e)

                                                                                    Is e a product?
                                                                                    (multiplier e) Multiplier of the product e.
                                                                                    (multiplicand e) Multiplicand of the product e.
                                                                                    (make-product m1 m2) Construct the product of m1 and m2. +
                                                                                    +Using these, and the primitive predicate number?, +which identifies numbers, we can express the differentiation rules as the +following procedure:

                                                                                    + +

                                                                                    (define (deriv exp var)
                                                                                    +  (cond ((number? exp) 0)
                                                                                    +        ((variable? exp)
                                                                                    +         (if (same-variable? exp var) 1 0))
                                                                                    +        ((sum? exp)
                                                                                    +         (make-sum (deriv (addend exp) var)
                                                                                    +                   (deriv (augend exp) var)))
                                                                                    +        ((product? exp)
                                                                                    +         (make-sum
                                                                                    +           (make-product (multiplier exp)
                                                                                    +                         (deriv (multiplicand exp) var))
                                                                                    +           (make-product (deriv (multiplier exp) var)
                                                                                    +                         (multiplicand exp))))
                                                                                    +        (else
                                                                                    +         (error "unknown expression type -- DERIV" exp))))
                                                                                    +

                                                                                    +This deriv procedure incorporates the complete differentiation algorithm. +Since it is expressed in terms of abstract data, it will work no +matter how we choose to represent algebraic expressions, as long as we +design a proper set of selectors and constructors. This is the issue +we must address next.

                                                                                    + + +

                                                                                    Representing algebraic expressions

                                                                                    + + +We can imagine many ways to use list structure to represent algebraic +expressions. For example, we could use lists of symbols that mirror +the usual algebraic notation, representing ax + b as the list (a +* x + b). However, one especially straightforward choice is to use +the same parenthesized prefix notation that Lisp uses for +combinations; that is, to represent ax + b as (+ (* a x) b). +Then our data representation for the differentiation problem is as +follows:

                                                                                    + +

                                                                                      +
                                                                                    • The variables are symbols. They are identified by the primitive predicate +symbol?:

                                                                                      + +

                                                                                      (define (variable? x) (symbol? x))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • Two variables are the same if the symbols representing them are +eq?:

                                                                                      + +

                                                                                      (define (same-variable? v1 v2)
                                                                                      +  (and (variable? v1) (variable? v2) (eq? v1 v2)))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • Sums and products are constructed as lists:

                                                                                      + +

                                                                                      (define (make-sum a1 a2) (list '+ a1 a2))
                                                                                      +
                                                                                      +(define (make-product m1 m2) (list '* m1 m2))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • A sum is a list whose first element is the symbol +:

                                                                                      + +

                                                                                      (define (sum? x)
                                                                                      +  (and (pair? x) (eq? (car x) '+)))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • The addend is the second item of the sum list:

                                                                                      + +

                                                                                      (define (addend s) (cadr s))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • The augend is the third item of the sum list:

                                                                                      + +

                                                                                      (define (augend s) (caddr s))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • A product is a list whose first element is the symbol *:

                                                                                      + +

                                                                                      (define (product? x)
                                                                                      +  (and (pair? x) (eq? (car x) '*)))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • The multiplier is the second item of the product list:

                                                                                      + +

                                                                                      (define (multiplier p) (cadr p))
                                                                                      +

                                                                                      +

                                                                                      + +

                                                                                    • The multiplicand is the third item of the product list:

                                                                                      + +

                                                                                      (define (multiplicand p) (caddr p))
                                                                                      +

                                                                                      +

                                                                                    + +Thus, we need only combine these with the algorithm as embodied by +deriv in order to have a working symbolic-differentiation +program. Let us look at some examples of its behavior:

                                                                                    + +

                                                                                    (deriv '(+ x 3) 'x)
                                                                                    +(+ 1 0)
                                                                                    +(deriv '(* x y) 'x)
                                                                                    +(+ (* x 0) (* 1 y))
                                                                                    +(deriv '(* (* x y) (+ x 3)) 'x)
                                                                                    +(+ (* (* x y) (+ 1 0))
                                                                                    +   (* (+ (* x 0) (* 1 y))
                                                                                    +      (+  x 3)))

                                                                                    +

                                                                                    +The program produces answers that are correct; however, they are +unsimplified. It is true that

                                                                                    + +

                                                                                    + +but we would like the program to know that x · 0 = 0, 1 · y = +y, and 0 + y = y. The answer for the second example should have been +simply y. As the third example shows, this becomes a serious +issue when the expressions are complex.

                                                                                    + +Our difficulty is much like the one we encountered with the +rational-number implementation: we haven't reduced answers to simplest +form. To accomplish the rational-number reduction, we needed to +change only the constructors and the selectors of the implementation. +We can adopt a similar strategy here. We won't change deriv at +all. Instead, we will change make-sum so that if both summands +are numbers, make-sum will add them and return their sum. Also, +if one of the summands is 0, then make-sum will return the other +summand.

                                                                                    + +

                                                                                    (define (make-sum a1 a2)
                                                                                    +  (cond ((=number? a1 0) a2)
                                                                                    +        ((=number? a2 0) a1)
                                                                                    +        ((and (number? a1) (number? a2)) (+ a1 a2))
                                                                                    +        (else (list '+ a1 a2))))
                                                                                    +

                                                                                    +This uses the procedure =number?, which checks whether an +expression is equal to a given number:

                                                                                    + +

                                                                                    (define (=number? exp num)
                                                                                    +  (and (number? exp) (= exp num)))
                                                                                    +

                                                                                    +Similarly, we will change make-product to build in the rules that 0 +times anything is 0 and 1 times anything is the thing itself:

                                                                                    + +

                                                                                    (define (make-product m1 m2)
                                                                                    +  (cond ((or (=number? m1 0) (=number? m2 0)) 0)
                                                                                    +        ((=number? m1 1) m2)
                                                                                    +        ((=number? m2 1) m1)
                                                                                    +        ((and (number? m1) (number? m2)) (* m1 m2))
                                                                                    +        (else (list '* m1 m2))))
                                                                                    +

                                                                                    +Here is how this version works on our three examples:

                                                                                    + +

                                                                                    (deriv '(+ x 3) 'x)
                                                                                    +1
                                                                                    +(deriv '(* x y) 'x)
                                                                                    +y
                                                                                    +(deriv '(* (* x y) (+ x 3)) 'x)
                                                                                    +(+ (* x y) (* y (+ x 3)))
                                                                                    +

                                                                                    +Although this is quite an improvement, the third example shows that +there is still a long way to go before we get a program that puts +expressions into a form that we might agree is ``simplest.'' The +problem of algebraic simplification is complex because, among other +reasons, a form that may be simplest for one purpose may not be for +another. + +

                                                                                    +Exercise 2.56.  Show how to extend the basic differentiator to handle more kinds of +expressions. For instance, implement the differentiation rule

                                                                                    + +

                                                                                    + +by adding a new clause to the deriv program +and defining +appropriate procedures exponentiation?, base, exponent, +and make-exponentiation. (You may use the symbol ** to denote +exponentiation.) +Build in the rules that anything raised to the power 0 is 1 and +anything raised to the power 1 is the thing itself. + +

                                                                                    + +

                                                                                    +Exercise 2.57.  Extend the differentiation program to handle sums and products of +arbitrary numbers of (two or more) terms. +Then the last example above could be expressed as +

                                                                                    (deriv '(* x y (+ x 3)) 'x)
                                                                                    +

                                                                                    +Try to do this by changing only the +representation for sums and products, without changing the deriv procedure at all. For example, the addend of a sum would +be the first term, and the augend would be the sum of the rest +of the terms. +

                                                                                    + +

                                                                                    +Exercise 2.58.  Suppose we want to modify the differentiation program so that it works +with ordinary mathematical notation, in which + and * are +infix rather than prefix operators. Since the differentiation program +is defined in terms of abstract data, we can modify it to work with +different representations of expressions solely by changing the +predicates, selectors, and constructors that define the representation +of the algebraic expressions on which the differentiator is to +operate.

                                                                                    + +

                                                                                    a. Show how to do this in order to differentiate algebraic +expressions presented in infix form, such as (x + (3 * (x + (y + 2)))). +To simplify the task, assume that + and * always +take two arguments and that expressions are fully parenthesized.

                                                                                    + +

                                                                                    b. The problem becomes substantially harder if we allow standard +algebraic notation, such as (x + 3 * (x + y + 2)), which drops +unnecessary parentheses and assumes that multiplication is done before +addition. Can you design appropriate predicates, selectors, and +constructors for this notation such that our derivative program still +works? +

                                                                                    + + +

                                                                                    2.3.3  Example: Representing Sets

                                                                                    + + + +In the previous examples we built representations for two kinds of +compound data objects: rational numbers and algebraic expressions. In +one of these examples we had the choice of simplifying (reducing) the +expressions at either construction time or selection time, but other +than that the choice of a representation for these structures in terms +of lists was straightforward. When we turn to the representation of +sets, the choice of a representation is not so obvious. Indeed, there +are a number of possible representations, and they differ +significantly from one another in several ways.

                                                                                    + + +Informally, a set is simply a collection of distinct objects. To give +a more precise definition we can employ the method of data +abstraction. That is, we define ``set'' by specifying the operations +that are to be used on sets. These are union-set, +intersection-set, element-of-set?, and adjoin-set. +Element-of-set? is a predicate that determines whether a given +element is a member of a set. Adjoin-set takes an object and a +set as arguments and returns a set that contains the elements of the +original set and also the adjoined element. Union-set computes +the union of two sets, which is the set containing each element that +appears in either argument. Intersection-set computes the +intersection of two sets, which is the set containing only elements +that appear in both arguments. From the viewpoint of data abstraction, we +are free to design any representation that implements these operations +in a way consistent with the interpretations given above.37 +

                                                                                    + + + +

                                                                                    Sets as unordered lists

                                                                                    + + +One way to represent a set is as a list of its elements in which no +element appears more than once. The empty set is represented by the +empty list. In this representation, element-of-set? is similar +to the procedure memq of section 2.3.1. It uses equal? +instead of eq? so that the set elements need not be symbols:

                                                                                    + +

                                                                                    (define (element-of-set? x set)
                                                                                    +  (cond ((null? set) false)
                                                                                    +        ((equal? x (car set)) true)
                                                                                    +        (else (element-of-set? x (cdr set)))))
                                                                                    +

                                                                                    +Using this, we can write adjoin-set. If the object to be adjoined +is already in the set, we just return the set. Otherwise, we use +cons to add the object to the list that represents the set:

                                                                                    + +

                                                                                    (define (adjoin-set x set)
                                                                                    +  (if (element-of-set? x set)
                                                                                    +      set
                                                                                    +      (cons x set)))
                                                                                    +

                                                                                    +For intersection-set we can use a recursive strategy. If we +know how to form the intersection of set2 and the cdr +of set1, we only need to decide whether to include +the car of set1 in this. But this depends on whether (car +set1) is also in set2. Here is the resulting procedure:

                                                                                    + +

                                                                                    (define (intersection-set set1 set2)
                                                                                    +  (cond ((or (null? set1) (null? set2)) '())
                                                                                    +        ((element-of-set? (car set1) set2)        
                                                                                    +         (cons (car set1)
                                                                                    +               (intersection-set (cdr set1) set2)))
                                                                                    +        (else (intersection-set (cdr set1) set2))))
                                                                                    +

                                                                                    + +In designing a representation, one of the issues we should be +concerned with is efficiency. Consider the number of steps required by our set +operations. Since they all use element-of-set?, the speed +of this operation has a major impact on the efficiency of the set +implementation as a whole. Now, in order to check whether an object +is a member of a set, element-of-set? may have to scan the +entire set. (In the worst case, the object turns out not to be in the +set.) Hence, if the set has n elements, element-of-set? +might take up to n steps. Thus, the number of steps +required grows as (n). +The number of steps required by adjoin-set, which uses this operation, +also grows as (n). For intersection-set, which does an element-of-set? check for each element of set1, the number of steps +required grows as the product of the sizes of the sets involved, or +(n2) for two sets of size n. The same will be true of union-set.

                                                                                    + +

                                                                                    +Exercise 2.59.  Implement the union-set operation for the unordered-list +representation of sets. +

                                                                                    + +

                                                                                    +Exercise 2.60.  We specified that a set would be represented as a list with no +duplicates. Now suppose we allow duplicates. For instance, +the set {1,2,3} could be represented as the list (2 3 2 1 3 2 +2). Design procedures element-of-set?, adjoin-set, union-set, and intersection-set that operate on this +representation. How does the efficiency of each compare with the +corresponding procedure for the non-duplicate representation? Are +there applications for which you would use this representation in +preference to the non-duplicate one? +

                                                                                    + + + +

                                                                                    Sets as ordered lists

                                                                                    + + +One way to speed up our set operations is to change the representation +so that the set elements are listed in increasing order. To do this, +we need some way to compare two objects so that we can say which is +bigger. For example, we could compare symbols lexicographically, or +we could agree on some method for assigning a unique number to an +object and then compare the elements by comparing the corresponding +numbers. To keep our discussion simple, we will consider only the +case where the set elements are numbers, so that we can compare +elements using > and <. We will represent a set of +numbers by listing its elements in increasing order. Whereas our +first representation above allowed us to represent the set +{1,3,6,10} by listing the elements in any order, our new +representation allows only the list (1 3 6 10).

                                                                                    + +One advantage of ordering shows up in element-of-set?: In +checking for the presence of an item, we no longer have to scan the +entire set. If we reach a set element that is larger than the item we +are looking for, then we know that the item is not in the set:

                                                                                    + +

                                                                                    (define (element-of-set? x set)
                                                                                    +  (cond ((null? set) false)
                                                                                    +        ((= x (car set)) true)
                                                                                    +        ((< x (car set)) false)
                                                                                    +        (else (element-of-set? x (cdr set)))))
                                                                                    +

                                                                                    +How many steps does this save? In the worst case, the item we are +looking for may be the largest one in the set, so the number of steps +is the same as for the unordered representation. On the other hand, +if we search for items of many different sizes we can expect that +sometimes we will be able to stop searching at a point near the +beginning of the list and that other times we will still need to +examine most of the list. On the average we should expect to have to +examine about half of the items in the set. Thus, the average +number of steps required will be about n/2. +This is still (n) growth, but +it does save us, on the average, a factor of 2 in number of steps over the +previous implementation.

                                                                                    + +We obtain a more impressive speedup with intersection-set. In +the unordered representation this operation required +(n2) steps, because we performed a complete scan of set2 for +each element of set1. But with the ordered representation, we +can use a more clever method. Begin by comparing the initial +elements, x1 and x2, of the two sets. If x1 +equals x2, then that gives an element of the intersection, and +the rest of the intersection is the intersection of the cdrs of +the two sets. Suppose, however, that x1 is less than x2. +Since x2 is the smallest element in set2, we can +immediately conclude that x1 cannot appear anywhere in set2 and hence is not in the intersection. Hence, the intersection +is equal to the intersection of set2 with the cdr of set1. Similarly, if x2 is less than x1, then the +intersection is given by the intersection of set1 with the cdr of set2. Here is the procedure:

                                                                                    + +

                                                                                    (define (intersection-set set1 set2)
                                                                                    +  (if (or (null? set1) (null? set2))
                                                                                    +      '()    
                                                                                    +      (let ((x1 (car set1)) (x2 (car set2)))
                                                                                    +        (cond ((= x1 x2)
                                                                                    +               (cons x1
                                                                                    +                     (intersection-set (cdr set1)
                                                                                    +                                       (cdr set2))))
                                                                                    +              ((< x1 x2)
                                                                                    +               (intersection-set (cdr set1) set2))
                                                                                    +              ((< x2 x1)
                                                                                    +               (intersection-set set1 (cdr set2)))))))
                                                                                    +

                                                                                    +To estimate the number of steps required by this process, observe that at each +step we reduce the intersection problem to computing intersections of +smaller sets -- removing the first element from set1 or set2 or both. Thus, the number of steps required is at most the sum +of the sizes of set1 and set2, rather than the product of +the sizes as with the unordered representation. This is (n) growth +rather than (n2) -- a considerable speedup, even for sets of +moderate size.

                                                                                    + +

                                                                                    +Exercise 2.61.  Give an implementation of adjoin-set using the ordered +representation. By analogy with element-of-set? show how to +take advantage of the ordering to produce a procedure that requires on +the average about half as many steps as with the unordered +representation. + +

                                                                                    + +

                                                                                    +Exercise 2.62.  Give a (n) implementation of union-set for sets +represented as ordered lists. +

                                                                                    +

                                                                                    + + +

                                                                                    Sets as binary trees

                                                                                    + + +We can do better than the ordered-list representation by arranging the +set elements in the form of a tree. Each node of the tree holds one +element of the set, called the ``entry'' at that node, and a link to +each of two other (possibly empty) nodes. The ``left'' link points to +elements smaller than the one at the node, and the ``right'' link to +elements greater than the one at the node. +Figure 2.16 shows some trees that represent the set +{1,3,5,7,9,11}. The same set may be represented by a tree in a +number of different ways. The only thing we require for a valid +representation is that all elements in the left subtree be smaller +than the node entry and that all elements in the right subtree be +larger.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.16:  Various binary trees that represent the set { 1,3,5,7,9,11 }.
                                                                                    + +

                                                                                    + +The advantage of the tree representation is this: Suppose we want to +check whether a number x is contained in a set. We begin by +comparing x with the entry in the top node. If x is less than +this, we know that we need only search the left subtree; if x is +greater, we need only search the right subtree. Now, if the tree is +``balanced,'' each of these subtrees will be about half the size of +the original. Thus, in one step we have reduced the problem of +searching a tree of size n to searching a tree of size n/2. Since +the size of the tree is halved at each step, we should expect that the +number of steps needed to search a tree of size n grows as (log +n).38 For large sets, this will +be a significant speedup over the previous representations.

                                                                                    + +We can represent trees by using lists. Each node will be a list of +three items: the entry at the node, the left subtree, and the right +subtree. A left or a right subtree of the empty list will indicate +that there is no subtree connected there. We can describe this +representation by the following procedures:39

                                                                                    + +

                                                                                    (define (entry tree) (car tree))
                                                                                    +(define (left-branch tree) (cadr tree))
                                                                                    +(define (right-branch tree) (caddr tree))
                                                                                    +(define (make-tree entry left right)
                                                                                    +  (list entry left right))
                                                                                    +

                                                                                    + +Now we can write the element-of-set? procedure using the strategy +described above:

                                                                                    + +

                                                                                    (define (element-of-set? x set)
                                                                                    +  (cond ((null? set) false)
                                                                                    +        ((= x (entry set)) true)
                                                                                    +        ((< x (entry set))
                                                                                    +         (element-of-set? x (left-branch set)))
                                                                                    +        ((> x (entry set))
                                                                                    +         (element-of-set? x (right-branch set)))))
                                                                                    +

                                                                                    + +Adjoining an item to a set is implemented similarly and also requires +(log n) steps. To adjoin an item x, we compare x with +the node entry to determine whether x should be added to the +right or to the left branch, and having adjoined x to the +appropriate branch we piece this newly constructed branch together +with the original entry and the other branch. If x is equal to +the entry, we just return the node. If we are asked to adjoin +x to an empty tree, we generate a tree that has x as the +entry and empty right and left branches. Here is the procedure:

                                                                                    + +

                                                                                    (define (adjoin-set x set)
                                                                                    +  (cond ((null? set) (make-tree x '() '()))
                                                                                    +        ((= x (entry set)) set)
                                                                                    +        ((< x (entry set))
                                                                                    +         (make-tree (entry set) 
                                                                                    +                    (adjoin-set x (left-branch set))
                                                                                    +                    (right-branch set)))
                                                                                    +        ((> x (entry set))
                                                                                    +         (make-tree (entry set)
                                                                                    +                    (left-branch set)
                                                                                    +                    (adjoin-set x (right-branch set))))))
                                                                                    +

                                                                                    + +The above claim that searching the tree can be performed in a logarithmic +number of steps +rests on the assumption that the tree is ``balanced,'' i.e., that the +left and the right subtree of every tree have approximately the same +number of elements, so that each subtree contains about half the +elements of its parent. But how can we be certain that the trees we +construct will be balanced? Even if we start with a balanced tree, +adding elements with adjoin-set may produce an unbalanced +result. Since the position of a newly adjoined element depends on how +the element compares with the items already in the set, we can expect +that if we add elements ``randomly'' the tree will tend to be balanced +on the average. But this is not a guarantee. For example, if we +start with an empty set and adjoin the numbers 1 through 7 in sequence +we end up with the highly unbalanced tree shown in +figure 2.17. In this tree all the left subtrees +are empty, so it has no advantage over a simple ordered list. One +way to solve this problem is to define an operation that transforms an +arbitrary tree into a balanced tree with the same elements. Then we +can perform this transformation after every few adjoin-set +operations to keep our set in balance. There are also other ways to +solve this problem, most of which involve designing new data +structures for which searching and insertion both can be done in +(log n) steps.40

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.17:  Unbalanced tree produced by adjoining 1 through 7 in sequence.
                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 2.63.  Each of the following two procedures converts a binary tree to a list. +

                                                                                    (define (tree->list-1 tree)
                                                                                    +  (if (null? tree)
                                                                                    +      '()
                                                                                    +      (append (tree->list-1 (left-branch tree))
                                                                                    +              (cons (entry tree)
                                                                                    +                    (tree->list-1 (right-branch tree))))))
                                                                                    +(define (tree->list-2 tree)
                                                                                    +  (define (copy-to-list tree result-list)
                                                                                    +    (if (null? tree)
                                                                                    +        result-list
                                                                                    +        (copy-to-list (left-branch tree)
                                                                                    +                      (cons (entry tree)
                                                                                    +                            (copy-to-list (right-branch tree)
                                                                                    +                                          result-list)))))
                                                                                    +  (copy-to-list tree '()))
                                                                                    +

                                                                                    +

                                                                                    a. Do the two procedures produce the same result for every tree? If +not, how do the results differ? What lists do the two procedures +produce for the trees in figure 2.16? + +

                                                                                    b. Do the two procedures have the same order of growth in the number +of steps required to convert a balanced tree with n elements to a list? +If not, which one grows more slowly? + +

                                                                                    + +

                                                                                    +Exercise 2.64.  The following procedure list->tree converts an ordered list to a +balanced binary tree. The helper procedure partial-tree takes +as arguments an integer n and list of at least n elements and +constructs a balanced tree containing the first n elements of the +list. The result returned by partial-tree is a pair (formed +with cons) whose car is the constructed tree and whose +cdr is the list of elements not included in the tree.

                                                                                    + +

                                                                                    (define (list->tree elements)
                                                                                    +  (car (partial-tree elements (length elements))))
                                                                                    +
                                                                                    +(define (partial-tree elts n)
                                                                                    +  (if (= n 0)
                                                                                    +      (cons '() elts)
                                                                                    +      (let ((left-size (quotient (- n 1) 2)))
                                                                                    +        (let ((left-result (partial-tree elts left-size)))
                                                                                    +          (let ((left-tree (car left-result))
                                                                                    +                (non-left-elts (cdr left-result))
                                                                                    +                (right-size (- n (+ left-size 1))))
                                                                                    +            (let ((this-entry (car non-left-elts))
                                                                                    +                  (right-result (partial-tree (cdr non-left-elts)
                                                                                    +                                              right-size)))
                                                                                    +              (let ((right-tree (car right-result))
                                                                                    +                    (remaining-elts (cdr right-result)))
                                                                                    +                (cons (make-tree this-entry left-tree right-tree)
                                                                                    +                      remaining-elts))))))))
                                                                                    +

                                                                                    + +

                                                                                    a. Write a short paragraph explaining as clearly as you can how partial-tree works. Draw the tree produced by list->tree for +the list (1 3 5 7 9 11). + +

                                                                                    b. What is the order of growth in the number of steps required by list->tree to convert a list of n elements? + +

                                                                                    + +

                                                                                    +Exercise 2.65.  Use the results of exercises 2.63 and + 2.64 to give (n) implementations of union-set and intersection-set for sets implemented as +(balanced) binary trees.41 + +

                                                                                    + + +

                                                                                    Sets and information retrieval

                                                                                    + + +We have examined options for using lists to represent sets and have +seen how the choice of representation for a data object can have a +large impact on the performance of the programs that use the data. +Another reason for concentrating on sets is that the techniques +discussed here appear again and again in applications involving +information retrieval.

                                                                                    + +Consider a data base containing a large number of individual records, +such as the personnel files for a company or the transactions in an +accounting system. A typical data-management system spends a large +amount of time accessing or modifying the data in the records and +therefore requires an efficient method for accessing records. This is +done by identifying a part of each record to serve as an identifying +key. A key can be anything that uniquely identifies the +record. For a personnel file, it might be an employee's ID number. +For an accounting system, it might be a transaction number. Whatever +the key is, when we define the record as a data structure we should +include a key selector procedure that retrieves the key +associated with a given record.

                                                                                    + +Now we represent the data base as a set of records. To locate the +record with a given key we use a procedure lookup, which takes +as arguments a key and a data base and which returns the record that +has that key, or false if there is no such record. Lookup +is implemented in almost the same way as element-of-set?. For +example, if the set of records is implemented as an unordered list, we +could use

                                                                                    + +

                                                                                    (define (lookup given-key set-of-records)
                                                                                    +  (cond ((null? set-of-records) false)
                                                                                    +        ((equal? given-key (key (car set-of-records)))
                                                                                    +         (car set-of-records))
                                                                                    +        (else (lookup given-key (cdr set-of-records)))))
                                                                                    +

                                                                                    + +Of course, there are better ways to represent large sets than as +unordered lists. Information-retrieval systems in which records have +to be ``randomly accessed'' are typically implemented by a tree-based +method, such as the binary-tree representation discussed previously. +In designing such a system the methodology of data abstraction +can be a great help. The designer can create an initial +implementation using a simple, straightforward representation such as +unordered lists. This will be unsuitable for the eventual system, but +it can be useful in providing a ``quick and dirty'' data base with +which to test the rest of the system. Later on, the data +representation can be modified to be more sophisticated. If the data +base is accessed in terms of abstract selectors and constructors, this +change in representation will not require any changes to the rest of +the system.

                                                                                    + +

                                                                                    +Exercise 2.66.  Implement the lookup procedure for the case +where the set of records is structured as a binary tree, ordered by +the numerical values of the keys. + +

                                                                                    + + +

                                                                                    2.3.4  Example: Huffman Encoding Trees

                                                                                    + + +This section provides practice in the use of list structure and data +abstraction to manipulate sets and trees. The application is to +methods for representing data as sequences of ones and zeros (bits). +For example, the ASCII standard code used to represent text in +computers encodes each character as a sequence of seven bits. Using +seven bits allows us to distinguish 27, or 128, possible different +characters. In general, if we want to distinguish n different +symbols, we will need to use log2 n bits per symbol. If all our +messages are made up of the eight symbols A, B, C, D, E, F, G, and H, +we can choose a code with three bits per character, for example + +
                                                                                    A 000 C 010 E 100 G 110
                                                                                    B 001 D 011 F 101 H 111 +
                                                                                    +With this code, the message

                                                                                    + +

                                                                                    BACADAEAFABBAAAGAH

                                                                                    + +

                                                                                    is encoded as the string of 54 bits

                                                                                    + +

                                                                                    001000010000011000100000101000001001000000000110000111

                                                                                    + +

                                                                                    Codes such as ASCII and the A-through-H code above are known as fixed-length codes, because they represent each symbol in the message +with the same number of bits. It is sometimes advantageous to use +variable-length codes, in which different symbols may be +represented by different numbers of bits. For example, Morse code +does not use the same number of dots and dashes for each letter of the +alphabet. In particular, E, the most frequent letter, is represented +by a single dot. In general, if our messages are such that some +symbols appear very frequently and some very rarely, we can encode +data more efficiently (i.e., using fewer bits per message) if we +assign shorter codes to the frequent symbols. Consider the following +alternative code for the letters A through H: + +
                                                                                    A 0 C 1010 E 1100 G 1110
                                                                                    B 100 D 1011 F 1101 H 1111 +
                                                                                    +With this code, the same message as above is encoded as the string

                                                                                    + +

                                                                                    100010100101101100011010100100000111001111

                                                                                    + +

                                                                                    This string contains 42 bits, so it saves more than 20% in space in +comparison with the fixed-length code shown above.

                                                                                    + +One of the difficulties of using a variable-length code is knowing +when you have reached the end of a symbol in reading a sequence of +zeros and ones. Morse code solves this problem by using a special +separator code (in this case, a pause) after the sequence of +dots and dashes for each letter. Another solution is to design the +code in such a way that no complete code for any symbol is the +beginning (or prefix) of the code for another symbol. Such a +code is called a prefix code. In the example above, A is +encoded by 0 and B is encoded by 100, so no other symbol can have a +code that begins with 0 or with 100.

                                                                                    + +In general, we can attain significant savings if we use +variable-length prefix codes that take advantage of the relative +frequencies of the symbols in the messages to be encoded. One +particular scheme for doing this is called the Huffman encoding +method, after its discoverer, David Huffman. A Huffman code can be +represented as a binary tree whose leaves are the symbols that are +encoded. At each non-leaf node of the tree there is a set containing +all the symbols in the leaves that lie below the node. In addition, +each symbol at a leaf is assigned a weight (which is its +relative frequency), and each non-leaf +node contains a weight that is the sum of all the weights of the +leaves lying below it. The weights are not used in the encoding or +the decoding process. We will see below how they are used to help +construct the tree.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.18:  A Huffman encoding tree.
                                                                                    + +

                                                                                    + +Figure 2.18 shows the Huffman tree for the A-through-H +code given above. The weights at the leaves +indicate that the tree was designed for messages in which A appears +with relative frequency 8, B with relative frequency 3, and the +other letters each with relative frequency 1.

                                                                                    + +Given a Huffman tree, we can find the encoding of any symbol by +starting at the root and moving down until we reach the leaf that +holds the symbol. Each time we move down a left branch we add a 0 to +the code, and each time we move down a right branch we add a 1. (We +decide which branch to follow by testing to see which branch either is +the leaf node for the symbol or contains the symbol in its set.) For +example, starting from the root of the tree in +figure 2.18, we arrive at the leaf for D by following a +right branch, then a left branch, then a right branch, then a right +branch; hence, the code for D is 1011.

                                                                                    + +To decode a bit sequence using a Huffman tree, we begin at the root +and use the successive zeros and ones of the bit sequence to determine +whether to move down the left or the right branch. Each time we come +to a leaf, we have generated a new symbol in the message, at which +point we start over from the root of the tree to find the next symbol. +For example, suppose we are given the tree above and the sequence +10001010. Starting at the root, we move down the right branch, (since +the first bit of the string is 1), then down the left branch (since +the second bit is 0), then down the left branch (since the third bit +is also 0). This brings us to the leaf for B, so the first symbol of +the decoded message is B. Now we start again at the root, and we make +a left move because the next bit in the string is 0. This brings us +to the leaf for A. Then we start again at the root with the rest of +the string 1010, so we move right, left, right, left and reach C. +Thus, the entire message is BAC.

                                                                                    + + +

                                                                                    Generating Huffman trees

                                                                                    + +Given an ``alphabet'' of symbols and their relative frequencies, how +do we construct the ``best'' code? (In other words, which tree will +encode messages with the fewest bits?) Huffman gave an algorithm for +doing this and showed that the resulting code is indeed the best +variable-length code for messages where the relative frequency of the +symbols matches the frequencies with which the code was constructed. +We will not prove this optimality of Huffman codes here, but we will +show how Huffman trees are constructed.42

                                                                                    + +The algorithm for generating a Huffman tree is very simple. The idea +is to arrange the tree so that the symbols with the lowest frequency +appear farthest away from the root. Begin with the set of leaf nodes, +containing symbols and their frequencies, as determined by the initial data +from which the code is to be constructed. Now find two leaves with +the lowest weights and merge them to produce a node that has these +two nodes as its left and right branches. The weight of the new node +is the sum of the two weights. Remove the two leaves from the +original set and replace them by this new node. Now continue this +process. At each step, merge two nodes with the smallest weights, +removing them from the set and replacing them with a node that has +these two as its left and right branches. The process stops when +there is only one node left, which is the root of the entire tree. +Here is how the Huffman tree of figure 2.18 was generated:

                                                                                    + + + + + + + + + +
                                                                                    Initial leaves {(A 8) (B 3) (C 1) + (D 1) (E 1) (F 1) (G 1) (H 1)}

                                                                                    + +Merge

                                                                                    {(A 8) (B 3) ({C D} 2) (E +1) (F 1) (G 1) (H 1)}

                                                                                    + +Merge

                                                                                    {(A 8) (B 3) ({C D} 2) +({E F} 2) (G 1) (H 1)}

                                                                                    + +Merge

                                                                                    {(A 8) (B 3) ({C D} 2) +({E F} 2) ({G H} 2)}

                                                                                    + +Merge

                                                                                    {(A 8) (B 3) ({C D} 2) ({E F G H} 4)}

                                                                                    + +Merge

                                                                                    {(A 8) ({B C D} 5) ({E F G H} 4)}

                                                                                    + +Merge

                                                                                    {(A 8) ({B C D E F G H} 9)}

                                                                                    + +Final merge

                                                                                    {({A B C D E F G H} 17)}
                                                                                    +The algorithm does not always specify a unique tree, because there may +not be unique smallest-weight nodes at each step. Also, the choice of +the order in which the two nodes are merged (i.e., which will be the +right branch and which will be the left branch) is arbitrary.

                                                                                    + + +

                                                                                    Representing Huffman trees

                                                                                    + +In the exercises below we will work with a system that uses +Huffman trees to encode and decode messages and generates Huffman +trees according to the algorithm outlined above. We will begin by +discussing how trees are represented.

                                                                                    + +Leaves of the tree are represented by a list consisting of the +symbol leaf, the symbol at the leaf, and the weight:

                                                                                    + +

                                                                                    (define (make-leaf symbol weight)
                                                                                    +  (list 'leaf symbol weight))
                                                                                    +(define (leaf? object)
                                                                                    +  (eq? (car object) 'leaf))
                                                                                    +(define (symbol-leaf x) (cadr x))
                                                                                    +(define (weight-leaf x) (caddr x))
                                                                                    +

                                                                                    +A general tree will be a list of a left branch, a right branch, a set +of symbols, and a weight. The set of symbols will be simply a list of +the symbols, rather than some more sophisticated set representation. +When we make a tree by merging two nodes, we obtain the weight of the +tree as the sum of the weights of the nodes, and the set of symbols as +the union of the sets of symbols for the nodes. Since our symbol sets are +represented as lists, we can form the union by using the append +procedure we defined in section 2.2.1:

                                                                                    + +

                                                                                    (define (make-code-tree left right)
                                                                                    +  (list left
                                                                                    +        right
                                                                                    +        (append (symbols left) (symbols right))
                                                                                    +        (+ (weight left) (weight right))))
                                                                                    +

                                                                                    +If we make a tree in this way, we have the following selectors:

                                                                                    + +

                                                                                    (define (left-branch tree) (car tree))
                                                                                    +
                                                                                    +(define (right-branch tree) (cadr tree))
                                                                                    +(define (symbols tree)
                                                                                    +  (if (leaf? tree)
                                                                                    +      (list (symbol-leaf tree))
                                                                                    +      (caddr tree)))
                                                                                    +(define (weight tree)
                                                                                    +  (if (leaf? tree)
                                                                                    +      (weight-leaf tree)
                                                                                    +      (cadddr tree)))
                                                                                    +

                                                                                    +The procedures symbols and weight must do something +slightly different depending on whether they are called with a leaf or +a general tree. These are simple examples of generic +procedures (procedures that can handle more than one kind of data), +which we will have much more to say about in +sections 2.4 and 2.5.

                                                                                    + + +

                                                                                    The decoding procedure

                                                                                    + +The following procedure implements the decoding algorithm. +It takes as arguments a list of zeros and ones, together with +a Huffman tree.

                                                                                    + +

                                                                                    (define (decode bits tree)
                                                                                    +  (define (decode-1 bits current-branch)
                                                                                    +    (if (null? bits)
                                                                                    +        '()
                                                                                    +        (let ((next-branch
                                                                                    +               (choose-branch (car bits) current-branch)))
                                                                                    +          (if (leaf? next-branch)
                                                                                    +              (cons (symbol-leaf next-branch)
                                                                                    +                    (decode-1 (cdr bits) tree))
                                                                                    +              (decode-1 (cdr bits) next-branch)))))
                                                                                    +  (decode-1 bits tree))
                                                                                    +(define (choose-branch bit branch)
                                                                                    +  (cond ((= bit 0) (left-branch branch))
                                                                                    +        ((= bit 1) (right-branch branch))
                                                                                    +        (else (error "bad bit -- CHOOSE-BRANCH" bit))))
                                                                                    +

                                                                                    +The procedure decode-1 takes two arguments: the list of remaining bits +and the current position in the tree. It keeps moving +``down'' the tree, choosing a left or a right branch according to +whether the next bit in the list is a zero or a one. (This is done +with the procedure choose-branch.) When it reaches a leaf, it +returns the symbol at that leaf as the next symbol in the message by +consing it onto the result of decoding +the rest of the message, starting at the root of the tree. +Note the error check in the final clause of choose-branch, which +complains if the procedure finds something other than a zero or a one in the +input data.

                                                                                    + + +

                                                                                    Sets of weighted elements

                                                                                    + +In our representation of trees, each non-leaf node contains a set of +symbols, which we have represented as a simple list. However, the +tree-generating algorithm discussed above requires that we also work +with sets of leaves and trees, successively merging the two smallest +items. Since we will be required to repeatedly find the smallest item +in a set, it is convenient to use an ordered representation for this +kind of set.

                                                                                    + +We will represent a set of leaves and trees as a list of elements, +arranged in increasing order of weight. The following adjoin-set procedure for constructing sets is similar to the one +described in exercise 2.61; however, items are compared +by their weights, and the element being added to the set is +never already in it.

                                                                                    + +

                                                                                    (define (adjoin-set x set)
                                                                                    +  (cond ((null? set) (list x))
                                                                                    +        ((< (weight x) (weight (car set))) (cons x set))
                                                                                    +        (else (cons (car set)
                                                                                    +                    (adjoin-set x (cdr set))))))
                                                                                    +

                                                                                    + +The following procedure takes a list of +symbol-frequency pairs such as ((A 4) (B 2) (C 1) (D 1)) and +constructs an initial ordered set of leaves, ready to be merged +according to the Huffman algorithm:

                                                                                    + +

                                                                                    (define (make-leaf-set pairs)
                                                                                    +  (if (null? pairs)
                                                                                    +      '()
                                                                                    +      (let ((pair (car pairs)))
                                                                                    +        (adjoin-set (make-leaf (car pair)    ; symbol
                                                                                    +                               (cadr pair))  ; frequency
                                                                                    +                    (make-leaf-set (cdr pairs))))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.67.  Define an encoding tree and a sample message:

                                                                                    + + +

                                                                                    (define sample-tree
                                                                                    +  (make-code-tree (make-leaf 'A 4)
                                                                                    +                  (make-code-tree
                                                                                    +                   (make-leaf 'B 2)
                                                                                    +                   (make-code-tree (make-leaf 'D 1)
                                                                                    +                                   (make-leaf 'C 1)))))
                                                                                    +
                                                                                    +(define sample-message '(0 1 1 0 0 1 0 1 0 1 1 1 0))
                                                                                    +

                                                                                    +Use the decode procedure to decode the +message, and give the result. + +

                                                                                    + + +

                                                                                    +Exercise 2.68.  The encode procedure takes as arguments a message and a tree and +produces the list of bits that gives the encoded message.

                                                                                    + + +

                                                                                    (define (encode message tree)
                                                                                    +  (if (null? message)
                                                                                    +      '()
                                                                                    +      (append (encode-symbol (car message) tree)
                                                                                    +              (encode (cdr message) tree))))
                                                                                    +

                                                                                    +Encode-symbol is a procedure, which you must write, that returns +the list of bits that encodes a given symbol according to a given +tree. You should design encode-symbol so that it signals an +error if the symbol is not in the tree at all. Test your procedure by +encoding the result you obtained in exercise 2.67 with +the sample tree and seeing whether it is the same as the original +sample message. +

                                                                                    + +

                                                                                    +Exercise 2.69.  The following procedure takes as its argument a list of +symbol-frequency pairs (where no symbol appears in more than one pair) +and generates a Huffman encoding tree according to the Huffman +algorithm.

                                                                                    + +

                                                                                    (define (generate-huffman-tree pairs)
                                                                                    +  (successive-merge (make-leaf-set pairs)))
                                                                                    +

                                                                                    +Make-leaf-set is the procedure given above that transforms the +list of pairs into an ordered set of leaves. Successive-merge +is the procedure you must write, using make-code-tree to +successively merge the smallest-weight elements of the set until there +is only one element left, which is the desired Huffman tree. (This +procedure is slightly tricky, but not really complicated. If you find +yourself designing a complex procedure, then you are almost certainly +doing something wrong. You can take significant advantage of the fact +that we are using an ordered set representation.) + +

                                                                                    + +

                                                                                    +Exercise 2.70.  The following eight-symbol alphabet with associated relative +frequencies was designed to efficiently encode the lyrics of 1950s +rock songs. (Note that the ``symbols'' of an ``alphabet'' need not be +individual letters.)

                                                                                    + + + + +
                                                                                    A 2 NA 16
                                                                                    BOOM 1 SHA 3
                                                                                    GET 2 YIP 9
                                                                                    JOB 2 WAH 1 +
                                                                                    +Use generate-huffman-tree (exercise 2.69) +to generate a corresponding Huffman tree, and use +encode (exercise 2.68) +to encode the following message:

                                                                                    + +

                                                                                    Get a job

                                                                                    + +Sha na na na na na na na na

                                                                                    + +Get a job

                                                                                    + +Sha na na na na na na na na

                                                                                    + +Wah yip yip yip yip yip yip yip yip yip

                                                                                    + +Sha boom

                                                                                    + +

                                                                                    How many bits are required for the encoding? What is the smallest +number of bits that would be needed to encode this song if we +used a fixed-length code for the eight-symbol alphabet? +

                                                                                    + +

                                                                                    +Exercise 2.71.  Suppose we have a Huffman tree for an alphabet of n symbols, and +that the relative frequencies of the symbols are 1, 2, 4, ..., +2n-1. Sketch the tree for n=5; for n=10. In such a tree +(for general n) how many bits are required to encode the most +frequent symbol? the least frequent symbol? + +

                                                                                    + +

                                                                                    +Exercise 2.72.  Consider the encoding procedure that you designed in +exercise 2.68. What is the order of growth in the +number of steps needed to encode a symbol? Be sure to include the +number of steps needed to search the symbol list at each node +encountered. To answer this question in general is difficult. +Consider the special case where the relative frequencies of the n +symbols are as described in exercise 2.71, and give +the order of growth (as a function of n) of the number of steps +needed to encode the most frequent and least frequent symbols in the +alphabet. +

                                                                                    + +


                                                                                    +

                                                                                    32 Allowing quotation in a language wreaks havoc +with the ability to reason about the language in simple terms, because +it destroys the notion that equals can be substituted for equals. For +example, three is one plus two, but the word ``three'' is not the +phrase ``one plus two.'' Quotation is powerful because it gives us a way +to build expressions that manipulate other expressions (as we will see +when we write an interpreter in chapter 4). But allowing statements in +a language that talk about other statements in that language makes it +very difficult to maintain any coherent principle of what ``equals can +be substituted for equals'' should mean. For example, if we know that +the evening star is the morning star, then from the statement ``the +evening star is Venus'' we can deduce ``the morning star is Venus.'' +However, given that ``John knows that the evening star is Venus'' we +cannot infer that ``John knows that the morning star is Venus.'' + +

                                                                                    33 The single quote is different from the double quote we have +been using to enclose character strings to be printed. Whereas the +single quote can be used to denote lists or symbols, the double quote +is used only with character strings. In this book, the only use for +character strings is as items to be printed. + +

                                                                                    34 Strictly, our +use of the quotation mark violates the general rule that all compound +expressions in our language should be delimited by parentheses +and look like lists. We +can recover this consistency by introducing a special form quote, which serves the same purpose as the quotation mark. Thus, we +would type (quote a) instead of 'a, and we would type (quote (a b c)) instead of '(a b c). This is precisely how the +interpreter works. The quotation mark is just a single-character +abbreviation for wrapping the next complete expression with quote to form (quote <expression>). This is important +because it maintains the principle that any expression seen by the +interpreter can be manipulated as a data object. For instance, we +could construct the expression +(car '(a b c)), which is the same as (car (quote (a b c))), +by evaluating (list 'car (list 'quote '(a b c))). + +

                                                                                    35 We can consider two symbols to be ``the same'' if they +consist of the same characters in the same order. Such a definition +skirts a deep issue that we are not yet ready to address: the meaning +of ``sameness'' in a programming language. We will return to this in +chapter 3 (section 3.1.3). + +

                                                                                    36 In practice, programmers +use equal? to compare lists that contain numbers as well as +symbols. Numbers are not considered to be symbols. The question +of whether two numerically equal numbers (as tested by =) are also +eq? is highly implementation-dependent. A better definition +of equal? (such as the one that comes as a primitive in Scheme) +would also stipulate that if a and b are +both numbers, then a and b are equal? if they are +numerically equal. + +

                                                                                    37 If +we want to be more formal, we can specify ``consistent with the +interpretations given above'' to mean that the operations satisfy a +collection of rules such as these:

                                                                                    + +

                                                                                      +
                                                                                    • For any set S and any object x, +(element-of-set? x (adjoin-set x S)) +is true (informally: ``Adjoining an object to a +set produces a set that contains the object'').

                                                                                      + +

                                                                                    • For any sets S and T and any object x, +(element-of-set? x (union-set S T)) +is equal to +(or (element-of-set? x S) (element-of-set? x T)) +(informally: ``The elements of (union S T) are the elements that +are in S or in T'').

                                                                                      + +

                                                                                    • For any object x, +(element-of-set? x '()) +is false (informally: ``No object is an element of the empty set''). +

                                                                                    + + +

                                                                                    38 Halving the size of the problem at each step is the +distinguishing characteristic of logarithmic growth, as we saw with +the fast-exponentiation algorithm of section 1.2.4 +and the half-interval search method of +section 1.3.3. + +

                                                                                    39 We are +representing sets in terms of trees, and trees in terms of lists -- in +effect, a data abstraction built upon a data abstraction. We can +regard the procedures entry, left-branch, right-branch, and make-tree as a way of isolating the +abstraction of a ``binary tree'' from the particular way we might wish +to represent such a tree in terms of list structure. + +

                                                                                    40 Examples of such structures include +B-trees and red-black trees. There is a large literature on +data structures devoted to this problem. See Cormen, +Leiserson, and Rivest 1990. + +

                                                                                    41 Exercises 2.63-2.65 +are due to Paul Hilfinger. + +

                                                                                    42 See Hamming 1980 +for a discussion of the mathematical properties of Huffman codes. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-17.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-17.html new file mode 100644 index 00000000..41363888 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-17.html @@ -0,0 +1,895 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    2.4  Multiple Representations for Abstract Data

                                                                                    + + + +We have introduced data abstraction, a methodology for structuring +systems in such a way that much of a program can be specified +independent of the choices involved in implementing the data objects +that the program manipulates. For example, we saw in +section 2.1.1 how to separate the task of designing a +program that uses rational numbers from the task of implementing +rational numbers in terms of the computer language's primitive +mechanisms for constructing compound data. The key idea was to erect +an abstraction barrier -- in this case, the selectors and constructors +for rational numbers (make-rat, numer, denom) -- that +isolates the way rational numbers are used from their underlying +representation in terms of list structure. A similar abstraction +barrier isolates the details of the procedures that perform rational +arithmetic (add-rat, sub-rat, mul-rat, and div-rat) from the ``higher-level'' procedures that use rational +numbers. The resulting program has the structure shown in +figure 2.1.

                                                                                    + +These data-abstraction barriers are powerful tools for controlling +complexity. By isolating the underlying representations of data +objects, we can divide the task of designing a large program into +smaller tasks that can be performed separately. But this kind of data +abstraction is not yet powerful enough, because it may not always make +sense to speak of ``the underlying representation'' for a data object.

                                                                                    + + +For one thing, there might be more than one useful representation for +a data object, and we might like to design systems that can deal with +multiple representations. To take a simple example, complex numbers +may be represented in two almost equivalent ways: in rectangular form +(real and imaginary parts) and in polar form (magnitude and angle). +Sometimes rectangular form is more appropriate and sometimes polar +form is more appropriate. Indeed, it is perfectly plausible to +imagine a system in which complex numbers are represented in both +ways, and in which the procedures for manipulating complex numbers work +with either representation.

                                                                                    + +More importantly, programming systems are often designed by many +people working over extended periods of time, subject to requirements +that change over time. In such an environment, it is simply not +possible for everyone to agree in advance on choices of data +representation. So in addition to the data-abstraction barriers that +isolate representation from use, we need abstraction barriers that +isolate different design choices from each other and permit different +choices to coexist in a single program. Furthermore, since large +programs are often created by combining pre-existing modules that were +designed in isolation, we need conventions that permit programmers to +incorporate modules into larger systems additively, that is, +without having to redesign or reimplement these modules.

                                                                                    + +In this section, we will learn how to cope with data that may be +represented in different ways by different parts of a program. This +requires constructing generic procedures -- procedures that can +operate on data that may be represented in more than one way. Our +main technique for building generic procedures will be to work in terms +of data objects that have type tags, that is, data objects +that include explicit information about how they are to be processed. +We will also discuss data-directed programming, a powerful and +convenient implementation strategy for additively assembling systems +with generic operations.

                                                                                    + +We begin with the simple complex-number example. We will see how +type tags and data-directed style enable us to design separate +rectangular and polar representations for complex numbers while +maintaining the notion of an abstract ``complex-number'' data object. +We will accomplish this by defining arithmetic procedures for complex +numbers (add-complex, sub-complex, mul-complex, and +div-complex) in terms of generic selectors that access parts of +a complex number independent of how the number is represented. The +resulting complex-number system, as shown in +figure 2.19, contains two different kinds of +abstraction barriers. The ``horizontal'' abstraction barriers play +the same role as the ones in +figure 2.1. They isolate ``higher-level'' +operations from ``lower-level'' representations. In addition, there +is a ``vertical'' barrier that gives us the ability to separately +design and install alternative representations.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.19:  Data-abstraction barriers in the complex-number system.
                                                                                    + +

                                                                                    + + +In section 2.5 we will show how to use +type tags and data-directed style to develop a generic arithmetic +package. This provides procedures (add, mul, and so on) +that can be used to manipulate all sorts of ``numbers'' and can be +easily extended when a new kind of number is needed. +In section 2.5.3, we'll show how to use generic +arithmetic in a system that performs symbolic algebra.

                                                                                    + + +

                                                                                    2.4.1  Representations for Complex Numbers

                                                                                    + +

                                                                                    + +We will develop a system that performs arithmetic operations on +complex numbers as a simple but unrealistic example of a program that +uses generic operations. We begin by discussing two plausible +representations for complex numbers as ordered pairs: rectangular form +(real part and imaginary part) and polar form (magnitude and +angle).43 Section 2.4.2 +will show how both representations can be made to coexist in a single +system through the use of type tags and generic operations.

                                                                                    + +Like rational numbers, complex numbers are naturally represented as +ordered pairs. The set of complex numbers can be thought of as a +two-dimensional space with two orthogonal axes, the ``real'' axis and +the ``imaginary'' axis. (See figure 2.20.) From +this point of view, the complex number z = x + iy (where i2 = - 1) +can be thought of as the point in the plane whose real coordinate is x and whose +imaginary coordinate is y. Addition of complex numbers reduces in +this representation to addition of coordinates:

                                                                                    + +

                                                                                    + +

                                                                                    + +When multiplying complex numbers, it is more natural to think in terms +of representing a complex number in polar form, as a magnitude and an +angle (r and A in figure 2.20). +The product of two complex numbers is the vector obtained by +stretching one complex number by the length of the other and then +rotating it through the angle of the other:

                                                                                    + +

                                                                                    + +

                                                                                    + +Thus, there are two different representations for complex numbers, +which are appropriate for different operations. Yet, from the +viewpoint of someone writing a program that uses complex numbers, the +principle of data abstraction suggests that all the operations for +manipulating complex numbers should be available regardless of which +representation is used by the computer. For example, it is often +useful to be able to find the magnitude of a complex number that is +specified by rectangular coordinates. Similarly, it is often useful +to be able to determine the real part of a complex number that is +specified by polar coordinates.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.20:  Complex numbers as points in the plane.
                                                                                    + +

                                                                                    + +To design such a system, we can follow the same data-abstraction +strategy we followed in designing the rational-number package in +section 2.1.1. Assume that the operations on complex numbers are +implemented in terms of four selectors: real-part, +imag-part, magnitude, and angle. Also assume that +we have two procedures for constructing complex numbers: make-from-real-imag returns a complex number with specified real and +imaginary parts, and make-from-mag-ang returns a complex number with +specified magnitude and angle. These procedures have the property that, +for any complex number z, both

                                                                                    + + +

                                                                                    (make-from-real-imag (real-part z) (imag-part z))
                                                                                    +

                                                                                    +and

                                                                                    + + +

                                                                                    (make-from-mag-ang (magnitude z) (angle z))
                                                                                    +

                                                                                    +produce complex numbers that are equal to z.

                                                                                    + +Using these constructors and selectors, we can implement +arithmetic on complex numbers using the ``abstract data'' specified by +the constructors and selectors, just as we did for rational numbers in +section 2.1.1. As shown in the formulas above, we can add and +subtract complex numbers in terms of real and imaginary parts while +multiplying and dividing complex numbers in terms of magnitudes and +angles:

                                                                                    + +

                                                                                    (define (add-complex z1 z2)
                                                                                    +  (make-from-real-imag (+ (real-part z1) (real-part z2))
                                                                                    +                       (+ (imag-part z1) (imag-part z2))))
                                                                                    +(define (sub-complex z1 z2)
                                                                                    +  (make-from-real-imag (- (real-part z1) (real-part z2))
                                                                                    +                       (- (imag-part z1) (imag-part z2))))
                                                                                    +(define (mul-complex z1 z2)
                                                                                    +  (make-from-mag-ang (* (magnitude z1) (magnitude z2))
                                                                                    +                     (+ (angle z1) (angle z2))))
                                                                                    +(define (div-complex z1 z2)
                                                                                    +  (make-from-mag-ang (/ (magnitude z1) (magnitude z2))
                                                                                    +                     (- (angle z1) (angle z2))))
                                                                                    +

                                                                                    + +To complete the complex-number package, we must choose a +representation and we must implement the constructors and selectors in +terms of primitive numbers and primitive list structure. +There are two obvious ways to do this: We can represent a complex +number in ``rectangular form'' as a pair (real part, imaginary part) +or in ``polar form'' as a pair (magnitude, angle). Which shall we +choose?

                                                                                    + + +In order to make the different choices concrete, imagine that there +are two programmers, Ben Bitdiddle and Alyssa P. Hacker, who are +independently designing representations for the complex-number system. +Ben chooses to represent complex numbers in rectangular form. With +this choice, selecting the real and imaginary parts of a complex +number is straightforward, as is constructing a complex number with +given real and imaginary parts. To find the magnitude and the angle, +or to construct a complex number with a given magnitude and angle, he +uses the trigonometric relations

                                                                                    + +

                                                                                    +

                                                                                    + +which relate the real and imaginary parts (x, y) to the magnitude +and the angle (r, A).44 Ben's representation is +therefore given by the following selectors and constructors:

                                                                                    + +

                                                                                    (define (real-part z) (car z))
                                                                                    +(define (imag-part z) (cdr z))
                                                                                    +(define (magnitude z)
                                                                                    +  (sqrt (+ (square (real-part z)) (square (imag-part z)))))
                                                                                    +(define (angle z)
                                                                                    +  (atan (imag-part z) (real-part z)))
                                                                                    +(define (make-from-real-imag x y) (cons x y))
                                                                                    +(define (make-from-mag-ang r a) 
                                                                                    +  (cons (* r (cos a)) (* r (sin a))))
                                                                                    +

                                                                                    + +Alyssa, in contrast, chooses to represent complex numbers in polar +form. For her, selecting the magnitude and angle is straightforward, +but she has to use the trigonometric relations to obtain the real and +imaginary parts. Alyssa's representation is:

                                                                                    + +

                                                                                    (define (real-part z)
                                                                                    +  (* (magnitude z) (cos (angle z))))
                                                                                    +(define (imag-part z)
                                                                                    +  (* (magnitude z) (sin (angle z))))
                                                                                    +(define (magnitude z) (car z))
                                                                                    +(define (angle z) (cdr z))
                                                                                    +(define (make-from-real-imag x y) 
                                                                                    +  (cons (sqrt (+ (square x) (square y)))
                                                                                    +        (atan y x)))
                                                                                    +(define (make-from-mag-ang r a) (cons r a))
                                                                                    +

                                                                                    + +The discipline of data abstraction ensures that the same implementation of +add-complex, sub-complex, mul-complex, and div-complex will work with either Ben's representation or Alyssa's +representation.

                                                                                    + + +

                                                                                    2.4.2  Tagged data

                                                                                    + + + +One way to view data abstraction is as an application of the +``principle of least commitment.'' In implementing the complex-number +system in section 2.4.1, we can +use either Ben's rectangular representation or Alyssa's polar +representation. The abstraction barrier formed by the selectors and +constructors permits us to defer to the last possible moment the +choice of a concrete representation for our data objects and thus +retain maximum flexibility in our system design.

                                                                                    + +The principle of least commitment can be carried to even further +extremes. If we desire, we can maintain the ambiguity of +representation even after we have designed the selectors and +constructors, and elect to use both Ben's representation and +Alyssa's representation. If both representations are included in a +single system, however, we will need some way to distinguish data in +polar form from data in rectangular form. Otherwise, if we were +asked, for instance, to find the magnitude of the pair (3,4), +we wouldn't know whether to answer 5 (interpreting the number in +rectangular form) or 3 (interpreting the number in polar form). A +straightforward way to accomplish this distinction is to include a +type tag -- the symbol rectangular or polar -- as +part of each complex number. Then when we need to manipulate a +complex number we can use the tag to decide which selector to apply.

                                                                                    + +In order to manipulate tagged data, +we will assume that we have procedures type-tag and contents that extract from a data object the tag and the actual +contents (the polar or rectangular coordinates, in the case of a +complex number). We will also postulate a procedure attach-tag that takes a tag and contents and produces a tagged data +object. A straightforward way to implement this is to use ordinary +list structure:

                                                                                    + +

                                                                                    (define (attach-tag type-tag contents)
                                                                                    +  (cons type-tag contents))
                                                                                    +(define (type-tag datum)
                                                                                    +  (if (pair? datum)
                                                                                    +      (car datum)
                                                                                    +      (error "Bad tagged datum -- TYPE-TAG" datum)))
                                                                                    +(define (contents datum)
                                                                                    +  (if (pair? datum)
                                                                                    +      (cdr datum)
                                                                                    +      (error "Bad tagged datum -- CONTENTS" datum)))
                                                                                    +

                                                                                    + +Using these procedures, we can define predicates rectangular? +and polar?, which recognize polar and rectangular numbers, +respectively:

                                                                                    + +

                                                                                    (define (rectangular? z)
                                                                                    +  (eq? (type-tag z) 'rectangular))
                                                                                    +(define (polar? z)
                                                                                    +  (eq? (type-tag z) 'polar))
                                                                                    +

                                                                                    + +With type tags, Ben and Alyssa can now modify their code so that +their two different representations can coexist in the same system. +Whenever Ben constructs a complex number, he tags it as rectangular. +Whenever Alyssa constructs a complex number, she tags it as polar. +In addition, Ben and Alyssa must make sure that the names of their +procedures do not conflict. One way to do this is for Ben to append +the suffix rectangular to the name of each of his representation +procedures and for Alyssa to append polar to the names of hers. +Here is Ben's revised rectangular representation from +section 2.4.1:

                                                                                    + +

                                                                                    (define (real-part-rectangular z) (car z))
                                                                                    +(define (imag-part-rectangular z) (cdr z))
                                                                                    +(define (magnitude-rectangular z)
                                                                                    +  (sqrt (+ (square (real-part-rectangular z))
                                                                                    +           (square (imag-part-rectangular z)))))
                                                                                    +(define (angle-rectangular z)
                                                                                    +  (atan (imag-part-rectangular z)
                                                                                    +        (real-part-rectangular z)))
                                                                                    +(define (make-from-real-imag-rectangular x y)
                                                                                    +  (attach-tag 'rectangular (cons x y)))
                                                                                    +(define (make-from-mag-ang-rectangular r a) 
                                                                                    +  (attach-tag 'rectangular
                                                                                    +              (cons (* r (cos a)) (* r (sin a)))))
                                                                                    +

                                                                                    +and here is Alyssa's revised polar representation:

                                                                                    + +

                                                                                    (define (real-part-polar z)
                                                                                    +  (* (magnitude-polar z) (cos (angle-polar z))))
                                                                                    +(define (imag-part-polar z)
                                                                                    +  (* (magnitude-polar z) (sin (angle-polar z))))
                                                                                    +(define (magnitude-polar z) (car z))
                                                                                    +(define (angle-polar z) (cdr z))
                                                                                    +(define (make-from-real-imag-polar x y) 
                                                                                    +  (attach-tag 'polar
                                                                                    +               (cons (sqrt (+ (square x) (square y)))
                                                                                    +                     (atan y x))))
                                                                                    +(define (make-from-mag-ang-polar r a)
                                                                                    +  (attach-tag 'polar (cons r a)))
                                                                                    +

                                                                                    + + +Each generic selector is implemented as a procedure that checks the +tag of its argument and calls the appropriate procedure for handling +data of that type. For example, to obtain the real part of a complex +number, real-part examines the tag to determine whether to use +Ben's real-part-rectangular or Alyssa's real-part-polar. +In either case, we use contents to extract the bare, untagged +datum and send this to the rectangular or polar procedure as required:

                                                                                    + +

                                                                                    (define (real-part z)
                                                                                    +  (cond ((rectangular? z) 
                                                                                    +         (real-part-rectangular (contents z)))
                                                                                    +        ((polar? z)
                                                                                    +         (real-part-polar (contents z)))
                                                                                    +        (else (error "Unknown type -- REAL-PART" z))))
                                                                                    +(define (imag-part z)
                                                                                    +  (cond ((rectangular? z)
                                                                                    +         (imag-part-rectangular (contents z)))
                                                                                    +        ((polar? z)
                                                                                    +         (imag-part-polar (contents z)))
                                                                                    +        (else (error "Unknown type -- IMAG-PART" z))))
                                                                                    +(define (magnitude z)
                                                                                    +  (cond ((rectangular? z)
                                                                                    +         (magnitude-rectangular (contents z)))
                                                                                    +        ((polar? z)
                                                                                    +         (magnitude-polar (contents z)))
                                                                                    +        (else (error "Unknown type -- MAGNITUDE" z))))
                                                                                    +(define (angle z)
                                                                                    +  (cond ((rectangular? z)
                                                                                    +         (angle-rectangular (contents z)))
                                                                                    +        ((polar? z)
                                                                                    +         (angle-polar (contents z)))
                                                                                    +        (else (error "Unknown type -- ANGLE" z))))
                                                                                    +

                                                                                    + +To implement the complex-number arithmetic operations, we can use the +same procedures add-complex, sub-complex, mul-complex, and div-complex from +section 2.4.1, because the +selectors they call are generic, and so will work with either +representation. For example, the procedure add-complex is still

                                                                                    + +

                                                                                    (define (add-complex z1 z2)
                                                                                    +  (make-from-real-imag (+ (real-part z1) (real-part z2))
                                                                                    +                       (+ (imag-part z1) (imag-part z2))))
                                                                                    +

                                                                                    + +Finally, we must choose whether to construct complex numbers using +Ben's representation or Alyssa's representation. One reasonable +choice is to construct rectangular numbers whenever we have real and +imaginary parts and to construct polar numbers whenever we have +magnitudes and angles:

                                                                                    + +

                                                                                    (define (make-from-real-imag x y)
                                                                                    +  (make-from-real-imag-rectangular x y))
                                                                                    +(define (make-from-mag-ang r a)
                                                                                    +  (make-from-mag-ang-polar r a))
                                                                                    +

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.21:  Structure of the generic complex-arithmetic system.
                                                                                    + +

                                                                                    + +The resulting complex-number system has the structure shown in +figure 2.21. The system has been +decomposed into three relatively independent parts: the +complex-number-arithmetic operations, Alyssa's polar +implementation, and Ben's rectangular implementation. The polar and +rectangular implementations could have been written by Ben and Alyssa +working separately, and both of these can be used as underlying +representations by a third programmer implementing the +complex-arithmetic procedures in terms of the abstract +constructor/selector interface.

                                                                                    + +Since each data object is tagged with its type, the selectors operate +on the data in a generic manner. That is, each selector is defined to +have a behavior that depends upon the particular type of data it is +applied to. Notice the general mechanism for interfacing the separate +representations: Within a given representation implementation (say, +Alyssa's polar package) a complex number is an untyped pair +(magnitude, angle). When a generic selector operates on a number of +polar type, it strips off the tag and passes the contents on to +Alyssa's code. Conversely, when Alyssa constructs a number for general +use, she tags it with a type so that it can be appropriately +recognized by the higher-level procedures. This discipline of +stripping off and attaching tags as data objects are passed from level +to level can be an important organizational strategy, as we shall see +in section 2.5. + +

                                                                                    + + +

                                                                                    2.4.3  Data-Directed Programming and Additivity

                                                                                    + + + +The general strategy of checking the type of a datum and calling an +appropriate procedure is called dispatching on type. This is a +powerful strategy for obtaining modularity in system design. On +the other hand, implementing the dispatch as in +section 2.4.2 has two significant weaknesses. One +weakness is that the generic interface procedures (real-part, +imag-part, magnitude, and angle) must know about all +the different representations. For instance, suppose we wanted to +incorporate a new representation for complex numbers into our +complex-number system. We would need to identify this new +representation with a type, and then add a clause to each of the +generic interface procedures to check for the new type and apply the +appropriate selector for that representation.

                                                                                    + +Another weakness of the technique is that even though the individual +representations can be designed separately, we must guarantee that +no two procedures in the entire system have the same name. This is +why Ben and Alyssa had to change the names of their original +procedures from section 2.4.1.

                                                                                    + +The issue underlying both of these weaknesses is that the technique +for implementing generic interfaces is not additive. The person +implementing the generic selector procedures must modify those +procedures each time a new representation is installed, and the people +interfacing the individual representations must modify their +code to avoid name conflicts. In each of these cases, the changes +that must be made to the code are straightforward, but they must be +made nonetheless, and this is a source of inconvenience and error. +This is not much of a problem for the complex-number system as it +stands, but suppose there were not two but hundreds of different +representations for complex numbers. And suppose that there were many +generic selectors to be maintained in the abstract-data interface. +Suppose, in fact, that no one programmer knew all the interface +procedures or all the representations. The problem is real and must +be addressed in such programs as large-scale data-base-management +systems.

                                                                                    + +What we need is a means for modularizing the system design even +further. This is provided by the programming technique known as data-directed programming. To understand how data-directed +programming works, begin with the observation that whenever we deal +with a set of generic operations that are common to a set of +different types we are, in effect, dealing with a two-dimensional +table that contains the possible operations on one axis and the +possible types on the other axis. The entries in the table are the +procedures that implement each operation for each type of argument +presented. In the complex-number system developed in the previous +section, the correspondence between operation name, data type, and +actual procedure was spread out among the various conditional clauses +in the generic interface procedures. But the same information could +have been organized in a table, as shown in +figure 2.22.

                                                                                    + + +Data-directed programming is the technique of designing programs to +work with such a table directly. Previously, we implemented the +mechanism that interfaces the complex-arithmetic code with the two +representation packages as a set of procedures that each perform an +explicit dispatch on type. Here we will implement the interface as a single +procedure that looks up the combination of the operation name and +argument type in +the table to find the correct procedure to apply, and then applies it +to the contents of the argument. If we do this, then to add a new +representation package to the system we need not change any existing +procedures; we need only add new entries to the table.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.22:  Table of operations for the complex-number system.
                                                                                    + +

                                                                                    + +To implement this plan, assume that we have two procedures, +put and get, for manipulating the +operation-and-type table: + +

                                                                                      +
                                                                                    • (put <op> <type> <item>)
                                                                                      +installs the <item> in the table, indexed by the +<op> and the <type>.

                                                                                      + +

                                                                                    • (get <op> <type>)
                                                                                      +looks up the <op>, <type> entry in the table +and returns the item found there. If no item is found, get +returns false. +

                                                                                    + +For now, we can assume that put and get are +included in our language. In chapter 3 +(section 3.3.3, exercise 3.24) +we will see how to implement these and +other operations for manipulating tables.

                                                                                    + + +Here is how data-directed programming can be used in the +complex-number system. Ben, who developed the rectangular +representation, implements his code just as he did originally. He +defines a collection of procedures, or a package, and interfaces +these to the rest of the system by adding entries to the table that +tell the system how to operate on rectangular numbers. +This is accomplished by calling the following procedure: + +

                                                                                    (define (install-rectangular-package)
                                                                                    +  ;; internal procedures
                                                                                    +  (define (real-part z) (car z))
                                                                                    +  (define (imag-part z) (cdr z))
                                                                                    +  (define (make-from-real-imag x y) (cons x y))
                                                                                    +  (define (magnitude z)
                                                                                    +    (sqrt (+ (square (real-part z))
                                                                                    +             (square (imag-part z)))))
                                                                                    +  (define (angle z)
                                                                                    +    (atan (imag-part z) (real-part z)))
                                                                                    +  (define (make-from-mag-ang r a) 
                                                                                    +    (cons (* r (cos a)) (* r (sin a))))
                                                                                    +  ;; interface to the rest of the system
                                                                                    +  (define (tag x) (attach-tag 'rectangular x))
                                                                                    +  (put 'real-part '(rectangular) real-part)
                                                                                    +  (put 'imag-part '(rectangular) imag-part)
                                                                                    +  (put 'magnitude '(rectangular) magnitude)
                                                                                    +  (put 'angle '(rectangular) angle)
                                                                                    +  (put 'make-from-real-imag 'rectangular 
                                                                                    +       (lambda (x y) (tag (make-from-real-imag x y))))
                                                                                    +  (put 'make-from-mag-ang 'rectangular 
                                                                                    +       (lambda (r a) (tag (make-from-mag-ang r a))))
                                                                                    +  'done)
                                                                                    +

                                                                                    + +Notice that the internal procedures here are the same procedures from +section 2.4.1 that Ben wrote when +he was working in isolation. No changes are necessary in order to +interface them to the rest of the system. Moreover, since these +procedure definitions are internal to the installation procedure, Ben +needn't worry about name conflicts with other procedures outside the +rectangular package. To interface these to the rest of the system, +Ben installs his real-part procedure under the operation name +real-part and the type (rectangular), and similarly +for the other selectors.45 The interface also defines +the constructors to be used by the external system.46 +These are +identical to Ben's internally defined constructors, except that they +attach the tag.

                                                                                    + +Alyssa's polar package is analogous: +

                                                                                    (define (install-polar-package)
                                                                                    +  ;; internal procedures
                                                                                    +  (define (magnitude z) (car z))
                                                                                    +  (define (angle z) (cdr z))
                                                                                    +  (define (make-from-mag-ang r a) (cons r a))
                                                                                    +  (define (real-part z)
                                                                                    +    (* (magnitude z) (cos (angle z))))
                                                                                    +  (define (imag-part z)
                                                                                    +    (* (magnitude z) (sin (angle z))))
                                                                                    +  (define (make-from-real-imag x y) 
                                                                                    +    (cons (sqrt (+ (square x) (square y)))
                                                                                    +          (atan y x)))
                                                                                    +  ;; interface to the rest of the system
                                                                                    +  (define (tag x) (attach-tag 'polar x))
                                                                                    +  (put 'real-part '(polar) real-part)
                                                                                    +  (put 'imag-part '(polar) imag-part)
                                                                                    +  (put 'magnitude '(polar) magnitude)
                                                                                    +  (put 'angle '(polar) angle)
                                                                                    +  (put 'make-from-real-imag 'polar
                                                                                    +       (lambda (x y) (tag (make-from-real-imag x y))))
                                                                                    +  (put 'make-from-mag-ang 'polar 
                                                                                    +       (lambda (r a) (tag (make-from-mag-ang r a))))
                                                                                    +  'done)
                                                                                    +

                                                                                    +

                                                                                    + +Even though Ben and Alyssa both still use their original procedures +defined with the same names as each other's (e.g., real-part), these +definitions are now internal to different procedures (see +section 1.1.8), so there is no name +conflict.

                                                                                    + +The complex-arithmetic selectors access the table by means of a +general ``operation'' procedure called apply-generic, which +applies a generic operation to some arguments. Apply-generic +looks in the table under the name of the operation and the types of the +arguments and applies the resulting procedure if one is present:47

                                                                                    + +

                                                                                    (define (apply-generic op . args)
                                                                                    +  (let ((type-tags (map type-tag args)))
                                                                                    +    (let ((proc (get op type-tags)))
                                                                                    +      (if proc
                                                                                    +          (apply proc (map contents args))
                                                                                    +          (error
                                                                                    +            "No method for these types -- APPLY-GENERIC"
                                                                                    +            (list op type-tags))))))
                                                                                    +

                                                                                    +Using apply-generic, we can define our generic selectors as follows:

                                                                                    + +

                                                                                    (define (real-part z) (apply-generic 'real-part z))
                                                                                    +(define (imag-part z) (apply-generic 'imag-part z))
                                                                                    +(define (magnitude z) (apply-generic 'magnitude z))
                                                                                    +(define (angle z) (apply-generic 'angle z))
                                                                                    +

                                                                                    +Observe that these do not change at all if a new representation is +added to the system.

                                                                                    + +We can also extract from the table the +constructors to be used by the programs external to the packages in +making complex numbers from real and imaginary parts and from +magnitudes and angles. +As in section 2.4.2, we +construct rectangular numbers whenever we have real and +imaginary parts, and polar numbers whenever we have magnitudes and angles:

                                                                                    + +

                                                                                    (define (make-from-real-imag x y)
                                                                                    +  ((get 'make-from-real-imag 'rectangular) x y))
                                                                                    +(define (make-from-mag-ang r a)
                                                                                    +  ((get 'make-from-mag-ang 'polar) r a))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.73.  Section 2.3.2 described a program that +performs symbolic differentiation: +

                                                                                    (define (deriv exp var)
                                                                                    +  (cond ((number? exp) 0)
                                                                                    +        ((variable? exp) (if (same-variable? exp var) 1 0))
                                                                                    +        ((sum? exp)
                                                                                    +         (make-sum (deriv (addend exp) var)
                                                                                    +                   (deriv (augend exp) var)))
                                                                                    +        ((product? exp)
                                                                                    +         (make-sum
                                                                                    +           (make-product (multiplier exp)
                                                                                    +                         (deriv (multiplicand exp) var))
                                                                                    +           (make-product (deriv (multiplier exp) var)
                                                                                    +                         (multiplicand exp))))
                                                                                    +        <more rules can be added here>
                                                                                    +        (else (error "unknown expression type -- DERIV" exp))))
                                                                                    +

                                                                                    +We can regard this program as performing a dispatch on the type of the +expression to be differentiated. In this situation the ``type tag'' of the +datum is the algebraic operator symbol (such as +) and the +operation being performed is deriv. We can transform this +program into data-directed style by rewriting the basic derivative +procedure as +

                                                                                    (define (deriv exp var)
                                                                                    +   (cond ((number? exp) 0)
                                                                                    +         ((variable? exp) (if (same-variable? exp var) 1 0))
                                                                                    +         (else ((get 'deriv (operator exp)) (operands exp)
                                                                                    +                                            var))))
                                                                                    +(define (operator exp) (car exp))
                                                                                    +(define (operands exp) (cdr exp))
                                                                                    +

                                                                                    + +a.  Explain what was done above. +Why can't we assimilate the predicates number? and same-variable? into the data-directed dispatch?

                                                                                    + +b.  Write the procedures for derivatives of sums and products, and the +auxiliary code required to install them in the table used by the +program above.

                                                                                    + +c.  Choose any additional differentiation rule that you like, such as +the one for exponents (exercise 2.56), +and install it in this data-directed system.

                                                                                    + +d.  In this simple algebraic manipulator the type of an expression is +the algebraic operator that binds it together. Suppose, however, we +indexed the procedures in the opposite way, so that the dispatch line +in deriv looked like

                                                                                    + +

                                                                                    ((get (operator exp) 'deriv) (operands exp) var)
                                                                                    +

                                                                                    +What corresponding changes to the derivative system are required? + +

                                                                                    + + +

                                                                                    +Exercise 2.74.  Insatiable Enterprises, Inc., is a highly decentralized conglomerate +company consisting of a large number of independent divisions located +all over the world. The company's computer facilities have just been +interconnected by means of a clever network-interfacing scheme that +makes the entire network appear to any user to be a single computer. +Insatiable's president, in her first attempt to exploit the ability of +the network to extract administrative information from division files, +is dismayed to discover that, although all the division files have +been implemented as data structures in Scheme, the particular data +structure used varies from division to division. A meeting of +division managers is hastily called to search for a strategy to +integrate the files that will satisfy headquarters' needs while +preserving the existing autonomy of the divisions.

                                                                                    + +Show how such a strategy can be implemented with data-directed +programming. As an example, suppose that each division's personnel +records consist of a single file, which contains a set of records +keyed on employees' names. The structure of the set varies from +division to division. Furthermore, each employee's record is itself a +set (structured differently from division to division) that contains +information keyed under identifiers such as address and salary. In particular:

                                                                                    + +a.  Implement for headquarters a get-record procedure that +retrieves a specified employee's record from a specified personnel +file. The procedure should be applicable to any division's file. +Explain how the individual divisions' files should be structured. In +particular, what type information must be supplied?

                                                                                    + +b.  Implement for headquarters a get-salary procedure that +returns the salary information from a given employee's record from any +division's personnel file. How should the record be structured in +order to make this operation work?

                                                                                    + +c.  Implement for headquarters a find-employee-record procedure. +This should search all the divisions' files for the record of a given +employee and return the record. Assume that this procedure takes as +arguments an employee's name and a list of all the divisions' files.

                                                                                    + +d.  When Insatiable takes over a new company, what changes must +be made in order to incorporate the new personnel information into the +central system? +

                                                                                    + + +

                                                                                    Message passing

                                                                                    + + +The key idea of data-directed programming is to handle generic +operations in programs by dealing explicitly with operation-and-type +tables, such as the table in figure 2.22. The +style of programming we used in section 2.4.2 +organized the required dispatching on type by having each operation +take care of its own dispatching. In effect, this decomposes the +operation-and-type table into rows, with each generic operation +procedure representing a row of the table.

                                                                                    + +An alternative implementation strategy is to decompose the table into +columns and, instead of using ``intelligent operations'' that dispatch +on data types, to work with ``intelligent data objects'' that dispatch +on operation names. We can do this by arranging things so that a data +object, such as a rectangular number, is represented as a procedure +that takes as input the required operation name and performs the +operation indicated. In such a discipline, make-from-real-imag +could be written as

                                                                                    + +

                                                                                    (define (make-from-real-imag x y)
                                                                                    +  (define (dispatch op)
                                                                                    +    (cond ((eq? op 'real-part) x)
                                                                                    +          ((eq? op 'imag-part) y)
                                                                                    +          ((eq? op 'magnitude)
                                                                                    +           (sqrt (+ (square x) (square y))))
                                                                                    +          ((eq? op 'angle) (atan y x))
                                                                                    +          (else
                                                                                    +           (error "Unknown op -- MAKE-FROM-REAL-IMAG" op))))
                                                                                    +  dispatch)
                                                                                    +

                                                                                    +The corresponding apply-generic procedure, which applies a +generic operation to an argument, now simply feeds the operation's +name to the data object and lets the object do the work:48

                                                                                    + +

                                                                                    (define (apply-generic op arg) (arg op))
                                                                                    +

                                                                                    +Note that the value returned by make-from-real-imag is a +procedure -- the internal dispatch procedure. This is the +procedure that is invoked when apply-generic requests an operation to +be performed.

                                                                                    + +This style of programming is called message passing. The name +comes from the image that a data object is an entity that receives the +requested operation name as a ``message.'' We have already seen an +example of message passing in section 2.1.3, where we saw +how cons, car, and cdr could be defined with no data +objects but only procedures. Here we see that message passing is not +a mathematical trick but a useful technique for organizing systems +with generic operations. In the remainder of this chapter we will +continue to use data-directed programming, rather than message +passing, to discuss generic arithmetic operations. In chapter 3 we +will return to message passing, and we will see that it can be a +powerful tool for structuring simulation programs.

                                                                                    + +

                                                                                    +Exercise 2.75.  Implement the constructor make-from-mag-ang in message-passing style. +This procedure should be analogous to the make-from-real-imag +procedure given above. +

                                                                                    + +

                                                                                    +Exercise 2.76.  As a large system with generic operations evolves, new types of data +objects or new operations may be needed. For each of the three +strategies -- generic operations with explicit dispatch, data-directed +style, and message-passing-style -- describe the changes that must be +made to a system in order to add new types or new operations. Which +organization would be most appropriate for a system in which new types +must often be added? Which would be most appropriate for a system in +which new operations must often be added? +

                                                                                    + +


                                                                                    +

                                                                                    43 In actual computational systems, rectangular form is +preferable to polar form most of the time because of roundoff errors +in conversion between rectangular and polar form. This is why the +complex-number example is unrealistic. Nevertheless, it provides a +clear illustration of the design of a system using generic operations +and a good introduction to the more substantial systems to be +developed later in this chapter. + +

                                                                                    44 The arctangent function referred to +here, computed by Scheme's atan procedure, +is defined so as to take two arguments y and x and to return +the angle whose tangent is y/x. The signs of the arguments +determine the quadrant of the angle. + +

                                                                                    45 We use the list (rectangular) +rather than the symbol rectangular to allow for the possibility +of operations with multiple arguments, not all of the same +type. + +

                                                                                    46 The +type the constructors are installed under needn't be a list because +a constructor is always used to make an object of one particular +type. + +

                                                                                    47 Apply-generic uses the dotted-tail notation described in +exercise 2.20, because different generic operations +may take different numbers of arguments. In apply-generic, op has as its value the first argument to apply-generic and +args has as its value a list of the remaining arguments.

                                                                                    + +Apply-generic also uses the primitive procedure apply, +which takes two arguments, a procedure and a list. Apply +applies the procedure, using the elements in the list as arguments. +For example, +

                                                                                    (apply + (list 1 2 3 4))
                                                                                    +

                                                                                    +returns 10. + +

                                                                                    48 One +limitation of this organization is it permits only generic procedures +of one argument. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-18.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-18.html new file mode 100644 index 00000000..d4e38027 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-18.html @@ -0,0 +1,1422 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    2.5  Systems with Generic Operations

                                                                                    + +

                                                                                    + +In the previous section, we saw how to design systems in which data +objects can be represented in more than one way. The key idea is to +link the code that specifies the data operations to the several +representations by means of generic interface procedures. Now we will +see how to use this same idea not only to define operations that are +generic over different representations but also to define operations +that are generic over different kinds of arguments. We have already +seen several different packages of arithmetic operations: the primitive +arithmetic (+, -, *, /) built into our +language, the rational-number arithmetic (add-rat, sub-rat, mul-rat, div-rat) of +section 2.1.1, and the complex-number arithmetic that we +implemented in section 2.4.3. We will now use +data-directed techniques to construct a package of arithmetic +operations that incorporates all the arithmetic packages we have already +constructed.

                                                                                    + +Figure 2.23 shows the structure of the system we +shall build. Notice the abstraction barriers. From the perspective +of someone using ``numbers,'' there is a single procedure add +that operates on whatever numbers are supplied. Add is part of +a generic interface that allows the separate ordinary-arithmetic, +rational-arithmetic, and complex-arithmetic packages to be accessed +uniformly by programs that use numbers. Any individual arithmetic +package (such as the complex package) may itself be accessed through +generic procedures (such as add-complex) that combine packages +designed for different representations (such as rectangular and +polar). Moreover, the structure of the system is additive, so +that one can design the individual arithmetic packages separately and +combine them to produce a generic arithmetic system. + +

                                                                                    +
                                                                                    Figure 2.23:  Generic arithmetic system.
                                                                                    + +

                                                                                    + + +

                                                                                    2.5.1  Generic Arithmetic Operations

                                                                                    + + + +The task of designing generic arithmetic operations is analogous to +that of designing the generic complex-number operations. We would +like, for instance, to have a generic addition procedure add that +acts like ordinary primitive addition + on ordinary numbers, +like add-rat on rational numbers, and like add-complex on +complex numbers. We can implement add, and the other generic +arithmetic operations, by following the same strategy we used in +section 2.4.3 to implement the generic selectors for +complex numbers. We will attach a type tag to each kind of +number and cause the generic procedure to dispatch to an appropriate +package according to the data type of its arguments.

                                                                                    + +The generic arithmetic procedures are defined as follows:

                                                                                    + + +

                                                                                    (define (add x y) (apply-generic 'add x y))
                                                                                    +(define (sub x y) (apply-generic 'sub x y))
                                                                                    +(define (mul x y) (apply-generic 'mul x y))
                                                                                    +(define (div x y) (apply-generic 'div x y))
                                                                                    +

                                                                                    + +We begin by installing a package for handling ordinary numbers, +that is, the primitive numbers of our language. We will tag these +with the symbol scheme-number. The arithmetic operations in this +package are the primitive arithmetic procedures (so there is no need to +define extra procedures to handle the untagged numbers). Since +these operations each take two arguments, they are installed in the +table keyed by the list (scheme-number scheme-number): + + +

                                                                                    (define (install-scheme-number-package)
                                                                                    +  (define (tag x)
                                                                                    +    (attach-tag 'scheme-number x))    
                                                                                    +  (put 'add '(scheme-number scheme-number)
                                                                                    +       (lambda (x y) (tag (+ x y))))
                                                                                    +  (put 'sub '(scheme-number scheme-number)
                                                                                    +       (lambda (x y) (tag (- x y))))
                                                                                    +  (put 'mul '(scheme-number scheme-number)
                                                                                    +       (lambda (x y) (tag (* x y))))
                                                                                    +  (put 'div '(scheme-number scheme-number)
                                                                                    +       (lambda (x y) (tag (/ x y))))
                                                                                    +  (put 'make 'scheme-number
                                                                                    +       (lambda (x) (tag x)))
                                                                                    +  'done)
                                                                                    +

                                                                                    + + +Users of the Scheme-number package +will create (tagged) ordinary numbers by means of the procedure:

                                                                                    + + +

                                                                                    (define (make-scheme-number n)
                                                                                    +  ((get 'make 'scheme-number) n))
                                                                                    +

                                                                                    + +Now that the framework of the generic arithmetic system is in place, +we can readily include new kinds of numbers. Here is a package that +performs rational arithmetic. Notice that, as a benefit of +additivity, we can use without modification the rational-number code +from section 2.1.1 as the internal procedures in the +package: + +

                                                                                    (define (install-rational-package)
                                                                                    +  ;; internal procedures
                                                                                    +  (define (numer x) (car x))
                                                                                    +  (define (denom x) (cdr x))
                                                                                    +  (define (make-rat n d)
                                                                                    +    (let ((g (gcd n d)))
                                                                                    +      (cons (/ n g) (/ d g))))
                                                                                    +  (define (add-rat x y)
                                                                                    +    (make-rat (+ (* (numer x) (denom y))
                                                                                    +                 (* (numer y) (denom x)))
                                                                                    +              (* (denom x) (denom y))))
                                                                                    +  (define (sub-rat x y)
                                                                                    +    (make-rat (- (* (numer x) (denom y))
                                                                                    +                 (* (numer y) (denom x)))
                                                                                    +              (* (denom x) (denom y))))
                                                                                    +  (define (mul-rat x y)
                                                                                    +    (make-rat (* (numer x) (numer y))
                                                                                    +              (* (denom x) (denom y))))
                                                                                    +  (define (div-rat x y)
                                                                                    +    (make-rat (* (numer x) (denom y))
                                                                                    +              (* (denom x) (numer y))))
                                                                                    +  ;; interface to rest of the system
                                                                                    +  (define (tag x) (attach-tag 'rational x))
                                                                                    +  (put 'add '(rational rational)
                                                                                    +       (lambda (x y) (tag (add-rat x y))))
                                                                                    +  (put 'sub '(rational rational)
                                                                                    +       (lambda (x y) (tag (sub-rat x y))))
                                                                                    +  (put 'mul '(rational rational)
                                                                                    +       (lambda (x y) (tag (mul-rat x y))))
                                                                                    +  (put 'div '(rational rational)
                                                                                    +       (lambda (x y) (tag (div-rat x y))))
                                                                                    +
                                                                                    +  (put 'make 'rational
                                                                                    +       (lambda (n d) (tag (make-rat n d))))
                                                                                    +  'done)
                                                                                    +(define (make-rational n d)
                                                                                    +  ((get 'make 'rational) n d))
                                                                                    +

                                                                                    + +We can install a similar package to handle complex numbers, using the +tag complex. In creating the package, we extract from the table +the operations make-from-real-imag and make-from-mag-ang +that were defined by the rectangular and polar packages. Additivity +permits us to use, as the internal operations, the same add-complex, sub-complex, mul-complex, and div-complex procedures from +section 2.4.1. + +

                                                                                    (define (install-complex-package)
                                                                                    +  ;; imported procedures from rectangular and polar packages
                                                                                    +  (define (make-from-real-imag x y)
                                                                                    +    ((get 'make-from-real-imag 'rectangular) x y))
                                                                                    +  (define (make-from-mag-ang r a)
                                                                                    +    ((get 'make-from-mag-ang 'polar) r a))
                                                                                    +  ;; internal procedures
                                                                                    +  (define (add-complex z1 z2)
                                                                                    +    (make-from-real-imag (+ (real-part z1) (real-part z2))
                                                                                    +                         (+ (imag-part z1) (imag-part z2))))
                                                                                    +  (define (sub-complex z1 z2)
                                                                                    +    (make-from-real-imag (- (real-part z1) (real-part z2))
                                                                                    +                         (- (imag-part z1) (imag-part z2))))
                                                                                    +  (define (mul-complex z1 z2)
                                                                                    +    (make-from-mag-ang (* (magnitude z1) (magnitude z2))
                                                                                    +                       (+ (angle z1) (angle z2))))
                                                                                    +  (define (div-complex z1 z2)
                                                                                    +    (make-from-mag-ang (/ (magnitude z1) (magnitude z2))
                                                                                    +                       (- (angle z1) (angle z2))))
                                                                                    +  ;; interface to rest of the system
                                                                                    +  (define (tag z) (attach-tag 'complex z))
                                                                                    +  (put 'add '(complex complex)
                                                                                    +       (lambda (z1 z2) (tag (add-complex z1 z2))))
                                                                                    +  (put 'sub '(complex complex)
                                                                                    +       (lambda (z1 z2) (tag (sub-complex z1 z2))))
                                                                                    +  (put 'mul '(complex complex)
                                                                                    +       (lambda (z1 z2) (tag (mul-complex z1 z2))))
                                                                                    +  (put 'div '(complex complex)
                                                                                    +       (lambda (z1 z2) (tag (div-complex z1 z2))))
                                                                                    +  (put 'make-from-real-imag 'complex
                                                                                    +       (lambda (x y) (tag (make-from-real-imag x y))))
                                                                                    +  (put 'make-from-mag-ang 'complex
                                                                                    +       (lambda (r a) (tag (make-from-mag-ang r a))))
                                                                                    +  'done)
                                                                                    +

                                                                                    +

                                                                                    + +Programs outside the complex-number package can construct complex +numbers either from real and imaginary parts or from magnitudes and +angles. Notice how the underlying procedures, originally defined in +the rectangular and polar packages, are exported to the complex +package, and exported from there to the outside world.

                                                                                    + +

                                                                                    (define (make-complex-from-real-imag x y)
                                                                                    +  ((get 'make-from-real-imag 'complex) x y))
                                                                                    +(define (make-complex-from-mag-ang r a)
                                                                                    +  ((get 'make-from-mag-ang 'complex) r a))
                                                                                    +

                                                                                    + +What we have here is a two-level tag system. A typical complex number, +such as 3 + 4i in rectangular form, would be +represented as shown in figure 2.24. +The outer tag (complex) is used to direct the number to the +complex package. Once within the complex package, the next tag (rectangular) is used to direct the number to the rectangular package. +In a large and complicated system there might be many levels, each +interfaced with the next by means of generic operations. As a data +object is passed ``downward,'' the outer tag that is used to direct +it to the appropriate package is stripped off (by applying contents) and the next level of tag (if any) becomes visible to be used for +further dispatching.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.24:  Representation of 3 + 4i in rectangular form.
                                                                                    + +

                                                                                    + +In the above packages, we used add-rat, add-complex, and +the other arithmetic procedures exactly as originally written. +Once these definitions are internal to different installation procedures, +however, they no longer need names that are distinct from each other: +we could simply name them add, sub, mul, and div +in both packages.

                                                                                    + +

                                                                                    +Exercise 2.77.  Louis Reasoner tries to evaluate the +expression (magnitude z) where z is the object +shown in figure 2.24. To his +surprise, instead of the answer 5 +he gets an error message from apply-generic, +saying there is no method for the operation magnitude +on the types (complex). +He shows this interaction to Alyssa P. Hacker, who says +``The problem is that the complex-number selectors were never +defined for complex numbers, just for polar and rectangular +numbers. All you have to do to make this work is add the following +to the complex package:''

                                                                                    + +

                                                                                    (put 'real-part '(complex) real-part)
                                                                                    +(put 'imag-part '(complex) imag-part)
                                                                                    +(put 'magnitude '(complex) magnitude)
                                                                                    +(put 'angle '(complex) angle)
                                                                                    +

                                                                                    +Describe in detail why this works. As an example, trace through all +the procedures called in evaluating the expression (magnitude z) +where z is the object shown in +figure 2.24. In particular, how many +times is apply-generic invoked? What procedure is dispatched to +in each case? +

                                                                                    + +

                                                                                    +Exercise 2.78.  The internal procedures in the scheme-number package are essentially +nothing more than calls to the primitive procedures +, -, +etc. It was not possible to use the primitives of the language +directly because our type-tag system requires that each data +object have a type attached to it. In fact, however, all Lisp +implementations do have a type system, which they use internally. +Primitive predicates such as symbol? and number? +determine whether data objects have particular types. Modify the +definitions of type-tag, contents, and attach-tag +from section 2.4.2 so that our generic system takes +advantage of Scheme's internal type system. That is to say, the system +should work as before except that ordinary numbers should be +represented simply as Scheme numbers rather than as pairs whose car is +the symbol scheme-number. + +

                                                                                    + +

                                                                                    +Exercise 2.79.  Define a generic equality predicate equ? that tests the equality +of two numbers, and install it in the generic arithmetic +package. This operation should work for ordinary numbers, rational numbers, and +complex numbers. + +

                                                                                    + +

                                                                                    +Exercise 2.80.  Define a generic +predicate =zero? that tests if its argument is zero, +and install it in the generic arithmetic package. This +operation should work for ordinary numbers, rational numbers, and +complex numbers. + +

                                                                                    + + +

                                                                                    2.5.2  Combining Data of Different Types

                                                                                    + +

                                                                                    + +We have seen how to define a unified arithmetic system that +encompasses ordinary numbers, complex numbers, rational numbers, and +any other type of number we might decide to invent, but we have +ignored an important issue. The operations we have defined so far +treat the different data types as being completely independent. Thus, +there are separate packages for adding, say, two ordinary numbers, or +two complex numbers. What we have not yet considered is the fact that +it is meaningful to define operations that cross the type boundaries, +such as the addition of a complex number to an ordinary number. We +have gone to great pains to introduce barriers between parts of our +programs so that they can be developed and understood separately. We +would like to introduce the cross-type operations in some carefully +controlled way, so that we can support them +without seriously violating our module boundaries.

                                                                                    + +One way to handle cross-type operations is to design a different +procedure for each possible combination of types for which the +operation is valid. For example, we could extend the complex-number +package so that it provides a procedure for adding complex numbers to +ordinary numbers and installs this in the table using the tag (complex scheme-number):49 +

                                                                                    ;; to be included in the complex package
                                                                                    +(define (add-complex-to-schemenum z x)
                                                                                    +  (make-from-real-imag (+ (real-part z) x)
                                                                                    +                       (imag-part z)))
                                                                                    +(put 'add '(complex scheme-number)
                                                                                    +     (lambda (z x) (tag (add-complex-to-schemenum z x))))
                                                                                    +

                                                                                    + +This technique works, but it is cumbersome. With such a system, the +cost of introducing a new type is not just the construction of the +package of procedures for that type but also the construction and +installation of the procedures that implement the cross-type +operations. This can easily be much more code than is needed to +define the operations on the type itself. The method also undermines +our ability to combine separate packages additively, or +least to limit the extent to which the implementors of the individual +packages need to take account of other packages. For instance, in the +example above, it seems reasonable that handling mixed operations on +complex numbers and ordinary numbers should be the responsibility of +the complex-number package. Combining rational numbers and complex +numbers, however, might be done by the complex package, by the +rational package, or by some third package that uses operations +extracted from these two packages. Formulating coherent policies on the +division of responsibility among packages can be an overwhelming task +in designing systems with many packages and many cross-type +operations.

                                                                                    + + +

                                                                                    Coercion

                                                                                    + + +In the general situation of completely unrelated operations acting on +completely unrelated types, implementing explicit cross-type +operations, cumbersome though it may be, is the best that one can hope +for. Fortunately, we can usually do better by taking advantage of +additional structure that may be latent in our type system. Often the +different data types are not completely independent, and there may be +ways by which objects of one type may be viewed as being of another +type. This process is called coercion. For example, if we are +asked to arithmetically combine an ordinary number with a complex +number, we can view the ordinary number as a complex number whose +imaginary part is zero. This transforms the problem to that of +combining two complex numbers, which can be handled in the ordinary +way by the complex-arithmetic package.

                                                                                    + +In general, we can implement this idea by designing coercion +procedures that transform an object of one type into an equivalent +object of another type. Here is a typical coercion procedure, which +transforms a given ordinary number to a complex number with that real +part and zero imaginary part:

                                                                                    + +

                                                                                    (define (scheme-number->complex n)
                                                                                    +  (make-complex-from-real-imag (contents n) 0))
                                                                                    +

                                                                                    +We install these coercion procedures in a special coercion table, +indexed under the names of the two types:

                                                                                    + +

                                                                                    (put-coercion 'scheme-number 'complex scheme-number->complex)
                                                                                    +

                                                                                    +(We assume that there are put-coercion and get-coercion +procedures available for manipulating this table.) Generally some of +the slots in the table will be empty, because it is not generally +possible to coerce an arbitrary data object of each type into all +other types. For example, there is no way to coerce an arbitrary +complex number to an ordinary number, so there will be no general complex->scheme-number procedure included in the table.

                                                                                    + +Once the coercion table has been set up, we can handle coercion in a +uniform manner by modifying the apply-generic procedure of +section 2.4.3. When asked to apply an operation, we +first check whether the operation is defined for the arguments' types, +just as before. If so, we dispatch to the procedure found in the +operation-and-type table. +Otherwise, we try coercion. For simplicity, we consider only the case +where there are two arguments.50 We +check the coercion table to see if objects of the first type can +be coerced to the second type. If so, we coerce the first argument and try the +operation again. If objects of the first type cannot in general be coerced to +the second type, we try the coercion the other way around to see if there is a +way to coerce the second argument to the type of the first argument. +Finally, if there +is no known way to coerce either type to the other type, we give up. +Here is the procedure:

                                                                                    + +

                                                                                    (define (apply-generic op . args)
                                                                                    +  (let ((type-tags (map type-tag args)))
                                                                                    +    (let ((proc (get op type-tags)))
                                                                                    +      (if proc
                                                                                    +          (apply proc (map contents args))
                                                                                    +          (if (= (length args) 2)
                                                                                    +              (let ((type1 (car type-tags))
                                                                                    +                    (type2 (cadr type-tags))
                                                                                    +                    (a1 (car args))
                                                                                    +                    (a2 (cadr args)))
                                                                                    +                (let ((t1->t2 (get-coercion type1 type2))
                                                                                    +                      (t2->t1 (get-coercion type2 type1)))
                                                                                    +                  (cond (t1->t2
                                                                                    +                         (apply-generic op (t1->t2 a1) a2))
                                                                                    +                        (t2->t1
                                                                                    +                         (apply-generic op a1 (t2->t1 a2)))
                                                                                    +                        (else
                                                                                    +                         (error "No method for these types"
                                                                                    +                                (list op type-tags))))))
                                                                                    +              (error "No method for these types"
                                                                                    +                     (list op type-tags)))))))
                                                                                    +

                                                                                    + +This coercion scheme has many advantages over the method of defining +explicit cross-type operations, as outlined above. Although we still +need to write coercion procedures to relate the types (possibly n2 +procedures for a system with n types), we need to write only one +procedure for each pair of types rather than a different procedure for +each collection of types and each generic operation.51 What we are counting on here is the fact that the +appropriate transformation between types depends only on the types +themselves, not on the operation to be applied.

                                                                                    + +On the other hand, there may be applications for which our coercion +scheme is not general enough. Even when neither of the objects to be +combined can be converted to the type of the other it may still be +possible to perform the operation by converting both objects to a +third type. In order to deal with such complexity and still preserve +modularity in our programs, it is usually necessary to build systems +that take advantage of still further structure in the relations among +types, as we discuss next.

                                                                                    + + +

                                                                                    Hierarchies of types

                                                                                    + + +The coercion scheme presented above relied on the existence of natural +relations between pairs of types. Often there is more ``global'' +structure in how the different types relate to each other. For +instance, suppose we are building a generic arithmetic system to +handle integers, rational numbers, real numbers, and complex numbers. +In such a system, it is quite natural to regard an integer as a +special kind of rational number, which is in turn a special kind of +real number, which is in turn a special kind of complex number. What +we actually have is a so-called hierarchy of types, in which, +for example, integers are a subtype of rational numbers (i.e., +any operation that can be applied to a rational number can +automatically be applied to an integer). Conversely, we say that +rational numbers form a supertype of integers. The particular +hierarchy we have here is of a very simple kind, in which each type +has at most one supertype and at most one subtype. Such a structure, +called a tower, is illustrated in figure 2.25.

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.25:  A tower of types.
                                                                                    + +

                                                                                    + +If we have a tower structure, then we can greatly simplify the problem +of adding a new type to the hierarchy, for we need only specify how +the new type is embedded in the next supertype above it and how it is +the supertype of the type below it. For example, if we want to add an +integer to a complex number, we need not explicitly define a special +coercion procedure integer->complex. Instead, we define how an +integer can be transformed into a rational number, how a rational +number is transformed into a real number, and how a real number is +transformed into a complex number. We then allow the system to +transform the integer into a complex number through these steps and +then add the two complex numbers.

                                                                                    + +We can redesign our apply-generic procedure in the following +way: For each type, we need to supply a raise procedure, which +``raises'' objects of that type one level in the tower. Then when the +system is required to operate on objects of different types it can +successively raise the lower types until all the objects are at +the same level in the tower. (Exercises 2.83 +and  2.84 +concern the details of implementing such a strategy.)

                                                                                    + +Another advantage of a tower is that we can easily implement the +notion that every type ``inherits'' all operations defined on a +supertype. For instance, if we do not supply a special procedure for +finding the real part of an integer, we should nevertheless expect +that real-part will be defined for integers by virtue of the +fact that integers are a subtype of complex numbers. In a tower, we +can arrange for this to happen in a uniform way by modifying apply-generic. If the required operation is not directly defined for +the type of the object given, we raise the object to its supertype and +try again. We thus crawl up the tower, transforming our argument as we +go, until we either find a level at which the desired operation can be +performed or hit the top (in which case we give up).

                                                                                    + +Yet another advantage of a tower over a more general hierarchy is that +it gives us a simple way to ``lower'' a data object to the simplest +representation. For example, if we add 2 + 3i to 4 - 3i, it would be +nice to obtain the answer as the integer 6 rather than as the complex +number 6 + 0i. Exercise 2.85 discusses a way to implement +such a lowering operation. (The trick is that we need a general way +to distinguish those objects that can be lowered, such as 6 + 0i, from +those that cannot, such as 6 + 2i.)

                                                                                    + +

                                                                                    +
                                                                                    Figure 2.26:  Relations among types of geometric figures.
                                                                                    + +

                                                                                    + + +

                                                                                    Inadequacies of hierarchies

                                                                                    + + + +If the data types in our system can be naturally arranged in a tower, +this greatly simplifies the problems of dealing with generic operations +on different types, as we have seen. Unfortunately, this is usually +not the case. Figure 2.26 illustrates a +more complex arrangement of mixed types, this one showing relations +among different types of geometric figures. We see that, in general, +a type may have more than one subtype. Triangles and quadrilaterals, +for instance, are both subtypes of polygons. In addition, a type may +have more than one supertype. For example, an isosceles right +triangle may be regarded either as an isosceles triangle or as a right +triangle. This multiple-supertypes issue is particularly thorny, +since it means that there is no unique way to ``raise'' a type in the +hierarchy. Finding the ``correct'' supertype in which to apply an +operation to an object may involve considerable searching through the +entire type network on the part of a procedure such as apply-generic. Since there generally are multiple subtypes for a +type, there is a similar problem in coercing a value ``down'' the type +hierarchy. Dealing with large numbers of interrelated types while +still preserving modularity in the design of large systems is very +difficult, and is an area of much current research.52

                                                                                    + + +

                                                                                    +Exercise 2.81.  Louis Reasoner has noticed that apply-generic may try to +coerce the arguments to each other's type even if they already have +the same type. Therefore, he reasons, we need to put procedures +in the coercion table to "coerce" arguments of each type to their +own type. For example, in addition to the scheme-number->complex +coercion shown above, he would do:

                                                                                    + + + +

                                                                                    (define (scheme-number->scheme-number n) n)
                                                                                    +(define (complex->complex z) z)
                                                                                    +(put-coercion 'scheme-number 'scheme-number
                                                                                    +              scheme-number->scheme-number)
                                                                                    +(put-coercion 'complex 'complex complex->complex)
                                                                                    +

                                                                                    + +

                                                                                    a. With Louis's coercion procedures installed, what happens if apply-generic +is called with two arguments of type scheme-number or two arguments of +type complex for an operation that is not found in the table for those +types? For example, assume that we've defined a generic exponentiation +operation:

                                                                                    + + +

                                                                                    (define (exp x y) (apply-generic 'exp x y))
                                                                                    +

                                                                                    +and have put a procedure for exponentiation in the Scheme-number +package but not in any other package:

                                                                                    + + +

                                                                                    ;; following added to Scheme-number package
                                                                                    +(put 'exp '(scheme-number scheme-number)
                                                                                    +     (lambda (x y) (tag (expt x y)))) ; using primitive expt
                                                                                    +

                                                                                    +What happens if we call exp with two complex numbers as arguments?

                                                                                    + +

                                                                                    b. Is Louis correct that something had to be done about +coercion with arguments of the same type, or does apply-generic +work correctly as is?

                                                                                    + +

                                                                                    c. Modify apply-generic so that it doesn't try coercion if +the two arguments have the same type. +

                                                                                    + +

                                                                                    +Exercise 2.82.  Show how to generalize apply-generic to handle +coercion in the general case of multiple arguments. One strategy is +to attempt to coerce all the arguments to the type of the first argument, then +to the type of the second argument, and so on. Give an example of a situation +where this strategy (and likewise the two-argument version given +above) is not sufficiently general. (Hint: Consider the case where +there are some suitable mixed-type operations present in the table +that will not be tried.) + +

                                                                                    + +

                                                                                    +Exercise 2.83.  Suppose you are designing a generic arithmetic system for dealing with +the tower of types shown in figure 2.25: +integer, rational, real, complex. For +each type (except complex), design a procedure that raises objects of +that type one level in the tower. Show how to install a generic raise operation that will work for each type (except complex). + +

                                                                                    + +

                                                                                    +Exercise 2.84.  Using the raise operation of exercise 2.83, modify the apply-generic procedure so that it coerces its arguments to have the +same type by the method of successive raising, as discussed in this +section. You will need to devise a way to test which of two types is +higher in the tower. Do this in a manner that is ``compatible'' with +the rest of the system and will not lead to problems in adding new +levels to the tower. + +

                                                                                    + +

                                                                                    +Exercise 2.85.  This section mentioned a method for ``simplifying'' a data object +by lowering it in the tower of types as far as possible. Design +a procedure drop that accomplishes this for the tower described +in exercise 2.83. The key is to decide, in some general way, whether +an object can be lowered. For example, the complex number 1.5 + 0i +can be lowered as far as real, the complex number 1 + 0i can be +lowered as far as integer, and the complex number 2 + 3i cannot +be lowered at all. Here is a plan for determining whether an object +can be lowered: Begin by defining a generic operation project +that ``pushes'' an object down in the tower. For example, projecting +a complex number would involve throwing away the imaginary part. Then +a number can be dropped if, when we project it and raise +the result back to the type we started with, we end up with something +equal to what we started with. Show how to implement this idea in +detail, by writing a drop procedure that drops an object as far +as possible. You will need to design the various projection +operations53 and install project as a generic operation in +the system. You will also need to make use of a generic equality +predicate, such as described in exercise 2.79. Finally, use drop +to rewrite apply-generic from exercise 2.84 so that it +``simplifies'' its answers. + +

                                                                                    + +

                                                                                    +Exercise 2.86.  Suppose we want to handle complex numbers whose real +parts, imaginary parts, magnitudes, and angles can be either ordinary +numbers, rational numbers, or other numbers we might wish to add to +the system. Describe and implement the changes to the system needed +to accommodate this. You will have to define operations such as sine and cosine that are generic over ordinary numbers and +rational numbers. +

                                                                                    +

                                                                                    + + +

                                                                                    2.5.3  Example: Symbolic Algebra

                                                                                    + + + +The manipulation of symbolic algebraic expressions is a complex +process that illustrates many of the hardest problems that occur in +the design of large-scale systems. An algebraic expression, in +general, can be viewed as a hierarchical structure, a tree of +operators applied to operands. We can construct algebraic expressions +by starting with a set of primitive objects, such as constants and +variables, and combining these by means of algebraic operators, such +as addition and multiplication. As in other languages, we form +abstractions that enable us to refer to compound objects in simple +terms. Typical abstractions in symbolic algebra are ideas such as +linear combination, polynomial, rational function, or trigonometric +function. We can regard these as compound ``types,'' which are often +useful for directing the processing of expressions. For example, we +could describe the expression

                                                                                    + +

                                                                                    +as a polynomial in x with coefficients that are trigonometric +functions of polynomials in y whose coefficients are integers.

                                                                                    + +We will not attempt to develop a complete algebraic-manipulation +system here. Such systems are exceedingly complex programs, embodying +deep algebraic knowledge and elegant algorithms. What we will do is +look at a simple but important part of algebraic manipulation: the +arithmetic of polynomials. We will illustrate the kinds of decisions +the designer of such a system faces, and how to apply the ideas of +abstract data and generic operations to help organize this effort.

                                                                                    + + +

                                                                                    Arithmetic on polynomials

                                                                                    + + +Our first task in designing a system for performing arithmetic on +polynomials is to decide just what a polynomial is. Polynomials are +normally defined relative to certain variables (the indeterminates of the polynomial). For simplicity, we will restrict +ourselves to polynomials having just one indeterminate (univariate polynomials).54 We will define a polynomial to be a +sum of terms, each of which is either a coefficient, a power of the +indeterminate, or a product of a coefficient and a power of the +indeterminate. A coefficient is defined as an algebraic expression +that is not dependent upon the indeterminate of the polynomial. For +example, +

                                                                                    +is a simple polynomial in x, and +

                                                                                    +is a polynomial in x whose coefficients are polynomials in y.

                                                                                    + +Already we are skirting some thorny issues. Is the first of these +polynomials the same as the polynomial 5y2 + 3y + 7, or not? A +reasonable answer might be ``yes, if we are considering a polynomial +purely as a mathematical function, but no, if we are considering a +polynomial to be a syntactic form.'' The second polynomial is +algebraically equivalent to a polynomial in y whose coefficients are +polynomials in x. Should our system recognize this, or not? +Furthermore, there are other ways to represent a polynomial -- for +example, as a product of factors, or (for a univariate polynomial) as +the set of roots, or as a listing of the values of the polynomial at a +specified set of points.55 +We can finesse these questions by deciding that in our +algebraic-manipulation system a ``polynomial'' will be a +particular syntactic form, not its underlying mathematical meaning.

                                                                                    + +Now we must consider how to go about doing arithmetic on polynomials. +In this simple system, we will consider only addition and +multiplication. Moreover, we will insist that two polynomials to be +combined must have the same indeterminate.

                                                                                    + + +We will approach the design of our system by following the familiar +discipline of data abstraction. We will represent polynomials using a +data structure called a poly, which consists of a variable and a +collection of terms. We assume that we have selectors variable +and term-list that extract those parts from a poly and +a constructor make-poly that assembles a +poly from a given variable and a term list. +A variable will be just a symbol, so we can use the same-variable? +procedure of section 2.3.2 to compare variables. +The following procedures define addition and multiplication of polys:

                                                                                    + +

                                                                                    (define (add-poly p1 p2)
                                                                                    +  (if (same-variable? (variable p1) (variable p2))
                                                                                    +      (make-poly (variable p1)
                                                                                    +                 (add-terms (term-list p1)
                                                                                    +                            (term-list p2)))
                                                                                    +      (error "Polys not in same var -- ADD-POLY"
                                                                                    +             (list p1 p2))))
                                                                                    +(define (mul-poly p1 p2)
                                                                                    +  (if (same-variable? (variable p1) (variable p2))
                                                                                    +      (make-poly (variable p1)
                                                                                    +                 (mul-terms (term-list p1)
                                                                                    +                            (term-list p2)))
                                                                                    +      (error "Polys not in same var -- MUL-POLY"
                                                                                    +             (list p1 p2))))
                                                                                    +

                                                                                    + +To incorporate polynomials into our generic arithmetic system, we need +to supply them with type tags. We'll use the tag polynomial, +and install appropriate operations on tagged polynomials in +the operation table. We'll embed all our code +in an installation procedure for the polynomial package, +similar to the ones in +section 2.5.1: + +

                                                                                    (define (install-polynomial-package)
                                                                                    +  ;; internal procedures
                                                                                    +  ;; representation of poly
                                                                                    +  (define (make-poly variable term-list)
                                                                                    +    (cons variable term-list))
                                                                                    +  (define (variable p) (car p))
                                                                                    +  (define (term-list p) (cdr p))
                                                                                    +  <procedures same-variable? and variable? from section 2.3.2>
                                                                                    +  ;; representation of terms and term lists
                                                                                    +  <procedures adjoin-term ...coeff from text below>
                                                                                    +
                                                                                    +  ;; continued on next page
                                                                                    +
                                                                                    +  (define (add-poly p1 p2) ...)
                                                                                    +  <procedures used by add-poly>
                                                                                    +  (define (mul-poly p1 p2) ...)
                                                                                    +  <procedures used by mul-poly>
                                                                                    +  ;; interface to rest of the system
                                                                                    +  (define (tag p) (attach-tag 'polynomial p))
                                                                                    +  (put 'add '(polynomial polynomial) 
                                                                                    +       (lambda (p1 p2) (tag (add-poly p1 p2))))
                                                                                    +  (put 'mul '(polynomial polynomial) 
                                                                                    +       (lambda (p1 p2) (tag (mul-poly p1 p2))))
                                                                                    +  (put 'make 'polynomial
                                                                                    +       (lambda (var terms) (tag (make-poly var terms))))
                                                                                    +  'done)
                                                                                    +

                                                                                    + +Polynomial addition is performed termwise. Terms of the same order +(i.e., with the same power of the indeterminate) must be combined. +This is done by forming a new term of the same order whose coefficient +is the sum of the coefficients of the addends. Terms in one addend +for which there are no terms of the same order in the other addend are +simply accumulated into the sum polynomial being constructed.

                                                                                    + +In order to manipulate term lists, we will assume that we have a +constructor the-empty-termlist that returns an empty term list +and a constructor adjoin-term that adjoins a new term to a term +list. We will also assume that we have a predicate empty-termlist? that tells if a given term list is empty, a selector +first-term that extracts the highest-order term from a term +list, and a selector rest-terms that returns all but the highest-order +term. To manipulate terms, we will suppose that we have a +constructor make-term that constructs a term with given +order and coefficient, and selectors order and coeff that return, respectively, the order and the +coefficient of the term. These operations allow us to consider both +terms and term lists as data abstractions, whose concrete +representations we can worry about separately.

                                                                                    + +Here is the procedure that constructs the term list for the sum of two +polynomials:56

                                                                                    + +

                                                                                    (define (add-terms L1 L2)
                                                                                    +  (cond ((empty-termlist? L1) L2)
                                                                                    +        ((empty-termlist? L2) L1)
                                                                                    +        (else
                                                                                    +         (let ((t1 (first-term L1)) (t2 (first-term L2)))
                                                                                    +           (cond ((> (order t1) (order t2))
                                                                                    +                  (adjoin-term
                                                                                    +                   t1 (add-terms (rest-terms L1) L2)))
                                                                                    +                 ((< (order t1) (order t2))
                                                                                    +                  (adjoin-term
                                                                                    +                   t2 (add-terms L1 (rest-terms L2))))
                                                                                    +                 (else
                                                                                    +                  (adjoin-term
                                                                                    +                   (make-term (order t1)
                                                                                    +                              (add (coeff t1) (coeff t2)))
                                                                                    +                   (add-terms (rest-terms L1)
                                                                                    +                              (rest-terms L2)))))))))
                                                                                    +

                                                                                    +The most important point to note here is that we used the generic +addition procedure add to add together the coefficients of the +terms being combined. This has powerful consequences, as we will see +below.

                                                                                    + +In order to multiply two term lists, we multiply each term of the +first list by all the terms of the other list, repeatedly using +mul-term-by-all-terms, which multiplies a given term by +all terms in a given term list. The resulting term lists (one for +each term of the first list) are accumulated into a sum. Multiplying +two terms forms a term whose order is the sum of the orders of the +factors and whose coefficient is the product of the coefficients of +the factors:

                                                                                    + +

                                                                                    (define (mul-terms L1 L2)
                                                                                    +  (if (empty-termlist? L1)
                                                                                    +      (the-empty-termlist)
                                                                                    +      (add-terms (mul-term-by-all-terms (first-term L1) L2)
                                                                                    +                 (mul-terms (rest-terms L1) L2))))
                                                                                    +(define (mul-term-by-all-terms t1 L)
                                                                                    +  (if (empty-termlist? L)
                                                                                    +      (the-empty-termlist)
                                                                                    +      (let ((t2 (first-term L)))
                                                                                    +        (adjoin-term
                                                                                    +         (make-term (+ (order t1) (order t2))
                                                                                    +                    (mul (coeff t1) (coeff t2)))
                                                                                    +         (mul-term-by-all-terms t1 (rest-terms L))))))
                                                                                    +

                                                                                    + +This is really all there is to polynomial addition and multiplication. +Notice that, since we operate on terms using the generic procedures +add and mul, our polynomial package is automatically able +to handle any type of coefficient that is known about by the generic +arithmetic package. If we include a coercion mechanism such as one of +those discussed in section 2.5.2, +then we also are automatically able to handle operations on +polynomials of different coefficient types, such as +

                                                                                    + +Because we installed the polynomial addition and +multiplication procedures add-poly and mul-poly in the generic +arithmetic system as the add and mul operations +for type polynomial, our system is also +automatically able to handle polynomial operations such as +

                                                                                    + +The reason is that when the system tries to combine coefficients, it +will dispatch through add and mul. Since the coefficients +are themselves polynomials (in y), these will be combined using add-poly and mul-poly. The result is a kind of ``data-directed +recursion'' in which, for example, a call to mul-poly will result +in recursive calls to mul-poly in order to multiply the +coefficients. If the coefficients of the coefficients were themselves +polynomials (as might be used to represent polynomials in three +variables), the data direction would ensure that the system would +follow through another level of recursive calls, and so on through as +many levels as the structure of the data dictates.57 + + +

                                                                                    Representing term lists

                                                                                    + + +Finally, we must confront the job of implementing a good +representation for term lists. A term list is, in effect, a set of +coefficients keyed by the order of the term. Hence, any of the +methods for representing sets, as discussed in +section 2.3.3, can be applied to this task. On +the other hand, our procedures add-terms and mul-terms always +access term lists sequentially from highest to lowest order. Thus, we +will use some kind of ordered list representation.

                                                                                    + +How should we structure the list that represents a term list? One +consideration is the ``density'' of the polynomials we intend to +manipulate. A polynomial is said to be dense if it has nonzero +coefficients in terms of most orders. If it has many zero terms it +is said to be sparse. For example, +

                                                                                    +is a dense polynomial, whereas +

                                                                                    +is sparse.

                                                                                    + +The term lists of dense polynomials are most efficiently represented +as lists of the coefficients. For example, A above would be nicely +represented as (1 2 0 3 -2 -5). The order of a term in this +representation is the length of the sublist beginning with that term's +coefficient, decremented by 1.58 This would be a terrible representation for a +sparse polynomial such as B: There would be a giant list of zeros +punctuated by a few lonely nonzero terms. A more reasonable +representation of the term list of a sparse polynomial is as a list of +the nonzero terms, where each term is a list containing the order of the +term and the coefficient for that order. In such a scheme, polynomial +B is efficiently represented as ((100 1) (2 2) (0 1)). As +most polynomial manipulations are performed on sparse polynomials, we +will use this method. We will assume that term lists are represented +as lists of terms, arranged from highest-order to lowest-order term. +Once we have made this decision, implementing the selectors and +constructors for terms and term lists is straightforward:59

                                                                                    + +

                                                                                    (define (adjoin-term term term-list)
                                                                                    +  (if (=zero? (coeff term))
                                                                                    +      term-list
                                                                                    +      (cons term term-list)))
                                                                                    +(define (the-empty-termlist) '())
                                                                                    +(define (first-term term-list) (car term-list))
                                                                                    +(define (rest-terms term-list) (cdr term-list))
                                                                                    +(define (empty-termlist? term-list) (null? term-list))
                                                                                    +(define (make-term order coeff) (list order coeff))
                                                                                    +(define (order term) (car term))
                                                                                    +(define (coeff term) (cadr term))
                                                                                    +

                                                                                    +where =zero? is as defined in +exercise 2.80. (See also exercise 2.87 below.)

                                                                                    + +Users of the polynomial package +will create (tagged) polynomials by means of the procedure:

                                                                                    + +

                                                                                    (define (make-polynomial var terms)
                                                                                    +  ((get 'make 'polynomial) var terms))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 2.87.  Install =zero? for polynomials in the generic arithmetic +package. This will allow adjoin-term to work for polynomials +with coefficients that are themselves polynomials. + +

                                                                                    + +

                                                                                    +Exercise 2.88.  Extend the polynomial system to include subtraction of polynomials. +(Hint: You may find it helpful to define a generic negation operation.) + +

                                                                                    + +

                                                                                    +Exercise 2.89.  Define procedures that implement the term-list representation +described above as appropriate for dense polynomials. +

                                                                                    + +

                                                                                    +Exercise 2.90.  Suppose we want to have a polynomial system that is efficient for both +sparse and dense polynomials. One way to do this is to allow both +kinds of term-list representations in our system. The situation is +analogous to the complex-number example of section 2.4, +where we allowed both rectangular and polar representations. +To do this we must distinguish different types of term lists and make +the operations on term lists generic. Redesign the polynomial system +to implement this generalization. This is a major effort, not a local +change. +

                                                                                    + +

                                                                                    +Exercise 2.91.  A univariate polynomial can be divided by another one to produce a +polynomial quotient and a polynomial remainder. For example,

                                                                                    + +

                                                                                    + +Division can be performed via long division. +That is, divide the highest-order term of the dividend by +the highest-order term of the divisor. The result is the first term of the +quotient. Next, multiply the result by the divisor, subtract that +from the dividend, and produce the rest of the answer by recursively +dividing the difference by the divisor. Stop when the order of the +divisor exceeds the order of the dividend and declare the dividend to +be the remainder. Also, if the dividend ever becomes zero, return +zero as both quotient and remainder.

                                                                                    + +We can design a div-poly procedure on the model of add-poly and +mul-poly. The procedure checks to see if the two polys have +the same variable. If so, div-poly strips off the variable and +passes the problem to div-terms, which performs the division +operation on term lists. Div-poly finally reattaches the variable +to the result supplied by div-terms. It is convenient +to design div-terms to compute both the quotient and the remainder +of a division. Div-terms can take two term lists as arguments and +return a list of the quotient term list and the remainder term list.

                                                                                    + +Complete the following definition of div-terms by filling in the +missing expressions. Use this to implement div-poly, which takes +two polys as arguments and returns a list of the quotient and +remainder polys.

                                                                                    + +

                                                                                    (define (div-terms L1 L2)
                                                                                    +  (if (empty-termlist? L1)
                                                                                    +      (list (the-empty-termlist) (the-empty-termlist))
                                                                                    +      (let ((t1 (first-term L1))
                                                                                    +            (t2 (first-term L2)))
                                                                                    +        (if (> (order t2) (order t1))
                                                                                    +            (list (the-empty-termlist) L1)
                                                                                    +            (let ((new-c (div (coeff t1) (coeff t2)))
                                                                                    +                  (new-o (- (order t1) (order t2))))
                                                                                    +              (let ((rest-of-result
                                                                                    +                     <compute rest of result recursively>
                                                                                    +                     ))
                                                                                    +                <form complete result>
                                                                                    +                ))))))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    Hierarchies of types in symbolic algebra

                                                                                    + + +Our polynomial system illustrates how objects of one type +(polynomials) may in fact be complex objects that have objects of many +different types as parts. This poses no real difficulty in defining +generic operations. We need only install appropriate generic operations +for performing the necessary manipulations of the parts of the +compound types. In fact, we saw that polynomials form a kind of +``recursive data abstraction,'' in that parts of a polynomial may +themselves be polynomials. Our generic operations and our +data-directed programming style can handle this complication without +much trouble.

                                                                                    + +On the other hand, polynomial algebra is a system for which the data +types cannot be naturally arranged in a tower. For instance, it is +possible to have polynomials in x whose coefficients are polynomials +in y. It is also possible to have polynomials in y whose +coefficients are polynomials in x. Neither of these types is +``above'' the other in any natural way, yet it is often necessary to +add together elements from each set. There are several ways to do +this. One possibility is to convert one polynomial to the type of the +other by expanding and rearranging terms so that both polynomials have +the same principal variable. One can impose a towerlike structure on +this by ordering the variables and thus always converting any +polynomial to a ``canonical form'' with the highest-priority variable +dominant and the lower-priority variables buried in the coefficients. +This strategy works fairly well, except that the conversion may expand +a polynomial unnecessarily, making it hard to read and perhaps less +efficient to work with. The tower strategy is certainly not natural +for this domain or for any domain where the user can invent new types +dynamically using old types in various combining forms, such as +trigonometric functions, power series, and integrals.

                                                                                    + +It should not be surprising that controlling coercion is a serious +problem in the design of large-scale algebraic-manipulation systems. +Much of the complexity of such systems is concerned with relationships +among diverse types. Indeed, it is fair to say that we do not yet +completely understand coercion. In fact, we do not yet completely +understand the concept of a data type. Nevertheless, what we know +provides us with powerful structuring and modularity principles to +support the design of large systems.

                                                                                    + +

                                                                                    +Exercise 2.92.  By imposing an ordering on variables, extend the polynomial package so +that addition and multiplication of polynomials works for polynomials +in different variables. (This is not easy!) +

                                                                                    + + +

                                                                                    Extended exercise: Rational functions

                                                                                    + +We can extend our generic arithmetic system to include rational +functions. These are ``fractions'' whose numerator and denominator +are polynomials, such as

                                                                                    + +

                                                                                    +The system should be able to add, subtract, multiply, and divide +rational functions, and to perform such computations as +

                                                                                    +(Here the sum has been simplified by removing common factors. +Ordinary ``cross multiplication'' would have produced a +fourth-degree polynomial over a fifth-degree polynomial.)

                                                                                    + +If we modify our rational-arithmetic package so that it uses generic +operations, then it will do what we want, except for the problem +of reducing fractions to lowest terms.

                                                                                    + +

                                                                                    +Exercise 2.93.  Modify the rational-arithmetic package to use generic operations, but +change make-rat so that it does not attempt to reduce fractions +to lowest terms. Test your system by calling make-rational on +two polynomials to produce a rational function

                                                                                    + +

                                                                                    (define p1 (make-polynomial 'x '((2 1)(0 1))))
                                                                                    +(define p2 (make-polynomial 'x '((3 1)(0 1))))
                                                                                    +(define rf (make-rational p2 p1))
                                                                                    +

                                                                                    +Now add rf to itself, using add. You will observe that +this addition procedure does not reduce fractions to lowest terms. + +

                                                                                    + +

                                                                                    +We can reduce polynomial fractions to lowest terms using the same idea +we used with integers: modifying make-rat to divide both the +numerator and the denominator by their greatest common divisor. The +notion of ``greatest common divisor'' makes sense for polynomials. In +fact, we can compute the GCD of two polynomials using essentially the +same Euclid's Algorithm that works for integers.60 The +integer version is

                                                                                    + + +

                                                                                    (define (gcd a b)
                                                                                    +  (if (= b 0)
                                                                                    +      a
                                                                                    +      (gcd b (remainder a b))))
                                                                                    +

                                                                                    +Using this, we could make the obvious modification to define a GCD +operation that works on term lists:

                                                                                    + +

                                                                                    (define (gcd-terms a b)
                                                                                    +  (if (empty-termlist? b)
                                                                                    +      a
                                                                                    +      (gcd-terms b (remainder-terms a b))))
                                                                                    +

                                                                                    +where remainder-terms picks out the remainder component of the +list returned by the term-list division operation div-terms that +was implemented in exercise 2.91.

                                                                                    + +

                                                                                    +Exercise 2.94.  Using div-terms, implement the procedure remainder-terms and +use this to define gcd-terms as above. Now write a procedure +gcd-poly that computes the polynomial GCD of two polys. +(The procedure should signal an error if the two polys are not +in the same variable.) Install in the system a generic operation greatest-common-divisor that reduces to gcd-poly for polynomials +and to ordinary gcd for ordinary numbers. As a test, try

                                                                                    + +

                                                                                    (define p1 (make-polynomial 'x '((4 1) (3 -1) (2 -2) (1 2))))
                                                                                    +(define p2 (make-polynomial 'x '((3 1) (1 -1))))
                                                                                    +(greatest-common-divisor p1 p2)
                                                                                    +

                                                                                    +and check your result by hand. + +

                                                                                    + +

                                                                                    +Exercise 2.95.  Define P1, P2, and P3 to be the polynomials

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +Now define Q1 to be the product of P1 and P2 and Q2 to +be the product of P1 and P3, and use greatest-common-divisor +(exercise 2.94) to +compute the GCD of Q1 and Q2. +Note that the answer is not the same as P1. +This example introduces noninteger +operations into the computation, causing difficulties with the GCD +algorithm.61 +To understand what is happening, +try tracing gcd-terms while computing the GCD or +try performing the division by hand. + +

                                                                                    + +

                                                                                    We can solve the problem exhibited in exercise 2.95 if +we use the following modification of the GCD algorithm (which really +works only in the case of polynomials with integer coefficients). +Before performing any polynomial division in the GCD computation, we +multiply the dividend by an integer constant factor, chosen to +guarantee that no fractions will arise during the division process. +Our answer will thus differ from the actual GCD by an integer constant +factor, but this does not matter in the case of reducing rational +functions to lowest terms; the GCD will be used to divide both the +numerator and denominator, so the integer constant factor will cancel +out.

                                                                                    + +More precisely, if P and Q are polynomials, let O1 be the +order of P (i.e., the order of the largest term of P) and let +O2 be the order of Q. Let c be the leading coefficient of +Q. Then it can be shown that, if we multiply P by the integerizing factor c1+O1 -O2, the resulting polynomial can +be divided by Q by using the div-terms algorithm without +introducing any fractions. The operation of multiplying the dividend +by this constant and then dividing is sometimes called the pseudodivision of P by Q. The remainder of the division is +called the pseudoremainder.

                                                                                    + +

                                                                                    +Exercise 2.96.  a.    Implement the procedure pseudoremainder-terms, which is just like +remainder-terms except that it multiplies the dividend by +the integerizing factor described above before calling div-terms. +Modify gcd-terms to use pseudoremainder-terms, and verify +that greatest-common-divisor now produces an answer with integer +coefficients on the example in exercise 2.95.

                                                                                    + +

                                                                                    b.    The GCD now has integer coefficients, but they are larger than those +of P1. Modify gcd-terms so that it removes common factors from +the coefficients of the answer by dividing all the coefficients by their +(integer) greatest common divisor. + +

                                                                                    + +

                                                                                    Thus, here is how to reduce a rational function to lowest terms:

                                                                                    + +

                                                                                      +
                                                                                    • Compute the GCD of the numerator and denominator, using +the version of gcd-terms from exercise 2.96.

                                                                                      + +

                                                                                    • When you obtain the GCD, multiply both numerator and +denominator by the same integerizing factor before dividing through by +the GCD, so that division by the GCD will not introduce any noninteger +coefficients. As the factor you can use the leading coefficient of +the GCD raised to the power 1 + O1 - O2, where O2 is the order +of the GCD and O1 is the maximum of the orders of the numerator +and denominator. This will ensure that dividing the numerator and +denominator by the GCD will not introduce any fractions.

                                                                                      + +

                                                                                    • The result of this operation will be a numerator and denominator +with integer coefficients. The coefficients will normally be very +large because of all of the integerizing factors, so the last step is +to remove the redundant factors by computing the (integer) greatest +common divisor of all the coefficients of the numerator and the +denominator and dividing through by this factor. +

                                                                                    + +

                                                                                    +Exercise 2.97.  a. Implement this algorithm as a procedure reduce-terms that takes two +term lists n and d as arguments and returns a list nn, dd, which are n and d reduced to lowest terms +via the algorithm given above. +Also write a procedure reduce-poly, analogous to add-poly, +that checks to see if the two polys have +the same variable. If so, reduce-poly strips off the variable and +passes the problem to reduce-terms, then reattaches the variable +to the two term lists supplied by reduce-terms. +

                                                                                    + +

                                                                                    b. Define a procedure analogous to reduce-terms +that does what the original make-rat did for integers:

                                                                                    + +

                                                                                    (define (reduce-integers n d)
                                                                                    +  (let ((g (gcd n d)))
                                                                                    +    (list (/ n g) (/ d g))))
                                                                                    +

                                                                                    +and define +reduce as a generic operation that calls apply-generic to +dispatch to either reduce-poly (for polynomial arguments) +or reduce-integers (for scheme-number arguments). +You can now easily make the +rational-arithmetic package reduce fractions to lowest terms by +having make-rat call reduce before combining the given +numerator and denominator to form a rational number. +The system now +handles rational expressions in either integers or polynomials. +To test your program, try the example at the beginning of this +extended exercise:

                                                                                    + +

                                                                                    (define p1 (make-polynomial 'x '((1 1)(0 1))))
                                                                                    +(define p2 (make-polynomial 'x '((3 1)(0 -1))))
                                                                                    +(define p3 (make-polynomial 'x '((1 1))))
                                                                                    +(define p4 (make-polynomial 'x '((2 1)(0 -1))))
                                                                                    +
                                                                                    +(define rf1 (make-rational p1 p2))
                                                                                    +(define rf2 (make-rational p3 p4))
                                                                                    +
                                                                                    +(add rf1 rf2)
                                                                                    +

                                                                                    +See if you get the correct answer, correctly reduced to lowest terms. +

                                                                                    + +

                                                                                    The GCD computation is at the heart of any system that does operations +on rational functions. The algorithm used above, although +mathematically straightforward, is extremely slow. The slowness is +due partly to the large number of division operations and partly to +the enormous size of the intermediate coefficients generated by the +pseudodivisions. One of the active areas in the development of +algebraic-manipulation systems is the design of better algorithms for +computing polynomial GCDs.62 + +

                                                                                    + + +


                                                                                    +

                                                                                    49 We also have to supply an almost identical +procedure to handle the types (scheme-number complex). + +

                                                                                    50 See +exercise 2.82 for generalizations. + +

                                                                                    51 If we are +clever, we can usually get by with fewer than n2 coercion +procedures. For instance, if we know how to convert from type 1 to +type 2 and from type 2 to type 3, then we can use this knowledge to +convert from type 1 to type 3. This can greatly decrease the number +of coercion procedures we need to supply explicitly when we add a new +type to the system. If we are willing to build the required amount of +sophistication into our system, we can have it search the ``graph'' of +relations among types and automatically generate those coercion +procedures that can be inferred from the ones that are supplied +explicitly. + +

                                                                                    52 This statement, which also appears in the first edition of this book, +is just as true now as it was when we wrote it twelve years ago. +Developing a useful, general framework for expressing the relations +among different types of entities (what philosophers call +``ontology'') seems intractably difficult. The main difference +between the confusion that existed ten years ago and the confusion +that exists now is that now a variety of inadequate ontological +theories have been embodied in a plethora of correspondingly +inadequate programming languages. For example, much of the complexity +of object-oriented programming languages -- and the subtle and +confusing differences among contemporary object-oriented +languages -- centers on the treatment of generic operations on +interrelated types. Our own discussion of computational objects in +chapter 3 avoids these issues entirely. Readers familiar with +object-oriented programming will notice that we have much to say in +chapter 3 about local state, but we do not even mention ``classes'' or +``inheritance.'' In fact, we suspect that these problems cannot be +adequately addressed in terms of computer-language design alone, +without also drawing on work in knowledge representation and automated +reasoning. + +

                                                                                    53 A real number can be projected to an integer +using the round primitive, which returns the closest integer +to its argument. + +

                                                                                    54 On the other hand, we will allow +polynomials whose coefficients are themselves polynomials in other +variables. This will give us essentially the same representational +power as a full multivariate system, although it does lead to coercion +problems, as discussed below. + +

                                                                                    55 For univariate polynomials, giving +the value of a polynomial at a given set of points can be a +particularly good representation. This makes polynomial arithmetic +extremely simple. To obtain, for example, the sum of two polynomials +represented in this way, we need only add the values of the +polynomials at corresponding points. To transform back to a more +familiar representation, we can use the Lagrange interpolation +formula, which shows how to recover the coefficients of a polynomial +of degree n given the values of the polynomial at n + 1 points. + +

                                                                                    56 This operation is very much like the ordered +union-set operation we developed in exercise  2.62. +In fact, if we think of the terms of the polynomial as a set ordered +according to the power of the indeterminate, then the program that +produces the term list for a sum is almost identical to union-set. + +

                                                                                    57 To make +this work completely smoothly, we should also add to our generic +arithmetic system the ability to coerce a ``number'' to a polynomial +by regarding it as a polynomial of degree zero whose coefficient is +the number. This is necessary if we are going to perform operations +such as +

                                                                                    +which requires adding the coefficient y + 1 to the coefficient 2. + +

                                                                                    58 In these polynomial examples, +we assume that we have implemented the generic arithmetic system using +the type mechanism suggested in exercise 2.78. +Thus, coefficients that are ordinary numbers will be represented as +the numbers themselves rather than as pairs whose car is the +symbol scheme-number. + +

                                                                                    59 Although +we are assuming that term +lists are ordered, we have implemented adjoin-term to simply +cons the new term onto the existing term list. We can get away +with this so long as we guarantee that the procedures (such as add-terms) that use adjoin-term always call it with a higher-order +term than appears in the list. If we did not want to make such a +guarantee, we could have implemented adjoin-term to be similar +to the adjoin-set constructor for the ordered-list +representation of sets (exercise 2.61). + +

                                                                                    60 The fact +that Euclid's Algorithm works for polynomials is formalized in algebra +by saying that polynomials form a kind of algebraic domain called a +Euclidean ring. A Euclidean ring is a domain that admits +addition, subtraction, and commutative multiplication, together with a +way of assigning to each element x of the ring a positive integer +``measure'' m(x) with the properties that m(xy)> m(x) for +any nonzero x and y and that, given any x and y, there exists +a q such that y = qx + r and either r = 0 or m(r)< m(x). From an +abstract point of view, this is what is needed to prove that Euclid's +Algorithm works. For the domain of integers, the measure m of an +integer is the absolute value of the integer itself. For the domain +of polynomials, the measure of a polynomial is its degree. + +

                                                                                    61 In an implementation like MIT Scheme, this produces a polynomial +that is indeed a divisor of Q1 and Q2, but with rational coefficients. +In many other Scheme systems, in which division of integers can produce +limited-precision decimal numbers, we may fail to get a valid divisor. + +

                                                                                    62 One extremely efficient and +elegant method for computing polynomial GCDs was discovered by Richard +Zippel (1979). The method is a probabilistic algorithm, as is the +fast test for primality that we discussed in chapter 1. Zippel's book +(1993) describes this method, together with other ways to compute +polynomial GCDs. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-19.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-19.html new file mode 100644 index 00000000..7b599f0b --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-19.html @@ -0,0 +1,104 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +

                                                                                    +Modularity, Objects, and State

                                                                                    + +

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + +

                                                                                    + +M

                                                                                    + +

                                                                                    + +(Even while it changes, it stands still.)

                                                                                    + +Heraclitus

                                                                                    + +Plus ça change, plus c'est la même chose.

                                                                                    + +Alphonse Karr

                                                                                    + + +

                                                                                    +
                                                                                    + +

                                                                                    + +The preceding chapters introduced the basic elements from which +programs are made. We saw how primitive procedures and primitive data +are combined to construct compound entities, and we learned that +abstraction is vital in helping us to cope with the complexity of +large systems. But these tools are not sufficient for designing +programs. Effective program synthesis also requires organizational +principles that can guide us in formulating the overall design of a +program. In particular, we need strategies to help us structure large +systems so that they will be modular, that is, so that they can +be divided ``naturally'' into coherent parts that can be separately +developed and maintained.

                                                                                    + +One powerful design strategy, which is particularly appropriate to the +construction of programs for modeling physical systems, is to base the +structure of our programs on the structure of the system being +modeled. For each object in the system, we construct a corresponding +computational object. For each system action, we define a symbolic +operation in our computational model. Our hope in using this strategy +is that extending the model to accommodate new objects or new actions +will require no strategic changes to the program, only the addition of +the new symbolic analogs of those objects or actions. If we have been +successful in our system organization, then to add a new feature or +debug an old one we will have to work on only a localized part of the +system.

                                                                                    + + +To a large extent, then, the way we organize a large program is +dictated by our perception of the system to be modeled. In this +chapter we will investigate two prominent organizational strategies +arising from two rather different ``world views'' of the structure of +systems. The first organizational strategy concentrates on objects, viewing a large system as a collection of distinct objects +whose behaviors may change over time. An alternative organizational +strategy concentrates on the streams of information that flow in +the system, much as an electrical engineer views a signal-processing +system.

                                                                                    + +Both the object-based approach and the stream-processing approach +raise significant linguistic issues in programming. +With objects, we must be concerned with how a computational object can +change and yet maintain its identity. This will force us to abandon +our old substitution model of computation +(section 1.1.5) in favor of a more mechanistic +but less theoretically tractable environment model of +computation. The difficulties of dealing with objects, change, and +identity are a fundamental consequence of the need to grapple with +time in our computational models. These difficulties become even +greater when we allow the possibility of concurrent execution of +programs. The stream approach can be most fully exploited when we +decouple simulated time in our model from the order of the events that +take place in the computer during evaluation. We will accomplish this +using a technique known as delayed evaluation.

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-2.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-2.html new file mode 100644 index 00000000..1cd66a60 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-2.html @@ -0,0 +1,91 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +This book is one of a series of texts written by faculty of the +Electrical Engineering and Computer Science Department at the +Massachusetts Institute of Technology. It was edited and produced by +The MIT Press under a joint production-distribution arrangement with +the McGraw-Hill Book Company. +

                                                                                    Ordering Information: +

                                                                                    North America
                                                                                    +Text orders should be addressed to the McGraw-Hill Book Company.
                                                                                    +All other orders should be addressed to The MIT Press. +

                                                                                    Outside North America
                                                                                    +All orders should be addressed to The MIT Press or its local distributor. +

                                                                                    © 1996 by The Massachusetts Institute of Technology
                                                                                    +

                                                                                    Second edition + +

                                                                                    Creative Commons License
                                                                                    Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Jay Sussman with Julie Sussman is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License by the MIT Press. +

                                                                                    + +

                                                                                    + +

                                                                                    This book was set by the authors using the LATEX typesetting +system and was printed and bound in the United States of America. +

                                                                                    Library of Congress Cataloging-in-Publication Data

                                                                                    Abelson, Harold +
                                                                                    +     Structure and interpretation of computer programs / Harold Abelson +
                                                                                    + and Gerald Jay Sussman, with Julie Sussman. -- 2nd ed. +
                                                                                    +     p. cm. -- (Electrical engineering and computer science +
                                                                                    + series) +
                                                                                    +     Includes bibliographical references and index. +
                                                                                    +     ISBN 0-262-01153-0 (MIT Press hardcover) +
                                                                                    +     ISBN 0-262-51087-1 (MIT Press paperback) +
                                                                                    +     ISBN 0-07-000484-6 (McGraw-Hill hardcover) +
                                                                                    +     1. Electronic digital computers -- Programming. 2. LISP (Computer +
                                                                                    + program language) I. Sussman, Gerald Jay. II. Sussman, Julie. +
                                                                                    + III. Title. IV. Series: MIT electrical engineering and computer +
                                                                                    + science series. +
                                                                                    + QA76.6.A255         1996 +
                                                                                    + 005.13'3 -- dc20              96-17756 +
                                                                                    + +
                                                                                    +Fourth printing, 1999 +
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-20.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-20.html new file mode 100644 index 00000000..506ca3ea --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-20.html @@ -0,0 +1,936 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    3.1  Assignment and Local State

                                                                                    + + +We ordinarily view the world as populated by independent objects, each +of which has a state that changes over time. An object is said to +``have state'' if its behavior is influenced by its history. A bank +account, for example, has state in that the answer to the question +``Can I withdraw $100?'' depends upon the history of deposit and +withdrawal transactions. We can characterize an object's state by one +or more state variables, which among them maintain enough +information about history to determine the object's current behavior. +In a simple banking system, we could characterize the state of an +account by a current balance rather than by remembering the entire +history of account transactions.

                                                                                    + +In a system composed of many objects, the objects are rarely +completely independent. Each may influence the states of others +through interactions, which serve to couple the state variables of one +object to those of other objects. Indeed, the view that a system is +composed of separate objects is most useful when the state variables +of the system can be grouped into closely coupled subsystems that are +only loosely coupled to other subsystems.

                                                                                    + + +This view of a system can be a powerful framework for organizing +computational models of the system. For such a model to be modular, +it should be decomposed into computational objects that model the +actual objects in the system. Each computational object must have its +own local state variables describing the actual object's state. +Since the states of objects in the system being modeled change over +time, the state variables of the corresponding computational objects +must also change. If we choose to model the flow of time in the +system by the elapsed time in the computer, then we must have a way to +construct computational objects whose behaviors change as our programs +run. In particular, if we wish to model state variables by ordinary +symbolic names in the programming language, then the language must +provide an assignment operator to enable us to change the value +associated with a name.

                                                                                    + + +

                                                                                    3.1.1  Local State Variables

                                                                                    + + + +To illustrate what we mean by having a computational object with +time-varying state, let us model the situation of withdrawing money +from a bank account. We will do this using a procedure withdraw, which takes as argument an amount to be withdrawn. +If there is enough money in the account to accommodate the withdrawal, +then withdraw should return the balance remaining after the +withdrawal. Otherwise, withdraw should return the message Insufficient funds. For example, if we begin with $100 in the +account, we should obtain the following sequence of responses using +withdraw:

                                                                                    + +

                                                                                    (withdraw 25)
                                                                                    +75
                                                                                    +(withdraw 25)
                                                                                    +50
                                                                                    +(withdraw 60)
                                                                                    +"Insufficient funds"
                                                                                    +(withdraw 15)
                                                                                    +35
                                                                                    +

                                                                                    +Observe that the expression (withdraw 25), evaluated twice, +yields different values. This is a new kind of behavior for a +procedure. Until now, all our procedures could be viewed as +specifications for computing mathematical functions. A call to a +procedure computed the value of the function applied to the given +arguments, and two calls to the same procedure with the +same arguments always produced the same result.1

                                                                                    + +To implement withdraw, we can use a variable balance to +indicate the balance of money in the account and define withdraw +as a procedure that accesses balance. The withdraw +procedure checks to see if balance is at least as large as the +requested amount. If so, withdraw decrements balance by amount and returns the new value of balance. +Otherwise, withdraw returns the Insufficient funds +message. Here are the definitions of balance and withdraw:

                                                                                    + +

                                                                                    (define balance 100)
                                                                                    +
                                                                                    +(define (withdraw amount)
                                                                                    +  (if (>= balance amount)
                                                                                    +      (begin (set! balance (- balance amount))
                                                                                    +             balance)
                                                                                    +      "Insufficient funds"))
                                                                                    +

                                                                                    +Decrementing balance is accomplished by the expression

                                                                                    + +

                                                                                    (set! balance (- balance amount))
                                                                                    +

                                                                                    +This uses the set! special form, whose syntax is

                                                                                    + +

                                                                                    (set! <name> <new-value>)
                                                                                    +

                                                                                    +Here <name> is a symbol and <new-value> is any expression. Set! changes <name> so that its value is the result obtained by +evaluating <new-value>. In the case at hand, we are changing balance so that its new value will be the result of subtracting amount from the previous value of balance.2

                                                                                    + +Withdraw also uses the begin special form to cause +two expressions to be evaluated +in the case where the if test is true: first decrementing balance and then returning the value of balance. In general, +evaluating the expression

                                                                                    + +

                                                                                    (begin <exp1> <exp2... <expk>)
                                                                                    +

                                                                                    +causes the expressions <exp1> through <expk> to be +evaluated in sequence and the value of the final expression +<expk> to be returned as the value of the entire begin +form.3

                                                                                    + +Although withdraw works as desired, the variable +balance presents a problem. As specified above, balance +is a name defined in the global environment and is freely accessible +to be examined or modified by any procedure. It would be much better +if we could somehow make balance internal to withdraw, so +that withdraw would be the only procedure that could access balance directly and any other procedure could access balance +only indirectly (through calls to withdraw). This would more +accurately model the notion that balance is a local state +variable used by withdraw to keep track of the state of the +account.

                                                                                    + +We can make balance internal to withdraw by rewriting the +definition as follows:

                                                                                    + +

                                                                                    (define new-withdraw
                                                                                    +  (let ((balance 100))
                                                                                    +    (lambda (amount)
                                                                                    +      (if (>= balance amount)
                                                                                    +          (begin (set! balance (- balance amount))
                                                                                    +                 balance)
                                                                                    +          "Insufficient funds"))))
                                                                                    +

                                                                                    +What we have done here is use let to establish an environment +with a local variable balance, bound to the initial value 100. +Within this local environment, we use lambda to create a +procedure that takes amount as an argument and behaves like our +previous withdraw procedure. This procedure -- returned as the +result of evaluating the let expression -- is new-withdraw, +which behaves in precisely the same way as withdraw but whose +variable balance is not accessible by any other +procedure.4

                                                                                    + +Combining set! with local variables is the general programming +technique we will use for constructing computational objects with +local state. Unfortunately, using this technique raises a serious +problem: When we first introduced procedures, we also introduced the +substitution model of evaluation +(section 1.1.5) to provide an interpretation of +what procedure application means. We said that applying a procedure +should be interpreted as evaluating the body of the procedure with the +formal parameters replaced by their values. The trouble is that, as +soon as we introduce assignment into our language, substitution is no +longer an adequate model of procedure application. (We will see why +this is so in section 3.1.3.) As a +consequence, we technically have at this point no way to understand +why the new-withdraw procedure behaves as claimed above. In +order to really understand a procedure such as new-withdraw, we +will need to develop a new model of procedure application. In +section 3.2 we will introduce such a model, +together with an explanation of set! and local variables. +First, however, we examine some variations on the theme established by +new-withdraw.

                                                                                    + +The following procedure, make-withdraw, creates ``withdrawal +processors.'' The formal parameter balance in make-withdraw specifies the initial amount of money in the +account.5

                                                                                    + +

                                                                                    (define (make-withdraw balance)
                                                                                    +  (lambda (amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds")))
                                                                                    +

                                                                                    +Make-withdraw can be used as follows to create two objects +W1 and W2:

                                                                                    + +

                                                                                    (define W1 (make-withdraw 100))
                                                                                    +(define W2 (make-withdraw 100))
                                                                                    +(W1 50)
                                                                                    +50
                                                                                    +(W2 70)
                                                                                    +30
                                                                                    +(W2 40)
                                                                                    +"Insufficient funds"
                                                                                    +(W1 40)
                                                                                    +10
                                                                                    +

                                                                                    +Observe that W1 and W2 are completely independent objects, +each with its own local state variable balance. Withdrawals +from one do not affect the other.

                                                                                    + +We can also create objects that handle deposits as well as +withdrawals, and thus we can represent simple bank accounts. Here is +a procedure that returns a ``bank-account object'' with +a specified initial balance:

                                                                                    + +

                                                                                    (define (make-account balance)
                                                                                    +  (define (withdraw amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds"))
                                                                                    +  (define (deposit amount)
                                                                                    +    (set! balance (+ balance amount))
                                                                                    +    balance)
                                                                                    +  (define (dispatch m)
                                                                                    +    (cond ((eq? m 'withdraw) withdraw)
                                                                                    +          ((eq? m 'deposit) deposit)
                                                                                    +          (else (error "Unknown request -- MAKE-ACCOUNT"
                                                                                    +                       m))))
                                                                                    +  dispatch)
                                                                                    +

                                                                                    +Each call to make-account sets up an environment with a local +state variable balance. Within this environment, make-account defines procedures deposit and withdraw +that access balance and an additional procedure dispatch +that takes a ``message'' as input and returns one of the two local +procedures. The dispatch procedure itself is returned as the +value that represents the bank-account object. +This is precisely the message-passing +style of programming that we saw in section 2.4.3, although +here we are using it in conjunction with the ability to modify local +variables.

                                                                                    + +Make-account can be used as follows:

                                                                                    + +

                                                                                    (define acc (make-account 100))
                                                                                    +((acc 'withdraw) 50)
                                                                                    +50
                                                                                    +((acc 'withdraw) 60)
                                                                                    +"Insufficient funds"
                                                                                    +((acc 'deposit) 40)
                                                                                    +90
                                                                                    +((acc 'withdraw) 60)
                                                                                    +30
                                                                                    +

                                                                                    +Each call to acc returns the locally defined deposit or +withdraw procedure, which is then applied to the specified amount. As was the case with make-withdraw, another call to make-account

                                                                                    + +

                                                                                    (define acc2 (make-account 100))
                                                                                    +

                                                                                    +will produce a completely separate account object, which maintains its +own local balance.

                                                                                    + +

                                                                                    +Exercise 3.1.  An accumulator is a procedure that is called repeatedly with a +single numeric argument and accumulates its arguments into a sum. +Each time it is called, it returns the currently accumulated sum. +Write a procedure make-accumulator that generates accumulators, +each maintaining an independent sum. The input to make-accumulator should specify the initial value of the sum; for +example

                                                                                    + +

                                                                                    (define A (make-accumulator 5))
                                                                                    +(A 10)
                                                                                    +15
                                                                                    +(A 10)
                                                                                    +25
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.2.  In software-testing applications, it is useful to be able to count the +number of times a given procedure is called during the course of a +computation. Write a procedure make-monitored that takes as +input a procedure, f, that itself takes one input. The result +returned by make-monitored is a third procedure, say mf, +that keeps track of the number of times it has been called by +maintaining an internal counter. If the input to mf is the +special symbol how-many-calls?, then mf returns the +value of the counter. If the input is the special symbol reset-count, then mf resets the counter to zero. For any other +input, mf returns the result of calling f on that input +and increments the counter. For instance, we could make a monitored +version of the sqrt procedure:

                                                                                    + +

                                                                                    (define s (make-monitored sqrt))
                                                                                    +
                                                                                    +(s 100)
                                                                                    +10
                                                                                    +
                                                                                    +(s 'how-many-calls?)
                                                                                    +1
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.3.  Modify the make-account procedure so that it creates +password-protected accounts. That is, make-account should take +a symbol as an additional argument, as in

                                                                                    + +

                                                                                    (define acc (make-account 100 'secret-password))
                                                                                    +

                                                                                    +The resulting account object should process a request only if it is +accompanied by the password with which the account was created, and +should otherwise return a complaint:

                                                                                    + +

                                                                                    ((acc 'secret-password 'withdraw) 40)
                                                                                    +60
                                                                                    +
                                                                                    +((acc 'some-other-password 'deposit) 50)
                                                                                    +"Incorrect password"
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.4.  Modify the make-account procedure of +exercise 3.3 by adding another local state +variable so that, if an account is accessed more than seven +consecutive times with an incorrect password, it invokes the procedure +call-the-cops. +

                                                                                    +

                                                                                    + + +

                                                                                    3.1.2  The Benefits of Introducing Assignment

                                                                                    + + + +As we shall see, introducing assignment into our programming language +leads us into a thicket of difficult conceptual issues. Nevertheless, +viewing systems as collections of objects with local state is a +powerful technique for maintaining a modular design. As a simple +example, consider the design of a procedure rand that, whenever +it is called, returns an integer chosen at random.

                                                                                    + +It is not at all clear what is meant by ``chosen at random.'' What we +presumably want is for successive calls to rand to produce a +sequence of numbers that has statistical properties of uniform +distribution. We will not discuss methods for generating suitable +sequences here. Rather, let us assume that we have a procedure rand-update that has the property that if we start with a given +number x1 and form

                                                                                    + +

                                                                                    x2 = (rand-update x1)
                                                                                    +x3 = (rand-update x2)
                                                                                    +

                                                                                    +then the sequence of values x1, x2, x3, ..., will have the +desired statistical properties.6

                                                                                    + +We can implement rand as a procedure with a local state variable +x that is initialized to some fixed value random-init. +Each call to rand computes rand-update of the current +value of x, returns this as the random number, and also stores +this as the new value of x.

                                                                                    + +

                                                                                    (define rand
                                                                                    +  (let ((x random-init))
                                                                                    +    (lambda ()
                                                                                    +      (set! x (rand-update x))
                                                                                    +      x)))
                                                                                    +

                                                                                    + +Of course, we could generate the same sequence of random numbers +without using assignment by simply calling rand-update directly. +However, this would mean that any part of our program that used random +numbers would have to explicitly remember the current value of x +to be passed as an argument to rand-update. To realize what an +annoyance this would be, consider using random numbers to implement a +technique called Monte Carlo simulation.

                                                                                    + +The Monte Carlo method consists of choosing sample experiments at +random from a large set and then making deductions on the basis of the +probabilities estimated from tabulating the results of those +experiments. For example, we can approximate using the fact +that 6/2 is the probability that two integers chosen at random +will have no factors in common; that is, that their greatest common +divisor will be 1.7 To obtain +the approximation to , we perform a large number of experiments. +In each experiment we choose two integers at random and perform a test +to see if their GCD is 1. The fraction of times that the test is +passed gives us our estimate of 6/2, and from this we obtain our +approximation to .

                                                                                    + +The heart of our program is a procedure monte-carlo, which takes +as arguments the number of times to try an experiment, together with +the experiment, represented as a no-argument procedure that will +return either true or false each time it is run. Monte-carlo +runs the experiment for the designated number of trials and returns a +number telling the fraction of the trials in which the experiment was +found to be true.

                                                                                    + +

                                                                                    (define (estimate-pi trials)
                                                                                    +  (sqrt (/ 6 (monte-carlo trials cesaro-test))))
                                                                                    +(define (cesaro-test)
                                                                                    +   (= (gcd (rand) (rand)) 1))
                                                                                    +(define (monte-carlo trials experiment)
                                                                                    +  (define (iter trials-remaining trials-passed)
                                                                                    +    (cond ((= trials-remaining 0)
                                                                                    +           (/ trials-passed trials))
                                                                                    +          ((experiment)
                                                                                    +           (iter (- trials-remaining 1) (+ trials-passed 1)))
                                                                                    +          (else
                                                                                    +           (iter (- trials-remaining 1) trials-passed))))
                                                                                    +  (iter trials 0))
                                                                                    +

                                                                                    + +Now let us try the same computation using rand-update directly +rather than rand, the way we would be forced to proceed if we +did not use assignment to model local state:

                                                                                    + +

                                                                                    (define (estimate-pi trials)
                                                                                    +  (sqrt (/ 6 (random-gcd-test trials random-init))))
                                                                                    +(define (random-gcd-test trials initial-x)
                                                                                    +  (define (iter trials-remaining trials-passed x)
                                                                                    +    (let ((x1 (rand-update x)))
                                                                                    +      (let ((x2 (rand-update x1)))
                                                                                    +        (cond ((= trials-remaining 0)   
                                                                                    +               (/ trials-passed trials))
                                                                                    +              ((= (gcd x1 x2) 1)
                                                                                    +               (iter (- trials-remaining 1)
                                                                                    +                     (+ trials-passed 1)
                                                                                    +                     x2))
                                                                                    +              (else
                                                                                    +               (iter (- trials-remaining 1)
                                                                                    +                     trials-passed
                                                                                    +                     x2))))))
                                                                                    +  (iter trials 0 initial-x))
                                                                                    +

                                                                                    + +While the program is still simple, it betrays some painful +breaches of modularity. In our first version of the program, using +rand, we can express the Monte Carlo method directly as +a general monte-carlo procedure that takes as an argument an +arbitrary experiment procedure. In our second version of the +program, with no local state for the random-number generator, random-gcd-test must explicitly manipulate the random numbers x1 and x2 and recycle x2 through the iterative loop as +the new input to rand-update. This explicit handling of the +random numbers intertwines the structure of accumulating test results +with the fact that our particular experiment uses two random numbers, +whereas other Monte Carlo experiments might use one random number or +three. Even the top-level procedure estimate-pi has to be +concerned with supplying an initial random number. The fact that the +random-number generator's insides are leaking out into other parts of +the program makes it difficult for us to isolate the Monte Carlo idea +so that it can be applied to other tasks. In the first version of the +program, assignment encapsulates the state of the random-number +generator within the rand procedure, so that the details of +random-number generation remain independent of the rest of the +program.

                                                                                    + +The general phenomenon illustrated by the Monte Carlo example is this: +From the point of view of one part of a complex process, the other +parts appear to change with time. They have hidden time-varying local +state. If we wish to write computer programs whose structure reflects +this decomposition, we make +computational objects (such as bank accounts and random-number +generators) whose behavior changes with time. We model state with +local state variables, and we model the changes of state with +assignments to those variables.

                                                                                    + +It is tempting to conclude this discussion by saying that, by +introducing assignment and the technique of hiding state in local +variables, we are able to structure systems in a more modular fashion +than if all state had to be manipulated explicitly, by passing +additional parameters. Unfortunately, as we shall see, the story is +not so simple.

                                                                                    + +

                                                                                    +Exercise 3.5.  Monte Carlo integration is a method of estimating definite +integrals by means of Monte Carlo simulation. Consider computing the +area of a region of space described by a predicate P(x, y) that is +true for points (x, y) in the region and false for points not in the +region. For example, the region contained within a circle of radius +3 centered at (5, 7) is described by the predicate that tests +whether (x - 5)2 + (y - 7)2< 32. To estimate the area of the +region described by such a predicate, begin by choosing a rectangle +that contains the region. For example, a rectangle with diagonally +opposite corners at (2, 4) and (8, 10) contains the circle above. +The desired integral is the area of that portion of the rectangle that +lies in the region. We can estimate the integral by picking, at +random, points (x,y) that lie in the rectangle, and testing P(x, +y) for each point to determine whether the point lies in the region. +If we try this with many points, then the fraction of points that fall +in the region should give an estimate of the proportion of the +rectangle that lies in the region. Hence, multiplying this fraction +by the area of the entire rectangle should produce an estimate of the +integral.

                                                                                    + +Implement Monte Carlo integration as a procedure estimate-integral that takes as arguments a predicate P, upper +and lower bounds x1, x2, y1, and y2 for the +rectangle, and the number of trials to perform in order to produce the +estimate. Your procedure should use the same monte-carlo procedure that was used above to estimate . Use +your estimate-integral to produce an estimate of by +measuring the area of a unit circle.

                                                                                    + +You will find it useful to have a procedure that returns a number +chosen at random from a given range. The following random-in-range +procedure implements this in terms of the random +procedure used in section 1.2.6, which returns a nonnegative +number less than its input.8

                                                                                    + +

                                                                                    (define (random-in-range low high)
                                                                                    +  (let ((range (- high low)))
                                                                                    +    (+ low (random range))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.6.  It is useful to be able to reset a random-number generator to produce +a sequence starting from a given value. Design a new rand +procedure that is called with an argument that is either the symbol +generate or the symbol reset and behaves as follows: (rand +'generate) produces a new random number; ((rand 'reset) +<new-value>) resets the internal state variable to the designated +<new-value>. Thus, by resetting the state, one can generate +repeatable sequences. These are very handy to have when testing and +debugging programs that use random numbers. + +

                                                                                    +

                                                                                    + + +

                                                                                    3.1.3  The Costs of Introducing Assignment

                                                                                    + + + +As we have seen, the set! operation enables us to model objects +that have local state. However, this advantage comes at a price. Our +programming language can no longer be interpreted in terms of the +substitution model of procedure application that we introduced in +section 1.1.5. Moreover, no simple model with +``nice'' mathematical properties can be an adequate framework for +dealing with objects and assignment in programming languages.

                                                                                    + +So long as we do not use assignments, two evaluations of the same +procedure with the same arguments will produce the same result, so +that procedures can be viewed as computing mathematical functions. +Programming without any use of assignments, as we did throughout the +first two chapters of this book, is accordingly known as functional programming.

                                                                                    + +To understand how assignment complicates matters, consider a +simplified version of the make-withdraw procedure of +section 3.1.1 that does not bother to check +for an insufficient amount:

                                                                                    + +

                                                                                    (define (make-simplified-withdraw balance)
                                                                                    +  (lambda (amount)
                                                                                    +    (set! balance (- balance amount))
                                                                                    +    balance))
                                                                                    +(define W (make-simplified-withdraw 25))
                                                                                    +(W 20)
                                                                                    +5
                                                                                    +(W 10)
                                                                                    + - 5
                                                                                    +

                                                                                    +Compare this procedure with the following make-decrementer +procedure, which does not use set!:

                                                                                    + +

                                                                                    (define (make-decrementer balance)
                                                                                    +  (lambda (amount)
                                                                                    +    (- balance amount)))
                                                                                    +

                                                                                    +Make-decrementer returns a procedure that subtracts its input +from a designated amount balance, but there is no accumulated effect +over successive calls, as with make-simplified-withdraw:

                                                                                    + +

                                                                                    (define D (make-decrementer 25))
                                                                                    +(D 20)
                                                                                    +5
                                                                                    +(D 10)
                                                                                    +15
                                                                                    +

                                                                                    +We can use the substitution model to explain how make-decrementer works. For instance, let us analyze the evaluation +of the expression

                                                                                    + +

                                                                                    ((make-decrementer 25) 20)
                                                                                    +

                                                                                    +We first simplify the operator of the combination by substituting 25 +for balance in the body of make-decrementer. This reduces +the expression to

                                                                                    + + +

                                                                                    ((lambda (amount) (- 25 amount)) 20)
                                                                                    +

                                                                                    +Now we apply the operator by substituting 20 for amount in the +body of the lambda expression:

                                                                                    + + +

                                                                                    (- 25 20)
                                                                                    +

                                                                                    +The final answer is 5.

                                                                                    + +Observe, however, what happens if we attempt a similar substitution +analysis with make-simplified-withdraw:

                                                                                    + + +

                                                                                    ((make-simplified-withdraw 25) 20)
                                                                                    +

                                                                                    +We first simplify the operator by substituting 25 for balance in +the body of make-simplified-withdraw. +This reduces the expression to9

                                                                                    + + +

                                                                                    ((lambda (amount) (set! balance (- 25 amount)) 25) 20)
                                                                                    +

                                                                                    +Now we apply the operator by substituting 20 for amount in the +body of the lambda expression:

                                                                                    + + +

                                                                                    (set! balance (- 25 20)) 25
                                                                                    +

                                                                                    +If we adhered to the substitution model, we would have to say that the +meaning of the procedure application is to first set balance to +5 and then return 25 as the value of the expression. This gets the +wrong answer. In order to get the correct answer, we would have to +somehow distinguish the first occurrence of balance (before the +effect of the set!) from the second occurrence of balance +(after the effect of the set!), and the substitution model +cannot do this.

                                                                                    + + +The trouble here is that substitution is based ultimately on the +notion that the symbols in our language are essentially names for +values. But as soon as we introduce set! and the idea that the +value of a variable can change, a variable can no longer be simply a +name. Now a variable somehow refers to a place where a value can be +stored, and the value stored at this place can change. In +section 3.2 +we will see how environments play this role of ``place'' in our +computational model. +

                                                                                    + + +

                                                                                    Sameness and change

                                                                                    + + +The issue surfacing here is more profound than the mere breakdown of a +particular model of computation. As soon as we introduce change into +our computational models, many notions that were previously +straightforward become problematical. Consider the concept of two +things being ``the same.''

                                                                                    + +Suppose we call make-decrementer twice with the same argument to +create two procedures:

                                                                                    + +

                                                                                    (define D1 (make-decrementer 25))
                                                                                    +(define D2 (make-decrementer 25))
                                                                                    +

                                                                                    +Are D1 and D2 the same? An acceptable answer is yes, +because D1 and D2 have the same computational +behavior -- each is a procedure that subtracts its input from 25. In +fact, D1 could be substituted for D2 in any computation +without changing the result.

                                                                                    + +Contrast this with making two calls to make-simplified-withdraw:

                                                                                    + +

                                                                                    (define W1 (make-simplified-withdraw 25))
                                                                                    +(define W2 (make-simplified-withdraw 25))
                                                                                    +

                                                                                    +Are W1 and W2 the same? Surely not, because calls to W1 and W2 have distinct effects, as shown by the following +sequence of interactions:

                                                                                    + +

                                                                                    (W1 20)
                                                                                    +5
                                                                                    +(W1 20)
                                                                                    + - 15
                                                                                    +(W2 20)
                                                                                    +5
                                                                                    +

                                                                                    +Even though W1 and W2 are ``equal'' in the sense that they +are both created by evaluating the same expression, (make-simplified-withdraw 25), it is not true that W1 could be +substituted for W2 in any expression without changing the result +of evaluating the expression.

                                                                                    + +A language that supports the concept that ``equals can be substituted +for equals'' in an expresssion +without changing the value of the expression is said to be +referentially transparent. Referential transparency is violated +when we include set! in our computer language. This makes it +tricky to determine when we can simplify expressions by substituting +equivalent expressions. Consequently, reasoning about programs that +use assignment becomes drastically more difficult.

                                                                                    + +Once we forgo referential transparency, the notion of what it means +for computational objects to be ``the same'' becomes difficult to +capture in a formal way. Indeed, the meaning of ``same'' in the real +world that our programs model is hardly clear in itself. In general, +we can determine that two apparently identical objects are indeed +``the same one'' only by modifying one object and then observing +whether the other object has changed in the same way. But how can we +tell if an object has ``changed'' other than by observing the ``same'' +object twice and seeing whether some property of the object differs +from one observation to the next? Thus, we cannot determine +``change'' without some a priori notion of ``sameness,'' and we +cannot determine sameness without observing the effects of change.

                                                                                    + +As an example of how this issue arises in programming, consider the +situation where Peter and Paul have a bank account with $100 in +it. There is a substantial difference between modeling this as

                                                                                    + +

                                                                                    (define peter-acc (make-account 100))
                                                                                    +(define paul-acc (make-account 100))
                                                                                    +

                                                                                    +and modeling it as

                                                                                    + +

                                                                                    (define peter-acc (make-account 100))
                                                                                    +(define paul-acc peter-acc)
                                                                                    +

                                                                                    +In the first situation, the two bank accounts are distinct. +Transactions made by Peter will not affect Paul's account, and vice +versa. In the second situation, however, we have defined paul-acc to be the same thing as peter-acc. In effect, +Peter and Paul now have a joint bank account, and if Peter makes a +withdrawal from peter-acc Paul will observe less money in paul-acc. These two similar but distinct situations can cause +confusion in building computational models. With the shared account, +in particular, it can be especially confusing that there is one object +(the bank account) that has two different names (peter-acc and +paul-acc); if we are searching for all the places in our program +where paul-acc can be changed, we must remember to look also at +things that change peter-acc.10

                                                                                    + + +With reference to the above remarks on ``sameness'' and ``change,'' +observe that if Peter and Paul could only examine their bank balances, +and could not perform operations that changed the balance, then the +issue of whether the two accounts are distinct would be moot. In +general, so long as we never modify data objects, we can regard a +compound data object to be precisely the totality of its pieces. For +example, a rational number is determined by giving its numerator and +its denominator. But this view is no longer valid in the presence of +change, where a compound data object has an ``identity'' that is +something different from the pieces of which it is composed. A bank +account is still ``the same'' bank account even if we change the +balance by making a withdrawal; conversely, we could have two +different bank accounts with the same state information. This +complication is a consequence, not of our programming language, but of +our perception of a bank account as an object. We do not, for +example, ordinarily regard a rational number as a changeable object +with identity, such that we could change the numerator and still have +``the same'' rational number. + + +

                                                                                    Pitfalls of imperative programming

                                                                                    + +In contrast to functional programming, programming that makes +extensive use of assignment is known as imperative +programming. In addition to raising complications about +computational models, programs written in imperative style are +susceptible to bugs that cannot occur in functional programs. For +example, recall the iterative factorial program from +section 1.2.1: + +

                                                                                    (define (factorial n)
                                                                                    +  (define (iter product counter)
                                                                                    +    (if (> counter n)
                                                                                    +        product
                                                                                    +        (iter (* counter product)
                                                                                    +              (+ counter 1))))
                                                                                    +  (iter 1 1))
                                                                                    +

                                                                                    +Instead of passing arguments in the internal iterative loop, we could +adopt a more imperative style by using explicit assignment +to update the values of the variables product and counter: +

                                                                                    (define (factorial n)
                                                                                    +  (let ((product 1)
                                                                                    +        (counter 1))
                                                                                    +    (define (iter)
                                                                                    +      (if (> counter n)
                                                                                    +          product
                                                                                    +          (begin (set! product (* counter product))
                                                                                    +                 (set! counter (+ counter 1))
                                                                                    +                 (iter))))
                                                                                    +    (iter)))
                                                                                    +

                                                                                    +This does not change the results produced by the program, but it does +introduce a subtle trap. How do we decide the order of the assignments? +As it happens, the program is correct as written. But +writing the assignments in the opposite order +

                                                                                    (set! counter (+ counter 1))
                                                                                    +(set! product (* counter product))
                                                                                    +

                                                                                    +would have produced a different, incorrect result. +In general, programming with assignment forces us to +carefully consider the relative orders of the assignments to make sure +that each statement is using the correct version of the variables that +have been changed. This issue simply does not arise in functional +programs.11 + +The complexity of imperative programs becomes even worse if we +consider applications in which several processes execute concurrently. We +will return to this in section 3.4. +First, however, we will address the issue of providing a computational +model for expressions that involve assignment, and explore the uses of +objects with local state in designing simulations.

                                                                                    + +

                                                                                    +Exercise 3.7.  Consider the bank account objects created by make-account, with +the password modification described in +exercise 3.3. Suppose that our banking +system requires the ability to make joint accounts. Define a +procedure make-joint that accomplishes this. Make-joint +should take three arguments. The first is a password-protected +account. The second argument must match the password with which the +account was defined in order for the make-joint operation to +proceed. The third argument is a new password. Make-joint is +to create an additional access to the original account using the new +password. For example, if peter-acc is a bank account with +password open-sesame, then

                                                                                    + +

                                                                                    (define paul-acc
                                                                                    +  (make-joint peter-acc 'open-sesame 'rosebud))
                                                                                    +

                                                                                    +will allow one to make transactions on peter-acc using the name +paul-acc and the password rosebud. You may wish to modify +your solution to exercise 3.3 to accommodate +this new feature. +

                                                                                    + +

                                                                                    +Exercise 3.8.  When we defined the evaluation model in +section 1.1.3, we said that the first step +in evaluating an expression is to evaluate its subexpressions. But we +never specified the order in which the subexpressions should be +evaluated (e.g., left to right or right to left). When we introduce +assignment, the order in which the arguments to a procedure are +evaluated can make a difference to the result. Define a simple +procedure f such that evaluating (+ (f 0) (f 1)) will +return 0 if the arguments to + are evaluated from left to right +but will return 1 if the arguments are evaluated from right to left. + +

                                                                                    +

                                                                                    + +


                                                                                    +

                                                                                    1 Actually, +this is not quite true. One exception was the random-number generator +in section 1.2.6. Another exception involved the +operation/type tables we introduced in section 2.4.3, +where the values of two calls to get with the same arguments +depended on intervening calls to put. +On the other hand, until we introduce +assignment, we have no way to create such procedures ourselves. + +

                                                                                    2 The value of a set! expression is implementation-dependent. +Set! should be used only for its effect, not for its value.

                                                                                    + +The name +set! reflects a naming convention used in Scheme: Operations +that change the values of variables (or that change data structures, +as we will see in section 3.3) are given names that +end with an exclamation point. This is similar to the convention of +designating predicates by names that end with a question mark. + +

                                                                                    3 We have already used begin implicitly in our +programs, because in Scheme the body of a procedure can be a sequence +of expressions. Also, the <consequent> part of each clause in a +cond expression can be a sequence of expressions rather than a +single expression. + +

                                                                                    4 In programming-language jargon, the variable balance is said to be encapsulated within the new-withdraw procedure. Encapsulation reflects the general +system-design principle known as the hiding principle: One can +make a system more modular and robust by protecting parts of the +system from each other; that is, by providing information access only +to those parts of the system that have a ``need to know.'' + +

                                                                                    5 In contrast with new-withdraw above, we do not +have to use let to make balance a local variable, since +formal parameters are already local. This will be clearer after the +discussion of the environment model of evaluation in section 3.2. +(See also exercise 3.10.) + +

                                                                                    6 One common way to implement +rand-update is to use the rule that x is updated to ax + b +modulo m, where a, b, and m are appropriately chosen integers. +Chapter 3 of Knuth 1981 includes an extensive discussion of techniques +for generating sequences of random numbers and establishing their +statistical properties. Notice that the rand-update procedure +computes a mathematical function: Given the same input twice, it +produces the same output. Therefore, the number sequence produced by +rand-update certainly is not ``random,'' if by ``random'' we +insist that each number in the sequence is unrelated to the preceding +number. The relation between ``real randomness'' and so-called pseudo-random sequences, which are produced by well-determined +computations and yet have suitable statistical properties, is a +complex question involving difficult issues in mathematics and +philosophy. Kolmogorov, Solomonoff, and Chaitin have made great +progress in clarifying these issues; a discussion can be found in +Chaitin 1975. + +

                                                                                    7 This theorem is due to E. Cesàro. See +section 4.5.2 of Knuth 1981 for a discussion and a proof. + +

                                                                                    8 MIT Scheme provides such a procedure. If random +is given an exact +integer (as in section 1.2.6) it returns an exact integer, +but if it is given a decimal value (as in this exercise) it returns +a decimal value. + +

                                                                                    9 We don't substitute for +the occurrence of balance in the set! expression because +the <name> in a set! is not evaluated. +If we did substitute for it, we would get +(set! 25 (- 25 amount)), which makes no sense. + +

                                                                                    10 The phenomenon of a +single computational object being accessed by more than one name is +known as aliasing. The joint bank account situation illustrates +a very simple example of an alias. In section 3.3 +we will see much more complex examples, such as ``distinct'' compound +data structures that share parts. Bugs can occur in our programs if +we forget that a change to an object may also, as a ``side effect,'' +change a ``different'' object because the two ``different'' objects +are actually a single object appearing under different aliases. These +so-called side-effect bugs are so difficult to locate and to +analyze that some people have proposed that programming languages be +designed in such a way as to not allow side effects or aliasing +(Lampson et al. 1981; Morris, Schmidt, and Wadler 1980). + +

                                                                                    11 In view of this, it is ironic that introductory programming +is most often taught in a highly imperative style. This may be a +vestige of a belief, common throughout the 1960s and 1970s, that +programs that call procedures must inherently be less efficient than +programs that perform assignments. (Steele (1977) debunks this +argument.) Alternatively it may reflect a view that step-by-step +assignment is easier for beginners to visualize than procedure call. +Whatever the reason, it often saddles beginning programmers with +``should I set this variable before or after that one'' concerns that can +complicate programming and obscure the important ideas. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-21.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-21.html new file mode 100644 index 00000000..503e0448 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-21.html @@ -0,0 +1,664 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    3.2  The Environment Model of Evaluation

                                                                                    + + + +When we introduced compound procedures in chapter 1, we used the +substitution model of evaluation +(section 1.1.5) to define what is meant by +applying a procedure to arguments:

                                                                                    + +

                                                                                      +
                                                                                    • To apply a compound procedure to arguments, evaluate the body of the +procedure with each formal parameter replaced by the corresponding +argument. +

                                                                                    + +Once we admit assignment into our programming language, such a +definition is no longer adequate. In particular, +section 3.1.3 argued that, in the presence of +assignment, a variable can no longer be considered to be merely a name +for a value. Rather, a variable must somehow designate a ``place'' in +which values can be stored. In our new model of evaluation, these +places will be maintained in structures called environments.

                                                                                    + +An environment is a sequence of frames. Each frame is a table +(possibly empty) of bindings, which associate variable names with +their corresponding values. (A single frame may contain at most one +binding for any variable.) Each frame also has a pointer to its enclosing environment, unless, for the purposes of discussion, the +frame is considered to be global. The value of a variable +with respect to an environment is the value given by the binding of +the variable in the first frame in the environment that contains a +binding for that variable. If no frame in the sequence specifies a +binding for the variable, then the variable is said to be unbound in the environment.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.1:  A simple environment structure.
                                                                                    + +

                                                                                    + +Figure 3.1 shows a simple environment +structure consisting of three frames, labeled I, II, and III. In the +diagram, A, B, C, and D are pointers to environments. C and D point +to the same environment. The variables z and x are bound +in frame II, while y and x are bound in frame I. The +value of x in environment D is 3. The value of x with +respect to environment B is also 3. This is determined as follows: We +examine the first frame in the sequence (frame III) and do not find a +binding for x, so we proceed to the enclosing environment D and +find the binding in frame I. On the other hand, the value of x +in environment A is 7, because the first frame in the sequence (frame +II) contains a binding of x to 7. With respect to environment +A, the binding of x to 7 in frame II is said to shadow the +binding of x to 3 in frame I.

                                                                                    + + +The environment is crucial to the evaluation process, +because it determines the context in which an expression should be +evaluated. Indeed, one could say that expressions in a programming +language do not, in themselves, have any meaning. Rather, an +expression acquires a meaning only with respect to some environment in +which it is evaluated. Even the interpretation of an expression as +straightforward as (+ 1 1) depends on an understanding that one +is operating in a context in which + is the symbol for addition. +Thus, in our model of evaluation we will always speak of evaluating an +expression with respect to some environment. To describe interactions +with the interpreter, we will suppose that there is a global +environment, consisting of a single frame (with no enclosing +environment) that includes values for the symbols associated with the +primitive procedures. For example, the idea that + is the +symbol for addition is captured by saying that the symbol + is +bound in the global environment to the primitive addition procedure.

                                                                                    + + +

                                                                                    3.2.1  The Rules for Evaluation

                                                                                    + + +The overall specification of how the interpreter evaluates a +combination remains the same as when we first introduced it in +section 1.1.3:

                                                                                    + +

                                                                                      +
                                                                                    • To evaluate a combination: +

                                                                                    + +

                                                                                    +

                                                                                    1.  Evaluate the subexpressions of the +combination.12

                                                                                    + +

                                                                                    2.  Apply the value of the operator subexpression to the values of the +operand subexpressions. +

                                                                                    + +The environment model of evaluation replaces the substitution model in +specifying what it means to apply a compound procedure to arguments.

                                                                                    + +In the environment model of evaluation, a procedure is always a pair +consisting of some code and a pointer to an environment. Procedures +are created in one way only: by evaluating a lambda expression. +This produces a procedure whose code is obtained from the text of the +lambda expression and whose environment is the environment in +which the lambda expression was evaluated to produce the +procedure. For example, consider the procedure definition

                                                                                    + +

                                                                                    (define (square x)
                                                                                    +  (* x x))
                                                                                    +

                                                                                    +evaluated in the global environment. The procedure definition syntax +is just syntactic sugar for an underlying implicit lambda +expression. It would have been equivalent to have used

                                                                                    + +

                                                                                    (define square
                                                                                    +  (lambda (x) (* x x)))
                                                                                    +

                                                                                    +which evaluates (lambda (x) (* x x)) and binds square to the resulting value, all in the global environment.

                                                                                    + +Figure 3.2 shows the result of evaluating this +define expression. The procedure object is a pair whose code +specifies that the procedure has one formal parameter, namely x, +and a procedure body (* x x). The environment part of the +procedure is a pointer to the global environment, since that is the +environment in which the lambda expression was evaluated to +produce the procedure. A new binding, which associates the procedure +object with the symbol square, has been added to the global +frame. In general, define creates definitions by adding +bindings to frames.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.2:  Environment structure produced by +evaluating +(define (square x) (* x x)) in the global environment.
                                                                                    + +

                                                                                    + +Now that we have seen how procedures are created, we can describe how +procedures are applied. The environment model specifies: To apply a +procedure to arguments, create a new environment containing a frame +that binds the parameters to the values of the arguments. The +enclosing environment of this frame is the environment specified by +the procedure. Now, within this new environment, evaluate the +procedure body.

                                                                                    + + +To show how this rule is followed, figure 3.3 +illustrates the environment structure created by evaluating the +expression (square 5) in the global environment, where square is the procedure generated in +figure 3.2. Applying the procedure results in +the creation of a new environment, labeled E1 in the figure, that +begins with a frame in which x, the formal parameter for the +procedure, is bound to the argument 5. The pointer leading upward +from this frame shows that the frame's enclosing environment is the +global environment. The global environment is chosen here, because +this is the environment that is indicated as part of the square +procedure object. Within E1, we evaluate the body of the procedure, +(* x x). Since the value of x in E1 is 5, the result is +(* 5 5), or 25. + +

                                                                                    +
                                                                                    Figure 3.3:  Environment created by evaluating (square 5) +in the global environment.
                                                                                    + +

                                                                                    + +The environment model of procedure application can be summarized by +two rules:

                                                                                    + +

                                                                                      +
                                                                                    • A procedure object is applied to a set of arguments by +constructing a frame, binding the formal parameters of the procedure +to the arguments of the call, and then evaluating the body of +the procedure in the context of the new environment constructed. The +new frame has as its enclosing environment the environment part of the +procedure object being applied.

                                                                                      + +

                                                                                    • A procedure is created by evaluating a lambda +expression relative to a given environment. The resulting procedure +object is a pair consisting of the text of the lambda expression +and a pointer to the environment in which the procedure was created. +

                                                                                    + +We also specify that defining a symbol using define creates a +binding in the current environment frame and assigns to the symbol the +indicated value.13 Finally, we specify the behavior of +set!, the operation that forced us to introduce the environment +model in the first place. Evaluating the expression (set! +<variable> <value>) in some environment locates the binding of +the variable in the environment and changes that binding to indicate +the new value. That is, one finds the first frame in the environment +that contains a binding for the variable and modifies that frame. If +the variable is unbound in the environment, then set! signals +an error.

                                                                                    + + +These evaluation rules, though considerably more complex than the +substitution model, are still reasonably straightforward. Moreover, +the evaluation model, though abstract, provides a correct description +of how the interpreter evaluates expressions. In chapter 4 we shall +see how this model can serve as a blueprint for implementing a working +interpreter. The following sections elaborate the details of the +model by analyzing some illustrative programs. + + +

                                                                                    3.2.2  Applying Simple Procedures

                                                                                    + + +When we introduced the substitution model in +section 1.1.5 we showed how the combination +(f 5) evaluates to 136, given the following procedure +definitions:

                                                                                    + +

                                                                                    (define (square x)
                                                                                    +  (* x x))
                                                                                    +(define (sum-of-squares x y)
                                                                                    +  (+ (square x) (square y)))
                                                                                    +(define (f a)
                                                                                    +  (sum-of-squares (+ a 1) (* a 2)))
                                                                                    +

                                                                                    +We can analyze the same example using the environment model. +Figure 3.4 shows the three procedure objects +created by evaluating the definitions of f, square, and +sum-of-squares in the global environment. Each procedure object +consists of some code, together with a pointer to the global +environment.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.4:  Procedure objects in the global frame.
                                                                                    + +

                                                                                    + +In figure 3.5 we see the environment structure created +by evaluating the expression (f 5). The call to f creates +a new environment E1 beginning with a frame in which a, the +formal parameter of f, is bound to the argument 5. In E1, we +evaluate the body of f:

                                                                                    + +

                                                                                    (sum-of-squares (+ a 1) (* a 2))
                                                                                    +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.5:  Environments created by evaluating (f 5) +using the procedures in figure 3.4.
                                                                                    + +

                                                                                    + + +To evaluate this combination, we first evaluate the subexpressions. +The first subexpression, sum-of-squares, has a value that is a +procedure object. (Notice how this value is found: We first look in +the first frame of E1, which contains no binding for sum-of-squares. Then we proceed to the enclosing environment, +i.e. the global environment, and find the binding shown in +figure 3.4.) The other two subexpressions are +evaluated by applying the primitive operations + and * to +evaluate the two combinations (+ a 1) and (* a 2) to +obtain 6 and 10, respectively.

                                                                                    + +Now we apply the procedure object sum-of-squares to the +arguments 6 and 10. This results in a new environment E2 in which the +formal parameters x and y are bound to the arguments. +Within E2 we evaluate the combination (+ (square x) (square y)). +This leads us to evaluate (square x), where square is +found in the global frame and x is 6. Once again, we set up a +new environment, E3, in which x is bound to 6, and within this +we evaluate the body of square, which is (* x x). Also as +part of applying sum-of-squares, we must evaluate the +subexpression (square y), where y is 10. This second call +to square creates another environment, E4, in which x, the +formal parameter of square, is bound to 10. And within E4 we +must evaluate (* x x).

                                                                                    + +The important point to observe is that each call to square +creates a new environment containing a binding for x. We can +see here how the different frames serve to keep separate the different +local variables all named x. Notice that each frame created by +square points to the global environment, since this is the +environment indicated by the square procedure object.

                                                                                    + +After the subexpressions are evaluated, the results are +returned. The values generated by the two calls to square are +added by sum-of-squares, and this result is returned by f. +Since our focus here is on the environment structures, we will not +dwell on how these returned values are passed from call to call; +however, this is also an important aspect of the evaluation process, +and we will return to it in detail in chapter 5. + +

                                                                                    +Exercise 3.9.  In section 1.2.1 +we used the substitution model to analyze two +procedures for computing factorials, a recursive version

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* n (factorial (- n 1)))))
                                                                                    +

                                                                                    +and an iterative version

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (fact-iter 1 1 n))
                                                                                    +(define (fact-iter product counter max-count)
                                                                                    +  (if (> counter max-count)
                                                                                    +      product
                                                                                    +      (fact-iter (* counter product)
                                                                                    +                 (+ counter 1)
                                                                                    +                 max-count)))
                                                                                    +

                                                                                    +Show the environment structures created by evaluating (factorial 6) +using each version of the factorial procedure.14 +

                                                                                    + + +

                                                                                    3.2.3  Frames as the Repository of Local State

                                                                                    + + + +We can turn to the environment model to see how procedures and +assignment can be used to represent objects with local state. As an +example, consider the ``withdrawal processor'' from +section 3.1.1 created by calling the +procedure

                                                                                    + +

                                                                                    (define (make-withdraw balance)
                                                                                    +  (lambda (amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds")))
                                                                                    +

                                                                                    +Let us describe the evaluation of

                                                                                    + +

                                                                                    (define W1 (make-withdraw 100))
                                                                                    +

                                                                                    +followed by

                                                                                    + +

                                                                                    (W1 50)
                                                                                    +50
                                                                                    +

                                                                                    +Figure 3.6 shows the result of defining the make-withdraw procedure in the global environment. This produces a +procedure object that contains a pointer to the global environment. +So far, this is no different from the examples we have already seen, +except that the body of the procedure is itself a lambda +expression.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.6:  Result of defining make-withdraw +in the global environment.
                                                                                    + +

                                                                                    + +The interesting part of the computation happens when we apply the +procedure make-withdraw to an argument:

                                                                                    + +

                                                                                    (define W1 (make-withdraw 100))
                                                                                    +

                                                                                    +We begin, as usual, by setting up an environment E1 in which the +formal parameter balance is bound to the argument 100. Within +this environment, we evaluate the body of make-withdraw, namely +the lambda expression. This constructs a new procedure object, +whose code is as specified by the lambda and whose environment +is E1, the environment in which the lambda was evaluated to +produce the procedure. The resulting procedure object is the value +returned by the call to make-withdraw. This is bound to W1 in the global environment, since the define itself is being +evaluated in the global environment. Figure 3.7 shows the +resulting environment structure.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.7:  Result of evaluating (define W1 (make-withdraw 100)).
                                                                                    + +

                                                                                    + +Now we can analyze what happens when W1 is applied to an +argument:

                                                                                    + +

                                                                                    (W1 50)
                                                                                    +50
                                                                                    +

                                                                                    +We begin by constructing a frame in which amount, the formal +parameter of W1, is bound to the argument 50. The crucial point +to observe is that this frame has as its enclosing environment not the +global environment, but rather the environment E1, because this is the +environment that is specified by the W1 procedure object. +Within this new environment, we evaluate the body of the procedure:

                                                                                    + +

                                                                                    (if (>= balance amount)
                                                                                    +    (begin (set! balance (- balance amount))
                                                                                    +           balance)
                                                                                    +    "Insufficient funds")
                                                                                    +

                                                                                    +The resulting environment structure is shown in +figure 3.8. The expression being evaluated references +both amount and balance. Amount will be found in +the first frame in the environment, while balance will be found +by following the enclosing-environment pointer to E1.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.8:  Environments created by applying the procedure +object W1.
                                                                                    + +

                                                                                    + +When the set! is executed, the binding of balance in E1 is changed. At the completion of the call to W1, +balance is 50, and the frame that contains balance +is still pointed to by the procedure object W1. The frame +that binds amount +(in which we executed the code that changed balance) is no longer +relevant, since the procedure call that constructed it has terminated, +and there are no pointers to that frame from other parts of the +environment. The next time W1 is called, this will build a new +frame that binds amount and whose enclosing environment is E1. +We see that E1 serves as the ``place'' that holds the local state +variable for the procedure object W1. Figure 3.9 +shows the situation after the call to W1.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.9:  Environments after the call to W1.
                                                                                    + +

                                                                                    + +Observe what happens when we create a second ``withdraw'' object by +making another call to make-withdraw:

                                                                                    + +

                                                                                    (define W2 (make-withdraw 100))
                                                                                    +

                                                                                    +This produces the environment structure of figure 3.10, which shows +that W2 is a procedure object, that is, a pair with some code +and an environment. The environment E2 for W2 was created by +the call to make-withdraw. It contains a frame with its own +local binding for balance. On the other hand, W1 and W2 have the same code: the code specified by the lambda +expression in the body of make-withdraw.15 We see here why W1 and W2 +behave as independent objects. Calls to W1 reference the state +variable balance stored in E1, whereas calls to W2 +reference the balance stored in E2. Thus, changes to the local +state of one object do not affect the other object.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.10:  Using (define W2 (make-withdraw 100)) +to create a second object.
                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 3.10.  In the make-withdraw procedure, the local variable balance +is created as a parameter of make-withdraw. We could also +create the local state variable explicitly, using let, as +follows: +

                                                                                    + +

                                                                                    (define (make-withdraw initial-amount)
                                                                                    +  (let ((balance initial-amount))
                                                                                    +    (lambda (amount)
                                                                                    +      (if (>= balance amount)
                                                                                    +          (begin (set! balance (- balance amount))
                                                                                    +                 balance)
                                                                                    +          "Insufficient funds"))))
                                                                                    +

                                                                                    +Recall from section 1.3.2 that let is simply +syntactic sugar for a procedure call:

                                                                                    + + +

                                                                                    (let ((<var> <exp>)) <body>)
                                                                                    +

                                                                                    +is interpreted as an alternate syntax for

                                                                                    + + +

                                                                                    ((lambda (<var>) <body>) <exp>)
                                                                                    +

                                                                                    +Use the environment model to analyze this alternate +version of make-withdraw, drawing figures like the ones above to +illustrate the interactions

                                                                                    + +

                                                                                    (define W1 (make-withdraw 100))
                                                                                    +
                                                                                    +(W1 50)
                                                                                    +
                                                                                    +(define W2 (make-withdraw 100))
                                                                                    +

                                                                                    +Show that the two versions of make-withdraw create objects with +the same behavior. How do the environment structures differ for the two +versions? + +

                                                                                    +

                                                                                    + + +

                                                                                    3.2.4  Internal Definitions

                                                                                    + + +Section 1.1.8 introduced the idea that procedures can have internal +definitions, thus leading to a block structure as in the +following procedure to compute square roots:

                                                                                    + + +

                                                                                    (define (sqrt x)
                                                                                    +  (define (good-enough? guess)
                                                                                    +    (< (abs (- (square guess) x)) 0.001))
                                                                                    +  (define (improve guess)
                                                                                    +    (average guess (/ x guess)))
                                                                                    +  (define (sqrt-iter guess)
                                                                                    +    (if (good-enough? guess)
                                                                                    +        guess
                                                                                    +        (sqrt-iter (improve guess))))
                                                                                    +  (sqrt-iter 1.0))
                                                                                    +

                                                                                    +Now we can use the environment model to see why these internal +definitions behave as desired. Figure 3.11 shows the point in the +evaluation of the expression (sqrt 2) where the internal +procedure good-enough? has been called for the first time with +guess equal to 1.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.11:  Sqrt procedure with internal definitions.
                                                                                    + +

                                                                                    + +Observe the structure of the environment. Sqrt is a symbol in +the global environment that is bound to a procedure object whose +associated environment is the global environment. When sqrt was +called, a new environment E1 was formed, subordinate to the global +environment, in which the parameter x is bound to 2. The body +of sqrt was then evaluated in E1. Since the first expression in +the body of sqrt is

                                                                                    + +

                                                                                    (define (good-enough? guess)
                                                                                    +  (< (abs (- (square guess) x)) 0.001))
                                                                                    +

                                                                                    +evaluating this expression defined the procedure good-enough? +in the environment E1. To be more precise, the symbol good-enough? was added to the first frame of E1, bound to a +procedure object whose associated environment is E1. Similarly, improve and sqrt-iter were defined as procedures in E1. For +conciseness, figure 3.11 shows only the procedure +object for good-enough?.

                                                                                    + +After the local procedures were defined, the +expression (sqrt-iter 1.0) was evaluated, +still in environment E1. So the +procedure object bound to sqrt-iter in E1 was called with 1 as +an argument. This created an environment E2 in which guess, +the parameter of sqrt-iter, is bound to 1. Sqrt-iter in +turn called good-enough? with the value of guess (from +E2) as the argument for good-enough?. This set up another +environment, E3, in which guess (the parameter of good-enough?) is bound to 1. Although sqrt-iter and good-enough? both have a parameter named guess, these are two +distinct local variables located in different frames. Also, E2 and E3 +both have E1 as their enclosing environment, because the sqrt-iter and good-enough? procedures both have E1 as their +environment part. One consequence of this is that the symbol x +that appears in the body of good-enough? will reference the +binding of x that appears in E1, namely the value of x +with which the original sqrt procedure was called. + +The environment model thus explains the two key properties that make +local procedure definitions a useful technique for modularizing +programs: +

                                                                                      +
                                                                                    • The names of the local procedures do not interfere with +names external to the enclosing procedure, because the local procedure +names will be bound in the frame that the procedure creates when it is +run, rather than being bound in the global environment.

                                                                                      + +

                                                                                    • The local procedures can access the arguments of the enclosing +procedure, simply by using parameter names as free variables. +This is because the body of the local procedure is evaluated in an +environment that is subordinate to the evaluation environment for the +enclosing procedure. +

                                                                                    + +

                                                                                    +Exercise 3.11.  In section 3.2.3 +we saw how the environment model described the +behavior of procedures with local state. Now we have seen how +internal definitions work. A typical message-passing procedure +contains both of these aspects. Consider the bank account procedure +of section 3.1.1:

                                                                                    + +

                                                                                    (define (make-account balance)
                                                                                    +  (define (withdraw amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds"))
                                                                                    +  (define (deposit amount)
                                                                                    +    (set! balance (+ balance amount))
                                                                                    +    balance)
                                                                                    +  (define (dispatch m)
                                                                                    +    (cond ((eq? m 'withdraw) withdraw)
                                                                                    +          ((eq? m 'deposit) deposit)
                                                                                    +          (else (error "Unknown request -- MAKE-ACCOUNT"
                                                                                    +                       m))))
                                                                                    +  dispatch)
                                                                                    +

                                                                                    +Show the environment structure generated by the sequence of +interactions

                                                                                    + +

                                                                                    (define acc (make-account 50))
                                                                                    +
                                                                                    +((acc 'deposit) 40)
                                                                                    +90
                                                                                    +
                                                                                    +((acc 'withdraw) 60)
                                                                                    +30
                                                                                    +

                                                                                    +Where is the local state for acc kept? Suppose we define +another account

                                                                                    + +

                                                                                    (define acc2 (make-account 100))
                                                                                    +

                                                                                    +How are the local states for the two accounts kept distinct? Which +parts of the environment structure are shared between acc and +acc2? + +

                                                                                    + +


                                                                                    +

                                                                                    12 Assignment introduces a subtlety into step 1 of +the evaluation rule. As shown in +exercise 3.8, the presence of assignment +allows us to write expressions that will produce different values +depending on the order in which the subexpressions in a combination +are evaluated. Thus, to be precise, we should specify an evaluation +order in step 1 (e.g., left to right or right to left). However, this +order should always be considered to be an implementation detail, and +one should never write programs that depend on some particular order. +For instance, a sophisticated compiler might optimize a program by +varying the order in which subexpressions are evaluated. + +

                                                                                    13 If there is already a binding for the +variable in the current frame, then the binding is changed. This is +convenient because it allows redefinition of symbols; however, it also +means that define can be used to change values, and this brings +up the issues of assignment without explicitly using set!. +Because of this, some people prefer redefinitions of existing symbols +to signal errors or warnings. + +

                                                                                    14 The +environment model will not clarify our claim in +section 1.2.1 that the interpreter can +execute a procedure such as fact-iter in a constant amount of +space using tail recursion. We will discuss tail recursion when we +deal with the control structure of the interpreter in +section 5.4. + +

                                                                                    15 Whether +W1 and W2 share the same physical code stored in the +computer, or whether they each keep a copy of the code, is a detail of +the implementation. For the interpreter we implement in chapter 4, +the code is in fact shared. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-22.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-22.html new file mode 100644 index 00000000..dc28230c --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-22.html @@ -0,0 +1,2201 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    3.3  Modeling with Mutable Data

                                                                                    + + + +Chapter 2 dealt with compound data as a means for constructing +computational objects that have several parts, in order to model +real-world objects that have several aspects. In that chapter we +introduced the discipline of data abstraction, according to which data +structures are specified in terms of constructors, which create data +objects, and selectors, which access the parts of compound data +objects. But we now know that there is another aspect of data that +chapter 2 did not address. The desire to model systems composed of +objects that have changing state leads us to the need to modify +compound data objects, as well as to construct and select from them. +In order to model compound objects with changing state, we will design +data abstractions to include, in addition to selectors and +constructors, operations called mutators, which modify data +objects. For instance, modeling a banking system requires us to +change account balances. Thus, a data structure for representing bank +accounts might admit an operation

                                                                                    + +

                                                                                    (set-balance! <account> <new-value>)
                                                                                    +

                                                                                    +that changes the balance of the designated account to the designated +new value. Data objects for which mutators are defined are known as +mutable data objects.

                                                                                    + +Chapter 2 introduced pairs as a general-purpose ``glue'' for +synthesizing compound data. We begin this section by defining basic +mutators for pairs, so that pairs can serve as building blocks for +constructing mutable data objects. These mutators greatly enhance the +representational power of pairs, enabling us to build data structures +other than the sequences and trees that we worked with in +section 2.2. We also present some examples of +simulations in which complex systems are modeled as collections of +objects with local state.

                                                                                    + + +

                                                                                    3.3.1  Mutable List Structure

                                                                                    + + + + +The basic operations on pairs -- cons, car, and cdr -- can be used to construct list structure and to select parts +from list structure, but they are incapable of modifying list +structure. The same is true of the list operations we have used so +far, such as append and list, since these can be defined +in terms of cons, car, and cdr. To modify list +structures we need new operations.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.12:  Lists x: ((a b) c d) and y: (e +f).
                                                                                    + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.13:  Effect of (set-car! x y) on the lists in +figure 3.12.
                                                                                    + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.14:  Effect of (define z (cons y (cdr x))) on +the lists in figure 3.12.
                                                                                    + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.15:  Effect of (set-cdr! x y) on the lists in +figure 3.12.
                                                                                    + +

                                                                                    + +The primitive mutators for pairs are set-car! and set-cdr!. Set-car! takes two arguments, the first of which +must be a pair. It modifies this pair, replacing the car +pointer by a pointer to the second argument of set-car!.16

                                                                                    + +As an example, suppose that x is bound to the list ((a b) c +d) and y to the list (e f) as illustrated in +figure 3.12. Evaluating the expression (set-car! +x y) modifies the pair to which x is bound, replacing its car by the value of y. The result of the operation is shown in +figure 3.13. The structure x has been modified and +would now be printed +as ((e f) c d). The +pairs representing the list (a b), identified by the pointer +that was replaced, are now detached from the original +structure.17

                                                                                    + +Compare figure 3.13 with figure 3.14, +which illustrates the result of executing (define z (cons y (cdr +x))) with x and y bound to the original lists of +figure 3.12. The variable z is now bound to a +new pair created by the cons operation; the list to which x is bound is unchanged.

                                                                                    + +The set-cdr! operation is similar to set-car!. The +only difference is that the cdr pointer of the pair, rather than +the car pointer, is replaced. The effect of executing (set-cdr! x y) on the lists of figure 3.12 is shown +in figure 3.15. +Here the cdr pointer of x has been replaced by the pointer +to (e f). Also, the list (c d), which used to be the cdr of x, is now detached from the structure.

                                                                                    + +Cons builds new list structure by creating new pairs, while +set-car! and set-cdr! modify existing pairs. Indeed, we +could implement cons in terms of the two mutators, together with +a procedure get-new-pair, which returns a new pair that is not +part of any existing list structure. We obtain the new pair, set its +car and cdr pointers to the designated objects, and return +the new pair as the result of the cons.18

                                                                                    + +

                                                                                    (define (cons x y)
                                                                                    +  (let ((new (get-new-pair)))
                                                                                    +    (set-car! new x)
                                                                                    +    (set-cdr! new y)
                                                                                    +    new))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.12.  The following procedure for appending lists was introduced in +section 2.2.1:

                                                                                    + +

                                                                                    (define (append x y)
                                                                                    +  (if (null? x)
                                                                                    +      y
                                                                                    +      (cons (car x) (append (cdr x) y))))
                                                                                    +

                                                                                    +Append forms a new list by successively consing the +elements of x onto y. The procedure append! is +similar to append, but it is a mutator rather than a constructor. +It appends the lists by splicing them together, modifying the final +pair of x so that its cdr is now y. +(It is an error to call append! with an empty x.)

                                                                                    + +

                                                                                    (define (append! x y)
                                                                                    +  (set-cdr! (last-pair x) y)
                                                                                    +  x)
                                                                                    +

                                                                                    +Here last-pair is a procedure that returns the last pair in its +argument:

                                                                                    + +

                                                                                    (define (last-pair x)
                                                                                    +  (if (null? (cdr x))
                                                                                    +      x
                                                                                    +      (last-pair (cdr x))))
                                                                                    +

                                                                                    +Consider the interaction

                                                                                    + +

                                                                                    (define x (list 'a 'b))
                                                                                    +(define y (list 'c 'd))
                                                                                    +(define z (append x y))
                                                                                    +z
                                                                                    +(a b c d)
                                                                                    +(cdr x)
                                                                                    +<response>
                                                                                    +(define w (append! x y))
                                                                                    +w
                                                                                    +(a b c d)
                                                                                    +(cdr x)
                                                                                    +<response>
                                                                                    +

                                                                                    +What are the missing <response>s? +Draw box-and-pointer diagrams to explain your answer. + +

                                                                                    + +

                                                                                    +Exercise 3.13.  Consider the following make-cycle procedure, which uses the last-pair procedure defined in exercise 3.12:

                                                                                    + +

                                                                                    (define (make-cycle x)
                                                                                    +  (set-cdr! (last-pair x) x)
                                                                                    +  x)
                                                                                    +

                                                                                    +Draw a box-and-pointer diagram that shows the structure z +created by

                                                                                    + +

                                                                                    (define z (make-cycle (list 'a 'b 'c)))
                                                                                    +

                                                                                    +What happens if we try to compute (last-pair z)? + +

                                                                                    + +

                                                                                    +Exercise 3.14.  The following procedure is quite useful, although obscure:

                                                                                    + +

                                                                                    (define (mystery x)
                                                                                    +  (define (loop x y)
                                                                                    +    (if (null? x)
                                                                                    +        y
                                                                                    +        (let ((temp (cdr x)))
                                                                                    +          (set-cdr! x y)
                                                                                    +          (loop temp x))))
                                                                                    +  (loop x '()))
                                                                                    +

                                                                                    +Loop uses the ``temporary'' variable temp to hold +the old value of the cdr of x, since the set-cdr! +on the next line destroys the cdr. Explain what mystery +does in general. Suppose v is defined by (define v (list 'a +'b 'c 'd)). Draw the box-and-pointer diagram that represents the list +to which v is bound. Suppose that we now evaluate (define +w (mystery v)). Draw box-and-pointer diagrams that show the +structures v and w after evaluating this expression. What +would be printed as the values of v and w ? +

                                                                                    + + + +

                                                                                    Sharing and identity

                                                                                    + + +We mentioned in section 3.1.3 the theoretical +issues of ``sameness'' and ``change'' raised by the introduction of +assignment. These issues arise in practice when individual pairs are +shared among different data objects. For example, consider the +structure formed by

                                                                                    + + +

                                                                                    (define x (list 'a 'b))
                                                                                    +(define z1 (cons x x))
                                                                                    +

                                                                                    +As shown in figure 3.16, z1 is a pair whose car and cdr both point to the same pair x. This sharing +of x by the car and cdr of z1 is a consequence +of the straightforward way in which cons is implemented. In +general, using cons to construct lists will result in an +interlinked structure of pairs in which many individual pairs are +shared by many different structures.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.16:  The list z1 formed by (cons x x).
                                                                                    + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.17:  The list z2 formed by +(cons (list 'a 'b) (list 'a 'b)).
                                                                                    + +

                                                                                    + + +In contrast to figure 3.16, figure 3.17 shows +the structure created by

                                                                                    + + +

                                                                                    (define z2 (cons (list 'a 'b) (list 'a 'b)))
                                                                                    +

                                                                                    +In this structure, the pairs in the two (a b) lists are +distinct, although the actual symbols are shared.19

                                                                                    + +When thought of as a list, z1 and z2 both represent ``the +same'' list, ((a b) a b). In general, sharing is completely +undetectable if we operate on lists using only cons, car, +and cdr. However, if we allow mutators on list structure, +sharing becomes significant. As an example of the difference that +sharing can make, consider the following procedure, which modifies the +car of the structure to which it is applied:

                                                                                    + +

                                                                                    (define (set-to-wow! x)
                                                                                    +  (set-car! (car x) 'wow)
                                                                                    +  x)
                                                                                    +

                                                                                    +Even though z1 and z2 are ``the same'' structure, +applying set-to-wow! to them yields different results. With +z1, altering the car also changes the cdr, because +in z1 the car and the cdr are the same pair. With +z2, the car and cdr are distinct, so set-to-wow! modifies only the car:

                                                                                    + +

                                                                                    z1
                                                                                    +((a b) a b)
                                                                                    +
                                                                                    +(set-to-wow! z1)
                                                                                    +((wow b) wow b)
                                                                                    +
                                                                                    +z2
                                                                                    +((a b) a b)
                                                                                    +
                                                                                    +(set-to-wow! z2)
                                                                                    +((wow b) a b)
                                                                                    +

                                                                                    + +One way to detect sharing in list structures is to use the predicate +eq?, which we introduced in section 2.3.1 as a +way to test whether two symbols are equal. More generally, (eq? +x y) tests whether x and y are the same object (that is, +whether x and y are equal as pointers). Thus, with z1 and z2 as defined in figures 3.16 +and 3.17, (eq? (car z1) (cdr z1)) is true and +(eq? (car z2) (cdr z2)) is false.

                                                                                    + +As will be seen in the following sections, we can exploit sharing to +greatly extend the repertoire of data structures that can be +represented by pairs. On the other hand, sharing can also be +dangerous, since modifications made to structures will also affect +other structures that happen to share the modified parts. The +mutation operations set-car! and set-cdr! should be used +with care; unless we have a good understanding of how our data objects +are shared, mutation can have unanticipated results.20

                                                                                    + +

                                                                                    +Exercise 3.15.  Draw box-and-pointer diagrams to explain the effect of set-to-wow! on the structures z1 and z2 above. +

                                                                                    + +

                                                                                    +Exercise 3.16.  Ben Bitdiddle decides to write a procedure to count the number of +pairs in any list structure. ``It's easy,'' he reasons. ``The number +of pairs in any structure is the number in the car plus the +number in the cdr plus one more to count the current pair.'' +So Ben writes the following procedure:

                                                                                    + +

                                                                                    (define (count-pairs x)
                                                                                    +  (if (not (pair? x))
                                                                                    +      0
                                                                                    +      (+ (count-pairs (car x))
                                                                                    +         (count-pairs (cdr x))
                                                                                    +         1)))
                                                                                    +

                                                                                    +Show that this procedure is not correct. In particular, draw +box-and-pointer diagrams representing list structures made up of +exactly three pairs for which Ben's procedure would return 3; return +4; return 7; never return at all. + +

                                                                                    + +

                                                                                    +Exercise 3.17.  Devise a correct version of the count-pairs procedure of +exercise 3.16 that returns the number of distinct +pairs in any structure. (Hint: Traverse the structure, maintaining an +auxiliary data structure that is used to keep track of which pairs +have already been counted.) +

                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 3.18.  Write a procedure that examines a list and determines whether it +contains a cycle, that is, whether a program that tried to find the +end of the list by taking successive cdrs would go into an +infinite loop. Exercise 3.13 constructed such lists. + +

                                                                                    + +

                                                                                    +Exercise 3.19.  Redo exercise 3.18 using an algorithm that takes only a +constant amount of space. (This requires a very clever idea.) +

                                                                                    + + +

                                                                                    Mutation is just assignment

                                                                                    + + +When we introduced compound data, we observed in +section 2.1.3 that pairs can be represented purely in terms +of procedures:

                                                                                    + +

                                                                                    (define (cons x y)
                                                                                    +  (define (dispatch m)
                                                                                    +    (cond ((eq? m 'car) x)
                                                                                    +          ((eq? m 'cdr) y)
                                                                                    +          (else (error "Undefined operation -- CONS" m))))
                                                                                    +  dispatch)
                                                                                    +(define (car z) (z 'car))
                                                                                    +(define (cdr z) (z 'cdr))
                                                                                    +

                                                                                    +The same observation is true for mutable data. We can implement +mutable data objects as procedures using assignment and local state. +For instance, we can extend the above pair implementation to handle +set-car! and set-cdr! in a manner analogous to the way +we implemented bank accounts using make-account in +section 3.1.1:

                                                                                    + +

                                                                                    (define (cons x y)
                                                                                    +  (define (set-x! v) (set! x v))
                                                                                    +  (define (set-y! v) (set! y v))
                                                                                    +  (define (dispatch m)
                                                                                    +    (cond ((eq? m 'car) x)
                                                                                    +          ((eq? m 'cdr) y)
                                                                                    +          ((eq? m 'set-car!) set-x!)
                                                                                    +          ((eq? m 'set-cdr!) set-y!)
                                                                                    +          (else (error "Undefined operation -- CONS" m))))
                                                                                    +  dispatch)
                                                                                    +(define (car z) (z 'car))
                                                                                    +(define (cdr z) (z 'cdr))
                                                                                    +(define (set-car! z new-value)
                                                                                    +  ((z 'set-car!) new-value)
                                                                                    +  z)
                                                                                    +(define (set-cdr! z new-value)
                                                                                    +  ((z 'set-cdr!) new-value)
                                                                                    +  z)
                                                                                    +

                                                                                    + +Assignment is all that is needed, theoretically, to account for the +behavior of mutable data. As soon as we admit set! to our +language, we raise all the issues, not only of assignment, but of +mutable data in general.21

                                                                                    + +

                                                                                    +Exercise 3.20.  Draw environment diagrams to illustrate the evaluation of the sequence +of expressions

                                                                                    + +

                                                                                    (define x (cons 1 2))
                                                                                    +(define z (cons x x))
                                                                                    +(set-car! (cdr z) 17)
                                                                                    +(car x)
                                                                                    +17
                                                                                    +

                                                                                    +using the procedural implementation of pairs given above. (Compare +exercise 3.11.) +

                                                                                    + + +

                                                                                    3.3.2  Representing Queues

                                                                                    + + + +The mutators set-car! and set-cdr! enable us to use +pairs to construct data structures that cannot be built with cons, car, and cdr alone. This section shows how to use +pairs to represent a data structure called a queue. Section 3.3.3 +will show how to represent data structures called tables.

                                                                                    + +A queue is a sequence in which items are inserted at one end +(called the rear of the queue) and deleted from the other end +(the front). Figure 3.18 shows an initially empty +queue in which the items a and b are inserted. Then a is removed, c and d are inserted, and b is +removed. Because items are always removed in the order in which they +are inserted, a queue is sometimes called a FIFO (first in, +first out) buffer.

                                                                                    + +

                                                                                    + + + + + + +
                                                                                    Operation Resulting Queue
                                                                                    (define q (make-queue))
                                                                                    (insert-queue! q 'a) a
                                                                                    (insert-queue! q 'b) a b
                                                                                    (delete-queue! q) b
                                                                                    (insert-queue! q 'c) b c
                                                                                    (insert-queue! q 'd) b c d
                                                                                    (delete-queue! q) c d +
                                                                                    +
                                                                                    Figure 3.18:  Queue operations.
                                                                                    + +

                                                                                    + +In terms of data abstraction, we can regard a queue as defined by the +following set of operations: +

                                                                                      +
                                                                                    • a constructor:
                                                                                      +(make-queue)
                                                                                      +returns an empty queue (a queue containing no items).

                                                                                      + +

                                                                                    • two selectors:
                                                                                      +(empty-queue? <queue>)
                                                                                      +tests if the queue is empty.
                                                                                      + +(front-queue <queue>)
                                                                                      +returns the object at the front of +the queue, signaling an error if the queue is empty; it does not +modify the queue.

                                                                                      + +

                                                                                    • two mutators:
                                                                                      +(insert-queue! <queue> <item>)
                                                                                      +inserts the item at the rear of the queue and returns the modified +queue as its value.
                                                                                      + +(delete-queue! <queue>)
                                                                                      +removes the item at the +front of the queue and returns the modified queue as its value, +signaling an error if the queue is empty before the deletion. +

                                                                                    + +Because a queue is a sequence of items, we could certainly represent +it as an ordinary list; the front of the queue would be the car +of the list, inserting an item in the queue would amount to appending +a new element at the end of the list, and deleting an item from the +queue would just be taking the cdr of the list. However, this +representation is inefficient, because in order to insert an item we +must scan the list until we reach the end. Since the only method we +have for scanning a list is by successive cdr operations, this +scanning requires (n) steps for a list of n items. A simple +modification to the list representation overcomes this disadvantage by +allowing the queue operations to be implemented so that they require +(1) steps; that is, so that the number of steps +needed is independent of the length of the queue.

                                                                                    + +The difficulty with the list representation arises from the need to +scan to find the end of the list. The reason we need to scan is that, +although the standard way of representing a list as a chain of pairs +readily provides us with a pointer to the beginning of the list, it +gives us no easily accessible pointer to the end. The modification +that avoids the drawback is to represent the queue as a list, together +with an additional pointer that indicates the final pair in the list. +That way, when we go to insert an item, we can consult the rear +pointer and so avoid scanning the list.

                                                                                    + +A queue is represented, then, as a pair of pointers, front-ptr +and rear-ptr, which indicate, respectively, the first and last +pairs in an ordinary list. Since we would like the queue to be an +identifiable object, we can use cons to combine the two +pointers. Thus, the queue itself will be the cons of the two +pointers. Figure 3.19 illustrates this +representation.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.19:  Implementation of a queue as a list with front and rear +pointers.
                                                                                    + +

                                                                                    + +To define the queue operations we use the following procedures, which +enable us to select and to modify the front and rear pointers of a +queue:

                                                                                    + +

                                                                                    (define (front-ptr queue) (car queue))
                                                                                    +(define (rear-ptr queue) (cdr queue))
                                                                                    +(define (set-front-ptr! queue item) (set-car! queue item))
                                                                                    +(define (set-rear-ptr! queue item) (set-cdr! queue item))
                                                                                    +

                                                                                    + +Now we can implement the actual queue operations. We will consider a +queue to be empty if its front pointer is the empty list:

                                                                                    + + +

                                                                                    (define (empty-queue? queue) (null? (front-ptr queue)))
                                                                                    +

                                                                                    +The make-queue constructor returns, as an initially empty queue, +a pair whose car and cdr are both the empty list:

                                                                                    + + +

                                                                                    (define (make-queue) (cons '() '()))
                                                                                    +

                                                                                    +To select the item at the front of the queue, we return the car +of the pair indicated by the front pointer:

                                                                                    + + +

                                                                                    (define (front-queue queue)
                                                                                    +  (if (empty-queue? queue)
                                                                                    +      (error "FRONT called with an empty queue" queue)
                                                                                    +      (car (front-ptr queue))))
                                                                                    +

                                                                                    + + +To insert an item in a queue, we follow the method whose result is +indicated in figure 3.20. We first create a new +pair whose car is the item to be inserted and whose cdr is +the empty list. If the queue was initially empty, we set the front and +rear pointers of the queue to this new pair. Otherwise, we modify the +final pair in the queue to point to the new pair, and also set the +rear pointer to the new pair.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.20:  Result of using (insert-queue! q 'd) +on the queue of figure 3.19.
                                                                                    + +

                                                                                    + + +

                                                                                    (define (insert-queue! queue item)
                                                                                    +  (let ((new-pair (cons item '())))
                                                                                    +    (cond ((empty-queue? queue)
                                                                                    +           (set-front-ptr! queue new-pair)
                                                                                    +           (set-rear-ptr! queue new-pair)
                                                                                    +           queue)
                                                                                    +          (else
                                                                                    +           (set-cdr! (rear-ptr queue) new-pair)
                                                                                    +           (set-rear-ptr! queue new-pair)
                                                                                    +           queue)))) 
                                                                                    +

                                                                                    + +To delete the item at the front of the queue, we merely modify the +front pointer so that it now points at the second item in the queue, +which can be found by following the cdr pointer of the first +item (see figure 3.21):22

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.21:  Result of using (delete-queue! q) on +the queue of figure 3.20.
                                                                                    + +

                                                                                    + +

                                                                                    (define (delete-queue! queue)
                                                                                    +  (cond ((empty-queue? queue)
                                                                                    +         (error "DELETE! called with an empty queue" queue))
                                                                                    +        (else
                                                                                    +         (set-front-ptr! queue (cdr (front-ptr queue)))
                                                                                    +         queue))) 
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.21.  Ben Bitdiddle decides to test the queue implementation described +above. He types in the procedures to the Lisp interpreter and +proceeds to try them out:

                                                                                    + +

                                                                                    (define q1 (make-queue))
                                                                                    +(insert-queue! q1 'a)
                                                                                    +((a) a)
                                                                                    +(insert-queue! q1 'b)
                                                                                    +((a b) b)
                                                                                    +(delete-queue! q1)
                                                                                    +((b) b)
                                                                                    +(delete-queue! q1)
                                                                                    +(() b)
                                                                                    +

                                                                                    +``It's all wrong!'' he complains. ``The interpreter's response shows +that the last item is inserted into the queue twice. And when I +delete both items, the second b is still there, so the queue +isn't empty, even though it's supposed to be.'' Eva Lu Ator suggests +that Ben has misunderstood what is happening. ``It's not that the +items are going into the queue twice,'' she explains. ``It's just +that the standard Lisp printer doesn't know how to make sense of the +queue representation. If you want to see the queue printed correctly, +you'll have to define your own print procedure for queues.'' Explain +what Eva Lu is talking about. In particular, show why Ben's examples +produce the printed results that they do. Define a procedure print-queue that takes a queue as input and prints the sequence of +items in the queue. +

                                                                                    + +

                                                                                    +Exercise 3.22.  Instead of representing a queue as a pair of pointers, we can build a +queue as a procedure with local state. The local state will consist +of pointers to the beginning and the end of an ordinary list. Thus, +the make-queue procedure will have the form

                                                                                    + +

                                                                                    (define (make-queue)
                                                                                    +  (let ((front-ptr ...)
                                                                                    +        (rear-ptr ...))
                                                                                    +    <definitions of internal procedures>
                                                                                    +    (define (dispatch m) ...)
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +Complete the definition of make-queue and provide +implementations of the queue operations using this representation. +

                                                                                    + +

                                                                                    +Exercise 3.23.  A deque (``double-ended queue'') is a sequence in which items +can be inserted and deleted at either the front or the rear. +Operations on deques are the constructor make-deque, the predicate empty-deque?, selectors front-deque and rear-deque, and mutators front-insert-deque!, rear-insert-deque!, front-delete-deque!, and rear-delete-deque!. Show how to represent deques using pairs, and +give implementations of the operations.23 +All operations should be accomplished in (1) steps. +

                                                                                    + + +

                                                                                    3.3.3  Representing Tables

                                                                                    + + + +When we studied various ways of representing sets in chapter 2, we +mentioned in section 2.3.3 the task of +maintaining a table of records indexed by identifying keys. In the +implementation of data-directed programming in +section 2.4.3, we made extensive use of +two-dimensional tables, in which information is stored and retrieved +using two keys. Here we see how to build tables as mutable list +structures.

                                                                                    + +We first consider a one-dimensional table, in which each value is +stored under a single key. We implement the table as a list of +records, each of which is implemented as a pair consisting of a key +and the associated value. The records are glued together to form a +list by pairs whose cars point to successive records. These +gluing pairs are called the backbone of the table. In order to +have a place that we can change when we add a new record to the table, +we build the table as a headed list. A headed list has a +special backbone pair at the beginning, which holds a dummy +``record'' -- in this case the arbitrarily chosen symbol *table*. +Figure 3.22 shows the box-and-pointer diagram for the table

                                                                                    + +

                                                                                    a:  1
                                                                                    +b:  2
                                                                                    +c:  3
                                                                                    +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.22:  A table represented as a headed list.
                                                                                    + +

                                                                                    + +To extract information from a table we use the lookup +procedure, which takes a key as argument and returns the associated +value (or false if there is no value stored under that key). +Lookup is defined in terms of the assoc operation, which +expects a key and a list of records as arguments. Note that assoc never sees the dummy record. Assoc returns the record +that has the given key as its car.24 +Lookup then +checks to see that the resulting record returned by assoc is not +false, and returns the value (the cdr) of the record.

                                                                                    + +

                                                                                    (define (lookup key table)
                                                                                    +  (let ((record (assoc key (cdr table))))
                                                                                    +    (if record
                                                                                    +        (cdr record)
                                                                                    +        false)))
                                                                                    +(define (assoc key records)
                                                                                    +  (cond ((null? records) false)
                                                                                    +        ((equal? key (caar records)) (car records))
                                                                                    +        (else (assoc key (cdr records)))))
                                                                                    +

                                                                                    + +To insert a value in a table under a specified key, we first use assoc to see if there is already a record in the table with this key. +If not, we form a new record by consing the key with the value, +and insert this at the head of the table's list of records, after the +dummy record. If there already is a record with this key, we set the +cdr of this record to the designated new value. The header of +the table provides us with a fixed location to modify in order to +insert the new record.25

                                                                                    + +

                                                                                    (define (insert! key value table)
                                                                                    +  (let ((record (assoc key (cdr table))))
                                                                                    +    (if record
                                                                                    +        (set-cdr! record value)
                                                                                    +        (set-cdr! table
                                                                                    +                  (cons (cons key value) (cdr table)))))
                                                                                    +  'ok)
                                                                                    +

                                                                                    + +To construct a new table, we simply create a list containing the +symbol *table*:

                                                                                    + +

                                                                                    (define (make-table)
                                                                                    +  (list '*table*))
                                                                                    +

                                                                                    + + +

                                                                                    Two-dimensional tables

                                                                                    + + +In a two-dimensional table, each value is indexed by two keys. We can +construct such a table as a one-dimensional table in which each key +identifies a subtable. +Figure 3.23 shows the box-and-pointer diagram for the table +

                                                                                    math:
                                                                                    +    +:  43
                                                                                    +    -:  45
                                                                                    +    *:  42
                                                                                    +letters:
                                                                                    +    a:  97
                                                                                    +    b:  98
                                                                                    +

                                                                                    +which has two subtables. (The subtables don't need a +special header symbol, since the key that identifies the subtable +serves this purpose.)

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.23:  A two-dimensional table.
                                                                                    + +

                                                                                    + +When we look up an item, we use the first key +to identify the correct subtable. Then we use the second key to +identify the record within the subtable.

                                                                                    + +

                                                                                    (define (lookup key-1 key-2 table)
                                                                                    +  (let ((subtable (assoc key-1 (cdr table))))
                                                                                    +    (if subtable
                                                                                    +        (let ((record (assoc key-2 (cdr subtable))))
                                                                                    +          (if record
                                                                                    +              (cdr record)
                                                                                    +              false))
                                                                                    +        false)))
                                                                                    +

                                                                                    + +To insert a new item under a pair of keys, we use assoc to see if +there is a subtable stored under the first key. If not, we build a +new subtable containing the single record (key-2, value) +and insert it into the table under the first key. If a subtable +already exists for the first key, we insert the new record into this +subtable, using the insertion method for one-dimensional tables +described above:

                                                                                    + +

                                                                                    (define (insert! key-1 key-2 value table)
                                                                                    +  (let ((subtable (assoc key-1 (cdr table))))
                                                                                    +    (if subtable
                                                                                    +        (let ((record (assoc key-2 (cdr subtable))))
                                                                                    +          (if record
                                                                                    +              (set-cdr! record value)
                                                                                    +              (set-cdr! subtable
                                                                                    +                        (cons (cons key-2 value)
                                                                                    +                              (cdr subtable)))))
                                                                                    +        (set-cdr! table
                                                                                    +                  (cons (list key-1
                                                                                    +                              (cons key-2 value))
                                                                                    +                        (cdr table)))))
                                                                                    +  'ok)
                                                                                    +

                                                                                    + + +

                                                                                    Creating local tables

                                                                                    + + +The lookup and insert! operations defined above take the +table as an argument. This enables us to use programs that access +more than one table. Another way to deal with multiple tables is to +have separate lookup and insert! procedures for each +table. We can do this by representing a table procedurally, as an +object that maintains an internal table as part of its local state. +When sent an appropriate message, this ``table object'' supplies the +procedure with which to operate on the internal table. Here is a +generator for two-dimensional tables represented in this fashion:

                                                                                    + +

                                                                                    (define (make-table)
                                                                                    +  (let ((local-table (list '*table*)))
                                                                                    +    (define (lookup key-1 key-2)
                                                                                    +      (let ((subtable (assoc key-1 (cdr local-table))))
                                                                                    +        (if subtable
                                                                                    +            (let ((record (assoc key-2 (cdr subtable))))
                                                                                    +              (if record
                                                                                    +                  (cdr record)
                                                                                    +                  false))
                                                                                    +            false)))
                                                                                    +    (define (insert! key-1 key-2 value)
                                                                                    +      (let ((subtable (assoc key-1 (cdr local-table))))
                                                                                    +        (if subtable
                                                                                    +            (let ((record (assoc key-2 (cdr subtable))))
                                                                                    +              (if record
                                                                                    +                  (set-cdr! record value)
                                                                                    +                  (set-cdr! subtable
                                                                                    +                            (cons (cons key-2 value)
                                                                                    +                                  (cdr subtable)))))
                                                                                    +            (set-cdr! local-table
                                                                                    +                      (cons (list key-1
                                                                                    +                                  (cons key-2 value))
                                                                                    +                            (cdr local-table)))))
                                                                                    +      'ok)    
                                                                                    +    (define (dispatch m)
                                                                                    +      (cond ((eq? m 'lookup-proc) lookup)
                                                                                    +            ((eq? m 'insert-proc!) insert!)
                                                                                    +            (else (error "Unknown operation -- TABLE" m))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    + +Using make-table, we could implement the get and put +operations used in section 2.4.3 for data-directed +programming, as follows:

                                                                                    + +

                                                                                    (define operation-table (make-table))
                                                                                    +(define get (operation-table 'lookup-proc))
                                                                                    +(define put (operation-table 'insert-proc!))
                                                                                    +

                                                                                    +Get takes as arguments two keys, and put takes +as arguments two keys and a value. Both operations access the same +local table, which is encapsulated within the object created by the +call to make-table. + + +

                                                                                    +Exercise 3.24.  In the table implementations above, the keys are tested for equality +using equal? (called by assoc). This is not always the appropriate test. For +instance, we might have a table with numeric keys in which we don't +need an exact match to the number we're looking up, +but only a number within some tolerance of it. +Design a table constructor make-table that takes as an argument a same-key? procedure +that will be used to test ``equality'' of keys. Make-table should +return a dispatch procedure that can be used to access +appropriate lookup and insert! procedures for a local +table. + +

                                                                                    + +

                                                                                    +Exercise 3.25.  Generalizing one- and two-dimensional tables, show how to implement a +table in which values are stored under an arbitrary number of keys and +different values may be stored under different numbers of keys. The +lookup and insert! procedures should take as input a list +of keys used to access the table. +

                                                                                    + +

                                                                                    +Exercise 3.26.  To search a table as implemented above, one needs to scan through the +list of records. This is basically the unordered list representation of +section 2.3.3. For large tables, it may be more +efficient to structure the table in a different manner. Describe a +table implementation where the (key, value) records are organized +using a binary tree, assuming that keys can be ordered in some way +(e.g., numerically or alphabetically). (Compare +exercise 2.66 of chapter 2.) +

                                                                                    + + +

                                                                                    +Exercise 3.27.  Memoization (also called tabulation) is a technique that +enables a procedure to record, in a local table, values that have +previously been computed. This technique can make a vast difference +in the performance of a program. A memoized procedure maintains a +table in which values of previous calls are stored +using as keys the arguments that produced the values. When the +memoized procedure is asked to compute a value, it first checks the +table to see if the value is already there and, if so, just returns +that value. Otherwise, it computes the new value in the ordinary way +and stores this in the table. As an example of memoization, recall +from section 1.2.2 the exponential process for +computing Fibonacci numbers:

                                                                                    + + +

                                                                                    (define (fib n)
                                                                                    +  (cond ((= n 0) 0)
                                                                                    +        ((= n 1) 1)
                                                                                    +        (else (+ (fib (- n 1))
                                                                                    +                 (fib (- n 2))))))
                                                                                    +

                                                                                    +The memoized version of the same procedure is

                                                                                    + + +

                                                                                    (define memo-fib
                                                                                    +  (memoize (lambda (n)
                                                                                    +             (cond ((= n 0) 0)
                                                                                    +                   ((= n 1) 1)
                                                                                    +                   (else (+ (memo-fib (- n 1))
                                                                                    +                            (memo-fib (- n 2))))))))
                                                                                    +

                                                                                    +where the memoizer is defined as +

                                                                                    (define (memoize f)
                                                                                    +  (let ((table (make-table)))
                                                                                    +    (lambda (x)
                                                                                    +      (let ((previously-computed-result (lookup x table)))
                                                                                    +        (or previously-computed-result
                                                                                    +            (let ((result (f x)))
                                                                                    +              (insert! x result table)
                                                                                    +              result))))))
                                                                                    +

                                                                                    +Draw an environment diagram to analyze the computation of (memo-fib 3). Explain why memo-fib computes the nth +Fibonacci number in a number of steps proportional to n. +Would the scheme still +work if we had simply defined memo-fib to be (memoize +fib)? + +

                                                                                    + + +

                                                                                    3.3.4  A Simulator for Digital Circuits

                                                                                    + + + +Designing complex digital systems, such as computers, is an important +engineering activity. Digital systems are constructed by +interconnecting simple elements. Although the behavior of these +individual elements is simple, networks of them can have very complex +behavior. Computer simulation of proposed circuit designs is an +important tool used by digital systems engineers. In this section we +design a system for performing digital logic simulations. This system +typifies a kind of program called an event-driven simulation, in +which actions (``events'') trigger further events that happen at a +later time, which in turn trigger more events, and so so.

                                                                                    + + +Our computational model of a circuit will be composed of objects that +correspond to the elementary components from which the circuit is +constructed. There are wires, which carry digital signals. A +digital signal may at any moment have only one of two possible values, +0 and 1. There are also various types of digital function +boxes, which connect wires carrying input signals to other output +wires. Such boxes produce output signals computed from their input +signals. The output signal is delayed by a time that depends on the +type of the function box. For example, an inverter is a +primitive function box that inverts its input. If the +input signal to an inverter changes to 0, then one inverter-delay +later the inverter will change its output signal to 1. If the input +signal to an inverter changes to 1, then one inverter-delay later the +inverter will change its output signal to 0. We draw an inverter +symbolically as in figure 3.24. An and-gate, +also shown in figure 3.24, is a primitive function +box with two inputs and one output. It drives its output signal to a +value that is the logical and of the inputs. That is, if both +of its input signals become 1, then one and-gate-delay time later the +and-gate will force its output signal to be 1; otherwise the output +will be 0. An or-gate is a similar two-input primitive function +box that drives its output signal to a value that is the logical +or of the inputs. That is, the output will become 1 if at least one +of the input signals is 1; otherwise the output will become 0.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.24:  Primitive functions in the digital logic simulator.
                                                                                    + +

                                                                                    + +We can connect primitive functions together to construct more complex +functions. To accomplish this we wire the outputs of some +function boxes to the inputs of other function boxes. For example, +the half-adder circuit shown in figure 3.25 consists of an +or-gate, two and-gates, and an inverter. It takes two input signals, +A and B, and has two output signals, S and C. S will become 1 +whenever precisely one of A and B is 1, and C will become 1 whenever A +and B are both 1. We can see from the figure that, because of the +delays involved, the outputs may be generated at different times. +Many of the difficulties in the design of digital circuits arise from +this fact.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.25:  A half-adder circuit.
                                                                                    + +

                                                                                    + +We will now build a program for modeling the digital logic circuits we +wish to study. The program will construct computational objects +modeling the wires, which will ``hold'' the signals. Function boxes +will be modeled by procedures that enforce the correct relationships +among the signals.

                                                                                    + +One basic element of our simulation will be a procedure make-wire, which constructs wires. For example, we can construct six +wires as follows:

                                                                                    + +

                                                                                    (define a (make-wire))
                                                                                    +(define b (make-wire))
                                                                                    +(define c (make-wire))
                                                                                    +
                                                                                    +(define d (make-wire))
                                                                                    +(define e (make-wire))
                                                                                    +(define s (make-wire))
                                                                                    +

                                                                                    +We attach a function box to a set of wires by calling a procedure that +constructs that kind of box. The arguments to the constructor +procedure are the wires to be attached to the box. For example, given +that we can construct and-gates, or-gates, and inverters, we can wire +together the half-adder shown in figure 3.25:

                                                                                    + +

                                                                                    (or-gate a b d)
                                                                                    +ok
                                                                                    +
                                                                                    +(and-gate a b c)
                                                                                    +ok
                                                                                    +
                                                                                    +(inverter c e)
                                                                                    +ok
                                                                                    +
                                                                                    +(and-gate d e s)
                                                                                    +ok
                                                                                    +

                                                                                    + +Better yet, we can explicitly name this operation by defining a procedure half-adder that constructs this circuit, given the four +external wires to be attached to the half-adder:

                                                                                    + +

                                                                                    (define (half-adder a b s c)
                                                                                    +  (let ((d (make-wire)) (e (make-wire)))
                                                                                    +    (or-gate a b d)
                                                                                    +    (and-gate a b c)
                                                                                    +    (inverter c e)
                                                                                    +    (and-gate d e s)
                                                                                    +    'ok))
                                                                                    +

                                                                                    +The advantage of making this definition is that we can use +half-adder itself as a building block in creating more complex +circuits. Figure 3.26, for example, shows a full-adder composed of two half-adders and an or-gate.26 We can construct a full-adder +as follows:

                                                                                    + +

                                                                                    (define (full-adder a b c-in sum c-out)
                                                                                    +  (let ((s (make-wire))
                                                                                    +        (c1 (make-wire))
                                                                                    +        (c2 (make-wire)))
                                                                                    +    (half-adder b c-in s c1)
                                                                                    +    (half-adder a s sum c2)
                                                                                    +    (or-gate c1 c2 c-out)
                                                                                    +    'ok))
                                                                                    +

                                                                                    +Having defined full-adder as a procedure, we can now use it as a +building block for creating still more complex circuits. (For +example, see exercise 3.30.)

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.26:  A full-adder circuit.
                                                                                    + +

                                                                                    + +In essence, our simulator provides us with the tools to construct a +language of circuits. If we adopt the general perspective on +languages with which we approached the study of Lisp in +section 1.1, +we can say that the primitive function boxes form the primitive +elements of the language, that wiring boxes together provides a means +of combination, and that specifying wiring patterns as procedures +serves as a means of abstraction.

                                                                                    + + +

                                                                                    Primitive function boxes

                                                                                    + + +The primitive function boxes implement the ``forces'' by which a +change in the signal on one wire influences the signals on other +wires. To build function boxes, we use the following operations on +wires:

                                                                                    + +

                                                                                      +
                                                                                    • (get-signal <wire>)
                                                                                      +returns the current value of the signal on the wire.

                                                                                      + +

                                                                                    • (set-signal! <wire> <new value>)
                                                                                      +changes the value of the signal on the wire to the new value.

                                                                                      + +

                                                                                    • (add-action! <wire> <procedure of no arguments>)
                                                                                      +asserts that the designated procedure should be run whenever the +signal on the wire changes value. Such procedures are the vehicles by +which changes in the signal value on the wire are communicated to +other wires. +

                                                                                    +In addition, we will make use of a procedure after-delay that +takes a time delay and a procedure to be run and executes the +given procedure after the given delay.

                                                                                    + +Using these procedures, we can define the primitive digital logic +functions. To connect an input to an output through an inverter, we +use add-action! to associate with the input wire a procedure +that will be run whenever the signal on the input wire changes value. +The procedure computes the logical-not of the input signal, and +then, after one inverter-delay, sets the output signal to be +this new value:

                                                                                    + +

                                                                                    (define (inverter input output)
                                                                                    +  (define (invert-input)
                                                                                    +    (let ((new-value (logical-not (get-signal input))))
                                                                                    +      (after-delay inverter-delay
                                                                                    +                   (lambda ()
                                                                                    +                     (set-signal! output new-value)))))
                                                                                    +  (add-action! input invert-input)
                                                                                    +  'ok)
                                                                                    +(define (logical-not s)
                                                                                    +  (cond ((= s 0) 1)
                                                                                    +        ((= s 1) 0)
                                                                                    +        (else (error "Invalid signal" s))))
                                                                                    +

                                                                                    + +An and-gate is a little more complex. The action procedure must be run if +either of the inputs to the gate changes. It computes the logical-and (using a procedure analogous to logical-not) of the +values of the signals on the input wires and sets up a change to the +new value to occur on the output wire after one and-gate-delay.

                                                                                    + +

                                                                                    (define (and-gate a1 a2 output)
                                                                                    +  (define (and-action-procedure)
                                                                                    +    (let ((new-value
                                                                                    +           (logical-and (get-signal a1) (get-signal a2))))
                                                                                    +      (after-delay and-gate-delay
                                                                                    +                   (lambda ()
                                                                                    +                     (set-signal! output new-value)))))
                                                                                    +  (add-action! a1 and-action-procedure)
                                                                                    +  (add-action! a2 and-action-procedure)
                                                                                    +  'ok)
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.28.  Define an or-gate as a primitive function box. Your or-gate +constructor should be similar to and-gate. +

                                                                                    + +

                                                                                    +Exercise 3.29.  Another way to construct an or-gate is as a compound digital logic +device, built from and-gates and inverters. Define a procedure or-gate that accomplishes this. What is the delay time of the +or-gate in terms of and-gate-delay and inverter-delay? +

                                                                                    + +

                                                                                    +Exercise 3.30.  Figure 3.27 shows a ripple-carry adder formed by stringing +together n full-adders. This is the simplest form of parallel adder +for adding two n-bit binary numbers. The inputs A1, A2, +A3, ..., An and B1, B2, B3, ..., +Bn are the two binary numbers to be added (each Ak and Bk +is a 0 or a 1). The circuit generates S1, S2, S3, +..., Sn, the n bits of the sum, and C, the carry from +the addition. Write a procedure ripple-carry-adder that +generates this circuit. The procedure should take as arguments three +lists of n wires each -- the Ak, the Bk, and the Sk -- and +also another wire C. The major drawback of the ripple-carry adder is +the need to wait for the carry signals to propagate. What is the +delay needed to obtain the complete output from an n-bit +ripple-carry adder, expressed in terms of the delays for and-gates, +or-gates, and inverters? + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.27:  A ripple-carry adder for n-bit numbers.
                                                                                    + +

                                                                                    + + +

                                                                                    Representing wires

                                                                                    + + +A wire in our simulation will be a computational object with two local +state variables: a signal-value (initially taken to be 0) and a +collection of action-procedures to be run when the signal +changes value. We implement the wire, using message-passing style, as +a collection of local procedures together with a dispatch +procedure that selects the appropriate local operation, just as we did +with the simple bank-account object in section + 3.1.1:

                                                                                    + +

                                                                                    (define (make-wire)
                                                                                    +  (let ((signal-value 0) (action-procedures '()))
                                                                                    +    (define (set-my-signal! new-value)
                                                                                    +      (if (not (= signal-value new-value))
                                                                                    +          (begin (set! signal-value new-value)
                                                                                    +                 (call-each action-procedures))
                                                                                    +          'done))
                                                                                    +    (define (accept-action-procedure! proc)
                                                                                    +      (set! action-procedures (cons proc action-procedures))
                                                                                    +      (proc))
                                                                                    +    (define (dispatch m)
                                                                                    +      (cond ((eq? m 'get-signal) signal-value)
                                                                                    +            ((eq? m 'set-signal!) set-my-signal!)
                                                                                    +            ((eq? m 'add-action!) accept-action-procedure!)
                                                                                    +            (else (error "Unknown operation -- WIRE" m))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +The local procedure set-my-signal! tests whether the new signal +value changes the signal on the wire. If so, it runs each of the +action procedures, using the following procedure call-each, +which calls each of the items in a list of no-argument procedures:

                                                                                    + +

                                                                                    (define (call-each procedures)
                                                                                    +  (if (null? procedures)
                                                                                    +      'done
                                                                                    +      (begin
                                                                                    +        ((car procedures))
                                                                                    +        (call-each (cdr procedures)))))
                                                                                    +

                                                                                    +The local procedure accept-action-procedure! adds the given +procedure to the list of procedures to be run, and then runs the new +procedure once. (See exercise 3.31.)

                                                                                    + +With the local dispatch procedure set up as specified, we can +provide the following procedures to access the local operations on +wires:27

                                                                                    + +

                                                                                    (define (get-signal wire)
                                                                                    +  (wire 'get-signal))
                                                                                    +(define (set-signal! wire new-value)
                                                                                    +  ((wire 'set-signal!) new-value))
                                                                                    +(define (add-action! wire action-procedure)
                                                                                    +  ((wire 'add-action!) action-procedure))
                                                                                    +

                                                                                    + +Wires, which have time-varying signals and may be incrementally +attached to devices, are typical of mutable objects. We have modeled +them as procedures with local state variables that are modified by +assignment. When a new wire is created, a new set of state variables +is allocated (by the let expression in make-wire) and a +new dispatch procedure is constructed and returned, capturing +the environment with the new state variables.

                                                                                    + +The wires are shared among the various devices that have been +connected to them. Thus, a change made by an interaction with one +device will affect all the other devices attached to the wire. The +wire communicates the change to its neighbors by calling the action +procedures provided to it when the connections were established. + + +

                                                                                    The agenda

                                                                                    + + +The only thing needed to complete the simulator is after-delay. +The idea here is that we maintain a data structure, called an agenda, that contains a schedule of things to do. The following +operations are defined for agendas:

                                                                                    + +

                                                                                      +
                                                                                    • (make-agenda)
                                                                                      +returns a new empty agenda.

                                                                                      + +

                                                                                    • (empty-agenda? <agenda>)
                                                                                      +is true if the specified agenda is empty.

                                                                                      + +

                                                                                    • (first-agenda-item <agenda>)
                                                                                      +returns the first item on the agenda.

                                                                                      + +

                                                                                    • (remove-first-agenda-item! <agenda>)
                                                                                      +modifies the agenda by removing the first item.

                                                                                      + +

                                                                                    • (add-to-agenda! <time> <action> <agenda>)
                                                                                      +modifies the agenda by adding the given action procedure to be run at +the specified time.

                                                                                      + +

                                                                                    • (current-time <agenda>)
                                                                                      +returns the current simulation time. +

                                                                                    + +The particular agenda that we use is denoted by +the-agenda. The procedure after-delay adds new +elements to the-agenda:

                                                                                    + +

                                                                                    (define (after-delay delay action)
                                                                                    +  (add-to-agenda! (+ delay (current-time the-agenda))
                                                                                    +                  action
                                                                                    +                  the-agenda))
                                                                                    +

                                                                                    + +The simulation is driven by the procedure propagate, which +operates on the-agenda, executing each procedure on the agenda +in sequence. In general, as the simulation runs, new items will be +added to the agenda, and propagate will continue the simulation +as long as there are items on the agenda:

                                                                                    + +

                                                                                    (define (propagate)
                                                                                    +  (if (empty-agenda? the-agenda)
                                                                                    +      'done
                                                                                    +      (let ((first-item (first-agenda-item the-agenda)))
                                                                                    +        (first-item)
                                                                                    +        (remove-first-agenda-item! the-agenda)
                                                                                    +        (propagate))))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    A sample simulation

                                                                                    + + +The following procedure, which places a ``probe'' on a wire, shows the +simulator in action. The probe tells the wire that, whenever its +signal changes value, it should print the new signal value, together +with the current time and a name that identifies the wire:

                                                                                    + +

                                                                                    (define (probe name wire)
                                                                                    +  (add-action! wire
                                                                                    +               (lambda ()        
                                                                                    +                 (newline)
                                                                                    +                 (display name)
                                                                                    +                 (display " ")
                                                                                    +                 (display (current-time the-agenda))
                                                                                    +                 (display "  New-value = ")
                                                                                    +                 (display (get-signal wire)))))
                                                                                    +

                                                                                    + +We begin by initializing the agenda and specifying delays for the +primitive function boxes:

                                                                                    + +

                                                                                    (define the-agenda (make-agenda))
                                                                                    +(define inverter-delay 2)
                                                                                    +(define and-gate-delay 3)
                                                                                    +(define or-gate-delay 5)
                                                                                    +

                                                                                    +Now we define four wires, placing probes on two of them:

                                                                                    + + +

                                                                                    (define input-1 (make-wire))
                                                                                    +(define input-2 (make-wire))
                                                                                    +(define sum (make-wire))
                                                                                    +(define carry (make-wire))
                                                                                    +(probe 'sum sum)
                                                                                    +sum 0  New-value = 0
                                                                                    +(probe 'carry carry)
                                                                                    +carry 0  New-value = 0
                                                                                    +

                                                                                    +Next we connect the wires in a half-adder circuit (as in +figure 3.25), set the signal on input-1 to 1, +and run the simulation:

                                                                                    + + +

                                                                                    (half-adder input-1 input-2 sum carry)
                                                                                    +ok
                                                                                    +(set-signal! input-1 1)
                                                                                    +done
                                                                                    +(propagate)
                                                                                    +sum 8  New-value = 1
                                                                                    +done
                                                                                    +

                                                                                    +The sum signal changes to 1 at time 8. We are now eight time +units from the beginning of the simulation. At this point, we can set +the signal on input-2 to 1 and allow the values to propagate:

                                                                                    + + +

                                                                                    (set-signal! input-2 1)
                                                                                    +done
                                                                                    +(propagate)
                                                                                    +carry 11  New-value = 1
                                                                                    +sum 16  New-value = 0
                                                                                    +done
                                                                                    +

                                                                                    +The carry changes to 1 at time 11 and the sum changes to 0 +at time 16. + + +

                                                                                    +Exercise 3.31.   +The internal procedure accept-action-procedure! defined in make-wire specifies that when a new action procedure is added to +a wire, the procedure is immediately run. Explain why this initialization +is necessary. In particular, trace through the half-adder example in +the paragraphs above and say how the system's response would differ if +we had defined accept-action-procedure! as

                                                                                    + + +

                                                                                    (define (accept-action-procedure! proc)
                                                                                    +  (set! action-procedures (cons proc action-procedures)))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    Implementing the agenda

                                                                                    + + +Finally, we give details of the agenda data structure, which holds the +procedures that are scheduled for future execution.

                                                                                    + +The agenda is made up of time segments. Each time segment is a +pair consisting of a number (the time) and a queue (see +exercise 3.32) that holds the procedures that are +scheduled to be run during that time segment.

                                                                                    + +

                                                                                    (define (make-time-segment time queue)
                                                                                    +  (cons time queue))
                                                                                    +(define (segment-time s) (car s))
                                                                                    +(define (segment-queue s) (cdr s))
                                                                                    +

                                                                                    +We will operate on the time-segment queues using the queue operations +described in section 3.3.2.

                                                                                    + +The agenda itself is a one-dimensional table of time segments. It +differs from the tables described in section 3.3.3 in that +the segments will be sorted in order of increasing time. In addition, +we store the current time (i.e., the time of the last action +that was processed) at the head of the agenda. A newly constructed +agenda has no time segments and has a current time of 0:28

                                                                                    + +

                                                                                    (define (make-agenda) (list 0))
                                                                                    +(define (current-time agenda) (car agenda))
                                                                                    +(define (set-current-time! agenda time)
                                                                                    +  (set-car! agenda time))
                                                                                    +(define (segments agenda) (cdr agenda))
                                                                                    +(define (set-segments! agenda segments)
                                                                                    +  (set-cdr! agenda segments))
                                                                                    +(define (first-segment agenda) (car (segments agenda)))
                                                                                    +(define (rest-segments agenda) (cdr (segments agenda)))
                                                                                    +

                                                                                    + +An agenda is empty if it has no time segments: + +

                                                                                    (define (empty-agenda? agenda)
                                                                                    +  (null? (segments agenda)))
                                                                                    +

                                                                                    +

                                                                                    + + +To add an action to an agenda, we first check if the agenda is empty. +If so, we create a time segment for the action and install this in +the agenda. Otherwise, we scan the agenda, examining the time of each +segment. If we find a segment for our appointed time, we add the +action to the associated queue. If we reach a time later than the one +to which we are appointed, we insert a new time segment into the +agenda just before it. If we reach the end of the agenda, we must +create a new time segment at the end.

                                                                                    + + +

                                                                                    (define (add-to-agenda! time action agenda)
                                                                                    +  (define (belongs-before? segments)
                                                                                    +    (or (null? segments)
                                                                                    +        (< time (segment-time (car segments)))))
                                                                                    +  (define (make-new-time-segment time action)
                                                                                    +    (let ((q (make-queue)))
                                                                                    +      (insert-queue! q action)
                                                                                    +      (make-time-segment time q)))
                                                                                    +  (define (add-to-segments! segments)
                                                                                    +    (if (= (segment-time (car segments)) time)
                                                                                    +        (insert-queue! (segment-queue (car segments))
                                                                                    +                       action)
                                                                                    +        (let ((rest (cdr segments)))
                                                                                    +          (if (belongs-before? rest)
                                                                                    +              (set-cdr!
                                                                                    +               segments
                                                                                    +               (cons (make-new-time-segment time action)
                                                                                    +                     (cdr segments)))
                                                                                    +              (add-to-segments! rest)))))
                                                                                    +  (let ((segments (segments agenda)))
                                                                                    +    (if (belongs-before? segments)
                                                                                    +        (set-segments!
                                                                                    +         agenda
                                                                                    +         (cons (make-new-time-segment time action)
                                                                                    +               segments))
                                                                                    +        (add-to-segments! segments))))
                                                                                    +

                                                                                    + +The procedure that removes the first item from the agenda deletes the +item at the front of the queue in the first time segment. If this +deletion makes the time segment empty, we remove it from the list of +segments:29

                                                                                    + +

                                                                                    (define (remove-first-agenda-item! agenda)
                                                                                    +  (let ((q (segment-queue (first-segment agenda))))
                                                                                    +    (delete-queue! q)
                                                                                    +    (if (empty-queue? q)
                                                                                    +        (set-segments! agenda (rest-segments agenda)))))
                                                                                    +

                                                                                    + +The first agenda item is found at the head of the queue in the first +time segment. Whenever we extract an item, we also update the current +time:30

                                                                                    + +

                                                                                    (define (first-agenda-item agenda)
                                                                                    +  (if (empty-agenda? agenda)
                                                                                    +      (error "Agenda is empty -- FIRST-AGENDA-ITEM")
                                                                                    +      (let ((first-seg (first-segment agenda)))
                                                                                    +        (set-current-time! agenda (segment-time first-seg))
                                                                                    +        (front-queue (segment-queue first-seg)))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.32.  The procedures to be run during each time segment of the agenda are +kept in a queue. Thus, the procedures for each segment are called in +the order in which they were added to the agenda (first in, first +out). Explain why this order must be used. In particular, trace the +behavior of an and-gate whose inputs change from 0,1 to 1,0 in the +same segment and say how the behavior would differ if we stored a +segment's procedures in an ordinary list, adding and removing +procedures only at the front (last in, first out). + +

                                                                                    + + +

                                                                                    3.3.5  Propagation of Constraints

                                                                                    + + + +Computer programs are traditionally organized as +one-directional computations, which perform operations on prespecified +arguments to produce desired outputs. On the other hand, we often +model systems in terms of relations among quantities. For example, a +mathematical model of a mechanical structure might include the +information that the deflection d of a metal rod is related to the +force F on the rod, the length L of the rod, the cross-sectional +area A, and the elastic modulus E via the equation +

                                                                                    +Such an equation is not one-directional. Given any four of the +quantities, we can use it to compute the fifth. Yet translating the +equation into a traditional computer language would force us to choose +one of the quantities to be computed in terms of the other four. +Thus, a procedure for computing the area A could not be used to +compute the deflection d, even though the computations of A and +d arise from the same equation.31

                                                                                    + +In this section, we sketch the design of a language that enables us to +work in terms of relations themselves. The primitive elements of the +language are primitive constraints, which state that certain +relations hold between quantities. For example, (adder a b c) +specifies that the quantities a, b, and c must be related by the +equation a + b = c, (multiplier x y z) expresses the constraint +xy = z, and (constant 3.14 x) says that the value of x must +be 3.14.

                                                                                    + + +Our language provides a means of combining primitive constraints in +order to express more complex relations. We combine constraints by +constructing constraint networks, in which constraints are +joined by connectors. A connector is an object that ``holds'' a +value that may participate in one or more constraints. For example, +we know that the relationship between Fahrenheit and Celsius +temperatures is

                                                                                    + +

                                                                                    + +Such a constraint can be thought of as a network consisting of +primitive adder, multiplier, and constant constraints +(figure 3.28). In the figure, we see on the left a +multiplier box with three terminals, labeled m1, m2, and p. +These connect the multiplier to the rest of the network as follows: +The m1 terminal is linked to a connector C, which will hold the +Celsius temperature. The m2 terminal is linked to a connector +w, which is also linked to a constant box that holds 9. The p +terminal, which the multiplier box constrains to be the product of +m1 and m2, is linked to the p terminal +of another multiplier box, whose m2 is connected to a constant 5 and +whose m1 is connected to one of the terms in a sum.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.28:  The relation 9C = 5(F - 32) +expressed as a constraint network.
                                                                                    + +

                                                                                    + +Computation by such a network proceeds as follows: When a connector is +given a value (by the user or by a constraint box to which it is +linked), it awakens all of its associated constraints (except for the +constraint that just awakened it) to inform them that it has a value. +Each awakened constraint box then polls its connectors to see if there +is enough information to determine a value for a connector. If so, +the box sets that connector, which then awakens all of its associated +constraints, and so on. For instance, in conversion between +Celsius and Fahrenheit, w, x, and y are immediately set by +the constant boxes to 9, 5, and 32, respectively. The connectors +awaken the multipliers and the adder, which determine that there is +not enough information to proceed. If the user (or some other part of +the network) sets C to a value (say 25), the leftmost multiplier +will be awakened, and it will set u to 25 · 9 = 225. Then u +awakens the second multiplier, which sets v to 45, and v awakens +the adder, which sets F to 77.

                                                                                    + + + +

                                                                                    Using the constraint system

                                                                                    + +To use the constraint system to carry out the temperature computation +outlined above, we first create two connectors, C and F, +by calling the constructor make-connector, and link C and +F in an appropriate network:

                                                                                    + +

                                                                                    (define C (make-connector))
                                                                                    +(define F (make-connector))
                                                                                    +(celsius-fahrenheit-converter C F)
                                                                                    +ok
                                                                                    +

                                                                                    +The procedure that creates the network is defined as follows:

                                                                                    + +

                                                                                    (define (celsius-fahrenheit-converter c f)
                                                                                    +  (let ((u (make-connector))
                                                                                    +        (v (make-connector))
                                                                                    +        (w (make-connector))
                                                                                    +        (x (make-connector))
                                                                                    +        (y (make-connector)))
                                                                                    +    (multiplier c w u)
                                                                                    +    (multiplier v x u)
                                                                                    +    (adder v y f)
                                                                                    +    (constant 9 w)
                                                                                    +    (constant 5 x)
                                                                                    +    (constant 32 y)
                                                                                    +    'ok))
                                                                                    +

                                                                                    +This procedure creates the internal connectors u, v, w, x, and y, and links them as shown in +figure 3.28 using the primitive constraint +constructors adder, multiplier, and constant. Just +as with the digital-circuit simulator of +section 3.3.4, expressing these combinations of +primitive elements in terms of procedures automatically provides our +language with a means of abstraction for compound objects.

                                                                                    + +To watch the network in action, we can place probes on the connectors +C and F, using a probe procedure similar to the one +we used to monitor wires in section 3.3.4. +Placing a probe on a connector will cause a message to be printed +whenever the connector is given a value:

                                                                                    + + +

                                                                                    (probe "Celsius temp" C)
                                                                                    +(probe "Fahrenheit temp" F)
                                                                                    +

                                                                                    +Next we set the value of C to 25. (The third argument to set-value! tells C that this directive comes from the user.)

                                                                                    + + +

                                                                                    (set-value! C 25 'user)
                                                                                    +Probe: Celsius temp = 25
                                                                                    +Probe: Fahrenheit temp = 77
                                                                                    +done
                                                                                    +

                                                                                    +The probe on C awakens and reports the value. C also +propagates its value through the network as described above. This +sets F to 77, which is reported by the probe on F.

                                                                                    + +Now we can try to set F to a new value, say 212:

                                                                                    + + +

                                                                                    (set-value! F 212 'user)
                                                                                    +Error! Contradiction (77 212)
                                                                                    +

                                                                                    +The connector complains that it has sensed a contradiction: Its value +is 77, and someone is trying to set it to 212. If we really want to +reuse the network with new values, we can tell C to forget its +old value:

                                                                                    + + +

                                                                                    (forget-value! C 'user)
                                                                                    +Probe: Celsius temp = ?
                                                                                    +Probe: Fahrenheit temp = ?
                                                                                    +done
                                                                                    +

                                                                                    +C finds that the user, who set its value originally, is +now retracting that value, so C agrees to lose its value, as +shown by the probe, and informs the rest of the network of this fact. +This information eventually propagates to F, which now finds +that it has no reason for continuing to believe that its own value is +77. Thus, F also gives up its value, as shown by the probe.

                                                                                    + +Now that F has no value, we are free to set it to 212:

                                                                                    + +

                                                                                    (set-value! F 212 'user)
                                                                                    +Probe: Fahrenheit temp = 212
                                                                                    +Probe: Celsius temp = 100
                                                                                    +done
                                                                                    +

                                                                                    +This new value, when propagated through the network, forces C to +have a value of 100, and this is registered by the probe on C. +Notice that the very same network is being used to compute C +given F and to compute F given C. This +nondirectionality of computation is the distinguishing feature of +constraint-based systems.

                                                                                    + + +

                                                                                    Implementing the constraint system

                                                                                    + +The constraint system is implemented via procedural objects with local +state, in a manner very similar to the digital-circuit simulator of +section 3.3.4. Although the primitive objects +of the constraint system are somewhat more complex, the overall system +is simpler, since there is no concern about agendas and logic delays.

                                                                                    + +The basic operations on connectors are the following: +

                                                                                      +
                                                                                    • (has-value? <connector>)
                                                                                      +tells whether the connector has a value.

                                                                                      + +

                                                                                    • (get-value <connector>)
                                                                                      +returns the connector's current value.

                                                                                      + +

                                                                                    • (set-value! <connector> <new-value> <informant>)
                                                                                      +indicates that the informant is requesting the connector to set its +value to the new value.

                                                                                      + +

                                                                                    • (forget-value! <connector> <retractor>)
                                                                                      +tells the connector that the retractor is requesting it to forget its value.

                                                                                      + +

                                                                                    • (connect <connector> <new-constraint>)
                                                                                      +tells the connector to participate in the new constraint. +

                                                                                    + +The connectors communicate with the constraints by means of the +procedures inform-about-value, which tells the given +constraint that the connector has a value, and inform-about-no-value, which tells the constraint that the connector +has lost its value.

                                                                                    + +Adder constructs an adder constraint among summand connectors +a1 and a2 and a sum connector. An adder is +implemented as a procedure with local state (the procedure me +below):

                                                                                    + +

                                                                                    (define (adder a1 a2 sum)
                                                                                    +  (define (process-new-value)
                                                                                    +    (cond ((and (has-value? a1) (has-value? a2))
                                                                                    +           (set-value! sum
                                                                                    +                       (+ (get-value a1) (get-value a2))
                                                                                    +                       me))
                                                                                    +          ((and (has-value? a1) (has-value? sum))
                                                                                    +           (set-value! a2
                                                                                    +                       (- (get-value sum) (get-value a1))
                                                                                    +                       me))
                                                                                    +          ((and (has-value? a2) (has-value? sum))
                                                                                    +           (set-value! a1
                                                                                    +                       (- (get-value sum) (get-value a2))
                                                                                    +                       me))))
                                                                                    +  (define (process-forget-value)
                                                                                    +    (forget-value! sum me)
                                                                                    +    (forget-value! a1 me)
                                                                                    +    (forget-value! a2 me)
                                                                                    +    (process-new-value))
                                                                                    +  (define (me request)
                                                                                    +    (cond ((eq? request 'I-have-a-value)  
                                                                                    +           (process-new-value))
                                                                                    +          ((eq? request 'I-lost-my-value) 
                                                                                    +           (process-forget-value))
                                                                                    +          (else 
                                                                                    +           (error "Unknown request -- ADDER" request))))
                                                                                    +  (connect a1 me)
                                                                                    +  (connect a2 me)
                                                                                    +  (connect sum me)
                                                                                    +  me)
                                                                                    +

                                                                                    +Adder connects the new adder to the designated connectors and +returns it as its value. The procedure me, which represents the +adder, acts as a dispatch to the local procedures. The following +``syntax interfaces'' (see footnote 27 in +section 3.3.4) are used in conjunction with the +dispatch:

                                                                                    + +

                                                                                    (define (inform-about-value constraint)
                                                                                    +  (constraint 'I-have-a-value))
                                                                                    +(define (inform-about-no-value constraint)
                                                                                    +  (constraint 'I-lost-my-value))
                                                                                    +

                                                                                    +The adder's local procedure process-new-value is called when the +adder is informed that one of its connectors has a value. The adder +first checks to see if both a1 and a2 have values. If so, +it tells sum to set its value to the sum of the two addends. +The informant argument to set-value! is me, which is +the adder object itself. If a1 and a2 do not both have +values, then the adder checks to see if perhaps a1 and sum +have values. If so, it sets a2 to the difference of these two. +Finally, if a2 and sum have values, this gives the adder +enough information to set a1. If the adder is told that one of +its connectors has lost a value, it requests that all of its +connectors now lose their values. (Only those values that were set by +this adder are actually lost.) Then it runs process-new-value. +The reason for this last step is that one or more connectors may still +have a value (that is, a connector may have had a value that was not +originally set by the adder), and these values may need to be +propagated back through the adder.

                                                                                    + +A multiplier is very similar to an adder. It will set its product to 0 if either of the factors is 0, even if the other factor +is not known.

                                                                                    + +

                                                                                    (define (multiplier m1 m2 product)
                                                                                    +  (define (process-new-value)
                                                                                    +    (cond ((or (and (has-value? m1) (= (get-value m1) 0))
                                                                                    +               (and (has-value? m2) (= (get-value m2) 0)))
                                                                                    +           (set-value! product 0 me))
                                                                                    +          ((and (has-value? m1) (has-value? m2))
                                                                                    +           (set-value! product
                                                                                    +                       (* (get-value m1) (get-value m2))
                                                                                    +                       me))
                                                                                    +          ((and (has-value? product) (has-value? m1))
                                                                                    +           (set-value! m2
                                                                                    +                       (/ (get-value product) (get-value m1))
                                                                                    +                       me))
                                                                                    +          ((and (has-value? product) (has-value? m2))
                                                                                    +           (set-value! m1
                                                                                    +                       (/ (get-value product) (get-value m2))
                                                                                    +                       me))))
                                                                                    +  (define (process-forget-value)
                                                                                    +    (forget-value! product me)
                                                                                    +    (forget-value! m1 me)
                                                                                    +    (forget-value! m2 me)
                                                                                    +    (process-new-value))
                                                                                    +  (define (me request)
                                                                                    +    (cond ((eq? request 'I-have-a-value)
                                                                                    +           (process-new-value))
                                                                                    +          ((eq? request 'I-lost-my-value)
                                                                                    +           (process-forget-value))
                                                                                    +          (else
                                                                                    +           (error "Unknown request -- MULTIPLIER" request))))
                                                                                    +  (connect m1 me)
                                                                                    +  (connect m2 me)
                                                                                    +  (connect product me)
                                                                                    +  me)
                                                                                    +

                                                                                    +A constant constructor simply sets the value of the designated +connector. Any I-have-a-value or I-lost-my-value message +sent to the constant box will produce an error.

                                                                                    + +

                                                                                    (define (constant value connector)
                                                                                    +  (define (me request)
                                                                                    +    (error "Unknown request -- CONSTANT" request))
                                                                                    +  (connect connector me)
                                                                                    +  (set-value! connector value me)
                                                                                    +  me)
                                                                                    +

                                                                                    +Finally, a probe prints a message about the setting or unsetting of +the designated connector:

                                                                                    + +

                                                                                    (define (probe name connector)
                                                                                    +  (define (print-probe value)
                                                                                    +    (newline)
                                                                                    +    (display "Probe: ")
                                                                                    +    (display name)
                                                                                    +    (display " = ")
                                                                                    +    (display value))
                                                                                    +  (define (process-new-value)
                                                                                    +    (print-probe (get-value connector)))
                                                                                    +  (define (process-forget-value)
                                                                                    +    (print-probe "?"))
                                                                                    +  (define (me request)
                                                                                    +    (cond ((eq? request 'I-have-a-value)
                                                                                    +           (process-new-value))
                                                                                    +          ((eq? request 'I-lost-my-value)
                                                                                    +           (process-forget-value))
                                                                                    +          (else
                                                                                    +           (error "Unknown request -- PROBE" request))))
                                                                                    +  (connect connector me)
                                                                                    +  me)
                                                                                    +

                                                                                    + + +

                                                                                    Representing connectors

                                                                                    + + +A connector is represented as a procedural object with local state +variables value, the current value of the connector; informant, the object that set the connector's value; and constraints, a list of the constraints in which the connector +participates.

                                                                                    + +

                                                                                    (define (make-connector)
                                                                                    +  (let ((value false) (informant false) (constraints '()))
                                                                                    +    (define (set-my-value newval setter)
                                                                                    +      (cond ((not (has-value? me))
                                                                                    +             (set! value newval)
                                                                                    +             (set! informant setter)
                                                                                    +             (for-each-except setter
                                                                                    +                              inform-about-value
                                                                                    +                              constraints))
                                                                                    +            ((not (= value newval))
                                                                                    +             (error "Contradiction" (list value newval)))
                                                                                    +            (else 'ignored)))
                                                                                    +    (define (forget-my-value retractor)
                                                                                    +      (if (eq? retractor informant)
                                                                                    +          (begin (set! informant false)
                                                                                    +                 (for-each-except retractor
                                                                                    +                                  inform-about-no-value
                                                                                    +                                  constraints))
                                                                                    +          'ignored))
                                                                                    +    (define (connect new-constraint)
                                                                                    +      (if (not (memq new-constraint constraints))
                                                                                    +          (set! constraints 
                                                                                    +                (cons new-constraint constraints)))
                                                                                    +      (if (has-value? me)
                                                                                    +          (inform-about-value new-constraint))
                                                                                    +      'done)
                                                                                    +    (define (me request)
                                                                                    +      (cond ((eq? request 'has-value?)
                                                                                    +             (if informant true false))
                                                                                    +            ((eq? request 'value) value)
                                                                                    +            ((eq? request 'set-value!) set-my-value)
                                                                                    +            ((eq? request 'forget) forget-my-value)
                                                                                    +            ((eq? request 'connect) connect)
                                                                                    +            (else (error "Unknown operation -- CONNECTOR"
                                                                                    +                         request))))
                                                                                    +    me))
                                                                                    +

                                                                                    + + +The connector's local procedure set-my-value is called when +there is a request to set the connector's value. If the connector +does not currently have a value, it will set its value and remember as +informant the constraint that requested the value to be +set.32 +Then the connector will notify all of its participating +constraints except the constraint that requested the value to be set. +This is accomplished using the following iterator, which applies a +designated procedure to all items in a list except a given one:

                                                                                    + +

                                                                                    (define (for-each-except exception procedure list)
                                                                                    +  (define (loop items)
                                                                                    +    (cond ((null? items) 'done)
                                                                                    +          ((eq? (car items) exception) (loop (cdr items)))
                                                                                    +          (else (procedure (car items))
                                                                                    +                (loop (cdr items)))))
                                                                                    +  (loop list))
                                                                                    +

                                                                                    + +If a connector is asked to forget its value, it runs the local +procedure forget-my-value, which first checks to make sure that +the request is coming from the same object that set the value +originally. If so, the connector informs its associated constraints +about the loss of the value.

                                                                                    + +The local procedure connect adds the designated new constraint +to the list of constraints if it is not already in that list. Then, +if the connector has a value, it informs the new constraint of this +fact.

                                                                                    + +The connector's procedure me serves as a dispatch to the other +internal procedures and also represents the connector as an object. +The following procedures provide a syntax interface for the dispatch:

                                                                                    + +

                                                                                    (define (has-value? connector)
                                                                                    +  (connector 'has-value?))
                                                                                    +(define (get-value connector)
                                                                                    +  (connector 'value))
                                                                                    +(define (set-value! connector new-value informant)
                                                                                    +  ((connector 'set-value!) new-value informant))
                                                                                    +(define (forget-value! connector retractor)
                                                                                    +  ((connector 'forget) retractor))
                                                                                    +(define (connect connector new-constraint)
                                                                                    +  ((connector 'connect) new-constraint))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.33.  Using primitive multiplier, adder, and constant constraints, define a +procedure averager that takes three connectors a, b, +and c as inputs and establishes the constraint that the value of +c is the average of the values of a and b. +

                                                                                    + +

                                                                                    +Exercise 3.34.  Louis Reasoner wants to build a squarer, a constraint device with two +terminals such that the value of connector b on the second +terminal will always be the square of the value a on the first +terminal. He proposes the following simple device made from a +multiplier:

                                                                                    + + +

                                                                                    (define (squarer a b)
                                                                                    +  (multiplier a a b))
                                                                                    +

                                                                                    +There is a serious flaw in this idea. Explain. + +

                                                                                    + +

                                                                                    +Exercise 3.35.  Ben Bitdiddle tells Louis that one way to avoid the trouble in +exercise 3.34 is to define a squarer as a new +primitive constraint. Fill in the missing portions in Ben's outline +for a procedure to implement such a constraint:

                                                                                    + + +

                                                                                    (define (squarer a b)
                                                                                    +  (define (process-new-value)
                                                                                    +    (if (has-value? b)
                                                                                    +        (if (< (get-value b) 0)
                                                                                    +            (error "square less than 0 -- SQUARER" (get-value b))
                                                                                    +            <alternative1>)
                                                                                    +        <alternative2>))
                                                                                    +  (define (process-forget-value) <body1>)
                                                                                    +  (define (me request) <body2>)
                                                                                    +  <rest of definition>
                                                                                    +  me)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.36.  Suppose we evaluate the following sequence of expressions in the +global environment:

                                                                                    + + +

                                                                                    (define a (make-connector))
                                                                                    +(define b (make-connector))
                                                                                    +(set-value! a 10 'user)
                                                                                    +

                                                                                    +At some time during evaluation of the set-value!, the following +expression from the connector's local procedure is evaluated:

                                                                                    + + +

                                                                                    (for-each-except setter inform-about-value constraints)
                                                                                    +

                                                                                    +Draw an environment diagram showing the environment in which the above +expression is evaluated. +

                                                                                    + + +

                                                                                    +Exercise 3.37.  The celsius-fahrenheit-converter procedure is cumbersome when +compared with a more expression-oriented style of definition, such as

                                                                                    + + +

                                                                                    (define (celsius-fahrenheit-converter x)
                                                                                    +  (c+ (c* (c/ (cv 9) (cv 5))
                                                                                    +          x)
                                                                                    +      (cv 32)))
                                                                                    +(define C (make-connector))
                                                                                    +(define F (celsius-fahrenheit-converter C))
                                                                                    +

                                                                                    +Here c+, c*, etc. are the ``constraint'' versions of the +arithmetic operations. For example, c+ takes two connectors as +arguments and returns a connector that is related to these by an adder +constraint: +

                                                                                    + + +

                                                                                    (define (c+ x y)
                                                                                    +  (let ((z (make-connector)))
                                                                                    +    (adder x y z)
                                                                                    +    z))
                                                                                    +

                                                                                    +Define analogous procedures c-, c*, c/, and cv +(constant value) that enable us to define compound constraints as in +the converter example above.33 +

                                                                                    +


                                                                                    +

                                                                                    16 Set-car! and set-cdr! return implementation-dependent +values. Like set!, they should be used only for their effect. + +

                                                                                    17 We see from this that mutation operations on lists +can create ``garbage'' that is not part of any accessible structure. +We will see in section 5.3.2 that Lisp memory-management +systems include a garbage collector, which identifies and +recycles the memory space used by unneeded pairs. + +

                                                                                    18 Get-new-pair is one of the operations that must be implemented as +part of the memory management required by a Lisp implementation. We +will discuss this in section 5.3.1. + +

                                                                                    19 The two pairs +are distinct because each call to cons returns a new pair. The +symbols are shared; in Scheme there is a unique symbol with any given +name. Since Scheme provides no way to mutate a symbol, this sharing is +undetectable. Note also that the sharing is what enables us to +compare symbols using eq?, which simply checks equality of +pointers. + +

                                                                                    20 The +subtleties of dealing with sharing of mutable data objects reflect the +underlying issues of ``sameness'' and ``change'' that were raised in +section 3.1.3. We mentioned there that +admitting change to our language requires that a compound object must +have an ``identity'' that is something different from the pieces from +which it is composed. In Lisp, we consider this ``identity'' to be +the quality that is tested by eq?, i.e., by equality of +pointers. Since in most Lisp implementations a pointer is +essentially a memory address, we are ``solving the problem'' of +defining the identity of objects by stipulating that a data object +``itself'' is the information stored in some particular set of memory +locations in the computer. This suffices for simple Lisp programs, +but is hardly a general way to resolve the issue of ``sameness'' in +computational models. + +

                                                                                    21 On the other hand, from the +viewpoint of implementation, assignment requires us to modify the +environment, which is itself a mutable data structure. Thus, +assignment and mutation are equipotent: Each can be implemented in +terms of the other. + +

                                                                                    22 If the first item is +the final item in the queue, the front pointer will be the empty list after +the deletion, which will mark the queue as empty; we needn't worry +about updating the rear pointer, which will still point to the deleted +item, because empty-queue? looks only at the front pointer. + +

                                                                                    23 Be careful not to +make the interpreter try to print a structure that contains cycles. +(See exercise 3.13.) + +

                                                                                    24 Because assoc +uses equal?, it can recognize keys that are symbols, numbers, +or list structure. + +

                                                                                    25 Thus, the first backbone pair is the +object that represents the table ``itself''; that is, a pointer to the +table is a pointer to this pair. This same backbone pair always +starts the table. If we did not arrange things in this way, insert! would have to return a new value for the start of the table +when it added a new record. + +

                                                                                    26 A +full-adder is a basic circuit element used in adding two binary +numbers. Here A and B are the bits at corresponding positions in the +two numbers to be added, and Cin is the carry bit from the +addition one place to the right. The circuit generates SUM, which is +the sum bit in the corresponding position, and Cout, which is the +carry bit to be propagated to the left. + +

                                                                                    27 These procedures are simply syntactic sugar that allow +us to use ordinary procedural syntax to access the local procedures of +objects. It is striking that we can interchange the role of +``procedures'' and ``data'' in such a simple way. For example, if we +write (wire 'get-signal) we think of wire as a procedure +that is called with the message get-signal as input. +Alternatively, writing (get-signal wire) encourages us to think +of wire as a data object that is the input to a procedure get-signal. The truth of the matter is that, in a language in which +we can deal with procedures as objects, there is no fundamental +difference between ``procedures'' and ``data,'' and we can choose our +syntactic sugar to allow us to program in whatever style we choose. + + +

                                                                                    28 The +agenda is a headed list, like the tables in section 3.3.3, +but since the list is headed by the time, we do not need an additional +dummy header (such as the *table* symbol used with tables). + +

                                                                                    29 Observe that the if expression in +this procedure has no +<alternative> expression. Such a ``one-armed if statement'' +is used to decide whether to do something, rather than to select +between two expressions. An if expression returns an +unspecified value if the predicate is false and there is no +<alternative>. + +

                                                                                    30 In this way, the current time will always be the time +of the action most recently processed. Storing this time at the head +of the agenda ensures that it will still be available even if the +associated time segment has been deleted. + +

                                                                                    31 Constraint propagation +first appeared in the incredibly forward-looking SKETCHPAD system of +Ivan Sutherland (1963). A beautiful constraint-propagation system +based on the Smalltalk language was developed by Alan Borning (1977) +at Xerox Palo Alto Research Center. Sussman, Stallman, and Steele +applied constraint propagation to electrical circuit analysis (Sussman +and Stallman 1975; Sussman and Steele 1980). TK!Solver (Konopasek and +Jayaraman 1984) is an extensive modeling environment based on +constraints. + +

                                                                                    32 The setter might not be a constraint. In our +temperature example, we used user as the setter. + +

                                                                                    33 The expression-oriented format +is convenient because it avoids the need to name the intermediate +expressions in a computation. Our original formulation of the +constraint language is cumbersome in the same way that many languages +are cumbersome when dealing with operations on compound data. For +example, if we wanted to compute the product (a + b) · (c + d), where the +variables represent vectors, we could work in ``imperative style,'' +using procedures that set the values of designated vector arguments +but do not themselves return vectors as values: +

                                                                                    (v-sum a b temp1)
                                                                                    +(v-sum c d temp2)
                                                                                    +(v-prod temp1 temp2 answer)
                                                                                    +

                                                                                    +Alternatively, we could deal with expressions, using +procedures that return vectors as values, and thus avoid +explicitly mentioning temp1 and temp2: +

                                                                                    (define answer (v-prod (v-sum a b) (v-sum c d)))
                                                                                    +

                                                                                    +Since Lisp allows us to return compound objects as values of +procedures, we can transform our imperative-style constraint language +into an expression-oriented style as shown in this exercise. In +languages that are impoverished in handling compound objects, such as +Algol, Basic, and Pascal (unless one explicitly uses Pascal pointer +variables), one is usually stuck with the imperative style when +manipulating compound objects. Given the advantage of the +expression-oriented format, one might ask if there is any reason to +have implemented the system in imperative style, as we did in this +section. One reason is that the non-expression-oriented constraint +language provides a handle on constraint objects (e.g., the value of +the adder procedure) as well as on connector objects. This is +useful if we wish to extend the system with new operations that +communicate with constraints directly rather than only indirectly via +operations on connectors. Although it is easy to implement the +expression-oriented style in terms of the imperative implementation, +it is very difficult to do the converse. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-23.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-23.html new file mode 100644 index 00000000..a3757123 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-23.html @@ -0,0 +1,1036 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    3.4  Concurrency: Time Is of the Essence

                                                                                    + + + +We've seen the power of computational objects with local state as +tools for modeling. Yet, as section 3.1.3 +warned, this power extracts a price: the loss of referential +transparency, giving rise to a thicket of questions about sameness and +change, and the need to abandon the substitution model of evaluation in +favor of the more intricate environment model.

                                                                                    + +The central issue lurking beneath the complexity of state, sameness, +and change is that by introducing assignment we are forced to admit +time into our computational models. Before we introduced +assignment, all our programs were timeless, in the sense that any +expression that has a value always has the same value. In contrast, +recall the example of modeling withdrawals from a bank account +and returning the resulting balance, +introduced at the beginning of +section 3.1.1:

                                                                                    + +

                                                                                    (withdraw 25)
                                                                                    +75
                                                                                    +(withdraw 25)
                                                                                    +50
                                                                                    +

                                                                                    +Here successive evaluations of the same expression yield different +values. This behavior arises from the fact that the execution of +assignment statements (in this case, assignments to the variable balance) delineates moments in time when values change. The +result of evaluating an expression depends not only on the expression +itself, but also on whether the evaluation occurs before or after +these moments. Building models in terms of computational objects with +local state forces us to confront time as an essential concept in +programming.

                                                                                    + +We can go further in structuring computational models to match our +perception of the physical world. Objects in the world do not change +one at a time in sequence. Rather we perceive them as acting concurrently -- all at once. So it is often natural to model systems +as collections of computational processes that execute concurrently. +Just as we can make our programs modular by organizing models in +terms of objects with separate local state, it is often appropriate to +divide computational models into parts that evolve separately and +concurrently. Even if the programs are to be executed on a sequential +computer, the practice of writing programs as if they were to be +executed concurrently forces the programmer to avoid inessential +timing constraints and thus makes programs more modular.

                                                                                    + +In addition to making programs more modular, concurrent computation +can provide a speed advantage over sequential computation. Sequential +computers execute only one operation at a time, so the amount of time +it takes to perform a task is proportional to the total number of +operations performed.34 +However, if it is possible to decompose a problem into pieces that are +relatively independent and need to communicate only rarely, it may be +possible to allocate pieces to separate computing processors, +producing a speed advantage proportional to the number of processors +available.

                                                                                    + +Unfortunately, the complexities introduced by assignment become even +more problematic in the presence of concurrency. The fact of +concurrent execution, either because the world operates in parallel or +because our computers do, entails additional complexity in our +understanding of time.

                                                                                    + + +

                                                                                    3.4.1  The Nature of Time in Concurrent Systems

                                                                                    + + + +On the surface, time seems straightforward. It +is an ordering imposed on events.35 +For any events A and B, either A occurs before B, A and B +are simultaneous, or A occurs after B. For instance, +returning to the bank account example, suppose that Peter withdraws +$10 and Paul withdraws $25 from a joint account that initially +contains $100, leaving $65 in the account. Depending on the order +of the two withdrawals, the sequence of balances in the account is +either $100 $90 $65 or +$100 $75 $65. In a computer implementation +of the banking system, this changing sequence of balances could be +modeled by successive assignments to a variable balance.

                                                                                    + +In complex situations, however, such a view can be problematic. +Suppose that Peter and Paul, and other people besides, are +accessing the same bank account through a network of banking machines +distributed all over the world. The actual sequence of balances in +the account will depend critically on the detailed timing of the +accesses and the details of the communication among the machines.

                                                                                    + +This indeterminacy in the order of events can pose serious problems in +the design of concurrent systems. For instance, suppose that the +withdrawals made by Peter and Paul are implemented as two separate +processes sharing a common variable balance, each process +specified by the procedure given in +section 3.1.1: + +

                                                                                    (define (withdraw amount)
                                                                                    +  (if (>= balance amount)
                                                                                    +      (begin (set! balance (- balance amount))
                                                                                    +             balance)
                                                                                    +      "Insufficient funds"))
                                                                                    +

                                                                                    +If the two processes operate independently, then Peter might test the +balance and attempt to withdraw a legitimate amount. However, Paul +might withdraw some funds in between the time that Peter checks the +balance and the time Peter completes the withdrawal, thus invalidating +Peter's test.

                                                                                    + +Things can be worse still. Consider the expression + +

                                                                                    (set! balance (- balance amount))
                                                                                    +

                                                                                    +executed as part of each withdrawal process. This consists of three +steps: (1) accessing the value of the balance variable; (2) +computing the new balance; (3) setting balance to this new +value. If Peter and Paul's withdrawals execute this statement +concurrently, then the two withdrawals might interleave the order in +which they access balance and set it to the new value.

                                                                                    + + +The timing diagram in figure 3.29 depicts an order of +events where balance starts at 100, Peter withdraws 10, +Paul withdraws 25, and yet the final value of balance is 75. As +shown in the diagram, the reason for this anomaly is that Paul's +assignment of 75 to balance is made under the assumption that +the value of balance to be decremented is 100. That assumption, +however, became invalid when Peter changed balance to 90. This +is a catastrophic failure for the banking system, because the total +amount of money in the system is not conserved. Before the transactions, +the total amount of money was $100. Afterwards, Peter has $10, Paul +has $25, and the bank has $75.36

                                                                                    + + +The general phenomenon illustrated +here is that several processes may share a +common state variable. What makes this complicated is that more than +one process may be trying to manipulate the shared state at the same +time. For the bank account example, during each transaction, each +customer should be able to act as if the other customers did not +exist. When a customer changes the balance in a way that depends on +the balance, he must be able to assume that, just before the moment of +change, the balance is still what he thought it was.

                                                                                    + + + +

                                                                                    Correct behavior of concurrent programs

                                                                                    + + +The above example typifies the subtle bugs that can creep into +concurrent programs. The root of this complexity lies in the +assignments to variables that are shared among the different +processes. We already know that we must be careful in writing +programs that use set!, because the results of a computation +depend on the order in which the assignments occur.37 +With concurrent processes we must be especially careful about +assignments, because we may not be able to control the order of the +assignments made by the different processes. If several such changes +might be made concurrently (as with two depositors accessing a joint +account) we need some way to ensure that our system behaves correctly. +For example, in the case of withdrawals from a joint bank account, we +must ensure that money is conserved. +To make concurrent programs behave correctly, we may have to +place some restrictions on concurrent execution.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.29:  Timing diagram showing how interleaving the order of events +in two banking withdrawals can lead to an incorrect final balance.
                                                                                    + +

                                                                                    + +One possible restriction on concurrency would +stipulate that no two operations that +change any shared state variables can occur at the same time. This is an +extremely stringent requirement. For distributed banking, it would +require the system designer to ensure that only one transaction could +proceed at a time. This would be both inefficient and overly +conservative. Figure 3.30 shows Peter and +Paul sharing a bank account, where Paul has a private account as well. +The diagram illustrates two withdrawals from the shared account +(one by Peter and one by Paul) and a deposit to Paul's private account.38 +The two withdrawals from the shared account must not be +concurrent (since both access and update the same account), and Paul's +deposit and withdrawal must not be concurrent (since both access and +update the amount in Paul's wallet). +But there should be no problem +permitting Paul's deposit to his private account to proceed +concurrently with Peter's withdrawal from the shared account.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.30:  Concurrent deposits and withdrawals from a joint account +in Bank1 and a private account in Bank2.
                                                                                    + +

                                                                                    + +A less stringent restriction on concurrency would ensure that a +concurrent system produces the same result +as if the processes had run sequentially in some order. +There are two important aspects to this requirement. +First, it does not require the processes to actually run sequentially, +but only to produce results that are the same as if they had run +sequentially. For the example in +figure 3.30, the designer of the bank account +system can safely allow Paul's deposit and Peter's withdrawal to +happen concurrently, because the net result will be the same as if the +two operations had happened sequentially. Second, there may be more +than one possible ``correct'' result produced by a concurrent program, +because we require only that the result be the same as for some +sequential order. +For example, suppose that Peter and Paul's joint account starts out +with $100, and Peter deposits $40 while Paul concurrently withdraws +half the money in the account. +Then sequential execution could result in the account balance being +either $70 or $90 (see exercise 3.38).39

                                                                                    + +There are still weaker requirements for correct execution of +concurrent programs. A program for simulating diffusion (say, the +flow of heat in an object) might consist of a large number of +processes, each one representing a small volume of space, that update +their values concurrently. Each process repeatedly changes its +value to the average of its own value and its neighbors' values. +This algorithm +converges to the right answer independent of the order in which the +operations are done; there is no need for any restrictions on +concurrent use of the shared values.

                                                                                    + +

                                                                                    +Exercise 3.38.  Suppose that Peter, Paul, and Mary share a joint bank account that +initially contains $100. Concurrently, Peter deposits $10, Paul +withdraws $20, and Mary withdraws half the money in the account, by +executing the following commands: + + +
                                                                                    Peter: (set! balance (+ balance 10))
                                                                                    Paul: (set! balance (- balance 20))
                                                                                    Mary: (set! balance (- balance (/ balance 2))) +

                                                                                    + +

                                                                                    a. List all the different possible values for balance after these +three transactions have been completed, assuming that the banking +system forces the three processes to run sequentially in some order.

                                                                                    + +

                                                                                    b. What are some other values +that could be produced if the system allows the processes to be interleaved? +Draw timing diagrams like the one in figure 3.29 to +explain how these values can occur. + +

                                                                                    + + +

                                                                                    3.4.2  Mechanisms for Controlling Concurrency

                                                                                    + + +We've seen that the difficulty in dealing with concurrent processes is +rooted in the need to consider the interleaving of the order of events +in the different processes. For example, suppose we have two +processes, one with three ordered events (a,b,c) and one with three +ordered events (x,y,z). If the two processes run concurrently, with +no constraints on how their execution is interleaved, then there are +20 different possible orderings for the events that are consistent +with the individual orderings for the two processes: +

                                                                                    +As programmers designing this system, we would have to consider the +effects of each of these 20 orderings and check that each behavior is +acceptable. Such an approach rapidly becomes unwieldy as the numbers +of processes and events increase.

                                                                                    + +A more practical approach to the design of concurrent systems is to +devise general mechanisms that allow us to constrain the interleaving +of concurrent processes so that we can be sure that the program +behavior is correct. Many mechanisms have been developed for this +purpose. In this section, we describe one of them, the serializer.

                                                                                    + + +

                                                                                    Serializing access to shared state

                                                                                    + + +Serialization implements the following idea: Processes will execute +concurrently, but there will be certain collections of procedures that +cannot be executed concurrently. More precisely, serialization creates +distinguished sets of procedures such that only one execution of a +procedure in each serialized set is permitted to happen at a time. +If some procedure in the set is being executed, then a process that +attempts to execute any procedure in the set will be forced to wait +until the first execution has finished.

                                                                                    + +We can use serialization to control access to shared variables. +For example, if we want to update a shared variable based on the +previous value of that variable, we put the access to the previous +value of the variable and the assignment of the new value to the +variable in the same procedure. We then ensure that no other +procedure that assigns to the variable can run concurrently with this +procedure by serializing all of these procedures with the same +serializer. This guarantees that the value of the variable cannot be +changed between an access and the corresponding assignment.

                                                                                    + + +

                                                                                    Serializers in Scheme

                                                                                    + +To make the above mechanism more concrete, suppose that we have +extended Scheme to include a procedure called parallel-execute:

                                                                                    + +

                                                                                    (parallel-execute <p1> <p2... <pk>)
                                                                                    +

                                                                                    +Each <p> must be a procedure of no arguments. Parallel-execute +creates a separate process for each +<p>, which applies <p> (to no arguments). These processes all +run concurrently.40

                                                                                    + +As an example of how this is used, consider

                                                                                    + +

                                                                                    (define x 10)
                                                                                    +
                                                                                    +(parallel-execute (lambda () (set! x (* x x)))
                                                                                    +                  (lambda () (set! x (+ x 1))))
                                                                                    +

                                                                                    +This creates two concurrent processes -- P1, which sets x to +x times x, and P2, which increments x. After +execution is complete, x will be left with one of five possible +values, depending on the interleaving of the events of P1 and +P2: + + + + + +
                                                                                    101: P1 sets x to 100 and then P2 increments x to 101.
                                                                                    121: P2 increments x to 11 and then P1 sets x to +x times x.
                                                                                    110: P2 changes x from 10 to 11 between the two times that +P1 accesses the value of x during the evaluation of (* x x).
                                                                                    11: P2 accesses x, then P1 sets x to 100, +then P2 sets x.
                                                                                    100: P1 accesses x (twice), then P2 sets x to 11, +then P1 sets x.

                                                                                    + + +We can constrain the concurrency by using serialized procedures, +which are created by serializers. Serializers are constructed by make-serializer, whose implementation is given below. A serializer +takes a procedure as argument and returns a serialized procedure that +behaves like the original procedure. All calls to a given serializer +return serialized procedures in the same set.

                                                                                    + +Thus, in contrast to the example above, executing

                                                                                    + + +

                                                                                    (define x 10)
                                                                                    +
                                                                                    +(define s (make-serializer))
                                                                                    +
                                                                                    +(parallel-execute (s (lambda () (set! x (* x x))))
                                                                                    +                  (s (lambda () (set! x (+ x 1)))))
                                                                                    +

                                                                                    +can produce only two possible values for x, 101 or 121. The +other possibilities are eliminated, because the execution of P1 and +P2 cannot be interleaved.

                                                                                    + +Here is a version of the make-account procedure from +section 3.1.1, where the deposits and +withdrawals have been serialized:

                                                                                    + + +

                                                                                    (define (make-account balance)
                                                                                    +  (define (withdraw amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds"))
                                                                                    +  (define (deposit amount)
                                                                                    +    (set! balance (+ balance amount))
                                                                                    +    balance)
                                                                                    +  (let ((protected (make-serializer)))
                                                                                    +    (define (dispatch m)
                                                                                    +      (cond ((eq? m 'withdraw) (protected withdraw))
                                                                                    +            ((eq? m 'deposit) (protected deposit))
                                                                                    +            ((eq? m 'balance) balance)
                                                                                    +            (else (error "Unknown request -- MAKE-ACCOUNT"
                                                                                    +                         m))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +With this implementation, two processes cannot be withdrawing from or +depositing into a single account concurrently. This eliminates the source +of the error illustrated in figure 3.29, where Peter +changes the account balance between the times when Paul accesses the +balance to compute the new value and when Paul actually performs the +assignment. On the other hand, each account has its own serializer, +so that deposits and withdrawals for different accounts can proceed +concurrently.

                                                                                    + + +

                                                                                    +Exercise 3.39.  Which of the five possibilities in the parallel execution shown above +remain if we instead serialize execution as follows:

                                                                                    + + +

                                                                                    (define x 10)
                                                                                    +
                                                                                    +(define s (make-serializer))
                                                                                    +
                                                                                    +(parallel-execute (lambda () (set! x ((s (lambda () (* x x))))))
                                                                                    +                  (s (lambda () (set! x (+ x 1)))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.40.  Give all possible values of x that can result from executing

                                                                                    + + +

                                                                                    (define x 10)
                                                                                    +
                                                                                    +(parallel-execute (lambda () (set! x (* x x)))
                                                                                    +                  (lambda () (set! x (* x x x))))
                                                                                    +

                                                                                    +Which of these possibilities remain if we instead use serialized +procedures:

                                                                                    + + +

                                                                                    (define x 10)
                                                                                    +
                                                                                    +(define s (make-serializer))
                                                                                    +
                                                                                    +(parallel-execute (s (lambda () (set! x (* x x))))
                                                                                    +                  (s (lambda () (set! x (* x x x)))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.41.  Ben Bitdiddle worries that it would be better to implement the bank +account as follows (where the commented line has been changed):

                                                                                    + + +

                                                                                    (define (make-account balance)
                                                                                    +  (define (withdraw amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds"))
                                                                                    +  (define (deposit amount)
                                                                                    +    (set! balance (+ balance amount))
                                                                                    +    balance)
                                                                                    +  ;; continued on next page
                                                                                    +
                                                                                    +  (let ((protected (make-serializer)))
                                                                                    +    (define (dispatch m)
                                                                                    +      (cond ((eq? m 'withdraw) (protected withdraw))
                                                                                    +            ((eq? m 'deposit) (protected deposit))
                                                                                    +            ((eq? m 'balance)
                                                                                    +             ((protected (lambda () balance)))) ; serialized
                                                                                    +            (else (error "Unknown request -- MAKE-ACCOUNT"
                                                                                    +                         m))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +because allowing unserialized access to the bank balance can result in +anomalous behavior. Do you agree? Is there any scenario that +demonstrates Ben's concern? +

                                                                                    + +

                                                                                    +Exercise 3.42.  Ben Bitdiddle suggests that it's a waste of time to create a new +serialized procedure in response to every withdraw and deposit message. He says that make-account could be changed so +that the calls to protected are done outside the dispatch +procedure. That is, an account would return the same serialized +procedure (which was created at the same time as the account) each time +it is asked for a withdrawal procedure. +

                                                                                    (define (make-account balance)
                                                                                    +  (define (withdraw amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds"))
                                                                                    +  (define (deposit amount)
                                                                                    +    (set! balance (+ balance amount))
                                                                                    +    balance)
                                                                                    +  (let ((protected (make-serializer)))
                                                                                    +    (let ((protected-withdraw (protected withdraw))
                                                                                    +          (protected-deposit (protected deposit)))
                                                                                    +      (define (dispatch m)
                                                                                    +        (cond ((eq? m 'withdraw) protected-withdraw)
                                                                                    +              ((eq? m 'deposit) protected-deposit)
                                                                                    +              ((eq? m 'balance) balance)
                                                                                    +              (else (error "Unknown request -- MAKE-ACCOUNT"
                                                                                    +                           m))))
                                                                                    +      dispatch)))
                                                                                    +

                                                                                    +Is this a safe change to make? In particular, is there any difference in +what concurrency is allowed by these two versions of make-account ? +

                                                                                    + + +

                                                                                    Complexity of using multiple shared resources

                                                                                    + + +Serializers provide a powerful abstraction that helps isolate the +complexities of concurrent programs so that they can be dealt with +carefully and (hopefully) correctly. However, while using serializers +is relatively straightforward when there is only a single shared +resource (such as a single bank account), concurrent programming can +be treacherously difficult when there are multiple shared resources.

                                                                                    + +To illustrate one of the difficulties that can arise, suppose we wish to swap +the balances in two bank accounts. We access each account to find the +balance, compute the difference between the balances, withdraw this +difference from one account, and deposit it in the other account. We +could implement this as follows:41

                                                                                    + +

                                                                                    (define (exchange account1 account2)
                                                                                    +  (let ((difference (- (account1 'balance)
                                                                                    +                       (account2 'balance))))
                                                                                    +    ((account1 'withdraw) difference)
                                                                                    +    ((account2 'deposit) difference)))
                                                                                    +

                                                                                    + +This procedure works well when only a single process is trying to do +the exchange. Suppose, however, that Peter and Paul both have access +to accounts a1, a2, and a3, and that +Peter exchanges a1 and +a2 while Paul concurrently exchanges a1 and a3. +Even with account deposits and withdrawals +serialized for individual accounts (as in the make-account +procedure shown above in this section), exchange can still +produce incorrect results. For example, Peter might compute the +difference in the balances for a1 and a2, but then Paul +might change the balance in a1 before Peter is able to complete +the exchange.42 +For correct behavior, we must arrange for the exchange procedure +to lock out any other concurrent accesses to the accounts during the +entire time of the exchange.

                                                                                    + +One way we can accomplish this is by using both accounts' serializers +to serialize the entire exchange procedure. +To do this, we will arrange for access to an account's serializer. +Note that we are deliberately +breaking the modularity of the bank-account object by exposing the +serializer. The following version of make-account is identical +to the original version given in +section 3.1.1, except that a serializer is +provided to protect the balance variable, and the serializer is +exported via message passing:

                                                                                    + +

                                                                                    (define (make-account-and-serializer balance)
                                                                                    +  (define (withdraw amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds"))
                                                                                    +  (define (deposit amount)
                                                                                    +    (set! balance (+ balance amount))
                                                                                    +    balance)
                                                                                    +  (let ((balance-serializer (make-serializer)))
                                                                                    +    (define (dispatch m)
                                                                                    +      (cond ((eq? m 'withdraw) withdraw)
                                                                                    +            ((eq? m 'deposit) deposit)
                                                                                    +            ((eq? m 'balance) balance)
                                                                                    +            ((eq? m 'serializer) balance-serializer)
                                                                                    +            (else (error "Unknown request -- MAKE-ACCOUNT"
                                                                                    +                         m))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    + + +We can use this to do serialized deposits and withdrawals. However, +unlike our earlier serialized account, it is now the responsibility of +each user of bank-account objects to explicitly manage the +serialization, for example as follows:43

                                                                                    + +

                                                                                    (define (deposit account amount)
                                                                                    +  (let ((s (account 'serializer))
                                                                                    +        (d (account 'deposit)))
                                                                                    +    ((s d) amount)))
                                                                                    +

                                                                                    + +Exporting the serializer in this way gives us enough flexibility to +implement a serialized exchange program. We simply +serialize the original +exchange procedure with the serializers for both accounts:

                                                                                    + +

                                                                                    (define (serialized-exchange account1 account2)
                                                                                    +  (let ((serializer1 (account1 'serializer))
                                                                                    +        (serializer2 (account2 'serializer)))
                                                                                    +    ((serializer1 (serializer2 exchange))
                                                                                    +     account1
                                                                                    +     account2)))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.43.  Suppose that the balances in three accounts start out as $10, $20, +and $30, and that multiple processes run, exchanging the balances in +the accounts. Argue that if the processes are run sequentially, +after any number of concurrent exchanges, the account balances should be +$10, $20, and $30 in some order. +Draw a timing diagram like the one in figure 3.29 to +show how this condition can be violated if the exchanges are +implemented using the first version of the account-exchange program in +this section. On the other hand, argue that even with this exchange program, the sum of the balances in the accounts will be +preserved. Draw a timing diagram to show how even this condition would +be violated if we did not serialize the transactions +on individual accounts. + +

                                                                                    + +

                                                                                    +Exercise 3.44.  Consider the problem of transferring an amount from one account to +another. Ben Bitdiddle claims that this can be accomplished with the +following procedure, even if there are multiple people concurrently +transferring money among multiple accounts, using any account +mechanism that serializes deposit and withdrawal transactions, for +example, the version of make-account in the text above.

                                                                                    + + +

                                                                                    (define (transfer from-account to-account amount)
                                                                                    +  ((from-account 'withdraw) amount)
                                                                                    +  ((to-account 'deposit) amount))
                                                                                    +

                                                                                    +Louis Reasoner claims that there is a problem here, and that we need +to use a more sophisticated method, such as the one required for +dealing with the exchange problem. Is Louis right? If not, what is +the essential difference between the transfer problem and the exchange +problem? (You should assume that the balance in from-account +is at least amount.) +

                                                                                    + + +

                                                                                    +Exercise 3.45.  Louis Reasoner thinks our bank-account system is unnecessarily complex and +error-prone now that deposits and withdrawals aren't automatically serialized. +He suggests that make-account-and-serializer should have +exported the serializer (for use by such procedures as +serialized-exchange) in addition to (rather than instead of) +using it to serialize accounts and deposits as make-account did. +He proposes to redefine accounts as follows:

                                                                                    + + +

                                                                                    (define (make-account-and-serializer balance)
                                                                                    +  (define (withdraw amount)
                                                                                    +    (if (>= balance amount)
                                                                                    +        (begin (set! balance (- balance amount))
                                                                                    +               balance)
                                                                                    +        "Insufficient funds"))
                                                                                    +  (define (deposit amount)
                                                                                    +    (set! balance (+ balance amount))
                                                                                    +    balance)
                                                                                    +  (let ((balance-serializer (make-serializer)))
                                                                                    +    (define (dispatch m)
                                                                                    +      (cond ((eq? m 'withdraw) (balance-serializer withdraw))
                                                                                    +            ((eq? m 'deposit) (balance-serializer deposit))
                                                                                    +            ((eq? m 'balance) balance)
                                                                                    +            ((eq? m 'serializer) balance-serializer)
                                                                                    +            (else (error "Unknown request -- MAKE-ACCOUNT"
                                                                                    +                         m))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +Then deposits are handled as with the original make-account: +

                                                                                    (define (deposit account amount)
                                                                                    + ((account 'deposit) amount))
                                                                                    +

                                                                                    +Explain what is wrong with Louis's reasoning. In particular, +consider what happens when serialized-exchange is called. + +

                                                                                    + + +

                                                                                    Implementing serializers

                                                                                    + + +We implement serializers in terms of a more primitive synchronization +mechanism called a mutex. A mutex is an object that supports +two operations -- the mutex can be acquired, and the mutex can be +released. Once a mutex has been acquired, no other acquire +operations on that mutex may proceed until the mutex is released.44 In our implementation, each +serializer has an associated mutex. Given a procedure p, the +serializer returns a procedure that acquires the mutex, runs p, +and then releases the mutex. This ensures that only one of the +procedures produced by the serializer can be running at once, which is +precisely the serialization property that we need to guarantee.

                                                                                    + +

                                                                                    (define (make-serializer)
                                                                                    +  (let ((mutex (make-mutex)))
                                                                                    +    (lambda (p)
                                                                                    +      (define (serialized-p . args)
                                                                                    +        (mutex 'acquire)
                                                                                    +        (let ((val (apply p args)))
                                                                                    +          (mutex 'release)
                                                                                    +          val))
                                                                                    +      serialized-p)))
                                                                                    +

                                                                                    + +The mutex is a mutable object (here we'll use a one-element +list, which we'll refer to as a cell) that can hold the value +true or false. When the value is false, the mutex is available to be +acquired. When the value is true, the mutex is unavailable, and any +process that attempts to acquire the mutex must wait.

                                                                                    + +Our mutex constructor make-mutex begins by initializing the cell +contents to false. To acquire the mutex, we test the cell. If the +mutex is available, we set the cell contents to true and proceed. +Otherwise, we wait in a loop, attempting to acquire over and over +again, until we find that the mutex is available.45 To release the +mutex, we set the cell contents to false.

                                                                                    + +

                                                                                    (define (make-mutex)
                                                                                    +  (let ((cell (list false)))            
                                                                                    +    (define (the-mutex m)
                                                                                    +      (cond ((eq? m 'acquire)
                                                                                    +             (if (test-and-set! cell)
                                                                                    +                 (the-mutex 'acquire))) ; retry
                                                                                    +            ((eq? m 'release) (clear! cell))))
                                                                                    +    the-mutex))
                                                                                    +(define (clear! cell)
                                                                                    +  (set-car! cell false))
                                                                                    +

                                                                                    + +Test-and-set! tests the cell and returns the result of the +test. In addition, if the test was false, test-and-set! sets +the cell contents to true before returning false. We can express this +behavior as the following procedure:

                                                                                    + +

                                                                                    (define (test-and-set! cell)
                                                                                    +  (if (car cell)
                                                                                    +      true
                                                                                    +      (begin (set-car! cell true)
                                                                                    +             false)))
                                                                                    +

                                                                                    + +However, this implementation of test-and-set! does not suffice +as it stands. There is a crucial subtlety here, which is the +essential place where concurrency control enters the system: The test-and-set! operation must be performed atomically. That +is, we must guarantee that, once a process has tested the cell and +found it to be false, the cell contents will actually be set to true +before any other process can test the cell. If we do not make this +guarantee, then the mutex can fail in a way similar to the +bank-account failure in figure 3.29. (See +exercise 3.46.)

                                                                                    + +The actual implementation of test-and-set! depends on the +details of how our system runs concurrent processes. For example, we +might be executing concurrent processes on a sequential processor +using a time-slicing mechanism that cycles through the processes, +permitting each process to run for a short time before interrupting it +and moving on to the next process. In that case, test-and-set! +can work by disabling time slicing during the testing and setting.46 +Alternatively, multiprocessing computers provide instructions that +support atomic operations directly in hardware.47

                                                                                    + +

                                                                                    +Exercise 3.46.  Suppose that we implement test-and-set! using an ordinary +procedure as shown in the text, without attempting to make the operation +atomic. Draw a timing diagram like the one in +figure 3.29 to demonstrate how the mutex +implementation can fail by allowing two processes to acquire the mutex +at the same time. + +

                                                                                    + +

                                                                                    +Exercise 3.47.  A semaphore (of size n) is a generalization of a mutex. Like a +mutex, a semaphore supports acquire and release operations, but it is +more general in that up to n processes can acquire it +concurrently. Additional processes that attempt to acquire the +semaphore must wait for release operations. Give implementations of +semaphores

                                                                                    + +

                                                                                    a. in terms of mutexes

                                                                                    + +

                                                                                    b. in terms of atomic test-and-set! operations. + +

                                                                                    + + +

                                                                                    Deadlock

                                                                                    + + +Now that we have seen how to implement serializers, we can see +that account exchanging still has a problem, even with the +serialized-exchange procedure above. +Imagine that Peter attempts to exchange a1 +with a2 while Paul concurrently attempts to exchange a2 +with a1. Suppose that Peter's process reaches the point where +it has entered a serialized procedure protecting a1 and, just +after that, Paul's process enters a serialized procedure protecting +a2. Now Peter cannot proceed (to enter a serialized procedure +protecting a2) until Paul exits the serialized procedure +protecting a2. Similarly, Paul cannot proceed until Peter exits +the serialized procedure protecting a1. Each process is stalled +forever, waiting for the other. This situation is called a deadlock. Deadlock is always a danger in systems that provide +concurrent access to multiple shared resources.

                                                                                    + +One way to avoid the deadlock in this situation is to give each +account a unique identification number and rewrite serialized-exchange so +that a process will always attempt to enter a procedure protecting the +lowest-numbered account first. Although this method works well for +the exchange problem, there are other situations that require more +sophisticated deadlock-avoidance techniques, or where deadlock cannot +be avoided at all. (See exercises 3.48 +and 3.49.)48

                                                                                    + +

                                                                                    +Exercise 3.48.  Explain in detail why the deadlock-avoidance method described above, +(i.e., the accounts are numbered, and each process attempts to acquire +the smaller-numbered account first) avoids deadlock in the exchange +problem. Rewrite serialized-exchange to incorporate this idea. +(You will +also need to modify make-account so that each account is created +with a number, which can be accessed by sending an appropriate +message.) + +

                                                                                    + +

                                                                                    +Exercise 3.49.  Give a scenario where the deadlock-avoidance mechanism described +above does not work. (Hint: In the exchange problem, each process +knows in advance which accounts it will need to get access to. Consider a +situation where a process must get access to some shared resources before it +can know which additional shared resources it will require.) + +

                                                                                    +

                                                                                    + + +

                                                                                    Concurrency, time, and communication

                                                                                    + +We've seen how programming concurrent systems requires controlling the +ordering of events when different processes access shared +state, and we've seen how to achieve this control through judicious +use of serializers. But the problems of concurrency +lie deeper than this, because, from a fundamental point of view, it's +not always clear what is meant by ``shared state.''

                                                                                    + +Mechanisms such as test-and-set! require processes to examine a +global shared flag at arbitrary times. This is problematic and +inefficient to implement in modern high-speed processors, where +due to optimization techniques such as pipelining and cached memory, +the contents of memory +may not be in a consistent state at every instant. In contemporary +multiprocessing systems, therefore, the serializer paradigm is being +supplanted by new approaches to concurrency control.49

                                                                                    + + +The problematic aspects of shared state also arise +in large, distributed systems. For +instance, imagine a +distributed banking system where individual branch banks maintain +local values for bank balances and periodically compare these with +values maintained by other branches. In such a system the value of +``the account balance'' would be undetermined, except right after +synchronization. +If Peter deposits money in an account he holds +jointly with Paul, when should we say that the account balance has +changed -- when the balance in the local branch changes, or not until +after the synchronization? +And if Paul accesses the account from a +different branch, what are the reasonable constraints to place on the +banking system such that the behavior is ``correct''? +The only thing that might matter for +correctness is the behavior observed by Peter and Paul individually +and the ``state'' of the account immediately after synchronization. +Questions about the +``real'' account balance or the order of events between synchronizations +may be irrelevant or meaningless.50

                                                                                    + + +The basic phenomenon here is that synchronizing different processes, +establishing shared state, or imposing an order on events requires +communication among the processes. In essence, any notion of time in +concurrency control must be intimately tied to communication.51 It is +intriguing that a similar connection between time and communication +also arises in the Theory of Relativity, where the speed of light (the +fastest signal that can be used to synchronize events) is a +fundamental constant relating time and space. The +complexities we encounter in dealing with time and state in our +computational models may in fact mirror a fundamental complexity of +the physical universe. +

                                                                                    + +


                                                                                    +

                                                                                    34 Most real processors actually execute a few +operations at a time, following a strategy called pipelining. Although this technique greatly improves the effective +utilization of the hardware, it is used only to speed up the execution +of a sequential instruction stream, while retaining the behavior of +the sequential program. + +

                                                                                    35 To quote some graffiti seen on a Cambridge +building wall: ``Time is a device that was invented to keep everything +from happening at once.'' + +

                                                                                    36 An even worse failure for this system +could occur if the two set! operations attempt to change the +balance simultaneously, in which case the actual data appearing in +memory might end up being a random combination of the information +being written by the two processes. Most computers have interlocks on +the primitive memory-write operations, which protect against such +simultaneous access. Even this seemingly simple kind of protection, +however, raises implementation challenges in the design of +multiprocessing computers, where elaborate cache-coherence +protocols are required to ensure that the various processors will +maintain a consistent view of memory contents, despite the fact that +data may be replicated (``cached'') among the different processors to +increase the speed of memory access. + +

                                                                                    37 The factorial program in +section 3.1.3 illustrates this for a single +sequential process. + +

                                                                                    38 The columns show the contents of Peter's wallet, +the joint account (in Bank1), Paul's wallet, and Paul's private account +(in Bank2), before and after each withdrawal (W) and deposit (D). +Peter withdraws $10 from Bank1; Paul deposits $5 in Bank2, +then withdraws $25 from Bank1. + +

                                                                                    39 A more formal way to express this idea is to say that +concurrent programs are inherently nondeterministic. That +is, they are described not by single-valued functions, but by +functions whose results are sets of possible values. In +section 4.3 we will study a +language for expressing nondeterministic +computations. + +

                                                                                    40 Parallel-execute is not part of standard Scheme, but +it can be implemented in MIT Scheme. In our implementation, the +new concurrent processes also run concurrently with the original +Scheme process. Also, in our implementation, the value returned +by parallel-execute is a special control object that can be used +to halt the newly created processes. + +

                                                                                    41 We have simplified exchange by exploiting the fact +that our deposit message accepts negative amounts. (This is a +serious bug in our banking system!) + +

                                                                                    42 If the account balances start out as $10, +$20, and $30, then after any number of concurrent exchanges, the +balances should still be $10, $20, and +$30 in some order. Serializing the deposits to individual accounts is not +sufficient to guarantee this. See exercise 3.43. + +

                                                                                    43 Exercise 3.45 investigates why +deposits and withdrawals are no longer automatically serialized +by the account. + +

                                                                                    44 The term ``mutex'' is an abbreviation for mutual +exclusion. The general problem of arranging a mechanism that permits +concurrent processes to safely share resources is called the mutual +exclusion problem. Our mutex is a simple variant of the semaphore mechanism (see exercise 3.47), which was +introduced in the ``THE'' Multiprogramming System developed at the +Technological University of Eindhoven and named for the university's +initials in Dutch (Dijkstra 1968a). The acquire and +release operations were originally called P and V, from the Dutch +words passeren (to pass) and vrijgeven (to release), in +reference to the semaphores used on railroad systems. Dijkstra's +classic exposition (1968b) was one of the first to clearly present the +issues of concurrency control, and showed how to use semaphores to +handle a variety of concurrency problems. + +

                                                                                    45 In most +time-shared operating systems, processes that are blocked by a mutex do +not waste time ``busy-waiting'' as above. Instead, the system +schedules another process to run while the first is waiting, and the blocked +process is awakened when the mutex becomes available. + +

                                                                                    46 In MIT Scheme for a single processor, which uses a time-slicing +model, test-and-set! can be implemented as follows: +

                                                                                    (define (test-and-set! cell)
                                                                                    +  (without-interrupts
                                                                                    +   (lambda ()
                                                                                    +     (if (car cell)
                                                                                    +         true
                                                                                    +         (begin (set-car! cell true)
                                                                                    +                false)))))
                                                                                    +

                                                                                    +Without-interrupts disables +time-slicing interrupts while its procedure argument is being executed. + +

                                                                                    47 There are many variants of such +instructions -- including test-and-set, test-and-clear, swap, +compare-and-exchange, load-reserve, and store-conditional -- whose +design must be carefully matched to the machine's processor-memory +interface. +One issue that arises here is to determine what happens +if two processes attempt to acquire the same resource +at exactly the same time by using such an instruction. +This requires some mechanism +for making a decision about which process gets control. Such a +mechanism is called an arbiter. Arbiters usually boil down to +some sort of hardware device. +Unfortunately, it is possible to prove that one cannot physically +construct a fair arbiter that works 100% of the time unless one +allows the arbiter an arbitrarily long time to make its decision. The +fundamental phenomenon here was originally observed by the fourteenth-century +French philosopher Jean Buridan in his commentary on +Aristotle's De caelo. Buridan argued that a perfectly rational +dog placed between two equally attractive sources of food will starve +to death, because it is incapable of deciding which to go to first. + +

                                                                                    48 The general technique for avoiding deadlock by numbering the +shared resources and acquiring them in order is due to Havender +(1968). Situations where deadlock cannot be avoided require deadlock-recovery methods, which entail having processes ``back out'' +of the deadlocked state and try again. Deadlock-recovery +mechanisms are widely used in database management systems, a topic that +is treated in detail in Gray and Reuter 1993. + +

                                                                                    49 One such alternative to serialization is called barrier +synchronization. The programmer permits concurrent processes to +execute as they please, but establishes certain synchronization points +(``barriers'') through which no process can proceed until all the +processes have reached the barrier. Modern processors provide machine +instructions that permit programmers to establish synchronization +points at places where consistency is required. The PowerPC +TM, for example, includes for this purpose two instructions called +SYNC and EIEIO (Enforced In-order Execution of Input/Output). + +

                                                                                    50 This may seem like a strange point of view, but there are +systems that work this way. International charges to credit-card +accounts, for example, are normally cleared on a per-country basis, +and the charges made in different countries are periodically +reconciled. Thus the account balance may be different in +different countries. + +

                                                                                    51 For distributed +systems, this perspective was pursued by Lamport (1978), who showed how +to use communication to establish ``global clocks'' that can be used +to establish orderings on events in distributed systems. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html new file mode 100644 index 00000000..9d00abd2 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html @@ -0,0 +1,2057 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    3.5  Streams

                                                                                    + + + +We've gained a good understanding of assignment as a tool in modeling, +as well as an appreciation of the complex problems that assignment +raises. It is time to ask whether we could have gone about things in a +different way, so as to avoid some of these problems. In this +section, we explore an alternative approach to modeling state, based +on data structures called streams. As we shall see, streams can +mitigate some of the complexity of modeling state.

                                                                                    + +Let's step back and review where this complexity comes from. In an +attempt to model real-world phenomena, we made some apparently +reasonable decisions: We modeled real-world objects with local state +by computational objects with local variables. We identified time +variation in the real world with time variation in the computer. We +implemented the time variation of the states of the model objects in +the computer with assignments to the local variables of the model +objects.

                                                                                    + +Is there another approach? Can we avoid identifying time in the +computer with time in the modeled world? Must we make the model +change with time in order to model phenomena in a changing world? +Think about the issue in terms of mathematical functions. We can +describe the time-varying behavior of a quantity x as a function of +time x(t). If we concentrate on x instant by instant, we think of +it as a changing quantity. Yet if we concentrate on the entire +time history of values, we do not emphasize change -- the function +itself does not change.52

                                                                                    + +If time is measured in discrete steps, then we can model a time function as +a (possibly infinite) sequence. In this section, we will see how to +model change in terms of sequences that represent the time histories +of the systems being modeled. To accomplish this, we introduce new +data structures called streams. From an abstract point of view, +a stream is simply a sequence. However, we will find that the +straightforward implementation of streams as lists (as in +section 2.2.1) doesn't fully reveal +the power of stream processing. As an alternative, we introduce the +technique of delayed evaluation, which enables us to represent +very large (even infinite) sequences as streams.

                                                                                    + +Stream processing lets us model systems that have state without ever +using assignment or mutable data. This has important implications, +both theoretical and practical, because we can build models that avoid +the drawbacks inherent in introducing assignment. On the other hand, +the stream framework raises difficulties of its own, and the question +of which modeling technique leads to more modular and more easily +maintained systems remains open.

                                                                                    + + +

                                                                                    3.5.1  Streams Are Delayed Lists

                                                                                    + + + +As we saw in section 2.2.3, +sequences can serve as standard interfaces for combining program +modules. We formulated powerful abstractions for manipulating +sequences, such as map, filter, and accumulate, that +capture a wide variety of operations in a manner that is both succinct +and elegant.

                                                                                    + +Unfortunately, if we represent sequences as lists, this elegance is +bought at the price of severe inefficiency with respect to both the +time and space required by our computations. +When we represent manipulations on sequences as transformations +of lists, our programs must construct and copy data structures (which +may be huge) at every step of a process.

                                                                                    + +To see why this is true, let us compare two programs for computing the +sum of all the prime numbers in an interval. The first program is +written in standard iterative style:53

                                                                                    + +

                                                                                    (define (sum-primes a b)
                                                                                    +  (define (iter count accum)
                                                                                    +    (cond ((> count b) accum)
                                                                                    +          ((prime? count) (iter (+ count 1) (+ count accum)))
                                                                                    +          (else (iter (+ count 1) accum))))
                                                                                    +  (iter a 0))
                                                                                    +

                                                                                    +The second program performs the same computation using the sequence +operations of section 2.2.3:

                                                                                    + +

                                                                                    (define (sum-primes a b)
                                                                                    +  (accumulate +
                                                                                    +              0
                                                                                    +              (filter prime? (enumerate-interval a b))))
                                                                                    +

                                                                                    + +In carrying out the computation, the first program needs to store only +the sum being accumulated. In contrast, the filter in the second +program cannot do any testing until enumerate-interval has +constructed a complete list of the numbers in the interval. The +filter generates another list, which in turn is passed to accumulate before being collapsed to form a sum. Such large +intermediate storage is not needed by the first program, which we can +think of as enumerating the interval incrementally, adding each prime +to the sum as it is generated.

                                                                                    + + +The inefficiency in using lists becomes painfully apparent if we use +the sequence paradigm to compute the second prime in the interval from +10,000 to 1,000,000 by evaluating the expression

                                                                                    + +

                                                                                    (car (cdr (filter prime?
                                                                                    +                  (enumerate-interval 10000 1000000))))
                                                                                    +

                                                                                    +This expression does find the second prime, but the computational +overhead is outrageous. We construct a list of almost a million +integers, filter this list by testing each element for primality, and +then ignore almost all of the result. In a more traditional +programming style, we would interleave the enumeration and the +filtering, and stop when we reached the second prime.

                                                                                    + + +Streams are a clever idea that allows one to use sequence +manipulations without incurring the costs of manipulating sequences as +lists. With streams we can achieve the best of both worlds: We can +formulate programs elegantly as sequence manipulations, while attaining the +efficiency of incremental computation. The basic idea is to arrange +to construct a stream only partially, and to pass the partial +construction to the program that consumes the stream. If the consumer +attempts to access a part of the stream that has not yet been +constructed, the stream will automatically construct just enough more +of itself to produce the required part, thus preserving the illusion +that the entire stream exists. In other words, although we will write +programs as if we were processing complete sequences, we design our +stream implementation to automatically and transparently interleave +the construction of the stream with its use.

                                                                                    + +On the surface, streams are just lists with different names for the +procedures that manipulate them. There is a constructor, +cons-stream, and two selectors, stream-car and stream-cdr, which satisfy the constraints +

                                                                                    +There is a distinguishable object, the-empty-stream, which +cannot be the result of any cons-stream operation, and which can +be identified with the predicate stream-null?.54 +Thus we can make and use streams, in just the same way as we can make +and use lists, to represent aggregate data arranged in a sequence. In +particular, we can build stream analogs of the list operations from +chapter 2, such as list-ref, map, and for-each:55 +

                                                                                    (define (stream-ref s n)
                                                                                    +  (if (= n 0)
                                                                                    +      (stream-car s)
                                                                                    +      (stream-ref (stream-cdr s) (- n 1))))
                                                                                    +(define (stream-map proc s)
                                                                                    +  (if (stream-null? s)
                                                                                    +      the-empty-stream
                                                                                    +      (cons-stream (proc (stream-car s))
                                                                                    +                   (stream-map proc (stream-cdr s)))))
                                                                                    +(define (stream-for-each proc s)
                                                                                    +  (if (stream-null? s)
                                                                                    +      'done
                                                                                    +      (begin (proc (stream-car s))
                                                                                    +             (stream-for-each proc (stream-cdr s)))))
                                                                                    +

                                                                                    +Stream-for-each is useful for viewing streams: +

                                                                                    (define (display-stream s)
                                                                                    +  (stream-for-each display-line s))
                                                                                    +
                                                                                    +(define (display-line x)
                                                                                    +  (newline)
                                                                                    +  (display x))
                                                                                    +

                                                                                    + +To make the stream implementation automatically and transparently +interleave the construction of a stream with its use, we will arrange +for the cdr of a stream to be evaluated when it is accessed by +the stream-cdr procedure rather than when the stream is +constructed by cons-stream. This implementation choice is +reminiscent of our discussion of rational numbers in +section 2.1.2, where we saw that we can +choose to implement rational numbers so that the reduction of +numerator and denominator to lowest terms is performed either at +construction time or at selection time. The two rational-number +implementations produce the same data abstraction, but the choice has +an effect on efficiency. There is a similar relationship between +streams and ordinary lists. As a data abstraction, streams are the +same as lists. The difference is the time at which the elements are +evaluated. With ordinary lists, both the car and the cdr +are evaluated at construction time. With streams, the cdr is +evaluated at selection time.

                                                                                    + +Our implementation of streams will be based on a special form called +delay. Evaluating (delay <exp>) does not +evaluate the expression <exp>, but rather returns a so-called delayed object, which we can think of as a ``promise'' to evaluate +<exp> at some future time. As a companion to delay, there is +a procedure called force that takes a delayed object as +argument and performs the evaluation -- in effect, forcing the +delay to fulfill its promise. We will see below how delay +and force can be implemented, but first let us use these to +construct streams.

                                                                                    + +Cons-stream is a special form defined so that

                                                                                    + + +

                                                                                    (cons-stream <a> <b>)
                                                                                    +

                                                                                    +is equivalent to

                                                                                    + + +

                                                                                    (cons <a> (delay <b>))
                                                                                    +

                                                                                    +What this means is that we will construct streams using pairs. However, +rather than placing the value of the rest of the stream +into the cdr of the +pair we will put there a promise to compute the rest if it is ever +requested. Stream-car and stream-cdr can now be defined as +procedures:

                                                                                    + +

                                                                                    (define (stream-car stream) (car stream))
                                                                                    +
                                                                                    +(define (stream-cdr stream) (force (cdr stream)))
                                                                                    +

                                                                                    +Stream-car selects the car of the pair; stream-cdr +selects the cdr of the pair and evaluates the delayed expression +found there to obtain the rest of the stream.56 + + +

                                                                                    The stream implementation in action

                                                                                    + +To see how this implementation behaves, let us analyze the +``outrageous'' prime computation we saw above, reformulated in terms +of streams:

                                                                                    + +

                                                                                    (stream-car
                                                                                    + (stream-cdr
                                                                                    +  (stream-filter prime?
                                                                                    +                 (stream-enumerate-interval 10000 1000000))))
                                                                                    +

                                                                                    +We will see that it does indeed work efficiently.

                                                                                    + + +We begin by calling stream-enumerate-interval with +the arguments 10,000 and 1,000,000. Stream-enumerate-interval +is the stream analog of enumerate-interval +(section 2.2.3):

                                                                                    + +

                                                                                    (define (stream-enumerate-interval low high)
                                                                                    +  (if (> low high)
                                                                                    +      the-empty-stream
                                                                                    +      (cons-stream
                                                                                    +       low
                                                                                    +       (stream-enumerate-interval (+ low 1) high))))
                                                                                    +

                                                                                    +and thus the result returned by stream-enumerate-interval, +formed by the cons-stream, is57

                                                                                    + + +

                                                                                    (cons 10000
                                                                                    +      (delay (stream-enumerate-interval 10001 1000000)))
                                                                                    +

                                                                                    + +That is, stream-enumerate-interval +returns a stream represented as a pair whose car +is 10,000 and whose cdr is a promise to enumerate more of the +interval if so requested. This stream is now filtered for primes, +using the stream analog of the filter procedure +(section 2.2.3):

                                                                                    + + +

                                                                                    (define (stream-filter pred stream)
                                                                                    +  (cond ((stream-null? stream) the-empty-stream)
                                                                                    +        ((pred (stream-car stream))
                                                                                    +         (cons-stream (stream-car stream)
                                                                                    +                      (stream-filter pred
                                                                                    +                                     (stream-cdr stream))))
                                                                                    +        (else (stream-filter pred (stream-cdr stream)))))
                                                                                    +

                                                                                    +Stream-filter tests the stream-car of the stream (the car of the pair, which is 10,000). Since this is not prime, +stream-filter examines the stream-cdr of its input +stream. The call to stream-cdr forces evaluation of the delayed +stream-enumerate-interval, which now returns

                                                                                    + + +

                                                                                    (cons 10001
                                                                                    +      (delay (stream-enumerate-interval 10002 1000000)))
                                                                                    +

                                                                                    +Stream-filter now looks at the stream-car of this stream, +10,001, sees that this is not prime either, forces another stream-cdr, and so on, until stream-enumerate-interval yields +the prime 10,007, whereupon stream-filter, according to its +definition, returns

                                                                                    + + +

                                                                                    (cons-stream (stream-car stream)
                                                                                    +             (stream-filter pred (stream-cdr stream)))
                                                                                    +

                                                                                    +which in this case is

                                                                                    + + +

                                                                                    (cons 10007
                                                                                    +      (delay
                                                                                    +        (stream-filter
                                                                                    +         prime?
                                                                                    +         (cons 10008
                                                                                    +               (delay
                                                                                    +                 (stream-enumerate-interval 10009
                                                                                    +                                            1000000))))))
                                                                                    +

                                                                                    +This result is now passed to stream-cdr in our +original expression. This forces the delayed stream-filter, which in turn keeps forcing the delayed stream-enumerate-interval until it finds the next prime, which is +10,009. Finally, the result passed to stream-car in our +original expression is

                                                                                    + +

                                                                                    (cons 10009
                                                                                    +      (delay
                                                                                    +        (stream-filter
                                                                                    +         prime?
                                                                                    +         (cons 10010
                                                                                    +               (delay
                                                                                    +                 (stream-enumerate-interval 10011
                                                                                    +                                            1000000))))))
                                                                                    +

                                                                                    +Stream-car returns 10,009, and the computation is complete. Only as +many integers were tested for primality as were necessary to find the +second prime, and the interval was enumerated only as far as was +necessary to feed the prime filter.

                                                                                    + +In general, we can think of delayed evaluation as ``demand-driven'' +programming, whereby each stage in the stream process is activated +only enough to satisfy the next stage. What we have done is to +decouple the actual order of events in the computation from the +apparent structure of our procedures. We write procedures as if the +streams existed ``all at once'' when, in reality, the computation is +performed incrementally, as in traditional programming styles.

                                                                                    + + +

                                                                                    Implementing delay and force

                                                                                    + +Although delay and force may seem like mysterious +operations, their implementation is really quite straightforward. +Delay must package an expression so that it can be evaluated +later on demand, and we can accomplish this simply by treating the +expression as the body of a procedure. Delay can be a special +form such that

                                                                                    + +

                                                                                    (delay <exp>)
                                                                                    +

                                                                                    +is syntactic sugar for

                                                                                    + +

                                                                                    (lambda () <exp>)
                                                                                    +

                                                                                    +Force simply calls the procedure (of no +arguments) produced by delay, so we can implement force as +a procedure:

                                                                                    + +

                                                                                    (define (force delayed-object)
                                                                                    +  (delayed-object))
                                                                                    +

                                                                                    + +This implementation suffices for delay and force to work +as advertised, but there is an important optimization that we can +include. In many applications, we end up forcing the same delayed object +many times. This can lead to serious inefficiency in recursive +programs involving streams. (See +exercise 3.57.) The solution is to build +delayed objects so that the first time they are forced, they store the +value that is computed. Subsequent forcings will simply return the +stored value without repeating the computation. In other words, we +implement delay as a special-purpose memoized procedure similar +to the one described in exercise 3.27. One way to +accomplish this is to use the following procedure, which takes as +argument a procedure (of no arguments) and returns a memoized version +of the procedure. The first time the memoized procedure is run, it +saves the computed result. On subsequent evaluations, it simply +returns the result.

                                                                                    + +

                                                                                    (define (memo-proc proc)
                                                                                    +  (let ((already-run? false) (result false))
                                                                                    +    (lambda ()
                                                                                    +      (if (not already-run?)
                                                                                    +          (begin (set! result (proc))
                                                                                    +                 (set! already-run? true)
                                                                                    +                 result)
                                                                                    +          result))))
                                                                                    +

                                                                                    +Delay is then defined so that (delay <exp>) is +equivalent to

                                                                                    + +

                                                                                    (memo-proc (lambda () <exp>))
                                                                                    +

                                                                                    +and force is as defined previously.58

                                                                                    + +

                                                                                    +Exercise 3.50.  Complete the following definition, which +generalizes stream-map to allow procedures that +take multiple arguments, analogous to map in +section 2.2.3, footnote 12.

                                                                                    + +

                                                                                    (define (stream-map proc . argstreams)
                                                                                    +  (if (<??> (car argstreams))
                                                                                    +      the-empty-stream
                                                                                    +      (<??>
                                                                                    +       (apply proc (map <??> argstreams))
                                                                                    +       (apply stream-map
                                                                                    +              (cons proc (map <??> argstreams))))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.51.  In order to take a closer look at delayed evaluation, we will use the +following procedure, which simply returns its argument after printing it:

                                                                                    + + +

                                                                                    (define (show x)
                                                                                    +  (display-line x)
                                                                                    +  x)
                                                                                    +

                                                                                    +What does the interpreter print in response to evaluating each +expression in the following sequence?59

                                                                                    + + +

                                                                                    (define x (stream-map show (stream-enumerate-interval 0 10)))
                                                                                    +(stream-ref x 5)
                                                                                    +(stream-ref x 7)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.52.  Consider the sequence of expressions

                                                                                    + + +

                                                                                    (define sum 0)
                                                                                    +(define (accum x)
                                                                                    +  (set! sum (+ x sum))
                                                                                    +  sum)
                                                                                    +(define seq (stream-map accum (stream-enumerate-interval 1 20)))
                                                                                    +(define y (stream-filter even? seq))
                                                                                    +(define z (stream-filter (lambda (x) (= (remainder x 5) 0))
                                                                                    +                         seq))
                                                                                    +(stream-ref y 7)
                                                                                    +(display-stream z)
                                                                                    +

                                                                                    +What is the value of sum after each of the above expressions is +evaluated? What is the printed response to evaluating the stream-ref and display-stream expressions? Would these responses +differ if we had implemented (delay <exp>) simply as +(lambda () <exp>) without using the optimization provided by +memo-proc ? Explain. + +

                                                                                    + + +

                                                                                    3.5.2  Infinite Streams

                                                                                    + + + +We have seen how to support the illusion of manipulating streams +as complete entities even though, in actuality, we compute only +as much of the stream as we need to access. We can exploit this +technique to represent sequences efficiently as streams, even if the +sequences are very long. What is more striking, we can use streams to +represent sequences that are infinitely long. For instance, consider +the following definition of the stream of positive integers:

                                                                                    + +

                                                                                    (define (integers-starting-from n)
                                                                                    +  (cons-stream n (integers-starting-from (+ n 1))))
                                                                                    +
                                                                                    +(define integers (integers-starting-from 1))
                                                                                    +

                                                                                    +This makes sense because integers will be a pair whose car +is 1 and whose cdr is a promise to produce the integers +beginning with 2. This is an infinitely long stream, but in any given +time we can examine only a finite portion of it. Thus, our programs +will never know that the entire infinite stream is not there.

                                                                                    + +Using integers we can define other infinite streams, such as +the stream of integers that are not divisible by 7:

                                                                                    + +

                                                                                    (define (divisible? x y) (= (remainder x y) 0))
                                                                                    +(define no-sevens
                                                                                    +  (stream-filter (lambda (x) (not (divisible? x 7)))
                                                                                    +                 integers))
                                                                                    +

                                                                                    +Then we can find integers not divisible by 7 simply by accessing +elements of this stream:

                                                                                    + +

                                                                                    (stream-ref no-sevens 100)
                                                                                    +117
                                                                                    +

                                                                                    +

                                                                                    + +In analogy with integers, we can define the infinite stream of +Fibonacci numbers:

                                                                                    + +

                                                                                    (define (fibgen a b)
                                                                                    +  (cons-stream a (fibgen b (+ a b))))
                                                                                    +(define fibs (fibgen 0 1))
                                                                                    +

                                                                                    +Fibs is a pair whose car is 0 and whose cdr is a +promise to evaluate (fibgen 1 1). When we evaluate this delayed +(fibgen 1 1), it +will produce a pair whose car is 1 and whose cdr is a +promise to evaluate (fibgen 1 2), and so on.

                                                                                    + +For a look at a more exciting infinite stream, we can generalize the +no-sevens example to construct the infinite stream of prime +numbers, using a method known as the sieve of +Eratosthenes.60 We +start with the integers beginning with 2, which is the first prime. +To get the rest of the primes, we start by filtering the multiples of +2 from the rest of the integers. This leaves a stream beginning with +3, which is the next prime. Now we filter the multiples of 3 from the +rest of this stream. This leaves a stream beginning with 5, which is +the next prime, and so on. In other words, we construct the primes by +a sieving process, described as follows: To sieve a stream S, +form a stream whose first element is the first element of S and +the rest of which is obtained by filtering all multiples of the first element +of S out of the rest of S and sieving the result. This +process is readily described in terms of stream operations:

                                                                                    + +

                                                                                    (define (sieve stream)
                                                                                    +  (cons-stream
                                                                                    +   (stream-car stream)
                                                                                    +   (sieve (stream-filter
                                                                                    +           (lambda (x)
                                                                                    +             (not (divisible? x (stream-car stream))))
                                                                                    +           (stream-cdr stream)))))
                                                                                    +
                                                                                    +(define primes (sieve (integers-starting-from 2)))
                                                                                    +

                                                                                    +Now to find a particular prime we need only ask for it:

                                                                                    + +

                                                                                    (stream-ref primes 50)
                                                                                    +233
                                                                                    +

                                                                                    + +It is interesting to contemplate the signal-processing system set up +by sieve, shown in the ``Henderson diagram'' in +figure 3.31.61 +The input stream feeds into an +``unconser'' that separates the first element of the stream from the +rest of the stream. +The first element is used to construct a divisibility filter, through +which the rest is passed, and the output of the filter is fed to +another sieve box. Then the original first element is consed onto the +output of the internal sieve to form the output stream. Thus, not +only is the stream infinite, but the signal processor is also +infinite, because the sieve contains a sieve within it.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.31:  The prime sieve viewed as a signal-processing system.
                                                                                    + +

                                                                                    + + +

                                                                                    Defining streams implicitly

                                                                                    + + +The integers and fibs streams above were defined by +specifying ``generating'' procedures that explicitly compute the +stream elements one by one. An alternative way to specify streams is +to take advantage of delayed evaluation to define streams implicitly. +For example, the following expression defines the stream ones to +be an infinite stream of ones:

                                                                                    + +

                                                                                    (define ones (cons-stream 1 ones))
                                                                                    +

                                                                                    +This works much like the definition of a recursive procedure: ones is a pair whose car is 1 and whose cdr is a promise +to evaluate ones. Evaluating the cdr gives us again a 1 +and a promise to evaluate ones, and so on.

                                                                                    + +We can do more interesting things by manipulating streams with +operations such as add-streams, which produces the elementwise +sum of two given streams:62

                                                                                    + +

                                                                                    (define (add-streams s1 s2)
                                                                                    +  (stream-map + s1 s2))
                                                                                    +

                                                                                    +Now we can define the integers as follows:

                                                                                    + +

                                                                                    (define integers (cons-stream 1 (add-streams ones integers)))
                                                                                    +

                                                                                    +This defines integers to be a stream whose first element is 1 +and the rest of which is the sum of ones and integers. Thus, the +second element of integers is 1 plus the first element of integers, +or 2; the third element of integers is 1 plus the second +element of integers, or 3; and so on. This definition works +because, at any point, enough of the integers stream has been +generated so that we can feed it back into the definition to produce +the next integer.

                                                                                    + +We can define the Fibonacci numbers in the same style:

                                                                                    + +

                                                                                    (define fibs
                                                                                    +  (cons-stream 0
                                                                                    +               (cons-stream 1
                                                                                    +                            (add-streams (stream-cdr fibs)
                                                                                    +                                         fibs))))
                                                                                    +

                                                                                    +This definition says that fibs is a stream beginning with 0 and +1, such that the rest of the stream can be generated by adding fibs +to itself shifted by one place:

                                                                                    + + + + +
                                                                                    1 1 2 3 5 8 13 21 ... = (stream-cdr fibs)
                                                                                    0 1 1 2 3 5 8 13 ... = fibs
                                                                                    0 1 1 2 3 5 8 13 21 34 ... = fibs

                                                                                    + +Scale-stream is another useful procedure in formulating such stream definitions. +This multiplies each item in a stream by a given +constant:

                                                                                    + +

                                                                                    (define (scale-stream stream factor)
                                                                                    +  (stream-map (lambda (x) (* x factor)) stream))
                                                                                    +

                                                                                    +For example,

                                                                                    + +

                                                                                    (define double (cons-stream 1 (scale-stream double 2)))
                                                                                    +

                                                                                    +produces the stream of powers of 2: 1, 2, 4, 8, 16, 32, ....

                                                                                    + +An alternate definition of the stream of primes can be given by +starting with the integers and filtering them by testing for +primality. We will need the first prime, 2, to get started:

                                                                                    + +

                                                                                    (define primes
                                                                                    +  (cons-stream
                                                                                    +   2
                                                                                    +   (stream-filter prime? (integers-starting-from 3))))
                                                                                    +

                                                                                    +This definition is not so straightforward as it appears, because we +will test whether a number n is prime by checking whether n is +divisible by a prime (not by just any integer) less than or equal to +n:

                                                                                    + +

                                                                                    (define (prime? n)
                                                                                    +  (define (iter ps)
                                                                                    +    (cond ((> (square (stream-car ps)) n) true)
                                                                                    +          ((divisible? n (stream-car ps)) false)
                                                                                    +          (else (iter (stream-cdr ps)))))
                                                                                    +  (iter primes))
                                                                                    +

                                                                                    +This is a recursive definition, since primes is defined in terms +of the prime? predicate, which itself uses the primes +stream. The reason this procedure works is that, at any point, enough +of the primes stream has been generated to test the primality of +the numbers we need to check next. That is, for every n we test for +primality, either n is not prime (in which case there is a prime +already generated that divides it) or n is prime (in which case +there is a prime already generated -- i.e., a prime less than +n -- that is greater than n).63 + +

                                                                                    +Exercise 3.53.  Without running the program, describe the elements of the +stream defined by +

                                                                                    (define s (cons-stream 1 (add-streams s s)))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.54.  Define a procedure mul-streams, analogous to add-streams, +that produces the elementwise product of its two input streams. +Use this together with the stream of integers to complete the +following definition of the stream whose nth element (counting from 0) +is n + 1 factorial: + +

                                                                                    (define factorials (cons-stream 1 (mul-streams <??> <??>)))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.55.  Define a procedure partial-sums that takes as argument a +stream S and returns the stream whose +elements are S0, S0 + S1, S0 + S1 + S2, .... For example, (partial-sums integers) should be the stream +1, 3, 6, 10, 15, .... + +

                                                                                    + + +

                                                                                    +Exercise 3.56.  A famous problem, first raised by R. Hamming, is to enumerate, in +ascending order with no repetitions, all positive integers with no +prime factors other than 2, 3, or 5. One obvious way to do this is to +simply test each integer in turn to see whether it has any factors +other than 2, 3, and 5. But this is very inefficient, since, as the +integers get larger, fewer and fewer of them fit the requirement. As +an alternative, let us call the required stream of numbers S and +notice the following facts about it. +

                                                                                      +
                                                                                    • S begins with 1.

                                                                                      + +

                                                                                    • The elements of (scale-stream S 2) are also +elements of S.

                                                                                      + +

                                                                                    • The same is true for (scale-stream S 3) +and (scale-stream 5 S).

                                                                                      + +

                                                                                    • These are all the elements of S. +

                                                                                    + +Now all we have to do is combine elements from these sources. +For this we define a procedure merge that combines two ordered +streams into one ordered result stream, eliminating repetitions:

                                                                                    + + +

                                                                                    (define (merge s1 s2)
                                                                                    +  (cond ((stream-null? s1) s2)
                                                                                    +        ((stream-null? s2) s1)
                                                                                    +        (else
                                                                                    +         (let ((s1car (stream-car s1))
                                                                                    +               (s2car (stream-car s2)))
                                                                                    +           (cond ((< s1car s2car)
                                                                                    +                  (cons-stream s1car (merge (stream-cdr s1) s2)))
                                                                                    +                 ((> s1car s2car)
                                                                                    +                  (cons-stream s2car (merge s1 (stream-cdr s2))))
                                                                                    +                 (else
                                                                                    +                  (cons-stream s1car
                                                                                    +                               (merge (stream-cdr s1)
                                                                                    +                                      (stream-cdr s2)))))))))
                                                                                    +

                                                                                    +Then the required stream may be constructed with merge, as +follows:

                                                                                    + + +

                                                                                    (define S (cons-stream 1 (merge <??> <??>)))
                                                                                    +

                                                                                    +Fill in the missing expressions in the places marked <??> above. + +

                                                                                    + +

                                                                                    +Exercise 3.57.  How many additions are performed when we compute the nth Fibonacci +number using the definition of fibs based on the add-streams procedure? Show that the number of additions would be +exponentially greater if we had implemented +(delay <exp>) simply as (lambda () <exp>), +without using the optimization provided by the memo-proc +procedure described in section 3.5.1.64 + +

                                                                                    + +

                                                                                    +Exercise 3.58.  Give an interpretation of the stream computed by the following +procedure:

                                                                                    + +

                                                                                    (define (expand num den radix)
                                                                                    +  (cons-stream
                                                                                    +   (quotient (* num radix) den)
                                                                                    +   (expand (remainder (* num radix) den) den radix)))
                                                                                    +

                                                                                    +(Quotient is a primitive that returns the integer quotient of +two integers.) What are the successive elements produced by (expand 1 7 10) ? What is produced by (expand 3 8 10) ? +

                                                                                    + + +

                                                                                    +Exercise 3.59.  In section 2.5.3 we saw how to implement a +polynomial arithmetic system representing polynomials as lists of +terms. In a similar way, we can work with power series, such as

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +represented as infinite streams. +We will represent the series +a0 + a1 x + a2 x2 + a3 x3 + ··· +as the stream whose elements are the coefficients a0, a1, a2, a3, ....

                                                                                    + +

                                                                                    a. The integral of the series a0 + a1 x + a2 x2 + a3 x3 + ··· +is the series +

                                                                                    +where c is any constant. +Define a procedure integrate-series that takes as input a stream +a0, a1, a2, ... representing a power series and returns the stream +a0, (1/2)a1, (1/3)a2, ... of coefficients of +the non-constant terms of the integral of the series. +(Since the result has no constant term, it doesn't represent a power +series; when we use integrate-series, we will cons on +the appropriate constant.)

                                                                                    + +

                                                                                    b. The function x ex is its own +derivative. This implies that ex and the integral of ex are the +same series, except for the constant term, which is e0 = 1. +Accordingly, we can generate the series for +ex as +

                                                                                    (define exp-series
                                                                                    +  (cons-stream 1 (integrate-series exp-series)))
                                                                                    +

                                                                                    +Show how to generate the series for sine and cosine, starting from the facts +that the derivative of sine is cosine and the derivative of cosine is +the negative of sine: +

                                                                                    (define cosine-series
                                                                                    +  (cons-stream 1 <??>))
                                                                                    +(define sine-series
                                                                                    +  (cons-stream 0 <??>))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.60.  With power series represented as streams of coefficients as in +exercise 3.59, adding series is implemented by add-streams. Complete the definition of the following procedure for +multiplying series: +

                                                                                    (define (mul-series s1 s2)
                                                                                    +  (cons-stream <??> (add-streams <??> <??>)))
                                                                                    +

                                                                                    +You can test your procedure by verifying that +sin2 x + cos2 x = 1, using the series from exercise 3.59. + +

                                                                                    + +

                                                                                    +Exercise 3.61.  Let S be a power series (exercise 3.59) +whose constant term is 1. Suppose we want +to find the power series 1/S, that is, the series X such that +S · X = 1. Write S = 1 + SR where SR is the part of S after +the constant term. Then we can solve for X as follows: +

                                                                                    +In other words, X is the power series whose constant term is 1 and +whose higher-order terms are given by the negative of SR times X. +Use this idea to write a procedure invert-unit-series that computes 1/S for a power series S with +constant term 1. +You will need to use mul-series from exercise 3.60. + +

                                                                                    + + +

                                                                                    +Exercise 3.62.  Use the results of exercises 3.60 +and 3.61 to define a procedure div-series +that divides two power series. Div-series should work for any +two series, provided that the denominator series begins with a +nonzero constant term. (If the denominator has a zero constant term, +then div-series should signal an error.) +Show how to use div-series +together with the result of exercise 3.59 to generate +the power series for tangent. +

                                                                                    + + +

                                                                                    3.5.3  Exploiting the Stream Paradigm

                                                                                    + +

                                                                                    + +Streams with delayed evaluation can be a powerful modeling tool, +providing many of the benefits of local state and assignment. +Moreover, they avoid some of the theoretical tangles that accompany +the introduction of assignment into a programming language.

                                                                                    + +The stream approach can be illuminating because it allows us to build +systems with different module boundaries than systems organized around +assignment to state variables. For example, we can think of an entire +time series (or signal) as a focus of interest, rather than the values +of the state variables at individual moments. This makes it +convenient to combine and compare components of state from different +moments.

                                                                                    + + +

                                                                                    Formulating iterations as stream processes

                                                                                    + + +In section 1.2.1, we introduced iterative +processes, which proceed by updating state variables. We know now +that we can represent state as a ``timeless'' stream of values rather +than as a set of variables to be updated. Let's adopt this +perspective in revisiting the square-root procedure from +section 1.1.7. Recall that the idea is to generate a +sequence of better and better guesses for the square root of x by +applying over and over again the procedure that improves guesses:

                                                                                    + +

                                                                                    (define (sqrt-improve guess x)
                                                                                    +  (average guess (/ x guess)))
                                                                                    +

                                                                                    + +In our original sqrt procedure, we made these guesses be the +successive values of a state variable. Instead we can generate the +infinite stream of guesses, starting with an initial guess of 1:65

                                                                                    + +

                                                                                    (define (sqrt-stream x)
                                                                                    +  (define guesses
                                                                                    +    (cons-stream 1.0
                                                                                    +                 (stream-map (lambda (guess)
                                                                                    +                               (sqrt-improve guess x))
                                                                                    +                             guesses)))
                                                                                    +  guesses)
                                                                                    +(display-stream (sqrt-stream 2))
                                                                                    +1.
                                                                                    +1.5
                                                                                    +1.4166666666666665
                                                                                    +1.4142156862745097
                                                                                    +1.4142135623746899
                                                                                    +...

                                                                                    +We can generate more and more terms of the stream to get better and +better guesses. If we like, we can write a procedure that keeps +generating terms until the answer is good enough. (See +exercise 3.64.)

                                                                                    + +Another iteration that we can treat in the same way is to generate an +approximation to , based upon the alternating series that we saw +in section 1.3.1:

                                                                                    + +

                                                                                    + + +We first generate the stream of summands of the series (the reciprocals +of the odd integers, with alternating signs). Then we take the stream +of sums of more and more terms (using the partial-sums procedure +of exercise 3.55) and scale the result by 4: + +

                                                                                    (define (pi-summands n)
                                                                                    +  (cons-stream (/ 1.0 n)
                                                                                    +               (stream-map - (pi-summands (+ n 2)))))
                                                                                    +(define pi-stream
                                                                                    +  (scale-stream (partial-sums (pi-summands 1)) 4))
                                                                                    +(display-stream pi-stream)
                                                                                    +4.
                                                                                    +2.666666666666667
                                                                                    +3.466666666666667
                                                                                    +2.8952380952380956
                                                                                    +3.3396825396825403
                                                                                    +2.9760461760461765
                                                                                    +3.2837384837384844
                                                                                    +3.017071817071818
                                                                                    +...

                                                                                    +This gives us a stream of better and better approximations to , +although the approximations converge rather slowly. Eight terms of +the sequence bound the value of between 3.284 and 3.017.

                                                                                    + +So far, our use of the stream of states approach is not much different +from updating state variables. But streams give us an opportunity to +do some interesting tricks. For example, we can transform a stream +with a sequence accelerator that converts a sequence of +approximations to a new sequence that converges to the same value as +the original, only faster.

                                                                                    + +One such accelerator, due to the eighteenth-century Swiss mathematician +Leonhard Euler, works well with sequences that are partial sums of +alternating series (series of terms with alternating signs). +In Euler's technique, if Sn is the nth term +of the original sum sequence, then the accelerated sequence has terms +

                                                                                    +Thus, if the original sequence is represented as a stream of values, +the transformed sequence is given by

                                                                                    + +

                                                                                    (define (euler-transform s)
                                                                                    +  (let ((s0 (stream-ref s 0))           Sn-1
                                                                                    +        (s1 (stream-ref s 1))           Sn
                                                                                    +        (s2 (stream-ref s 2)))          Sn+1
                                                                                    +    (cons-stream (- s2 (/ (square (- s2 s1))
                                                                                    +                          (+ s0 (* -2 s1) s2)))
                                                                                    +                 (euler-transform (stream-cdr s)))))
                                                                                    +

                                                                                    + +We can demonstrate Euler acceleration with our sequence of +approximations to :

                                                                                    + +

                                                                                    (display-stream (euler-transform pi-stream))
                                                                                    +3.166666666666667
                                                                                    +3.1333333333333337
                                                                                    +3.1452380952380956
                                                                                    +3.13968253968254
                                                                                    +3.1427128427128435
                                                                                    +3.1408813408813416
                                                                                    +3.142071817071818
                                                                                    +3.1412548236077655
                                                                                    +...

                                                                                    + +Even better, we can accelerate the accelerated sequence, and +recursively accelerate that, and so on. Namely, we create a stream of +streams (a structure we'll call a tableau) in which each stream +is the transform of the preceding one:

                                                                                    + +

                                                                                    (define (make-tableau transform s)
                                                                                    +  (cons-stream s
                                                                                    +               (make-tableau transform
                                                                                    +                             (transform s))))
                                                                                    +

                                                                                    +The tableau has the form

                                                                                    + +

                                                                                    +Finally, we form a sequence by taking the first term in each row of +the tableau:

                                                                                    + +

                                                                                    (define (accelerated-sequence transform s)
                                                                                    +  (stream-map stream-car
                                                                                    +              (make-tableau transform s)))
                                                                                    +

                                                                                    + +We can demonstrate this kind of ``super-acceleration'' of the +sequence:

                                                                                    + +

                                                                                    (display-stream (accelerated-sequence euler-transform
                                                                                    +                                      pi-stream))
                                                                                    +4.
                                                                                    +3.166666666666667
                                                                                    +3.142105263157895
                                                                                    +3.141599357319005
                                                                                    +3.1415927140337785
                                                                                    +3.1415926539752927
                                                                                    +3.1415926535911765
                                                                                    +3.141592653589778
                                                                                    +...

                                                                                    +The result is impressive. Taking eight terms of the sequence yields +the correct value of to 14 decimal places. If we had used only +the original sequence, we would need to compute on the order of +1013 terms (i.e., expanding the series far enough so that the +individual terms are less then 10-13) to get that much accuracy! + +We could have implemented these acceleration techniques without +using streams. But the stream formulation is particularly elegant and +convenient because the entire sequence of states is available to us as a +data structure that can be manipulated with a uniform set of +operations.

                                                                                    + +

                                                                                    +Exercise 3.63.  Louis Reasoner asks why the sqrt-stream procedure was not +written in the following more straightforward way, without +the local variable guesses: +

                                                                                    (define (sqrt-stream x)
                                                                                    +  (cons-stream 1.0
                                                                                    +               (stream-map (lambda (guess)
                                                                                    +                             (sqrt-improve guess x))
                                                                                    +                           (sqrt-stream x))))
                                                                                    +

                                                                                    +Alyssa P. Hacker replies that this version of the procedure is +considerably less efficient because it performs redundant computation. +Explain Alyssa's answer. Would the two versions still differ in +efficiency if our implementation of delay used only (lambda +() <exp>) without using the optimization provided by memo-proc (section 3.5.1)? + +

                                                                                    + +

                                                                                    +Exercise 3.64.  Write a procedure stream-limit that takes as arguments a stream +and a number (the tolerance). It should examine the stream until it +finds two successive elements that differ in absolute value by less +than the tolerance, and return the second of the two elements. Using +this, we could compute square roots up to a given tolerance by +

                                                                                    (define (sqrt x tolerance)
                                                                                    +  (stream-limit (sqrt-stream x) tolerance))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.65.  Use the series +

                                                                                    +to compute three sequences of approximations to the natural logarithm of 2, +in the same way we did above for . +How rapidly do these sequences converge? +

                                                                                    + + +

                                                                                    Infinite streams of pairs

                                                                                    + + +In section 2.2.3, we saw how the sequence paradigm +handles traditional nested loops as processes defined on sequences of +pairs. If we generalize this technique to infinite streams, then we +can write programs that are not easily represented as loops, because +the ``looping'' must range over an infinite set.

                                                                                    + +For example, suppose we want to generalize the prime-sum-pairs +procedure of section 2.2.3 to produce the stream +of pairs of all integers (i,j) with i < j such that i + j +is prime. If int-pairs is the sequence of all pairs of integers (i,j) +with i < j, then our required stream is simply66

                                                                                    + +

                                                                                    (stream-filter (lambda (pair)
                                                                                    +                 (prime? (+ (car pair) (cadr pair))))
                                                                                    +               int-pairs)
                                                                                    +

                                                                                    + +Our problem, then, is to produce the stream int-pairs. More +generally, suppose we have two streams S = (Si) and T = (Tj), +and imagine the infinite rectangular array +

                                                                                    +We wish to generate a stream that contains all the pairs in the array +that lie on or above the diagonal, i.e., the pairs +

                                                                                    +(If we take both S and T to be the stream of integers, then this +will be our desired stream int-pairs.)

                                                                                    + +Call the general stream of pairs (pairs S T), and consider it to +be composed of three parts: the pair (S0,T0), the +rest of the pairs in the first row, and the remaining pairs:67 +

                                                                                    +Observe that the third piece in this decomposition (pairs that are not in the +first row) is (recursively) the pairs formed from (stream-cdr S) +and (stream-cdr T). Also note that the second piece (the rest +of the first row) is +

                                                                                    (stream-map (lambda (x) (list (stream-car s) x))
                                                                                    +            (stream-cdr t))
                                                                                    +

                                                                                    +Thus we can form our stream of pairs as follows: +

                                                                                    (define (pairs s t)
                                                                                    +  (cons-stream
                                                                                    +   (list (stream-car s) (stream-car t))
                                                                                    +   (<combine-in-some-way>
                                                                                    +       (stream-map (lambda (x) (list (stream-car s) x))
                                                                                    +                   (stream-cdr t))
                                                                                    +       (pairs (stream-cdr s) (stream-cdr t)))))
                                                                                    +

                                                                                    + +In order to complete the procedure, we must choose some way to combine +the two inner streams. One idea is to use the stream analog of the +append procedure from section 2.2.1:

                                                                                    + +

                                                                                    (define (stream-append s1 s2)
                                                                                    +  (if (stream-null? s1)
                                                                                    +      s2
                                                                                    +      (cons-stream (stream-car s1)
                                                                                    +                   (stream-append (stream-cdr s1) s2))))
                                                                                    +

                                                                                    +This is unsuitable for infinite streams, however, +because it takes all the elements from the first stream before +incorporating the second stream. +In particular, if we try to generate all pairs of positive integers using

                                                                                    + +

                                                                                    (pairs integers integers)
                                                                                    +

                                                                                    +our stream of results will first try to run through all pairs with the +first integer equal to 1, and hence will never produce pairs with any +other value of the first integer.

                                                                                    + +To handle infinite streams, we need to devise an order of combination +that ensures that every element will eventually be reached if we let +our program run long enough. An elegant way to accomplish this is +with the following interleave procedure:68

                                                                                    + +

                                                                                    (define (interleave s1 s2)
                                                                                    +  (if (stream-null? s1)
                                                                                    +      s2
                                                                                    +      (cons-stream (stream-car s1)
                                                                                    +                   (interleave s2 (stream-cdr s1)))))
                                                                                    +

                                                                                    +Since interleave takes elements alternately from the two streams, +every element of the second stream will eventually find its way into +the interleaved stream, even if the first stream is infinite.

                                                                                    + +We can thus generate the required stream of pairs as +

                                                                                    (define (pairs s t)
                                                                                    +  (cons-stream
                                                                                    +   (list (stream-car s) (stream-car t))
                                                                                    +   (interleave
                                                                                    +    (stream-map (lambda (x) (list (stream-car s) x))
                                                                                    +                (stream-cdr t))
                                                                                    +    (pairs (stream-cdr s) (stream-cdr t)))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 3.66.  Examine the stream (pairs integers integers). Can you make any general +comments about the order in which the pairs are placed into the +stream? For example, about how many pairs precede the pair (1,100)? +the pair (99,100)? the pair (100,100)? (If you can make precise +mathematical statements here, all the better. But feel free to give +more qualitative answers if you find yourself getting bogged down.) +

                                                                                    + +

                                                                                    +Exercise 3.67.  Modify the pairs procedure so that (pairs integers +integers) will produce the stream of all pairs of integers +(i,j) (without the condition i < j). Hint: You will need to +mix in an additional stream. +

                                                                                    + +

                                                                                    +Exercise 3.68.  Louis Reasoner thinks that building a stream of pairs from three +parts is unnecessarily complicated. Instead of separating the +pair (S0,T0) from the rest of the pairs in the first row, +he proposes to work with the whole first row, as follows: +

                                                                                    (define (pairs s t)
                                                                                    +  (interleave
                                                                                    +   (stream-map (lambda (x) (list (stream-car s) x))
                                                                                    +               t)
                                                                                    +   (pairs (stream-cdr s) (stream-cdr t))))
                                                                                    +

                                                                                    +Does this work? Consider what happens if we evaluate +(pairs integers integers) using Louis's definition of pairs. + +

                                                                                    + +

                                                                                    +Exercise 3.69.  Write a procedure triples that takes three infinite +streams, S, T, and U, and produces the stream of triples +(Si,Tj,Uk) such that i < j < k. +Use triples to +generate the stream of all Pythagorean triples of positive integers, +i.e., the triples (i,j,k) such that i < j and i2 + j2 = k2. + +

                                                                                    + +

                                                                                    +Exercise 3.70.  It would be nice to be able to generate streams in which the pairs +appear in some useful order, rather than in the order that results +from an ad hoc interleaving process. We can use a technique +similar to the merge procedure of exercise 3.56, if we +define a way to say that one pair of integers is ``less than'' +another. One way to do this is to define a ``weighting function'' +W(i,j) and stipulate that (i1,j1) is less than (i2,j2) if +W(i1,j1) < W(i2,j2). Write a procedure merge-weighted +that is like merge, except that merge-weighted takes an +additional argument weight, which is a procedure that computes +the weight of a pair, and is used to determine the order in which +elements should appear in the resulting merged stream.69 +Using this, +generalize pairs to a procedure weighted-pairs that +takes two streams, together with a procedure that computes a weighting +function, and generates the stream of pairs, ordered according to +weight. Use your procedure to generate

                                                                                    + +

                                                                                    a. the stream of all pairs of positive integers (i,j) with i < +j ordered according to the sum i + j

                                                                                    + +

                                                                                    b. the stream of all pairs of positive integers (i,j) with i < +j, where neither i nor j is divisible by 2, 3, or 5, and the +pairs are ordered according to the sum 2 i + 3 j + 5 i j. + +

                                                                                    + + +

                                                                                    +Exercise 3.71.  Numbers that can be expressed as the sum of two cubes in more than one +way are sometimes called Ramanujan numbers, in honor of the +mathematician Srinivasa Ramanujan.70 +Ordered streams of pairs provide an elegant solution to the problem of +computing these numbers. To find a number that can be written as the +sum of two cubes in two different ways, we need only generate the +stream of pairs of integers (i,j) weighted according to the sum i3 + + j3 (see exercise 3.70), +then search the stream for two consecutive pairs with the same +weight. Write a procedure to generate the Ramanujan numbers. The first +such number is 1,729. What are the next five? + +

                                                                                    + +

                                                                                    +Exercise 3.72.  In a similar way to exercise 3.71 generate +a stream of +all numbers that can be written as the sum of two squares in three +different ways (showing how they can be so written). +

                                                                                    + + +

                                                                                    Streams as signals

                                                                                    + + +We began our discussion of streams by describing them as computational +analogs of the ``signals'' in signal-processing systems. In fact, we +can use streams to model signal-processing systems in a very direct +way, representing the values of a signal at successive time intervals +as consecutive elements of a stream. For instance, we can implement +an integrator or summer that, for an input stream +x = (xi), an initial value C, and a small increment dt, +accumulates the sum +

                                                                                    +and returns the stream of values S = (Si). The following integral +procedure is reminiscent of the ``implicit style'' definition of the +stream of integers (section 3.5.2):

                                                                                    + +

                                                                                    (define (integral integrand initial-value dt)
                                                                                    +  (define int
                                                                                    +    (cons-stream initial-value
                                                                                    +                 (add-streams (scale-stream integrand dt)
                                                                                    +                              int)))
                                                                                    +  int)
                                                                                    +

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.32:  The integral procedure viewed as a +signal-processing system.
                                                                                    + +

                                                                                    + +Figure 3.32 is a picture of a signal-processing system that +corresponds to the integral procedure. The input stream is +scaled by dt and passed through an adder, whose output is passed +back through the same adder. The self-reference in the definition of +int is reflected in the figure by the feedback loop that +connects the output of the adder to one of the inputs.

                                                                                    + +

                                                                                    +Exercise 3.73.  

                                                                                      +       + + +v = v0 + (1/C)0ti dt + R i +     
                                                                                    + +

                                                                                    +

                                                                                    Figure 3.33:  An RC circuit and the associated signal-flow diagram.
                                                                                    + +

                                                                                    +We can model electrical circuits using streams to represent the values +of currents or voltages at a sequence of times. For instance, suppose +we have an RC circuit consisting of a resistor of resistance R +and a capacitor of capacitance C in series. The voltage response +v of the circuit to an injected current i is determined by the +formula in figure 3.33, whose structure is shown by the accompanying +signal-flow diagram.

                                                                                    + +Write a procedure RC that models this circuit. RC should +take as inputs the values of R, C, and dt and should return a +procedure that takes as inputs a stream representing the current i +and an initial value for the capacitor voltage v0 and produces as +output the stream of voltages v. For example, you should be able to +use RC to model an RC circuit with R = 5 ohms, C = 1 farad, +and a 0.5-second time step by evaluating (define RC1 (RC 5 1 +0.5)). This defines RC1 as a procedure that takes a stream +representing the time sequence of currents and an initial capacitor +voltage and produces the output stream of voltages. + +

                                                                                    +

                                                                                    +Exercise 3.74.  Alyssa P. Hacker is designing a system to process signals coming from +physical sensors. One important feature she wishes to produce is a +signal that describes the zero crossings of the input signal. +That is, the resulting signal should be + 1 whenever the input signal +changes from negative to positive, - 1 whenever the input signal +changes from positive to negative, and 0 otherwise. (Assume that the +sign of a 0 input is positive.) For example, a typical input signal +with its associated zero-crossing signal would be +

                                                                                    ...1  2  1.5  1  0.5  -0.1  -2  -3  -2  -0.5  0.2  3  4 ...... 0  0    0  0    0     -1  0   0   0     0    1  0  0 ...

                                                                                    +In Alyssa's system, the signal from the sensor is represented as a +stream sense-data and the stream zero-crossings is +the corresponding stream of zero crossings. Alyssa first writes a +procedure sign-change-detector that takes two values as +arguments and compares the signs of the values to produce an +appropriate 0, 1, or - 1. She then constructs her zero-crossing +stream as follows:

                                                                                    + +

                                                                                    (define (make-zero-crossings input-stream last-value)
                                                                                    +  (cons-stream
                                                                                    +   (sign-change-detector (stream-car input-stream) last-value)
                                                                                    +   (make-zero-crossings (stream-cdr input-stream)
                                                                                    +                        (stream-car input-stream))))
                                                                                    +
                                                                                    +(define zero-crossings (make-zero-crossings sense-data 0))
                                                                                    +

                                                                                    +Alyssa's boss, Eva Lu Ator, walks by and suggests that this program is +approximately equivalent to the following one, which +uses the generalized version +of stream-map from exercise 3.50:

                                                                                    + +

                                                                                    (define zero-crossings
                                                                                    +  (stream-map sign-change-detector sense-data <expression>))
                                                                                    +

                                                                                    +Complete the program by supplying the indicated <expression>. + +

                                                                                    +

                                                                                    +Exercise 3.75.  Unfortunately, Alyssa's zero-crossing detector in +exercise 3.74 proves to be insufficient, because the +noisy signal from the sensor leads to spurious zero crossings. Lem E. +Tweakit, a hardware specialist, suggests that Alyssa smooth the signal +to filter out the noise before extracting the zero crossings. Alyssa +takes his advice and decides to extract the zero crossings from the +signal constructed by averaging each value of the sense data with the +previous value. She explains the problem to her assistant, Louis +Reasoner, who attempts to implement the idea, altering Alyssa's program as +follows:

                                                                                    + +

                                                                                    (define (make-zero-crossings input-stream last-value)
                                                                                    +  (let ((avpt (/ (+ (stream-car input-stream) last-value) 2)))
                                                                                    +    (cons-stream (sign-change-detector avpt last-value)
                                                                                    +                 (make-zero-crossings (stream-cdr input-stream)
                                                                                    +                                      avpt))))
                                                                                    +

                                                                                    +This does not correctly implement Alyssa's plan. +Find the bug that Louis has installed +and fix it without changing the structure of the program. (Hint: You +will need to increase the number of arguments to make-zero-crossings.) + +

                                                                                    +

                                                                                    +Exercise 3.76.  Eva Lu Ator has a criticism of Louis's approach in +exercise 3.75. The program he wrote is not modular, +because it intermixes the operation of smoothing with the +zero-crossing extraction. For example, the extractor should not have +to be changed if Alyssa finds a better way to condition her input +signal. Help Louis by writing a procedure smooth that takes a +stream as input and produces a stream in which each element is the +average of two successive input stream elements. Then use smooth as a component to implement the zero-crossing detector in a +more modular style. +

                                                                                    + +

                                                                                    3.5.4  Streams and Delayed Evaluation

                                                                                    + + + +The integral procedure at the end of the preceding section shows +how we can use streams to model signal-processing systems that contain +feedback loops. The feedback loop for the adder shown in +figure 3.32 is modeled by the fact that integral's +internal stream int is defined in terms of itself:

                                                                                    + +

                                                                                    (define int
                                                                                    +  (cons-stream initial-value
                                                                                    +               (add-streams (scale-stream integrand dt)
                                                                                    +                            int)))
                                                                                    +

                                                                                    +The interpreter's ability to deal with such an implicit definition +depends on the delay that is incorporated into cons-stream. Without this delay, the interpreter could not +construct int before evaluating both arguments to cons-stream, which would require that int already be defined. +In general, delay is crucial for using streams to model +signal-processing systems that contain loops. Without delay, +our models would have to be formulated so that the inputs to any +signal-processing component would be fully evaluated before the output +could be produced. This would outlaw loops.

                                                                                    + +Unfortunately, stream models of systems with loops +may require uses of delay beyond the ``hidden'' delay +supplied by cons-stream. For instance, +figure 3.34 shows a signal-processing system for +solving the differential equation dy/dt = f(y) where f is a given +function. The figure shows a mapping component, which +applies f to its input signal, linked in a feedback loop to an +integrator in a manner very similar to that of the analog computer +circuits that are actually used to solve such equations.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.34:  An ``analog computer circuit'' that solves the +equation +dy/dt = f(y).
                                                                                    + +

                                                                                    + +Assuming we are given an initial value y0 for y, we +could try to model this system using the procedure

                                                                                    + +

                                                                                    (define (solve f y0 dt)
                                                                                    +  (define y (integral dy y0 dt))
                                                                                    +  (define dy (stream-map f y))
                                                                                    +  y)
                                                                                    +

                                                                                    +This procedure does not work, because in the first line of solve +the call to integral requires that the input dy be +defined, which does not happen until the second line of solve.

                                                                                    + +On the other hand, the intent of our definition does make sense, +because we can, in principle, begin to generate the y stream +without knowing dy. Indeed, integral and many other +stream operations have properties similar to those of cons-stream, in that we can generate part of the answer given only +partial information about the arguments. For integral, the +first element of the output stream is the specified initial-value. Thus, we can generate the first element of the output +stream without evaluating the integrand dy. Once we know the +first element of y, the stream-map in the second line of +solve can begin working to generate the first element of dy, which will produce the next element of y, and so on.

                                                                                    + +To take advantage of this idea, we will redefine integral to +expect the integrand stream to be a delayed argument. Integral will force the integrand to be evaluated only when it +is required to generate more than the first element of the output stream:

                                                                                    + +

                                                                                    (define (integral delayed-integrand initial-value dt)
                                                                                    +  (define int
                                                                                    +    (cons-stream initial-value
                                                                                    +                 (let ((integrand (force delayed-integrand)))
                                                                                    +                   (add-streams (scale-stream integrand dt)
                                                                                    +                                int))))
                                                                                    +  int)
                                                                                    +

                                                                                    +Now we can implement our solve procedure by delaying the +evaluation of dy in the definition of y:71

                                                                                    + +

                                                                                    (define (solve f y0 dt)
                                                                                    +  (define y (integral (delay dy) y0 dt))
                                                                                    +  (define dy (stream-map f y))
                                                                                    +  y)
                                                                                    +

                                                                                    +In general, every caller of integral must now delay the +integrand argument. We can demonstrate that the solve procedure +works by approximating e 2.718 by computing the value at +y = 1 of the solution to the differential equation dy/dt = y with +initial condition y(0) = 1:

                                                                                    + +

                                                                                    (stream-ref (solve (lambda (y) y) 1 0.001) 1000)
                                                                                    +2.716924

                                                                                    + +

                                                                                    +Exercise 3.77.  The integral procedure used above was analogous to the +``implicit'' definition of the infinite stream of integers in +section 3.5.2. Alternatively, we can give a +definition of integral that is more like integers-starting-from (also in section 3.5.2):

                                                                                    + +

                                                                                    (define (integral integrand initial-value dt)
                                                                                    +  (cons-stream initial-value
                                                                                    +               (if (stream-null? integrand)
                                                                                    +                   the-empty-stream
                                                                                    +                   (integral (stream-cdr integrand)
                                                                                    +                             (+ (* dt (stream-car integrand))
                                                                                    +                                initial-value)
                                                                                    +                             dt))))
                                                                                    +

                                                                                    +When used in systems with loops, this procedure has the same problem +as does our original version of integral. Modify the procedure +so that it expects the integrand as a delayed argument and hence +can be used in the solve procedure shown above. +

                                                                                    + +

                                                                                    +Exercise 3.78.  

                                                                                    +
                                                                                    Figure 3.35:  Signal-flow diagram for the solution to a second-order +linear differential equation.
                                                                                    + +

                                                                                    +Consider the problem of designing a signal-processing system to study +the homogeneous second-order linear differential equation +

                                                                                    +The output stream, modeling y, is generated by a network that +contains a loop. This is because the value of d2y/dt2 depends +upon the values of y and dy/dt and both of these are determined by +integrating d2y/dt2. The diagram we would like to encode is +shown in figure 3.35. Write a procedure solve-2nd that +takes as arguments the constants a, b, and dt and the initial +values y0 and dy0 for y and dy/dt and generates the +stream of successive values of y. + +

                                                                                    + +

                                                                                    +Exercise 3.79.  Generalize the solve-2nd procedure of exercise 3.78 so +that it can be used to solve general second-order differential +equations d2 y/dt2 = f(dy/dt, y). +

                                                                                    + +

                                                                                    +Exercise 3.80.  A series RLC circuit consists of a resistor, a capacitor, and an +inductor connected in series, as shown in figure 3.36. +If R, L, and C are the resistance, inductance, and capacitance, +then the relations between voltage (v) and current (i) +for the three components are described by the equations +

                                                                                    +

                                                                                    + +and the circuit connections dictate the relations +

                                                                                    +Combining these equations shows that the state of the circuit +(summarized by vC, the voltage across the capacitor, and iL, the +current in the inductor) +is described by the pair of differential equations +

                                                                                    +The signal-flow diagram representing this system of differential +equations is shown in figure 3.37. +

                                                                                    +
                                                                                    Figure 3.36:  A series RLC circuit.
                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    Figure 3.37:  A signal-flow diagram for the solution +to a series RLC circuit.
                                                                                    + +

                                                                                    + +Write a procedure RLC that takes as arguments the parameters +R, L, and C of the circuit and the time increment dt. In a +manner similar to that of the RC procedure of +exercise 3.73, RLC should produce a procedure +that takes the initial values of the state variables, vC0 and +iL0, and produces a pair (using cons) of the streams of +states vC and iL. Using RLC, generate the pair of +streams that models the behavior of a series RLC circuit with R = 1 +ohm, C = 0.2 farad, L = 1 henry, dt = 0.1 second, and initial +values iL0 = 0 amps and vC0 = 10 volts. +

                                                                                    +

                                                                                    + + +

                                                                                    Normal-order evaluation

                                                                                    + + +The examples in this section illustrate how the explicit use of delay and force provides great programming flexibility, but the +same examples also show how this can make our programs more complex. +Our new integral procedure, for instance, gives us the power to +model systems with loops, but we must now remember that integral +should be called with a delayed integrand, and every procedure that +uses integral must be aware of this. In effect, we have created +two classes of procedures: ordinary procedures and procedures that +take delayed arguments. In general, creating separate classes of +procedures forces us to create separate classes of higher-order +procedures as well.72

                                                                                    + +One way to avoid the need for two different classes of procedures is +to make all procedures take delayed arguments. We could adopt a model +of evaluation in which all arguments to procedures are automatically +delayed and arguments are forced only when they are actually needed +(for example, when they are required by a primitive operation). This +would transform our language to use normal-order evaluation, which we +first described when we introduced the substitution model for +evaluation in section 1.1.5. Converting to +normal-order evaluation provides a uniform and elegant way to simplify +the use of delayed evaluation, and this would be a natural strategy to +adopt if we were concerned only with stream processing. In +section 4.2, after we have studied the evaluator, we +will see how to transform our language in just this way. +Unfortunately, including delays in procedure calls wreaks havoc with +our ability to design programs that depend on the order of events, +such as programs that use assignment, mutate data, or perform input or +output. Even the single delay in cons-stream can cause +great confusion, as illustrated by exercises 3.51 +and 3.52. As far as anyone knows, mutability and delayed +evaluation do not mix well in programming languages, and devising ways +to deal with both of these at once is an active area of research. + + +

                                                                                    3.5.5  Modularity of Functional Programs and Modularity of Objects

                                                                                    + + + +As we saw in section 3.1.2, one of the +major benefits of introducing assignment is that we can increase the +modularity of our systems by encapsulating, or ``hiding,'' parts of +the state of a large system within local variables. Stream models can +provide an equivalent modularity without the use of assignment. As an +illustration, we can reimplement the Monte Carlo estimation of , +which we examined in section 3.1.2, from a +stream-processing point of view.

                                                                                    + + +The key modularity issue was that we wished to hide the internal state +of a random-number generator from programs that used random numbers. +We began with a procedure rand-update, whose successive values +furnished our supply of random numbers, and used this to produce a +random-number generator:

                                                                                    + + +

                                                                                    (define rand
                                                                                    +  (let ((x random-init))
                                                                                    +    (lambda ()
                                                                                    +      (set! x (rand-update x))
                                                                                    +      x)))
                                                                                    +

                                                                                    + +In the stream formulation there is no random-number generator per +se, just a stream of random numbers produced by successive calls to +rand-update:

                                                                                    + + +

                                                                                    (define random-numbers
                                                                                    +  (cons-stream random-init
                                                                                    +               (stream-map rand-update random-numbers)))
                                                                                    +

                                                                                    +We use this to construct the stream of outcomes of the Cesàro +experiment performed on consecutive pairs in the random-numbers +stream:

                                                                                    + +

                                                                                    (define cesaro-stream
                                                                                    +  (map-successive-pairs (lambda (r1 r2) (= (gcd r1 r2) 1))
                                                                                    +                        random-numbers))
                                                                                    +
                                                                                    +(define (map-successive-pairs f s)
                                                                                    +  (cons-stream
                                                                                    +   (f (stream-car s) (stream-car (stream-cdr s)))
                                                                                    +   (map-successive-pairs f (stream-cdr (stream-cdr s)))))
                                                                                    +

                                                                                    +The cesaro-stream is now fed to a monte-carlo procedure, +which produces a stream of estimates of probabilities. The results +are then converted into a stream of estimates of . This version +of the program doesn't need a parameter telling how many trials to +perform. Better estimates of (from performing more experiments) +are obtained by looking farther into the pi stream:

                                                                                    + +

                                                                                    (define (monte-carlo experiment-stream passed failed)
                                                                                    +  (define (next passed failed)
                                                                                    +    (cons-stream
                                                                                    +     (/ passed (+ passed failed))
                                                                                    +     (monte-carlo
                                                                                    +      (stream-cdr experiment-stream) passed failed)))
                                                                                    +  (if (stream-car experiment-stream)
                                                                                    +      (next (+ passed 1) failed)
                                                                                    +      (next passed (+ failed 1))))
                                                                                    +
                                                                                    +(define pi
                                                                                    +  (stream-map (lambda (p) (sqrt (/ 6 p)))
                                                                                    +              (monte-carlo cesaro-stream 0 0)))
                                                                                    +

                                                                                    +There is considerable modularity in this approach, because we still +can formulate a general monte-carlo procedure that can deal with +arbitrary experiments. Yet there is no assignment or local state.

                                                                                    + +

                                                                                    +Exercise 3.81.  Exercise 3.6 +discussed generalizing the random-number generator to +allow one to reset the random-number sequence so as to produce +repeatable sequences of ``random'' numbers. Produce a stream +formulation of this same generator that operates on an input stream of +requests to generate a new random number or to reset the +sequence to a specified value and that produces the desired stream of +random numbers. Don't use assignment in your solution. +

                                                                                    + +

                                                                                    +Exercise 3.82.  Redo exercise 3.5 on Monte Carlo +integration in terms of streams. The stream version of estimate-integral will not have an argument telling how many trials +to perform. Instead, it will produce a stream of estimates based on +successively more trials. +

                                                                                    + + +

                                                                                    A functional-programming view of time

                                                                                    + + +Let us now return to the issues of objects and state that were raised +at the beginning of this chapter and examine them in a new light. We +introduced assignment and mutable objects to provide a mechanism for +modular construction of programs that model systems with state. +We constructed computational +objects with local state variables and used assignment to modify these +variables. We modeled the temporal behavior of the objects in the +world by the temporal behavior of the corresponding computational +objects.

                                                                                    + +Now we have seen that streams provide an alternative way to model +objects with local state. We can model a changing quantity, such as +the local state of some object, using a stream that represents the +time history of successive states. In essence, we represent time +explicitly, using streams, so that we decouple time in our simulated +world from the sequence of events that take place during evaluation. +Indeed, because of the presence of delay there may be little +relation between simulated time in the model and the order of events +during the evaluation.

                                                                                    + +In order to contrast these two approaches to modeling, let us +reconsider the implementation of a ``withdrawal processor'' that +monitors the balance in a bank account. In +section 3.1.3 we implemented a simplified +version of such a processor:

                                                                                    + +

                                                                                    (define (make-simplified-withdraw balance)
                                                                                    +  (lambda (amount)
                                                                                    +    (set! balance (- balance amount))
                                                                                    +    balance))
                                                                                    +

                                                                                    +Calls to make-simplified-withdraw produce computational objects, +each with a local state variable balance that is decremented by +successive calls to the object. The object takes an amount as +an argument and returns the new balance. We can imagine the user of a +bank account typing a sequence of inputs to such an object and +observing the sequence of returned values shown on a display screen.

                                                                                    + +Alternatively, we can model a withdrawal processor as a procedure that +takes as input a balance and a stream of amounts to withdraw and +produces the stream of successive balances in the account:

                                                                                    + +

                                                                                    (define (stream-withdraw balance amount-stream)
                                                                                    +  (cons-stream
                                                                                    +   balance
                                                                                    +   (stream-withdraw (- balance (stream-car amount-stream))
                                                                                    +                    (stream-cdr amount-stream))))
                                                                                    +

                                                                                    +Stream-withdraw implements a well-defined mathematical function whose +output is fully determined by its input. Suppose, however, that the +input amount-stream is the stream of successive values typed by +the user and that the resulting stream of balances is displayed. +Then, from the perspective of the user who is typing values and +watching results, the stream process has the same behavior as the +object created by make-simplified-withdraw. However, with the +stream version, there is no assignment, no local state variable, and +consequently none of the theoretical difficulties that we encountered +in section 3.1.3. Yet the system has state!

                                                                                    + +This is really remarkable. Even though stream-withdraw implements a +well-defined mathematical function whose behavior does not change, the +user's perception here is one of interacting with a system that has a +changing state. One way to resolve this paradox is to realize that it +is the user's temporal existence that imposes state on the system. If +the user could step back from the interaction and think in terms of +streams of balances rather than individual transactions, the system +would appear stateless.73

                                                                                    + +From the point of view of one part of a complex process, the other +parts appear to change with time. They have hidden time-varying local +state. If we wish to write programs that model this kind of natural +decomposition in our world (as we see it from our viewpoint as a part of +that world) with +structures in our computer, we make computational objects that are not +functional -- they must change with time. We model state with local +state variables, and we model the changes of state with assignments to +those variables. By doing this we make the time of execution of a +computation model time in the world that we are part of, and thus we +get ``objects'' in our computer.

                                                                                    + +Modeling with objects is powerful and intuitive, largely because this +matches the perception of interacting with a world of which we are +part. However, as we've seen repeatedly throughout this chapter, +these models raise thorny problems of constraining the order of events +and of synchronizing multiple processes. The possibility of avoiding +these problems has stimulated the development of functional +programming languages, which do not include any provision for +assignment or mutable data. In such a language, all procedures +implement well-defined mathematical functions of their arguments, +whose behavior does not change. The functional approach is extremely +attractive for dealing with concurrent systems.74

                                                                                    + +On the other hand, if we look closely, we can see time-related +problems creeping into functional models as well. One particularly +troublesome area arises when we wish to design interactive systems, +especially ones that model interactions between independent entities. +For instance, consider once more the implementation a banking system +that permits joint bank accounts. In a conventional system using +assignment and objects, we would model the fact that Peter and Paul +share an account by having both Peter and Paul send their transaction +requests to the same bank-account object, as we saw in +section 3.1.3. +From the stream point of view, where there are no ``objects'' per +se, we have already indicated that a bank account can be modeled as a +process that operates on a stream of transaction requests to produce a +stream of responses. Accordingly, we could model the fact that Peter +and Paul have a joint bank account by merging Peter's stream of +transaction requests with Paul's stream of requests and feeding the +result to the bank-account stream process, as shown in +figure 3.38.

                                                                                    + +

                                                                                    +
                                                                                    Figure 3.38:  A joint bank account, modeled by merging two streams of +transaction requests.
                                                                                    + +

                                                                                    + +The trouble with this formulation is in the notion of merge. It +will not do to merge the two streams by simply taking alternately one +request from Peter and one request from Paul. Suppose Paul accesses +the account only very rarely. We could hardly force Peter to wait for +Paul to access the account before he could issue a second transaction. +However such a merge is implemented, it must interleave the two +transaction streams in some way that is constrained by ``real +time'' as perceived by Peter and Paul, in the sense that, if Peter and +Paul meet, they can agree that certain transactions were processed +before the meeting, and other transactions were processed after the +meeting.75 +This is precisely the same constraint that we had to deal with in +section 3.4.1, where we found the need to introduce +explicit synchronization to ensure a ``correct'' order of events in +concurrent processing of objects with state. Thus, in an attempt to +support the functional style, the need to merge inputs from different +agents reintroduces the same problems that the functional style was +meant to eliminate.

                                                                                    + +We began this chapter with the goal of building computational models +whose structure matches our perception of the real world we are trying +to model. We can model the world as a collection of separate, +time-bound, interacting objects with state, or we can model the world +as a single, timeless, stateless unity. Each view has powerful +advantages, but neither view alone is completely satisfactory. A +grand unification has yet to emerge.76 +

                                                                                    + + +


                                                                                    +

                                                                                    52 Physicists sometimes adopt this view by introducing the +``world lines'' of particles as a device for reasoning about motion. +We've also already mentioned +(section 2.2.3) that this is the +natural way to think about signal-processing systems. We will explore +applications of streams to signal processing in +section 3.5.3. + +

                                                                                    53 Assume that we have a +predicate prime? (e.g., as in section 1.2.6) that +tests for primality. + +

                                                                                    54 In the MIT implementation, the-empty-stream is the +same as the empty list '(), and stream-null? is the same +as null?. + +

                                                                                    55 This should bother you. The fact that we are defining such +similar procedures for streams and lists indicates that we are missing some +underlying abstraction. Unfortunately, in order to exploit this +abstraction, we will need to exert finer control over the process of +evaluation than we can at present. We will discuss this point further +at the end of section 3.5.4. +In section 4.2, we'll develop a framework that +unifies lists and streams. + +

                                                                                    56 Although stream-car and +stream-cdr can be defined as procedures, cons-stream must +be a special form. If cons-stream were a procedure, then, +according to our model of evaluation, evaluating (cons-stream +<a> <b>) would automatically cause <b> to be evaluated, which is +precisely what we do not want to happen. For the same reason, delay must be a special form, though force can be an ordinary +procedure. + +

                                                                                    57 The numbers shown here do +not really appear in the delayed expression. What actually appears is +the original expression, in an environment in which the variables are +bound to the appropriate numbers. For example, (+ low 1) with +low bound to 10,000 actually appears where 10001 is +shown. + +

                                                                                    58 There are many +possible implementations of streams other than the one described in +this section. Delayed evaluation, which is the key to making streams +practical, was inherent in Algol 60's call-by-name +parameter-passing method. The use of this mechanism to implement +streams was first described by Landin (1965). Delayed evaluation for +streams was introduced into Lisp by Friedman and Wise (1976). In their +implementation, cons always delays evaluating its arguments, so +that lists automatically behave as streams. The memoizing +optimization is also known as call-by-need. The Algol community +would refer to our original delayed objects as call-by-name +thunks and to the optimized versions as call-by-need thunks. + +

                                                                                    59 Exercises such as 3.51 and 3.52 +are valuable for testing our understanding of how delay works. +On the other hand, intermixing delayed evaluation with printing -- and, +even worse, with assignment -- is extremely confusing, and instructors +of courses on computer languages have traditionally tormented their +students with examination questions such as the ones in this section. +Needless to say, writing programs that depend on such subtleties is +odious programming style. Part of the power of stream processing is +that it lets us ignore the order in which events actually happen in +our programs. Unfortunately, this is precisely what we cannot afford +to do in the presence of assignment, which forces us to be concerned +with time and change. + +

                                                                                    60 Eratosthenes, a third-century B.C. +Alexandrian Greek philosopher, is famous for giving the first accurate +estimate of the circumference of the Earth, which he computed by +observing shadows cast at noon on the day of the summer solstice. +Eratosthenes's sieve method, although ancient, has formed the basis +for special-purpose hardware ``sieves'' that, until recently, were the +most powerful tools in existence for locating large primes. Since the +70s, however, these methods have been superseded by outgrowths of the +probabilistic techniques discussed in section 1.2.6. + +

                                                                                    61 We have named these figures after Peter Henderson, who +was the first person to show us diagrams of this sort as a way of +thinking about stream processing. Each solid line represents a stream +of values being transmitted. The dashed line from the car to +the cons and the filter indicates that this is a single +value rather than a stream. + +

                                                                                    62 This uses the generalized version +of stream-map from exercise 3.50. + +

                                                                                    63 This last point is +very subtle and relies on the fact that pn+1 < pn2. +(Here, pk denotes the kth prime.) Estimates such as these are +very difficult to establish. The ancient proof by Euclid that there +are an infinite number of primes shows that pn+1< p1 p2 +··· pn + 1, and no substantially better result was proved +until 1851, when the Russian mathematician P. L. Chebyshev established +that pn+1< 2pn for all n. This result, originally +conjectured in 1845, is known as Bertrand's hypothesis. A proof +can be found in section 22.3 of Hardy and Wright 1960. + +

                                                                                    64 This exercise shows how call-by-need is closely related to +ordinary memoization as described in exercise 3.27. +In that exercise, we used assignment to explicitly construct a local +table. Our call-by-need stream optimization effectively constructs +such a table automatically, storing values in the previously forced +parts of the stream. + +

                                                                                    65 We can't use let to bind the local variable +guesses, because the value of guesses depends on guesses itself. Exercise 3.63 addresses why +we want a local variable here. + +

                                                                                    66 As in section 2.2.3, +we represent a pair of integers as a list rather than a Lisp pair. + +

                                                                                    67 See exercise 3.68 for some insight +into why we chose this decomposition. + +

                                                                                    68 The precise statement of the +required property on the order of combination is as follows: There +should be a function f of two arguments such that the pair +corresponding to element i of the first stream and element j of +the second stream will appear as element number f(i,j) of the output +stream. The trick of using interleave to accomplish this was +shown to us by David Turner, who employed it in the language KRC +(Turner 1981). + +

                                                                                    69 We will require that the weighting function be such that +the weight of a pair increases as we move out along a row or down +along a column of the array of pairs. + +

                                                                                    70 To quote from G. H. Hardy's obituary of +Ramanujan (Hardy 1921): ``It was Mr. Littlewood (I believe) who remarked that +`every positive integer was one of his friends.' I remember once +going to see him when he was lying ill at Putney. I had ridden in +taxi-cab No. 1729, and remarked that the number seemed to me a rather +dull one, and that I hoped it was not an unfavorable omen. `No,' he +replied, `it is a very interesting number; it is the smallest number +expressible as the sum of two cubes in two different ways.' '' +The trick of using weighted pairs to generate the Ramanujan numbers +was shown to us by Charles Leiserson. + +

                                                                                    71 This procedure is not guaranteed to work in all Scheme +implementations, although for any implementation there is a simple +variation that will work. The problem has to do with subtle +differences in the ways that Scheme implementations handle internal +definitions. (See section 4.1.6.) + +

                                                                                    72 This is a small reflection, in Lisp, of the difficulties +that conventional strongly typed languages such as Pascal have in +coping with higher-order procedures. In such languages, the +programmer must specify the data types of the arguments and the result +of each procedure: number, logical value, sequence, and so on. +Consequently, we could not express an abstraction such as ``map a +given procedure proc over all the elements in a sequence'' by a +single higher-order procedure such as stream-map. Rather, we +would need a different mapping procedure for each different +combination of argument and result data types that might be specified +for a proc. Maintaining a practical notion of ``data type'' in +the presence of higher-order procedures raises many difficult issues. +One way of dealing with this problem is illustrated by the language ML +(Gordon, Milner, and Wadsworth 1979), whose ``polymorphic data types'' +include templates for higher-order transformations between data types. +Moreover, data types for most procedures in ML are never explicitly +declared by the programmer. Instead, ML includes a type-inferencing mechanism that uses information in the environment +to deduce the data types for newly defined procedures. + +

                                                                                    73 Similarly in physics, when we observe a moving particle, we +say that the position (state) of the particle is changing. However, +from the perspective of the particle's world line in space-time there +is no change involved. + +

                                                                                    74 John Backus, the inventor of Fortran, gave high +visibility to functional programming when he was awarded +the ACM Turing award in 1978. His acceptance speech (Backus 1978) +strongly advocated the functional approach. A good overview of +functional programming is given in Henderson 1980 and in Darlington, +Henderson, and Turner 1982. + +

                                                                                    75 Observe that, for any two streams, there is in general more than one +acceptable order of interleaving. Thus, technically, ``merge'' is a +relation rather than a function -- the answer is not a deterministic +function of the inputs. We already mentioned +(footnote 39) that nondeterminism is +essential when dealing with concurrency. The merge relation +illustrates the same essential nondeterminism, from the functional +perspective. In section 4.3, we +will look at nondeterminism from yet another point of view. + +

                                                                                    76 The object model approximates the world by +dividing it into separate pieces. The functional model does not +modularize along object boundaries. The object model is useful when +the unshared state of the ``objects'' is much larger than the state +that they share. An example of a place where the object viewpoint +fails is quantum +mechanics, where thinking of things as individual particles leads to +paradoxes and confusions. Unifying the object view with the +functional view may have little to do with programming, but rather +with fundamental epistemological issues. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-25.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-25.html new file mode 100644 index 00000000..00b2de07 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-25.html @@ -0,0 +1,205 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +

                                                                                    +Metalinguistic Abstraction

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + +

                                                                                    + +... It's in words that the magic +is -- Abracadabra, Open Sesame, and the rest -- but the magic words in +one story aren't magical in the next. The real magic is to understand +which words work, and when, and for what; the trick is to learn the +trick.
                                                                                    +... And those words are made from the letters of our +alphabet: a couple-dozen squiggles we can draw with the pen. This is +the key! And the treasure, too, if we can only get our hands on it! +It's as if -- as if the key to the treasure is the treasure!

                                                                                    + +John Barth, Chimera

                                                                                    + + +

                                                                                    +
                                                                                    + +

                                                                                    + +In our study of program design, we have seen that expert programmers +control the complexity of their designs with the same general +techniques used by designers of all complex systems. They combine +primitive elements to form compound objects, they abstract compound +objects to form higher-level building blocks, and they preserve +modularity by adopting appropriate large-scale views of system +structure. In illustrating these techniques, we have used Lisp as a +language for describing processes and for constructing computational +data objects and processes to model complex phenomena in the real +world. However, as we confront increasingly complex problems, we will +find that Lisp, or indeed any fixed programming language, is not +sufficient for our needs. We must constantly turn to new languages in +order to express our ideas more effectively. Establishing new +languages is a powerful strategy for controlling complexity in +engineering design; we can often enhance our ability to deal with a +complex problem by adopting a new language that enables us to describe +(and hence to think about) the problem in a different way, using +primitives, means of combination, and means of abstraction that are +particularly well suited to the problem at hand.1

                                                                                    + +Programming is endowed with a multitude of languages. There are +physical languages, such as the machine languages for particular +computers. These languages are concerned with the representation of +data and control in terms of individual bits of storage and primitive +machine instructions. The machine-language programmer is concerned +with using the given hardware to erect systems and utilities for the +efficient implementation of resource-limited computations. High-level +languages, erected on a machine-language substrate, hide concerns +about the representation of data as collections of bits and the +representation of programs as sequences of primitive instructions. +These languages have means of combination and abstraction, such as +procedure definition, that are appropriate to the larger-scale +organization of systems.

                                                                                    + +Metalinguistic abstraction -- establishing new +languages -- plays an important role in all branches of engineering +design. It is particularly important to computer programming, because +in programming not only can we formulate new languages but we can also +implement these languages by constructing evaluators. An evaluator (or interpreter) for a programming language is a procedure +that, when applied to an expression of the language, performs the +actions required to evaluate that expression.

                                                                                    + +It is no exaggeration to regard this as the most fundamental idea in +programming: +

                                                                                    +The evaluator, which determines the meaning of expressions in a +programming language, is just another program. +
                                                                                    +To appreciate this point is to change our images of ourselves as +programmers. We come to see ourselves as designers of languages, +rather than only users of languages designed by others.

                                                                                    + + +In fact, we can regard almost any program as the evaluator for some +language. For instance, the polynomial manipulation system of +section 2.5.3 embodies the rules of polynomial +arithmetic and implements them in terms of operations on +list-structured data. If we augment this system with procedures to +read and print polynomial expressions, we have the core of a +special-purpose language for dealing with problems in symbolic +mathematics. The digital-logic simulator of +section 3.3.4 and the constraint propagator of +section 3.3.5 are legitimate languages in their own +right, each with its own primitives, means of combination, and means +of abstraction. Seen from this perspective, the technology for coping +with large-scale computer systems merges with the technology for +building new computer languages, and computer science itself becomes +no more (and no less) than the discipline of constructing appropriate +descriptive languages.

                                                                                    + +We now embark on a tour of the technology by which languages are +established in terms of other languages. In this chapter we shall use +Lisp as a base, implementing evaluators as Lisp procedures. Lisp is +particularly well suited to this task, because of its ability to +represent and manipulate symbolic expressions. We will take the first +step in understanding how languages are implemented by building an +evaluator for Lisp itself. The language implemented by our evaluator +will be a subset of the Scheme dialect of Lisp that we use in this +book. Although the evaluator described in this chapter is written for +a particular dialect of Lisp, it contains the essential structure of +an evaluator for any expression-oriented language designed for writing +programs for a sequential machine. (In fact, most language processors +contain, deep within them, a little ``Lisp'' evaluator.) The +evaluator has been simplified for the purposes of illustration and +discussion, and some features have been left out that would be +important to include in a production-quality Lisp system. +Nevertheless, this simple evaluator is adequate to execute most of the +programs in this book.2

                                                                                    + + +An important advantage of making the evaluator accessible as a Lisp +program is that we can implement alternative evaluation rules by +describing these as modifications to the evaluator program. One place +where we can use this power to good effect is to gain extra control +over the ways in which computational models embody the notion of time, +which was so central to the discussion in chapter 3. There, we +mitigated some of the complexities of state and assignment by using +streams to decouple the representation of time in the world from time +in the computer. Our stream programs, however, were +sometimes cumbersome, because they were constrained by +the applicative-order evaluation of Scheme. +In section 4.2, we'll change +the underlying language to provide for a more elegant approach, by modifying +the evaluator to provide for normal-order evaluation.

                                                                                    + +Section 4.3 implements a more +ambitious linguistic change, whereby expressions have many values, +rather than just a single value. In this language of nondeterministic computing, it is natural to express processes that +generate all possible values for expressions and then search for those +values that satisfy certain constraints. In terms of models of +computation and time, this is like having time branch into a set of +``possible futures'' and then searching for appropriate time lines. +With our nondeterministic evaluator, keeping track of multiple values +and performing searches are handled automatically by the underlying +mechanism of the language.

                                                                                    + +In section 4.4 we implement a logic-programming language in which knowledge is expressed in terms +of relations, rather than in terms of computations with inputs and +outputs. Even though this makes the language drastically different +from Lisp, or indeed from any conventional language, we will see that +the logic-programming evaluator shares the essential structure of the +Lisp evaluator.

                                                                                    + +


                                                                                    +

                                                                                    1 The same idea +is pervasive throughout all of engineering. For example, electrical +engineers use many different languages for describing circuits. Two +of these are the language of electrical networks and the +language of electrical systems. The network language emphasizes +the physical modeling of devices in terms of discrete electrical +elements. The primitive objects of the network language are primitive +electrical components such as resistors, capacitors, inductors, and +transistors, which are characterized in terms of physical variables +called voltage and current. When describing circuits in the network +language, the engineer is concerned with the physical characteristics +of a design. In contrast, the primitive objects of the system +language are signal-processing modules such as filters and amplifiers. +Only the functional behavior of the modules is relevant, and signals +are manipulated without concern for their physical realization as +voltages and currents. The system language is erected on the network +language, in the sense that the elements of signal-processing systems +are constructed from electrical networks. Here, however, the concerns +are with the large-scale organization of electrical devices to solve a +given application problem; the physical feasibility of the parts is +assumed. This layered collection of languages is another example of +the stratified design technique illustrated by the picture +language of section 2.2.4. + +

                                                                                    2 The most important features that our evaluator leaves out +are mechanisms for handling errors and supporting debugging. For a +more extensive discussion of evaluators, see Friedman, Wand, and Haynes +1992, which gives an exposition of programming languages that proceeds +via a sequence of evaluators written in Scheme. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-26.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-26.html new file mode 100644 index 00000000..5f37f3e8 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-26.html @@ -0,0 +1,1942 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    4.1  The Metacircular Evaluator

                                                                                    + + + +Our evaluator for Lisp will be implemented as a Lisp program. It may +seem circular to think about evaluating Lisp programs using an +evaluator that is itself implemented in Lisp. However, evaluation is +a process, so it is appropriate to describe the evaluation process +using Lisp, which, after all, is our tool for describing +processes.3 An evaluator that is written in the same language +that it evaluates is said to be metacircular.

                                                                                    + + +The metacircular evaluator is essentially a Scheme formulation of the +environment model of evaluation described in +section 3.2. Recall that the model has two +basic parts:

                                                                                    + +

                                                                                    +

                                                                                    1. To evaluate a combination (a compound expression other than a +special form), evaluate the subexpressions and then apply the value of +the operator subexpression to the values of the operand +subexpressions.

                                                                                    + +

                                                                                    2. To apply a compound procedure to a set of arguments, evaluate the +body of the procedure in a new environment. To construct this +environment, extend the environment part of the procedure object by a +frame in which the formal parameters of the procedure are bound to the +arguments to which the procedure is applied. +

                                                                                    + +These two rules describe the essence of the evaluation process, a +basic cycle in which expressions to be evaluated in environments are +reduced to procedures to be applied to arguments, which in turn are +reduced to new expressions to be evaluated in new environments, and so +on, until we get down to symbols, whose values are looked +up in the environment, and to primitive procedures, which are applied +directly (see figure 4.1).4 +This evaluation cycle will be embodied by the interplay between the two +critical procedures in the evaluator, eval and apply, +which are described in section 4.1.1 +(see figure 4.1).

                                                                                    + +The implementation of the evaluator will depend upon procedures that +define the syntax of the expressions to be evaluated. We will +use data abstraction to make the evaluator independent of the +representation of the language. For example, rather than committing +to a choice that an assignment is to be represented by a list +beginning with the symbol set! we use an abstract predicate +assignment? to test for an assignment, and we use abstract +selectors assignment-variable and assignment-value to +access the parts of an assignment. Implementation of expressions will +be described in detail in section 4.1.2. +There are also operations, described in +section 4.1.3, that specify the +representation of procedures and environments. For example, make-procedure constructs compound procedures, lookup-variable-value accesses the values of variables, and apply-primitive-procedure applies a primitive procedure to a given list +of arguments.

                                                                                    + + +

                                                                                    4.1.1  The Core of the Evaluator

                                                                                    + + + +

                                                                                    +
                                                                                    Figure 4.1:  The eval-apply cycle exposes the essence +of a computer language.
                                                                                    + +

                                                                                    + +The evaluation process can be described as the interplay between two +procedures: eval and apply.

                                                                                    + + +

                                                                                    Eval

                                                                                    + +Eval takes as arguments an expression and an environment. It +classifies the expression and directs its evaluation. Eval is +structured as a case analysis of the syntactic type of the expression +to be evaluated. In order to keep the procedure general, we express +the determination of the type of an expression abstractly, making no +commitment to any particular representation for the various types of +expressions. Each type of expression has a predicate that tests for +it and an abstract means for selecting its parts. This abstract +syntax makes it easy to see how we can change the syntax of the +language by using the same evaluator, but with a different collection of +syntax procedures.

                                                                                    + + +

                                                                                    Primitive expressions

                                                                                    + +

                                                                                      +
                                                                                    • For self-evaluating expressions, such as numbers, eval returns +the expression itself.

                                                                                      + +

                                                                                    • Eval must look up variables in the environment to find their values. +

                                                                                    + + +

                                                                                    Special forms

                                                                                    + +

                                                                                      +

                                                                                      + +

                                                                                    • For quoted expressions, eval returns the expression that was +quoted.

                                                                                      + +

                                                                                    • An assignment to (or a definition of) a variable must recursively call +eval to compute the new value to be associated with the +variable. The environment must be modified to change (or create) the +binding of the variable.

                                                                                      + +

                                                                                    • An if expression requires special processing of its parts, so as to +evaluate the consequent if the predicate is true, and otherwise to +evaluate the alternative.

                                                                                      + +

                                                                                    • A lambda expression must be transformed into an +applicable procedure by packaging together the parameters and body +specified by the lambda expression with the environment of the +evaluation.

                                                                                      + +

                                                                                    • A begin expression requires evaluating its sequence of +expressions in the order in which they appear.

                                                                                      + +

                                                                                    • A case analysis (cond) is transformed into a nest of if +expressions and then evaluated. +

                                                                                    + + + +

                                                                                    Combinations

                                                                                    + +

                                                                                      +
                                                                                    • For a procedure application, eval must recursively +evaluate the operator part and the operands of the combination. The +resulting procedure and arguments are passed to apply, which +handles the actual procedure application. +

                                                                                    + +

                                                                                    Here is the definition of eval:

                                                                                    + + +

                                                                                    (define (eval exp env)
                                                                                    +  (cond ((self-evaluating? exp) exp)
                                                                                    +        ((variable? exp) (lookup-variable-value exp env))
                                                                                    +        ((quoted? exp) (text-of-quotation exp))
                                                                                    +        ((assignment? exp) (eval-assignment exp env))
                                                                                    +        ((definition? exp) (eval-definition exp env))
                                                                                    +        ((if? exp) (eval-if exp env))
                                                                                    +        ((lambda? exp)
                                                                                    +         (make-procedure (lambda-parameters exp)
                                                                                    +                         (lambda-body exp)
                                                                                    +                         env))
                                                                                    +        ((begin? exp) 
                                                                                    +         (eval-sequence (begin-actions exp) env))
                                                                                    +        ((cond? exp) (eval (cond->if exp) env))
                                                                                    +        ((application? exp)
                                                                                    +         (apply (eval (operator exp) env)
                                                                                    +                (list-of-values (operands exp) env)))
                                                                                    +        (else
                                                                                    +         (error "Unknown expression type -- EVAL" exp))))
                                                                                    +

                                                                                    +

                                                                                    + +For clarity, eval has been implemented as a case analysis using +cond. The disadvantage of this is that our procedure handles +only a few distinguishable types of expressions, and no new ones can +be defined without editing the definition of eval. In most Lisp +implementations, dispatching on the type of an expression is done in a +data-directed style. This allows a user to add new types of +expressions that eval can distinguish, without modifying the +definition of eval itself. +(See exercise 4.3.)

                                                                                    + + +

                                                                                    Apply

                                                                                    + +Apply takes two arguments, a procedure and a list of arguments +to which the procedure should be applied. Apply classifies +procedures into two kinds: It calls apply-primitive-procedure to apply primitives; it applies compound +procedures by sequentially evaluating the expressions that +make up the body of the procedure. The environment for the +evaluation of the body of a compound procedure +is constructed by extending the base environment carried by +the procedure to include a frame that binds the parameters of the +procedure to the arguments to which the procedure is to be applied. +Here is the definition of apply:

                                                                                    + +

                                                                                    (define (apply procedure arguments)
                                                                                    +  (cond ((primitive-procedure? procedure)
                                                                                    +         (apply-primitive-procedure procedure arguments))
                                                                                    +        ((compound-procedure? procedure)
                                                                                    +         (eval-sequence
                                                                                    +           (procedure-body procedure)
                                                                                    +           (extend-environment
                                                                                    +             (procedure-parameters procedure)
                                                                                    +             arguments
                                                                                    +             (procedure-environment procedure))))
                                                                                    +        (else
                                                                                    +         (error
                                                                                    +          "Unknown procedure type -- APPLY" procedure))))
                                                                                    +

                                                                                    + + + +

                                                                                    Procedure arguments

                                                                                    + +When eval processes a +procedure application, it uses list-of-values to produce the +list of arguments to which the procedure is to be applied. List-of-values takes as an argument the operands of the combination. +It evaluates each operand and returns a list of the corresponding +values:5

                                                                                    + +

                                                                                    (define (list-of-values exps env)
                                                                                    +  (if (no-operands? exps)
                                                                                    +      '()
                                                                                    +      (cons (eval (first-operand exps) env)
                                                                                    +            (list-of-values (rest-operands exps) env))))
                                                                                    +

                                                                                    + + +

                                                                                    Conditionals

                                                                                    + +Eval-if evaluates the predicate part of an if expression +in the given environment. If +the result is true, eval-if evaluates the consequent, otherwise +it evaluates the alternative:

                                                                                    + +

                                                                                    (define (eval-if exp env)
                                                                                    +  (if (true? (eval (if-predicate exp) env))
                                                                                    +      (eval (if-consequent exp) env)
                                                                                    +      (eval (if-alternative exp) env)))
                                                                                    +

                                                                                    + +The use of true? in eval-if highlights the issue of the +connection between an implemented language and an implementation +language. The if-predicate is evaluated in the language being +implemented and thus yields a value in that language. The interpreter +predicate true? translates that value into a value that can be +tested by the if in the implementation language: The +metacircular representation of truth might not be the same as that of +the underlying Scheme.6

                                                                                    + + +

                                                                                    Sequences

                                                                                    + +Eval-sequence is used by apply to evaluate the sequence of +expressions in a procedure body and by eval to evaluate the +sequence of expressions in a begin +expression. It takes as arguments a sequence of expressions and an +environment, and evaluates the expressions in the order in which they +occur. The value returned is the value of the final expression.

                                                                                    + +

                                                                                    (define (eval-sequence exps env)
                                                                                    +  (cond ((last-exp? exps) (eval (first-exp exps) env))
                                                                                    +        (else (eval (first-exp exps) env)
                                                                                    +              (eval-sequence (rest-exps exps) env))))
                                                                                    +

                                                                                    + + +

                                                                                    Assignments and definitions

                                                                                    + +The following procedure handles assignments to variables. It calls +eval to find the value to be assigned and transmits the variable +and the resulting value to set-variable-value! to be installed +in the designated environment.

                                                                                    + +

                                                                                    (define (eval-assignment exp env)
                                                                                    +  (set-variable-value! (assignment-variable exp)
                                                                                    +                       (eval (assignment-value exp) env)
                                                                                    +                       env)
                                                                                    +  'ok)
                                                                                    +

                                                                                    +Definitions of variables are handled in a similar +manner.7

                                                                                    + +

                                                                                    (define (eval-definition exp env)
                                                                                    +  (define-variable! (definition-variable exp)
                                                                                    +                    (eval (definition-value exp) env)
                                                                                    +                    env)
                                                                                    +  'ok)
                                                                                    +

                                                                                    +We have chosen here to return the symbol ok as the value +of an assignment or a definition.8

                                                                                    + +

                                                                                    +Exercise 4.1.  Notice that we cannot tell whether the metacircular evaluator +evaluates operands from left to right or from right to left. Its evaluation +order is inherited from the underlying Lisp: +If the arguments to cons in list-of-values +are evaluated from left to right, then list-of-values will +evaluate operands from left to right; and +if the arguments to cons +are evaluated from right to left, then list-of-values will +evaluate operands from right to left.

                                                                                    + +Write a version of list-of-values that evaluates operands +from left to right regardless of the order of evaluation in the underlying +Lisp. Also write a version of list-of-values that evaluates operands +from right to left. + +

                                                                                    + + +

                                                                                    4.1.2  Representing Expressions

                                                                                    + + + +The evaluator is reminiscent of the symbolic differentiation program +discussed in section 2.3.2. Both +programs operate on symbolic expressions. In both programs, the +result of operating on a compound expression is determined by +operating recursively on the pieces of the expression and combining +the results in a way that depends on the type of the expression. In +both programs we used data abstraction to decouple the general rules +of operation from the details of how expressions are represented. In +the differentiation program this meant that the same differentiation +procedure could deal with algebraic expressions in prefix form, in +infix form, or in some other form. For the evaluator, this means that +the syntax of the language being evaluated is determined solely by the +procedures that classify and extract pieces of expressions.

                                                                                    + +

                                                                                    Here is the specification of the syntax of our language: +

                                                                                    + +¤ The only self-evaluating items are numbers and +strings:

                                                                                    + +

                                                                                    (define (self-evaluating? exp)
                                                                                    +  (cond ((number? exp) true)
                                                                                    +        ((string? exp) true)
                                                                                    +        (else false)))
                                                                                    +

                                                                                    +¤ Variables are represented by symbols:

                                                                                    + +

                                                                                    (define (variable? exp) (symbol? exp))
                                                                                    +

                                                                                    +¤ Quotations have the form (quote +<text-of-quotation>):9

                                                                                    + +

                                                                                    (define (quoted? exp)
                                                                                    +  (tagged-list? exp 'quote))
                                                                                    +
                                                                                    +(define (text-of-quotation exp) (cadr exp))
                                                                                    +

                                                                                    +Quoted? is defined in terms of the procedure tagged-list?, which identifies lists beginning with a designated +symbol:

                                                                                    + +

                                                                                    (define (tagged-list? exp tag)
                                                                                    +  (if (pair? exp)
                                                                                    +      (eq? (car exp) tag)
                                                                                    +      false))
                                                                                    +

                                                                                    +¤ Assignments have the form (set! +<var> <value>):

                                                                                    + +

                                                                                    (define (assignment? exp)
                                                                                    +  (tagged-list? exp 'set!))
                                                                                    +(define (assignment-variable exp) (cadr exp))
                                                                                    +(define (assignment-value exp) (caddr exp))
                                                                                    +

                                                                                    +¤ Definitions have the form

                                                                                    + +

                                                                                    (define <var> <value>)
                                                                                    +

                                                                                    +or the form

                                                                                    + +

                                                                                    (define (<var> <parameter1> ... <parametern>)
                                                                                    +  <body>)
                                                                                    +

                                                                                    +The latter form (standard procedure definition) is syntactic sugar for

                                                                                    + +

                                                                                    (define <var>
                                                                                    +  (lambda (<parameter1> ... <parametern>)
                                                                                    +    <body>))
                                                                                    +

                                                                                    +The corresponding syntax procedures are the following:

                                                                                    + +

                                                                                    (define (definition? exp)
                                                                                    +  (tagged-list? exp 'define))
                                                                                    +(define (definition-variable exp)
                                                                                    +  (if (symbol? (cadr exp))
                                                                                    +      (cadr exp)
                                                                                    +      (caadr exp)))
                                                                                    +(define (definition-value exp)
                                                                                    +  (if (symbol? (cadr exp))
                                                                                    +      (caddr exp)
                                                                                    +      (make-lambda (cdadr exp)   ; formal parameters
                                                                                    +                   (cddr exp)))) ; body
                                                                                    +

                                                                                    Lambda expressions are lists that begin with the +symbol lambda:

                                                                                    + +

                                                                                    (define (lambda? exp) (tagged-list? exp 'lambda))
                                                                                    +(define (lambda-parameters exp) (cadr exp))
                                                                                    +(define (lambda-body exp) (cddr exp))
                                                                                    +

                                                                                    +We also provide a constructor for lambda expressions, +which is used by definition-value, above: +

                                                                                    (define (make-lambda parameters body)
                                                                                    +  (cons 'lambda (cons parameters body)))
                                                                                    +

                                                                                    +¤ Conditionals begin with if and have a predicate, a +consequent, and an (optional) alternative. If the expression has no +alternative part, we provide false as the alternative.10

                                                                                    + +

                                                                                    (define (if? exp) (tagged-list? exp 'if))
                                                                                    +(define (if-predicate exp) (cadr exp))
                                                                                    +(define (if-consequent exp) (caddr exp))
                                                                                    +(define (if-alternative exp)
                                                                                    +  (if (not (null? (cdddr exp)))
                                                                                    +      (cadddr exp)
                                                                                    +      'false))
                                                                                    +

                                                                                    +We also provide a constructor for if expressions, +to be used by cond->if to transform cond expressions +into if expressions: +

                                                                                    (define (make-if predicate consequent alternative)
                                                                                    +  (list 'if predicate consequent alternative))
                                                                                    +

                                                                                    Begin packages a sequence of expressions into a single +expression. We include syntax operations on begin expressions +to extract the actual sequence from the begin expression, as +well as selectors that return the first expression and the rest of the +expressions in the sequence.11

                                                                                    + +

                                                                                    (define (begin? exp) (tagged-list? exp 'begin))
                                                                                    +(define (begin-actions exp) (cdr exp))
                                                                                    +(define (last-exp? seq) (null? (cdr seq)))
                                                                                    +(define (first-exp seq) (car seq))
                                                                                    +(define (rest-exps seq) (cdr seq))
                                                                                    +

                                                                                    +We also include a constructor sequence->exp (for use by +cond->if) that transforms a sequence into a single expression, +using begin if necessary:

                                                                                    + +

                                                                                    (define (sequence->exp seq)
                                                                                    +  (cond ((null? seq) seq)
                                                                                    +        ((last-exp? seq) (first-exp seq))
                                                                                    +        (else (make-begin seq))))
                                                                                    +(define (make-begin seq) (cons 'begin seq))
                                                                                    +

                                                                                    +¤ A procedure application is any compound expression +that is not one of the above expression types. The car of the +expression is the operator, and the cdr is the list of operands:

                                                                                    + +

                                                                                    (define (application? exp) (pair? exp))
                                                                                    +(define (operator exp) (car exp))
                                                                                    +(define (operands exp) (cdr exp))
                                                                                    +(define (no-operands? ops) (null? ops))
                                                                                    +(define (first-operand ops) (car ops))
                                                                                    +(define (rest-operands ops) (cdr ops))
                                                                                    +

                                                                                    + + + +

                                                                                    Derived expressions

                                                                                    + + +Some special forms in our language can be defined in terms of +expressions involving other special forms, rather than being +implemented directly. One example is cond, which can be +implemented as a nest of if expressions. For example, +we can reduce the problem of evaluating the expression

                                                                                    + +

                                                                                    (cond ((> x 0) x)
                                                                                    +      ((= x 0) (display 'zero) 0)
                                                                                    +      (else (- x)))
                                                                                    +

                                                                                    +to the problem of evaluating the following +expression involving if and begin expressions:

                                                                                    + +

                                                                                    (if (> x 0)
                                                                                    +    x
                                                                                    +    (if (= x 0)
                                                                                    +        (begin (display 'zero)
                                                                                    +               0)
                                                                                    +        (- x)))
                                                                                    +

                                                                                    + +Implementing the evaluation of cond in this way +simplifies the evaluator because it reduces the number of special +forms for which the evaluation process must be explicitly specified.

                                                                                    + +We include syntax procedures that extract the parts of a cond +expression, and a procedure cond->if that transforms cond +expressions into if expressions. A case analysis begins with cond and has a list of predicate-action clauses. A clause is an else clause if its predicate is the symbol else.12

                                                                                    + +

                                                                                    (define (cond? exp) (tagged-list? exp 'cond))
                                                                                    +(define (cond-clauses exp) (cdr exp))
                                                                                    +(define (cond-else-clause? clause)
                                                                                    +  (eq? (cond-predicate clause) 'else))
                                                                                    +(define (cond-predicate clause) (car clause))
                                                                                    +(define (cond-actions clause) (cdr clause))
                                                                                    +(define (cond->if exp)
                                                                                    +  (expand-clauses (cond-clauses exp)))
                                                                                    +
                                                                                    +(define (expand-clauses clauses)
                                                                                    +  (if (null? clauses)
                                                                                    +      'false                          ; no else clause
                                                                                    +      (let ((first (car clauses))
                                                                                    +            (rest (cdr clauses)))
                                                                                    +        (if (cond-else-clause? first)
                                                                                    +            (if (null? rest)
                                                                                    +                (sequence->exp (cond-actions first))
                                                                                    +                (error "ELSE clause isn't last -- COND->IF"
                                                                                    +                       clauses))
                                                                                    +            (make-if (cond-predicate first)
                                                                                    +                     (sequence->exp (cond-actions first))
                                                                                    +                     (expand-clauses rest))))))
                                                                                    +

                                                                                    + +Expressions (such as cond) that we choose to implement as syntactic +transformations are called derived expressions. +Let expressions are also derived expressions +(see exercise 4.6).13

                                                                                    + +

                                                                                    +Exercise 4.2.  Louis Reasoner plans to reorder the cond clauses +in eval so that the clause for procedure applications appears +before the clause for assignments. He argues that this will make the +interpreter more efficient: Since programs usually contain more +applications than assignments, definitions, and so on, +his modified eval will usually check fewer +clauses than the original eval before identifying the type of an +expression.

                                                                                    + +

                                                                                    a. What is wrong with Louis's plan? (Hint: What will +Louis's evaluator do with the expression (define x 3)?)

                                                                                    + +

                                                                                    b. Louis is upset that his plan didn't work. +He is willing to go to any lengths to make his evaluator +recognize procedure applications before it checks for most other +kinds of expressions. +Help him by changing the syntax of the evaluated language so that +procedure applications start with call. For example, instead of +(factorial 3) we will now have to write (call factorial 3) +and instead of (+ 1 2) we will have to write (call + 1 2). + +

                                                                                    + +

                                                                                    +Exercise 4.3.  Rewrite eval so that the dispatch is done in data-directed +style. Compare this with the data-directed +differentiation procedure of +exercise 2.73. +(You may use the car of a compound expression as the +type of the expression, as is appropriate for the syntax implemented +in this section.) +. +

                                                                                    + +

                                                                                    +Exercise 4.4.  Recall the definitions of the special forms and and or +from chapter 1: +

                                                                                      +
                                                                                    • and: The expressions are evaluated from +left to right. If any expression evaluates to +false, false is returned; any remaining expressions are not +evaluated. If all the expressions evaluate to true values, the value +of the last expression is returned. If there are no expressions then +true is returned.

                                                                                      + +

                                                                                    • or: The expressions are evaluated from left to right. If any +expression evaluates to a true value, that value is +returned; any remaining expressions are not evaluated. If all +expressions evaluate to false, or if there are no expressions, +then false is returned. +

                                                                                    +Install and and or as new special forms for the evaluator +by defining appropriate syntax procedures and evaluation +procedures eval-and and eval-or. Alternatively, show how +to implement and and or as derived expressions. +

                                                                                    + + +

                                                                                    +Exercise 4.5.  Scheme allows an additional syntax for cond clauses, (<test> => <recipient>). If <test> +evaluates to a true value, then <recipient> is evaluated. Its +value must be a procedure of one argument; this procedure is then +invoked on the value of the <test>, and the result is returned as +the value of the cond expression. For example

                                                                                    + +

                                                                                    (cond ((assoc 'b '((a 1) (b 2))) => cadr)
                                                                                    +      (else false))
                                                                                    +

                                                                                    +returns 2. +Modify the handling of cond so that it supports this extended +syntax. +

                                                                                    + +

                                                                                    +Exercise 4.6.  Let expressions are derived expressions, because

                                                                                    + +

                                                                                    (let ((<var1> <exp1>) ... (<varn> <expn>))
                                                                                    +  <body>)
                                                                                    +

                                                                                    +is equivalent to

                                                                                    + +

                                                                                    ((lambda (<var1... <varn>)
                                                                                    +   <body>)
                                                                                    + <exp1>

                                                                                    + <expn>)
                                                                                    +

                                                                                    +Implement a syntactic transformation let->combination that +reduces evaluating let expressions to evaluating combinations of +the type shown above, and add the appropriate clause to eval to +handle let expressions. + +

                                                                                    + +

                                                                                    +Exercise 4.7.  Let* is similar to let, except that the bindings of the let variables are performed sequentially from left to right, and each +binding is made in an environment in which all of the preceding +bindings are visible. For example +

                                                                                    (let* ((x 3)
                                                                                    +       (y (+ x 2))
                                                                                    +       (z (+ x y 5)))
                                                                                    +  (* x z))
                                                                                    +

                                                                                    +returns 39. Explain how a let* expression can be rewritten as a +set of nested let expressions, and write a procedure let*->nested-lets that performs this transformation. If we +have already implemented let (exercise 4.6) +and we want to +extend the evaluator to handle let*, is it sufficient to add +a clause to eval whose action is +

                                                                                    (eval (let*->nested-lets exp) env)
                                                                                    +

                                                                                    +or must we +explicitly expand let* in terms of non-derived expressions? +

                                                                                    + +

                                                                                    +Exercise 4.8.  ``Named let'' is a variant of let that has the form +

                                                                                    (let <var> <bindings> <body>)
                                                                                    +

                                                                                    +The <bindings> and <body> are just as in ordinary let, except that <var> is bound within <body> to a +procedure whose body is <body> and whose parameters are the +variables in the <bindings>. Thus, one can repeatedly execute the +<body> by invoking the procedure named <var>. For example, +the iterative Fibonacci procedure (section 1.2.2) +can be rewritten using named let as follows: +

                                                                                    (define (fib n)
                                                                                    +  (let fib-iter ((a 1)
                                                                                    +                 (b 0)
                                                                                    +                 (count n))
                                                                                    +    (if (= count 0)
                                                                                    +        b
                                                                                    +        (fib-iter (+ a b) a (- count 1)))))
                                                                                    +

                                                                                    +Modify let->combination of exercise 4.6 to +also support named let. +

                                                                                    + +

                                                                                    +Exercise 4.9.  Many languages support a variety of iteration constructs, such as do, for, while, and until. In Scheme, +iterative processes can be expressed in terms of ordinary procedure +calls, so special iteration constructs provide no essential gain in +computational power. On the other hand, such constructs are often +convenient. Design some iteration constructs, give examples of their +use, and show how to implement them as derived expressions. +

                                                                                    + +

                                                                                    +Exercise 4.10.  By using data abstraction, we were able to write an eval +procedure that is independent of the particular syntax of the language +to be evaluated. To illustrate this, design and implement a new +syntax for Scheme by modifying the procedures in this section, without +changing eval or apply. +

                                                                                    + + +

                                                                                    4.1.3  Evaluator Data Structures

                                                                                    + +

                                                                                    + +In addition to defining the external syntax of expressions, the +evaluator implementation must also define the data structures that the +evaluator manipulates internally, as part of the execution of a +program, such as the representation of procedures and environments and +the representation of true and false.

                                                                                    + + +

                                                                                    Testing of predicates

                                                                                    + +For conditionals, we accept anything to be true that is not +the explicit false object.

                                                                                    + +

                                                                                    (define (true? x)
                                                                                    +  (not (eq? x false)))
                                                                                    +(define (false? x)
                                                                                    +  (eq? x false))
                                                                                    +

                                                                                    + + +

                                                                                    Representing procedures

                                                                                    + + +To handle primitives, we assume that we have available the +following procedures:

                                                                                    + +

                                                                                      +
                                                                                    • (apply-primitive-procedure <proc> <args>)
                                                                                      +applies the given primitive procedure to the argument values in the +list <args> and returns the result of the application.

                                                                                      + +

                                                                                    • (primitive-procedure? <proc>)
                                                                                      +tests whether <proc> is a primitive procedure. +

                                                                                    + +These mechanisms for handling primitives are further described in +section 4.1.4.

                                                                                    + +Compound procedures are constructed from parameters, procedure +bodies, and environments using the constructor make-procedure:

                                                                                    + +

                                                                                    (define (make-procedure parameters body env)
                                                                                    +  (list 'procedure parameters body env))
                                                                                    +(define (compound-procedure? p)
                                                                                    +  (tagged-list? p 'procedure))
                                                                                    +(define (procedure-parameters p) (cadr p))
                                                                                    +(define (procedure-body p) (caddr p))
                                                                                    +(define (procedure-environment p) (cadddr p))
                                                                                    +

                                                                                    + + +

                                                                                    Operations on Environments

                                                                                    + + + +The evaluator needs operations for manipulating environments. As +explained in section 3.2, an environment is a +sequence of frames, where each frame is a table of bindings that +associate variables with their corresponding values. We use +the following operations for manipulating environments:

                                                                                    + +

                                                                                      +
                                                                                    • (lookup-variable-value <var> <env>)
                                                                                      +returns the value that is bound to the symbol <var> in the +environment <env>, or signals an error if the variable is unbound.

                                                                                      + +

                                                                                    • (extend-environment <variables> <values> <base-env>)
                                                                                      +returns a new environment, consisting of a new frame in which the +symbols in the list <variables> are bound to the corresponding +elements in the list <values>, where the enclosing environment is +the environment <base-env>.

                                                                                      + +

                                                                                    • (define-variable! <var> <value> <env>)
                                                                                      +adds to the first frame in the environment <env> a new binding that +associates the variable <var> with the value <value>.

                                                                                      + +

                                                                                    • (set-variable-value! <var> <value> <env>)
                                                                                      +changes the binding of the variable <var> in the environment <env> +so that the variable is now bound to the value <value>, or signals +an error if the variable is unbound. +

                                                                                    + +To implement these operations we represent an environment as a list of +frames. The enclosing environment of an environment is the cdr of +the list. The empty environment is simply the empty list.

                                                                                    + +

                                                                                    (define (enclosing-environment env) (cdr env))
                                                                                    +(define (first-frame env) (car env))
                                                                                    +(define the-empty-environment '())
                                                                                    +

                                                                                    +Each frame of an environment is represented as a pair of lists: a list +of the variables bound in that frame and a list of the associated values.14 +

                                                                                    (define (make-frame variables values)
                                                                                    +  (cons variables values))
                                                                                    +(define (frame-variables frame) (car frame))
                                                                                    +(define (frame-values frame) (cdr frame))
                                                                                    +(define (add-binding-to-frame! var val frame)
                                                                                    +  (set-car! frame (cons var (car frame)))
                                                                                    +  (set-cdr! frame (cons val (cdr frame))))
                                                                                    +

                                                                                    + +To extend an environment by a new frame that associates variables with +values, we make a frame consisting of the list of variables and the +list of values, and we adjoin this to the environment. We signal +an error if the number of variables does not match the number of values.

                                                                                    + + +

                                                                                    (define (extend-environment vars vals base-env)
                                                                                    +  (if (= (length vars) (length vals))
                                                                                    +      (cons (make-frame vars vals) base-env)
                                                                                    +      (if (< (length vars) (length vals))
                                                                                    +          (error "Too many arguments supplied" vars vals)
                                                                                    +          (error "Too few arguments supplied" vars vals))))
                                                                                    +

                                                                                    + + +To look up a variable in an environment, we scan the list of variables +in the first frame. If we find the desired variable, we return +the corresponding element in the list of values. If we do not find +the variable in the current frame, we search the enclosing environment, +and so on. If we reach the empty environment, we signal an ``unbound +variable'' error.

                                                                                    + + +

                                                                                    (define (lookup-variable-value var env)
                                                                                    +  (define (env-loop env)
                                                                                    +    (define (scan vars vals)
                                                                                    +      (cond ((null? vars)
                                                                                    +             (env-loop (enclosing-environment env)))
                                                                                    +            ((eq? var (car vars))
                                                                                    +             (car vals))
                                                                                    +            (else (scan (cdr vars) (cdr vals)))))
                                                                                    +    (if (eq? env the-empty-environment)
                                                                                    +        (error "Unbound variable" var)
                                                                                    +        (let ((frame (first-frame env)))
                                                                                    +          (scan (frame-variables frame)
                                                                                    +                (frame-values frame)))))
                                                                                    +  (env-loop env))
                                                                                    +

                                                                                    + +To set a variable to a new value in a specified environment, we scan +for the variable, just as in lookup-variable-value, and change +the corresponding value when we find it.

                                                                                    + + +

                                                                                    (define (set-variable-value! var val env)
                                                                                    +  (define (env-loop env)
                                                                                    +    (define (scan vars vals)
                                                                                    +      (cond ((null? vars)
                                                                                    +             (env-loop (enclosing-environment env)))
                                                                                    +            ((eq? var (car vars))
                                                                                    +             (set-car! vals val))
                                                                                    +            (else (scan (cdr vars) (cdr vals)))))
                                                                                    +    (if (eq? env the-empty-environment)
                                                                                    +        (error "Unbound variable -- SET!" var)
                                                                                    +        (let ((frame (first-frame env)))
                                                                                    +          (scan (frame-variables frame)
                                                                                    +                (frame-values frame)))))
                                                                                    +  (env-loop env))
                                                                                    +

                                                                                    + +To define a variable, we search the first frame for a binding for +the variable, and change the binding if it exists +(just as in set-variable-value!). If no such binding +exists, we adjoin one to the first frame.

                                                                                    + +

                                                                                    (define (define-variable! var val env)
                                                                                    +  (let ((frame (first-frame env)))
                                                                                    +    (define (scan vars vals)
                                                                                    +      (cond ((null? vars)
                                                                                    +             (add-binding-to-frame! var val frame))
                                                                                    +            ((eq? var (car vars))
                                                                                    +             (set-car! vals val))
                                                                                    +            (else (scan (cdr vars) (cdr vals)))))
                                                                                    +    (scan (frame-variables frame)
                                                                                    +          (frame-values frame))))
                                                                                    +

                                                                                    + +The method described here is only one of many plausible ways to +represent environments. Since we used data abstraction to isolate the +rest of the evaluator from the detailed choice of representation, we +could change the environment representation if we wanted to. (See +exercise 4.11.) In a +production-quality Lisp system, the speed of the evaluator's +environment operations -- especially that of variable lookup -- has a +major impact on the performance of the system. The representation +described here, although conceptually simple, is not efficient and +would not ordinarily be used in a production system.15

                                                                                    + +

                                                                                    +Exercise 4.11.  Instead of representing a frame as a pair of lists, we can represent a +frame as a list of bindings, where each binding is a name-value pair. +Rewrite the environment operations to use this alternative +representation. + +

                                                                                    + +

                                                                                    +Exercise 4.12.  The procedures set-variable-value!, define-variable!, +and lookup-variable-value can be expressed in terms of +more abstract procedures for traversing the environment structure. +Define abstractions that capture the common patterns and redefine +the three procedures in terms of these abstractions. +

                                                                                    + +

                                                                                    +Exercise 4.13.  Scheme allows us to create new bindings for variables by means of define, but provides no way to get rid of bindings. Implement for +the evaluator a special form make-unbound! that removes the +binding of a given symbol from the environment in which the +make-unbound! expression is evaluated. +This problem is not completely specified. For example, +should we remove only the binding in the first frame of the +environment? Complete the specification and justify any choices you +make. +

                                                                                    + + +

                                                                                    4.1.4  Running the Evaluator as a Program

                                                                                    + + + +Given the evaluator, we have in our hands a description +(expressed in Lisp) of the process +by which Lisp expressions are evaluated. One advantage of expressing the +evaluator as a program is that we can run the program. This gives us, +running within Lisp, a working model of how Lisp itself evaluates +expressions. This can serve as a framework for experimenting with +evaluation rules, as we shall do later in this chapter.

                                                                                    + +Our evaluator program reduces expressions ultimately to the +application of primitive procedures. Therefore, all that we need to +run the evaluator is to create a mechanism that calls on the underlying +Lisp system to model the application of primitive procedures.

                                                                                    + +There must be a binding for each primitive procedure name, so that when +eval evaluates the operator of an application of a primitive, it +will find an object to pass to apply. We thus set up a global +environment that associates unique objects with the names of the +primitive procedures that can appear +in the expressions we will be evaluating. The +global environment also includes bindings for the symbols true and +false, so that they can be used as variables in expressions +to be evaluated.

                                                                                    + +

                                                                                    (define (setup-environment)
                                                                                    +  (let ((initial-env
                                                                                    +         (extend-environment (primitive-procedure-names)
                                                                                    +                             (primitive-procedure-objects)
                                                                                    +                             the-empty-environment)))
                                                                                    +    (define-variable! 'true true initial-env)
                                                                                    +    (define-variable! 'false false initial-env)
                                                                                    +    initial-env))
                                                                                    +(define the-global-environment (setup-environment))
                                                                                    +

                                                                                    + +It does not matter how we represent the primitive procedure objects, +so long as apply can identify and apply them by using the +procedures primitive-procedure? and apply-primitive-procedure. We have chosen to represent a primitive +procedure as a list beginning with the symbol primitive and +containing a procedure in the underlying Lisp that implements that primitive.

                                                                                    + +

                                                                                    (define (primitive-procedure? proc)
                                                                                    +  (tagged-list? proc 'primitive))
                                                                                    +
                                                                                    +(define (primitive-implementation proc) (cadr proc))
                                                                                    +

                                                                                    + +Setup-environment will get the primitive names and implementation +procedures from a list:16

                                                                                    + +

                                                                                    (define primitive-procedures
                                                                                    +  (list (list 'car car)
                                                                                    +        (list 'cdr cdr)
                                                                                    +        (list 'cons cons)
                                                                                    +        (list 'null? null?)
                                                                                    +        <more primitives>
                                                                                    +        ))
                                                                                    +(define (primitive-procedure-names)
                                                                                    +  (map car
                                                                                    +       primitive-procedures))
                                                                                    +
                                                                                    +(define (primitive-procedure-objects)
                                                                                    +  (map (lambda (proc) (list 'primitive (cadr proc)))
                                                                                    +       primitive-procedures))
                                                                                    +

                                                                                    + +To apply a primitive procedure, we simply apply the implementation +procedure to the arguments, using the underlying Lisp system:17

                                                                                    + +

                                                                                    (define (apply-primitive-procedure proc args)
                                                                                    +  (apply-in-underlying-scheme
                                                                                    +   (primitive-implementation proc) args))
                                                                                    +

                                                                                    + +For convenience in running the metacircular evaluator, we provide a driver loop that models the read-eval-print loop of the underlying +Lisp system. It prints a prompt, reads an input expression, +evaluates this expression in the global environment, and prints the +result. We precede each printed result by an output prompt so +as to distinguish the value of the expression from other +output that may be printed.18

                                                                                    + +

                                                                                    (define input-prompt ";;; M-Eval input:")
                                                                                    +(define output-prompt ";;; M-Eval value:")
                                                                                    +(define (driver-loop)
                                                                                    +  (prompt-for-input input-prompt)
                                                                                    +  (let ((input (read)))
                                                                                    +    (let ((output (eval input the-global-environment)))
                                                                                    +      (announce-output output-prompt)
                                                                                    +      (user-print output)))
                                                                                    +  (driver-loop))
                                                                                    +(define (prompt-for-input string)
                                                                                    +  (newline) (newline) (display string) (newline))
                                                                                    +
                                                                                    +(define (announce-output string)
                                                                                    +  (newline) (display string) (newline))
                                                                                    +

                                                                                    +We use a special printing procedure, user-print, to avoid printing the +environment part of a compound procedure, which may be a very long list +(or may even contain cycles).

                                                                                    + +

                                                                                    (define (user-print object)
                                                                                    +  (if (compound-procedure? object)
                                                                                    +      (display (list 'compound-procedure
                                                                                    +                     (procedure-parameters object)
                                                                                    +                     (procedure-body object)
                                                                                    +                     '<procedure-env>))
                                                                                    +      (display object)))
                                                                                    +

                                                                                    + +Now all we need to do to run the evaluator is to initialize the +global environment and start the driver loop. Here is a sample +interaction:

                                                                                    + +

                                                                                    (define the-global-environment (setup-environment))
                                                                                    +(driver-loop)
                                                                                    +;;; M-Eval input:
                                                                                    +(define (append x y)
                                                                                    +  (if (null? x)
                                                                                    +      y
                                                                                    +      (cons (car x)
                                                                                    +            (append (cdr x) y))))
                                                                                    +;;; M-Eval value:
                                                                                    +ok
                                                                                    +;;; M-Eval input:
                                                                                    +(append '(a b c) '(d e f))
                                                                                    +;;; M-Eval value:
                                                                                    +(a b c d e f)
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.14.  Eva Lu Ator and Louis Reasoner are each experimenting with the +metacircular evaluator. Eva types in the definition of map, and +runs some test programs that use it. They work fine. Louis, in contrast, +has installed the system version of map as a primitive for the +metacircular evaluator. When he tries it, things go terribly +wrong. Explain why Louis's map fails even though Eva's works. +

                                                                                    + + +

                                                                                    4.1.5  Data as Programs

                                                                                    + + + +In thinking about a Lisp program that evaluates Lisp expressions, an +analogy might be helpful. One operational view of the meaning of a +program is that a program is a description of an abstract (perhaps +infinitely large) machine. For example, consider the familiar +program to compute factorials:

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* (factorial (- n 1)) n)))
                                                                                    +

                                                                                    +We may regard this program as the description of a machine containing +parts that decrement, multiply, and test for equality, together with a +two-position switch and another factorial machine. (The factorial +machine is infinite because it contains another factorial machine +within it.) Figure 4.2 is a flow diagram for the +factorial machine, showing how the parts are wired together.

                                                                                    + +

                                                                                    +
                                                                                    Figure 4.2:  The factorial program, viewed as an abstract machine.
                                                                                    + +

                                                                                    + + +In a similar way, we can regard the evaluator as a very special +machine that takes as input a description of a machine. Given this +input, the evaluator configures itself to emulate the machine +described. For example, if we feed our evaluator the definition of +factorial, as shown in figure 4.3, the +evaluator will be able to compute factorials.

                                                                                    + +

                                                                                    +
                                                                                    Figure 4.3:  The evaluator emulating a factorial machine.
                                                                                    + +

                                                                                    + +From this perspective, our evaluator is seen to be a universal machine. +It mimics other machines when these are described as Lisp programs.19 +This is striking. Try to imagine an analogous evaluator for electrical +circuits. This would be a circuit that takes as input a signal +encoding the plans for some other circuit, such as a filter. Given +this input, the circuit evaluator would then behave like a filter with +the same description. Such a universal electrical circuit is +almost unimaginably complex. It is remarkable that the program +evaluator is a rather simple program.20

                                                                                    + +Another striking aspect of the evaluator is that it acts as a bridge +between the data objects that are manipulated by our programming +language and the programming language itself. Imagine that the +evaluator program (implemented in Lisp) is running, and that a user is +typing expressions to the evaluator and observing the results. From +the perspective of the user, an input expression such as (* x x) +is an expression in the programming language, which the evaluator +should execute. From the perspective of the evaluator, however, the +expression is simply a list (in this case, a list of three symbols: +*, x, and x) that is to be manipulated according to +a well-defined set of rules.

                                                                                    + +That the user's programs are the evaluator's data need not be a source +of confusion. In fact, it is sometimes convenient to ignore this +distinction, and to give the user the ability to explicitly evaluate a +data object as a Lisp expression, by making eval available for +use in programs. Many Lisp dialects provide a primitive eval +procedure that takes as arguments an expression and an environment and +evaluates the expression relative to the environment.21 +Thus,

                                                                                    + +

                                                                                    (eval '(* 5 5) user-initial-environment)
                                                                                    +

                                                                                    +and +

                                                                                    (eval (cons '* (list 5 5)) user-initial-environment)
                                                                                    +

                                                                                    +will both return 25.22

                                                                                    + + +

                                                                                    +Exercise 4.15.  Given a one-argument procedure p and an object a, p +is said to ``halt'' on a if evaluating the expression (p +a) returns a value (as opposed to terminating with an error message +or running forever). Show that it is impossible to write a procedure +halts? that correctly determines whether p halts on a for any procedure p and object a. Use the following +reasoning: If you had such a procedure halts?, you could +implement the following program: +

                                                                                    (define (run-forever) (run-forever))
                                                                                    +
                                                                                    +(define (try p)
                                                                                    +  (if (halts? p p)
                                                                                    +      (run-forever)
                                                                                    +      'halted))
                                                                                    +

                                                                                    +Now consider evaluating the expression (try try) and show that +any possible outcome (either halting or running forever) violates the +intended behavior of halts?.23 + +

                                                                                    + + +

                                                                                    4.1.6  Internal Definitions

                                                                                    + + + +Our environment model of evaluation and our metacircular evaluator execute +definitions in sequence, extending the environment frame one +definition at a time. This is particularly convenient for interactive +program development, in which the programmer needs to freely mix the +application of procedures with the definition of new procedures. +However, if we think carefully about the internal definitions +used to implement block structure (introduced in +section 1.1.8), we will find that name-by-name extension +of the environment may not be the best way to define local variables.

                                                                                    + +Consider a procedure with internal definitions, such as

                                                                                    + +

                                                                                    (define (f x)
                                                                                    +  (define (even? n)
                                                                                    +    (if (= n 0)
                                                                                    +        true
                                                                                    +        (odd? (- n 1))))
                                                                                    +  (define (odd? n)
                                                                                    +    (if (= n 0)
                                                                                    +        false
                                                                                    +        (even? (- n 1))))
                                                                                    +  <rest of body of f>)
                                                                                    +

                                                                                    +Our intention here is that the name odd? in the body of the +procedure even? should refer to the procedure odd? that is +defined after even?. The scope of the name odd? is the +entire body of f, not just the portion of the body of f +starting at the point where the define for odd? occurs. +Indeed, when we consider that odd? is itself defined in terms of +even? -- so that even? and odd? are mutually +recursive procedures -- we see that the only satisfactory +interpretation of the two defines is to regard them as if the +names even? and odd? were being added to the environment +simultaneously. +More generally, in block structure, the scope of a local name is the +entire procedure body in which the define is evaluated.

                                                                                    + + +As it happens, our interpreter will evaluate calls to f +correctly, but for an ``accidental'' reason: Since the definitions of +the internal procedures come first, no calls to these procedures will +be evaluated until all of them have been defined. Hence, odd? +will have been defined by the time even? is executed. In fact, +our sequential evaluation mechanism will give the same result as a +mechanism that directly implements simultaneous definition for any +procedure in which the internal definitions come first in a body and +evaluation of the value expressions for the defined variables doesn't +actually use any of the defined variables. +(For an example of a procedure that doesn't obey these restrictions, +so that sequential definition isn't equivalent to simultaneous definition, +see exercise 4.19.)24

                                                                                    + +There is, however, a simple way to treat definitions so that +internally defined names have truly simultaneous scope -- just create +all local variables that will be in the current environment before +evaluating any of the value expressions. One way to do this is by a +syntax transformation on lambda expressions. Before evaluating +the body of a lambda expression, we ``scan out'' and eliminate +all the internal definitions in the body. The internally defined +variables will be created with a let and then set to their +values by assignment. For example, the procedure

                                                                                    + +

                                                                                    (lambda <vars>
                                                                                    +  (define u <e1>)
                                                                                    +  (define v <e2>)
                                                                                    +  <e3>)
                                                                                    +

                                                                                    +would be transformed into

                                                                                    + +

                                                                                    (lambda <vars>
                                                                                    +  (let ((u '*unassigned*)
                                                                                    +        (v '*unassigned*))
                                                                                    +    (set! u <e1>)
                                                                                    +    (set! v <e2>)
                                                                                    +    <e3>))
                                                                                    +

                                                                                    +where *unassigned* is a special symbol that causes looking up a +variable to signal an error if an attempt is made to use the value of +the not-yet-assigned variable.

                                                                                    + +An alternative strategy for scanning out internal definitions is shown +in exercise 4.18. Unlike the transformation +shown above, this enforces the restriction that the defined variables' +values can be evaluated without using any of the variables' values.25

                                                                                    + +

                                                                                    +Exercise 4.16.  In this exercise we implement the method just described for +interpreting internal definitions. +We assume that the evaluator supports let +(see exercise 4.6).

                                                                                    + +a.  Change lookup-variable-value +(section 4.1.3) to signal an error if +the value it finds is the symbol *unassigned*.

                                                                                    + +b.  Write a procedure scan-out-defines that takes a +procedure body and returns an equivalent one that has no internal +definitions, by making the transformation described above.

                                                                                    + +c.  Install scan-out-defines in the interpreter, either in make-procedure or in procedure-body (see +section 4.1.3). Which place is better? +Why? + +

                                                                                    + +

                                                                                    +Exercise 4.17.  Draw diagrams of the environment in effect when evaluating the +expression <e3> in the procedure in the text, comparing how this +will be structured when definitions are interpreted sequentially with +how it will be structured if definitions are scanned out as described. +Why is there an extra frame in the transformed program? Explain why +this difference in environment structure can never make a difference +in the behavior of a correct program. Design a way to make the +interpreter implement the ``simultaneous'' scope rule for internal +definitions without constructing the extra frame. +

                                                                                    + +

                                                                                    +Exercise 4.18.  Consider an alternative strategy for scanning out definitions that +translates the example in the text to +

                                                                                    (lambda <vars>
                                                                                    +  (let ((u '*unassigned*)
                                                                                    +        (v '*unassigned*))
                                                                                    +    (let ((a <e1>)
                                                                                    +          (b <e2>))
                                                                                    +      (set! u a)
                                                                                    +      (set! v b))
                                                                                    +    <e3>))
                                                                                    +

                                                                                    +Here a and b are meant to represent new variable names, +created by the interpreter, that do not appear in the user's +program. +Consider the solve procedure from +section 3.5.4:

                                                                                    + +

                                                                                    (define (solve f y0 dt)
                                                                                    +  (define y (integral (delay dy) y0 dt))
                                                                                    +  (define dy (stream-map f y))
                                                                                    +  y)
                                                                                    +

                                                                                    +Will this procedure work if internal definitions are scanned out as +shown in this exercise? What if they are scanned out as shown in the +text? Explain. + +

                                                                                    + +

                                                                                    +Exercise 4.19.  Ben Bitdiddle, Alyssa P. Hacker, and Eva Lu Ator are arguing about +the desired result of evaluating the expression

                                                                                    + +

                                                                                    (let ((a 1))
                                                                                    +  (define (f x)
                                                                                    +    (define b (+ a x))
                                                                                    +    (define a 5)
                                                                                    +    (+ a b))
                                                                                    +  (f 10))
                                                                                    +

                                                                                    +Ben asserts that the result should be obtained using the sequential +rule for define: b is defined to be 11, then a is +defined to be 5, so the result is 16. Alyssa objects that mutual +recursion requires the simultaneous scope rule for internal procedure +definitions, and that it is unreasonable to treat procedure names +differently from other names. Thus, she argues for the mechanism +implemented in exercise 4.16. This would lead to +a being unassigned at the time that the value for b is to +be computed. Hence, in Alyssa's view the procedure should produce an +error. Eva has a third opinion. She says that if the definitions of +a and b are truly meant to be simultaneous, then the value +5 for a should be used in evaluating b. Hence, in Eva's +view a should be 5, b should be 15, and the result should +be 20. Which (if any) of these viewpoints do you support? Can you +devise a way to implement internal definitions so that they behave as +Eva prefers?26 + +

                                                                                    + +

                                                                                    +Exercise 4.20.  Because internal definitions look sequential but are actually +simultaneous, some people prefer to avoid them entirely, and use the +special form letrec instead. Letrec looks like let, +so it is not surprising that the variables it binds are bound +simultaneously and have the same scope as each other. The sample +procedure f above can be written without internal definitions, +but with exactly the same meaning, as

                                                                                    + +

                                                                                    (define (f x)
                                                                                    +  (letrec ((even?
                                                                                    +            (lambda (n)
                                                                                    +              (if (= n 0)
                                                                                    +                  true
                                                                                    +                  (odd? (- n 1)))))
                                                                                    +           (odd?
                                                                                    +            (lambda (n)
                                                                                    +              (if (= n 0)
                                                                                    +                  false
                                                                                    +                  (even? (- n 1))))))
                                                                                    +    <rest of body of f>))
                                                                                    +

                                                                                    +Letrec expressions, which have the form +

                                                                                    (letrec ((<var1> <exp1>) ... (<varn> <expn>))
                                                                                    +  <body>)
                                                                                    +

                                                                                    +are a variation on let in which the expressions +<expk> that provide the initial values for the variables <vark> +are evaluated in an environment that includes all the letrec +bindings. This permits recursion in the bindings, such as the mutual +recursion of even? and odd? in the example above, or +the evaluation of 10 factorial with

                                                                                    + +

                                                                                    (letrec ((fact
                                                                                    +          (lambda (n)
                                                                                    +            (if (= n 1)
                                                                                    +                1
                                                                                    +                (* n (fact (- n 1)))))))
                                                                                    +  (fact 10))
                                                                                    +

                                                                                    + +

                                                                                    a. Implement letrec as a derived expression, by transforming +a letrec expression into a let expression as shown in +the text above or in exercise 4.18. +That is, the letrec variables should be created with a let +and then be assigned their values with set!.

                                                                                    + +

                                                                                    b. Louis Reasoner is confused by all this fuss about internal +definitions. The way he sees it, if you don't like to use define inside a procedure, you can just use let. Illustrate +what is loose about his reasoning by drawing an environment diagram +that shows the environment in which the <rest of body of f> +is evaluated during evaluation of the expression (f 5), with +f defined as in this exercise. Draw +an environment diagram for the same evaluation, but with let in +place of letrec in the definition of f. + +

                                                                                    + +

                                                                                    +Exercise 4.21.  Amazingly, Louis's intuition in exercise 4.20 +is correct. It is indeed possible to specify recursive procedures +without using letrec (or even define), although the method +for accomplishing this is much more subtle than Louis imagined. The +following expression computes 10 factorial by applying a recursive +factorial procedure:27 +

                                                                                    ((lambda (n)
                                                                                    +   ((lambda (fact)
                                                                                    +      (fact fact n))
                                                                                    +    (lambda (ft k)
                                                                                    +      (if (= k 1)
                                                                                    +          1
                                                                                    +          (* k (ft ft (- k 1)))))))
                                                                                    + 10)
                                                                                    +

                                                                                    + +

                                                                                    a. Check (by evaluating the expression) that this really does compute +factorials. Devise an analogous expression for computing Fibonacci numbers.

                                                                                    + +

                                                                                    b. Consider the following procedure, which includes mutually recursive +internal definitions: +

                                                                                    (define (f x)
                                                                                    +  (define (even? n)
                                                                                    +    (if (= n 0)
                                                                                    +        true
                                                                                    +        (odd? (- n 1))))
                                                                                    +  (define (odd? n)
                                                                                    +    (if (= n 0)
                                                                                    +        false
                                                                                    +        (even? (- n 1))))
                                                                                    +  (even? x))
                                                                                    +

                                                                                    +Fill in the missing expressions to complete an alternative definition +of f, which uses neither internal definitions nor letrec: +

                                                                                    (define (f x)
                                                                                    +  ((lambda (even? odd?)
                                                                                    +     (even? even? odd? x))
                                                                                    +   (lambda (ev? od? n)
                                                                                    +     (if (= n 0) true (od? <??> <??> <??>)))
                                                                                    +   (lambda (ev? od? n)
                                                                                    +     (if (= n 0) false (ev? <??> <??> <??>)))))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    4.1.7  Separating Syntactic Analysis from Execution

                                                                                    + + + +The evaluator implemented above is simple, but it is very +inefficient, because the syntactic analysis of expressions is interleaved +with their execution. Thus if a program is executed many times, its +syntax is analyzed many times. Consider, for example, evaluating (factorial 4) using the following definition of factorial:

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* (factorial (- n 1)) n)))
                                                                                    +

                                                                                    + +Each time factorial is called, the evaluator must determine that +the body is an if expression and extract the predicate. +Only then can it evaluate the +predicate and dispatch on its value. Each time it evaluates the +expression (* (factorial (- n 1)) n), +or the subexpressions (factorial (- n 1)) and (- n 1), +the evaluator must perform +the case analysis in eval to determine that the expression is an +application, and must extract its operator and operands. This +analysis is expensive. Performing it repeatedly is wasteful.

                                                                                    + +We can transform the evaluator to be significantly more efficient by +arranging things so that syntactic analysis is performed only +once.28 We split eval, which takes an +expression and an environment, into two parts. The procedure analyze takes only the expression. It performs the syntactic +analysis and returns a new procedure, the execution procedure, that +encapsulates the work to be done in executing the analyzed +expression. The execution procedure takes an environment as its +argument and completes the evaluation. This saves work because analyze will be called only once on an expression, while the +execution procedure may be called many times.

                                                                                    + +With the separation into analysis and execution, eval now becomes

                                                                                    + +

                                                                                    (define (eval exp env)
                                                                                    +  ((analyze exp) env))
                                                                                    +

                                                                                    + +The result of calling analyze is the execution procedure to +be applied to the environment. The analyze procedure is +the same case analysis as performed by the original eval of +section 4.1.1, except that the procedures to +which we dispatch perform only analysis, not full evaluation:

                                                                                    + +

                                                                                    (define (analyze exp)
                                                                                    +  (cond ((self-evaluating? exp) 
                                                                                    +         (analyze-self-evaluating exp))
                                                                                    +        ((quoted? exp) (analyze-quoted exp))
                                                                                    +        ((variable? exp) (analyze-variable exp))
                                                                                    +        ((assignment? exp) (analyze-assignment exp))
                                                                                    +        ((definition? exp) (analyze-definition exp))
                                                                                    +        ((if? exp) (analyze-if exp))
                                                                                    +        ((lambda? exp) (analyze-lambda exp))
                                                                                    +        ((begin? exp) (analyze-sequence (begin-actions exp)))
                                                                                    +        ((cond? exp) (analyze (cond->if exp)))
                                                                                    +        ((application? exp) (analyze-application exp))
                                                                                    +        (else
                                                                                    +         (error "Unknown expression type -- ANALYZE" exp))))
                                                                                    +

                                                                                    + +Here is the simplest syntactic analysis procedure, which handles +self-evaluating expressions. It returns an execution procedure that +ignores its environment argument and just returns the expression:

                                                                                    + +

                                                                                    (define (analyze-self-evaluating exp)
                                                                                    +  (lambda (env) exp))
                                                                                    +

                                                                                    + +For a quoted expression, we can gain a little efficiency by +extracting the text of the quotation only once, in the analysis phase, +rather than in the execution phase.

                                                                                    + +

                                                                                    (define (analyze-quoted exp)
                                                                                    +  (let ((qval (text-of-quotation exp)))
                                                                                    +    (lambda (env) qval)))
                                                                                    +

                                                                                    + +Looking up a variable value must still be done in the execution phase, +since this depends upon knowing the environment.29

                                                                                    + +

                                                                                    (define (analyze-variable exp)
                                                                                    +  (lambda (env) (lookup-variable-value exp env)))
                                                                                    +

                                                                                    + +Analyze-assignment also must defer actually setting the variable +until the execution, when the environment has been supplied. However, +the fact that the assignment-value expression can be +analyzed (recursively) during analysis is a major gain in efficiency, +because the assignment-value expression will now be analyzed +only once. The same holds true for definitions.

                                                                                    + +

                                                                                    (define (analyze-assignment exp)
                                                                                    +  (let ((var (assignment-variable exp))
                                                                                    +        (vproc (analyze (assignment-value exp))))
                                                                                    +    (lambda (env)
                                                                                    +      (set-variable-value! var (vproc env) env)
                                                                                    +      'ok)))
                                                                                    +(define (analyze-definition exp)
                                                                                    +  (let ((var (definition-variable exp))
                                                                                    +        (vproc (analyze (definition-value exp))))
                                                                                    +    (lambda (env)
                                                                                    +      (define-variable! var (vproc env) env)
                                                                                    +      'ok)))
                                                                                    +

                                                                                    + +For if expressions, we extract and analyze the predicate, +consequent, and alternative at analysis time.

                                                                                    + +

                                                                                    (define (analyze-if exp)
                                                                                    +  (let ((pproc (analyze (if-predicate exp)))
                                                                                    +        (cproc (analyze (if-consequent exp)))
                                                                                    +        (aproc (analyze (if-alternative exp))))
                                                                                    +    (lambda (env)
                                                                                    +      (if (true? (pproc env))
                                                                                    +          (cproc env)
                                                                                    +          (aproc env)))))
                                                                                    +

                                                                                    + +Analyzing a lambda expression also achieves a major +gain in efficiency: We analyze the lambda body only once, even though +procedures resulting from evaluation of the lambda +may be applied many times.

                                                                                    + +

                                                                                    (define (analyze-lambda exp)
                                                                                    +  (let ((vars (lambda-parameters exp))
                                                                                    +        (bproc (analyze-sequence (lambda-body exp))))
                                                                                    +    (lambda (env) (make-procedure vars bproc env))))
                                                                                    +

                                                                                    + +Analysis of a sequence of expressions (as in a begin or the body +of a lambda expression) is more involved.30 +Each expression +in the sequence is analyzed, yielding an execution +procedure. These execution procedures are combined to produce an +execution +procedure that takes an environment as argument and sequentially calls +each individual execution procedure with the environment as argument.

                                                                                    + +

                                                                                    (define (analyze-sequence exps)
                                                                                    +  (define (sequentially proc1 proc2)
                                                                                    +    (lambda (env) (proc1 env) (proc2 env)))
                                                                                    +  (define (loop first-proc rest-procs)
                                                                                    +    (if (null? rest-procs)
                                                                                    +        first-proc
                                                                                    +        (loop (sequentially first-proc (car rest-procs))
                                                                                    +              (cdr rest-procs))))
                                                                                    +  (let ((procs (map analyze exps)))
                                                                                    +    (if (null? procs)
                                                                                    +        (error "Empty sequence -- ANALYZE"))
                                                                                    +    (loop (car procs) (cdr procs))))
                                                                                    +

                                                                                    + +To analyze an application, we analyze the operator and operands and +construct an execution procedure that +calls the operator execution procedure (to obtain the +actual procedure to be applied) and the operand execution +procedures (to obtain the actual arguments). We then pass these to execute-application, which is the analog of apply in +section 4.1.1. +Execute-application differs from apply in that the procedure body for a compound procedure has already +been analyzed, so there is no need to do further analysis. Instead, +we just call the execution procedure for the body on the extended +environment. +

                                                                                    (define (analyze-application exp)
                                                                                    +  (let ((fproc (analyze (operator exp)))
                                                                                    +        (aprocs (map analyze (operands exp))))
                                                                                    +    (lambda (env)
                                                                                    +      (execute-application (fproc env)
                                                                                    +                           (map (lambda (aproc) (aproc env))
                                                                                    +                                aprocs)))))
                                                                                    +(define (execute-application proc args)
                                                                                    +  (cond ((primitive-procedure? proc)
                                                                                    +         (apply-primitive-procedure proc args))
                                                                                    +        ((compound-procedure? proc)
                                                                                    +         ((procedure-body proc)
                                                                                    +          (extend-environment (procedure-parameters proc)
                                                                                    +                              args
                                                                                    +                              (procedure-environment proc))))
                                                                                    +        (else
                                                                                    +         (error
                                                                                    +          "Unknown procedure type -- EXECUTE-APPLICATION"
                                                                                    +          proc))))
                                                                                    +

                                                                                    + +Our new evaluator uses the same data structures, syntax +procedures, and run-time support procedures as in +sections 4.1.2, + 4.1.3, and 4.1.4.

                                                                                    + +

                                                                                    +Exercise 4.22.  Extend the evaluator in this section to support the special form let. +(See exercise 4.6.) + +

                                                                                    + +

                                                                                    +Exercise 4.23.  Alyssa P. Hacker doesn't understand why analyze-sequence needs to be +so complicated. All the other analysis procedures +are straightforward transformations of the corresponding evaluation +procedures (or eval clauses) in section 4.1.1. +She expected analyze-sequence to look like this:

                                                                                    + + +

                                                                                    (define (analyze-sequence exps)
                                                                                    +  (define (execute-sequence procs env)
                                                                                    +    (cond ((null? (cdr procs)) ((car procs) env))
                                                                                    +          (else ((car procs) env)
                                                                                    +                (execute-sequence (cdr procs) env))))
                                                                                    +  (let ((procs (map analyze exps)))
                                                                                    +    (if (null? procs)
                                                                                    +        (error "Empty sequence -- ANALYZE"))
                                                                                    +    (lambda (env) (execute-sequence procs env))))
                                                                                    +

                                                                                    +Eva Lu Ator explains to Alyssa that the version in the text does more +of the work of evaluating a sequence at analysis time. Alyssa's +sequence-execution procedure, rather than having the calls to the +individual execution procedures built in, loops through the procedures +in order to call them: In effect, although the individual expressions +in the sequence have been analyzed, the sequence itself has not been.

                                                                                    + +Compare the two versions of analyze-sequence. For example, +consider the common case (typical of procedure bodies) where the +sequence has just one expression. What work will the execution +procedure produced by Alyssa's program do? What about the execution +procedure produced by the program in the text above? How do the two +versions compare for a sequence with two expressions? + +

                                                                                    + +

                                                                                    +Exercise 4.24.  Design and carry out some experiments to +compare the speed of the original metacircular evaluator +with the version in this section. Use your results to estimate the fraction +of time that is spent in analysis versus execution for various +procedures. +

                                                                                    + +


                                                                                    +

                                                                                    3 Even so, there will remain important aspects of +the evaluation process that are not elucidated by our evaluator. The +most important of these are the detailed mechanisms by which +procedures call other procedures and return values to their callers. +We will address these issues in chapter 5, where we take a closer look +at the evaluation process by implementing the evaluator as a simple +register machine. + +

                                                                                    4 If we grant ourselves the ability to apply primitives, +then what remains for us to implement in the evaluator? The job of +the evaluator is not to specify the primitives of the language, but rather +to provide the connective tissue -- the means of combination and the +means of abstraction -- that binds a collection of primitives to form a +language. Specifically: +

                                                                                      +
                                                                                    • The evaluator enables us to deal with nested expressions. For +example, although simply applying primitives +would suffice for evaluating +the expression (+ 1 6), it is not adequate for handling (+ 1 (* 2 +3)). As far as the primitive procedure + is concerned, +its arguments must be numbers, and it would choke if we passed it the +expression (* 2 3) as an argument. One important role of the +evaluator is to choreograph procedure composition so that (* 2 +3) is reduced to 6 before being passed as an argument to +.

                                                                                      + +

                                                                                    • The evaluator allows us to use variables. For example, the +primitive procedure for addition has no way to deal with expressions such +as (+ x 1). We need an evaluator to keep track of variables and +obtain their values before invoking the primitive +procedures.

                                                                                      + +

                                                                                    • The evaluator allows us to define compound procedures. This +involves keeping track of procedure definitions, knowing how to use +these definitions in evaluating expressions, and providing a mechanism +that enables procedures to accept arguments.

                                                                                      + +

                                                                                    • The evaluator provides the special forms, which must be +evaluated differently from procedure calls. +

                                                                                    + +

                                                                                    5 We could have simplified the application? clause in eval by using map +(and stipulating that operands returns a list) rather than +writing an explicit list-of-values procedure. We chose not to +use map here to emphasize the fact that the evaluator can be +implemented without any use of higher-order procedures +(and thus could be written in a language that doesn't have +higher-order procedures), even though +the language that it supports will include higher-order procedures. + +

                                                                                    6 In this case, the language being implemented and the +implementation language are the same. Contemplation of the meaning of +true? here yields expansion of consciousness without the abuse +of substance. + +

                                                                                    7 This implementation of define ignores a subtle +issue in the handling of internal definitions, although it works +correctly in most cases. We will see what the problem is and how to +solve it in section 4.1.6. + +

                                                                                    8 As we said when we +introduced define and set!, these values +are implementation-dependent in Scheme -- that is, the implementor +can choose what value to return. + +

                                                                                    9 As mentioned in +section 2.3.1, the evaluator sees a quoted expression as +a list beginning with quote, even if the +expression is typed with the quotation mark. For example, the +expression 'a would be seen by the evaluator as (quote a). +See exercise 2.55. + +

                                                                                    10 The value of an if expression when the predicate +is false and there is no alternative +is unspecified in Scheme; we have chosen here to make it false. +We will support the use of the variables true and false +in expressions to be evaluated by binding them in the global +environment. See section 4.1.4. + + +

                                                                                    11 These selectors for a list of expressions -- and the +corresponding ones for a list of operands -- are not intended as a data +abstraction. They are introduced as mnemonic names for the basic list +operations in order to make it easier to understand the explicit-control +evaluator in section 5.4. + +

                                                                                    12 The value of a cond expression when all the predicates +are false and there is no else clause +is unspecified in Scheme; we have chosen here to make it false. + +

                                                                                    13 Practical Lisp systems provide a +mechanism that allows a user to add new derived expressions and +specify their implementation as syntactic transformations without +modifying the evaluator. Such a user-defined transformation is called a +macro. +Although it is easy to add an elementary mechanism for defining macros, +the resulting language has subtle name-conflict problems. +There has been much research on mechanisms for macro definition +that do not cause these difficulties. See, +for example, Kohlbecker 1986, Clinger and Rees 1991, and Hanson 1991. + +

                                                                                    14 Frames are not really a data abstraction in the following code: +Set-variable-value! and define-variable! use set-car! +to directly modify the values in a frame. The purpose of the frame +procedures is to make the environment-manipulation procedures easy to read. + +

                                                                                    15 The drawback of this representation (as well as the variant in +exercise 4.11) is that the evaluator +may have to search through many frames in order to find the binding +for a given variable. +(Such an approach is referred to as deep binding.) +One way to avoid +this inefficiency is to make use of a strategy called lexical +addressing, which will be discussed in +section 5.5.6. + +

                                                                                    16 Any procedure defined in the underlying Lisp can be used as +a primitive for the metacircular evaluator. The name of a +primitive installed in the evaluator need not be the same as the name +of its implementation in the underlying Lisp; the names are the same +here because the metacircular evaluator implements Scheme itself. +Thus, for example, we could put (list 'first car) or (list +'square (lambda (x) (* x x))) in the list of primitive-procedures. + +

                                                                                    17 Apply-in-underlying-scheme is the apply procedure +we have used in earlier chapters. The metacircular evaluator's apply procedure (section 4.1.1) models the +working of this primitive. Having two different things called apply leads to a technical problem in running the metacircular +evaluator, because defining the metacircular evaluator's apply +will mask the definition of the primitive. One way around this is to +rename the metacircular apply to avoid conflict with the name of +the primitive procedure. We have assumed instead that we have saved a +reference to the underlying apply by doing +

                                                                                    (define apply-in-underlying-scheme apply)
                                                                                    +

                                                                                    +before defining the metacircular apply. This allows us to +access the original version of apply under a different name. + +

                                                                                    18 The primitive procedure read waits for input from the user, +and returns the next complete expression that is typed. +For example, if the user types (+ 23 x), read returns +a three-element list containing the symbol +, the number 23, +and the symbol x. +If the user types 'x, read returns a two-element list +containing the symbol quote and the symbol x. + +

                                                                                    19 The fact that the machines are described in Lisp is +inessential. If we give our evaluator a Lisp program +that behaves as an evaluator for +some other language, say C, the Lisp evaluator will emulate the C +evaluator, which in turn can emulate any machine described as a C +program. Similarly, writing a Lisp evaluator in C produces a C +program that can execute any Lisp program. The deep idea here is that +any evaluator can emulate any other. Thus, the notion of ``what can +in principle be computed'' (ignoring practicalities of time and +memory required) is independent of the language or the computer, and +instead reflects an underlying notion of computability. This +was first demonstrated in a clear way by Alan M. Turing (1912-1954), +whose 1936 paper laid the foundations for theoretical computer +science. In the paper, Turing presented a simple computational +model -- now known as a Turing machine -- and argued that any +``effective process'' can be formulated as a program for such a +machine. (This argument is known as the Church-Turing thesis.) +Turing then implemented a universal machine, i.e., a Turing machine +that behaves as an evaluator for Turing-machine programs. He used +this framework to demonstrate that there are well-posed problems that +cannot be computed by Turing machines (see +exercise 4.15), and so by implication cannot be +formulated as ``effective processes.'' Turing went on to make +fundamental contributions to practical computer science as well. For +example, he invented the idea of structuring programs using +general-purpose subroutines. See Hodges 1983 for a biography of +Turing. + +

                                                                                    20 Some people find it +counterintuitive that an evaluator, which is implemented by a +relatively simple procedure, can emulate programs that are more +complex than the evaluator itself. The existence of a universal +evaluator machine is a deep and wonderful property of computation. +Recursion theory, a branch of mathematical logic, is concerned +with logical limits of computation. Douglas Hofstadter's beautiful +book Gödel, Escher, Bach (1979) explores some of these ideas. + +

                                                                                    21 Warning: +This eval primitive is not +identical to the eval procedure we implemented in +section 4.1.1, because it uses actual +Scheme environments rather than the sample environment structures we +built in section 4.1.3. These actual +environments cannot be manipulated by the user as ordinary lists; they +must be accessed via eval or other special operations. +Similarly, the apply primitive we saw earlier is not identical +to the metacircular apply, because it uses actual Scheme procedures +rather than the procedure objects we constructed in +sections 4.1.3 and 4.1.4. + +

                                                                                    22 The MIT +implementation of Scheme includes eval, as well as a symbol user-initial-environment that is bound to the initial environment in +which the user's input expressions are evaluated. + +

                                                                                    23 Although we stipulated that halts? is given a procedure object, +notice that this reasoning still applies even if halts? can gain +access to the procedure's text and its environment. +This is Turing's celebrated Halting Theorem, which gave +the first clear example of a non-computable problem, i.e., a +well-posed task that cannot be carried out as a computational +procedure. + +

                                                                                    24 Wanting programs to not depend on this evaluation +mechanism is the reason for the ``management is not +responsible'' remark in footnote 28 of chapter 1. +By insisting that internal definitions come first and do not use each +other while the definitions are being evaluated, the IEEE standard +for Scheme leaves implementors some choice in the mechanism used to +evaluate these definitions. The choice of one evaluation rule rather +than another here may seem like a small issue, affecting only the +interpretation of ``badly formed'' programs. However, we will see in +section 5.5.6 that moving to a model of +simultaneous scoping for internal definitions avoids some nasty +difficulties that would otherwise arise in implementing a compiler. + +

                                                                                    25 The IEEE standard for Scheme +allows for different implementation strategies by specifying that it +is up to the programmer to obey this restriction, not up to the +implementation to enforce it. Some Scheme implementations, including +MIT Scheme, use the transformation shown above. Thus, some programs +that don't obey this restriction will in fact run in such implementations. + +

                                                                                    26 The MIT implementors of Scheme support Alyssa on +the following grounds: Eva is in principle correct -- the definitions +should be regarded as simultaneous. But it seems difficult to +implement a general, efficient mechanism that does what Eva requires. +In the absence of such a mechanism, it is better to generate an error +in the difficult cases of simultaneous definitions (Alyssa's notion) +than to produce an incorrect answer (as Ben would have it). + +

                                                                                    27 This example illustrates a programming trick for +formulating recursive procedures without using define. The +most general trick of this sort is the Y operator, which can +be used to give a ``pure -calculus'' implementation of +recursion. (See Stoy 1977 for details on the lambda calculus, and +Gabriel 1988 for an exposition of the Y operator in Scheme.) + +

                                                                                    28 This technique is an integral part of the compilation +process, which we shall discuss in chapter 5. Jonathan Rees wrote a Scheme +interpreter like this in about 1982 for the T project (Rees and Adams +1982). Marc Feeley (1986) (see also Feeley and Lapalme 1987) +independently invented this technique +in his master's thesis. + +

                                                                                    29 There is, +however, an important part of the variable search that can be +done as part of the syntactic analysis. As we will show in +section 5.5.6, one can determine the position +in the environment structure where the value of the variable will be +found, thus obviating the need to scan the environment for the entry +that matches the variable. + +

                                                                                    30 See exercise 4.23 for some insight +into the processing of sequences. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-27.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-27.html new file mode 100644 index 00000000..92ac5bea --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-27.html @@ -0,0 +1,722 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    4.2  Variations on a Scheme -- Lazy Evaluation

                                                                                    + + + +Now that we have an evaluator expressed as a Lisp program, we can +experiment with alternative choices in language design simply by +modifying the evaluator. Indeed, new languages are often invented by +first writing an evaluator that embeds the new language within an +existing high-level language. For example, if we wish to discuss some +aspect of a proposed modification to Lisp with another member of the +Lisp community, we can supply an evaluator that embodies +the change. The recipient can then experiment with the new +evaluator and send back comments as further modifications. Not only +does the high-level implementation base make it easier to test and +debug the evaluator; in addition, the embedding enables the designer +to snarf31 features +from the underlying language, just as our embedded Lisp evaluator +uses primitives and control structure from the underlying Lisp. Only +later (if ever) need the designer go to the trouble of building a +complete implementation in a low-level language or in hardware. In +this section and the next we explore some variations on Scheme that +provide significant additional expressive power.

                                                                                    + + +

                                                                                    4.2.1  Normal Order and Applicative Order

                                                                                    + +

                                                                                    + +In section 1.1, where we began our discussion +of models of evaluation, we noted that Scheme is an applicative-order language, namely, that all the arguments to Scheme +procedures are evaluated when the procedure is applied. In +contrast, normal-order languages delay evaluation of procedure arguments +until the actual argument values are needed. +Delaying evaluation of procedure arguments until the +last possible moment (e.g., until they are required by a primitive +operation) is called lazy evaluation.32 +Consider the procedure

                                                                                    + +

                                                                                    (define (try a b)
                                                                                    +  (if (= a 0) 1 b))
                                                                                    +

                                                                                    +Evaluating (try 0 (/ 1 0)) generates an error in Scheme. With +lazy evaluation, there would be no error. Evaluating the expression +would return 1, because the argument (/ 1 0) would +never be evaluated.

                                                                                    + +An example that exploits lazy evaluation is the +definition of a procedure unless

                                                                                    + +

                                                                                    (define (unless condition usual-value exceptional-value)
                                                                                    +  (if condition exceptional-value usual-value))
                                                                                    +

                                                                                    +that can be used in expressions such as

                                                                                    + +

                                                                                    (unless (= b 0)
                                                                                    +        (/ a b)
                                                                                    +        (begin (display "exception: returning 0")
                                                                                    +               0))
                                                                                    +

                                                                                    +This won't work in an applicative-order language because both the +usual value and the exceptional value will be evaluated before +unless is called (compare exercise 1.6). An +advantage of lazy evaluation is that some procedures, such as unless, can do useful computation even if evaluation of some of their +arguments would produce errors or would not terminate.

                                                                                    + +If the body of a procedure is entered before an argument has been +evaluated we say that the procedure is non-strict in that +argument. If the argument is evaluated before the body of the +procedure is entered we say that the procedure is strict in that +argument.33 +In a purely applicative-order language, all procedures are strict in +each argument. In a purely normal-order language, all compound +procedures are non-strict in each argument, and primitive procedures may be +either strict or non-strict. There are also languages (see +exercise 4.31) that give programmers +detailed control over the strictness of the procedures they define.

                                                                                    + +A striking example of a procedure that can usefully be made non-strict +is cons (or, in general, almost any constructor for data +structures). One can do useful computation, combining elements to +form data structures and operating on the resulting data structures, +even if the values of the elements are not known. It makes perfect +sense, for instance, to compute the length of a list without knowing +the values of the individual elements in the list. We will exploit +this idea in section 4.2.3 to implement the +streams of chapter 3 as lists formed of non-strict cons +pairs.

                                                                                    + +

                                                                                    +Exercise 4.25.  Suppose that (in ordinary applicative-order Scheme) we define unless +as shown above and then define factorial in terms of unless as

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (unless (= n 1)
                                                                                    +          (* n (factorial (- n 1)))
                                                                                    +          1))
                                                                                    +

                                                                                    +What happens if we attempt to evaluate (factorial 5)? Will our +definitions work in a normal-order language? +

                                                                                    + +

                                                                                    +Exercise 4.26.  Ben Bitdiddle and Alyssa P. Hacker disagree over the importance of +lazy evaluation for implementing things such as unless. Ben +points out that it's possible to implement unless in applicative +order as a special form. +Alyssa counters that, if one did that, unless would be merely +syntax, not a procedure that could be used in conjunction with +higher-order procedures. Fill in the details on both sides of the +argument. Show how to implement unless as a derived expression +(like cond or let), +and give an example of a situation where it might be useful to have +unless available as a procedure, rather than as a special form. + +

                                                                                    + + +

                                                                                    4.2.2  An Interpreter with Lazy Evaluation

                                                                                    + +In this section we will implement a normal-order language that is +the same as Scheme except that compound procedures are non-strict +in each argument. Primitive procedures will still be strict. +It is not difficult to modify the evaluator of +section 4.1.1 so that the language it interprets behaves +this way. Almost all the required changes center around procedure +application.

                                                                                    + +The basic idea is that, when applying a procedure, the interpreter +must determine which arguments are to be +evaluated and which are to be +delayed. The delayed arguments are not +evaluated; instead, they are transformed into objects called thunks.34 +The thunk must contain the information required to produce the value +of the argument when it is needed, as if it had been evaluated at +the time of the application. Thus, the thunk must contain the +argument expression and the environment in +which the procedure application is being evaluated.

                                                                                    + +The process of evaluating the expression in a thunk is called forcing.35 +In general, a thunk will be forced only when its value is needed: +when it is passed to a primitive procedure that +will use the value of the thunk; when it is the +value of a predicate of a conditional; and when it +is the value of an operator that is about to be applied as a procedure. +One design choice we have available is whether or not to memoize thunks, as we did with delayed objects in +section 3.5.1. With memoization, the first time a +thunk is forced, it stores the value that is computed. Subsequent +forcings simply return the stored value without repeating the +computation. We'll make our interpreter memoize, because this is +more efficient for many applications. There are tricky +considerations here, however.36

                                                                                    + + +

                                                                                    Modifying the evaluator

                                                                                    + +The main difference between the lazy evaluator and the one in +section 4.1 is in the handling of procedure +applications in eval and apply.

                                                                                    + +The application? clause of eval becomes

                                                                                    + +

                                                                                    ((application? exp)
                                                                                    + (apply (actual-value (operator exp) env)
                                                                                    +        (operands exp)
                                                                                    +        env))
                                                                                    +

                                                                                    +This is almost the same as the application? clause of eval +in section 4.1.1. For lazy evaluation, however, +we call apply with the operand expressions, rather than the +arguments produced by evaluating them. Since we will need the environment to +construct thunks if the arguments are to be delayed, we must pass this as well. +We still evaluate the +operator, because apply needs the actual procedure to be applied +in order to dispatch on its type (primitive versus compound) and apply it.

                                                                                    + +Whenever we need the actual value of an expression, we use +

                                                                                    (define (actual-value exp env)
                                                                                    +  (force-it (eval exp env)))
                                                                                    +

                                                                                    +instead of just eval, so that if the expression's value +is a thunk, it will be forced.

                                                                                    + +Our new version of apply is also almost the same as the +version in section 4.1.1. The difference is +that eval has passed in unevaluated operand expressions: +For primitive procedures (which are strict), we evaluate all the +arguments before applying the primitive; +for compound procedures (which are non-strict) we delay all the +arguments before applying the procedure.

                                                                                    + +

                                                                                    (define (apply procedure arguments env)
                                                                                    +  (cond ((primitive-procedure? procedure)
                                                                                    +         (apply-primitive-procedure
                                                                                    +          procedure
                                                                                    +          (list-of-arg-values arguments env)))  ; changed
                                                                                    +        ((compound-procedure? procedure)
                                                                                    +         (eval-sequence
                                                                                    +          (procedure-body procedure)
                                                                                    +          (extend-environment
                                                                                    +           (procedure-parameters procedure)
                                                                                    +           (list-of-delayed-args arguments env) ; changed
                                                                                    +           (procedure-environment procedure))))
                                                                                    +        (else
                                                                                    +         (error
                                                                                    +          "Unknown procedure type -- APPLY" procedure))))
                                                                                    +

                                                                                    +The procedures that process the arguments are just like list-of-values from section 4.1.1, except that +list-of-delayed-args delays the arguments instead of evaluating +them, and list-of-arg-values uses actual-value instead +of eval:

                                                                                    + +

                                                                                    (define (list-of-arg-values exps env)
                                                                                    +  (if (no-operands? exps)
                                                                                    +      '()
                                                                                    +      (cons (actual-value (first-operand exps) env)
                                                                                    +            (list-of-arg-values (rest-operands exps)
                                                                                    +                                env))))
                                                                                    +(define (list-of-delayed-args exps env)
                                                                                    +  (if (no-operands? exps)
                                                                                    +      '()
                                                                                    +      (cons (delay-it (first-operand exps) env)
                                                                                    +            (list-of-delayed-args (rest-operands exps)
                                                                                    +                                  env))))
                                                                                    +

                                                                                    + +The other place we must change the evaluator is in the handling of +if, where we must use actual-value instead +of eval to get the value of the predicate expression +before testing whether it is true or false:

                                                                                    + +

                                                                                    (define (eval-if exp env)
                                                                                    +  (if (true? (actual-value (if-predicate exp) env))
                                                                                    +      (eval (if-consequent exp) env)
                                                                                    +      (eval (if-alternative exp) env)))
                                                                                    +

                                                                                    + +Finally, we must change the driver-loop +procedure (section 4.1.4) to use actual-value instead +of eval, so that if a delayed value +is propagated back to the read-eval-print loop, it will be forced +before being printed. We also change the prompts to indicate that +this is the lazy evaluator:

                                                                                    + +

                                                                                    (define input-prompt ";;; L-Eval input:")
                                                                                    +(define output-prompt ";;; L-Eval value:")
                                                                                    +(define (driver-loop)
                                                                                    +  (prompt-for-input input-prompt)
                                                                                    +  (let ((input (read)))
                                                                                    +    (let ((output
                                                                                    +           (actual-value input the-global-environment)))
                                                                                    +      (announce-output output-prompt)
                                                                                    +      (user-print output)))
                                                                                    +  (driver-loop))
                                                                                    +

                                                                                    + +With these changes made, we can start the evaluator and test it. The +successful evaluation of the try expression discussed in +section 4.2.1 indicates that the interpreter is +performing lazy evaluation:

                                                                                    + +

                                                                                    (define the-global-environment (setup-environment))
                                                                                    +(driver-loop)
                                                                                    +;;; L-Eval input:
                                                                                    +(define (try a b)
                                                                                    +  (if (= a 0) 1 b))
                                                                                    +;;; L-Eval value:
                                                                                    +ok
                                                                                    +;;; L-Eval input:
                                                                                    +(try 0 (/ 1 0))
                                                                                    +;;; L-Eval value:
                                                                                    +1
                                                                                    +

                                                                                    + + + +

                                                                                    Representing thunks

                                                                                    + + +Our evaluator must arrange to create thunks when procedures are +applied to arguments and to force these thunks later. A thunk must +package an expression together with the environment, so that the +argument can be produced later. +To force the thunk, we simply extract the expression and environment +from the thunk and evaluate the expression in the environment. +We use actual-value rather than eval so that in case the +value of the expression is itself a thunk, we will force that, and so +on, until we reach something that is not a thunk:

                                                                                    + +

                                                                                    (define (force-it obj)
                                                                                    +  (if (thunk? obj)
                                                                                    +      (actual-value (thunk-exp obj) (thunk-env obj))
                                                                                    +      obj))
                                                                                    +

                                                                                    + +One easy way to package an expression with an environment is to make a +list containing the expression and the environment. +Thus, we create a thunk as follows:

                                                                                    + +

                                                                                    (define (delay-it exp env)
                                                                                    +  (list 'thunk exp env))
                                                                                    +
                                                                                    +(define (thunk? obj)
                                                                                    +  (tagged-list? obj 'thunk))
                                                                                    +
                                                                                    +(define (thunk-exp thunk) (cadr thunk))
                                                                                    +
                                                                                    +(define (thunk-env thunk) (caddr thunk))
                                                                                    +

                                                                                    + +Actually, what we want for our interpreter is not quite this, but +rather thunks that have been memoized. +When a thunk is forced, we will turn it into an evaluated thunk +by replacing the stored expression with its value and +changing the thunk tag so that it can be recognized as +already evaluated.37

                                                                                    + +

                                                                                    (define (evaluated-thunk? obj)
                                                                                    +  (tagged-list? obj 'evaluated-thunk))
                                                                                    +
                                                                                    +(define (thunk-value evaluated-thunk) (cadr evaluated-thunk))
                                                                                    +(define (force-it obj)
                                                                                    +  (cond ((thunk? obj)
                                                                                    +         (let ((result (actual-value
                                                                                    +                        (thunk-exp obj)
                                                                                    +                        (thunk-env obj))))
                                                                                    +           (set-car! obj 'evaluated-thunk)
                                                                                    +           (set-car! (cdr obj) result)  ; replace exp with its value
                                                                                    +           (set-cdr! (cdr obj) '())     ; forget unneeded env
                                                                                    +           result))
                                                                                    +        ((evaluated-thunk? obj)
                                                                                    +         (thunk-value obj))
                                                                                    +        (else obj)))
                                                                                    +

                                                                                    +Notice that the same delay-it procedure works both with and +without memoization.

                                                                                    + +

                                                                                    +Exercise 4.27.  Suppose we type in the following definitions to the lazy evaluator: +

                                                                                    (define count 0)
                                                                                    +(define (id x)
                                                                                    +  (set! count (+ count 1))
                                                                                    +  x)
                                                                                    +

                                                                                    +Give the missing values in the following sequence of +interactions, and explain your answers.38 +

                                                                                    (define w (id (id 10)))
                                                                                    +;;; L-Eval input:
                                                                                    +count
                                                                                    +;;; L-Eval value:
                                                                                    +<response>
                                                                                    +;;; L-Eval input:
                                                                                    +w
                                                                                    +;;; L-Eval value:
                                                                                    +<response>
                                                                                    +;;; L-Eval input:
                                                                                    +count
                                                                                    +;;; L-Eval value:
                                                                                    +<response>
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.28.  Eval uses actual-value rather than eval +to evaluate the operator before passing it to apply, +in order to force the value of the operator. +Give an example that demonstrates the need for this forcing. +

                                                                                    + +

                                                                                    +Exercise 4.29.  Exhibit a program that you would expect to run much more slowly +without memoization than with memoization. Also, consider the +following interaction, where the id procedure is defined as in +exercise 4.27 and count starts at 0: +

                                                                                    (define (square x)
                                                                                    +  (* x x))
                                                                                    +;;; L-Eval input:
                                                                                    +(square (id 10))
                                                                                    +;;; L-Eval value:
                                                                                    +<response>
                                                                                    +;;; L-Eval input:
                                                                                    +count
                                                                                    +;;; L-Eval value:
                                                                                    +<response>
                                                                                    +

                                                                                    +Give the responses both when the evaluator memoizes and when it does not. + +

                                                                                    + +

                                                                                    +Exercise 4.30.  Cy D. Fect, a reformed C programmer, is worried that some side effects +may never take place, because the lazy evaluator doesn't force the +expressions in a sequence. +Since the value of an expression in a sequence other than the last one +is not used (the expression is there only for its effect, such as +assigning to a variable or printing), there can be no subsequent use +of this value (e.g., as an argument to a primitive procedure) that +will cause it to be forced. Cy thus thinks that when evaluating +sequences, we must force all expressions in the sequence except the +final one. He proposes to modify eval-sequence from +section 4.1.1 to use actual-value rather +than eval:

                                                                                    + +

                                                                                    (define (eval-sequence exps env)
                                                                                    +  (cond ((last-exp? exps) (eval (first-exp exps) env))
                                                                                    +        (else (actual-value (first-exp exps) env)
                                                                                    +              (eval-sequence (rest-exps exps) env))))
                                                                                    +

                                                                                    + +

                                                                                    a. Ben Bitdiddle thinks Cy is wrong. +He shows Cy the for-each procedure described in +exercise 2.23, which gives an important example of +a sequence with side effects:

                                                                                    + +

                                                                                    (define (for-each proc items)
                                                                                    +  (if (null? items)
                                                                                    +      'done
                                                                                    +      (begin (proc (car items))
                                                                                    +             (for-each proc (cdr items)))))
                                                                                    +

                                                                                    +He claims that the evaluator in the text (with the original eval-sequence) handles this correctly:

                                                                                    + +

                                                                                    ;;; L-Eval input:
                                                                                    +(for-each (lambda (x) (newline) (display x))
                                                                                    +          (list 57 321 88))
                                                                                    +57
                                                                                    +321
                                                                                    +88
                                                                                    +;;; L-Eval value:
                                                                                    +done
                                                                                    +

                                                                                    +Explain why Ben is right about the behavior of for-each.

                                                                                    + +

                                                                                    b. Cy agrees that Ben is right about the for-each example, +but says that that's not the kind of program he was thinking about +when he proposed his change to eval-sequence. +He defines the following two procedures in the lazy evaluator:

                                                                                    + +

                                                                                    (define (p1 x)
                                                                                    +  (set! x (cons x '(2)))
                                                                                    +  x)
                                                                                    +
                                                                                    +(define (p2 x)
                                                                                    +  (define (p e)
                                                                                    +    e
                                                                                    +    x)
                                                                                    +  (p (set! x (cons x '(2)))))
                                                                                    +

                                                                                    +What are the values of (p1 1) and (p2 1) with the +original eval-sequence? +What would the values be with Cy's proposed change to eval-sequence?

                                                                                    + +

                                                                                    c. Cy also points out that changing eval-sequence as he proposes +does not affect the behavior of the example in part a. +Explain why this is true.

                                                                                    + +

                                                                                    d. How do you think sequences ought to be treated in the lazy evaluator? +Do you like Cy's approach, the approach in the text, or some other approach? + +

                                                                                    + +

                                                                                    +Exercise 4.31.  The approach taken in this section is somewhat unpleasant, because it +makes an incompatible change to Scheme. It might be nicer to +implement lazy evaluation as an upward-compatible extension, +that is, so that ordinary Scheme programs will work as before. We can +do this by extending the syntax of procedure declarations to let the user +control whether or not arguments are to be delayed. While we're at +it, we may as well also give the user the choice between delaying with +and without memoization. For example, the definition +

                                                                                    (define (f a (b lazy) c (d lazy-memo))
                                                                                    +  ...)
                                                                                    +

                                                                                    +would define f to be a procedure of four arguments, where the +first and third arguments are evaluated when the procedure is called, +the second argument is delayed, and the fourth argument is both +delayed and memoized. Thus, ordinary procedure definitions will +produce the same behavior as ordinary Scheme, while adding the lazy-memo declaration to each parameter of every compound procedure +will produce the behavior of the lazy evaluator defined in this +section. Design and implement the changes required to produce such an +extension to Scheme. You will have to implement new syntax procedures +to handle the new syntax for define. You must also arrange for +eval or apply to determine when arguments are to be delayed, and to +force or delay arguments accordingly, and you must arrange for forcing +to memoize or not, as appropriate. + +

                                                                                    + + +

                                                                                    4.2.3  Streams as Lazy Lists

                                                                                    + + + +In section 3.5.1, we showed how to implement streams +as delayed lists. We introduced special forms delay and cons-stream, which allowed us to construct a ``promise'' to compute +the cdr of a stream, without actually fulfilling that promise +until later. We could use this general technique of introducing +special forms whenever we need more control over the evaluation process, +but this is awkward. For one thing, a special form is not a +first-class object like a procedure, so we cannot use it together with +higher-order procedures.39 Additionally, +we were forced to create streams as a new kind of data object +similar but not identical to lists, and this required us to +reimplement many ordinary list operations (map, append, and +so on) for use with streams.

                                                                                    + + +With lazy evaluation, streams and lists can be identical, so there is +no need for special forms or for separate list and stream operations. +All we need to do is to arrange matters so that cons is +non-strict. One way to accomplish this is to extend the lazy +evaluator to allow for non-strict primitives, and to implement cons as one of these. An easier way is to recall +(section 2.1.3) that there is no fundamental need to +implement cons as a primitive at all. Instead, we can represent +pairs as procedures:40

                                                                                    + +

                                                                                    (define (cons x y)
                                                                                    +  (lambda (m) (m x y)))
                                                                                    +(define (car z)
                                                                                    +  (z (lambda (p q) p)))
                                                                                    +(define (cdr z)
                                                                                    +  (z (lambda (p q) q)))
                                                                                    +

                                                                                    + +In terms of these basic operations, the standard definitions of the +list operations will work with infinite lists (streams) as well as +finite ones, and the stream operations can be implemented as list operations. +Here are some examples:

                                                                                    + +

                                                                                    (define (list-ref items n)
                                                                                    +  (if (= n 0)
                                                                                    +      (car items)
                                                                                    +      (list-ref (cdr items) (- n 1))))
                                                                                    +(define (map proc items)
                                                                                    +  (if (null? items)
                                                                                    +      '()
                                                                                    +      (cons (proc (car items))
                                                                                    +            (map proc (cdr items)))))
                                                                                    +(define (scale-list items factor)
                                                                                    +  (map (lambda (x) (* x factor))
                                                                                    +       items))
                                                                                    +(define (add-lists list1 list2)
                                                                                    +  (cond ((null? list1) list2)
                                                                                    +        ((null? list2) list1)
                                                                                    +        (else (cons (+ (car list1) (car list2))
                                                                                    +                    (add-lists (cdr list1) (cdr list2))))))
                                                                                    +(define ones (cons 1 ones))
                                                                                    +(define integers (cons 1 (add-lists ones integers)))
                                                                                    +;;; L-Eval input:
                                                                                    +(list-ref integers 17)
                                                                                    +;;; L-Eval value:
                                                                                    +18
                                                                                    +

                                                                                    + + +Note that these lazy lists are even lazier than the streams of +chapter 3: The car of the list, as well as the cdr, is +delayed.41 +In fact, even accessing the car or cdr of a lazy +pair need not force the value of a list element. The value will be +forced only when it is really needed -- e.g., for use as the +argument of a primitive, or to be printed as an answer.

                                                                                    + +Lazy pairs also help with the problem that arose with streams in +section 3.5.4, where we found that +formulating stream models of systems with loops may require us to +sprinkle our programs with explicit delay operations, beyond the +ones supplied by cons-stream. With lazy evaluation, all +arguments to procedures are delayed uniformly. For instance, we can +implement procedures to integrate lists and solve differential +equations as we originally intended in +section 3.5.4:

                                                                                    + +

                                                                                    (define (integral integrand initial-value dt)
                                                                                    +  (define int
                                                                                    +    (cons initial-value
                                                                                    +          (add-lists (scale-list integrand dt)
                                                                                    +                    int)))
                                                                                    +  int)
                                                                                    +(define (solve f y0 dt)
                                                                                    +  (define y (integral dy y0 dt))
                                                                                    +  (define dy (map f y))
                                                                                    +  y)
                                                                                    +;;; L-Eval input:
                                                                                    +(list-ref (solve (lambda (x) x) 1 0.001) 1000)
                                                                                    +;;; L-Eval value:
                                                                                    +2.716924

                                                                                    + +

                                                                                    +Exercise 4.32.  Give some examples that illustrate the difference between the streams +of chapter 3 and the ``lazier'' lazy lists described in this section. +How can you take advantage of this extra laziness? +

                                                                                    + +

                                                                                    +Exercise 4.33.  Ben Bitdiddle tests the lazy list implementation given above by +evaluating the expression +

                                                                                    (car '(a b c))
                                                                                    +

                                                                                    +To his surprise, this produces an error. After some thought, he +realizes that the ``lists'' obtained by reading in quoted expressions +are different from the lists manipulated by the new definitions of +cons, car, and cdr. Modify the evaluator's +treatment of quoted expressions so that quoted lists typed at the +driver loop will produce true lazy lists. + +

                                                                                    + +

                                                                                    +Exercise 4.34.  Modify the driver loop for the evaluator so that lazy pairs and lists +will print in some reasonable way. (What are you going to do about +infinite lists?) You may also need to modify the representation of +lazy pairs so that the evaluator can identify them in order +to print them. + +

                                                                                    + +


                                                                                    +

                                                                                    31 Snarf: ``To grab, especially a large document or +file for the purpose of using it either with or without the owner's +permission.'' Snarf down: ``To snarf, sometimes with the connotation +of absorbing, processing, or understanding.'' (These definitions were +snarfed from Steele et al. 1983. See also Raymond 1993.) + +

                                                                                    32 The difference between the ``lazy'' terminology and +the ``normal-order'' terminology is somewhat fuzzy. Generally, ``lazy'' +refers to the mechanisms of particular evaluators, while ``normal-order'' +refers to the semantics of languages, independent of any particular +evaluation strategy. But this is not a hard-and-fast distinction, and +the two terminologies are often used interchangeably. + +

                                                                                    33 The ``strict'' versus ``non-strict'' terminology means essentially the +same thing as ``applicative-order'' versus ``normal-order,'' except that +it refers to individual procedures and arguments rather than to the +language as a whole. At a conference on programming languages you +might hear someone say, ``The normal-order language Hassle has certain +strict primitives. Other procedures take their arguments by lazy +evaluation.'' + +

                                                                                    34 The word thunk was invented by an informal +working group that was discussing the implementation of call-by-name +in Algol 60. They observed that most of the analysis of (``thinking +about'') the expression could be done at compile time; thus, at run +time, the expression would already have been ``thunk'' about (Ingerman +et al. 1960). + +

                                                                                    35 This is analogous to the use of force +on the delayed objects that were introduced in chapter 3 to represent +streams. The critical difference between what we are +doing here and what we did in chapter 3 is that we are building +delaying and forcing into the evaluator, and thus making this uniform +and automatic throughout the language. + +

                                                                                    36 Lazy evaluation combined with memoization is sometimes +referred to as call-by-need argument passing, in contrast to +call-by-name argument passing. (Call-by-name, introduced in +Algol 60, is similar to non-memoized lazy evaluation.) +As language designers, we can build our evaluator to memoize, +not to memoize, or leave this an option for programmers +(exercise 4.31). As you might expect +from chapter 3, these choices raise issues that become both subtle and +confusing in the presence of assignments. (See +exercises 4.27 and 4.29.) +An excellent article by Clinger (1982) attempts to clarify the +multiple dimensions of confusion that arise here. + +

                                                                                    37 Notice that we also erase the env from the thunk once the +expression's value has been computed. This makes no difference in the +values returned by the interpreter. It does help save space, +however, because removing the reference from the thunk to the env +once it is no longer needed allows this structure to be +garbage-collected and its +space recycled, as we will discuss in section 5.3.

                                                                                    + +Similarly, we could have allowed unneeded environments in the memoized +delayed objects of section 3.5.1 to be garbage-collected, +by having memo-proc do something like (set! proc '()) +to discard the procedure proc (which includes the environment +in which the delay was evaluated) after storing its value. + +

                                                                                    38 This exercise +demonstrates that the interaction between lazy evaluation and side +effects can be very confusing. This is just what you might expect +from the discussion in chapter 3. + +

                                                                                    39 This is precisely the issue with the unless procedure, +as in exercise 4.26. + +

                                                                                    40 This is the procedural representation described in +exercise 2.4. Essentially any procedural representation +(e.g., a message-passing implementation) would do as well. Notice +that we can install these definitions in the lazy evaluator simply by +typing them at the driver loop. If we had originally included cons, car, and cdr as primitives in the global +environment, they will be redefined. (Also see +exercises 4.33 and 4.34.) + +

                                                                                    41 This permits us to create delayed versions of more general kinds of +list structures, not just sequences. Hughes 1990 discusses some +applications of ``lazy trees.'' + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-28.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-28.html new file mode 100644 index 00000000..25061e56 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-28.html @@ -0,0 +1,1385 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    4.3  Variations on a Scheme -- Nondeterministic Computing

                                                                                    + + + +In this section, we extend the Scheme evaluator to support a +programming paradigm called nondeterministic computing by +building into the evaluator a facility to support automatic search. +This is a much more profound change to the language than the +introduction of lazy evaluation in section 4.2.

                                                                                    + +Nondeterministic computing, like stream processing, is useful for +``generate and test'' applications. Consider the task of starting with +two lists of positive integers and finding a pair of integers -- one +from the first list and one from the second list -- whose sum is prime. +We saw how to handle this with finite sequence operations in +section 2.2.3 and with infinite streams in +section 3.5.3. Our approach was to generate +the sequence of all possible pairs and filter these to select the +pairs whose sum is prime. Whether we actually generate the entire +sequence of pairs first as in chapter 2, or interleave the generating +and filtering as in chapter 3, is immaterial to the essential image of +how the computation is organized.

                                                                                    + +The nondeterministic approach evokes a different image. Imagine simply +that we choose (in some way) a number from the first list and a number +from the second list and require (using some mechanism) that their sum +be prime. This is expressed by following procedure:

                                                                                    + +

                                                                                    (define (prime-sum-pair list1 list2)
                                                                                    +  (let ((a (an-element-of list1))
                                                                                    +        (b (an-element-of list2)))
                                                                                    +    (require (prime? (+ a b)))
                                                                                    +    (list a b)))
                                                                                    +

                                                                                    +It might seem as if this procedure merely restates the problem, +rather than specifying a way to solve it. Nevertheless, this is +a legitimate nondeterministic program.42

                                                                                    + + +The key idea here is that expressions in a nondeterministic language +can have more than one possible value. For instance, +an-element-of might return any element of the given list. Our +nondeterministic program evaluator will work by automatically choosing +a possible value and keeping track of the choice. If a subsequent +requirement is not met, the evaluator will try a different choice, and +it will keep trying new choices until the evaluation succeeds, or +until we run out of choices. Just as the lazy evaluator freed the +programmer from the details of how values are delayed and forced, the +nondeterministic program evaluator will free the programmer from the +details of how choices are made.

                                                                                    + +It is instructive to contrast the different images of time evoked by +nondeterministic evaluation and stream processing. Stream processing +uses lazy evaluation to decouple the time when the stream of possible +answers is assembled from the time when the actual stream elements are +produced. The evaluator supports the illusion that all the possible +answers are laid out before us in a timeless sequence. With +nondeterministic evaluation, an expression represents the exploration +of a set of possible worlds, each determined by a set of choices. +Some of the possible worlds lead to dead ends, while others have +useful values. The nondeterministic program evaluator supports the +illusion that time branches, and that our programs have different +possible execution histories. When we reach a dead end, we can +revisit a previous choice point and proceed along a different branch.

                                                                                    + +The nondeterministic program evaluator implemented below is called the +amb evaluator because it is based on a new special form called +amb. We can type the above definition of prime-sum-pair +at the amb evaluator driver loop (along with definitions of prime?, an-element-of, and require) and run the +procedure as follows:

                                                                                    + +

                                                                                    ;;; Amb-Eval input:
                                                                                    +(prime-sum-pair '(1 3 5 8) '(20 35 110))
                                                                                    +;;; Starting a new problem
                                                                                    +;;; Amb-Eval value:
                                                                                    +(3 20)
                                                                                    +

                                                                                    +The value returned was obtained after the evaluator repeatedly chose +elements from each of the lists, until a successful choice was made.

                                                                                    + +Section 4.3.1 introduces amb and explains how it +supports nondeterminism through the evaluator's automatic search +mechanism. Section 4.3.2 presents examples of +nondeterministic programs, and section 4.3.3 +gives the details of how to implement the amb evaluator by +modifying the ordinary Scheme evaluator.

                                                                                    + + +

                                                                                    4.3.1  Amb and Search

                                                                                    + +

                                                                                    + +To extend Scheme to support nondeterminism, we introduce a new special +form called amb.43 +The expression (amb <e1> <e2> ... <en>) +returns the value of one of the n expressions <ei> ``ambiguously.'' +For example, the expression

                                                                                    + +

                                                                                    (list (amb 1 2 3) (amb 'a 'b))
                                                                                    +

                                                                                    +can have six possible values: +
                                                                                    (1 a) (1 b) (2 a) (2 b) (3 a) (3 b) +
                                                                                    +Amb with a single choice produces an ordinary (single) value.

                                                                                    + +Amb with no choices -- the expression (amb) -- is an +expression with no acceptable values. Operationally, we can think of +(amb) as an expression that when evaluated causes the +computation to ``fail'': The computation aborts and no value is +produced. Using this idea, we can express the requirement that a +particular predicate expression p must be true as follows:

                                                                                    + +

                                                                                    (define (require p)
                                                                                    +  (if (not p) (amb)))
                                                                                    +

                                                                                    + +With amb and require, we can implement the an-element-of procedure used above:

                                                                                    + +

                                                                                    (define (an-element-of items)
                                                                                    +  (require (not (null? items)))
                                                                                    +  (amb (car items) (an-element-of (cdr items))))
                                                                                    +

                                                                                    +An-element-of fails if the list is empty. Otherwise it +ambiguously returns either the first element of the list or an element +chosen from the rest of the list.

                                                                                    + +We can also express infinite ranges of choices. The following +procedure potentially returns any integer greater than or equal to +some given n:

                                                                                    + +

                                                                                    (define (an-integer-starting-from n)
                                                                                    +  (amb n (an-integer-starting-from (+ n 1))))
                                                                                    +

                                                                                    +This is like the stream procedure integers-starting-from +described in section 3.5.2, but with an important +difference: The stream procedure returns an object that represents the +sequence of all integers beginning with n, whereas the amb +procedure returns a single integer.44

                                                                                    + +Abstractly, we can imagine that evaluating an amb expression +causes time to split into branches, where the computation continues on +each branch with one of the possible values of the expression. We say +that amb represents a nondeterministic choice point. +If we had a machine with a sufficient number of processors that could +be dynamically allocated, we could implement the search in a +straightforward way. Execution would proceed as in a sequential +machine, until an amb expression is encountered. At this point, +more processors would be allocated and initialized to continue all of +the parallel executions implied by the choice. Each processor would +proceed sequentially as if it were the only choice, until it either +terminates by encountering a failure, or it further subdivides, or +it finishes.45

                                                                                    + +On the other hand, if we have a machine that can execute +only one process (or a few concurrent processes), +we must consider the alternatives sequentially. +One could imagine modifying an evaluator +to pick at random a branch to follow whenever it encounters a choice +point. Random choice, however, can easily lead to failing values. +We might try running the evaluator over and over, making random +choices and hoping to find a non-failing value, but it is better to systematically search all possible execution paths. +The amb evaluator that we will develop and work with in this section +implements a systematic search as follows: When the evaluator +encounters an application of amb, it initially selects the first +alternative. This selection may itself lead to a further choice. The +evaluator will always initially choose the first alternative at each +choice point. If a choice results in a failure, then the evaluator +automagically46 backtracks +to the most recent choice point and tries the next +alternative. If it runs out of alternatives at any choice point, the +evaluator will back up to the previous choice point and resume from +there. This process leads to a search strategy known as depth-first search or chronological backtracking.47

                                                                                    + + +

                                                                                    Driver loop

                                                                                    + +The driver loop for the amb evaluator +has some unusual properties. It reads an +expression and prints the value of the first non-failing execution, as +in the prime-sum-pair example shown above. If we +want to see the value of the next successful execution, we can +ask the interpreter to backtrack and attempt to generate a second +non-failing execution. This is signaled by typing the symbol try-again. If any expression except try-again is given, the +interpreter will start a new problem, discarding the unexplored +alternatives in the previous problem. Here is a sample +interaction:

                                                                                    + +

                                                                                    ;;; Amb-Eval input:
                                                                                    +(prime-sum-pair '(1 3 5 8) '(20 35 110))
                                                                                    +;;; Starting a new problem
                                                                                    +;;; Amb-Eval value:
                                                                                    +(3 20)
                                                                                    +;;; Amb-Eval input:
                                                                                    +try-again
                                                                                    +;;; Amb-Eval value:
                                                                                    +(3 110)
                                                                                    +;;; Amb-Eval input:
                                                                                    +try-again
                                                                                    +;;; Amb-Eval value:
                                                                                    +(8 35)
                                                                                    +;;; Amb-Eval input:
                                                                                    +try-again
                                                                                    +;;; There are no more values of
                                                                                    +(prime-sum-pair (quote (1 3 5 8)) (quote (20 35 110)))
                                                                                    +;;; Amb-Eval input:
                                                                                    +(prime-sum-pair '(19 27 30) '(11 36 58))
                                                                                    +;;; Starting a new problem
                                                                                    +;;; Amb-Eval value:
                                                                                    +(30 11)
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.35.  Write a procedure an-integer-between that returns an integer +between two given bounds. This can be used to implement a +procedure that finds Pythagorean triples, +i.e., triples of integers (i,j,k) between the given bounds such +that i < j and i2 + j2 = k2, as follows: +

                                                                                    (define (a-pythagorean-triple-between low high)
                                                                                    +  (let ((i (an-integer-between low high)))
                                                                                    +    (let ((j (an-integer-between i high)))
                                                                                    +      (let ((k (an-integer-between j high)))
                                                                                    +        (require (= (+ (* i i) (* j j)) (* k k)))
                                                                                    +        (list i j k)))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.36.  Exercise 3.69 discussed how to generate +the stream of all Pythagorean triples, with no upper bound on the +size of the integers to be searched. Explain why simply replacing +an-integer-between by an-integer-starting-from in the procedure in +exercise 4.35 is not an adequate way to +generate arbitrary Pythagorean triples. Write a procedure that +actually will accomplish this. (That is, write a procedure for which +repeatedly typing try-again would in principle eventually +generate all Pythagorean triples.) +

                                                                                    + +

                                                                                    +Exercise 4.37.  Ben Bitdiddle claims that the following method for generating +Pythagorean triples is more efficient than the one in +exercise 4.35. Is he correct? (Hint: Consider +the number of possibilities that must be explored.)

                                                                                    + +

                                                                                    (define (a-pythagorean-triple-between low high)
                                                                                    +  (let ((i (an-integer-between low high))
                                                                                    +        (hsq (* high high)))
                                                                                    +    (let ((j (an-integer-between i high)))
                                                                                    +      (let ((ksq (+ (* i i) (* j j))))
                                                                                    +        (require (>= hsq ksq))
                                                                                    +        (let ((k (sqrt ksq)))
                                                                                    +          (require (integer? k))
                                                                                    +          (list i j k))))))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    4.3.2  Examples of Nondeterministic Programs

                                                                                    + +

                                                                                    + +Section 4.3.3 describes the implementation of +the amb evaluator. First, however, we give some examples of how +it can be used. The advantage of nondeterministic programming is that +we can suppress the details of how search is carried out, thereby +expressing our programs at a higher level of abstraction.

                                                                                    + + +

                                                                                    Logic Puzzles

                                                                                    + + +The following puzzle (taken from Dinesman 1968) is typical of a large +class of simple logic puzzles:

                                                                                    + +

                                                                                    +Baker, Cooper, Fletcher, Miller, and Smith live on different floors of +an apartment house that contains only five floors. Baker does not +live on the top floor. Cooper does not live on the bottom floor. +Fletcher does not live on either the top or the bottom floor. Miller +lives on a higher floor than does Cooper. Smith does not live on a +floor adjacent to Fletcher's. Fletcher does not live on a floor +adjacent to Cooper's. Where does everyone live? +

                                                                                    + +We can determine who lives on each floor in a straightforward way by +enumerating all the possibilities and imposing the given +restrictions:48

                                                                                    + + +

                                                                                    (define (multiple-dwelling)
                                                                                    +  (let ((baker (amb 1 2 3 4 5))
                                                                                    +        (cooper (amb 1 2 3 4 5))
                                                                                    +        (fletcher (amb 1 2 3 4 5))
                                                                                    +        (miller (amb 1 2 3 4 5))
                                                                                    +        (smith (amb 1 2 3 4 5)))
                                                                                    +    (require
                                                                                    +     (distinct? (list baker cooper fletcher miller smith)))
                                                                                    +    (require (not (= baker 5)))
                                                                                    +    (require (not (= cooper 1)))
                                                                                    +    (require (not (= fletcher 5)))
                                                                                    +    (require (not (= fletcher 1)))
                                                                                    +    (require (> miller cooper))
                                                                                    +    (require (not (= (abs (- smith fletcher)) 1)))
                                                                                    +    (require (not (= (abs (- fletcher cooper)) 1)))
                                                                                    +    (list (list 'baker baker)
                                                                                    +          (list 'cooper cooper)
                                                                                    +          (list 'fletcher fletcher)
                                                                                    +          (list 'miller miller)
                                                                                    +          (list 'smith smith))))
                                                                                    +

                                                                                    + + +Evaluating the expression (multiple-dwelling) produces the +result + +

                                                                                    ((baker 3) (cooper 2) (fletcher 4) (miller 5) (smith 1))
                                                                                    +

                                                                                    +Although this simple procedure works, it is very slow. +Exercises 4.39 +and 4.40 discuss some possible +improvements.

                                                                                    + +

                                                                                    +Exercise 4.38.  Modify the multiple-dwelling procedure to omit the requirement that +Smith and Fletcher do not live on adjacent floors. How many solutions +are there to this modified puzzle? +

                                                                                    + +

                                                                                    +Exercise 4.39.  Does the order of the restrictions in the multiple-dwelling procedure +affect the answer? Does it affect the time to find an answer? If you +think it matters, demonstrate a faster program obtained from the given +one by reordering the restrictions. If you think it does not matter, +argue your case. + +

                                                                                    + +

                                                                                    +Exercise 4.40.  In the multiple dwelling problem, how many sets of assignments are +there of people to floors, both before and after the requirement that +floor assignments be distinct? It is very inefficient to generate all +possible assignments of people to floors and then leave it to +backtracking to eliminate them. For example, most of the restrictions +depend on only one or two of the person-floor variables, and can thus +be imposed before floors have been selected for all the people. +Write and demonstrate a much more efficient +nondeterministic procedure that solves this problem based upon +generating only those possibilities that are not already ruled out by +previous restrictions. (Hint: This will require a nest of let +expressions.) + +

                                                                                    + +

                                                                                    +Exercise 4.41.  Write an ordinary Scheme program to solve the multiple dwelling puzzle. +

                                                                                    + +

                                                                                    +Exercise 4.42.  Solve the following ``Liars'' puzzle (from Phillips 1934): +

                                                                                    +Five schoolgirls sat for an examination. Their parents -- so they +thought -- showed an undue degree of interest in the result. They +therefore agreed that, in writing home about the examination, each +girl should make one true statement and one untrue one. The following +are the relevant passages from their letters: +

                                                                                      +
                                                                                    • Betty: ``Kitty was second in the examination. I was only third.'' +
                                                                                    • Ethel: ``You'll be glad to hear that I was on top. Joan was second.'' +
                                                                                    • Joan: ``I was third, and poor old Ethel was bottom.'' +
                                                                                    • Kitty: ``I came out second. Mary was only fourth.'' +
                                                                                    • Mary: ``I was fourth. Top place was taken by Betty.'' +

                                                                                    +What in fact was the order in which the five girls were placed? +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.43.  Use the amb evaluator to solve the following puzzle:49 +

                                                                                    +Mary Ann Moore's father has a yacht and so has each of his four +friends: Colonel Downing, Mr. Hall, Sir Barnacle Hood, and Dr. +Parker. Each of the five also has one daughter and each has named his +yacht after a daughter of one of the others. Sir Barnacle's yacht is +the Gabrielle, Mr. Moore owns the Lorna; Mr. Hall the Rosalind. The +Melissa, owned by Colonel Downing, is named after Sir Barnacle's +daughter. Gabrielle's father owns the yacht that is named after Dr. +Parker's daughter. Who is Lorna's father? +
                                                                                    +Try to write the program so that it runs efficiently (see +exercise 4.40). Also determine how many +solutions there are if we are not told that Mary Ann's last name is +Moore. +

                                                                                    + +

                                                                                    +Exercise 4.44.  Exercise 2.42 described the ``eight-queens puzzle'' of +placing queens on a chessboard so that no two attack each other. +Write a nondeterministic program to solve this puzzle. +

                                                                                    + + +

                                                                                    Parsing natural language

                                                                                    + + +Programs designed to accept natural language as input usually start by +attempting to parse the input, that is, to match the input +against some grammatical structure. For example, we might try to +recognize simple sentences consisting of an article followed by a noun +followed by a verb, such as ``The cat eats.'' To accomplish such an +analysis, we must be able to identify the parts of speech of +individual words. We could start with some lists that classify +various words:50

                                                                                    + +

                                                                                    (define nouns '(noun student professor cat class))
                                                                                    +(define verbs '(verb studies lectures eats sleeps))
                                                                                    +(define articles '(article the a))
                                                                                    +

                                                                                    +We also need a grammar, that is, a set of rules describing how +grammatical elements are composed from simpler elements. A very +simple grammar might stipulate that a sentence always consists of two +pieces -- a noun phrase followed by a verb -- and that a noun phrase +consists of an article followed by a noun. With this grammar, the +sentence ``The cat eats'' is parsed as follows:

                                                                                    + +

                                                                                    (sentence (noun-phrase (article the) (noun cat))
                                                                                    +          (verb eats))
                                                                                    +

                                                                                    + +We can generate such a parse with a simple program that has separate +procedures for each of the grammatical rules. To parse a sentence, we +identify its two constituent pieces and return a list of +these two elements, tagged with the symbol sentence:

                                                                                    + +

                                                                                    (define (parse-sentence)
                                                                                    +  (list 'sentence
                                                                                    +         (parse-noun-phrase)
                                                                                    +         (parse-word verbs)))
                                                                                    +

                                                                                    +A noun phrase, similarly, is parsed by finding an article followed by a +noun: +

                                                                                    (define (parse-noun-phrase)
                                                                                    +  (list 'noun-phrase
                                                                                    +        (parse-word articles)
                                                                                    +        (parse-word nouns)))
                                                                                    +

                                                                                    + +At the lowest level, parsing boils down to repeatedly checking that +the next unparsed word is a member of the list of words for the +required part of speech. To implement this, we maintain a global +variable *unparsed*, which is the input that has not yet been +parsed. Each time we check a word, we require that *unparsed* +must be non-empty and that it should begin with a word from the +designated list. If so, we remove that word from *unparsed* and +return the word together with its part of speech (which is found at +the head of the list):51

                                                                                    + +

                                                                                    (define (parse-word word-list)
                                                                                    +  (require (not (null? *unparsed*)))
                                                                                    +  (require (memq (car *unparsed*) (cdr word-list)))
                                                                                    +  (let ((found-word (car *unparsed*)))
                                                                                    +    (set! *unparsed* (cdr *unparsed*))
                                                                                    +    (list (car word-list) found-word)))
                                                                                    +

                                                                                    + +To start the parsing, all we need to do is set *unparsed* to be +the entire input, try to parse a sentence, and check that nothing is +left over:

                                                                                    + +

                                                                                    (define *unparsed* '())
                                                                                    +(define (parse input)
                                                                                    +  (set! *unparsed* input)
                                                                                    +  (let ((sent (parse-sentence)))
                                                                                    +    (require (null? *unparsed*))
                                                                                    +    sent))
                                                                                    +

                                                                                    + +We can now try the parser and verify that it works for our simple test +sentence:

                                                                                    + +

                                                                                    ;;; Amb-Eval input:
                                                                                    +(parse '(the cat eats))
                                                                                    +;;; Starting a new problem
                                                                                    +;;; Amb-Eval value:
                                                                                    +(sentence (noun-phrase (article the) (noun cat)) (verb eats))
                                                                                    +

                                                                                    + +The amb evaluator is useful here because it is convenient to +express the parsing constraints with the aid of require. +Automatic search and backtracking really pay off, however, when we +consider more complex grammars where there are choices for how the +units can be decomposed.

                                                                                    + + +Let's add to our grammar a list of prepositions:

                                                                                    + +

                                                                                    (define prepositions '(prep for to in by with))
                                                                                    +

                                                                                    + +and define a prepositional phrase (e.g., ``for the cat'') to be +a preposition followed by a noun phrase:

                                                                                    + +

                                                                                    (define (parse-prepositional-phrase)
                                                                                    +  (list 'prep-phrase
                                                                                    +        (parse-word prepositions)
                                                                                    +        (parse-noun-phrase)))
                                                                                    +

                                                                                    +Now we can define a sentence to be a noun phrase followed by a verb +phrase, where a verb phrase can be either a verb or a verb phrase +extended by a prepositional phrase:52

                                                                                    + +

                                                                                    (define (parse-sentence)
                                                                                    +  (list 'sentence
                                                                                    +         (parse-noun-phrase)
                                                                                    +         (parse-verb-phrase)))
                                                                                    +(define (parse-verb-phrase)
                                                                                    +  (define (maybe-extend verb-phrase)
                                                                                    +    (amb verb-phrase
                                                                                    +         (maybe-extend (list 'verb-phrase
                                                                                    +                             verb-phrase
                                                                                    +                             (parse-prepositional-phrase)))))
                                                                                    +  (maybe-extend (parse-word verbs)))
                                                                                    +

                                                                                    + +While we're at it, we can also elaborate the definition of noun +phrases to permit such things as ``a cat in the class.'' What we used +to call a noun phrase, we'll now call a simple noun phrase, and a noun +phrase will now be either a simple noun phrase or a noun phrase +extended by a prepositional phrase:

                                                                                    + +

                                                                                    (define (parse-simple-noun-phrase)
                                                                                    +  (list 'simple-noun-phrase
                                                                                    +        (parse-word articles)
                                                                                    +        (parse-word nouns)))
                                                                                    +(define (parse-noun-phrase)
                                                                                    +  (define (maybe-extend noun-phrase)
                                                                                    +    (amb noun-phrase
                                                                                    +         (maybe-extend (list 'noun-phrase
                                                                                    +                             noun-phrase
                                                                                    +                             (parse-prepositional-phrase)))))
                                                                                    +  (maybe-extend (parse-simple-noun-phrase)))
                                                                                    +

                                                                                    + +Our new grammar lets us parse more complex sentences. For example +

                                                                                    (parse '(the student with the cat sleeps in the class))
                                                                                    +

                                                                                    +produces

                                                                                    + +

                                                                                    (sentence
                                                                                    + (noun-phrase
                                                                                    +  (simple-noun-phrase (article the) (noun student))
                                                                                    +  (prep-phrase (prep with)
                                                                                    +               (simple-noun-phrase
                                                                                    +                (article the) (noun cat))))
                                                                                    + (verb-phrase
                                                                                    +  (verb sleeps)
                                                                                    +  (prep-phrase (prep in)
                                                                                    +               (simple-noun-phrase
                                                                                    +                (article the) (noun class)))))
                                                                                    +

                                                                                    + +Observe that a given input may have more than one legal parse. In +the sentence ``The professor lectures to the student with the cat,'' +it may be that the professor is lecturing with the cat, or that the +student has the cat. Our nondeterministic program finds both +possibilities:

                                                                                    + +

                                                                                    (parse '(the professor lectures to the student with the cat))
                                                                                    +

                                                                                    +produces

                                                                                    + +

                                                                                    (sentence
                                                                                    + (simple-noun-phrase (article the) (noun professor))
                                                                                    + (verb-phrase
                                                                                    +  (verb-phrase
                                                                                    +   (verb lectures)
                                                                                    +   (prep-phrase (prep to)
                                                                                    +                (simple-noun-phrase
                                                                                    +                 (article the) (noun student))))
                                                                                    +  (prep-phrase (prep with)
                                                                                    +               (simple-noun-phrase
                                                                                    +                (article the) (noun cat)))))
                                                                                    +

                                                                                    +Asking the evaluator to try again yields +

                                                                                    (sentence
                                                                                    + (simple-noun-phrase (article the) (noun professor))
                                                                                    + (verb-phrase
                                                                                    +  (verb lectures)
                                                                                    +  (prep-phrase (prep to)
                                                                                    +               (noun-phrase
                                                                                    +                (simple-noun-phrase
                                                                                    +                 (article the) (noun student))
                                                                                    +                (prep-phrase (prep with)
                                                                                    +                             (simple-noun-phrase
                                                                                    +                              (article the) (noun cat)))))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.45.  With the grammar given above, the following sentence can be parsed in +five different ways: +``The professor lectures to the student in the class with the cat.'' +Give the five parses and explain the differences in shades of +meaning among them. +

                                                                                    + +

                                                                                    +Exercise 4.46.  The evaluators in sections 4.1 and 4.2 +do not determine what order operands are evaluated in. +We will see that the amb evaluator evaluates them from left to right. +Explain why our parsing program wouldn't work if the operands were evaluated +in some other order. +

                                                                                    + +

                                                                                    +Exercise 4.47.  Louis Reasoner suggests that, since a verb phrase is either a verb or +a verb phrase followed by a prepositional phrase, it would be much more +straightforward to define the procedure parse-verb-phrase as +follows (and similarly for noun phrases): +

                                                                                    (define (parse-verb-phrase)
                                                                                    +  (amb (parse-word verbs)
                                                                                    +       (list 'verb-phrase
                                                                                    +             (parse-verb-phrase)
                                                                                    +             (parse-prepositional-phrase))))
                                                                                    +

                                                                                    +Does this work? Does the program's behavior change if we interchange +the order of expressions in the amb? +

                                                                                    + +

                                                                                    +Exercise 4.48.  Extend the grammar given above to handle more complex sentences. For +example, you could extend noun phrases and verb phrases to include +adjectives and adverbs, or you could handle compound sentences.53 +

                                                                                    + +

                                                                                    +Exercise 4.49.  Alyssa P. Hacker is more interested in generating interesting +sentences than in parsing them. She reasons that by simply changing +the procedure parse-word so that it ignores the ``input +sentence'' and instead always succeeds and generates an appropriate +word, we can use the programs we had built for parsing to do +generation instead. Implement Alyssa's idea, and show the first +half-dozen or so sentences generated.54 + +

                                                                                    + + +

                                                                                    4.3.3  Implementing the Amb Evaluator

                                                                                    + + + +The evaluation of an ordinary Scheme expression may return a value, +may never terminate, or may signal an error. In nondeterministic +Scheme the evaluation of an expression may in addition result in the +discovery of a dead end, in which case evaluation must backtrack to a previous +choice point. The interpretation of nondeterministic Scheme is +complicated by this extra case.

                                                                                    + +We will construct the amb evaluator for nondeterministic Scheme +by modifying the analyzing evaluator of section 4.1.7.55 +As in the analyzing evaluator, evaluation of an expression is +accomplished by calling an execution procedure produced by analysis of +that expression. The difference between the interpretation of ordinary +Scheme and the interpretation of nondeterministic Scheme will be entirely +in the execution procedures.

                                                                                    + + +

                                                                                    Execution procedures and continuations

                                                                                    + + +Recall that the execution procedures for the ordinary evaluator take +one argument: the environment of execution. In contrast, the +execution procedures in the amb evaluator take three arguments: +the environment, and two procedures called continuation +procedures. The evaluation of an expression will finish by calling +one of these two continuations: If the evaluation results in a value, +the success continuation is called with that value; if the +evaluation results in the discovery of a dead end, the failure +continuation is called. Constructing and calling appropriate +continuations is the mechanism by which the nondeterministic evaluator +implements backtracking.

                                                                                    + +It is the job of the success continuation to receive a value and +proceed with the computation. Along with that value, the success +continuation is passed another failure continuation, which is to be +called subsequently if the use of that value leads to a dead end.

                                                                                    + +It is the job of the failure continuation to try another branch of the +nondeterministic process. The essence of the nondeterministic +language is in the fact that expressions may represent choices among +alternatives. The evaluation of such an expression must proceed with +one of the indicated alternative choices, even though it is not known +in advance which choices will lead to acceptable results. To deal +with this, the evaluator picks one of the alternatives and passes this +value to the success continuation. Together with this value, the +evaluator constructs and passes along a failure continuation that can +be called later to choose a different alternative.

                                                                                    + +A failure is triggered during evaluation (that is, a failure +continuation is called) when a user program explicitly rejects the +current line of attack (for example, a call to require may +result in execution of (amb), an expression that always +fails -- see section 4.3.1). The failure continuation in hand +at that point will cause the most recent choice point to choose +another alternative. If there are no more alternatives to be +considered at that choice point, a failure at an earlier choice point +is triggered, and so on. Failure continuations are also invoked by +the driver loop in response to a try-again request, to find +another value of the expression.

                                                                                    + +In addition, if a side-effect operation (such as assignment to a +variable) occurs on a branch of the process resulting from a choice, +it may be necessary, when the process finds a dead end, to undo the +side effect before making a new choice. This is accomplished by +having the side-effect operation produce a failure continuation that +undoes the side effect and propagates the failure.

                                                                                    + + +In summary, failure continuations are constructed by +

                                                                                      +
                                                                                    • amb expressions -- to provide a mechanism to make +alternative choices if the current choice made by the amb +expression leads to a dead end;

                                                                                      + +

                                                                                    • the top-level driver -- to provide a mechanism to report failure +when the choices are exhausted;

                                                                                      + +

                                                                                    • assignments -- to intercept failures and undo assignments +during backtracking. +

                                                                                    + +Failures are initiated only when a dead end is encountered. +This occurs +

                                                                                      +
                                                                                    • if the user program executes (amb);

                                                                                      + +

                                                                                    • if the user types try-again at the top-level driver. +

                                                                                    + +Failure continuations are also called during processing of a failure: +

                                                                                      +
                                                                                    • When the failure continuation created by an assignment finishes +undoing a side effect, it calls the failure continuation it intercepted, +in order to propagate the failure back to the choice point that +led to this assignment or to the top level.

                                                                                      + +

                                                                                    • When the failure continuation for an amb runs out of choices, +it calls the failure continuation that was originally given to the amb, +in order to propagate the failure back to the previous choice point +or to the top level. +

                                                                                    +

                                                                                    + + + +

                                                                                    Structure of the evaluator

                                                                                    + +The syntax- and data-representation procedures for the amb +evaluator, and also the basic analyze procedure, are identical +to those in the evaluator of section 4.1.7, +except for the fact that we need additional syntax procedures to +recognize the amb special form:56 +

                                                                                    (define (amb? exp) (tagged-list? exp 'amb))
                                                                                    +(define (amb-choices exp) (cdr exp))
                                                                                    +

                                                                                    +We must also add to the dispatch in analyze a clause that will +recognize this special form and generate an appropriate execution procedure:

                                                                                    + +

                                                                                    ((amb? exp) (analyze-amb exp))
                                                                                    +

                                                                                    + +The top-level procedure ambeval (similar to the version of eval given in section 4.1.7) analyzes the +given expression and applies the resulting execution procedure to the +given environment, together with two given continuations:

                                                                                    + +

                                                                                    (define (ambeval exp env succeed fail)
                                                                                    +  ((analyze exp) env succeed fail))
                                                                                    +

                                                                                    + +A success continuation is a procedure of two arguments: the value just +obtained and another failure continuation to be used if that value leads +to a subsequent failure. A failure continuation is a procedure of no +arguments. So the general form of an execution procedure is

                                                                                    + +

                                                                                    (lambda (env succeed fail)
                                                                                    +  ;; succeed is (lambda (value fail) ...)
                                                                                    +  ;; fail is (lambda () ...)
                                                                                    +  ...)
                                                                                    +

                                                                                    + +For example, executing

                                                                                    + +

                                                                                    (ambeval <exp>
                                                                                    +         the-global-environment
                                                                                    +         (lambda (value fail) value)
                                                                                    +         (lambda () 'failed))
                                                                                    +

                                                                                    +will attempt to evaluate the given expression and will return +either the expression's value (if the evaluation succeeds) or +the symbol failed (if the evaluation fails). +The call to ambeval in the driver loop shown below uses +much more complicated continuation procedures, which continue the +loop and support the try-again request.

                                                                                    + +Most of the complexity of the amb evaluator results +from the mechanics of passing the continuations around as the +execution procedures call each other. In going through the following code, +you should compare each of the execution procedures with the +corresponding procedure for the ordinary evaluator given in +section 4.1.7.

                                                                                    + + +

                                                                                    Simple expressions

                                                                                    + +The execution procedures for the simplest kinds of expressions are +essentially the same as those for the ordinary evaluator, except for the +need to manage the continuations. The execution procedures simply +succeed with the value of the expression, passing along the failure +continuation that was passed to them.

                                                                                    + + +

                                                                                    (define (analyze-self-evaluating exp)
                                                                                    +  (lambda (env succeed fail)
                                                                                    +    (succeed exp fail)))
                                                                                    +(define (analyze-quoted exp)
                                                                                    +  (let ((qval (text-of-quotation exp)))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (succeed qval fail))))
                                                                                    +(define (analyze-variable exp)
                                                                                    +  (lambda (env succeed fail)
                                                                                    +    (succeed (lookup-variable-value exp env)
                                                                                    +             fail)))
                                                                                    +(define (analyze-lambda exp)
                                                                                    +  (let ((vars (lambda-parameters exp))
                                                                                    +        (bproc (analyze-sequence (lambda-body exp))))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (succeed (make-procedure vars bproc env)
                                                                                    +               fail))))
                                                                                    +

                                                                                    + + +Notice that looking up a variable always ``succeeds.'' If lookup-variable-value fails to find the variable, it signals an +error, as usual. Such a ``failure'' indicates a program bug -- a +reference to an unbound variable; it is not an indication that we +should try another nondeterministic choice instead of the one that is +currently being tried.

                                                                                    + + +

                                                                                    Conditionals and sequences

                                                                                    + +Conditionals are also handled in a similar way as in the ordinary +evaluator. The execution procedure generated by analyze-if +invokes the predicate execution procedure pproc with a success +continuation that checks whether the predicate value is true and goes +on to execute either the consequent or the alternative. If the +execution of pproc fails, the original failure continuation for +the if expression is called.

                                                                                    + + +

                                                                                    (define (analyze-if exp)
                                                                                    +  (let ((pproc (analyze (if-predicate exp)))
                                                                                    +        (cproc (analyze (if-consequent exp)))
                                                                                    +        (aproc (analyze (if-alternative exp))))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (pproc env
                                                                                    +             ;; success continuation for evaluating the predicate
                                                                                    +             ;; to obtain pred-value
                                                                                    +             (lambda (pred-value fail2)
                                                                                    +               (if (true? pred-value)
                                                                                    +                   (cproc env succeed fail2)
                                                                                    +                   (aproc env succeed fail2)))
                                                                                    +             ;; failure continuation for evaluating the predicate
                                                                                    +             fail))))
                                                                                    +

                                                                                    + +Sequences are also handled in the same way as in the previous +evaluator, except for the machinations in the subprocedure sequentially that are required for passing the continuations. +Namely, to sequentially execute a and then b, we call a with a success continuation that calls b.

                                                                                    + +

                                                                                    (define (analyze-sequence exps)
                                                                                    +  (define (sequentially a b)
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (a env
                                                                                    +         ;; success continuation for calling a
                                                                                    +         (lambda (a-value fail2)
                                                                                    +           (b env succeed fail2))
                                                                                    +         ;; failure continuation for calling a
                                                                                    +         fail)))
                                                                                    +  (define (loop first-proc rest-procs)
                                                                                    +    (if (null? rest-procs)
                                                                                    +        first-proc
                                                                                    +        (loop (sequentially first-proc (car rest-procs))
                                                                                    +              (cdr rest-procs))))
                                                                                    +  (let ((procs (map analyze exps)))
                                                                                    +    (if (null? procs)
                                                                                    +        (error "Empty sequence -- ANALYZE"))
                                                                                    +    (loop (car procs) (cdr procs))))
                                                                                    +

                                                                                    + + +

                                                                                    Definitions and assignments

                                                                                    + +Definitions are another case where we must go to some trouble to +manage the continuations, because it is necessary to evaluate the +definition-value expression before actually defining the new variable. +To accomplish this, the definition-value execution procedure vproc is called with the environment, a success continuation, and the +failure continuation. If the execution of vproc succeeds, +obtaining a value val for the defined variable, the variable is +defined and the success is propagated:

                                                                                    + +

                                                                                    (define (analyze-definition exp)
                                                                                    +  (let ((var (definition-variable exp))
                                                                                    +        (vproc (analyze (definition-value exp))))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (vproc env                        
                                                                                    +             (lambda (val fail2)
                                                                                    +               (define-variable! var val env)
                                                                                    +               (succeed 'ok fail2))
                                                                                    +             fail))))
                                                                                    +

                                                                                    + + +Assignments are more interesting. This is the first place where we +really use the continuations, rather than just passing them around. +The execution procedure for assignments starts out like the one for +definitions. It first attempts to obtain the new value to be assigned +to the variable. If this evaluation of vproc fails, the +assignment fails.

                                                                                    + +If vproc succeeds, however, and we go on to make the assignment, +we must consider the possibility that this branch of the computation +might later fail, which will require us to backtrack out of the +assignment. Thus, we must arrange to undo the assignment as +part of the backtracking process.57

                                                                                    + +This is accomplished by giving vproc a success continuation +(marked with the comment ``*1*'' below) that saves the old value of +the variable before assigning the new value to the +variable and proceeding from the assignment. The failure continuation +that is passed along with the value of the assignment (marked with the +comment ``*2*'' below) restores the old value of the variable +before continuing the failure. +That is, a successful assignment provides a failure continuation that +will intercept a subsequent failure; whatever failure would otherwise +have called fail2 calls this procedure instead, to undo the +assignment before actually calling fail2.

                                                                                    + +

                                                                                    (define (analyze-assignment exp)
                                                                                    +  (let ((var (assignment-variable exp))
                                                                                    +        (vproc (analyze (assignment-value exp))))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (vproc env
                                                                                    +             (lambda (val fail2)        ; *1*
                                                                                    +               (let ((old-value
                                                                                    +                      (lookup-variable-value var env))) 
                                                                                    +                 (set-variable-value! var val env)
                                                                                    +                 (succeed 'ok
                                                                                    +                          (lambda ()    ; *2*
                                                                                    +                            (set-variable-value! var
                                                                                    +                                                 old-value
                                                                                    +                                                 env)
                                                                                    +                            (fail2)))))
                                                                                    +             fail))))
                                                                                    +

                                                                                    + + +

                                                                                    Procedure applications

                                                                                    + +The execution procedure for applications contains no new ideas except +for the technical complexity of managing the continuations. This +complexity arises in analyze-application, due to the need to +keep track of the success and failure continuations as we evaluate the +operands. We use a procedure get-args to evaluate the list of +operands, rather than a simple map as in the ordinary evaluator.

                                                                                    + +

                                                                                    (define (analyze-application exp)
                                                                                    +  (let ((fproc (analyze (operator exp)))
                                                                                    +        (aprocs (map analyze (operands exp))))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (fproc env
                                                                                    +             (lambda (proc fail2)
                                                                                    +               (get-args aprocs
                                                                                    +                         env
                                                                                    +                         (lambda (args fail3)
                                                                                    +                           (execute-application
                                                                                    +                            proc args succeed fail3))
                                                                                    +                         fail2))
                                                                                    +             fail))))
                                                                                    +

                                                                                    + +In get-args, notice how cdring down the list of aproc execution procedures and consing up the resulting list of +args is accomplished by calling each aproc in the list +with a success continuation that recursively calls get-args. +Each of these recursive calls to get-args has a success +continuation whose value is the cons of the newly obtained +argument onto the list of accumulated arguments:

                                                                                    + +

                                                                                    (define (get-args aprocs env succeed fail)
                                                                                    +  (if (null? aprocs)
                                                                                    +      (succeed '() fail)
                                                                                    +      ((car aprocs) env
                                                                                    +                    ;; success continuation for this aproc
                                                                                    +                    (lambda (arg fail2)
                                                                                    +                      (get-args (cdr aprocs)
                                                                                    +                                env
                                                                                    +                                ;; success continuation for recursive
                                                                                    +                                ;; call to get-args
                                                                                    +                                (lambda (args fail3)
                                                                                    +                                  (succeed (cons arg args)
                                                                                    +                                           fail3))
                                                                                    +                                fail2))
                                                                                    +                    fail)))
                                                                                    +

                                                                                    + +The actual procedure application, which is +performed by execute-application, is +accomplished in the same way as for the ordinary evaluator, except for +the need to manage the continuations.

                                                                                    + +

                                                                                    (define (execute-application proc args succeed fail)
                                                                                    +  (cond ((primitive-procedure? proc)
                                                                                    +         (succeed (apply-primitive-procedure proc args)
                                                                                    +                  fail))
                                                                                    +        ((compound-procedure? proc)
                                                                                    +         ((procedure-body proc)
                                                                                    +          (extend-environment (procedure-parameters proc)
                                                                                    +                              args
                                                                                    +                              (procedure-environment proc))
                                                                                    +          succeed
                                                                                    +          fail))
                                                                                    +        (else
                                                                                    +         (error
                                                                                    +          "Unknown procedure type -- EXECUTE-APPLICATION"
                                                                                    +          proc))))
                                                                                    +

                                                                                    + + +

                                                                                    Evaluating amb expressions

                                                                                    + + +The amb special form is the key element in the nondeterministic +language. Here we see the essence of the interpretation process and +the reason for keeping track of the continuations. The execution +procedure for amb defines a loop try-next that cycles +through the execution procedures for all the possible values of the +amb expression. Each execution procedure is called with a +failure continuation that will try the next one. When there are no +more alternatives to try, the entire amb expression fails.

                                                                                    + +

                                                                                    (define (analyze-amb exp)
                                                                                    +  (let ((cprocs (map analyze (amb-choices exp))))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (define (try-next choices)
                                                                                    +        (if (null? choices)
                                                                                    +            (fail)
                                                                                    +            ((car choices) env
                                                                                    +                           succeed
                                                                                    +                           (lambda ()
                                                                                    +                             (try-next (cdr choices))))))
                                                                                    +      (try-next cprocs))))
                                                                                    +

                                                                                    + + +

                                                                                    Driver loop

                                                                                    + + +The driver loop for the amb evaluator is complex, due to +the mechanism that permits the user to try again in evaluating an +expression. The driver uses a procedure called internal-loop, +which takes as argument a procedure try-again. The intent is +that calling try-again should go on to the next untried +alternative in the nondeterministic evaluation. Internal-loop +either calls try-again in response to the user typing try-again at the driver loop, or else starts a new evaluation by +calling ambeval.

                                                                                    + +The failure continuation for this call to ambeval +informs the user that there are no more values and re-invokes the driver loop.

                                                                                    + + +The success continuation for the call to ambeval +is more subtle. We print the obtained value and then invoke +the internal loop again with a try-again procedure that will be +able to try the next alternative. This next-alternative +procedure is the second argument that was passed to the +success continuation. Ordinarily, we think of this second argument +as a failure continuation to be used if the current evaluation branch +later fails. In this case, however, we have completed a successful +evaluation, so we can invoke the ``failure'' alternative branch in +order to search for additional successful evaluations.

                                                                                    + +

                                                                                    (define input-prompt ";;; Amb-Eval input:")
                                                                                    +(define output-prompt ";;; Amb-Eval value:")
                                                                                    +(define (driver-loop)
                                                                                    +  (define (internal-loop try-again)
                                                                                    +    (prompt-for-input input-prompt)
                                                                                    +    (let ((input (read)))
                                                                                    +      (if (eq? input 'try-again)
                                                                                    +          (try-again)
                                                                                    +          (begin
                                                                                    +            (newline)
                                                                                    +            (display ";;; Starting a new problem ")
                                                                                    +            (ambeval input
                                                                                    +                     the-global-environment
                                                                                    +                     ;; ambeval success
                                                                                    +                     (lambda (val next-alternative)
                                                                                    +                       (announce-output output-prompt)
                                                                                    +                       (user-print val)
                                                                                    +                       (internal-loop next-alternative))
                                                                                    +                     ;; ambeval failure
                                                                                    +                     (lambda ()
                                                                                    +                       (announce-output
                                                                                    +                        ";;; There are no more values of")
                                                                                    +                       (user-print input)
                                                                                    +                       (driver-loop)))))))
                                                                                    +  (internal-loop
                                                                                    +   (lambda ()
                                                                                    +     (newline)
                                                                                    +     (display ";;; There is no current problem")
                                                                                    +     (driver-loop))))
                                                                                    +

                                                                                    +The initial call to internal-loop uses a try-again procedure that complains that there is no current +problem and restarts the driver loop. This is the behavior that will +happen if the user types try-again when there is no evaluation +in progress.

                                                                                    + +

                                                                                    +Exercise 4.50.  Implement a new special form ramb that is like amb except that it searches alternatives in a random order, rather +than from left to right. Show how this can help with Alyssa's problem +in exercise 4.49. + +

                                                                                    + +

                                                                                    +Exercise 4.51.  Implement a new kind of assignment called permanent-set! that +is not undone upon failure. For example, we can choose two distinct +elements from a list and count the number of trials required to make a +successful choice as follows:

                                                                                    + +

                                                                                    (define count 0)
                                                                                    +(let ((x (an-element-of '(a b c)))
                                                                                    +      (y (an-element-of '(a b c))))
                                                                                    +  (permanent-set! count (+ count 1))
                                                                                    +  (require (not (eq? x y)))
                                                                                    +  (list x y count))
                                                                                    +;;; Starting a new problem
                                                                                    +;;; Amb-Eval value:
                                                                                    +(a b 2)
                                                                                    +;;; Amb-Eval input:
                                                                                    +try-again
                                                                                    +;;; Amb-Eval value:
                                                                                    +(a c 3)
                                                                                    +

                                                                                    +What values would have been displayed if we had used set! here +rather than permanent-set! ? + +

                                                                                    + +

                                                                                    +Exercise 4.52.  Implement a new construct called if-fail that permits the user to +catch the failure of an expression. If-fail takes two +expressions. It evaluates the first expression as usual and returns +as usual if the evaluation succeeds. If the evaluation fails, +however, the value of the second expression is returned, as in the +following example: +

                                                                                    ;;; Amb-Eval input:
                                                                                    +(if-fail (let ((x (an-element-of '(1 3 5))))
                                                                                    +           (require (even? x))
                                                                                    +           x)
                                                                                    +         'all-odd)
                                                                                    +;;; Starting a new problem
                                                                                    +;;; Amb-Eval value:
                                                                                    +all-odd
                                                                                    +;;; Amb-Eval input:
                                                                                    +(if-fail (let ((x (an-element-of '(1 3 5 8))))
                                                                                    +           (require (even? x))
                                                                                    +           x)
                                                                                    +         'all-odd)
                                                                                    +;;; Starting a new problem
                                                                                    +;;; Amb-Eval value:
                                                                                    +8
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.53.  With permanent-set! as described in +exercise 4.51 and if-fail as in +exercise 4.52, what will be the result of evaluating +

                                                                                    (let ((pairs '()))
                                                                                    +  (if-fail (let ((p (prime-sum-pair '(1 3 5 8) '(20 35 110))))
                                                                                    +             (permanent-set! pairs (cons p pairs))
                                                                                    +             (amb))
                                                                                    +           pairs))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.54.  If we had not realized that require could be implemented as an +ordinary procedure that uses amb, to be defined by the user as +part of a nondeterministic program, we would have had to implement it +as a special form. This would require syntax procedures

                                                                                    + +

                                                                                    (define (require? exp) (tagged-list? exp 'require))
                                                                                    +
                                                                                    +(define (require-predicate exp) (cadr exp))
                                                                                    +

                                                                                    +and a new clause in the dispatch in analyze

                                                                                    + +

                                                                                    ((require? exp) (analyze-require exp))
                                                                                    +

                                                                                    +as well the procedure analyze-require that handles require +expressions. Complete the following definition of analyze-require.

                                                                                    + +

                                                                                    (define (analyze-require exp)
                                                                                    +  (let ((pproc (analyze (require-predicate exp))))
                                                                                    +    (lambda (env succeed fail)
                                                                                    +      (pproc env
                                                                                    +             (lambda (pred-value fail2)
                                                                                    +               (if <??>
                                                                                    +                   <??>
                                                                                    +                   (succeed 'ok fail2)))
                                                                                    +             fail))))
                                                                                    +

                                                                                    +

                                                                                    +

                                                                                    + +


                                                                                    +

                                                                                    42 We assume that we have previously defined a +procedure prime? that tests whether numbers are prime. Even with +prime? defined, the prime-sum-pair procedure may look +suspiciously like the unhelpful ``pseudo-Lisp'' attempt to define the +square-root function, which we described at the beginning of +section 1.1.7. In fact, a square-root procedure along those +lines can actually be formulated as a nondeterministic program. +By incorporating a search mechanism into the evaluator, we +are eroding the distinction between purely declarative descriptions +and imperative specifications of how to compute answers. We'll go +even farther in this direction in +section 4.4. + +

                                                                                    43 The idea of amb for nondeterministic programming was +first described in 1961 by John McCarthy (see McCarthy 1967). + +

                                                                                    44 In actuality, the distinction between nondeterministically +returning a single choice and returning all choices depends somewhat +on our point of view. From the perspective of the code that uses the +value, the nondeterministic choice returns a single value. From the +perspective of the programmer designing the code, the nondeterministic +choice potentially returns all possible values, and the computation +branches so that each value is investigated separately. + +

                                                                                    45 One might object that this is a hopelessly +inefficient mechanism. It might require millions of processors to +solve some easily stated problem this way, and most of the time most +of those processors would be idle. This objection should be taken in +the context of history. Memory used to be considered just such an +expensive commodity. In 1964 a megabyte of RAM cost about $400,000. +Now every personal computer has many megabytes of RAM, and most of the +time most of that RAM is unused. It is hard to underestimate the cost +of mass-produced electronics. + +

                                                                                    46 Automagically: ``Automatically, but in a way +which, for some reason (typically because it is too complicated, or +too ugly, or perhaps even too trivial), the speaker doesn't feel like +explaining.'' (Steele 1983, Raymond 1993) + +

                                                                                    47 The integration of automatic search strategies +into programming languages has had a long and checkered history. The +first suggestions that nondeterministic algorithms might be elegantly +encoded in a programming language with search and automatic +backtracking came from Robert Floyd (1967). Carl Hewitt +(1969) invented a programming language called Planner that explicitly +supported automatic chronological backtracking, providing for a +built-in depth-first search strategy. Sussman, Winograd, and Charniak +(1971) implemented a subset of this language, called MicroPlanner, +which was used to support work in problem solving and robot planning. +Similar ideas, arising from logic and theorem proving, led to the +genesis in Edinburgh and Marseille of the elegant language Prolog +(which we will discuss in section 4.4). After +sufficient frustration with automatic search, McDermott and Sussman +(1972) developed a language called Conniver, which included mechanisms +for placing the search strategy under programmer control. This proved +unwieldy, however, and Sussman and Stallman (1975) found a more +tractable approach while investigating methods of symbolic analysis +for electrical circuits. They developed a non-chronological +backtracking scheme that was based on tracing out the logical +dependencies connecting facts, a technique that has come to be known +as dependency-directed backtracking. Although their method was +complex, it produced reasonably efficient programs because it did +little redundant search. Doyle (1979) and McAllester (1978, 1980) +generalized and clarified the methods of Stallman and Sussman, +developing a new paradigm for formulating search that is now called +truth maintenance. Modern problem-solving systems all +use some form of truth-maintenance system as a substrate. See Forbus +and deKleer 1993 for a discussion of elegant ways to build +truth-maintenance systems and applications using truth maintenance. +Zabih, McAllester, and +Chapman 1987 describes a nondeterministic extension to Scheme that +is based on amb; it is similar to the interpreter described in +this section, but more sophisticated, because it uses +dependency-directed backtracking rather than chronological +backtracking. Winston 1992 gives an introduction to both kinds of +backtracking. + +

                                                                                    48 Our program uses the following procedure to determine +if the elements of a list are distinct: +

                                                                                    (define (distinct? items)
                                                                                    +  (cond ((null? items) true)
                                                                                    +        ((null? (cdr items)) true)
                                                                                    +        ((member (car items) (cdr items)) false)
                                                                                    +        (else (distinct? (cdr items)))))
                                                                                    +

                                                                                    +Member is like memq except that it uses equal? instead +of eq? to test for equality. + + +

                                                                                    49 This is taken from a booklet called ``Problematical +Recreations,'' published in the 1960s by Litton Industries, where it +is attributed to the Kansas State Engineer. + +

                                                                                    50 Here we use the convention that the first element of each list +designates the part of speech for the rest of the words in the list. + +

                                                                                    51 Notice that parse-word uses set! to modify the +unparsed input list. For this to work, our amb evaluator must +undo the effects of set! operations when it backtracks. + +

                                                                                    52 Observe that this +definition is recursive -- a verb may be followed by any number +of prepositional phrases. + +

                                                                                    53 This kind of grammar can become arbitrarily complex, but it +is only a toy as far as real language understanding is concerned. +Real natural-language understanding by computer requires an elaborate +mixture of syntactic analysis and interpretation of meaning. On the +other hand, even toy parsers can be useful in supporting flexible +command languages for programs such as information-retrieval systems. +Winston 1992 discusses computational approaches to real +language understanding and also the applications of simple grammars to +command languages. + +

                                                                                    54 Although Alyssa's idea works just fine (and is +surprisingly simple), the sentences that it generates are a bit +boring -- they don't sample the possible sentences of this language in +a very interesting way. In fact, the grammar is highly recursive in +many places, and Alyssa's technique ``falls into'' one of these recursions and +gets stuck. See exercise 4.50 for a way to deal with this. + +

                                                                                    55 We chose to implement the lazy evaluator in +section 4.2 as a modification of the ordinary +metacircular evaluator of section 4.1.1. In +contrast, we will base the amb evaluator on the analyzing evaluator +of section 4.1.7, because the execution procedures +in that evaluator provide a convenient framework for implementing +backtracking. + +

                                                                                    56 We assume that the evaluator supports let +(see exercise 4.22), +which we have used in our nondeterministic programs. + +

                                                                                    57 We didn't worry about undoing definitions, since we can +assume that internal definitions are scanned out +(section 4.1.6). + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-29.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-29.html new file mode 100644 index 00000000..f25cd15b --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-29.html @@ -0,0 +1,2737 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    4.4  Logic Programming

                                                                                    + + + +In chapter 1 we stressed that computer science deals with imperative +(how to) knowledge, whereas mathematics deals with declarative (what +is) knowledge. Indeed, programming languages require that the +programmer express knowledge in a form that indicates the step-by-step +methods for solving particular problems. On the other hand, +high-level languages provide, as part of the language implementation, +a substantial amount of methodological knowledge that frees +the user from concern with numerous details of how a specified +computation will progress.

                                                                                    + +Most programming languages, including Lisp, are organized around +computing the values of mathematical functions. Expression-oriented +languages (such as Lisp, Fortran, and Algol) capitalize on the ``pun'' +that an expression that describes the value of a function may also be +interpreted as a means of computing that value. Because of this, most +programming languages are strongly biased toward unidirectional +computations (computations with well-defined inputs and outputs). +There are, however, radically different programming languages that +relax this bias. We saw one such example in +section 3.3.5, where the objects of computation were +arithmetic constraints. In a constraint system the direction and the +order of computation are not so well specified; in carrying out a +computation the system must therefore provide more detailed ``how to'' +knowledge than would be the case with an ordinary arithmetic +computation. This does not mean, however, that the user is released +altogether from the responsibility of providing imperative knowledge. +There are many constraint networks that implement the same set of +constraints, and the user must choose from the set of mathematically +equivalent networks a suitable network to specify a particular +computation.

                                                                                    + + +The nondeterministic program evaluator of +section 4.3 also moves away from the +view that programming is about constructing algorithms for computing +unidirectional functions. In a nondeterministic language, expressions +can have more than one value, and, as a result, the computation is +dealing with relations rather than with +single-valued functions. Logic programming extends this idea by +combining a relational vision of programming with a powerful kind of +symbolic pattern matching called unification.58

                                                                                    + +This approach, when it works, can be a very powerful way to write +programs. Part of the power comes from the fact that a single ``what +is'' fact can be used to solve a number of different problems that +would have different ``how to'' components. As an example, consider +the append operation, which takes two lists as arguments and +combines their elements to form a single list. In a procedural +language such as Lisp, we could define append in terms of the +basic list constructor cons, as we did in +section 2.2.1:

                                                                                    + +

                                                                                    (define (append x y)
                                                                                    +  (if (null? x)
                                                                                    +      y
                                                                                    +      (cons (car x) (append (cdr x) y))))
                                                                                    +

                                                                                    +This procedure can be regarded as a translation into Lisp of the +following two rules, the first of which covers the case where the +first list is empty and the second of which handles the case of a +nonempty list, which is a cons of two parts:

                                                                                    + +

                                                                                      +
                                                                                    • For any list y, the empty list and y append to form y.

                                                                                      + +

                                                                                    • For any u, v, y, and z, + (cons u v) and y append to form (cons u z) +if v and y append to form z.59 +

                                                                                    + +Using the append procedure, we can answer questions such as + +

                                                                                    +Find the append of (a b) and (c d). +

                                                                                    + +But the same two rules are also sufficient for answering the following +sorts of questions, which the procedure can't answer:

                                                                                    + +

                                                                                    +Find a list y that appends with (a b) +to produce (a b c d).

                                                                                    + +Find all x and y that append to form (a b c +d). +

                                                                                    + +In a logic programming language, the programmer writes an append +``procedure'' by stating the two rules about append given above. +``How to'' knowledge is provided automatically by the interpreter to +allow this single pair of rules to be used to answer all three types +of questions about append.60

                                                                                    + +Contemporary logic programming languages (including the one we +implement here) have substantial deficiencies, in that their general +``how to'' methods can lead them into spurious infinite loops or other +undesirable behavior. +Logic programming is an active field of research in computer science.61

                                                                                    + +Earlier in this chapter we explored the technology of implementing +interpreters and described the elements that are essential to an +interpreter for a Lisp-like language (indeed, to an interpreter for +any conventional language). Now we will apply these ideas to discuss +an interpreter for a logic programming language. We call this +language the query language, because it is very useful for +retrieving information from data bases by formulating queries, +or questions, expressed in the language. Even though the query +language is very different from Lisp, we will find it convenient to +describe the language in terms of the same general framework we have +been using all along: as a collection of primitive elements, together +with means of combination that enable us to combine simple elements to +create more complex elements and means of abstraction that enable us +to regard complex elements as single conceptual units. An interpreter +for a logic programming language is considerably more complex than an +interpreter for a language like Lisp. Nevertheless, we will see +that our query-language interpreter contains many of the same elements +found in the interpreter of section 4.1. In particular, +there will be an ``eval'' part that classifies expressions according +to type and an ``apply'' part that implements the language's +abstraction mechanism (procedures in the case of Lisp, and rules +in the case of logic programming). Also, a central role is played in +the implementation by a frame data structure, which determines the +correspondence between symbols and their associated values. One +additional interesting aspect of our query-language implementation is +that we make substantial use of streams, which were introduced in +chapter 3. + + +

                                                                                    4.4.1  Deductive Information Retrieval

                                                                                    + + + +Logic programming excels in providing interfaces to data bases for +information retrieval. The query language we shall implement in this +chapter is designed to be used in this way.

                                                                                    + +In order to illustrate what the query system does, we will show how it +can be used to manage the data base of personnel records for +Microshaft, a thriving high-technology company in the +Boston area. The language provides pattern-directed access to +personnel information and can also take advantage of general rules in +order to make logical deductions.

                                                                                    + + +

                                                                                    A sample data base

                                                                                    + + +The personnel data base for Microshaft +contains assertions about company personnel. Here is the +information about Ben Bitdiddle, the resident computer wizard:

                                                                                    + +

                                                                                    (address (Bitdiddle Ben) (Slumerville (Ridge Road) 10))
                                                                                    +(job (Bitdiddle Ben) (computer wizard))
                                                                                    +(salary (Bitdiddle Ben) 60000)
                                                                                    +

                                                                                    +Each assertion is a list (in this case a triple) whose elements can +themselves be lists.

                                                                                    + +As resident wizard, Ben is in charge of the company's computer +division, and he supervises two programmers and one technician. Here +is the information about them:

                                                                                    + +

                                                                                    (address (Hacker Alyssa P) (Cambridge (Mass Ave) 78))
                                                                                    +(job (Hacker Alyssa P) (computer programmer))
                                                                                    +(salary (Hacker Alyssa P) 40000)
                                                                                    +(supervisor (Hacker Alyssa P) (Bitdiddle Ben))
                                                                                    +(address (Fect Cy D) (Cambridge (Ames Street) 3))
                                                                                    +(job (Fect Cy D) (computer programmer))
                                                                                    +(salary (Fect Cy D) 35000)
                                                                                    +(supervisor (Fect Cy D) (Bitdiddle Ben))
                                                                                    +(address (Tweakit Lem E) (Boston (Bay State Road) 22))
                                                                                    +(job (Tweakit Lem E) (computer technician))
                                                                                    +(salary (Tweakit Lem E) 25000)
                                                                                    +(supervisor (Tweakit Lem E) (Bitdiddle Ben))
                                                                                    +

                                                                                    +There is also a programmer trainee, who is supervised by Alyssa: +

                                                                                    (address (Reasoner Louis) (Slumerville (Pine Tree Road) 80))
                                                                                    +(job (Reasoner Louis) (computer programmer trainee))
                                                                                    +(salary (Reasoner Louis) 30000)
                                                                                    +(supervisor (Reasoner Louis) (Hacker Alyssa P))
                                                                                    +

                                                                                    +All of these people are in the computer division, as indicated by the +word computer as the first item in their job descriptions.

                                                                                    + +Ben is a high-level employee. His supervisor is the company's big +wheel himself:

                                                                                    + +

                                                                                    (supervisor (Bitdiddle Ben) (Warbucks Oliver))
                                                                                    +(address (Warbucks Oliver) (Swellesley (Top Heap Road)))
                                                                                    +(job (Warbucks Oliver) (administration big wheel))
                                                                                    +(salary (Warbucks Oliver) 150000)
                                                                                    +

                                                                                    + +Besides the computer division supervised by Ben, the company has an +accounting division, consisting of a chief accountant and his +assistant:

                                                                                    + +

                                                                                    (address (Scrooge Eben) (Weston (Shady Lane) 10))
                                                                                    +(job (Scrooge Eben) (accounting chief accountant))
                                                                                    +(salary (Scrooge Eben) 75000)
                                                                                    +(supervisor (Scrooge Eben) (Warbucks Oliver))
                                                                                    +(address (Cratchet Robert) (Allston (N Harvard Street) 16))
                                                                                    +(job (Cratchet Robert) (accounting scrivener))
                                                                                    +(salary (Cratchet Robert) 18000)
                                                                                    +(supervisor (Cratchet Robert) (Scrooge Eben))
                                                                                    +

                                                                                    +There is also a secretary for the big wheel:

                                                                                    + +

                                                                                    (address (Aull DeWitt) (Slumerville (Onion Square) 5))
                                                                                    +(job (Aull DeWitt) (administration secretary))
                                                                                    +(salary (Aull DeWitt) 25000)
                                                                                    +(supervisor (Aull DeWitt) (Warbucks Oliver))
                                                                                    +

                                                                                    + +The data base also contains assertions about which kinds of jobs can +be done by people holding other kinds of jobs. For instance, a +computer wizard can do the jobs of both a computer programmer and a +computer technician:

                                                                                    + +

                                                                                    (can-do-job (computer wizard) (computer programmer))
                                                                                    +(can-do-job (computer wizard) (computer technician))
                                                                                    +

                                                                                    +A computer programmer could fill in for a trainee: +

                                                                                    (can-do-job (computer programmer)
                                                                                    +            (computer programmer trainee))
                                                                                    +

                                                                                    +Also, as is well known, +

                                                                                    (can-do-job (administration secretary)
                                                                                    +            (administration big wheel))
                                                                                    +

                                                                                    + + +

                                                                                    Simple queries

                                                                                    + + +The query language allows users to retrieve information from the data +base by posing queries in response to the system's prompt. For +example, to find all computer programmers one can say

                                                                                    + +

                                                                                    ;;; Query input:
                                                                                    +(job ?x (computer programmer))
                                                                                    +

                                                                                    +The system will respond with the following items:

                                                                                    + +

                                                                                    ;;; Query results:
                                                                                    +(job (Hacker Alyssa P) (computer programmer))
                                                                                    +(job (Fect Cy D) (computer programmer))
                                                                                    +

                                                                                    + + +The input query specifies that we are looking for entries in the data +base that match a certain pattern. In this example, the pattern +specifies entries consisting of three items, of which the first is the +literal symbol job, the second can be anything, and the third is +the literal list (computer programmer). The ``anything'' that +can be the second item in the matching list is specified by a pattern variable, ?x. The general form of a pattern variable +is a symbol, taken to be the name of the variable, preceded by a +question mark. We will see below why it is useful to specify names +for pattern variables rather than just putting ? into patterns +to represent ``anything.'' The system responds to a simple query by +showing all entries in the data base that match the specified pattern.

                                                                                    + +A pattern can have more than one variable. For example, the query +

                                                                                    (address ?x ?y)
                                                                                    +

                                                                                    +will list all the employees' addresses.

                                                                                    + +A pattern can have no variables, in which case the query simply +determines whether that pattern is an entry in the data base. If so, +there will be one match; if not, there will be no matches.

                                                                                    + +The same pattern variable can appear more than once in a query, +specifying that the same ``anything'' must appear in each position. +This is why variables have names. For example,

                                                                                    + +

                                                                                    (supervisor ?x ?x)
                                                                                    +

                                                                                    +finds all people who supervise themselves (though there are no such +assertions in our sample data base).

                                                                                    + +The query +

                                                                                    (job ?x (computer ?type))
                                                                                    +

                                                                                    +matches all job entries whose third item is a two-element list whose +first item is computer:

                                                                                    + +

                                                                                    (job (Bitdiddle Ben) (computer wizard))
                                                                                    +(job (Hacker Alyssa P) (computer programmer))
                                                                                    +(job (Fect Cy D) (computer programmer))
                                                                                    +(job (Tweakit Lem E) (computer technician))
                                                                                    +

                                                                                    +This same pattern does not match +

                                                                                    (job (Reasoner Louis) (computer programmer trainee))
                                                                                    +

                                                                                    +because the third item in the entry is a list of three elements, and +the pattern's third item specifies that there should be two elements. +If we wanted to change the pattern so that the third item could be any +list beginning with computer, we could specify62

                                                                                    + +

                                                                                    (job ?x (computer . ?type))
                                                                                    +

                                                                                    +For example, +

                                                                                    (computer . ?type)
                                                                                    +

                                                                                    +matches the data

                                                                                    + +

                                                                                    (computer programmer trainee)
                                                                                    +

                                                                                    +with ?type as the list (programmer trainee). It also +matches the data

                                                                                    + +

                                                                                    (computer programmer)
                                                                                    +

                                                                                    +with ?type as the list (programmer), and matches the data

                                                                                    + +

                                                                                    (computer)
                                                                                    +

                                                                                    +with ?type as the empty list ().

                                                                                    + +We can describe the query language's processing of simple queries as +follows:

                                                                                    + +

                                                                                      +
                                                                                    • The system finds all assignments to variables in the query +pattern that satisfy the pattern -- that is, all sets of values +for the variables such that if the pattern variables are instantiated with (replaced by) the values, the result is in the data +base.

                                                                                      + +

                                                                                    • The system responds to the query by listing all instantiations of the +query pattern with the variable assignments that satisfy it. +

                                                                                    + +Note that if the pattern has no variables, the query reduces to a +determination of whether that pattern is in the data base. If so, the +empty assignment, which assigns no values to variables, satisfies that +pattern for that data base.

                                                                                    + + +

                                                                                    +Exercise 4.55.  Give simple queries that retrieve the following information from the +data base:

                                                                                    + +

                                                                                    a. all people supervised by Ben Bitdiddle;

                                                                                    + +

                                                                                    b. the names and jobs of all people in the accounting division;

                                                                                    + +

                                                                                    c. the names and addresses of all people who live +in Slumerville. +

                                                                                    + + +

                                                                                    Compound queries

                                                                                    + + +Simple queries form the primitive operations of the query language. +In order to form compound operations, the query language provides +means of combination. One thing that makes the query language a logic +programming language is that the means of combination mirror the means +of combination used in forming logical expressions: and, or, and not. (Here and, or, and not are not +the Lisp primitives, but rather operations built into the query +language.)

                                                                                    + +We can use and as follows to find the addresses of all the +computer programmers:

                                                                                    + +

                                                                                    (and (job ?person (computer programmer))
                                                                                    +     (address ?person ?where))
                                                                                    +

                                                                                    +The resulting output is +

                                                                                    (and (job (Hacker Alyssa P) (computer programmer))
                                                                                    +     (address (Hacker Alyssa P) (Cambridge (Mass Ave) 78)))
                                                                                    +(and (job (Fect Cy D) (computer programmer))
                                                                                    +     (address (Fect Cy D) (Cambridge (Ames Street) 3)))
                                                                                    +

                                                                                    +In general, +

                                                                                    (and <query1> <query2... <queryn>)
                                                                                    +

                                                                                    +is satisfied by all sets of values for the pattern variables that +simultaneously satisfy <query1> ... <queryn>.

                                                                                    + +As for simple queries, the system processes a compound query by +finding all assignments to the pattern variables that satisfy the +query, then displaying instantiations of the query with those values.

                                                                                    + +Another means of constructing compound queries is through or. +For example,

                                                                                    + +

                                                                                    (or (supervisor ?x (Bitdiddle Ben))
                                                                                    +    (supervisor ?x (Hacker Alyssa P)))
                                                                                    +

                                                                                    + +will find all employees supervised by Ben Bitdiddle or Alyssa P. +Hacker:

                                                                                    + +

                                                                                    (or (supervisor (Hacker Alyssa P) (Bitdiddle Ben))
                                                                                    +    (supervisor (Hacker Alyssa P) (Hacker Alyssa P)))
                                                                                    +(or (supervisor (Fect Cy D) (Bitdiddle Ben))
                                                                                    +    (supervisor (Fect Cy D) (Hacker Alyssa P)))
                                                                                    +(or (supervisor (Tweakit Lem E) (Bitdiddle Ben))
                                                                                    +    (supervisor (Tweakit Lem E) (Hacker Alyssa P)))
                                                                                    +(or (supervisor (Reasoner Louis) (Bitdiddle Ben))
                                                                                    +    (supervisor (Reasoner Louis) (Hacker Alyssa P)))
                                                                                    +

                                                                                    +In general, +

                                                                                    (or <query1> <query2... <queryn>)
                                                                                    +

                                                                                    +is satisfied by all sets of values for the pattern variables that +satisfy at least one of <query1> ... <queryn>.

                                                                                    + +Compound queries can also be formed with not. For example, +

                                                                                    (and (supervisor ?x (Bitdiddle Ben))
                                                                                    +     (not (job ?x (computer programmer))))
                                                                                    +

                                                                                    +finds all people supervised by Ben Bitdiddle who are not computer +programmers. In general,

                                                                                    + +

                                                                                    (not <query1>)
                                                                                    +

                                                                                    +is satisfied by all assignments to the pattern variables that do not +satisfy <query1>.63

                                                                                    + +The final combining form is called lisp-value. When lisp-value is the first element of a pattern, it specifies that the +next element is a Lisp predicate to be applied to the rest of the +(instantiated) elements as arguments. In general,

                                                                                    + +

                                                                                    (lisp-value <predicate> <arg1... <argn>)
                                                                                    +

                                                                                    +will be satisfied by assignments to the pattern variables for which the +<predicate> applied to the instantiated +<arg1> ... <argn> +is true. For example, to find all people whose salary is greater than +$30,000 we could write64

                                                                                    + +

                                                                                    (and (salary ?person ?amount)
                                                                                    +     (lisp-value > ?amount 30000))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.56.  Formulate compound queries that retrieve the following information:

                                                                                    + +

                                                                                    a. the names of all people who are supervised by Ben Bitdiddle, together +with their addresses;

                                                                                    + +

                                                                                    b. all people whose salary is less than Ben Bitdiddle's, together with +their salary and Ben Bitdiddle's salary;

                                                                                    + +

                                                                                    c. all people who are supervised by someone who is not in the computer +division, together with the supervisor's name and job. +

                                                                                    +

                                                                                    + + +

                                                                                    Rules

                                                                                    + + +In addition to primitive queries and compound queries, the query +language provides means for abstracting queries. These are given by +rules. The rule

                                                                                    + +

                                                                                    (rule (lives-near ?person-1 ?person-2)
                                                                                    +      (and (address ?person-1 (?town . ?rest-1))
                                                                                    +           (address ?person-2 (?town . ?rest-2))
                                                                                    +           (not (same ?person-1 ?person-2))))
                                                                                    +

                                                                                    +specifies that two people live near each other if they live in the +same town. The final not clause prevents the rule from saying +that all people live near themselves. The same relation is +defined by a very simple rule:65

                                                                                    + +

                                                                                    (rule (same ?x ?x))
                                                                                    +

                                                                                    + +The following rule declares that a person is a ``wheel'' in an +organization if he supervises someone who is in turn a supervisor:

                                                                                    + +

                                                                                    (rule (wheel ?person)
                                                                                    +      (and (supervisor ?middle-manager ?person)
                                                                                    +           (supervisor ?x ?middle-manager)))
                                                                                    +

                                                                                    + +The general form of a rule is + +

                                                                                    (rule <conclusion> <body>)
                                                                                    +

                                                                                    +where <conclusion> is a pattern and <body> is any +query.66 We can think +of a rule as representing a large (even infinite) set of assertions, +namely all instantiations of the rule conclusion with variable +assignments that satisfy the rule body. When we described simple +queries (patterns), we said that an assignment to variables satisfies +a pattern if the instantiated pattern is in the data base. But the +pattern needn't be explicitly in the data base as an assertion. It +can be an implicit assertion implied by a rule. For example, the +query + +

                                                                                    (lives-near ?x (Bitdiddle Ben))
                                                                                    +

                                                                                    +results in + +

                                                                                    (lives-near (Reasoner Louis) (Bitdiddle Ben))
                                                                                    +(lives-near (Aull DeWitt) (Bitdiddle Ben))
                                                                                    +

                                                                                    +To find all computer programmers who live near Ben Bitdiddle, we can +ask + +

                                                                                    (and (job ?x (computer programmer))
                                                                                    +     (lives-near ?x (Bitdiddle Ben)))
                                                                                    +

                                                                                    + + +As in the case of compound procedures, rules can be used as parts of +other rules (as we saw with the lives-near rule above) +or even be defined recursively. For instance, the rule + +

                                                                                    (rule (outranked-by ?staff-person ?boss)
                                                                                    +      (or (supervisor ?staff-person ?boss)
                                                                                    +          (and (supervisor ?staff-person ?middle-manager)
                                                                                    +               (outranked-by ?middle-manager ?boss))))
                                                                                    +

                                                                                    +says that a staff person is outranked by a boss in the organization if +the boss is the person's supervisor or (recursively) if the person's +supervisor is outranked by the boss.

                                                                                    + +

                                                                                    +Exercise 4.57.  Define a rule that says that person 1 can replace person 2 if either +person 1 does the same job as person 2 or someone who does person 1's +job can also do person 2's job, and if person 1 and person 2 are not +the same person. Using your rule, give queries that find the +following:

                                                                                    + +a.  all people who can replace Cy D. Fect;

                                                                                    + +b.  all people who can replace someone who is being paid more than they +are, together with the two salaries. +

                                                                                    + +

                                                                                    +Exercise 4.58.  Define a rule that says that a person is a ``big shot'' in a division +if the person works in the division but does not have a supervisor who +works in the division. +

                                                                                    + +

                                                                                    +Exercise 4.59.  Ben Bitdiddle has missed one meeting too many. +Fearing that his habit of forgetting meetings could cost him his +job, Ben decides to do something about it. He adds all the weekly +meetings of the firm to the Microshaft data base by +asserting the following: +

                                                                                    (meeting accounting (Monday 9am))
                                                                                    +(meeting administration (Monday 10am))
                                                                                    +(meeting computer (Wednesday 3pm))
                                                                                    +(meeting administration (Friday 1pm))
                                                                                    +

                                                                                    +Each of the above assertions is for a meeting of an entire division. +Ben also adds an entry for the company-wide meeting that spans all the +divisions. All of the company's employees attend this meeting. +

                                                                                    (meeting whole-company (Wednesday 4pm))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    a. On Friday morning, Ben wants to query the data base for all the meetings +that occur that day. What query should he use?

                                                                                    + +

                                                                                    b. Alyssa P. Hacker is unimpressed. She thinks it would be much more +useful to be able to ask for her meetings by specifying her name. So +she designs a rule that says that a person's meetings include all whole-company meetings plus all meetings of that person's division. +Fill in the body of Alyssa's rule. +

                                                                                    (rule (meeting-time ?person ?day-and-time)
                                                                                    +      <rule-body>)
                                                                                    +

                                                                                    + +c. Alyssa arrives at work on Wednesday morning and wonders what meetings she +has to attend that day. Having defined the above rule, +what query should she make to find this out? +

                                                                                    + +

                                                                                    +Exercise 4.60.  By giving the query +

                                                                                    (lives-near ?person (Hacker Alyssa P))
                                                                                    +

                                                                                    +Alyssa P. Hacker is able to find people who live near her, with whom +she can ride to work. On the other hand, when she tries to find all +pairs of people who live near each other by querying

                                                                                    + +

                                                                                    (lives-near ?person-1 ?person-2)
                                                                                    +

                                                                                    +she notices that each pair of people who live near each other is +listed twice; for example,

                                                                                    + +

                                                                                    (lives-near (Hacker Alyssa P) (Fect Cy D))
                                                                                    +(lives-near (Fect Cy D) (Hacker Alyssa P))
                                                                                    +

                                                                                    +Why does this happen? +Is there a way to find a list of people who live near each other, in +which each pair appears only once? Explain. +

                                                                                    + + +

                                                                                    Logic as programs

                                                                                    + + +We can regard a rule as a kind of logical implication: If an +assignment of values to pattern variables satisfies the body, then it satisfies the conclusion. Consequently, we can regard the +query language as having the ability to perform logical +deductions based upon the rules. As an example, consider the append operation described at the beginning of +section 4.4. As we said, append can be +characterized by the following two rules:

                                                                                    + +

                                                                                      +
                                                                                    • For any list y, the empty list and y append to form y.

                                                                                      + +

                                                                                    • For any u, v, y, and z, + (cons u v) and y append to form (cons u z) +if v and y append to form z. +

                                                                                    + + +To express this in our query language, we define two rules for a +relation +

                                                                                    (append-to-form x y z)
                                                                                    +

                                                                                    +which we can interpret to mean ``x and y append to +form z'':

                                                                                    + +

                                                                                    (rule (append-to-form () ?y ?y))
                                                                                    +(rule (append-to-form (?u . ?v) ?y (?u . ?z))
                                                                                    +      (append-to-form ?v ?y ?z))
                                                                                    +

                                                                                    +The first rule has no body, which means that the conclusion holds for +any value of ?y. Note how the second rule makes use of +dotted-tail notation to name the car and cdr of a list.

                                                                                    + +Given these two rules, we can formulate queries that compute the append of two lists: + +

                                                                                    ;;; Query input:
                                                                                    +(append-to-form (a b) (c d) ?z)
                                                                                    +;;; Query results:
                                                                                    +(append-to-form (a b) (c d) (a b c d))
                                                                                    +

                                                                                    +What is more striking, we can use the same rules to ask the question +``Which list, when appended to (a b), yields (a b c d)?'' +This is done as follows: + +

                                                                                    ;;; Query input:
                                                                                    +(append-to-form (a b) ?y (a b c d))
                                                                                    +;;; Query results:
                                                                                    +(append-to-form (a b) (c d) (a b c d))
                                                                                    +

                                                                                    +We can also ask for all pairs of lists that append to form (a b c d): + +

                                                                                    ;;; Query input:
                                                                                    +(append-to-form ?x ?y (a b c d))
                                                                                    +;;; Query results:
                                                                                    +(append-to-form () (a b c d) (a b c d))
                                                                                    +(append-to-form (a) (b c d) (a b c d))
                                                                                    +(append-to-form (a b) (c d) (a b c d))
                                                                                    +(append-to-form (a b c) (d) (a b c d))
                                                                                    +(append-to-form (a b c d) () (a b c d))
                                                                                    +

                                                                                    + + +The query system may seem to exhibit quite a bit of intelligence in +using the rules to deduce the answers to the queries above. Actually, +as we will see in the next section, the system is following a +well-determined algorithm in unraveling the rules. Unfortunately, +although the system works impressively in the append case, the +general methods may break down in more complex cases, as we will see +in section 4.4.3.

                                                                                    + +

                                                                                    +Exercise 4.61.  The following rules implement a next-to relation that finds +adjacent elements of a list: + +

                                                                                    (rule (?x next-to ?y in (?x ?y . ?u)))
                                                                                    +
                                                                                    +(rule (?x next-to ?y in (?v . ?z))
                                                                                    +      (?x next-to ?y in ?z))
                                                                                    +

                                                                                    +What will the response be to the following queries? + +

                                                                                    (?x next-to ?y in (1 (2 3) 4))
                                                                                    +
                                                                                    +(?x next-to 1 in (2 1 3 1))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.62.  Define rules to implement the last-pair operation of +exercise 2.17, which returns a list containing the last +element of a nonempty list. Check your rules on queries such as +(last-pair (3) ?x), (last-pair (1 2 3) ?x), and (last-pair (2 ?x) (3)). +Do your rules work correctly on queries such as (last-pair ?x (3)) ? +

                                                                                    + +

                                                                                    +Exercise 4.63.  The following data base (see Genesis 4) traces the genealogy of the +descendants of Ada back to Adam, by way of Cain:

                                                                                    + +

                                                                                    (son Adam Cain)
                                                                                    +(son Cain Enoch)
                                                                                    +(son Enoch Irad)
                                                                                    +(son Irad Mehujael)
                                                                                    +(son Mehujael Methushael)
                                                                                    +(son Methushael Lamech)
                                                                                    +(wife Lamech Ada)
                                                                                    +(son Ada Jabal)
                                                                                    +(son Ada Jubal)
                                                                                    +

                                                                                    +Formulate rules such as ``If S is the son of F, and F is the son of G, then S is the grandson of G'' +and ``If W is the wife of M, and S is the son of +W, then S is the son of M'' (which was supposedly +more true in biblical times than today) that will enable the query +system to find the grandson of Cain; the sons of Lamech; the grandsons +of Methushael. +(See exercise 4.69 for some rules to +deduce more complicated relationships.) + +

                                                                                    + + +

                                                                                    4.4.2  How the Query System Works

                                                                                    + + + +In section 4.4.4 we will present an +implementation of the query interpreter as a collection of procedures. +In this section we give an overview that explains the general +structure of the system independent of low-level implementation +details. After describing the implementation of the interpreter, we +will be in a position to understand some of its limitations and some +of the subtle ways in which the query language's logical operations +differ from the operations of mathematical logic.

                                                                                    + +It should be apparent that the query evaluator must perform some kind +of search in order to match queries against facts and rules in the +data base. One way to do this would be to implement the query system +as a nondeterministic program, using the amb evaluator of +section 4.3 (see +exercise 4.78). Another possibility is to manage +the search with the aid of streams. Our implementation follows this +second approach.

                                                                                    + +The query system is organized around two central operations called +pattern matching and unification. We first describe +pattern matching and explain how this operation, together with the +organization of information in terms of streams of frames, enables us +to implement both simple and compound queries. We next discuss +unification, a generalization of pattern matching needed to implement +rules. Finally, we show how the entire query interpreter fits +together through a procedure that classifies expressions in a manner +analogous to the way eval classifies expressions for the +interpreter described in section 4.1.

                                                                                    + + +

                                                                                    Pattern matching

                                                                                    + + +A pattern matcher is a program that tests whether some datum +fits a specified pattern. For example, the data list ((a b) c (a +b)) matches the pattern (?x c ?x) with the pattern variable +?x bound to (a b). The same data list matches the pattern +(?x ?y ?z) with ?x and ?z both bound to (a b) +and ?y bound to c. It also matches the pattern ((?x ?y) c (?x ?y)) with ?x bound to a and ?y bound +to b. However, it does not match the pattern (?x a ?y), +since that pattern specifies a list whose second element is the symbol +a.

                                                                                    + +The pattern matcher used by the query system takes as inputs a +pattern, a datum, and a frame that specifies bindings for +various pattern variables. It checks whether the datum matches the +pattern in a way that is consistent with the bindings already in the +frame. If so, it returns the given frame augmented by any bindings +that may have been determined by the match. Otherwise, it indicates +that the match has failed.

                                                                                    + +For example, using the pattern (?x ?y ?x) to match (a b a) +given an empty frame will return a frame specifying that ?x is +bound to a and ?y is bound to b. Trying the match +with the same pattern, the same datum, and a frame specifying that +?y is bound to a will fail. Trying the match with the +same pattern, the same datum, and a frame in which ?y is bound +to b and ?x is unbound will return the given frame +augmented by a binding of ?x to a.

                                                                                    + +The pattern matcher is all the mechanism that is needed to process +simple queries that don't involve rules. For instance, to process the +query

                                                                                    + +

                                                                                    (job ?x (computer programmer))
                                                                                    +

                                                                                    +we scan through all assertions in the data base and select those that +match the pattern with respect to an initially empty frame. For each +match we find, we use the frame returned by the match to instantiate +the pattern with a value for ?x. + + +

                                                                                    Streams of frames

                                                                                    + + +The testing of patterns against frames is organized through the use of +streams. Given a single frame, the matching process runs through the +data-base entries one by one. For each data-base entry, the matcher +generates either a special symbol indicating that the match has failed +or an extension to the frame. The results for all the data-base +entries are collected into a stream, which is passed through a filter +to weed out the failures. The result is a stream of all the frames +that extend the given frame via a match to some assertion in the data +base.67

                                                                                    + +In our system, a query takes an input stream of frames and performs +the above matching operation for every frame in the stream, as +indicated in figure 4.4. That is, for each frame in +the input stream, the query generates a new stream consisting of all +extensions to that frame by matches to assertions in the data base. +All these streams are then combined to form one huge stream, which +contains all possible extensions of every frame in the input stream. +This stream is the output of the query.

                                                                                    + +

                                                                                    +
                                                                                    Figure 4.4:  A query processes a stream of frames.
                                                                                    + +

                                                                                    + +To answer a simple query, we use the query with an input stream +consisting of a single empty frame. The resulting output stream +contains all extensions to the empty frame (that is, all answers to +our query). This stream of frames is then used to generate a stream +of copies of the original query pattern with the variables +instantiated by the values in each frame, and this is the stream that +is finally printed.

                                                                                    + + +

                                                                                    Compound queries

                                                                                    + + +The real elegance of the stream-of-frames implementation is evident +when we deal with compound queries. The processing of compound +queries makes use of the ability of our matcher to demand that a match +be consistent with a specified frame. For example, to handle the and of two queries, such as

                                                                                    + +

                                                                                    (and (can-do-job ?x (computer programmer trainee))
                                                                                    +     (job ?person ?x))
                                                                                    +

                                                                                    +(informally, ``Find all people who can do the job of a computer +programmer trainee''), we first find all entries that match the +pattern

                                                                                    + +

                                                                                    (can-do-job ?x (computer programmer trainee))
                                                                                    +

                                                                                    +This produces a stream of frames, each of which contains a binding for +?x. Then for each frame in the stream we find all entries that +match

                                                                                    + +

                                                                                    (job ?person ?x)
                                                                                    +

                                                                                    +in a way that is consistent with the given binding for ?x. Each +such match will produce a frame containing bindings for ?x and +?person. The and of two queries can be viewed as a series +combination of the two component queries, as shown in +figure 4.5. The frames that pass through the first +query filter are filtered and further extended by the second query.

                                                                                    + +

                                                                                    +
                                                                                    Figure 4.5:  The and combination of two queries is +produced by operating on the stream of frames in series.
                                                                                    + +

                                                                                    + +Figure 4.6 shows the analogous method for computing the +or of two queries as a parallel combination of the two component +queries. The input stream of frames is extended separately by each +query. The two resulting streams are then merged to produce the final +output stream.

                                                                                    + +

                                                                                    +
                                                                                    Figure 4.6:  The or combination of two queries is produced by +operating on the stream of frames in parallel and merging the +results.
                                                                                    + +

                                                                                    + +Even from this high-level description, it is apparent that the +processing of compound queries can be slow. +For example, since a query may produce more than one output frame for +each input frame, and each query in an and gets its input frames +from the previous query, an and query could, in the worst case, +have to perform a number of matches that is exponential in the number +of queries (see exercise 4.76).68 +Though systems for handling only simple queries are quite practical, +dealing with complex queries is extremely difficult.69

                                                                                    + +From the stream-of-frames viewpoint, the not of some query acts +as a filter that removes all frames for which the query can be +satisfied. For instance, given the pattern

                                                                                    + +

                                                                                    (not (job ?x (computer programmer)))
                                                                                    +

                                                                                    +we attempt, for each frame in the input stream, to produce extension +frames that satisfy (job ?x (computer programmer)). We remove +from the input stream all frames for which such extensions exist. The +result is a stream consisting of only those frames in which the +binding for ?x does not satisfy (job ?x (computer +programmer)). For example, in processing the query

                                                                                    + +

                                                                                    (and (supervisor ?x ?y)
                                                                                    +     (not (job ?x (computer programmer))))
                                                                                    +

                                                                                    +the first clause will generate frames with bindings for ?x and +?y. The not clause will then filter +these by removing all frames in which the binding for ?x +satisfies the restriction that ?x is a computer +programmer.70

                                                                                    + +The lisp-value special form is implemented as a similar filter +on frame streams. We use each frame in the stream to instantiate any +variables in the pattern, then apply the Lisp predicate. We remove +from the input stream all frames for which the predicate fails. + + +

                                                                                    Unification

                                                                                    + + +In order to handle rules in the query language, we must be able to +find the rules whose conclusions match a given query pattern. Rule +conclusions are like assertions except that they can contain +variables, so we will need a generalization of pattern +matching -- called unification -- in which both the ``pattern'' +and the ``datum'' may contain variables.

                                                                                    + +A unifier takes two patterns, each containing constants and variables, +and determines whether it is possible to assign values to the +variables that will make the two patterns equal. If so, it returns a +frame containing these bindings. For example, unifying (?x a +?y) and (?y ?z a) will specify a frame in which ?x, +?y, and ?z must all be bound to a. On the other +hand, unifying (?x ?y a) and (?x b ?y) will fail, because +there is no value for ?y that can make the two patterns equal. +(For the second elements of the patterns to be equal, ?y would +have to be b; however, for the third elements to be equal, ?y would have to be a.) The unifier used in the query system, +like the pattern matcher, takes a frame as input and performs +unifications that are consistent with this frame.

                                                                                    + +The unification algorithm is the most technically difficult part of +the query system. With complex patterns, performing unification may +seem to require deduction. To unify (?x ?x) and ((a ?y c) +(a b ?z)), for example, the algorithm must infer that ?x should +be (a b c), ?y should be b, and ?z should +be c. We may think of this process as solving a set of +equations among the pattern components. In general, these are +simultaneous equations, which may require substantial manipulation to +solve.71 For example, unifying (?x +?x) and ((a ?y c) (a b ?z)) may be thought of as specifying the +simultaneous equations

                                                                                    + +

                                                                                    ?x  =  (a ?y c)
                                                                                    +?x  =  (a b ?z)
                                                                                    +

                                                                                    +These equations imply that

                                                                                    + +

                                                                                    (a ?y c)  =  (a b ?z)
                                                                                    +

                                                                                    +which in turn implies that

                                                                                    + +

                                                                                    a  =  a, ?y  =  b, c  =  ?z,
                                                                                    +

                                                                                    +and hence that

                                                                                    + +

                                                                                    ?x  =  (a b c)
                                                                                    +

                                                                                    + +In a successful pattern match, all pattern variables become bound, and +the values to which they are bound contain only constants. This is +also true of all the examples of unification we have seen so far. In +general, however, a successful unification may not completely +determine the variable values; some variables may remain unbound and +others may be bound to values that contain variables.

                                                                                    + +Consider the unification of (?x a) and ((b ?y) ?z). We +can deduce that ?x = (b ?y) and a = ?z, but we cannot +further solve for ?x or ?y. The unification doesn't fail, +since it is certainly possible to make the two patterns equal by +assigning values to ?x and ?y. Since this match in no way +restricts the values ?y can take on, no binding for ?y is +put into the result frame. The match does, however, restrict the +value of ?x. Whatever value ?y has, ?x must be (b ?y). A binding of ?x to the pattern (b ?y) is thus +put into the frame. If a value for ?y is later determined and +added to the frame (by a pattern match or unification that is required +to be consistent with this frame), the previously bound ?x will +refer to this value.72 + + +

                                                                                    Applying rules

                                                                                    + + +Unification is the key to the component of the query system that makes +inferences from rules. To see how this is accomplished, consider +processing a query that involves applying a rule, such as

                                                                                    + +

                                                                                    (lives-near ?x (Hacker Alyssa P))
                                                                                    +

                                                                                    +To process this query, we first use the ordinary pattern-match +procedure described above to see if there are any assertions in the +data base that match this pattern. (There will not be any in this +case, since our data base includes no direct assertions about who +lives near whom.) The next step is to attempt to unify the query +pattern with the conclusion of each rule. We find that the pattern +unifies with the conclusion of the rule

                                                                                    + +

                                                                                    (rule (lives-near ?person-1 ?person-2)
                                                                                    +      (and (address ?person-1 (?town . ?rest-1))
                                                                                    +           (address ?person-2 (?town . ?rest-2))
                                                                                    +           (not (same ?person-1 ?person-2))))
                                                                                    +

                                                                                    +resulting in a frame specifying that ?person-2 is bound +to (Hacker Alyssa P) and that ?x should be bound to (have +the same value as) ?person-1. Now, relative to this frame, we +evaluate the compound query given by the body of the rule. Successful +matches will extend this frame by providing a binding for ?person-1, and consequently a value for ?x, which we can use to +instantiate the original query pattern.

                                                                                    + +In general, the query evaluator uses the following method to apply a +rule when trying to establish a query pattern in a frame that +specifies bindings for some of the pattern variables:

                                                                                    + +

                                                                                      +
                                                                                    • Unify the query with the conclusion of the rule to form, if +successful, an extension of the original frame.

                                                                                      + +

                                                                                    • Relative to the extended frame, evaluate the query formed by +the body of the rule. +

                                                                                    + +Notice how similar this is to the method for applying a procedure in +the eval/apply evaluator for Lisp: +

                                                                                      + +

                                                                                    • Bind the procedure's parameters to its arguments to form a +frame that extends the original procedure environment.

                                                                                      + +

                                                                                    • Relative to the extended environment, evaluate the expression +formed by the body of the procedure. +

                                                                                    + +The similarity between the two evaluators should come as no surprise. +Just as procedure definitions are the means of abstraction in Lisp, +rule definitions are the means of abstraction in the query language. +In each case, we unwind the abstraction by creating appropriate +bindings and evaluating the rule or procedure body relative to these. +

                                                                                    + + +

                                                                                    Simple queries

                                                                                    + + +We saw earlier in this section how to evaluate simple queries in the +absence of rules. Now that we have seen how to apply rules, we can +describe how to evaluate simple queries by using both rules and +assertions.

                                                                                    + +Given the query pattern and a stream of frames, we produce, for each +frame in the input stream, two streams:

                                                                                    + +

                                                                                      +
                                                                                    • a stream of extended frames obtained by matching the pattern +against all assertions in the data base (using the pattern matcher), +and

                                                                                      + +

                                                                                    • a stream of extended frames obtained by applying all +possible rules (using the unifier).73 +

                                                                                    + +Appending these two streams produces a stream that consists of all the +ways that the given pattern can be satisfied consistent with the +original frame. These streams (one for each frame in the input +stream) are now all combined to form one large stream, which therefore +consists of all the ways that any of the frames in the original input +stream can be extended to produce a match with the given pattern. + + +

                                                                                    The query evaluator and the driver loop

                                                                                    + + +Despite the complexity of the underlying matching operations, the +system is organized much like an evaluator for any language. The +procedure that coordinates the matching operations is called qeval, and it plays a role analogous to that of the eval +procedure for Lisp. Qeval takes as inputs a query and a stream +of frames. Its output is a stream of frames, corresponding to +successful matches to the query pattern, that extend some frame in the +input stream, as indicated in figure 4.4. Like +eval, qeval classifies the different types of expressions +(queries) and dispatches to an appropriate procedure for each. There +is a procedure for each special form (and, or, not, +and lisp-value) and one for simple queries.

                                                                                    + +The driver loop, which is analogous to the driver-loop procedure +for the other evaluators in this chapter, reads queries from the +terminal. For each query, it calls qeval with the query and a +stream that consists of a single empty frame. This will produce the +stream of all possible matches (all possible extensions to the empty +frame). For each frame in the resulting stream, it instantiates the +original query using the values of the variables found in the frame. +This stream of instantiated queries is then printed.74

                                                                                    + +The driver also checks for the special command assert!, which +signals that the input is not a query but rather an assertion or rule +to be added to the data base. For instance,

                                                                                    + +

                                                                                    (assert! (job (Bitdiddle Ben) (computer wizard)))
                                                                                    +(assert! (rule (wheel ?person)
                                                                                    +               (and (supervisor ?middle-manager ?person)
                                                                                    +                    (supervisor ?x ?middle-manager))))
                                                                                    +

                                                                                    + + +

                                                                                    4.4.3  Is Logic Programming Mathematical Logic?

                                                                                    + + + +The means of combination used in the query language may at first seem +identical to the operations and, or, and not of +mathematical logic, and the application of query-language rules is in +fact accomplished through a legitimate method of +inference.75 This identification of the query language with mathematical +logic is not really valid, though, because the query language provides +a control structure that interprets the logical statements +procedurally. We can often take advantage of this control structure. +For example, to find all of the supervisors of programmers we could +formulate a query in either of two logically equivalent forms:

                                                                                    + + +

                                                                                    (and (job ?x (computer programmer))
                                                                                    +     (supervisor ?x ?y))
                                                                                    +

                                                                                    +or +

                                                                                    (and (supervisor ?x ?y)
                                                                                    +     (job ?x (computer programmer)))
                                                                                    +

                                                                                    +If a company has many more supervisors than programmers (the usual +case), it is better to use the first form rather than the second +because the data base must be scanned for each intermediate result +(frame) produced by the first clause of the and.

                                                                                    + +The aim of logic programming is to provide the programmer with +techniques for decomposing a computational problem into two separate +problems: ``what'' is to be computed, and ``how'' this should be +computed. This is accomplished by selecting a subset of the +statements of mathematical logic that is powerful enough to be able to +describe anything one might want to compute, yet weak enough to have a +controllable procedural interpretation. The intention here is that, +on the one hand, a program specified in a logic programming language +should be an effective program that can be carried out by a computer. +Control (``how'' to compute) is effected by using the order of +evaluation of the language. We should be able to arrange the order of +clauses and the order of subgoals within each clause so that the +computation is done in an order deemed to be effective and efficient. +At the same time, we should be able to view the result of the +computation (``what'' to compute) as a simple consequence of the laws +of logic.

                                                                                    + +Our query language can be regarded as just such a procedurally +interpretable subset of mathematical logic. An assertion represents a +simple fact (an atomic proposition). A rule represents the +implication that the rule conclusion holds for those cases where the +rule body holds. A rule has a natural procedural interpretation: To +establish the conclusion of the rule, establish the body of the rule. +Rules, therefore, specify computations. However, because rules can +also be regarded as statements of mathematical logic, we can justify +any ``inference'' accomplished by a logic program by asserting that +the same result could be obtained by working entirely within +mathematical logic.76

                                                                                    + + +

                                                                                    Infinite loops

                                                                                    + + +A consequence of the procedural interpretation of logic programs is +that it is possible to construct hopelessly inefficient programs for +solving certain problems. An extreme case of inefficiency occurs when +the system falls into infinite loops in making deductions. As a +simple example, suppose we are setting up a data base of famous +marriages, including

                                                                                    + +

                                                                                    (assert! (married Minnie Mickey))
                                                                                    +

                                                                                    +If we now ask

                                                                                    + +

                                                                                    (married Mickey ?who)
                                                                                    +

                                                                                    +we will get no response, because the system doesn't know that if A +is married to B, then B is married to A. So we assert the rule

                                                                                    + +

                                                                                    (assert! (rule (married ?x ?y)
                                                                                    +               (married ?y ?x)))
                                                                                    +

                                                                                    +and again query

                                                                                    + +

                                                                                    (married Mickey ?who)
                                                                                    +

                                                                                    + +Unfortunately, this will drive the system into an infinite loop, as +follows:

                                                                                    + +

                                                                                      +
                                                                                    • The system finds that the married rule is applicable; +that is, the rule conclusion (married ?x ?y) successfully +unifies with the query pattern (married Mickey ?who) to produce +a frame in which ?x is bound to Mickey and ?y is +bound to ?who. So the interpreter proceeds to evaluate the rule +body (married ?y ?x) in this frame -- in effect, to process the +query (married ?who Mickey).

                                                                                      + +

                                                                                    • One answer appears directly as an assertion in the data +base: (married Minnie Mickey).

                                                                                      + +

                                                                                    • The married rule is also applicable, so the +interpreter again evaluates the rule body, which this time is +equivalent to (married Mickey ?who). +

                                                                                    + +The system is now in an infinite loop. Indeed, whether the system +will find the simple answer (married Minnie Mickey) before it +goes into the loop depends on implementation details concerning the +order in which the system checks the items in the data base. This is +a very simple example of the kinds of loops that can occur. +Collections of interrelated rules can lead to loops that are much +harder to anticipate, and the appearance of a loop can depend on the order +of clauses in an and (see exercise 4.64) +or on low-level details concerning the order in which the system +processes queries.77 + + +

                                                                                    Problems with not

                                                                                    + + +Another quirk in the query system concerns not. Given the data +base of section 4.4.1, consider the +following two queries:

                                                                                    + +

                                                                                    (and (supervisor ?x ?y)
                                                                                    +     (not (job ?x (computer programmer))))
                                                                                    +(and (not (job ?x (computer programmer)))
                                                                                    +     (supervisor ?x ?y))
                                                                                    +

                                                                                    +These two queries do not produce the same result. The first query +begins by finding all entries in the data base that match (supervisor ?x ?y), and then filters the resulting frames by removing +the ones in which the value of ?x satisfies (job ?x +(computer programmer)). The second query begins by filtering the +incoming frames to remove those that can satisfy (job ?x +(computer programmer)). Since the only incoming frame is empty, it +checks the data base to see if there are any patterns that satisfy +(job ?x (computer programmer)). Since there generally are +entries of this form, the not clause filters out the empty frame +and returns an empty stream of frames. Consequently, the entire +compound query returns an empty stream.

                                                                                    + +The trouble is that our implementation of not really is meant to +serve as a filter on values for the variables. If a not clause +is processed with a frame in which some of the variables remain +unbound (as does ?x in the example above), the system will +produce unexpected results. Similar problems occur with the use of +lisp-value -- the Lisp predicate can't work if some of its +arguments are unbound. See exercise 4.77.

                                                                                    + +There is also a much more serious way in which the not of the +query language differs from the not of mathematical logic. In +logic, we interpret the statement ``not P'' to mean that P is not +true. In the query system, however, ``not P'' means that P is not +deducible from the knowledge in the data base. For example, given the +personnel data base of section 4.4.1, the +system would happily deduce all sorts of not statements, such as +that Ben Bitdiddle is not a baseball fan, that it is not raining +outside, and that 2 + 2 is not 4.78 In other words, the not +of logic programming languages reflects the so-called closed +world assumption that all relevant information has been included in +the data base.79 + +

                                                                                    +Exercise 4.64.  Louis Reasoner mistakenly deletes the outranked-by rule +(section 4.4.1) from the data base. When +he realizes this, he quickly reinstalls it. Unfortunately, he makes a +slight change in the rule, and types it in as

                                                                                    + +

                                                                                    (rule (outranked-by ?staff-person ?boss)
                                                                                    +      (or (supervisor ?staff-person ?boss)
                                                                                    +          (and (outranked-by ?middle-manager ?boss)
                                                                                    +               (supervisor ?staff-person ?middle-manager))))
                                                                                    +

                                                                                    +Just after Louis types this information into the system, DeWitt +Aull comes by to find out who outranks Ben Bitdiddle. He issues +the query

                                                                                    + +

                                                                                    (outranked-by (Bitdiddle Ben) ?who)
                                                                                    +

                                                                                    +After answering, the system goes into an infinite loop. Explain why. + +

                                                                                    + +

                                                                                    +Exercise 4.65.  Cy D. Fect, looking forward to the day when he will rise in the +organization, gives a query to find all the wheels +(using the wheel rule of section 4.4.1):

                                                                                    + +

                                                                                    (wheel ?who)
                                                                                    +

                                                                                    +To his surprise, the system responds

                                                                                    + +

                                                                                    ;;; Query results:
                                                                                    +(wheel (Warbucks Oliver))
                                                                                    +(wheel (Bitdiddle Ben))
                                                                                    +(wheel (Warbucks Oliver))
                                                                                    +(wheel (Warbucks Oliver))
                                                                                    +(wheel (Warbucks Oliver))
                                                                                    +

                                                                                    +Why is Oliver Warbucks listed four times? + +

                                                                                    + +

                                                                                    +Exercise 4.66.  Ben has been generalizing the query system to provide statistics +about the company. For example, to find the total salaries of all the +computer programmers one will be able to say

                                                                                    + +

                                                                                    (sum ?amount
                                                                                    +     (and (job ?x (computer programmer))
                                                                                    +          (salary ?x ?amount)))
                                                                                    +

                                                                                    +In general, Ben's new system allows expressions of the form

                                                                                    + +

                                                                                    (accumulation-function <variable>
                                                                                    +                       <query pattern>)
                                                                                    +

                                                                                    +where accumulation-function can be things like sum, +average, or maximum. Ben reasons that it should be a +cinch to implement this. He will simply feed the query pattern to +qeval. This will produce a stream of frames. He will then pass +this stream through a mapping function that extracts the value of the +designated variable from each frame in the stream and feed the +resulting stream of values to the accumulation function. Just as Ben +completes the implementation and is about to try it out, Cy walks by, +still puzzling over the wheel query result in +exercise 4.65. When Cy shows Ben the system's +response, Ben groans, ``Oh, no, my simple accumulation scheme won't +work!''

                                                                                    + +What has Ben just realized? Outline a method he can use to +salvage the situation. +

                                                                                    + +

                                                                                    +Exercise 4.67.  Devise a way to install a loop detector in the query system so as to +avoid the kinds of simple loops illustrated in the text and in +exercise 4.64. The general idea is that the +system should maintain some sort of history of its current chain of +deductions and should not begin processing a query that it is already +working on. Describe what kind of information (patterns and frames) +is included in this history, and how the check should be made. (After +you study the details of the query-system implementation in +section 4.4.4, you may want to +modify the system to include your loop detector.) + +

                                                                                    + +

                                                                                    +Exercise 4.68.  Define rules to implement the reverse operation of +exercise 2.18, which returns a list containing the same +elements as a given list in reverse order. (Hint: Use append-to-form.) +Can your rules answer both +(reverse (1 2 3) ?x) and (reverse ?x (1 2 3)) ? +

                                                                                    + +

                                                                                    +Exercise 4.69.  Beginning with the data base and the rules you formulated in +exercise 4.63, devise a rule for adding ``greats'' to +a grandson relationship. This should enable the system to deduce that +Irad is the great-grandson of Adam, or that Jabal and Jubal are +the great-great-great-great-great-grandsons of Adam. (Hint: Represent +the fact about Irad, for example, as ((great grandson) Adam +Irad). Write rules that determine if a list ends in the word +grandson. Use this to express a rule that allows one to derive +the relationship ((great . ?rel) ?x ?y), where ?rel is a +list ending in grandson.) +Check your rules on queries such as +((great grandson) ?g ?ggs) and (?relationship Adam Irad). + +

                                                                                    + + +

                                                                                    4.4.4  Implementing the Query System

                                                                                    + +

                                                                                    + +Section 4.4.2 described how the query system +works. Now we fill in the details by presenting a complete +implementation of the system.

                                                                                    + + +

                                                                                    4.4.4.1  The Driver Loop and Instantiation

                                                                                    + +

                                                                                    + +The driver loop for the query system repeatedly reads input +expressions. If the expression is a rule or assertion to be added to +the data base, then the information is added. Otherwise the +expression is assumed to be a query. The driver passes this query to +the evaluator qeval together with an initial frame stream +consisting of a single empty frame. The result of the evaluation is a +stream of frames generated by satisfying the query with variable +values found in the data base. These frames are used to form a new +stream consisting of copies of the original query in which the +variables are instantiated with values supplied by the stream of +frames, and this final stream is printed at the terminal:

                                                                                    + +

                                                                                    (define input-prompt ";;; Query input:")
                                                                                    +(define output-prompt ";;; Query results:")
                                                                                    +(define (query-driver-loop)
                                                                                    +  (prompt-for-input input-prompt)
                                                                                    +  (let ((q (query-syntax-process (read))))
                                                                                    +    (cond ((assertion-to-be-added? q)
                                                                                    +           (add-rule-or-assertion! (add-assertion-body q))
                                                                                    +           (newline)
                                                                                    +           (display "Assertion added to data base.")
                                                                                    +           (query-driver-loop))
                                                                                    +          (else
                                                                                    +           (newline)
                                                                                    +           (display output-prompt)
                                                                                    +           (display-stream
                                                                                    +            (stream-map
                                                                                    +             (lambda (frame)
                                                                                    +               (instantiate q
                                                                                    +                            frame
                                                                                    +                            (lambda (v f)
                                                                                    +                              (contract-question-mark v))))
                                                                                    +             (qeval q (singleton-stream '()))))
                                                                                    +           (query-driver-loop)))))
                                                                                    +

                                                                                    +Here, as in the other evaluators in this chapter, we use an abstract +syntax for the expressions of the query language. +The implementation of the expression syntax, including the predicate +assertion-to-be-added? and the selector add-assertion-body, +is given in section 4.4.4.7. +Add-rule-or-assertion! is defined in section 4.4.4.5.

                                                                                    + +Before doing any processing on an input expression, the driver loop +transforms it syntactically into a form that makes the processing more +efficient. This involves changing the representation of pattern +variables. When the query is instantiated, any variables that remain +unbound are transformed back to the input representation before being +printed. These transformations are performed by the two procedures +query-syntax-process and contract-question-mark +(section  4.4.4.7).

                                                                                    + +To instantiate an expression, we copy it, replacing any variables in +the expression by their values in a given frame. The values are +themselves instantiated, since they could contain variables (for +example, if ?x in exp is bound to ?y as the result +of unification and ?y is in turn bound to 5). The action to +take if a variable cannot be instantiated is given by a procedural +argument to instantiate.

                                                                                    + +

                                                                                    (define (instantiate exp frame unbound-var-handler)
                                                                                    +  (define (copy exp)
                                                                                    +    (cond ((var? exp)
                                                                                    +           (let ((binding (binding-in-frame exp frame)))
                                                                                    +             (if binding
                                                                                    +                 (copy (binding-value binding))
                                                                                    +                 (unbound-var-handler exp frame))))
                                                                                    +          ((pair? exp)
                                                                                    +           (cons (copy (car exp)) (copy (cdr exp))))
                                                                                    +          (else exp)))
                                                                                    +  (copy exp))
                                                                                    +

                                                                                    +The procedures that manipulate bindings are defined in +section 4.4.4.8. +

                                                                                    + + +

                                                                                    4.4.4.2  The Evaluator

                                                                                    + +

                                                                                    + +The qeval procedure, called by the query-driver-loop, is +the basic evaluator of the query system. It takes as inputs a query +and a stream of frames, and it returns a stream of extended frames. +It identifies special forms by a data-directed dispatch using get and put, just as we did in implementing generic operations +in chapter 2. Any query that is not identified as a special form is +assumed to be a simple query, to be processed by simple-query.

                                                                                    + +

                                                                                    (define (qeval query frame-stream)
                                                                                    +  (let ((qproc (get (type query) 'qeval)))
                                                                                    +    (if qproc
                                                                                    +        (qproc (contents query) frame-stream)
                                                                                    +        (simple-query query frame-stream))))
                                                                                    +

                                                                                    +Type and contents, defined in section 4.4.4.7, +implement the abstract syntax of the special forms.

                                                                                    + + +

                                                                                    Simple queries

                                                                                    + + +The simple-query procedure handles simple queries. It takes as +arguments a simple query (a pattern) together with a stream of frames, +and it returns the stream formed by extending each frame by all +data-base matches of the query.

                                                                                    + +

                                                                                    (define (simple-query query-pattern frame-stream)
                                                                                    +  (stream-flatmap
                                                                                    +   (lambda (frame)
                                                                                    +     (stream-append-delayed
                                                                                    +      (find-assertions query-pattern frame)
                                                                                    +      (delay (apply-rules query-pattern frame))))
                                                                                    +   frame-stream))
                                                                                    +

                                                                                    + +For each frame in the input stream, we use find-assertions +(section 4.4.4.3) to match the pattern against all +assertions in the data base, producing a stream of extended frames, +and we use apply-rules (section 4.4.4.4) to apply +all possible rules, producing another stream of extended frames. +These two streams are combined (using stream-append-delayed, +section 4.4.4.6) to make a stream of all the ways that +the given pattern can be satisfied consistent with the original frame +(see exercise 4.71). The streams for the +individual input frames are combined using stream-flatmap +(section 4.4.4.6) to form one large stream of all the +ways that any of the frames in the original input stream can be +extended to produce a match with the given pattern. + + +

                                                                                    Compound queries

                                                                                    + + +And queries are handled as illustrated in +figure 4.5 by the conjoin procedure. Conjoin takes as inputs the conjuncts and the frame stream and +returns the stream of extended frames. First, conjoin processes +the stream of frames to find the stream of all possible frame extensions +that satisfy the first query in the conjunction. Then, using this as the new +frame stream, it recursively applies conjoin to the rest of the +queries.

                                                                                    + + +

                                                                                    (define (conjoin conjuncts frame-stream)
                                                                                    +  (if (empty-conjunction? conjuncts)
                                                                                    +      frame-stream
                                                                                    +      (conjoin (rest-conjuncts conjuncts)
                                                                                    +               (qeval (first-conjunct conjuncts)
                                                                                    +                      frame-stream))))
                                                                                    +

                                                                                    +The expression + +

                                                                                    (put 'and 'qeval conjoin)
                                                                                    +

                                                                                    +sets up qeval to dispatch to conjoin when an and +form is encountered.

                                                                                    + + +Or queries are handled similarly, as shown in +figure 4.6. The output streams for the various +disjuncts of the or are computed separately and merged using the +interleave-delayed procedure from section 4.4.4.6. +(See exercises 4.71 and 4.72.)

                                                                                    + + +

                                                                                    (define (disjoin disjuncts frame-stream)
                                                                                    +  (if (empty-disjunction? disjuncts)
                                                                                    +      the-empty-stream
                                                                                    +      (interleave-delayed
                                                                                    +       (qeval (first-disjunct disjuncts) frame-stream)
                                                                                    +       (delay (disjoin (rest-disjuncts disjuncts)
                                                                                    +                       frame-stream)))))
                                                                                    +(put 'or 'qeval disjoin)
                                                                                    +

                                                                                    +The predicates and selectors for the syntax of conjuncts and disjuncts +are given in section 4.4.4.7.

                                                                                    + + +

                                                                                    Filters

                                                                                    + +Not is handled by the method outlined in +section 4.4.2. We attempt to extend each frame in +the input stream to satisfy the query being negated, and we include a +given frame in the output stream only if it cannot be extended.

                                                                                    + +

                                                                                    (define (negate operands frame-stream)
                                                                                    +  (stream-flatmap
                                                                                    +   (lambda (frame)
                                                                                    +     (if (stream-null? (qeval (negated-query operands)
                                                                                    +                              (singleton-stream frame)))
                                                                                    +         (singleton-stream frame)
                                                                                    +         the-empty-stream))
                                                                                    +   frame-stream))
                                                                                    +(put 'not 'qeval negate)
                                                                                    +

                                                                                    + +Lisp-value is a filter similar to not. Each frame in the +stream is used to instantiate the variables in the pattern, the +indicated predicate is applied, and the frames for which the predicate +returns false are filtered out of the input stream. An error results +if there are unbound pattern variables.

                                                                                    + +

                                                                                    (define (lisp-value call frame-stream)
                                                                                    +  (stream-flatmap
                                                                                    +   (lambda (frame)
                                                                                    +     (if (execute
                                                                                    +          (instantiate
                                                                                    +           call
                                                                                    +           frame
                                                                                    +           (lambda (v f)
                                                                                    +             (error "Unknown pat var -- LISP-VALUE" v))))
                                                                                    +         (singleton-stream frame)
                                                                                    +         the-empty-stream))
                                                                                    +   frame-stream))
                                                                                    +(put 'lisp-value 'qeval lisp-value)
                                                                                    +

                                                                                    + +Execute, which applies the predicate to the arguments, must eval the predicate expression to get the procedure to apply. +However, it must not evaluate the arguments, since they are already +the actual arguments, not expressions whose evaluation (in Lisp) will +produce the arguments. Note that execute is implemented using +eval and apply from the underlying Lisp system.

                                                                                    + +

                                                                                    (define (execute exp)
                                                                                    +  (apply (eval (predicate exp) user-initial-environment)
                                                                                    +         (args exp)))
                                                                                    +

                                                                                    + +The always-true special form provides for a query that is always +satisfied. It ignores its contents (normally empty) and simply passes +through all the frames in the input stream. Always-true is used +by the rule-body selector (section 4.4.4.7) +to provide bodies for rules that were +defined without bodies (that is, rules whose conclusions are always +satisfied).

                                                                                    + +

                                                                                    (define (always-true ignore frame-stream) frame-stream)
                                                                                    +(put 'always-true 'qeval always-true)
                                                                                    +

                                                                                    +The selectors that define the syntax of not and lisp-value +are given in section 4.4.4.7. +

                                                                                    + + +

                                                                                    4.4.4.3  Finding Assertions by Pattern Matching

                                                                                    + +

                                                                                    + +Find-assertions, called by simple-query +(section 4.4.4.2), takes as input a pattern and a frame. +It returns a stream of frames, each extending the given one by a +data-base match of the given pattern. It uses fetch-assertions +(section 4.4.4.5) to get a stream of all the assertions in +the data base that should be checked for a match against the pattern +and the frame. The reason for fetch-assertions here is that we +can often apply simple tests that will eliminate many of the entries +in the data base from the pool of candidates for a successful match. +The system would still work if we eliminated fetch-assertions +and simply checked a stream of all assertions in the data base, but +the computation would be less efficient because we would need to make +many more calls to the matcher.

                                                                                    + +

                                                                                    (define (find-assertions pattern frame)
                                                                                    +  (stream-flatmap (lambda (datum)
                                                                                    +                    (check-an-assertion datum pattern frame))
                                                                                    +                  (fetch-assertions pattern frame)))
                                                                                    +

                                                                                    + +Check-an-assertion takes as arguments a pattern, a data object +(assertion), and a frame and returns either a one-element stream +containing the extended frame or the-empty-stream if the match +fails.

                                                                                    + +

                                                                                    (define (check-an-assertion assertion query-pat query-frame)
                                                                                    +  (let ((match-result
                                                                                    +         (pattern-match query-pat assertion query-frame)))
                                                                                    +    (if (eq? match-result 'failed)
                                                                                    +        the-empty-stream
                                                                                    +        (singleton-stream match-result))))
                                                                                    +

                                                                                    +The basic pattern matcher returns either the symbol failed or an +extension of the given frame. The basic idea of the matcher is to +check the pattern against the data, element by element, accumulating +bindings for the pattern variables. If the pattern and the data +object are the same, the match succeeds and we return the frame of +bindings accumulated so far. Otherwise, if the pattern is a variable +we extend the current frame by binding the variable to the data, so +long as this is consistent with the bindings already in the frame. If +the pattern and the data are both pairs, we (recursively) match the +car of the pattern against the car of the data to produce +a frame; in this frame we then match the cdr of the pattern +against the cdr of the data. If none of these cases are +applicable, the match fails and we return the symbol failed.

                                                                                    + +

                                                                                    (define (pattern-match pat dat frame)
                                                                                    +  (cond ((eq? frame 'failed) 'failed)
                                                                                    +        ((equal? pat dat) frame)
                                                                                    +        ((var? pat) (extend-if-consistent pat dat frame))
                                                                                    +        ((and (pair? pat) (pair? dat))
                                                                                    +         (pattern-match (cdr pat)
                                                                                    +                        (cdr dat)
                                                                                    +                        (pattern-match (car pat)
                                                                                    +                                       (car dat)
                                                                                    +                                       frame)))
                                                                                    +        (else 'failed)))
                                                                                    +

                                                                                    + +Here is the procedure that extends a frame by adding a new binding, if +this is consistent with the bindings already in the frame:

                                                                                    + +

                                                                                    (define (extend-if-consistent var dat frame)
                                                                                    +  (let ((binding (binding-in-frame var frame)))
                                                                                    +    (if binding
                                                                                    +        (pattern-match (binding-value binding) dat frame)
                                                                                    +        (extend var dat frame))))
                                                                                    +

                                                                                    +If there is no binding for the variable in the frame, we simply add +the binding of the variable to the data. Otherwise we match, in the +frame, the data against the value of the variable in the frame. If +the stored value contains only constants, as it must if it was stored +during pattern matching by extend-if-consistent, then the match +simply tests whether the stored and new values are the same. If so, +it returns the unmodified frame; if not, it returns a failure +indication. The stored value may, however, contain pattern variables +if it was stored during unification (see section 4.4.4.4). +The recursive match of the stored pattern against the new data will add or +check bindings for the variables in this pattern. For example, +suppose we have a frame in which ?x is bound to (f ?y) and +?y is unbound, and we wish to augment this frame by a binding of +?x to (f b). We look up ?x and find that it is +bound to (f ?y). This leads us to match (f ?y) against +the proposed new value (f b) in the same frame. Eventually +this match extends the frame by adding a binding of ?y to b. ?X remains bound to (f ?y). We never modify a stored +binding and we never store more than one binding for a given variable.

                                                                                    + +The procedures used by extend-if-consistent to manipulate +bindings are defined in section 4.4.4.8.

                                                                                    + + +

                                                                                    Patterns with dotted tails

                                                                                    + + + +If a pattern contains a dot followed by a pattern variable, the +pattern variable matches the rest of the data list (rather than the +next element of the data list), just as one would expect with the +dotted-tail notation described in exercise 2.20. +Although the pattern matcher we have just implemented doesn't look for +dots, it does behave as we want. This is because the Lisp read +primitive, which is used by query-driver-loop to read the query +and represent it as a list structure, treats dots in a special way.

                                                                                    + +When read sees a dot, instead of making the next item be the +next element of a list (the car of a cons whose cdr +will be the rest of the list) it makes the next item be the cdr +of the list structure. For example, the list structure produced by +read for the pattern (computer ?type) could be constructed +by evaluating the expression (cons 'computer (cons '?type '())), +and that for (computer . ?type) could be constructed by +evaluating the expression (cons 'computer '?type).

                                                                                    + + +Thus, as pattern-match recursively compares cars and cdrs of a data list and a pattern that had a dot, it eventually +matches the variable after the dot (which is a cdr of the +pattern) against a sublist of the data list, binding the variable to +that list. For example, matching the pattern (computer . ?type) against +(computer programmer trainee) will match ?type against the +list (programmer trainee). + + +

                                                                                    4.4.4.4  Rules and Unification

                                                                                    + +

                                                                                    + +Apply-rules is the rule analog of find-assertions +(section 4.4.4.3). It +takes as input a pattern and a frame, and it forms a stream of +extension frames by applying rules from the data base. Stream-flatmap maps apply-a-rule down the stream of possibly +applicable rules (selected by fetch-rules, section 4.4.4.5) +and combines the resulting streams of frames.

                                                                                    + +

                                                                                    (define (apply-rules pattern frame)
                                                                                    +  (stream-flatmap (lambda (rule)
                                                                                    +                    (apply-a-rule rule pattern frame))
                                                                                    +                  (fetch-rules pattern frame)))
                                                                                    +

                                                                                    + +Apply-a-rule applies rules using the method outlined in +section 4.4.2. It first augments its argument +frame by unifying the rule conclusion with the pattern in the given +frame. If this succeeds, it evaluates the rule body in this new +frame.

                                                                                    + +Before any of this happens, however, the program renames all the +variables in the rule with unique new names. The reason for this is +to prevent the variables for different rule applications from becoming +confused with each other. For instance, if two rules both use a +variable named ?x, then each one may add a binding for ?x +to the frame when it is applied. These two ?x's have nothing to +do with each other, and we should not be fooled into thinking that the +two bindings must be consistent. Rather than rename variables, we +could devise a more clever environment structure; however, the +renaming approach we have chosen here is the most straightforward, +even if not the most efficient. (See +exercise 4.79.) Here is the apply-a-rule +procedure:

                                                                                    + +

                                                                                    (define (apply-a-rule rule query-pattern query-frame)
                                                                                    +  (let ((clean-rule (rename-variables-in rule)))
                                                                                    +    (let ((unify-result
                                                                                    +           (unify-match query-pattern
                                                                                    +                        (conclusion clean-rule)
                                                                                    +                        query-frame)))
                                                                                    +      (if (eq? unify-result 'failed)
                                                                                    +          the-empty-stream
                                                                                    +          (qeval (rule-body clean-rule)
                                                                                    +                 (singleton-stream unify-result))))))
                                                                                    +

                                                                                    +The selectors rule-body and conclusion that extract parts +of a rule are defined in section 4.4.4.7.

                                                                                    + +We generate unique variable names by associating a unique identifier +(such as a number) with each rule application and combining this +identifier with the original variable names. For example, if the +rule-application identifier is 7, we might change each ?x in +the rule to ?x-7 and each ?y in the rule to ?y-7. +(Make-new-variable and new-rule-application-id are +included with the syntax procedures in section 4.4.4.7.)

                                                                                    + +

                                                                                    (define (rename-variables-in rule)
                                                                                    +  (let ((rule-application-id (new-rule-application-id)))
                                                                                    +    (define (tree-walk exp)
                                                                                    +      (cond ((var? exp)
                                                                                    +             (make-new-variable exp rule-application-id))
                                                                                    +            ((pair? exp)
                                                                                    +             (cons (tree-walk (car exp))
                                                                                    +                   (tree-walk (cdr exp))))
                                                                                    +            (else exp)))
                                                                                    +    (tree-walk rule)))
                                                                                    +

                                                                                    + +The unification algorithm is implemented as a procedure that takes as +inputs two patterns and a frame and returns either the extended frame +or the symbol failed. +The unifier is like the pattern matcher except that it is +symmetrical -- variables are allowed on both sides of the match. +Unify-match is basically the same as pattern-match, +except that there is extra code (marked ``***'' below) to handle +the case where the object on the right side of the match is a variable.

                                                                                    + +

                                                                                    (define (unify-match p1 p2 frame)
                                                                                    +  (cond ((eq? frame 'failed) 'failed)
                                                                                    +        ((equal? p1 p2) frame)
                                                                                    +        ((var? p1) (extend-if-possible p1 p2 frame))
                                                                                    +        ((var? p2) (extend-if-possible p2 p1 frame))  ; ***
                                                                                    +        ((and (pair? p1) (pair? p2))
                                                                                    +         (unify-match (cdr p1)
                                                                                    +                      (cdr p2)
                                                                                    +                      (unify-match (car p1)
                                                                                    +                                   (car p2)
                                                                                    +                                   frame)))
                                                                                    +        (else 'failed)))
                                                                                    +

                                                                                    + +In unification, as in one-sided pattern matching, we want to accept a +proposed extension of the frame only if it is consistent with existing +bindings. The procedure extend-if-possible used in unification +is the same as the extend-if-consistent used in pattern matching +except for two special checks, marked ``***'' in the program +below. In the first case, if the variable we are trying to match is +not bound, but the value we are trying to match it with +is itself a (different) variable, it is +necessary to check to see if the value is bound, and if so, to match +its value. If both parties to the match are unbound, we may bind +either to the other.

                                                                                    + +The second check deals with attempts to bind a variable to a pattern +that includes that variable. Such a situation can occur whenever a +variable is repeated in both patterns. Consider, for example, +unifying the two patterns (?x ?x) and (?y +<expression involving ?y>) in a frame where both ?x +and ?y are unbound. First ?x is matched +against ?y, making a binding of ?x to ?y. Next, the same ?x is matched against the given expression +involving ?y. +Since ?x is already bound to ?y, this +results in matching ?y against the expression. +If we think of the +unifier as finding a set of values for the pattern variables that make +the patterns the same, then these patterns imply instructions to find +a ?y such that ?y is equal to the expression involving ?y. +There is no general method for solving such +equations, so we reject such bindings; these cases are recognized by +the predicate depends-on?.80 +On the other hand, we do not want to reject attempts +to bind a variable to itself. For example, consider unifying (?x ?x) +and (?y ?y). The second attempt to bind ?x to ?y matches ?y (the stored value of ?x) against ?y +(the new value of ?x). This is taken care of by the equal? clause +of unify-match.

                                                                                    + +

                                                                                    (define (extend-if-possible var val frame)
                                                                                    +  (let ((binding (binding-in-frame var frame)))
                                                                                    +    (cond (binding
                                                                                    +           (unify-match
                                                                                    +            (binding-value binding) val frame))
                                                                                    +          ((var? val)                      ; ***
                                                                                    +           (let ((binding (binding-in-frame val frame)))
                                                                                    +             (if binding
                                                                                    +                 (unify-match
                                                                                    +                  var (binding-value binding) frame)
                                                                                    +                 (extend var val frame))))
                                                                                    +          ((depends-on? val var frame)     ; ***
                                                                                    +           'failed)
                                                                                    +          (else (extend var val frame)))))
                                                                                    +

                                                                                    + +Depends-on? is a predicate that tests whether an expression +proposed to be the value of a pattern variable depends on the variable. +This must be done relative to the current frame because the expression +may contain occurrences of a variable that already has a value that +depends on our test variable. The structure of depends-on? is a +simple recursive tree walk in which we substitute for the values of +variables whenever necessary.

                                                                                    + +

                                                                                    (define (depends-on? exp var frame)
                                                                                    +  (define (tree-walk e)
                                                                                    +    (cond ((var? e)
                                                                                    +           (if (equal? var e)
                                                                                    +               true
                                                                                    +               (let ((b (binding-in-frame e frame)))
                                                                                    +                 (if b
                                                                                    +                     (tree-walk (binding-value b))
                                                                                    +                     false))))
                                                                                    +          ((pair? e)
                                                                                    +           (or (tree-walk (car e))
                                                                                    +               (tree-walk (cdr e))))
                                                                                    +          (else false)))
                                                                                    +  (tree-walk exp))
                                                                                    +

                                                                                    + + +

                                                                                    4.4.4.5  Maintaining the Data Base

                                                                                    + + + +One important problem in designing logic programming languages is that +of arranging things so that as few irrelevant data-base entries as +possible will be examined in checking a given pattern. In our +system, in addition to storing all assertions in one big stream, +we store all assertions whose cars are constant symbols +in separate streams, in a table indexed by the symbol. To fetch an +assertion that may match a pattern, we first check to see if the car of the pattern is a constant symbol. If so, we return (to be +tested using the matcher) all the stored assertions that have the same +car. If the pattern's car is not a constant symbol, we +return all the stored assertions. Cleverer methods could also take +advantage of information in the frame, or try also to optimize the +case where the car of the pattern is not a constant symbol. We +avoid building our criteria for indexing (using the car, +handling only the case of constant symbols) into the program; instead +we call on predicates and selectors that embody our criteria.

                                                                                    + +

                                                                                    (define THE-ASSERTIONS the-empty-stream)
                                                                                    +(define (fetch-assertions pattern frame)
                                                                                    +  (if (use-index? pattern)
                                                                                    +      (get-indexed-assertions pattern)
                                                                                    +      (get-all-assertions)))
                                                                                    +(define (get-all-assertions) THE-ASSERTIONS)
                                                                                    +(define (get-indexed-assertions pattern)
                                                                                    +  (get-stream (index-key-of pattern) 'assertion-stream))
                                                                                    +

                                                                                    +Get-stream looks up a stream in the table and returns an empty +stream if nothing is stored there.

                                                                                    + +

                                                                                    (define (get-stream key1 key2)
                                                                                    +  (let ((s (get key1 key2)))
                                                                                    +    (if s s the-empty-stream)))
                                                                                    +

                                                                                    + +Rules are stored similarly, using the car of the rule +conclusion. Rule conclusions are arbitrary patterns, however, so they +differ from assertions in that they can contain variables. A pattern +whose car is a constant symbol can match rules whose conclusions +start with a variable as well as rules whose conclusions have the same +car. Thus, when fetching rules that might match a pattern whose +car is a constant symbol we fetch all rules whose conclusions +start with a variable as well as those whose conclusions have the same +car as the pattern. For this purpose we store all rules whose +conclusions start with a variable in a separate stream in our table, +indexed by the symbol ?.

                                                                                    + +

                                                                                    (define THE-RULES the-empty-stream)
                                                                                    +(define (fetch-rules pattern frame)
                                                                                    +  (if (use-index? pattern)
                                                                                    +      (get-indexed-rules pattern)
                                                                                    +      (get-all-rules)))
                                                                                    +(define (get-all-rules) THE-RULES)
                                                                                    +(define (get-indexed-rules pattern)
                                                                                    +  (stream-append
                                                                                    +   (get-stream (index-key-of pattern) 'rule-stream)
                                                                                    +   (get-stream '? 'rule-stream)))
                                                                                    +

                                                                                    + + +Add-rule-or-assertion! is used by query-driver-loop to +add assertions and rules to the data base. Each item is stored in the +index, if appropriate, and in a stream of all assertions or rules in +the data base.

                                                                                    + + +

                                                                                    (define (add-rule-or-assertion! assertion)
                                                                                    +  (if (rule? assertion)
                                                                                    +      (add-rule! assertion)
                                                                                    +      (add-assertion! assertion)))
                                                                                    +(define (add-assertion! assertion)
                                                                                    +  (store-assertion-in-index assertion)
                                                                                    +  (let ((old-assertions THE-ASSERTIONS))
                                                                                    +    (set! THE-ASSERTIONS
                                                                                    +          (cons-stream assertion old-assertions))
                                                                                    +    'ok))
                                                                                    +(define (add-rule! rule)
                                                                                    +  (store-rule-in-index rule)
                                                                                    +  (let ((old-rules THE-RULES))
                                                                                    +    (set! THE-RULES (cons-stream rule old-rules))
                                                                                    +    'ok))
                                                                                    +

                                                                                    + +To actually store an assertion or a rule, we check to see if it can be +indexed. If so, we store it in the appropriate stream.

                                                                                    + + +

                                                                                    (define (store-assertion-in-index assertion)
                                                                                    +  (if (indexable? assertion)
                                                                                    +      (let ((key (index-key-of assertion)))
                                                                                    +        (let ((current-assertion-stream
                                                                                    +               (get-stream key 'assertion-stream)))
                                                                                    +          (put key
                                                                                    +               'assertion-stream
                                                                                    +               (cons-stream assertion
                                                                                    +                            current-assertion-stream))))))
                                                                                    +(define (store-rule-in-index rule)
                                                                                    +  (let ((pattern (conclusion rule)))
                                                                                    +    (if (indexable? pattern)
                                                                                    +        (let ((key (index-key-of pattern)))
                                                                                    +          (let ((current-rule-stream
                                                                                    +                 (get-stream key 'rule-stream)))
                                                                                    +            (put key
                                                                                    +                 'rule-stream
                                                                                    +                 (cons-stream rule
                                                                                    +                              current-rule-stream)))))))
                                                                                    +

                                                                                    + +The following procedures define how the data-base index is used. A +pattern (an assertion or a rule conclusion) will be stored in the +table if it starts with a variable or a constant symbol.

                                                                                    + + +

                                                                                    (define (indexable? pat)
                                                                                    +  (or (constant-symbol? (car pat))
                                                                                    +      (var? (car pat))))
                                                                                    +

                                                                                    +The key under which a pattern is stored in the table is either ? (if it starts with a variable) or the constant symbol with which +it starts.

                                                                                    + + +

                                                                                    (define (index-key-of pat)
                                                                                    +  (let ((key (car pat)))
                                                                                    +    (if (var? key) '? key)))
                                                                                    +

                                                                                    +The index will be used to retrieve items that might match a pattern if +the pattern starts with a constant symbol.

                                                                                    + + +

                                                                                    (define (use-index? pat)
                                                                                    +  (constant-symbol? (car pat)))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.70.  What is the purpose of the let bindings in the procedures add-assertion! and add-rule! ? What would be wrong with the +following implementation of add-assertion! ? +Hint: Recall the definition of the infinite stream of ones in +section 3.5.2: (define ones (cons-stream 1 ones)).

                                                                                    + +

                                                                                    (define (add-assertion! assertion)
                                                                                    +  (store-assertion-in-index assertion)
                                                                                    +  (set! THE-ASSERTIONS
                                                                                    +        (cons-stream assertion THE-ASSERTIONS))
                                                                                    +  'ok)
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    4.4.4.6  Stream Operations

                                                                                    + + + +The query system uses a few stream operations that were not presented +in chapter 3.

                                                                                    + + +Stream-append-delayed and interleave-delayed +are just like stream-append and interleave +(section 3.5.3), +except that they take a delayed argument (like the integral +procedure in section 3.5.4). +This postpones looping in some cases (see exercise 4.71).

                                                                                    + +

                                                                                    (define (stream-append-delayed s1 delayed-s2)
                                                                                    +  (if (stream-null? s1)
                                                                                    +      (force delayed-s2)
                                                                                    +      (cons-stream
                                                                                    +       (stream-car s1)
                                                                                    +       (stream-append-delayed (stream-cdr s1) delayed-s2))))
                                                                                    +(define (interleave-delayed s1 delayed-s2)
                                                                                    +  (if (stream-null? s1)
                                                                                    +      (force delayed-s2)
                                                                                    +      (cons-stream
                                                                                    +       (stream-car s1)
                                                                                    +       (interleave-delayed (force delayed-s2)
                                                                                    +                           (delay (stream-cdr s1))))))
                                                                                    +

                                                                                    + +Stream-flatmap, which is used throughout the query evaluator to +map a procedure over a stream of frames and combine the resulting +streams of frames, is the stream analog of the flatmap procedure +introduced for ordinary lists in section 2.2.3. +Unlike ordinary flatmap, however, we accumulate the streams with +an interleaving process, rather than simply appending them (see +exercises 4.72 and  4.73).

                                                                                    + +

                                                                                    (define (stream-flatmap proc s)
                                                                                    +  (flatten-stream (stream-map proc s)))
                                                                                    +(define (flatten-stream stream)
                                                                                    +  (if (stream-null? stream)
                                                                                    +      the-empty-stream
                                                                                    +      (interleave-delayed
                                                                                    +       (stream-car stream)
                                                                                    +       (delay (flatten-stream (stream-cdr stream))))))
                                                                                    +

                                                                                    + +The evaluator also uses the following simple procedure +to generate a stream consisting of a single element:

                                                                                    + +

                                                                                    (define (singleton-stream x)
                                                                                    +  (cons-stream x the-empty-stream))
                                                                                    +

                                                                                    + + +

                                                                                    4.4.4.7  Query Syntax Procedures

                                                                                    + + + +Type and contents, used by qeval +(section 4.4.4.2), specify that a +special form is identified by the symbol in its car. +They are the same as the type-tag and contents procedures in +section 2.4.2, except for the error message.

                                                                                    + +

                                                                                    (define (type exp)
                                                                                    +  (if (pair? exp)
                                                                                    +      (car exp)
                                                                                    +      (error "Unknown expression TYPE" exp)))
                                                                                    +(define (contents exp)
                                                                                    +  (if (pair? exp)
                                                                                    +      (cdr exp)
                                                                                    +      (error "Unknown expression CONTENTS" exp)))
                                                                                    +

                                                                                    + +The following procedures, used by query-driver-loop +(in section 4.4.4.1), specify +that rules and assertions are added to the data base by expressions of +the form (assert! <rule-or-assertion>):

                                                                                    + +

                                                                                    (define (assertion-to-be-added? exp)
                                                                                    +  (eq? (type exp) 'assert!))
                                                                                    +(define (add-assertion-body exp)
                                                                                    +  (car (contents exp)))
                                                                                    +

                                                                                    + +Here are the syntax definitions for the and, or, not, and lisp-value special forms +(section 4.4.4.2):

                                                                                    + +

                                                                                    (define (empty-conjunction? exps) (null? exps))
                                                                                    +(define (first-conjunct exps) (car exps))
                                                                                    +(define (rest-conjuncts exps) (cdr exps))
                                                                                    +(define (empty-disjunction? exps) (null? exps))
                                                                                    +(define (first-disjunct exps) (car exps))
                                                                                    +(define (rest-disjuncts exps) (cdr exps))
                                                                                    +(define (negated-query exps) (car exps))
                                                                                    +(define (predicate exps) (car exps))
                                                                                    +(define (args exps) (cdr exps))
                                                                                    +

                                                                                    + +The following three procedures define the syntax of rules:

                                                                                    + +

                                                                                    (define (rule? statement)
                                                                                    +  (tagged-list? statement 'rule))
                                                                                    +(define (conclusion rule) (cadr rule))
                                                                                    +(define (rule-body rule)
                                                                                    +  (if (null? (cddr rule))
                                                                                    +      '(always-true)
                                                                                    +      (caddr rule)))
                                                                                    +

                                                                                    + +Query-driver-loop (section 4.4.4.1) +calls query-syntax-process to +transform pattern variables in the expression, which have the form +?symbol, into the internal format (? symbol). That is to +say, a pattern such as (job ?x ?y) is actually represented +internally by the system as (job (? x) (? y)). This increases +the efficiency of query processing, since it means that the system can +check to see if an expression is a pattern variable by checking +whether the car of the expression is the symbol ?, rather +than having to extract characters from the symbol. The syntax +transformation is accomplished by the following +procedure:81

                                                                                    + +

                                                                                    (define (query-syntax-process exp)
                                                                                    +  (map-over-symbols expand-question-mark exp))
                                                                                    +(define (map-over-symbols proc exp)
                                                                                    +  (cond ((pair? exp)
                                                                                    +         (cons (map-over-symbols proc (car exp))
                                                                                    +               (map-over-symbols proc (cdr exp))))
                                                                                    +        ((symbol? exp) (proc exp))
                                                                                    +        (else exp)))
                                                                                    +(define (expand-question-mark symbol)
                                                                                    +  (let ((chars (symbol->string symbol)))
                                                                                    +    (if (string=? (substring chars 0 1) "?")
                                                                                    +        (list '?
                                                                                    +              (string->symbol
                                                                                    +               (substring chars 1 (string-length chars))))
                                                                                    +        symbol)))
                                                                                    +

                                                                                    + +Once the variables are transformed in this way, the variables in a +pattern are lists starting with ?, +and the constant symbols (which need to be recognized for +data-base indexing, section 4.4.4.5) are just the symbols.

                                                                                    + +

                                                                                    (define (var? exp)
                                                                                    +  (tagged-list? exp '?))
                                                                                    +(define (constant-symbol? exp) (symbol? exp))
                                                                                    +

                                                                                    + +Unique variables are constructed during rule application +(in section 4.4.4.4) by means of +the following procedures. The unique identifier for a rule +application is a number, which is incremented each time a rule is +applied.

                                                                                    + + +

                                                                                    (define rule-counter 0)
                                                                                    +(define (new-rule-application-id)
                                                                                    +  (set! rule-counter (+ 1 rule-counter))
                                                                                    +  rule-counter)
                                                                                    +(define (make-new-variable var rule-application-id)
                                                                                    +  (cons '? (cons rule-application-id (cdr var))))
                                                                                    +

                                                                                    + +When query-driver-loop instantiates the query to print the +answer, it converts any unbound pattern variables back to the right +form for printing, using

                                                                                    + +

                                                                                    (define (contract-question-mark variable)
                                                                                    +  (string->symbol
                                                                                    +   (string-append "?" 
                                                                                    +     (if (number? (cadr variable))
                                                                                    +         (string-append (symbol->string (caddr variable))
                                                                                    +                        "-"
                                                                                    +                        (number->string (cadr variable)))
                                                                                    +         (symbol->string (cadr variable))))))
                                                                                    +

                                                                                    + + +

                                                                                    4.4.4.8  Frames and Bindings

                                                                                    + +

                                                                                    + +Frames are represented as lists of bindings, which are +variable-value pairs:

                                                                                    + +

                                                                                    (define (make-binding variable value)
                                                                                    +  (cons variable value))
                                                                                    +(define (binding-variable binding)
                                                                                    +  (car binding))
                                                                                    +(define (binding-value binding)
                                                                                    +  (cdr binding))
                                                                                    +(define (binding-in-frame variable frame)
                                                                                    +  (assoc variable frame))
                                                                                    +(define (extend variable value frame)
                                                                                    +  (cons (make-binding variable value) frame))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.71.  Louis Reasoner wonders why the simple-query and disjoin +procedures (section 4.4.4.2) are implemented using +explicit delay operations, rather than being defined as follows:

                                                                                    + +

                                                                                    (define (simple-query query-pattern frame-stream)
                                                                                    +  (stream-flatmap
                                                                                    +   (lambda (frame)
                                                                                    +     (stream-append (find-assertions query-pattern frame)
                                                                                    +                    (apply-rules query-pattern frame)))
                                                                                    +   frame-stream))
                                                                                    +(define (disjoin disjuncts frame-stream)
                                                                                    +  (if (empty-disjunction? disjuncts)
                                                                                    +      the-empty-stream
                                                                                    +      (interleave
                                                                                    +       (qeval (first-disjunct disjuncts) frame-stream)
                                                                                    +       (disjoin (rest-disjuncts disjuncts) frame-stream))))
                                                                                    +

                                                                                    +Can you give examples of queries where these simpler definitions would +lead to undesirable behavior? + +

                                                                                    + +

                                                                                    +Exercise 4.72.  Why do disjoin and stream-flatmap interleave the +streams rather than simply append them? Give examples that illustrate +why interleaving works better. (Hint: Why did we use interleave in +section 3.5.3?) + +

                                                                                    + +

                                                                                    +Exercise 4.73.  Why does flatten-stream use delay explicitly? +What would be wrong with defining it as follows: +

                                                                                    (define (flatten-stream stream)
                                                                                    +  (if (stream-null? stream)
                                                                                    +      the-empty-stream
                                                                                    +      (interleave
                                                                                    +       (stream-car stream)
                                                                                    +       (flatten-stream (stream-cdr stream)))))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 4.74.  Alyssa P. Hacker proposes to use a simpler version of stream-flatmap +in negate, lisp-value, and find-assertions. +She observes that the procedure that is mapped over the frame stream +in these cases always produces either the empty stream or a singleton +stream, so no interleaving is needed when combining these streams.

                                                                                    + +

                                                                                    a. Fill in the missing expressions in Alyssa's program. +

                                                                                    (define (simple-stream-flatmap proc s)
                                                                                    +  (simple-flatten (stream-map proc s)))
                                                                                    +
                                                                                    +(define (simple-flatten stream)
                                                                                    +  (stream-map <??>
                                                                                    +              (stream-filter <??> stream)))
                                                                                    +

                                                                                    +

                                                                                    b. Does the query system's behavior change if we change it in this way? +

                                                                                    + +

                                                                                    +Exercise 4.75.  Implement for the query language a new special form called unique. Unique should succeed if there is precisely one item +in the data base satisfying a specified query. For example,

                                                                                    + +

                                                                                    (unique (job ?x (computer wizard)))
                                                                                    +

                                                                                    +should print the one-item stream

                                                                                    + +

                                                                                    (unique (job (Bitdiddle Ben) (computer wizard)))
                                                                                    +

                                                                                    +since Ben is the only computer wizard, and

                                                                                    + +

                                                                                    (unique (job ?x (computer programmer)))
                                                                                    +

                                                                                    +should print the empty stream, since there is more than one computer +programmer. Moreover,

                                                                                    + +

                                                                                    (and (job ?x ?j) (unique (job ?anyone ?j)))
                                                                                    +

                                                                                    +should list all the jobs that are filled by only one person, and the +people who fill them.

                                                                                    + +There are two parts to implementing unique. The first is to +write a procedure that handles this special form, and the second is to make +qeval dispatch to that procedure. The second part is trivial, +since qeval does its dispatching in a data-directed way. If +your procedure is called uniquely-asserted, all you need to do +is

                                                                                    + +

                                                                                    (put 'unique 'qeval uniquely-asserted)
                                                                                    +

                                                                                    +and qeval will dispatch to this procedure for every query whose +type (car) is the symbol unique.

                                                                                    + +The real problem is to write the procedure uniquely-asserted. +This should take as input the contents (cdr) of the unique query, together with a stream of frames. For each frame in +the stream, it should use qeval to find the stream of all +extensions to the frame that satisfy the given query. Any stream that +does not have exactly one item in it should be eliminated. The +remaining streams should be passed back to be accumulated into one big +stream that is the result of the unique query. This is similar +to the implementation of the not special form.

                                                                                    + +Test your implementation by forming a query that lists all people who +supervise precisely one person. +

                                                                                    + +

                                                                                    +Exercise 4.76.  Our implementation of and as a series combination of queries +(figure 4.5) is elegant, but it is inefficient because in +processing the second query of the and we must scan the data +base for each frame produced by the first query. If the data base has +N elements, and a typical query produces a number of output frames +proportional to N (say N/k), then scanning the data base for each +frame produced by the first query will require N2/k calls to the +pattern matcher. Another approach would be to process the two clauses +of the and separately, then look for all pairs of output frames +that are compatible. If each query produces N/k output frames, then +this means that we must perform N2/k2 compatibility checks -- a +factor of k fewer than the number of matches required in our current +method.

                                                                                    + +Devise an implementation of and that uses this strategy. You +must implement a procedure that takes two frames as inputs, checks +whether the bindings in the frames are compatible, and, if so, +produces a frame that merges the two sets of bindings. This operation +is similar to unification. + +

                                                                                    + +

                                                                                    +Exercise 4.77.  In section 4.4.3 we saw that not and lisp-value can cause the query language to give ``wrong'' answers if +these filtering operations are applied to frames in which variables +are unbound. Devise a way to fix this shortcoming. One idea is to +perform the filtering in a ``delayed'' manner by appending to the +frame a ``promise'' to filter that is fulfilled only when enough +variables have been bound to make the operation possible. We could +wait to perform filtering until all other operations have been +performed. However, for efficiency's sake, we would like to perform +filtering as soon as possible so as to cut down on the number of +intermediate frames generated. + +

                                                                                    + +

                                                                                    +Exercise 4.78.  Redesign the query language as a nondeterministic program to be +implemented using the evaluator of +section 4.3, rather than as a stream +process. In this approach, each query will produce a single answer +(rather than the stream of all answers) and the user can type try-again to see more answers. You should find that much of the +mechanism we built in this section is subsumed by nondeterministic +search and backtracking. You will probably also find, however, that +your new query language has subtle differences in behavior from the +one implemented here. Can you find examples that illustrate this +difference? + +

                                                                                    + +

                                                                                    +Exercise 4.79.  When we implemented the Lisp evaluator in section 4.1, +we saw how to use local environments to avoid name conflicts between +the parameters of procedures. For example, in evaluating

                                                                                    + +

                                                                                    (define (square x)
                                                                                    +  (* x x))
                                                                                    +(define (sum-of-squares x y)
                                                                                    +  (+ (square x) (square y)))
                                                                                    +(sum-of-squares 3 4)
                                                                                    +

                                                                                    +there is no confusion between the x in square and the x +in sum-of-squares, because we evaluate the body of each +procedure in an environment that is specially constructed to contain +bindings for the local variables. In the query system, we used a +different strategy to avoid name conflicts in applying rules. Each +time we apply a rule we rename the variables with new names that are +guaranteed to be unique. The analogous strategy for the Lisp +evaluator would be to do away with local environments and simply +rename the variables in the body of a procedure each time we apply the +procedure.

                                                                                    + +Implement for the query language a rule-application method that uses +environments rather than renaming. See if you can build on your +environment structure to create constructs in the query language for +dealing with large systems, such as the rule analog of +block-structured procedures. Can you relate any of this to the +problem of making deductions in a context (e.g., ``If I supposed that +P were true, then I would be able to deduce A and B.'') as a +method of problem solving? (This problem is open-ended. A good +answer is probably worth a Ph.D.) + +

                                                                                    +

                                                                                    + + +


                                                                                    +

                                                                                    58 Logic programming has grown out of a long +history of research in automatic theorem proving. Early +theorem-proving programs could accomplish very little, because they +exhaustively searched the space of possible proofs. The major +breakthrough that made such a search plausible was the discovery in +the early 1960s of the unification algorithm and the resolution principle (Robinson 1965). Resolution was used, for +example, by Green and Raphael (1968) (see also Green 1969) as the +basis for a deductive question-answering system. During most of this +period, researchers concentrated on algorithms that are guaranteed to +find a proof if one exists. Such algorithms were difficult to control +and to direct toward a proof. Hewitt (1969) recognized the +possibility of merging the control structure of a programming language +with the operations of a logic-manipulation system, leading to the +work in automatic search mentioned in section 4.3.1 +(footnote 47). At the same time that this was being done, +Colmerauer, in Marseille, was developing rule-based systems for +manipulating natural language (see Colmerauer et al. 1973). He +invented a programming language called Prolog for representing those +rules. Kowalski (1973; 1979), in Edinburgh, recognized that execution +of a Prolog program could be interpreted as proving theorems (using a +proof technique called linear Horn-clause resolution). The merging of +the last two strands led to the logic-programming movement. Thus, in +assigning credit for the development of logic programming, the French +can point to Prolog's genesis at the University of Marseille, while +the British can highlight the work at the University of Edinburgh. +According to people at MIT, logic programming was developed by these +groups in an attempt to figure out what Hewitt was talking about in +his brilliant but impenetrable Ph.D. thesis. For a history of logic +programming, see Robinson 1983. + +

                                                                                    59 To +see the correspondence between the rules and the procedure, let x in the procedure (where x is nonempty) correspond to (cons u v) in the rule. Then z in the rule corresponds to the +append of (cdr x) and y. + +

                                                                                    60 This certainly does not +relieve the user of the entire problem of how to compute the answer. +There are many different mathematically equivalent sets of rules for +formulating the append relation, only some of which can be +turned into effective devices for computing in any direction. In +addition, sometimes ``what is'' information gives no clue ``how to'' +compute an answer. For example, consider the problem of computing the +y such that y2 = x. + +

                                                                                    61 Interest in logic programming peaked +during the early 80s when the Japanese government began an ambitious +project aimed at building superfast computers optimized to run logic +programming languages. The speed of such computers was to be measured +in LIPS (Logical Inferences Per Second) rather than the usual FLOPS +(FLoating-point Operations Per Second). Although the project +succeeded in developing hardware and software as originally planned, +the international computer industry moved in a different direction. +See Feigenbaum and Shrobe 1993 for an overview evaluation of the +Japanese project. The logic programming community has also moved on +to consider relational programming based on techniques other than +simple pattern matching, such as the ability to deal with numerical +constraints such as the ones illustrated in the constraint-propagation +system of section 3.3.5. + +

                                                                                    62 This uses the dotted-tail notation introduced in +exercise 2.20. + +

                                                                                    63 Actually, this description of not is valid only for simple cases. The real behavior of not +is more complex. We will examine not's peculiarities in +sections 4.4.2 and 4.4.3. + +

                                                                                    64 Lisp-value should be used only to perform an operation not +provided in the query language. In particular, it should not +be used to test equality (since that is what the matching in the +query language is designed to do) or inequality (since that can +be done with the same rule shown below). + +

                                                                                    65 Notice that we do not need same in order to make two things be +the same: We just use the same pattern variable for each -- in effect, +we have one thing instead of two things in the first place. For +example, see ?town in the lives-near rule and ?middle-manager in the wheel rule below. +Same is useful when we want to force two things to be +different, such as ?person-1 and ?person-2 in the lives-near rule. Although using the same pattern variable in two +parts of a query forces the same value to appear in both places, using +different pattern variables does not force different values to appear. +(The values assigned to different pattern variables may be the same or +different.) + +

                                                                                    66 We will also allow rules without bodies, as in same, and we will interpret such a rule to mean that the rule +conclusion is satisfied by any values of the variables. + +

                                                                                    67 Because matching is generally very expensive, we would +like to avoid applying the full matcher to every element of the data +base. This is usually arranged by breaking up the process into a +fast, coarse match and the final match. The coarse match filters the +data base to produce a small set of candidates for the final match. +With care, we can arrange our data base so that some of the work of +coarse matching can be done when the data base is constructed rather +then when we want to select the candidates. This is called indexing the data base. There is a vast technology built around +data-base-indexing schemes. Our implementation, described in +section 4.4.4, contains a +simple-minded form of such an optimization. + +

                                                                                    68 But this kind of exponential explosion is not common in and +queries because the added conditions tend to reduce rather than expand +the number of frames produced. + +

                                                                                    69 There is a large literature on data-base-management +systems that is concerned with how to handle complex queries +efficiently. + +

                                                                                    70 There is a subtle difference between this filter +implementation of not and the usual meaning of not in +mathematical logic. See section 4.4.3. + +

                                                                                    71 In one-sided pattern matching, all the equations that +contain pattern variables are explicit and already solved for the +unknown (the pattern variable). + +

                                                                                    72 Another way to think of unification is that it generates the most +general pattern that is a specialization of the two input patterns. +That is, the unification of (?x a) and ((b ?y) ?z) is ((b ?y) a), and the unification of (?x a ?y) and (?y ?z +a), discussed above, is (a a a). +For our implementation, it is more convenient to think of the result +of unification as a frame rather than a pattern. + +

                                                                                    73 Since unification is a +generalization of matching, we could simplify the system by using the +unifier to produce both streams. Treating the easy case with the +simple matcher, however, illustrates how matching (as opposed to +full-blown unification) can be useful in its own right. + +

                                                                                    74 The reason we use streams (rather than lists) of frames is that the +recursive application of rules can generate +infinite numbers of values that satisfy a query. The delayed +evaluation embodied in streams is crucial here: The system will print +responses one by one as they are generated, regardless of whether +there are a finite or infinite number of responses. + +

                                                                                    75 That a particular method of inference is +legitimate is not a trivial assertion. One must prove that if one +starts with true premises, only true conclusions can be derived. The +method of inference represented by rule applications is modus +ponens, the familiar method of inference that says that if A is +true and A implies B is true, then we may conclude that B +is true. + +

                                                                                    76 We must qualify this statement by +agreeing that, in speaking of the ``inference'' accomplished by a +logic program, we assume that the computation terminates. +Unfortunately, even this qualified statement is false for our +implementation of the query language (and also false for programs in +Prolog and most other current logic programming languages) because of +our use of not and lisp-value. As we will describe below, +the not implemented in the query language is not always +consistent with the not of mathematical logic, and lisp-value introduces additional complications. We could implement a +language consistent with mathematical logic by simply removing not and lisp-value from the language and agreeing to write +programs using only simple queries, and, and or. However, +this would greatly restrict the expressive power of the language. One +of the major concerns of research in logic programming is to find ways +to achieve more consistency with mathematical logic without unduly +sacrificing expressive power. + +

                                                                                    77 This is not a problem of the logic but one of the +procedural interpretation of the logic provided by our interpreter. +We could write an interpreter that would not fall into a loop here. +For example, we could enumerate all the proofs derivable from our +assertions and our rules in a breadth-first rather than a depth-first +order. However, such a system makes it more difficult to take +advantage of the order of deductions in our programs. One attempt to +build sophisticated control into such a program is described in +deKleer et al. 1977. Another technique, which does not lead to such +serious control problems, is to put in special knowledge, such as +detectors for particular kinds of loops +(exercise 4.67). However, there can be no +general scheme for reliably preventing a system from going down +infinite paths in performing deductions. Imagine a diabolical rule of +the form ``To show P(x) is true, show that P(f(x)) is true,'' for +some suitably chosen function f. + +

                                                                                    78 Consider the query (not (baseball-fan (Bitdiddle Ben))). The system finds that (baseball-fan (Bitdiddle Ben)) is not in the data base, so the empty +frame does not satisfy the pattern and is not filtered out of the +initial stream of frames. The result of the query is thus the empty +frame, which is used to instantiate the input query to produce (not (baseball-fan (Bitdiddle Ben))). + +

                                                                                    79 A discussion and justification of this +treatment of not can be found in the article by Clark (1978). + +

                                                                                    80 In general, unifying ?y with an expression involving +?y would require our being able to find a fixed point of the +equation ?y = <expression involving ?y>. It is +sometimes possible to syntactically form an expression that appears to +be the solution. For example, ?y  =  (f ?y) seems to have +the fixed point (f (f (f ... ))), which we can produce by +beginning with the expression (f ?y) and repeatedly substituting +(f ?y) for ?y. Unfortunately, not every such equation has +a meaningful fixed point. The issues that arise here are similar to +the issues of manipulating infinite series in mathematics. For +example, we know that 2 is the solution to the equation y = 1 + y/2. +Beginning with the expression 1 + y/2 and repeatedly substituting 1 + + y/2 for y gives +

                                                                                    +which leads to +

                                                                                    +However, if we try the same manipulation beginning with the +observation that - 1 is the solution to the equation y = 1 + 2y, we +obtain +

                                                                                    +which leads to +

                                                                                    +Although the formal manipulations used in deriving these two equations +are identical, the first result is a valid assertion about infinite +series but the second is not. Similarly, for our unification results, +reasoning with an arbitrary syntactically constructed expression may +lead to errors. + +

                                                                                    81 Most Lisp systems give the user the ability to +modify the ordinary read procedure to perform such +transformations by defining reader macro characters. Quoted +expressions are already handled in this way: The reader automatically +translates 'expression into (quote expression) before the +evaluator sees it. We could arrange for ?expression to be +transformed into (? expression) in the same way; however, for +the sake of clarity we have included the transformation procedure here +explicitly.

                                                                                    + +Expand-question-mark and contract-question-mark use +several procedures with string in their names. +These are Scheme primitives. + + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-3.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-3.html new file mode 100644 index 00000000..4f69a96a --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-3.html @@ -0,0 +1,50 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + +

                                                                                    + +This book is dedicated, in respect and admiration, to the spirit that +lives in the computer.

                                                                                    + +

                                                                                    + +``I think that it's extraordinarily important that we in computer +science keep fun in computing. When it started out, it was an awful +lot of fun. Of course, the paying customers got shafted every now and +then, and after a while we began to take their complaints seriously. +We began to feel as if we really were responsible for the successful, +error-free perfect use of these machines. I don't think we are. I +think we're responsible for stretching them, setting them off in new +directions, and keeping fun in the house. I hope the field of +computer science never loses its sense of fun. Above all, I hope we +don't become missionaries. Don't feel as if you're Bible salesmen. +The world has too many of those already. What you know about +computing other people will learn. Don't feel as if the key to +successful computing is only in your hands. What's in your hands, I +think and hope, is intelligence: the ability to see the machine as +more than when you were first led up to it, that you can make it +more.''

                                                                                    + +

                                                                                    +Alan J. Perlis (April 1, 1922-February 7, 1990)

                                                                                    + + + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-30.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-30.html new file mode 100644 index 00000000..e2f4d9b0 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-30.html @@ -0,0 +1,109 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +

                                                                                    +Computing with Register Machines

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + +

                                                                                    + +My aim is to show that the heavenly machine is not a kind of divine, +live being, but a kind of clockwork (and he who believes that a clock +has soul attributes the maker's glory to the work), insofar as nearly +all the manifold motions are caused by a most simple and material +force, just as all motions of the clock are caused by a single weight.

                                                                                    + +Johannes Kepler (letter to Herwart von Hohenburg, 1605)

                                                                                    + + +

                                                                                    +
                                                                                    + +

                                                                                    + + +We began this book by studying processes and by describing processes +in terms of procedures written in Lisp. To explain the meanings of +these procedures, we used a succession of models of evaluation: the +substitution model of chapter 1, the environment model of chapter 3, +and the metacircular evaluator of chapter 4. Our examination of the +metacircular evaluator, in particular, dispelled much of the mystery +of how Lisp-like languages are interpreted. +But even the metacircular evaluator leaves important questions +unanswered, because it fails to elucidate the mechanisms of control in +a Lisp system. For instance, the evaluator does not explain how the +evaluation of a subexpression manages to return a value to the +expression that uses this value, nor does the evaluator explain how +some recursive procedures generate iterative processes (that is, are evaluated +using constant space) whereas other recursive procedures generate recursive +processes. These questions remain unanswered because the metacircular +evaluator is itself a Lisp program and hence inherits the control +structure of the underlying Lisp system. In order to provide a more +complete description of the control structure of the Lisp evaluator, +we must work at a more primitive level than Lisp itself.

                                                                                    + +In this chapter we will describe processes in terms of the step-by-step +operation of a traditional computer. Such a computer, or register +machine, sequentially executes instructions that +manipulate the contents of a fixed set of storage elements called registers. A typical register-machine instruction applies a +primitive operation to the contents of some registers and assigns the +result to another register. Our descriptions of processes executed by +register machines will look very much like ``machine-language'' +programs for traditional computers. However, instead of focusing on +the machine language of any particular computer, we will examine +several Lisp procedures and design a specific register machine to +execute each procedure. Thus, we will approach our task from the +perspective of a hardware architect rather than that of a +machine-language computer programmer. In designing register machines, +we will develop mechanisms for implementing important programming +constructs such as recursion. We will also present a language for +describing designs for register machines. In +section 5.2 we will +implement a Lisp program that +uses these descriptions to simulate the machines we design.

                                                                                    + +Most of the primitive operations of our register machines are very +simple. For example, an operation might add the numbers fetched from +two registers, producing a result to be stored into a third register. +Such an operation can be performed by easily described hardware. In +order to deal with list structure, however, we will also use the +memory operations car, cdr, and cons, which require +an elaborate storage-allocation mechanism. In +section 5.3 we study their implementation in +terms of more elementary operations.

                                                                                    + +In section 5.4, after we have accumulated experience +formulating simple procedures as register machines, we will design a +machine that carries out the algorithm described by the metacircular +evaluator of section 4.1. This will fill in the gap in +our understanding of how Scheme expressions are interpreted, by +providing an explicit model for the mechanisms of control in the +evaluator. +In section 5.5 we will study a simple compiler that +translates Scheme programs into sequences of instructions that can be +executed directly with the registers and operations of the evaluator +register machine.

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-31.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-31.html new file mode 100644 index 00000000..8c8927ff --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-31.html @@ -0,0 +1,982 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    5.1  Designing Register Machines

                                                                                    + + + + +To design a register machine, we must design its data paths +(registers and operations) and the controller that sequences +these operations. To illustrate the design of a simple register +machine, let us examine Euclid's Algorithm, which is used to compute +the greatest common divisor (GCD) of two integers. As we saw in +section 1.2.5, Euclid's Algorithm can be carried out by an iterative +process, as specified by the following procedure:

                                                                                    + + +

                                                                                    (define (gcd a b)
                                                                                    +  (if (= b 0)
                                                                                    +      a
                                                                                    +      (gcd b (remainder a b))))
                                                                                    +

                                                                                    + +A machine to carry out this algorithm must keep track of two numbers, +a and b, so let us assume that these numbers are stored in two +registers with those names. The basic operations required are testing +whether the contents of register b is zero and computing the +remainder of the contents of register a divided by the contents +of register b. The remainder operation is a complex process, +but assume for the moment that we have a primitive device that +computes remainders. On each cycle of the GCD algorithm, the contents +of register a must be replaced by the contents of register b, and the contents of b must be replaced by the remainder of +the old contents of a divided by the old contents of b. +It would be convenient if these replacements could be done +simultaneously, but in our model of register machines we will assume +that only one register can be assigned a new value at each step. To +accomplish the replacements, our machine will use a third +``temporary'' register, which we call t. (First the remainder +will be placed in t, then the contents of b will be placed +in a, and finally the remainder stored in t will be placed +in b.)

                                                                                    + +We can illustrate the registers and operations required for this +machine by using the data-path diagram shown in +figure 5.1. In this +diagram, the registers (a, b, and t) are represented +by rectangles. Each way to assign a value to a register is +indicated by an arrow with an X behind the head, pointing from +the source of data to the register. We can think of the X as a +button that, when pushed, allows the value at the source to ``flow'' +into the designated register. The label next to each button is the +name we will use to refer to the button. The names are arbitrary, and +can be chosen to have mnemonic value (for example, a<-b denotes +pushing the button that assigns the contents of register b to +register a). The source of data for a register can be another +register (as in the a<-b assignment), an operation result (as in +the t<-r assignment), or a constant (a built-in value that +cannot be changed, represented in a data-path diagram by a triangle +containing the constant).

                                                                                    + +An operation that computes a value from constants and the contents +of registers is represented in a data-path diagram by a trapezoid +containing a name for the operation. For example, the box marked rem in figure 5.1 represents an +operation that computes the remainder of the contents of the +registers a and b to which it is attached. Arrows +(without buttons) point from the input registers and constants to the +box, and arrows connect the operation's output value to registers. +A test is represented by a circle containing a name for the test. For +example, our GCD machine has an operation that +tests whether the contents of register +b is zero. A test also has arrows from its input +registers and constants, but it has no output +arrows; its value is used by the controller rather than by the data +paths. Overall, the data-path diagram shows the registers and +operations that are required for the machine and how they must be +connected. If we view the arrows as wires and the X buttons as +switches, the data-path diagram is very like the wiring diagram for a +machine that could be constructed from electrical components.

                                                                                    + +

                                                                                    + +

                                                                                    +
                                                                                    Figure 5.1:  Data paths for a GCD machine.
                                                                                    + +

                                                                                    + +In order for the data paths to actually compute GCDs, the buttons must +be pushed in the correct sequence. We will describe this sequence in +terms of a controller diagram, as illustrated in +figure 5.2. The elements of the controller +diagram indicate how the +data-path components should be operated. The rectangular boxes in the +controller diagram identify data-path buttons to be pushed, and the +arrows describe the sequencing from one step to the next. The diamond +in the diagram represents a decision. One of the two sequencing +arrows will be followed, depending on the value of the data-path test +identified in the diamond. We can interpret the controller in terms +of a physical analogy: Think of the diagram as a maze in which a +marble is rolling. When the marble rolls into a box, it pushes the +data-path button that is named by the box. When the marble rolls into +a decision node (such as the test for b = 0), it leaves the +node on the path determined by the result of the indicated test. +Taken together, the data paths and the controller completely describe +a machine for computing GCDs. We start the controller (the rolling +marble) at the place marked start, after placing numbers in +registers a and b. When the controller reaches done, we will find the value of the GCD in register a. + +

                                                                                    + +
                                                                                    Figure 5.2:  Controller for a GCD machine.
                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 5.1.  Design a register machine to compute factorials using the iterative +algorithm specified by the following procedure. Draw data-path and +controller diagrams for this machine.

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (define (iter product counter)
                                                                                    +    (if (> counter n)
                                                                                    +        product
                                                                                    +        (iter (* counter product)
                                                                                    +              (+ counter 1))))
                                                                                    +  (iter 1 1))
                                                                                    +

                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    5.1.1  A Language for Describing Register Machines

                                                                                    + + + +Data-path and controller diagrams are adequate for representing simple +machines such as GCD, but they are unwieldy for describing large +machines such as a Lisp interpreter. To make it possible to deal with +complex machines, we will create a language that presents, in textual +form, all the information given by the data-path and controller +diagrams. We will start with a notation that directly mirrors the diagrams.

                                                                                    + +

                                                                                    + +We define the data paths of a machine by describing the registers and +the operations. To describe a register, we give it a name +and specify the buttons that control assignment to it. We give each +of these buttons a name and specify the source of the data that enters +the register under the button's control. (The source is a register, a +constant, or an operation.) +To describe an operation, we give +it a name and specify its inputs (registers or constants).

                                                                                    + +We define the controller of a machine as a sequence of instructions together with labels that identify entry +points in the sequence. An instruction is one of the following: +

                                                                                      +
                                                                                    • The name of a data-path button to push to assign a value to +a register. (This corresponds to a box in the controller diagram.)

                                                                                      + +

                                                                                    • A test instruction, that performs a specified test.

                                                                                      + +

                                                                                    • A conditional branch (branch instruction) to a +location indicated by a controller label, based on the result of the +previous test. (The test and branch together correspond to a diamond +in the controller diagram.) If the test is false, the controller +should continue with the next instruction in the sequence. Otherwise, +the controller should continue with the instruction after the label.

                                                                                      + +

                                                                                    • An unconditional branch (goto instruction) naming a +controller label at which to continue execution. +

                                                                                    +The machine starts at the beginning of the controller instruction +sequence and stops when execution reaches the end of the sequence. +Except when a branch changes the flow of control, instructions are +executed in the order in which they are listed.

                                                                                    + +

                                                                                    (data-paths
                                                                                    + (registers
                                                                                    +  ((name a)
                                                                                    +   (buttons ((name a<-b) (source (register b)))))
                                                                                    +  ((name b)
                                                                                    +   (buttons ((name b<-t) (source (register t)))))
                                                                                    +  ((name t)
                                                                                    +   (buttons ((name t<-r) (source (operation rem))))))
                                                                                    +
                                                                                    + (operations
                                                                                    +  ((name rem)
                                                                                    +   (inputs (register a) (register b)))
                                                                                    +  ((name =)
                                                                                    +   (inputs (register b) (constant 0)))))
                                                                                    +
                                                                                    +(controller
                                                                                    + test-b                           ; label
                                                                                    +   (test =)                       ; test
                                                                                    +   (branch (label gcd-done))      ; conditional branch
                                                                                    +   (t<-r)                         ; button push
                                                                                    +   (a<-b)                         ; button push
                                                                                    +   (b<-t)                         ; button push
                                                                                    +   (goto (label test-b))          ; unconditional branch
                                                                                    + gcd-done)                        ; label
                                                                                    +

                                                                                    +

                                                                                    Figure 5.3:  A specification of the GCD machine.
                                                                                    + +

                                                                                    + +Figure 5.3 shows the GCD machine described in +this way. This example only hints at the generality of these +descriptions, since the GCD machine is a very simple case: Each +register has only one button, and each button and test is used only +once in the controller.

                                                                                    + +Unfortunately, it is difficult to read such a description. In order +to understand the controller instructions we must constantly refer +back to the definitions of the button names and the operation names, +and to understand what the buttons do we may have to refer to the +definitions of the operation names. We will thus transform our +notation to combine the information from the data-path and controller +descriptions so that we see it all together.

                                                                                    + +To obtain this form of description, we will replace the arbitrary +button and operation names by the definitions of their behavior. That +is, instead of saying (in the controller) ``Push button t<-r'' +and separately saying (in the data paths) ``Button t<-r assigns +the value of the rem operation to register t'' and ``The +rem operation's inputs are the contents of registers +a and b,'' we will say (in the controller) ``Push the +button that assigns to register t the value of the rem +operation on the contents of registers a and b.'' +Similarly, instead of saying (in the controller) ``Perform the = test'' and separately saying (in the data paths) ``The = test operates on the contents of register b and the +constant 0,'' we will say ``Perform the = test on the +contents of register b and the constant 0.'' We will omit the +data-path description, leaving only the controller sequence. Thus, +the GCD machine is described as follows:

                                                                                    + +

                                                                                    (controller
                                                                                    + test-b
                                                                                    +   (test (op =) (reg b) (const 0))
                                                                                    +   (branch (label gcd-done))
                                                                                    +   (assign t (op rem) (reg a) (reg b))
                                                                                    +   (assign a (reg b))
                                                                                    +   (assign b (reg t))
                                                                                    +   (goto (label test-b))
                                                                                    + gcd-done)
                                                                                    +

                                                                                    + +This form of description is easier to read than the kind illustrated +in figure 5.3, but it also has disadvantages: + +

                                                                                      +

                                                                                      + +

                                                                                    • It is more verbose for large machines, +because complete descriptions of the data-path elements are repeated +whenever the elements are mentioned in the controller instruction +sequence. (This is not a problem in the GCD example, because each +operation and button is used only once.) Moreover, repeating the +data-path descriptions obscures the actual data-path structure of the +machine; it is not obvious for a large machine how many registers, +operations, and buttons there are and how they are interconnected.

                                                                                      + +

                                                                                    • Because the controller instructions in a machine definition +look like Lisp expressions, it is easy to forget that they are +not arbitrary Lisp expressions. They can notate only legal machine +operations. For example, operations can operate directly only on +constants and the contents of registers, not on the results of other +operations. +

                                                                                    +In spite of these disadvantages, we will use this register-machine +language throughout this chapter, because we will be more concerned with +understanding controllers than with understanding the elements and +connections in data paths. We should keep in mind, +however, that data-path design is crucial in designing real machines.

                                                                                    + +

                                                                                    +Exercise 5.2.  Use the register-machine language to describe +the iterative factorial machine of exercise 5.1. +

                                                                                    + + + +

                                                                                    Actions

                                                                                    + + +Let us modify the GCD machine so that we can type in the numbers +whose GCD we want and get the answer printed at our terminal. We will +not discuss how to make a machine that can read and print, but will +assume (as we do when we use read and display in Scheme) that +they are available as primitive operations.1

                                                                                    + +Read is like the operations we have been using in that it +produces a value that can be stored in a register. But read +does not take inputs from any registers; its value depends on +something that happens outside the parts of the machine we are +designing. We will allow our machine's operations to have such +behavior, and thus will draw and notate the use of read just as +we do any other operation that computes a value.

                                                                                    + +Print, on the other hand, differs from the operations we have +been using in a fundamental way: It does not produce an output value +to be stored in a register. Though it has an effect, this effect is +not on a part of the machine we are designing. We will refer to this +kind of operation as an action. We will represent an action in +a data-path diagram just as we represent an operation that computes a +value -- as a trapezoid that contains the name of the action. +Arrows point to the action box from any inputs (registers or +constants). We also associate a button with the action. Pushing the +button makes the action happen. To make a controller push an action +button we use a new kind of instruction called perform. Thus, +the action of printing the contents of register a is represented +in a controller sequence by the instruction

                                                                                    + +

                                                                                    (perform (op print) (reg a))
                                                                                    +

                                                                                    + +Figure 5.4 shows the data paths and controller for +the new GCD machine. Instead of having the machine stop after +printing the answer, we have made it start over, so that it repeatedly +reads a pair of numbers, computes their GCD, and prints the result. +This structure is like the driver loops we used in the interpreters of +chapter 4.

                                                                                    + +

                                                                                    +

                                                                                     (controller
                                                                                    +  gcd-loop
                                                                                    +    (assign a (op read))
                                                                                    +    (assign b (op read))
                                                                                    +  test-b
                                                                                    +    (test (op =) (reg b) (const 0))
                                                                                    +    (branch (label gcd-done))
                                                                                    +    (assign t (op rem) (reg a) (reg b))
                                                                                    +    (assign a (reg b))
                                                                                    +    (assign b (reg t))
                                                                                    +    (goto (label test-b))
                                                                                    +  gcd-done
                                                                                    +    (perform (op print) (reg a))
                                                                                    +    (goto (label gcd-loop)))
                                                                                    +

                                                                                    +

                                                                                    Figure 5.4:  A GCD machine that reads inputs and prints results.
                                                                                    + +

                                                                                    + + +

                                                                                    5.1.2  Abstraction in Machine Design

                                                                                    + + +We will often define a machine to include ``primitive'' operations that are +actually very complex. For example, in sections 5.4 and +5.5 we will treat Scheme's environment +manipulations as primitive. Such abstraction is valuable because it +allows us to ignore the details of parts of a machine so that we can +concentrate on other aspects of the design. The fact that we have +swept a lot of complexity under the rug, however, does not mean that a +machine design is unrealistic. We can always replace the complex +``primitives'' by simpler primitive operations.

                                                                                    + +Consider the GCD machine. The machine has an instruction that computes +the remainder of the contents of registers a and b and +assigns the result to register t. If we want to construct the +GCD machine without using a primitive remainder operation, +we must specify how to compute remainders in terms of simpler +operations, such as subtraction. Indeed, we can write a Scheme +procedure that finds remainders in this way:

                                                                                    + +

                                                                                    (define (remainder n d)
                                                                                    +  (if (< n d)
                                                                                    +      n
                                                                                    +      (remainder (- n d) d)))
                                                                                    +

                                                                                    +We can thus replace the remainder operation in the GCD machine's +data paths with a subtraction operation and a comparison test. +Figure 5.5 shows the data paths and controller +for the elaborated machine. +The instruction

                                                                                    + +

                                                                                    +
                                                                                    Figure 5.5:  Data paths and controller for the elaborated GCD machine.
                                                                                    + + +

                                                                                    + +

                                                                                    (assign t (op rem) (reg a) (reg b))
                                                                                    +

                                                                                    +in the GCD controller definition is replaced by a sequence of +instructions that contains a loop, as shown in +figure 5.6.

                                                                                    + +

                                                                                    (controller
                                                                                    + test-b
                                                                                    +   (test (op =) (reg b) (const 0))
                                                                                    +   (branch (label gcd-done))
                                                                                    +   (assign t (reg a))
                                                                                    + rem-loop
                                                                                    +   (test (op <) (reg t) (reg b))
                                                                                    +   (branch (label rem-done))
                                                                                    +   (assign t (op -) (reg t) (reg b))
                                                                                    +   (goto (label rem-loop))
                                                                                    + rem-done
                                                                                    +   (assign a (reg b))
                                                                                    +   (assign b (reg t))
                                                                                    +   (goto (label test-b))
                                                                                    + gcd-done)
                                                                                    +

                                                                                    +

                                                                                    Figure 5.6:  Controller instruction sequence for the GCD machine in +figure 5.5.
                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 5.3.  Design a machine to compute square roots using Newton's method, as +described in section 1.1.7:

                                                                                    + +

                                                                                    (define (sqrt x)
                                                                                    +  (define (good-enough? guess)
                                                                                    +    (< (abs (- (square guess) x)) 0.001))
                                                                                    +  (define (improve guess)
                                                                                    +    (average guess (/ x guess)))
                                                                                    +  (define (sqrt-iter guess)
                                                                                    +    (if (good-enough? guess)
                                                                                    +        guess
                                                                                    +        (sqrt-iter (improve guess))))
                                                                                    +  (sqrt-iter 1.0))
                                                                                    +

                                                                                    +Begin by assuming that good-enough? and improve operations +are available as primitives. Then show how to expand these in terms +of arithmetic operations. Describe each version of the sqrt +machine design by drawing a data-path diagram and writing a controller +definition in the register-machine language. +

                                                                                    +

                                                                                    + + +

                                                                                    5.1.3  Subroutines

                                                                                    + + + +When designing a machine to perform a computation, we would often +prefer to arrange for components to be shared by different parts of +the computation rather than duplicate the components. Consider a +machine that includes two GCD computations -- one that finds the GCD of +the contents of registers a and b and one that finds the +GCD of the contents of registers c and d. We might start +by assuming we have a primitive gcd operation, then expand the +two instances of gcd in terms of more primitive operations. +Figure 5.7 shows just the GCD portions of the +resulting machine's data paths, without showing how they connect to +the rest of the machine. The figure also shows the corresponding +portions of the machine's controller sequence.

                                                                                    + +

                                                                                    +

                                                                                    gcd-1
                                                                                    + (test (op =) (reg b) (const 0))
                                                                                    + (branch (label after-gcd-1))
                                                                                    + (assign t (op rem) (reg a) (reg b))
                                                                                    + (assign a (reg b))
                                                                                    + (assign b (reg t))
                                                                                    + (goto (label gcd-1))
                                                                                    +after-gcd-1
                                                                                    +    
                                                                                    +gcd-2
                                                                                    + (test (op =) (reg d) (const 0))
                                                                                    + (branch (label after-gcd-2))
                                                                                    + (assign s (op rem) (reg c) (reg d))
                                                                                    + (assign c (reg d))
                                                                                    + (assign d (reg s))
                                                                                    + (goto (label gcd-2))
                                                                                    +after-gcd-2
                                                                                    +

                                                                                    +

                                                                                    Figure 5.7:  Portions of the data paths and controller sequence for +a machine with two GCD computations.
                                                                                    + +

                                                                                    + +This machine has two remainder operation boxes and two boxes for +testing equality. If the duplicated components are complicated, as is the +remainder box, this will not be an economical way to build the +machine. We can avoid duplicating the data-path components by using +the same components for both GCD computations, provided that doing so +will not affect the rest of the larger machine's computation. If the +values in registers a and b are not needed by the time the +controller gets to gcd-2 (or if these values can be moved to +other registers for safekeeping), we can change the machine so that +it uses registers a and b, rather than registers c +and d, in computing the second GCD as well as the first. If we +do this, we obtain the controller sequence shown in +figure 5.8.

                                                                                    + +We have removed the duplicate data-path components +(so that the data paths are again as in figure 5.1), +but the controller +now has two GCD sequences that differ only in their entry-point +labels. It would be better to replace these two sequences by branches +to a single sequence -- a gcd subroutine -- at the end of +which we branch back to the correct place in the main instruction +sequence. We can accomplish this as follows: Before branching to gcd, we place a distinguishing value (such as 0 or 1) into a special +register, continue. At the end of the gcd subroutine we +return either to after-gcd-1 or to after-gcd-2, depending +on the value of the continue register. +Figure 5.9 shows the relevant portion of the +resulting controller sequence, which includes only a single copy of the +gcd instructions.

                                                                                    + +

                                                                                    gcd-1
                                                                                    + (test (op =) (reg b) (const 0))
                                                                                    + (branch (label after-gcd-1))
                                                                                    + (assign t (op rem) (reg a) (reg b))
                                                                                    + (assign a (reg b))
                                                                                    + (assign b (reg t))
                                                                                    + (goto (label gcd-1))
                                                                                    +after-gcd-1
                                                                                    +  
                                                                                    +gcd-2
                                                                                    + (test (op =) (reg b) (const 0))
                                                                                    + (branch (label after-gcd-2))
                                                                                    + (assign t (op rem) (reg a) (reg b))
                                                                                    + (assign a (reg b))
                                                                                    + (assign b (reg t))
                                                                                    + (goto (label gcd-2))
                                                                                    +after-gcd-2
                                                                                    +

                                                                                    +

                                                                                    Figure 5.8:  Portions of the controller sequence for a machine that +uses the same data-path components for two different GCD +computations.
                                                                                    + +

                                                                                    + +

                                                                                    gcd
                                                                                    + (test (op =) (reg b) (const 0))
                                                                                    + (branch (label gcd-done))
                                                                                    + (assign t (op rem) (reg a) (reg b))
                                                                                    + (assign a (reg b))
                                                                                    + (assign b (reg t))
                                                                                    + (goto (label gcd))
                                                                                    +gcd-done
                                                                                    + (test (op =) (reg continue) (const 0))       
                                                                                    + (branch (label after-gcd-1))
                                                                                    + (goto (label after-gcd-2))
                                                                                    +  
                                                                                    +;; Before branching to gcd from the first place where
                                                                                    +;; it is needed, we place 0 in the continue register
                                                                                    + (assign continue (const 0))
                                                                                    + (goto (label gcd))
                                                                                    +after-gcd-1
                                                                                    +  
                                                                                    +;; Before the second use of gcd, we place 1 in the continue register
                                                                                    + (assign continue (const 1))
                                                                                    + (goto (label gcd))
                                                                                    +after-gcd-2
                                                                                    +

                                                                                    +

                                                                                    Figure 5.9:  Using a continue register to avoid +the duplicate controller sequence in figure 5.8.
                                                                                    + +

                                                                                    + +

                                                                                    +

                                                                                    gcd
                                                                                    + (test (op =) (reg b) (const 0))
                                                                                    + (branch (label gcd-done))
                                                                                    + (assign t (op rem) (reg a) (reg b))
                                                                                    + (assign a (reg b))
                                                                                    + (assign b (reg t))
                                                                                    + (goto (label gcd))
                                                                                    +gcd-done
                                                                                    + (goto (reg continue))
                                                                                    +   
                                                                                    +;; Before calling gcd, we assign to continue
                                                                                    +;; the label to which gcd should return.
                                                                                    + (assign continue (label after-gcd-1))
                                                                                    + (goto (label gcd))
                                                                                    +after-gcd-1
                                                                                    +   
                                                                                    +;; Here is the second call to gcd, with a different continuation.
                                                                                    + (assign continue (label after-gcd-2))
                                                                                    + (goto (label gcd))
                                                                                    +after-gcd-2
                                                                                    +

                                                                                    +

                                                                                    Figure 5.10:  Assigning labels to the continue register simplifies +and generalizes the strategy shown in figure 5.9.
                                                                                    + +

                                                                                    + +This is a reasonable approach for handling small problems, but it +would be awkward if there were many instances of GCD computations in +the controller sequence. To decide where to continue executing after +the gcd subroutine, we would need tests in the data paths and +branch instructions in the controller for all the places that use gcd. A more powerful method for implementing subroutines is to have +the continue register hold the label of the entry point in the +controller sequence at which execution should continue when the +subroutine is finished. Implementing this strategy requires a new +kind of connection between the data paths and the controller of a +register machine: There must be a way to assign to a register a label +in the controller sequence in such a way that this value can be fetched +from the register and used to continue execution at the designated +entry point.

                                                                                    + +To reflect this ability, we will extend the assign +instruction of the register-machine language to allow a register to be +assigned as value a label from the controller sequence (as a special +kind of constant). We will also extend the goto instruction to +allow execution to continue at the entry point described by the +contents of a register rather than only at an entry point described by +a constant label. Using these new constructs we can terminate the +gcd subroutine with a branch to the location stored in the continue register. This leads to the controller sequence shown in +figure 5.10.

                                                                                    + +A machine with more than one subroutine could use multiple +continuation registers (e.g., gcd-continue, factorial-continue) or we could have all subroutines share a single +continue register. Sharing is more economical, but we must be +careful if we have a subroutine (sub1) that calls another +subroutine (sub2). Unless sub1 saves the contents of continue in some other register before setting up continue for +the call to sub2, sub1 will not know where to go when it +is finished. The mechanism developed in the next section to handle +recursion also provides a better solution to this problem of nested +subroutine calls. +

                                                                                    + + +

                                                                                    5.1.4  Using a Stack to Implement Recursion

                                                                                    + + + +With the ideas illustrated so far, we can implement any iterative +process by specifying a register machine that has a register +corresponding to each state variable of the process. The machine +repeatedly executes a controller loop, changing the contents +of the registers, until some termination condition is satisfied. At +each point in the controller sequence, the state of the machine +(representing the state of the iterative process) is completely +determined by the contents of the registers (the values of the state +variables).

                                                                                    + + +Implementing recursive processes, however, requires an additional +mechanism. Consider the following recursive method for computing +factorials, which we first examined in +section 1.2.1:

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* (factorial (- n 1)) n)))
                                                                                    +

                                                                                    +As we see from the procedure, computing n! requires computing +(n - 1)!. Our GCD machine, modeled on the procedure

                                                                                    + +

                                                                                    (define (gcd a b)
                                                                                    +  (if (= b 0)
                                                                                    +      a
                                                                                    +      (gcd b (remainder a b))))
                                                                                    +

                                                                                    +similarly had to compute another GCD. But there is an important +difference between the gcd procedure, which reduces the original +computation to a new GCD computation, and factorial, which +requires computing another factorial as a subproblem. In GCD, the +answer to the new GCD computation is the answer to the original +problem. To compute the next GCD, we simply place the new arguments +in the input registers of the GCD machine and reuse the +machine's data paths by executing the same controller sequence. When +the machine is finished solving the final GCD problem, it has +completed the entire computation.

                                                                                    + +In the case of factorial (or any recursive process) the answer to the +new factorial subproblem is not the answer to the original problem. +The value obtained for (n - 1)! must be multiplied by n to get the +final answer. If we try to imitate the GCD design, and solve +the factorial subproblem by decrementing the n register and +rerunning the factorial machine, we will no longer have available the +old value of n by which to multiply the result. We thus need a +second factorial machine to work on the subproblem. This second +factorial computation itself has a factorial subproblem, which +requires a third factorial machine, and so on. Since each factorial +machine contains another factorial machine within it, the total +machine contains an infinite nest of similar machines and hence cannot +be constructed from a fixed, finite number of parts.

                                                                                    + +Nevertheless, we can implement the factorial process as a register +machine if we can arrange to use the same components for each nested +instance of the machine. Specifically, the machine that computes n! +should use the same components to work on the subproblem of computing +(n - 1)!, on the subproblem for (n - 2)!, and so on. This is +plausible because, although the factorial process dictates that an +unbounded number of copies of the same machine are needed to perform a +computation, only one of these copies needs to be active at any given +time. When the machine encounters a recursive subproblem, it can +suspend work on the main problem, reuse the same physical parts to +work on the subproblem, then continue the suspended computation.

                                                                                    + +In the subproblem, the contents of the registers will be different +than they were in the main problem. (In this case the n register +is decremented.) In order to be able to continue the suspended +computation, the machine must save the contents of any registers that +will be needed after the subproblem is solved so that these can be +restored to continue the suspended computation. In the case of +factorial, we will save the old value of n, to be restored when +we are finished computing the factorial of the decremented n +register.2

                                                                                    + +Since there is no a priori limit on the depth of nested +recursive calls, we may need to save an arbitrary number of register +values. These values must be restored in the reverse of the order in +which they were saved, since in a nest of recursions the last +subproblem to be entered is the first to be finished. This dictates +the use of a stack, or ``last in, first out'' data structure, to +save register values. We can extend the register-machine language to +include a stack by adding two kinds of instructions: Values are placed +on the stack using a save instruction and restored from the +stack using a restore instruction. After a sequence of values +has been saved on the stack, a sequence of restores will +retrieve these values in reverse order.3

                                                                                    + + +With the aid of the stack, we can reuse a single copy of the factorial +machine's data paths for each factorial subproblem. There is a +similar design issue in reusing the controller sequence that operates +the data paths. To reexecute the factorial computation, the +controller cannot simply loop back to the beginning, as with +an iterative process, because after solving the (n - 1)! subproblem +the machine must still multiply the result by n. The controller +must suspend its computation of n!, solve the (n - 1)! subproblem, +then continue its computation of n!. This view of the factorial +computation suggests the use of the subroutine mechanism described in +section 5.1.3, which has the controller use a +continue register to transfer to the part of the sequence that +solves a subproblem and then continue where it left off on the main +problem. We can thus make a factorial subroutine that returns to the +entry point stored in the continue register. Around each subroutine +call, we save and restore continue just as we do the n +register, since each ``level'' of the factorial computation will use +the same continue register. That is, the factorial subroutine +must put a new value in continue when it calls itself for a +subproblem, but it will need the old value in order to return to the +place that called it to solve a subproblem.

                                                                                    + + +Figure 5.11 shows the data paths and controller for +a machine that implements the recursive factorial procedure. +The machine has a stack and three registers, called n, val, and continue. To simplify the data-path diagram, we have +not named the register-assignment buttons, only the stack-operation +buttons (sc and sn to save registers, rc and rn to restore registers). To operate the machine, we put in register +n the number whose factorial we wish to compute and start the +machine. When the machine reaches fact-done, the computation is +finished and the answer will be found in the val register. In +the controller sequence, n and continue are saved before +each recursive call and restored upon return from the call. Returning +from a call is accomplished by branching to the location stored in +continue. Continue is initialized when the machine starts +so that the last return will go to fact-done. The val +register, which holds the result of the factorial computation, is not +saved before the recursive call, because the old contents of val +is not useful after the subroutine returns. Only the new value, which +is the value produced by the subcomputation, is needed. + +Although in principle the factorial computation requires an infinite +machine, the machine in figure 5.11 is actually +finite except for the stack, which is potentially unbounded. Any +particular physical implementation of a stack, however, will be of +finite size, and this will limit the depth of recursive calls that can +be handled by the machine. This implementation of factorial +illustrates the general strategy for realizing recursive algorithms as +ordinary register machines augmented by stacks. When a recursive +subproblem is encountered, we save on the stack the registers whose +current values will be required after the subproblem is solved, solve +the recursive subproblem, then restore the saved registers and +continue execution on the main problem. The continue register +must always be saved. Whether there are other registers that need to +be saved depends on the particular machine, since not all recursive +computations need the original values of registers that are modified +during solution of the subproblem (see exercise 5.4).

                                                                                    + + +

                                                                                    A double recursion

                                                                                    + +Let us examine a more complex recursive process, the tree-recursive +computation of the Fibonacci numbers, which we introduced in +section 1.2.2: +

                                                                                    (define (fib n)
                                                                                    +  (if (< n 2)
                                                                                    +      n
                                                                                    +      (+ (fib (- n 1)) (fib (- n 2)))))
                                                                                    +

                                                                                    +Just as with factorial, we can implement the recursive Fibonacci +computation as a register machine with registers n, val, +and continue. The machine is more complex than the one for +factorial, because there are two places in the controller sequence +where we need to perform recursive calls -- once to compute Fib(n - 1) +and once to compute Fib(n - 2). To set up for each of these calls, we +save the registers whose values will be needed later, set the n +register to the number whose Fib we need to compute recursively (n - 1 +or n - 2), and assign to continue the entry point in the main sequence +to which to return (afterfib-n-1 or afterfib-n-2, +respectively). We then go to fib-loop. When we return from the +recursive call, the answer is in val. +Figure 5.12 shows the controller sequence for this +machine.

                                                                                    + +

                                                                                    +

                                                                                    (controller
                                                                                    +   (assign continue (label fact-done))     ; set up final return address
                                                                                    + fact-loop
                                                                                    +   (test (op =) (reg n) (const 1))
                                                                                    +   (branch (label base-case))
                                                                                    +   ;; Set up for the recursive call by saving n and continue.
                                                                                    +   ;; Set up continue so that the computation will continue
                                                                                    +   ;; at after-fact when the subroutine returns.
                                                                                    +   (save continue)
                                                                                    +   (save n)
                                                                                    +   (assign n (op -) (reg n) (const 1))
                                                                                    +   (assign continue (label after-fact))
                                                                                    +   (goto (label fact-loop))
                                                                                    + after-fact
                                                                                    +   (restore n)
                                                                                    +   (restore continue)
                                                                                    +   (assign val (op *) (reg n) (reg val))   val now contains n(n - 1)!
                                                                                    +   (goto (reg continue))                   ; return to caller
                                                                                    + base-case
                                                                                    +   (assign val (const 1))                  ; base case: 1! = 1
                                                                                    +   (goto (reg continue))                   ; return to caller
                                                                                    + fact-done)
                                                                                    +

                                                                                    +

                                                                                    Figure 5.11:  A recursive factorial machine.
                                                                                    + +

                                                                                    + +

                                                                                    (controller
                                                                                    +   (assign continue (label fib-done))
                                                                                    + fib-loop
                                                                                    +   (test (op <) (reg n) (const 2))
                                                                                    +   (branch (label immediate-answer))
                                                                                    +   ;; set up to compute Fib(n - 1)
                                                                                    +   (save continue)
                                                                                    +   (assign continue (label afterfib-n-1))
                                                                                    +   (save n)                           ; save old value of n
                                                                                    +   (assign n (op -) (reg n) (const 1)); clobber n to n - 1
                                                                                    +   (goto (label fib-loop))            ; perform recursive call
                                                                                    + afterfib-n-1                         ; upon return, val contains Fib(n - 1)
                                                                                    +   (restore n)
                                                                                    +   (restore continue)
                                                                                    +   ;; set up to compute Fib(n - 2)
                                                                                    +   (assign n (op -) (reg n) (const 2))
                                                                                    +   (save continue)
                                                                                    +   (assign continue (label afterfib-n-2))
                                                                                    +   (save val)                         ; save Fib(n - 1)
                                                                                    +   (goto (label fib-loop))
                                                                                    + afterfib-n-2                         ; upon return, val contains Fib(n - 2)
                                                                                    +   (assign n (reg val))               n now contains Fib(n - 2)
                                                                                    +   (restore val)                      val now contains Fib(n - 1)
                                                                                    +   (restore continue)
                                                                                    +   (assign val                        ;  Fib(n - 1) +  Fib(n - 2)
                                                                                    +           (op +) (reg val) (reg n)) 
                                                                                    +   (goto (reg continue))              ; return to caller, answer is in val
                                                                                    + immediate-answer
                                                                                    +   (assign val (reg n))               ; base case:  Fib(n) = n
                                                                                    +   (goto (reg continue))
                                                                                    + fib-done)
                                                                                    +

                                                                                    +

                                                                                    Figure 5.12:  Controller for a machine to compute Fibonacci +numbers.
                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 5.4.  Specify register machines that implement each of the following +procedures. For each machine, write a controller instruction sequence +and draw a diagram showing the data paths.

                                                                                    + +

                                                                                    a. Recursive exponentiation:

                                                                                    + +

                                                                                    (define (expt b n)
                                                                                    +  (if (= n 0)
                                                                                    +      1
                                                                                    +      (* b (expt b (- n 1)))))
                                                                                    +

                                                                                    +

                                                                                    b. Iterative exponentiation:

                                                                                    + +

                                                                                    (define (expt b n)
                                                                                    +  (define (expt-iter counter product)
                                                                                    +    (if (= counter 0)
                                                                                    +        product
                                                                                    +        (expt-iter (- counter 1) (* b product))))
                                                                                    +  (expt-iter n 1))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.5.  Hand-simulate the factorial and Fibonacci machines, using some +nontrivial input (requiring execution of at least one recursive call). +Show the contents of the stack at each significant point in the +execution. + +

                                                                                    + +

                                                                                    +Exercise 5.6.  Ben Bitdiddle observes that the Fibonacci machine's controller sequence +has an extra save and an extra restore, which can be +removed to make a faster machine. Where are these instructions? +

                                                                                    + + +

                                                                                    5.1.5  Instruction Summary

                                                                                    + + +A controller instruction in our register-machine language +has one of the following forms, where each +<inputi> is either (reg <register-name>) +or (const <constant-value>). +

                                                                                    + +These instructions were introduced in +section 5.1.1: +

                                                                                    (assign <register-name> (reg <register-name>))
                                                                                    +
                                                                                    +(assign <register-name> (const <constant-value>))
                                                                                    +
                                                                                    +(assign <register-name> (op <operation-name>) <input1... <inputn>)
                                                                                    +
                                                                                    +(perform (op <operation-name>) <input1... <inputn>)
                                                                                    +
                                                                                    +(test (op <operation-name>) <input1... <inputn>)
                                                                                    +
                                                                                    +(branch (label <label-name>))
                                                                                    +
                                                                                    +(goto (label <label-name>))
                                                                                    +

                                                                                    +

                                                                                    + +The use of registers to hold labels was introduced in +section 5.1.3: +

                                                                                    (assign <register-name> (label <label-name>))
                                                                                    +
                                                                                    +(goto (reg <register-name>))
                                                                                    +

                                                                                    + +Instructions to use the stack were introduced in +section 5.1.4: +

                                                                                    (save <register-name>)
                                                                                    +
                                                                                    +(restore <register-name>)
                                                                                    +

                                                                                    + +The only kind of <constant-value> we have seen so far is a number, +but later we will use strings, symbols, and lists. +For example, +(const "abc") is the string "abc", +(const abc) is the symbol abc, +(const (a b c)) is the list (a b c), +and (const ()) is the empty list. +

                                                                                    + +


                                                                                    +

                                                                                    1 This assumption +glosses over a great deal of complexity. Usually a large portion of +the implementation of a Lisp system is dedicated to making reading +and printing work. + +

                                                                                    2 One might argue that we don't need to save the old +n; after we decrement it and solve the subproblem, we could +simply increment it to recover the old value. Although this strategy +works for factorial, it cannot work in general, since the old value of +a register cannot always be computed from the new one. + +

                                                                                    3 In +section 5.3 we will see how to implement a +stack in terms of more primitive operations. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-32.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-32.html new file mode 100644 index 00000000..50860dfb --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-32.html @@ -0,0 +1,1014 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    5.2  A Register-Machine Simulator

                                                                                    + + + +In order to gain a good understanding of the design of register +machines, we must test the machines we design to see if they perform +as expected. One way to test a design is to hand-simulate the +operation of the controller, as in exercise 5.5. But this is +extremely tedious for all but the simplest machines. In this section +we construct a simulator for machines described in the +register-machine language. The simulator is a Scheme program with +four interface procedures. The first uses a description of a register +machine to construct a model of the machine (a data structure whose +parts correspond to the parts of the machine to be simulated), and the +other three allow us to simulate the machine by manipulating the +model:

                                                                                    + +

                                                                                    +

                                                                                    (make-machine <register-names> <operations> <controller>)
                                                                                    +constructs and returns a model of the machine with the given +registers, operations, and controller.

                                                                                    + +

                                                                                    (set-register-contents! <machine-model> <register-name> <value>)
                                                                                    +stores a value in a simulated register in the given +machine.

                                                                                    + +

                                                                                    (get-register-contents <machine-model> <register-name>)
                                                                                    +returns the contents of a simulated register in the given machine.

                                                                                    + +

                                                                                    (start <machine-model>)
                                                                                    +simulates the execution of the given +machine, starting from the beginning of the controller sequence and +stopping when it reaches the end of the sequence. +

                                                                                    + +As an example of how these procedures are used, we can define +gcd-machine to be a model of the GCD machine +of section 5.1.1 as follows:

                                                                                    + +

                                                                                    (define gcd-machine
                                                                                    +  (make-machine
                                                                                    +   '(a b t)
                                                                                    +   (list (list 'rem remainder) (list '= =))
                                                                                    +   '(test-b
                                                                                    +       (test (op =) (reg b) (const 0))
                                                                                    +       (branch (label gcd-done))
                                                                                    +       (assign t (op rem) (reg a) (reg b))
                                                                                    +       (assign a (reg b))
                                                                                    +       (assign b (reg t))
                                                                                    +       (goto (label test-b))
                                                                                    +     gcd-done)))
                                                                                    +

                                                                                    +The first argument to make-machine is a list of register names. +The next argument is a table (a list of two-element lists) that pairs +each operation name with a Scheme procedure that implements the operation +(that is, produces the same output value given the same input values). +The last argument specifies the controller as a list of labels and +machine instructions, as in section 5.1.

                                                                                    + + +To compute GCDs with this machine, we set the +input registers, start the machine, and examine the result when the +simulation terminates: +

                                                                                    (set-register-contents! gcd-machine 'a 206)
                                                                                    +done
                                                                                    +(set-register-contents! gcd-machine 'b 40)
                                                                                    +done
                                                                                    +(start gcd-machine)
                                                                                    +done
                                                                                    +(get-register-contents gcd-machine 'a)
                                                                                    +2
                                                                                    +

                                                                                    +This computation will run much more slowly than a gcd procedure +written in Scheme, because we will simulate low-level machine +instructions, such as assign, by much more complex operations.

                                                                                    + +

                                                                                    +Exercise 5.7.  Use the simulator to test the machines you designed in +exercise 5.4. +

                                                                                    + + +

                                                                                    5.2.1  The Machine Model

                                                                                    + +

                                                                                    + +The machine model generated by make-machine is represented as a +procedure with local state using the message-passing techniques +developed in chapter 3. To build this model, make-machine +begins by calling the procedure make-new-machine to construct +the parts of the machine model that are common to all register +machines. This basic machine model constructed by make-new-machine is essentially a container for some registers and a +stack, together with an execution mechanism that processes the controller +instructions one by one.

                                                                                    + +Make-machine then extends this basic model (by sending it +messages) to include the registers, operations, and controller of the +particular machine being defined. First it allocates a register in +the new machine for each of the supplied register names and installs +the designated operations in the machine. Then it uses an assembler (described below in section 5.2.2) to +transform the controller list into instructions for the new machine +and installs these as the machine's instruction sequence. Make-machine returns as its value the modified machine model.

                                                                                    + +

                                                                                    (define (make-machine register-names ops controller-text)
                                                                                    +  (let ((machine (make-new-machine)))
                                                                                    +    (for-each (lambda (register-name)
                                                                                    +                ((machine 'allocate-register) register-name))
                                                                                    +              register-names)
                                                                                    +    ((machine 'install-operations) ops)    
                                                                                    +    ((machine 'install-instruction-sequence)
                                                                                    +     (assemble controller-text machine))
                                                                                    +    machine))
                                                                                    +

                                                                                    + + +

                                                                                    Registers

                                                                                    + + +We will represent a register as a procedure with local state, as in +chapter 3. The procedure make-register creates a register that +holds a value that can be accessed or changed:

                                                                                    + +

                                                                                    (define (make-register name)
                                                                                    +  (let ((contents '*unassigned*))
                                                                                    +    (define (dispatch message)
                                                                                    +      (cond ((eq? message 'get) contents)
                                                                                    +            ((eq? message 'set)
                                                                                    +             (lambda (value) (set! contents value)))
                                                                                    +            (else
                                                                                    +             (error "Unknown request -- REGISTER" message))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +The following procedures are used to access registers:

                                                                                    + +

                                                                                    (define (get-contents register)
                                                                                    +  (register 'get))
                                                                                    +
                                                                                    +(define (set-contents! register value)
                                                                                    +  ((register 'set) value))
                                                                                    +

                                                                                    + + +

                                                                                    The stack

                                                                                    + + +We can also represent a stack as a procedure with local state. The +procedure make-stack creates a stack whose local state consists +of a list of the items on the stack. A stack accepts requests to push an item onto the stack, to pop the top item off the stack +and return it, and to initialize the stack to empty.

                                                                                    + +

                                                                                    (define (make-stack)
                                                                                    +  (let ((s '()))
                                                                                    +    (define (push x)
                                                                                    +      (set! s (cons x s)))
                                                                                    +    (define (pop)
                                                                                    +      (if (null? s)
                                                                                    +          (error "Empty stack -- POP")
                                                                                    +          (let ((top (car s)))
                                                                                    +            (set! s (cdr s))
                                                                                    +            top)))
                                                                                    +    (define (initialize)
                                                                                    +      (set! s '())
                                                                                    +      'done)
                                                                                    +    (define (dispatch message)
                                                                                    +      (cond ((eq? message 'push) push)
                                                                                    +            ((eq? message 'pop) (pop))
                                                                                    +            ((eq? message 'initialize) (initialize))
                                                                                    +            (else (error "Unknown request -- STACK"
                                                                                    +                         message))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +The following procedures are used to access stacks:

                                                                                    + +

                                                                                    (define (pop stack)
                                                                                    +  (stack 'pop))
                                                                                    +
                                                                                    +(define (push stack value)
                                                                                    +  ((stack 'push) value))
                                                                                    +

                                                                                    + + +

                                                                                    The basic machine

                                                                                    + +The make-new-machine procedure, shown in +figure 5.13, constructs an object whose local +state consists of a stack, an initially empty instruction sequence, a +list of operations that initially contains an operation to initialize +the stack, and a register table that initially contains two +registers, named flag and pc (for ``program counter''). +The internal procedure allocate-register adds new entries to the +register table, and the internal procedure lookup-register looks +up registers in the table.

                                                                                    + + +The flag register is used to control branching in the simulated +machine. Test instructions set the contents of flag to +the result of the test (true or false). Branch instructions +decide whether or not to branch by examining the contents of flag.

                                                                                    + +The pc register determines the sequencing of instructions as +the machine runs. This sequencing is implemented by the internal +procedure execute. +In the simulation model, each machine instruction is a data structure +that includes a procedure of no arguments, called the instruction +execution procedure, such that calling this procedure simulates +executing the instruction. As the simulation runs, pc points to +the place in the instruction sequence beginning with the next +instruction to be executed. Execute gets that instruction, +executes it by calling the instruction execution procedure, and +repeats this cycle until there are no more instructions to execute +(i.e., until pc points to the end of the instruction sequence).

                                                                                    + +

                                                                                    (define (make-new-machine)
                                                                                    +  (let ((pc (make-register 'pc))
                                                                                    +        (flag (make-register 'flag))
                                                                                    +        (stack (make-stack))
                                                                                    +        (the-instruction-sequence '()))
                                                                                    +    (let ((the-ops
                                                                                    +           (list (list 'initialize-stack
                                                                                    +                       (lambda () (stack 'initialize)))))
                                                                                    +          (register-table
                                                                                    +           (list (list 'pc pc) (list 'flag flag))))
                                                                                    +      (define (allocate-register name)
                                                                                    +        (if (assoc name register-table)
                                                                                    +            (error "Multiply defined register: " name)
                                                                                    +            (set! register-table
                                                                                    +                  (cons (list name (make-register name))
                                                                                    +                        register-table)))
                                                                                    +        'register-allocated)
                                                                                    +      (define (lookup-register name)
                                                                                    +        (let ((val (assoc name register-table)))
                                                                                    +          (if val
                                                                                    +              (cadr val)
                                                                                    +              (error "Unknown register:" name))))
                                                                                    +      (define (execute)
                                                                                    +        (let ((insts (get-contents pc)))
                                                                                    +          (if (null? insts)
                                                                                    +              'done
                                                                                    +              (begin
                                                                                    +                ((instruction-execution-proc (car insts)))
                                                                                    +                (execute)))))
                                                                                    +      (define (dispatch message)
                                                                                    +        (cond ((eq? message 'start)
                                                                                    +               (set-contents! pc the-instruction-sequence)
                                                                                    +               (execute))
                                                                                    +              ((eq? message 'install-instruction-sequence)
                                                                                    +               (lambda (seq) (set! the-instruction-sequence seq)))
                                                                                    +              ((eq? message 'allocate-register) allocate-register)
                                                                                    +              ((eq? message 'get-register) lookup-register)
                                                                                    +              ((eq? message 'install-operations)
                                                                                    +               (lambda (ops) (set! the-ops (append the-ops ops))))
                                                                                    +              ((eq? message 'stack) stack)
                                                                                    +              ((eq? message 'operations) the-ops)
                                                                                    +              (else (error "Unknown request -- MACHINE" message))))
                                                                                    +      dispatch)))
                                                                                    +

                                                                                    +

                                                                                    Figure 5.13:  The make-new-machine procedure, which implements +the basic machine model.
                                                                                    + +

                                                                                    + +As part of its operation, each instruction execution procedure +modifies pc to indicate the next instruction to be executed. +Branch and goto instructions change pc to point to +the new destination. All other instructions simply advance pc, +making it point to the next instruction in the sequence. Observe that +each call to execute calls execute again, but this does +not produce an infinite loop because running the instruction execution +procedure changes the contents of pc.

                                                                                    + +Make-new-machine returns a +dispatch procedure that implements message-passing +access to the internal state. Notice that starting the machine is +accomplished by setting pc to the beginning of the instruction +sequence and calling execute.

                                                                                    + +For convenience, we provide an alternate procedural interface to a +machine's start operation, +as well as procedures to set and examine register contents, +as specified at the beginning of section 5.2:

                                                                                    + +

                                                                                    (define (start machine)
                                                                                    +  (machine 'start))
                                                                                    +(define (get-register-contents machine register-name)
                                                                                    +  (get-contents (get-register machine register-name)))
                                                                                    +(define (set-register-contents! machine register-name value)
                                                                                    +  (set-contents! (get-register machine register-name) value)
                                                                                    +  'done)
                                                                                    +

                                                                                    +These procedures (and many procedures in sections 5.2.2 +and 5.2.3) use the following to look up the register with a +given name in a given machine: +

                                                                                    (define (get-register machine reg-name)
                                                                                    +  ((machine 'get-register) reg-name))
                                                                                    +

                                                                                    + +

                                                                                    + + +

                                                                                    5.2.2  The Assembler

                                                                                    + + + +The assembler transforms the sequence of controller expressions for a +machine into a corresponding list of machine instructions, each with +its execution procedure. Overall, the assembler is much like the +evaluators we studied in chapter 4 -- there is an input language (in +this case, the register-machine language) and we must perform an +appropriate action for each type of expression in the language.

                                                                                    + +The technique of producing an execution procedure for each instruction +is just what we used in section 4.1.7 to speed +up the evaluator by separating analysis from runtime execution. As we +saw in chapter 4, much useful analysis of Scheme expressions could be +performed without knowing the actual values of variables. Here, +analogously, much useful analysis of register-machine-language +expressions can be performed without knowing the actual contents of +machine registers. For example, we can replace references to +registers by pointers to the register objects, and we can +replace references to labels by pointers to the place in the +instruction sequence that the label designates.

                                                                                    + +Before it can generate the instruction execution procedures, the +assembler must know what all the labels refer to, so it begins by +scanning the controller text to separate the labels from the +instructions. As it scans the text, it constructs both a list of +instructions and a table that associates each label with a pointer +into that list. Then the assembler augments the instruction list by +inserting the execution procedure for each instruction.

                                                                                    + +The assemble procedure is the main entry to the assembler. +It takes the controller text and the machine model as arguments and +returns the instruction sequence to be stored in the model. +Assemble calls extract-labels to build the initial instruction list +and label table from the supplied controller text. The second argument +to extract-labels is a procedure to be called to process these results: +This procedure uses update-insts! to generate the instruction execution +procedures and insert them into the instruction list, +and returns the modified list. +

                                                                                    (define (assemble controller-text machine)
                                                                                    +  (extract-labels controller-text
                                                                                    +    (lambda (insts labels)
                                                                                    +      (update-insts! insts labels machine)
                                                                                    +      insts)))
                                                                                    +

                                                                                    + +Extract-labels +takes as arguments a list text (the sequence of controller +instruction expressions) and a receive procedure. Receive +will be called with two values: (1) a list insts of instruction +data structures, each containing an instruction from text; and +(2) a table called labels, which associates each label from text +with the position in the list insts that the label designates.

                                                                                    + +

                                                                                    (define (extract-labels text receive)
                                                                                    +  (if (null? text)
                                                                                    +      (receive '() '())
                                                                                    +      (extract-labels (cdr text)
                                                                                    +       (lambda (insts labels)
                                                                                    +         (let ((next-inst (car text)))
                                                                                    +           (if (symbol? next-inst)
                                                                                    +               (receive insts
                                                                                    +                        (cons (make-label-entry next-inst
                                                                                    +                                                insts)
                                                                                    +                              labels))
                                                                                    +               (receive (cons (make-instruction next-inst)
                                                                                    +                              insts)
                                                                                    +                        labels)))))))
                                                                                    +

                                                                                    +Extract-labels works by sequentially scanning the elements of +the text and accumulating the insts and the labels. +If an element is a symbol (and thus a label) an appropriate entry is +added to the labels table. Otherwise the element is accumulated +onto the insts list.4

                                                                                    + +Update-insts! modifies the instruction list, which initially +contains only the text of the instructions, to include the +corresponding execution procedures:

                                                                                    + + +

                                                                                    (define (update-insts! insts labels machine)
                                                                                    +  (let ((pc (get-register machine 'pc))
                                                                                    +        (flag (get-register machine 'flag))
                                                                                    +        (stack (machine 'stack))
                                                                                    +        (ops (machine 'operations)))
                                                                                    +    (for-each
                                                                                    +     (lambda (inst)
                                                                                    +       (set-instruction-execution-proc! 
                                                                                    +        inst
                                                                                    +        (make-execution-procedure
                                                                                    +         (instruction-text inst) labels machine
                                                                                    +         pc flag stack ops)))
                                                                                    +     insts)))
                                                                                    +

                                                                                    + + +The machine instruction data structure simply pairs the +instruction text with the corresponding execution procedure. +The execution procedure is not yet available when extract-labels +constructs the instruction, and is inserted later by update-insts!. + +

                                                                                    (define (make-instruction text)
                                                                                    +  (cons text '()))
                                                                                    +(define (instruction-text inst)
                                                                                    +  (car inst))
                                                                                    +(define (instruction-execution-proc inst)
                                                                                    +  (cdr inst))
                                                                                    +(define (set-instruction-execution-proc! inst proc)
                                                                                    +  (set-cdr! inst proc))
                                                                                    +

                                                                                    +The instruction text is not used by our simulator, but it is handy to keep +around for debugging (see exercise 5.16).

                                                                                    + +Elements of the label table are pairs: + +

                                                                                    (define (make-label-entry label-name insts)
                                                                                    +  (cons label-name insts))
                                                                                    +

                                                                                    +Entries will be looked up in the table with + +

                                                                                    (define (lookup-label labels label-name)
                                                                                    +  (let ((val (assoc label-name labels)))
                                                                                    +    (if val
                                                                                    +        (cdr val)
                                                                                    +        (error "Undefined label -- ASSEMBLE" label-name))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.8.  The following register-machine code is ambiguous, because the label +here is defined more than once: +

                                                                                    start
                                                                                    +  (goto (label here))
                                                                                    +here
                                                                                    +  (assign a (const 3))
                                                                                    +  (goto (label there))
                                                                                    +here
                                                                                    +  (assign a (const 4))
                                                                                    +  (goto (label there))
                                                                                    +there
                                                                                    +

                                                                                    +With the simulator as written, what will the contents of register a +be when control reaches there? Modify the extract-labels +procedure so that the assembler will signal an error if the same label +name is used to indicate two different locations. +

                                                                                    +

                                                                                    + + +

                                                                                    5.2.3  Generating Execution Procedures for Instructions

                                                                                    + + + +The assembler calls make-execution-procedure to +generate the execution procedure for an instruction. +Like the analyze procedure in the evaluator of +section 4.1.7, this dispatches on the type of +instruction to generate the appropriate execution procedure. +

                                                                                    (define (make-execution-procedure inst labels machine
                                                                                    +                                  pc flag stack ops)
                                                                                    +  (cond ((eq? (car inst) 'assign)
                                                                                    +         (make-assign inst machine labels ops pc))
                                                                                    +        ((eq? (car inst) 'test)
                                                                                    +         (make-test inst machine labels ops flag pc))
                                                                                    +        ((eq? (car inst) 'branch)
                                                                                    +         (make-branch inst machine labels flag pc))
                                                                                    +        ((eq? (car inst) 'goto)
                                                                                    +         (make-goto inst machine labels pc))
                                                                                    +        ((eq? (car inst) 'save)
                                                                                    +         (make-save inst machine stack pc))
                                                                                    +        ((eq? (car inst) 'restore)
                                                                                    +         (make-restore inst machine stack pc))
                                                                                    +        ((eq? (car inst) 'perform)
                                                                                    +         (make-perform inst machine labels ops pc))
                                                                                    +        (else (error "Unknown instruction type -- ASSEMBLE"
                                                                                    +                     inst))))
                                                                                    +

                                                                                    + +For each type of instruction in the register-machine language, there +is a generator that builds an appropriate execution procedure. The +details of these procedures determine both the syntax and meaning of +the individual instructions in the register-machine language. +We use data abstraction to isolate the detailed syntax of +register-machine expressions from the general execution mechanism, as +we did for evaluators in section 4.1.2, +by using syntax procedures to extract and classify the parts of an instruction.

                                                                                    + + + +

                                                                                    Assign instructions

                                                                                    + + +The make-assign procedure handles assign instructions: +

                                                                                    (define (make-assign inst machine labels operations pc)
                                                                                    +  (let ((target
                                                                                    +         (get-register machine (assign-reg-name inst)))
                                                                                    +        (value-exp (assign-value-exp inst)))
                                                                                    +    (let ((value-proc
                                                                                    +           (if (operation-exp? value-exp)
                                                                                    +               (make-operation-exp
                                                                                    +                value-exp machine labels operations)
                                                                                    +               (make-primitive-exp
                                                                                    +                (car value-exp) machine labels))))
                                                                                    +      (lambda ()                ; execution procedure for assign
                                                                                    +        (set-contents! target (value-proc))
                                                                                    +        (advance-pc pc)))))
                                                                                    +

                                                                                    +Make-assign extracts the target register name (the +second element of the instruction) and the value expression +(the rest of the list that forms the instruction) +from the assign instruction using the selectors +

                                                                                    (define (assign-reg-name assign-instruction)
                                                                                    +  (cadr assign-instruction))
                                                                                    +(define (assign-value-exp assign-instruction)
                                                                                    +  (cddr assign-instruction))
                                                                                    +

                                                                                    +The register name is looked up with get-register to produce the +target register object. The value expression is passed to make-operation-exp if the value is the result of an operation, and to +make-primitive-exp otherwise. These procedures (shown below) +parse the value expression and produce an execution procedure for the +value. This is a procedure of no arguments, called value-proc, +which will be evaluated during the simulation to produce the actual +value to be assigned to the register. Notice that the work of looking +up the register name and parsing the value expression is performed +just once, at assembly time, not every time the instruction is +simulated. This saving of work is the reason we use execution +procedures, and corresponds directly to the saving in work we obtained +by separating program analysis from execution in the evaluator of +section 4.1.7.

                                                                                    + +The result returned by make-assign is the execution +procedure for the assign instruction. When this procedure is +called (by the machine model's execute procedure), +it sets the contents of the target register to the result +obtained by executing value-proc. Then it advances +the pc to the next instruction by running the procedure +

                                                                                    (define (advance-pc pc)
                                                                                    +  (set-contents! pc (cdr (get-contents pc))))
                                                                                    +

                                                                                    +Advance-pc is the normal termination for all instructions except +branch and goto.

                                                                                    + + +

                                                                                    Test, branch, and goto instructions

                                                                                    + +Make-test handles test instructions in a similar way. It +extracts the expression that specifies the condition to be tested and +generates an execution procedure for it. At simulation time, the +procedure for the condition is called, the result is assigned to the +flag register, and the pc is advanced: +

                                                                                    (define (make-test inst machine labels operations flag pc)
                                                                                    +  (let ((condition (test-condition inst)))
                                                                                    +    (if (operation-exp? condition)
                                                                                    +        (let ((condition-proc
                                                                                    +               (make-operation-exp
                                                                                    +                condition machine labels operations)))
                                                                                    +          (lambda ()
                                                                                    +            (set-contents! flag (condition-proc))
                                                                                    +            (advance-pc pc)))
                                                                                    +        (error "Bad TEST instruction -- ASSEMBLE" inst))))
                                                                                    +(define (test-condition test-instruction)
                                                                                    +  (cdr test-instruction))
                                                                                    +

                                                                                    + +The execution procedure for a branch instruction checks the +contents of the flag register and either sets the contents of +the pc to the branch destination (if the branch is taken) or +else just advances the pc (if the branch is not taken). Notice +that the indicated destination in a branch instruction must be a +label, and the make-branch procedure enforces this. Notice +also that the label is looked up at assembly time, not each time the +branch instruction is simulated.

                                                                                    + +

                                                                                    (define (make-branch inst machine labels flag pc)
                                                                                    +  (let ((dest (branch-dest inst)))
                                                                                    +    (if (label-exp? dest)
                                                                                    +        (let ((insts
                                                                                    +               (lookup-label labels (label-exp-label dest))))
                                                                                    +          (lambda ()
                                                                                    +            (if (get-contents flag)
                                                                                    +                (set-contents! pc insts)
                                                                                    +                (advance-pc pc))))
                                                                                    +        (error "Bad BRANCH instruction -- ASSEMBLE" inst))))
                                                                                    +(define (branch-dest branch-instruction)
                                                                                    +  (cadr branch-instruction))
                                                                                    +

                                                                                    + +A goto instruction is similar to a branch, except that the +destination may be specified either as a label or as a register, and +there is no condition to check -- the pc is always set to the +new destination. +

                                                                                    (define (make-goto inst machine labels pc)
                                                                                    +  (let ((dest (goto-dest inst)))
                                                                                    +    (cond ((label-exp? dest)
                                                                                    +           (let ((insts
                                                                                    +                  (lookup-label labels
                                                                                    +                                (label-exp-label dest))))
                                                                                    +             (lambda () (set-contents! pc insts))))
                                                                                    +          ((register-exp? dest)
                                                                                    +           (let ((reg
                                                                                    +                  (get-register machine
                                                                                    +                                (register-exp-reg dest))))
                                                                                    +             (lambda ()
                                                                                    +               (set-contents! pc (get-contents reg)))))
                                                                                    +          (else (error "Bad GOTO instruction -- ASSEMBLE"
                                                                                    +                       inst)))))
                                                                                    +(define (goto-dest goto-instruction)
                                                                                    +  (cadr goto-instruction))
                                                                                    +

                                                                                    + + +

                                                                                    Other instructions

                                                                                    + +The stack instructions save and restore simply use the +stack with the designated register and advance the pc: + +

                                                                                    (define (make-save inst machine stack pc)
                                                                                    +  (let ((reg (get-register machine
                                                                                    +                           (stack-inst-reg-name inst))))
                                                                                    +    (lambda ()
                                                                                    +      (push stack (get-contents reg))
                                                                                    +      (advance-pc pc))))
                                                                                    +(define (make-restore inst machine stack pc)
                                                                                    +  (let ((reg (get-register machine
                                                                                    +                           (stack-inst-reg-name inst))))
                                                                                    +    (lambda ()
                                                                                    +      (set-contents! reg (pop stack))    
                                                                                    +      (advance-pc pc))))
                                                                                    +(define (stack-inst-reg-name stack-instruction)
                                                                                    +  (cadr stack-instruction))
                                                                                    +

                                                                                    + +The final instruction type, handled by make-perform, generates +an execution procedure for the action to be performed. At simulation +time, the action procedure is executed and the pc advanced. + +

                                                                                    (define (make-perform inst machine labels operations pc)
                                                                                    +  (let ((action (perform-action inst)))
                                                                                    +    (if (operation-exp? action)
                                                                                    +        (let ((action-proc
                                                                                    +               (make-operation-exp
                                                                                    +                action machine labels operations)))
                                                                                    +          (lambda ()
                                                                                    +            (action-proc)
                                                                                    +            (advance-pc pc)))
                                                                                    +        (error "Bad PERFORM instruction -- ASSEMBLE" inst))))
                                                                                    +(define (perform-action inst) (cdr inst))
                                                                                    +

                                                                                    + + + +

                                                                                    Execution procedures for subexpressions

                                                                                    + +The value of a reg, label, or const expression +may be needed for assignment to a register (make-assign) or for input to +an operation (make-operation-exp, below). The following procedure +generates execution procedures to produce values for these expressions +during the simulation: + +

                                                                                    (define (make-primitive-exp exp machine labels)
                                                                                    +  (cond ((constant-exp? exp)
                                                                                    +         (let ((c (constant-exp-value exp)))
                                                                                    +           (lambda () c)))
                                                                                    +        ((label-exp? exp)
                                                                                    +         (let ((insts
                                                                                    +                (lookup-label labels
                                                                                    +                              (label-exp-label exp))))
                                                                                    +           (lambda () insts)))
                                                                                    +        ((register-exp? exp)
                                                                                    +         (let ((r (get-register machine
                                                                                    +                                (register-exp-reg exp))))
                                                                                    +           (lambda () (get-contents r))))
                                                                                    +        (else
                                                                                    +         (error "Unknown expression type -- ASSEMBLE" exp))))
                                                                                    +

                                                                                    +The syntax of reg, label, and const expressions +is determined by +

                                                                                    (define (register-exp? exp) (tagged-list? exp 'reg))
                                                                                    +(define (register-exp-reg exp) (cadr exp))
                                                                                    +(define (constant-exp? exp) (tagged-list? exp 'const))
                                                                                    +(define (constant-exp-value exp) (cadr exp))
                                                                                    +(define (label-exp? exp) (tagged-list? exp 'label))
                                                                                    +(define (label-exp-label exp) (cadr exp))
                                                                                    +

                                                                                    +

                                                                                    + + +Assign, perform, and test instructions +may include the application of a machine operation (specified by +an op expression) to some operands (specified by reg +and const expressions). +The following procedure produces an execution procedure +for an ``operation expression'' -- a list containing the operation and +operand expressions from the instruction: +

                                                                                    (define (make-operation-exp exp machine labels operations)
                                                                                    +  (let ((op (lookup-prim (operation-exp-op exp) operations))
                                                                                    +        (aprocs
                                                                                    +         (map (lambda (e)
                                                                                    +                (make-primitive-exp e machine labels))
                                                                                    +              (operation-exp-operands exp))))
                                                                                    +    (lambda ()
                                                                                    +      (apply op (map (lambda (p) (p)) aprocs)))))
                                                                                    +

                                                                                    +The syntax of operation expressions is determined by +

                                                                                    (define (operation-exp? exp)
                                                                                    +  (and (pair? exp) (tagged-list? (car exp) 'op)))
                                                                                    +(define (operation-exp-op operation-exp)
                                                                                    +  (cadr (car operation-exp)))
                                                                                    +(define (operation-exp-operands operation-exp)
                                                                                    +  (cdr operation-exp))
                                                                                    +

                                                                                    +Observe that the treatment of operation expressions is very much like +the treatment of procedure applications by the analyze-application procedure in the evaluator of +section 4.1.7 in that we generate an execution +procedure for each operand. At simulation time, we call the +operand procedures and apply the Scheme procedure that simulates +the operation to the resulting values. +The simulation procedure is found by looking up the operation name in +the operation table for the machine: +

                                                                                    (define (lookup-prim symbol operations)
                                                                                    +  (let ((val (assoc symbol operations)))
                                                                                    +    (if val
                                                                                    +        (cadr val)
                                                                                    +        (error "Unknown operation -- ASSEMBLE" symbol))))
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.9.  The treatment of machine operations above permits them to operate +on labels as well as on constants and the contents of registers. +Modify the expression-processing procedures to enforce the condition +that operations can be used only with registers and constants. +

                                                                                    + +

                                                                                    +Exercise 5.10.  Design a new syntax for register-machine instructions and modify the +simulator to use your new syntax. Can you implement your new +syntax without changing any part of the simulator except the +syntax procedures in this section? +

                                                                                    + +

                                                                                    +Exercise 5.11.  When we introduced save and restore in +section 5.1.4, we didn't specify what would happen +if you tried to restore a register that was not the last one saved, as +in the sequence

                                                                                    + +

                                                                                    (save y)
                                                                                    +(save x)
                                                                                    +(restore y)
                                                                                    +

                                                                                    +There are several reasonable possibilities for the meaning of restore:

                                                                                    + +a.  (restore y) puts into y the last value saved on the +stack, regardless of what register that value came from. This is the +way our simulator behaves. Show how to take advantage of this +behavior to eliminate one instruction from the Fibonacci machine of +section 5.1.4 (figure 5.12).

                                                                                    + +b.  (restore y) puts into y the last value saved on the +stack, but only if that value was saved from y; otherwise, it +signals an error. Modify the simulator to behave this way. You will +have to change save to put the register name on the stack along +with the value.

                                                                                    + +c.  (restore y) puts into y the last value saved from y regardless of what other registers were saved after y and not +restored. Modify the simulator to behave this way. You will have to +associate a separate stack with each register. You should make the +initialize-stack operation initialize all the register stacks. +

                                                                                    + +

                                                                                    +Exercise 5.12.  The simulator can be used to help determine the data paths required +for implementing a machine with a given controller. Extend +the assembler to store the following information in the machine model: +

                                                                                      +
                                                                                    • a list of all instructions, with duplicates removed, sorted by +instruction type (assign, goto, and so on);

                                                                                      + +

                                                                                    • a list (without duplicates) of the registers used to hold entry +points (these are the registers referenced by goto +instructions);

                                                                                      + +

                                                                                    • a list (without duplicates) of the registers that are saved +or restored;

                                                                                      + +

                                                                                    • for each register, a list (without duplicates) of the sources from +which it is assigned (for example, the sources for register val +in the factorial machine of figure 5.11 are +(const 1) and ((op *) (reg n) (reg val))). +

                                                                                    +Extend the +message-passing interface to the machine to provide access to this new +information. To test your analyzer, define the Fibonacci machine from +figure 5.12 and examine the lists you constructed. +

                                                                                    + +

                                                                                    +Exercise 5.13.  Modify the simulator so that it uses the controller sequence to +determine what registers the machine has rather than requiring a list +of registers as an argument to make-machine. Instead of +pre-allocating the registers in make-machine, you can allocate +them one at a time when they are first seen during assembly of the +instructions. +

                                                                                    + + +

                                                                                    5.2.4  Monitoring Machine Performance

                                                                                    + + + +Simulation is useful not only for verifying the correctness of a +proposed machine design but also for measuring the machine's +performance. For example, we can install in our simulation program a +``meter'' that measures the number of stack operations used in a +computation. To do this, we modify our simulated stack to keep track +of the number of times registers are saved on the stack and the +maximum depth reached by the stack, and add a message to the stack's +interface that prints the statistics, as shown below. +We also add an operation to the basic machine model to print the +stack statistics, by initializing the-ops in make-new-machine to +

                                                                                    (list (list 'initialize-stack
                                                                                    +            (lambda () (stack 'initialize)))
                                                                                    +      (list 'print-stack-statistics
                                                                                    +            (lambda () (stack 'print-statistics))))
                                                                                    +

                                                                                    +Here is the new version of make-stack: +

                                                                                    (define (make-stack)
                                                                                    +  (let ((s '())
                                                                                    +        (number-pushes 0)
                                                                                    +        (max-depth 0)
                                                                                    +        (current-depth 0))
                                                                                    +    (define (push x)
                                                                                    +      (set! s (cons x s))
                                                                                    +      (set! number-pushes (+ 1 number-pushes))
                                                                                    +      (set! current-depth (+ 1 current-depth))
                                                                                    +      (set! max-depth (max current-depth max-depth)))
                                                                                    +    (define (pop)
                                                                                    +      (if (null? s)
                                                                                    +          (error "Empty stack -- POP")
                                                                                    +          (let ((top (car s)))
                                                                                    +            (set! s (cdr s))
                                                                                    +            (set! current-depth (- current-depth 1))
                                                                                    +            top)))    
                                                                                    +    (define (initialize)
                                                                                    +      (set! s '())
                                                                                    +      (set! number-pushes 0)
                                                                                    +      (set! max-depth 0)
                                                                                    +      (set! current-depth 0)
                                                                                    +      'done)
                                                                                    +    (define (print-statistics)
                                                                                    +      (newline)
                                                                                    +      (display (list 'total-pushes  '= number-pushes
                                                                                    +                     'maximum-depth '= max-depth)))
                                                                                    +    (define (dispatch message)
                                                                                    +      (cond ((eq? message 'push) push)
                                                                                    +            ((eq? message 'pop) (pop))
                                                                                    +            ((eq? message 'initialize) (initialize))
                                                                                    +            ((eq? message 'print-statistics)
                                                                                    +             (print-statistics))
                                                                                    +            (else
                                                                                    +             (error "Unknown request -- STACK" message))))
                                                                                    +    dispatch))
                                                                                    +

                                                                                    +

                                                                                    + +Exercises 5.15 through 5.19 +describe other useful monitoring and debugging features that can be +added to the register-machine simulator.

                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 5.14.  Measure the number of pushes and the maximum stack depth required to +compute n! for various small values of n using the factorial +machine shown in figure 5.11. From your data +determine formulas in terms of n for the total number of push +operations and the maximum stack depth used in computing n! for any +n > 1. Note that each of these is a linear function of n and is +thus determined by two constants. In order to get the statistics +printed, you will have to augment the factorial machine with instructions to +initialize the stack and print the statistics. +You may want to also modify the +machine so that it repeatedly reads a value for n, computes the +factorial, and prints the result (as we did for the GCD machine in +figure 5.4), so that you will not have to repeatedly +invoke get-register-contents, set-register-contents!, and +start. + +

                                                                                    + +

                                                                                    +Exercise 5.15.  Add instruction counting to the register machine simulation. +That is, have the machine model keep track of the number of +instructions executed. Extend the machine model's interface to accept +a new message that prints the value of the instruction count and +resets the count to zero. +

                                                                                    + +

                                                                                    +Exercise 5.16.  Augment the simulator to provide for instruction tracing. +That is, before each instruction is executed, the simulator should print +the text of the instruction. Make the machine model accept trace-on and +trace-off messages to turn tracing on and off. +

                                                                                    + +

                                                                                    +Exercise 5.17.  Extend the instruction tracing of +exercise 5.16 so that before +printing an instruction, the simulator prints any labels that +immediately precede that instruction in the controller sequence. Be +careful to do this in a way that does not interfere with instruction +counting (exercise 5.15). +You will have to make the simulator retain the necessary label information. +

                                                                                    + +

                                                                                    +Exercise 5.18.  Modify the make-register procedure of +section 5.2.1 so that registers can be traced. +Registers should accept messages that turn tracing on and off. When a +register is traced, assigning a value to the register should print the +name of the register, the old contents of the register, and the new +contents being assigned. Extend the interface to the machine model +to permit you to turn tracing on and off for designated machine registers. +

                                                                                    + +

                                                                                    +Exercise 5.19.  Alyssa P. Hacker wants a breakpoint feature in the simulator to +help her debug her machine designs. You have been hired to install +this feature for her. She wants to be able to specify a place in the +controller sequence where the simulator will stop and allow her to +examine the state of the machine. You are to implement a procedure

                                                                                    + +

                                                                                    + +

                                                                                    (set-breakpoint <machine> <label> <n>)
                                                                                    +

                                                                                    +that sets a breakpoint just before the nth instruction after the +given label. For example,

                                                                                    + +

                                                                                    (set-breakpoint gcd-machine 'test-b 4)
                                                                                    +

                                                                                    +installs a breakpoint in gcd-machine just before the +assignment to register a. When the simulator reaches the +breakpoint it should print the label and the offset of the breakpoint +and stop executing instructions. Alyssa can then use get-register-contents and set-register-contents! to manipulate +the state of the simulated machine. She should then be able to +continue execution by saying

                                                                                    + +

                                                                                    (proceed-machine <machine>)
                                                                                    +

                                                                                    +She should also be able to remove a specific breakpoint by means of

                                                                                    + +

                                                                                    (cancel-breakpoint <machine> <label> <n>)
                                                                                    +

                                                                                    +or to remove all breakpoints by means of

                                                                                    + +

                                                                                    (cancel-all-breakpoints <machine>)
                                                                                    +

                                                                                    +

                                                                                    +

                                                                                    + +


                                                                                    +

                                                                                    4 Using the receive procedure here is a way to get extract-labels to effectively return two values -- labels and +insts -- without explicitly making a compound data structure to +hold them. An alternative implementation, which returns an explicit +pair of values, is +

                                                                                    (define (extract-labels text)
                                                                                    +  (if (null? text)
                                                                                    +      (cons '() '())
                                                                                    +      (let ((result (extract-labels (cdr text))))
                                                                                    +        (let ((insts (car result)) (labels (cdr result)))
                                                                                    +          (let ((next-inst (car text)))
                                                                                    +            (if (symbol? next-inst)
                                                                                    +                (cons insts
                                                                                    +                      (cons (make-label-entry next-inst insts) labels))
                                                                                    +                (cons (cons (make-instruction next-inst) insts)
                                                                                    +                      labels)))))))
                                                                                    +

                                                                                    +which would be called by assemble as follows: +

                                                                                    (define (assemble controller-text machine)
                                                                                    +  (let ((result (extract-labels controller-text)))
                                                                                    +    (let ((insts (car result)) (labels (cdr result)))
                                                                                    +      (update-insts! insts labels machine)
                                                                                    +      insts)))
                                                                                    +

                                                                                    +You can consider our use of receive as demonstrating an elegant +way to return multiple values, or simply an excuse to show off a +programming trick. An argument like receive that is the next +procedure to be invoked is called a ``continuation.'' Recall that we +also used continuations to implement the backtracking control +structure in the amb evaluator in section 4.3.3. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-33.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-33.html new file mode 100644 index 00000000..89c5571c --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-33.html @@ -0,0 +1,678 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    5.3  Storage Allocation and Garbage Collection

                                                                                    + + + +In section 5.4, we will show how to implement a Scheme +evaluator as a register machine. In order to simplify the discussion, +we will assume that our register machines can be equipped with a list-structured memory, in which the basic operations for +manipulating list-structured data are primitive. Postulating the +existence of such a memory is a useful abstraction when one is +focusing on the mechanisms of control in a Scheme interpreter, but +this does not reflect a realistic view of the actual primitive data +operations of contemporary computers. To obtain a more complete +picture of how a Lisp system operates, we must investigate how list +structure can be represented in a way that is compatible with +conventional computer memories.

                                                                                    + +There are two considerations in implementing list structure. The +first is purely an issue of representation: how to represent the +``box-and-pointer'' structure of Lisp pairs, using only the storage +and addressing capabilities of typical computer memories. The second +issue concerns the management of memory as a computation proceeds. +The operation of a Lisp system depends crucially on the ability to +continually create new data objects. These include objects that are +explicitly created by the Lisp procedures being interpreted as well +as structures created by the interpreter itself, such as environments +and argument lists. Although the constant creation of new data +objects would pose no problem on a computer with an infinite amount of +rapidly addressable memory, computer memories are available only in +finite sizes (more's the pity). Lisp systems +thus provide an automatic storage allocation facility to +support the illusion of an infinite memory. When a data object is no +longer needed, the memory allocated to it is automatically recycled +and used to construct new data objects. There are various +techniques for providing such automatic storage allocation. The +method we shall discuss in this section is called garbage +collection.

                                                                                    + + +

                                                                                    5.3.1  Memory as Vectors

                                                                                    + +

                                                                                    + +A conventional computer memory can be thought of as an array of +cubbyholes, each of which can contain a piece of information. Each +cubbyhole has a unique name, called its address or location. Typical memory systems provide two primitive operations: +one that fetches the data stored in a specified location and one that +assigns new data to a specified location. Memory addresses can be +incremented to support sequential access to some set of the +cubbyholes. More generally, many important data operations require +that memory addresses be treated as data, which can be stored in +memory locations and manipulated in machine registers. The +representation of list structure is one application of such address arithmetic.

                                                                                    + +To model computer memory, we use a new kind of data +structure called a vector. Abstractly, a vector is a compound +data object whose individual elements can be accessed by means of an +integer index in an amount of time that is independent of the +index.5 In order to describe memory operations, we use two +primitive Scheme procedures for manipulating vectors:

                                                                                    + +

                                                                                      +
                                                                                    • (vector-ref <vector> <n>) returns the nth +element of the vector.

                                                                                      + +

                                                                                    • (vector-set! <vector> <n> <value>) sets +the nth element of the vector to the designated value. +

                                                                                    +For example, if v is a vector, then (vector-ref v 5) gets +the fifth entry in the vector v and (vector-set! v 5 7) +changes the value of the fifth entry of the vector v to 7.6 +For computer memory, this access can be implemented +through the use of address arithmetic to combine a base address +that specifies the beginning location of a vector in memory with an +index that specifies the offset of a particular element of the vector.

                                                                                    + + +

                                                                                    Representing Lisp data

                                                                                    + + +We can use vectors to implement the basic pair structures required for +a list-structured memory. Let us imagine that computer memory is +divided into two vectors: the-cars and the-cdrs. We will +represent list structure as follows: A pointer to a pair is an index +into the two vectors. The car of the pair is the entry in the-cars with the designated index, and the cdr of the pair is +the entry in the-cdrs with the designated index. We also need a +representation for objects other than pairs (such as numbers and +symbols) and a way to distinguish one kind of data from another. +There are many methods of accomplishing this, but they all reduce to +using typed pointers, that is, to extending the notion of +``pointer'' to include information on data type.7 The data type enables the system to +distinguish a pointer to a pair (which consists of the ``pair'' data +type and an index into the memory vectors) from pointers to other +kinds of data (which consist of some other data type and whatever is +being used to represent data of that type). Two data objects are +considered to be the same (eq?) if their pointers are +identical.8 Figure 5.14 +illustrates the use of this method to represent the list ((1 2) 3 +4), whose box-and-pointer diagram is also shown. We use letter +prefixes to denote the data-type information. Thus, a pointer to the +pair with index 5 is denoted p5, the empty list is denoted by +the pointer e0, and a pointer to the number 4 is denoted n4. In the box-and-pointer diagram, we have indicated at the lower +left of each pair the vector index that specifies where the car +and cdr of the pair are stored. The blank locations in the-cars and the-cdrs may contain parts of other list +structures (not of interest here).

                                                                                    + +

                                                                                    +
                                                                                    Figure 5.14:  Box-and-pointer and memory-vector representations +of the list ((1 2) 3 4).
                                                                                    + +

                                                                                    + +A pointer to a number, such as n4, +might consist of a type indicating numeric data together with the +actual representation of the number 4.9 +To deal with numbers that are too large to +be represented in the fixed amount of space allocated for a single +pointer, we could use a distinct bignum data type, for which the +pointer designates a list in which the parts of the number are +stored.10

                                                                                    + + +A symbol might be represented as a typed pointer that designates a +sequence of the characters that form the symbol's printed representation. +This sequence is constructed by the Lisp reader when the character string +is initially encountered in input. Since we want two instances of a +symbol to be recognized as the ``same'' symbol by eq? and we +want eq? to be a simple test for equality of pointers, we must +ensure that if the reader sees the same character string twice, it +will use the same pointer (to the same sequence of characters) to +represent both occurrences. To accomplish this, the reader maintains +a table, traditionally called the obarray, of all the symbols it +has ever encountered. When the reader encounters a character string +and is about to construct a symbol, it checks the obarray to see if it +has ever before seen the same character string. If it has not, it +uses the characters to construct a new symbol (a typed pointer to a +new character sequence) and enters this pointer in the obarray. If the +reader has seen the string before, it returns the symbol pointer +stored in the obarray. This process of replacing character strings by +unique pointers is called interning symbols.

                                                                                    + + + +

                                                                                    Implementing the primitive list operations

                                                                                    + +

                                                                                    + +Given the above representation scheme, we can replace each +``primitive'' list operation of a register machine with one or more +primitive vector operations. We will use two registers, the-cars and the-cdrs, to identify the memory vectors, and will +assume that vector-ref and vector-set! are available as +primitive operations. We also assume that numeric operations on +pointers (such as incrementing a pointer, using a pair pointer to +index a vector, or adding two numbers) use only the index portion of +the typed pointer.

                                                                                    + +For example, we can make a register machine support the instructions

                                                                                    + + +

                                                                                    (assign <reg1> (op car) (reg <reg2>))
                                                                                    +
                                                                                    +(assign <reg1> (op cdr) (reg <reg2>))
                                                                                    +

                                                                                    +if we implement these, respectively, as

                                                                                    + + +

                                                                                    (assign <reg1> (op vector-ref) (reg the-cars) (reg <reg2>))
                                                                                    +
                                                                                    +(assign <reg1> (op vector-ref) (reg the-cdrs) (reg <reg2>))
                                                                                    +

                                                                                    +The instructions

                                                                                    + + +

                                                                                    (perform (op set-car!) (reg <reg1>) (reg <reg2>))
                                                                                    +
                                                                                    +(perform (op set-cdr!) (reg <reg1>) (reg <reg2>))
                                                                                    +

                                                                                    +are implemented as + +

                                                                                    (perform
                                                                                    + (op vector-set!) (reg the-cars) (reg <reg1>) (reg <reg2>))
                                                                                    +
                                                                                    +(perform
                                                                                    + (op vector-set!) (reg the-cdrs) (reg <reg1>) (reg <reg2>))
                                                                                    +

                                                                                    +

                                                                                    + +Cons is performed by allocating an unused index and storing the +arguments to cons in the-cars and the-cdrs at that +indexed vector position. We presume that there is a special register, +free, that always holds a pair pointer containing the next +available index, and that we can increment the index part of that +pointer to find the next free location.11 +For example, the instruction

                                                                                    + +

                                                                                    (assign <reg1> (op cons) (reg <reg2>) (reg <reg3>))
                                                                                    +

                                                                                    +is implemented as the following sequence of vector +operations:12

                                                                                    + +

                                                                                    (perform
                                                                                    + (op vector-set!) (reg the-cars) (reg free) (reg <reg2>))
                                                                                    +(perform
                                                                                    + (op vector-set!) (reg the-cdrs) (reg free) (reg <reg3>))
                                                                                    +(assign <reg1> (reg free))
                                                                                    +(assign free (op +) (reg free) (const 1))
                                                                                    +

                                                                                    +The eq? operation

                                                                                    + +

                                                                                    (op eq?) (reg <reg1>) (reg <reg2>)
                                                                                    +

                                                                                    +simply tests the equality of all fields in the registers, and +predicates such as pair?, null?, symbol?, and number? need only check the type field.

                                                                                    + + +

                                                                                    Implementing stacks

                                                                                    + + +Although our register machines use stacks, we need do nothing special +here, since stacks can be modeled in terms of lists. The stack can be +a list of the saved values, pointed to by a special register the-stack. Thus, (save <reg>) can be implemented as

                                                                                    + +

                                                                                    (assign the-stack (op cons) (reg <reg>) (reg the-stack))
                                                                                    +

                                                                                    +Similarly, (restore <reg>) can be implemented as +

                                                                                    (assign <reg> (op car) (reg the-stack))
                                                                                    +(assign the-stack (op cdr) (reg the-stack))
                                                                                    +

                                                                                    +and (perform (op initialize-stack)) can be implemented as +

                                                                                    (assign the-stack (const ()))
                                                                                    +

                                                                                    +These operations can be further expanded in terms of the vector +operations given above. In conventional computer architectures, +however, it is usually advantageous to allocate the stack as a +separate vector. Then pushing and popping the stack can be +accomplished by incrementing or decrementing an index into that +vector.

                                                                                    + +

                                                                                    +Exercise 5.20.  Draw the box-and-pointer representation and the memory-vector +representation (as in figure 5.14) of the +list structure produced by

                                                                                    + +

                                                                                    (define x (cons 1 2))
                                                                                    +(define y (list x x))
                                                                                    +

                                                                                    +with the free pointer initially p1. What is the final +value of free ? What pointers represent the values of x and y ? +

                                                                                    + +

                                                                                    +Exercise 5.21.  Implement register machines for the following procedures. +Assume that the list-structure memory operations are available as +machine primitives.

                                                                                    + +

                                                                                    a. Recursive count-leaves:

                                                                                    + +

                                                                                    (define (count-leaves tree)
                                                                                    +  (cond ((null? tree) 0)
                                                                                    +        ((not (pair? tree)) 1)
                                                                                    +        (else (+ (count-leaves (car tree))
                                                                                    +                 (count-leaves (cdr tree))))))
                                                                                    +

                                                                                    +

                                                                                    b. Recursive count-leaves with explicit counter:

                                                                                    + +

                                                                                    (define (count-leaves tree)
                                                                                    +  (define (count-iter tree n)
                                                                                    +    (cond ((null? tree) n)
                                                                                    +          ((not (pair? tree)) (+ n 1))
                                                                                    +          (else (count-iter (cdr tree)
                                                                                    +                            (count-iter (car tree) n)))))
                                                                                    +  (count-iter tree 0))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.22.  Exercise 3.12 of section 3.3.1 +presented an append procedure that appends two lists to form a +new list and an append! procedure that splices two lists +together. Design a register machine to implement each of these +procedures. Assume that the list-structure memory operations are +available as primitive operations. +

                                                                                    + + +

                                                                                    5.3.2  Maintaining the Illusion of Infinite Memory

                                                                                    + +

                                                                                    + +The representation method outlined in +section 5.3.1 solves the problem of implementing +list structure, provided that we have an infinite amount of memory. +With a real computer we will eventually run out of free space in which +to construct new pairs.13 +However, most of the pairs generated in a typical +computation are used only to hold intermediate results. After these +results are accessed, the pairs are no longer needed -- they are garbage. For instance, the computation

                                                                                    + +

                                                                                    (accumulate + 0 (filter odd? (enumerate-interval 0 n)))
                                                                                    +

                                                                                    +constructs two lists: the enumeration and the result of filtering +the enumeration. When the accumulation is complete, these lists are +no longer needed, and the allocated memory can be reclaimed. If we +can arrange to collect all the garbage periodically, and if this turns +out to recycle memory at about the same rate at which we construct new +pairs, we will have preserved the illusion that there is an infinite +amount of memory.

                                                                                    + +In order to recycle pairs, we must have a way to determine which +allocated pairs are not needed (in the sense that their contents can +no longer influence the future of the computation). The method we +shall examine for accomplishing this is known as garbage +collection. Garbage collection is based on the observation that, at +any moment in a Lisp interpretation, the only objects that can +affect the future of the computation are those that can be reached by +some succession of car and cdr operations starting from +the pointers that are currently in the machine registers.14 Any memory cell +that is not so accessible may be recycled.

                                                                                    + +There are many ways to perform garbage collection. The method we +shall examine here is called stop-and-copy. The basic idea is +to divide memory into two halves: ``working memory'' and ``free +memory.'' When cons constructs pairs, it allocates these in +working memory. When working memory is full, we perform garbage +collection by locating all the useful pairs in working memory and +copying these into consecutive locations in free memory. (The useful +pairs are located by tracing all the car and cdr pointers, +starting with the machine registers.) Since we do not copy the +garbage, there will presumably be additional free memory that we can +use to allocate new pairs. In addition, nothing in the working memory +is needed, since all the useful pairs in it have been copied. Thus, +if we interchange the roles of working memory and free memory, we can +continue processing; new pairs will be allocated in the new working +memory (which was the old free memory). When this is full, we can +copy the useful pairs into the new free memory (which was the old +working memory).15

                                                                                    + + +

                                                                                    Implementation of a stop-and-copy garbage collector

                                                                                    + +We now use our register-machine language to describe the stop-and-copy +algorithm in more detail. We will assume that there is a register +called root that contains a pointer to a structure that +eventually points at all accessible data. This can be arranged by +storing the contents of all the machine registers in a +pre-allocated list pointed at by root just before starting +garbage collection.16 We also assume that, in addition to the +current working memory, there is free memory available into which we +can copy the useful data. The current working memory consists of +vectors whose base addresses are in registers called the-cars +and the-cdrs, and the free memory is in registers called new-cars and new-cdrs.

                                                                                    + +Garbage collection is triggered when we exhaust the free cells in the +current working memory, that is, when a cons operation attempts +to increment the free pointer beyond the end of the memory +vector. When the garbage-collection process is complete, the root pointer will point into the new memory, all objects accessible +from the root will have been moved to the new memory, and the +free pointer will indicate the next place in the new memory +where a new pair can be allocated. In addition, the roles of working +memory and new memory will have been interchanged -- new pairs will be +constructed in the new memory, beginning at the place indicated by +free, and the (previous) working memory will be available as the +new memory for the next garbage collection. +Figure 5.15 shows the arrangement of memory just +before and just after garbage collection.

                                                                                    + +

                                                                                    +
                                                                                    Figure 5.15:  Reconfiguration of memory by the garbage-collection +process.
                                                                                    + +

                                                                                    + +The state of the garbage-collection process is controlled by +maintaining two pointers: free and scan. These are +initialized to point to the beginning of the new memory. The +algorithm begins by relocating the pair pointed at by root to +the beginning of the new memory. The pair is copied, the root +pointer is adjusted to point to the new location, and the free +pointer is incremented. In addition, the old location of the pair is +marked to show that its contents have been moved. This marking is +done as follows: In the car position, we place a special tag +that signals that this is an already-moved object. (Such an object is +traditionally called a broken heart.)17 In the cdr position we place a forwarding +address that points at the location to which the object has been +moved.

                                                                                    + + +After relocating the root, the garbage collector enters its basic +cycle. At each step in the algorithm, the scan pointer +(initially pointing at the relocated root) points at a pair that has +been moved to the new memory but whose car and cdr +pointers still refer to objects in the old memory. These objects are +each relocated, and the scan pointer is incremented. To +relocate an object (for example, the object indicated by the car +pointer of the pair we are scanning) we check to see if the object has +already been moved (as indicated by the presence of a broken-heart tag +in the car position of the object). If the object has not +already been moved, we copy it to the place indicated by free, +update free, set up a broken heart at the object's old location, +and update the pointer to the object (in this +example, the car pointer of the pair we are scanning) to point +to the new location. If the object has already been moved, its +forwarding address (found in the cdr position of the broken +heart) is substituted for the pointer in the pair being scanned. +Eventually, all accessible objects will have been moved and scanned, +at which point the scan pointer will overtake the free +pointer and the process will terminate.

                                                                                    + +

                                                                                    + +We can specify the stop-and-copy algorithm as a sequence of +instructions for a register +machine. The basic step of relocating an object is accomplished by a +subroutine called relocate-old-result-in-new. This +subroutine gets its argument, a pointer to the object to be relocated, +from a register named old. It relocates the designated object +(incrementing free in the process), +puts a pointer to the relocated object into a register called new, and returns by branching to the entry point stored in the register +relocate-continue. To begin garbage collection, we invoke this +subroutine to relocate the root pointer, after initializing free and scan. When the relocation of root has been +accomplished, we install the new pointer as the new root and +enter the main loop of the garbage collector.

                                                                                    + +

                                                                                    begin-garbage-collection
                                                                                    +  (assign free (const 0))
                                                                                    +  (assign scan (const 0))
                                                                                    +  (assign old (reg root))
                                                                                    +  (assign relocate-continue (label reassign-root))
                                                                                    +  (goto (label relocate-old-result-in-new))
                                                                                    +reassign-root
                                                                                    +  (assign root (reg new))
                                                                                    +  (goto (label gc-loop))
                                                                                    +

                                                                                    + +In the main loop of the garbage collector we must determine whether +there are any more objects to be scanned. We do this by testing +whether the scan pointer is coincident with the free +pointer. If the pointers are equal, then all accessible objects have +been relocated, and we branch to gc-flip, which cleans things up +so that we can continue the interrupted computation. If there are +still pairs to be scanned, we call the relocate subroutine to relocate +the car of the next pair (by placing the car pointer in old). The relocate-continue register is set up so that the +subroutine will return to update the car pointer.

                                                                                    + +

                                                                                    gc-loop
                                                                                    +  (test (op =) (reg scan) (reg free))
                                                                                    +  (branch (label gc-flip))
                                                                                    +  (assign old (op vector-ref) (reg new-cars) (reg scan))
                                                                                    +  (assign relocate-continue (label update-car))
                                                                                    +  (goto (label relocate-old-result-in-new))
                                                                                    +

                                                                                    + +

                                                                                    + +At update-car, we modify the car pointer of the pair being +scanned, then proceed to relocate the cdr of the pair. We +return to update-cdr when that relocation has been accomplished. +After relocating and updating the cdr, we are finished scanning +that pair, so we continue with the main loop.

                                                                                    + +

                                                                                    update-car
                                                                                    +  (perform
                                                                                    +   (op vector-set!) (reg new-cars) (reg scan) (reg new))
                                                                                    +  (assign old (op vector-ref) (reg new-cdrs) (reg scan))
                                                                                    +  (assign relocate-continue (label update-cdr))
                                                                                    +  (goto (label relocate-old-result-in-new))
                                                                                    +
                                                                                    +update-cdr
                                                                                    +  (perform
                                                                                    +   (op vector-set!) (reg new-cdrs) (reg scan) (reg new))
                                                                                    +  (assign scan (op +) (reg scan) (const 1))
                                                                                    +  (goto (label gc-loop))
                                                                                    +

                                                                                    + +The subroutine relocate-old-result-in-new relocates objects as +follows: If the object to be relocated (pointed at by old) is +not a pair, then we return the same pointer to the object unchanged +(in new). (For example, we may be scanning a pair whose car is the number 4. If we represent the car by n4, as +described in section 5.3.1, then we want the +``relocated'' car pointer to still be n4.) Otherwise, we +must perform the relocation. If the car position of the pair to +be relocated contains a broken-heart tag, then the pair has in fact +already been moved, so we retrieve the forwarding address (from the +cdr position of the broken heart) and return this in new. +If the pointer in old points at a yet-unmoved pair, then we move +the pair to the first free cell in new memory (pointed at by free) and set up the broken heart by storing a broken-heart tag and +forwarding address at the old location. +Relocate-old-result-in-new uses a register oldcr +to hold the car or the cdr of the object pointed at by +old.18

                                                                                    + +

                                                                                    relocate-old-result-in-new
                                                                                    +  (test (op pointer-to-pair?) (reg old))
                                                                                    +  (branch (label pair))
                                                                                    +  (assign new (reg old))
                                                                                    +  (goto (reg relocate-continue))
                                                                                    +pair
                                                                                    +  (assign oldcr (op vector-ref) (reg the-cars) (reg old))
                                                                                    +  (test (op broken-heart?) (reg oldcr))
                                                                                    +  (branch (label already-moved))
                                                                                    +  (assign new (reg free)) ; new location for pair
                                                                                    +  ;; Update free pointer.
                                                                                    +  (assign free (op +) (reg free) (const 1))
                                                                                    +  ;; Copy the car and cdr to new memory.
                                                                                    +  (perform (op vector-set!)
                                                                                    +           (reg new-cars) (reg new) (reg oldcr))
                                                                                    +  (assign oldcr (op vector-ref) (reg the-cdrs) (reg old))
                                                                                    +  (perform (op vector-set!)
                                                                                    +           (reg new-cdrs) (reg new) (reg oldcr))
                                                                                    +  ;; Construct the broken heart.
                                                                                    +  (perform (op vector-set!)
                                                                                    +           (reg the-cars) (reg old) (const broken-heart))
                                                                                    +  (perform
                                                                                    +   (op vector-set!) (reg the-cdrs) (reg old) (reg new))
                                                                                    +  (goto (reg relocate-continue))
                                                                                    +already-moved
                                                                                    +  (assign new (op vector-ref) (reg the-cdrs) (reg old))
                                                                                    +  (goto (reg relocate-continue))
                                                                                    +

                                                                                    + +At the very end of the garbage-collection process, we interchange the +role of old and new memories by interchanging pointers: interchanging +the-cars with new-cars, and the-cdrs with new-cdrs. We will then be ready to perform another garbage +collection the next time memory runs out.

                                                                                    + +

                                                                                    gc-flip
                                                                                    +  (assign temp (reg the-cdrs))
                                                                                    +  (assign the-cdrs (reg new-cdrs))
                                                                                    +  (assign new-cdrs (reg temp))
                                                                                    +  (assign temp (reg the-cars))
                                                                                    +  (assign the-cars (reg new-cars))
                                                                                    +  (assign new-cars (reg temp))
                                                                                    +

                                                                                    + +

                                                                                    + +


                                                                                    +

                                                                                    5 We could represent memory as lists of items. +However, the access time would then not be independent of the index, +since accessing the nth element of a list requires n - 1 cdr +operations. + +

                                                                                    6 For completeness, we should specify a make-vector +operation that constructs vectors. However, in the present +application we will use vectors only to model fixed divisions of the +computer memory. + +

                                                                                    7 This is +precisely the same ``tagged data'' idea we introduced in chapter 2 for +dealing with generic operations. Here, however, the data types are +included at the primitive machine level rather than constructed +through the use of lists. + +

                                                                                    8 Type information may be encoded in a variety of +ways, depending on the details of the machine on which the Lisp +system is to be implemented. The execution efficiency of Lisp +programs will be strongly dependent on how cleverly this choice is +made, but it is difficult to formulate general design rules for good +choices. The most straightforward way to implement typed pointers is +to allocate a fixed set of bits in each pointer to be a type +field that encodes the data type. Important questions to be +addressed in designing such a representation include the following: +How many type bits are required? How large must the vector indices +be? How efficiently can the primitive machine instructions be used to +manipulate the type fields of pointers? Machines that include special +hardware for the efficient handling of type fields are said to have +tagged architectures. + +

                                                                                    9 This decision on the +representation of numbers determines whether eq?, which tests +equality of pointers, can be used to test for equality of numbers. If +the pointer contains the number itself, then equal numbers will have +the same pointer. But if the pointer contains the index of a location +where the number is stored, equal numbers will be guaranteed to have +equal pointers only if we are careful never to store the same number +in more than one location. + +

                                                                                    10 This is just like writing a number as a sequence of +digits, except that each ``digit'' is a number between 0 and the +largest number that can be stored in a single pointer. + +

                                                                                    11 There are other ways +of finding free storage. For example, we could link together all the +unused pairs into a free list. Our free locations are +consecutive (and hence can be accessed by incrementing a pointer) +because we are using a compacting garbage collector, as we will see in +section 5.3.2. + +

                                                                                    12 This is essentially the implementation of cons in terms of set-car! and set-cdr!, as described in +section 3.3.1. The operation get-new-pair used in that implementation is realized here by the free pointer. + +

                                                                                    13 This may not be true eventually, +because memories may get large enough so that it would be impossible +to run out of free memory in the lifetime of the computer. For +example, there are about 3× 1013, microseconds in a year, so +if we were to cons once per microsecond we would need about +1015 cells of memory to build a machine that could operate for 30 +years without running out of memory. That much memory seems absurdly +large by today's standards, but it is not physically impossible. On +the other hand, processors are getting faster and a future computer +may have large numbers of processors operating in parallel on a single +memory, so it may be possible to use up memory much faster than we +have postulated. + +

                                                                                    14 We +assume here that the stack is represented as a list as described in +section 5.3.1, so that items on the stack are +accessible via the pointer in the stack register. + +

                                                                                    15 This idea was invented and first implemented +by Minsky, as part of the implementation of Lisp for the PDP-1 at the +MIT Research Laboratory of Electronics. It was further developed by +Fenichel and Yochelson (1969) for use in the Lisp implementation for +the Multics time-sharing system. Later, Baker (1978) developed a +``real-time'' version of the method, which does not require the +computation to stop during garbage collection. Baker's idea was +extended by Hewitt, Lieberman, and Moon (see Lieberman and Hewitt +1983) to take advantage of the fact that some structure is more volatile +and other structure is more permanent.

                                                                                    + +An alternative commonly used garbage-collection technique is the mark-sweep method. This consists of tracing all the structure +accessible from the machine registers and marking each pair we reach. +We then scan all of memory, and any location that is unmarked is +``swept up'' as garbage and made available for reuse. A full +discussion of the mark-sweep method can be found in Allen 1978.

                                                                                    + +The Minsky-Fenichel-Yochelson algorithm is the dominant algorithm in +use for large-memory systems because it examines only the useful part +of memory. This is in contrast to mark-sweep, in which the sweep +phase must check all of memory. A second advantage of stop-and-copy +is that it is a compacting garbage collector. That is, at the +end of the garbage-collection phase the useful data will have been +moved to consecutive memory locations, with all garbage pairs +compressed out. This can be an extremely important performance +consideration in machines with virtual memory, in which accesses to +widely separated memory addresses may require extra paging +operations. + +

                                                                                    16 This list of registers does not include +the registers used by the storage-allocation system -- root, the-cars, the-cdrs, and the other registers that will be +introduced in this section. + +

                                                                                    17 The term broken heart was coined by David Cressey, who wrote a garbage +collector for MDL, a dialect of Lisp developed at MIT during the early +1970s. + +

                                                                                    18 The garbage collector uses the low-level predicate +pointer-to-pair? instead of the list-structure pair? +operation because in a real system there might be various things +that are treated as pairs for garbage-collection purposes. +For example, in a Scheme system that conforms to the IEEE standard +a procedure object may be implemented as a special kind of ``pair'' +that doesn't satisfy the pair? predicate. +For simulation purposes, pointer-to-pair? can be implemented as +pair?. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-34.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-34.html new file mode 100644 index 00000000..027790d0 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-34.html @@ -0,0 +1,1030 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    5.4  The Explicit-Control Evaluator

                                                                                    + + + +In section 5.1 we saw how to +transform simple Scheme programs into descriptions of register +machines. We will now perform this transformation on a more complex +program, the metacircular evaluator of +sections 4.1.1-4.1.4, +which shows how +the behavior of a Scheme interpreter can be described in terms of the +procedures eval and apply. +The explicit-control +evaluator that we develop in this section shows how the underlying +procedure-calling and argument-passing mechanisms used in the +evaluation process can be described in terms of operations on +registers and stacks. In addition, the explicit-control evaluator can +serve as an implementation of a Scheme interpreter, written in a +language that is very similar to the native machine language of +conventional computers. The evaluator can be executed by the +register-machine simulator of section 5.2. +Alternatively, it can be used as a starting point for building a +machine-language implementation of a Scheme evaluator, or even a +special-purpose machine for evaluating Scheme expressions. +Figure 5.16 shows such a hardware implementation: a +silicon chip that acts as an evaluator for Scheme. The chip designers +started with the data-path and controller specifications for a +register machine similar to the evaluator described in this section +and used design automation programs to construct the +integrated-circuit layout.19

                                                                                    + +

                                                                                    + + +

                                                                                    Registers and operations

                                                                                    + + +In designing the explicit-control evaluator, we must specify the +operations to be used in our register machine. We described the +metacircular evaluator in terms of abstract syntax, using procedures +such as quoted? and make-procedure. In implementing the +register machine, we could expand these procedures into sequences of +elementary list-structure memory operations, and implement these +operations on our register machine. However, this would make our +evaluator very long, obscuring the basic structure with +details. To clarify the presentation, we will include as primitive +operations of the register machine the syntax procedures given in +section 4.1.2 and the procedures for +representing environments and other run-time data given in +sections 4.1.3 and 4.1.4. +In order to completely specify an evaluator that could be programmed +in a low-level machine language or implemented in hardware, we would +replace these operations by more elementary operations, using the +list-structure implementation we described in +section 5.3.

                                                                                    + +

                                                                                    +
                                                                                    Figure 5.16:  A silicon-chip implementation of an evaluator for +Scheme.
                                                                                    + +

                                                                                    + +Our Scheme evaluator register machine includes a stack and seven +registers: exp, env, val, continue, proc, +argl, and unev. Exp is used to hold the expression +to be evaluated, and env contains the environment in which the +evaluation is to be performed. At the end of an evaluation, val +contains the value obtained by evaluating the expression in the +designated environment. The continue register is used to +implement recursion, as explained in +section 5.1.4. (The evaluator needs to call +itself recursively, since evaluating an expression requires evaluating +its subexpressions.) The registers proc, argl, and unev are used in evaluating combinations.

                                                                                    + + +We will not provide a data-path diagram to show how the registers and +operations of the evaluator are connected, nor will we give the +complete list of machine operations. These are implicit in the +evaluator's controller, which will be presented in detail.

                                                                                    + + +

                                                                                    5.4.1  The Core of the Explicit-Control Evaluator

                                                                                    + + + +The central element in the evaluator is the sequence of instructions +beginning at eval-dispatch. This corresponds to the eval +procedure of the metacircular evaluator described in +section 4.1.1. When the controller starts at eval-dispatch, it evaluates the expression specified by exp in +the environment specified by env. When evaluation is complete, +the controller will go to the entry point stored in continue, and the +val register will hold the value of the expression. As with the +metacircular eval, the structure of eval-dispatch is a +case analysis on the syntactic type of the expression to be +evaluated.20

                                                                                    + +

                                                                                    eval-dispatch
                                                                                    +  (test (op self-evaluating?) (reg exp))
                                                                                    +  (branch (label ev-self-eval))
                                                                                    +  (test (op variable?) (reg exp))
                                                                                    +  (branch (label ev-variable))
                                                                                    +  (test (op quoted?) (reg exp))
                                                                                    +  (branch (label ev-quoted))
                                                                                    +  (test (op assignment?) (reg exp))
                                                                                    +  (branch (label ev-assignment))
                                                                                    +  (test (op definition?) (reg exp))
                                                                                    +  (branch (label ev-definition))
                                                                                    +  (test (op if?) (reg exp))
                                                                                    +  (branch (label ev-if))
                                                                                    +  (test (op lambda?) (reg exp))
                                                                                    +  (branch (label ev-lambda))
                                                                                    +  (test (op begin?) (reg exp))
                                                                                    +  (branch (label ev-begin))
                                                                                    +  (test (op application?) (reg exp))
                                                                                    +  (branch (label ev-application))
                                                                                    +  (goto (label unknown-expression-type))
                                                                                    +

                                                                                    + + +

                                                                                    Evaluating simple expressions

                                                                                    + + +Numbers and strings (which are self-evaluating), +variables, quotations, and lambda expressions have no +subexpressions to be evaluated. For these, the evaluator simply +places the correct value in the val register and continues +execution at the entry point specified by continue. Evaluation +of simple expressions is performed by the following controller code:

                                                                                    + +

                                                                                    ev-self-eval
                                                                                    +  (assign val (reg exp))
                                                                                    +  (goto (reg continue))
                                                                                    +ev-variable
                                                                                    +  (assign val (op lookup-variable-value) (reg exp) (reg env))
                                                                                    +  (goto (reg continue))
                                                                                    +ev-quoted
                                                                                    +  (assign val (op text-of-quotation) (reg exp))
                                                                                    +  (goto (reg continue))
                                                                                    +ev-lambda
                                                                                    +  (assign unev (op lambda-parameters) (reg exp))
                                                                                    +  (assign exp (op lambda-body) (reg exp))
                                                                                    +  (assign val (op make-procedure)
                                                                                    +              (reg unev) (reg exp) (reg env))
                                                                                    +  (goto (reg continue))
                                                                                    +

                                                                                    +Observe how ev-lambda uses the unev and exp +registers to hold the parameters and body of the lambda expression so +that they can be passed to the make-procedure operation, along +with the environment in env.

                                                                                    + + +

                                                                                    Evaluating procedure applications

                                                                                    + + +A procedure application is specified by a combination containing an +operator and operands. The operator is a subexpression whose value is +a procedure, and the operands are subexpressions whose values are the +arguments to which the procedure should be applied. The metacircular +eval handles applications by calling itself recursively to +evaluate each element of the combination, and then passing the results +to apply, which performs the actual procedure application. The +explicit-control evaluator does the same thing; these recursive calls +are implemented by goto instructions, together with use of the +stack to save registers that will be restored after the recursive call +returns. Before each call we will be careful to identify which +registers must be saved (because their values will be needed +later).21

                                                                                    + +We begin the evaluation of an application by evaluating the operator +to produce a procedure, which will later be applied to the evaluated +operands. To evaluate the operator, we move it to the exp +register and go to eval-dispatch. The environment in the env register is already the correct one in which to evaluate the +operator. However, we save env because we will need it later to +evaluate the operands. We also extract the operands into unev +and save this on the stack. We set up continue so that eval-dispatch will resume at ev-appl-did-operator after the +operator has been evaluated. First, however, we save the old value of +continue, which tells the controller where to continue after the +application.

                                                                                    + +

                                                                                    ev-application
                                                                                    +  (save continue)
                                                                                    +  (save env)
                                                                                    +  (assign unev (op operands) (reg exp))
                                                                                    +  (save unev)
                                                                                    +  (assign exp (op operator) (reg exp))
                                                                                    +  (assign continue (label ev-appl-did-operator))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +

                                                                                    + +Upon returning from evaluating the operator subexpression, we proceed +to evaluate the operands of the combination and to accumulate the +resulting arguments in a list, held in argl. First we restore +the unevaluated operands and the environment. We initialize argl to an empty list. Then we assign to the proc register the +procedure that was produced by evaluating the operator. If there are +no operands, we go directly to apply-dispatch. Otherwise we +save proc on the stack and start the argument-evaluation +loop:22

                                                                                    + +

                                                                                    ev-appl-did-operator
                                                                                    +  (restore unev)                  ; the operands
                                                                                    +  (restore env)
                                                                                    +  (assign argl (op empty-arglist))
                                                                                    +  (assign proc (reg val))         ; the operator
                                                                                    +  (test (op no-operands?) (reg unev))
                                                                                    +  (branch (label apply-dispatch))
                                                                                    +  (save proc)
                                                                                    +

                                                                                    + +Each cycle of the argument-evaluation loop evaluates an operand +from the list in unev and accumulates the result into argl. +To evaluate an operand, we place it in the exp register +and go to eval-dispatch, after setting continue so that +execution will resume with the argument-accumulation phase. But first +we save the arguments accumulated so far (held in argl), the +environment (held in env), and the remaining operands to be evaluated +(held in unev). A special case is made for the evaluation of the +last operand, which is handled at ev-appl-last-arg.

                                                                                    + +

                                                                                    ev-appl-operand-loop
                                                                                    +  (save argl)
                                                                                    +  (assign exp (op first-operand) (reg unev))
                                                                                    +  (test (op last-operand?) (reg unev))
                                                                                    +  (branch (label ev-appl-last-arg))
                                                                                    +  (save env)
                                                                                    +  (save unev)
                                                                                    +  (assign continue (label ev-appl-accumulate-arg))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +

                                                                                    + +When an operand has been evaluated, the value is accumulated into the +list held in argl. The operand is then removed from the list of +unevaluated operands in unev, and the argument-evaluation continues.

                                                                                    + +

                                                                                    ev-appl-accumulate-arg
                                                                                    +  (restore unev)
                                                                                    +  (restore env)
                                                                                    +  (restore argl)
                                                                                    +  (assign argl (op adjoin-arg) (reg val) (reg argl))
                                                                                    +  (assign unev (op rest-operands) (reg unev))
                                                                                    +  (goto (label ev-appl-operand-loop))
                                                                                    +

                                                                                    + +Evaluation of the last argument is handled differently. There is no +need to save the environment or the list of unevaluated operands +before going to eval-dispatch, +since they will not be required after the last operand is evaluated. +Thus, we return from the evaluation to a special entry point ev-appl-accum-last-arg, which restores the argument list, accumulates +the new argument, restores the saved procedure, and goes off to +perform the application.23

                                                                                    + +

                                                                                    ev-appl-last-arg
                                                                                    +  (assign continue (label ev-appl-accum-last-arg))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +ev-appl-accum-last-arg
                                                                                    +  (restore argl)
                                                                                    +  (assign argl (op adjoin-arg) (reg val) (reg argl))
                                                                                    +  (restore proc)
                                                                                    +  (goto (label apply-dispatch))
                                                                                    +

                                                                                    + +The details of the argument-evaluation loop determine the order in +which the interpreter evaluates the operands of a combination (e.g., +left to right or right to left -- see +exercise 3.8). This order is not determined +by the metacircular evaluator, which inherits its control structure +from the underlying Scheme in which it is implemented.24 Because the first-operand +selector (used in ev-appl-operand-loop to extract successive operands +from unev) is implemented as car and the rest-operands selector is implemented as cdr, the +explicit-control evaluator will evaluate the operands of a combination +in left-to-right order.

                                                                                    + + +

                                                                                    Procedure application

                                                                                    + +

                                                                                    + +The entry point apply-dispatch corresponds to the apply +procedure of the metacircular evaluator. By the time we get to apply-dispatch, the proc register contains the procedure to +apply and argl contains the list of evaluated arguments to which +it must be applied. The saved value of continue (originally +passed to eval-dispatch and saved at ev-application), +which tells where to return with the result of the procedure +application, is on the stack. When the application is complete, the +controller transfers to the entry point specified by the saved continue, with the result of the application in val. As with +the metacircular apply, there are two cases to consider. Either +the procedure to be applied is a primitive or it is a compound +procedure.

                                                                                    + +

                                                                                    apply-dispatch
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-apply))
                                                                                    +  (test (op compound-procedure?) (reg proc))  
                                                                                    +  (branch (label compound-apply))
                                                                                    +  (goto (label unknown-procedure-type))
                                                                                    +

                                                                                    + +We assume that each primitive is implemented so as to obtain its +arguments from argl and place its result in val. To +specify how the machine handles primitives, we would have to provide a +sequence of controller instructions to implement each primitive and +arrange for primitive-apply to dispatch to the +instructions for the primitive identified by the +contents of proc. Since we are interested in the structure of +the evaluation process rather than the details of the primitives, we +will instead just use an apply-primitive-procedure operation +that applies the procedure in proc to the arguments in argl. For the purpose of simulating the evaluator with the simulator +of section 5.2 we use the procedure apply-primitive-procedure, which calls on the underlying Scheme +system to perform the application, just as we did for the metacircular +evaluator in section 4.1.4. After computing the +value of the primitive application, we restore continue and go +to the designated entry point.

                                                                                    + +

                                                                                    primitive-apply
                                                                                    +  (assign val (op apply-primitive-procedure)
                                                                                    +              (reg proc)
                                                                                    +              (reg argl))
                                                                                    +  (restore continue)
                                                                                    +  (goto (reg continue))
                                                                                    +

                                                                                    + +To apply a compound procedure, we proceed just as with the +metacircular evaluator. We construct a frame that binds the +procedure's parameters to the arguments, use this frame to +extend the environment carried by the procedure, and evaluate in this +extended environment the sequence of expressions that forms the body +of the procedure. Ev-sequence, described below in +section 5.4.2, handles the evaluation +of the sequence.

                                                                                    + +

                                                                                    compound-apply
                                                                                    +  (assign unev (op procedure-parameters) (reg proc))
                                                                                    +  (assign env (op procedure-environment) (reg proc))
                                                                                    +  (assign env (op extend-environment)
                                                                                    +              (reg unev) (reg argl) (reg env))
                                                                                    +  (assign unev (op procedure-body) (reg proc))
                                                                                    +  (goto (label ev-sequence))
                                                                                    +

                                                                                    + +Compound-apply is the only place in the interpreter where the +env register is ever assigned a new value. Just as in the +metacircular evaluator, the new environment is constructed from the +environment carried by the procedure, together with the argument list +and the corresponding list of variables to be bound.

                                                                                    + + +

                                                                                    5.4.2  Sequence Evaluation and Tail Recursion

                                                                                    + + + +The portion of the explicit-control evaluator at ev-sequence is +analogous to the metacircular evaluator's eval-sequence procedure. It +handles sequences of expressions in procedure bodies or in explicit +begin expressions.

                                                                                    + +Explicit begin expressions are evaluated by placing the sequence +of expressions to be evaluated in unev, saving continue on the +stack, and jumping to ev-sequence. +

                                                                                    ev-begin
                                                                                    +  (assign unev (op begin-actions) (reg exp))
                                                                                    +  (save continue)
                                                                                    +  (goto (label ev-sequence))
                                                                                    +

                                                                                    +The implicit sequences in procedure bodies are handled by jumping to +ev-sequence from compound-apply, at which point continue is already on the stack, having been saved at +ev-application.

                                                                                    + +The entries at ev-sequence +and ev-sequence-continue form a loop that +successively evaluates each expression in a sequence. The list of +unevaluated expressions is kept in unev. Before evaluating each +expression, we check to see if there are additional expressions to be +evaluated in the sequence. If so, we save the rest of the unevaluated +expressions (held in unev) and the environment in which these +must be evaluated (held in env) and call eval-dispatch to +evaluate the expression. The two saved registers are restored upon +the return from this evaluation, at ev-sequence-continue.

                                                                                    + +The final expression in the sequence is handled differently, at the +entry point ev-sequence-last-exp. Since there are no more +expressions to be evaluated after this one, we need not save unev or env before going to eval-dispatch. The value of +the whole sequence is the value of the last expression, so after the +evaluation of the last expression there is nothing left to do except +continue at the entry point currently held on the stack (which was saved +by ev-application or ev-begin.) +Rather than setting up continue to arrange for eval-dispatch to return here and then restoring continue from +the stack and continuing at that entry point, we restore continue from +the stack before going to eval-dispatch, so that eval-dispatch will continue at that entry point after evaluating the +expression.

                                                                                    + +

                                                                                    ev-sequence
                                                                                    +  (assign exp (op first-exp) (reg unev))
                                                                                    +  (test (op last-exp?) (reg unev))
                                                                                    +  (branch (label ev-sequence-last-exp))
                                                                                    +  (save unev)
                                                                                    +  (save env)
                                                                                    +  (assign continue (label ev-sequence-continue))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +ev-sequence-continue
                                                                                    +  (restore env)
                                                                                    +  (restore unev)
                                                                                    +  (assign unev (op rest-exps) (reg unev))
                                                                                    +  (goto (label ev-sequence))
                                                                                    +ev-sequence-last-exp
                                                                                    +  (restore continue)
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +

                                                                                    + + +

                                                                                    Tail recursion

                                                                                    + + +In chapter 1 we said that the process described by a procedure such as

                                                                                    + +

                                                                                    (define (sqrt-iter guess x)
                                                                                    +  (if (good-enough? guess x)
                                                                                    +      guess
                                                                                    +      (sqrt-iter (improve guess x)
                                                                                    +                 x)))
                                                                                    +

                                                                                    +is an iterative process. Even though the procedure is syntactically +recursive (defined in terms of itself), it is not logically necessary +for an evaluator to save information in passing from one call to sqrt-iter to the next.25 An evaluator that can +execute a procedure such as sqrt-iter without requiring +increasing storage as the procedure continues to call itself is called +a tail-recursive evaluator. The metacircular implementation of +the evaluator in chapter 4 does not specify whether the evaluator is +tail-recursive, because that evaluator inherits its mechanism for +saving state from the underlying Scheme. With the explicit-control +evaluator, however, we can trace through the evaluation process to see +when procedure calls cause a net accumulation of information on the +stack.

                                                                                    + + +Our evaluator is tail-recursive, because in order to evaluate the final +expression of a sequence we transfer directly to eval-dispatch without +saving any information on the stack. Hence, evaluating the final expression +in a sequence -- even if it is a procedure call (as in sqrt-iter, where +the if expression, which is the last expression in the procedure body, +reduces to a call to sqrt-iter) -- will not cause any information to be +accumulated on the stack.26

                                                                                    + +If we did not think to take advantage of the fact that it was +unnecessary to save information in this case, we might have +implemented eval-sequence by treating all the expressions in a +sequence in the same way -- saving the registers, evaluating the expression, +returning to restore the registers, and repeating this until all the +expressions have been evaluated:27

                                                                                    + +

                                                                                    ev-sequence
                                                                                    +  (test (op no-more-exps?) (reg unev))
                                                                                    +  (branch (label ev-sequence-end))
                                                                                    +  (assign exp (op first-exp) (reg unev))
                                                                                    +  (save unev)
                                                                                    +  (save env)
                                                                                    +  (assign continue (label ev-sequence-continue))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +ev-sequence-continue
                                                                                    +  (restore env)
                                                                                    +  (restore unev)
                                                                                    +  (assign unev (op rest-exps) (reg unev))
                                                                                    +  (goto (label ev-sequence))
                                                                                    +ev-sequence-end
                                                                                    +  (restore continue)
                                                                                    +  (goto (reg continue))
                                                                                    +

                                                                                    + + +This may seem like a minor change to our previous code for evaluation +of a sequence: The only difference is that we go through the +save-restore cycle for the last expression in a sequence as well as +for the +others. The interpreter will still give the same value for +any expression. But this change is fatal to the tail-recursive +implementation, because we must now return after evaluating the final +expression in a sequence in order to undo the (useless) register +saves. These extra saves will accumulate during a nest of procedure +calls. Consequently, processes such as sqrt-iter will require +space proportional to the number of iterations rather than requiring +constant space. This difference can be significant. For example, +with tail recursion, an infinite loop can be expressed using only the +procedure-call mechanism:

                                                                                    + +

                                                                                    (define (count n)
                                                                                    +  (newline)
                                                                                    +  (display n)
                                                                                    +  (count (+ n 1)))
                                                                                    +

                                                                                    +Without tail recursion, such a procedure would eventually run out of +stack space, and expressing a true iteration would require some +control mechanism other than procedure call.

                                                                                    + + +

                                                                                    5.4.3  Conditionals, Assignments, and Definitions

                                                                                    + +As with the metacircular evaluator, special forms are handled by +selectively evaluating fragments of the expression. For an if +expression, we must evaluate the predicate and decide, based on the +value of predicate, whether to evaluate the consequent or the +alternative.

                                                                                    + +Before evaluating the predicate, we save the if expression +itself so that we can later extract the consequent or alternative. We +also save the environment, which we will need later in order to +evaluate the consequent or the alternative, and we save continue, which we will need later in order to return to the +evaluation of the expression that is waiting for the value of the if.

                                                                                    + + +

                                                                                    ev-if
                                                                                    +  (save exp)                    ; save expression for later
                                                                                    +  (save env)
                                                                                    +  (save continue)
                                                                                    +  (assign continue (label ev-if-decide))
                                                                                    +  (assign exp (op if-predicate) (reg exp))
                                                                                    +  (goto (label eval-dispatch))  ; evaluate the predicate
                                                                                    +

                                                                                    + + +When we return from evaluating the predicate, we test whether it was +true or false and, depending on the result, place either the +consequent or the alternative in exp before going to eval-dispatch. Notice that restoring env and continue +here sets up eval-dispatch to have the correct environment and +to continue at the right place to receive the value of the if +expression.

                                                                                    + + +

                                                                                    ev-if-decide
                                                                                    +  (restore continue)
                                                                                    +  (restore env)
                                                                                    +  (restore exp)
                                                                                    +  (test (op true?) (reg val))
                                                                                    +  (branch (label ev-if-consequent))
                                                                                    +
                                                                                    +ev-if-alternative
                                                                                    +  (assign exp (op if-alternative) (reg exp))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +ev-if-consequent
                                                                                    +  (assign exp (op if-consequent) (reg exp))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +

                                                                                    + + +

                                                                                    Assignments and definitions

                                                                                    + +Assignments are handled by ev-assignment, which is reached from +eval-dispatch with the assignment expression in exp. The code at ev-assignment first evaluates the value part of the expression and +then installs the new value in the environment. Set-variable-value! is assumed to be available as a machine +operation.

                                                                                    + + +

                                                                                    ev-assignment
                                                                                    +  (assign unev (op assignment-variable) (reg exp))
                                                                                    +  (save unev)                   ; save variable for later
                                                                                    +  (assign exp (op assignment-value) (reg exp))
                                                                                    +  (save env)
                                                                                    +  (save continue)
                                                                                    +  (assign continue (label ev-assignment-1))
                                                                                    +  (goto (label eval-dispatch))  ; evaluate the assignment value
                                                                                    +ev-assignment-1
                                                                                    +  (restore continue)
                                                                                    +  (restore env)
                                                                                    +  (restore unev)
                                                                                    +  (perform
                                                                                    +   (op set-variable-value!) (reg unev) (reg val) (reg env))
                                                                                    +  (assign val (const ok))
                                                                                    +  (goto (reg continue))
                                                                                    +

                                                                                    + + +Definitions are handled in a similar way: + +

                                                                                    ev-definition
                                                                                    +  (assign unev (op definition-variable) (reg exp))
                                                                                    +  (save unev)                   ; save variable for later
                                                                                    +  (assign exp (op definition-value) (reg exp))
                                                                                    +  (save env)
                                                                                    +  (save continue)
                                                                                    +  (assign continue (label ev-definition-1))
                                                                                    +  (goto (label eval-dispatch))  ; evaluate the definition value
                                                                                    +ev-definition-1
                                                                                    +  (restore continue)
                                                                                    +  (restore env)
                                                                                    +  (restore unev)
                                                                                    +  (perform
                                                                                    +   (op define-variable!) (reg unev) (reg val) (reg env))
                                                                                    +  (assign val (const ok))
                                                                                    +  (goto (reg continue))
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.23.  Extend the evaluator to handle derived expressions such as cond, +let, and so on (section 4.1.2). +You may ``cheat'' and assume that the syntax +transformers such as cond->if are available as machine +operations.28 + +

                                                                                    + +

                                                                                    +Exercise 5.24.  Implement cond as a new basic special form without +reducing it to if. You will have to construct a loop that tests +the predicates of successive cond clauses until you find one +that is true, and then use ev-sequence to evaluate the actions +of the clause. + +

                                                                                    + +

                                                                                    +Exercise 5.25.  Modify the evaluator so that it uses normal-order evaluation, +based on the lazy evaluator of section 4.2. +

                                                                                    + + +

                                                                                    5.4.4  Running the Evaluator

                                                                                    + + + +With the implementation of the explicit-control evaluator we come to +the end of a development, begun in chapter 1, in which we have +explored successively more precise models of the evaluation process. +We started with the relatively informal substitution model, then +extended this in chapter 3 to the environment model, which enabled us +to deal with state and change. In the metacircular evaluator of +chapter 4, we used Scheme itself as a language for making more explicit +the environment structure constructed during evaluation of an +expression. Now, with register machines, we have taken a close look +at the evaluator's mechanisms for storage management, +argument passing, and control. At +each new level of description, we have had to raise issues and resolve +ambiguities that were not apparent at the previous, less precise +treatment of evaluation. To understand the behavior of the +explicit-control evaluator, we can simulate it and monitor its +performance.

                                                                                    + + +We will install a driver loop in our evaluator machine. This plays +the role of the driver-loop procedure of +section 4.1.4. The evaluator will repeatedly print a +prompt, read an expression, evaluate the expression by going to eval-dispatch, and print the result. The following instructions form +the beginning of the explicit-control evaluator's controller +sequence:29

                                                                                    + +

                                                                                    read-eval-print-loop
                                                                                    +  (perform (op initialize-stack))
                                                                                    +  (perform
                                                                                    +   (op prompt-for-input) (const ";;; EC-Eval input:"))
                                                                                    +  (assign exp (op read))
                                                                                    +  (assign env (op get-global-environment))
                                                                                    +  (assign continue (label print-result))
                                                                                    +  (goto (label eval-dispatch))
                                                                                    +print-result
                                                                                    +  (perform
                                                                                    +   (op announce-output) (const ";;; EC-Eval value:"))
                                                                                    +  (perform (op user-print) (reg val))
                                                                                    +  (goto (label read-eval-print-loop))
                                                                                    +

                                                                                    + +When we encounter an error in a procedure (such as the ``unknown +procedure type error'' indicated at apply-dispatch), we print an +error message and return to the driver loop.30

                                                                                    + +

                                                                                    unknown-expression-type
                                                                                    +  (assign val (const unknown-expression-type-error))
                                                                                    +  (goto (label signal-error))
                                                                                    +unknown-procedure-type
                                                                                    +  (restore continue)    ; clean up stack (from apply-dispatch)
                                                                                    +  (assign val (const unknown-procedure-type-error))
                                                                                    +  (goto (label signal-error))
                                                                                    +signal-error
                                                                                    +  (perform (op user-print) (reg val))
                                                                                    +  (goto (label read-eval-print-loop))
                                                                                    +

                                                                                    + +For the purposes of the simulation, we initialize the stack each time +through the driver loop, since it might not be empty after an error +(such as an undefined variable) interrupts an evaluation.31

                                                                                    + +If we combine all the code fragments presented in sections +5.4.1-5.4.4, we can create an +evaluator machine model that we can run using the register-machine simulator +of section 5.2.

                                                                                    + +

                                                                                    (define eceval
                                                                                    +  (make-machine
                                                                                    +   '(exp env val proc argl continue unev)
                                                                                    +   eceval-operations
                                                                                    +  '(
                                                                                    +    read-eval-print-loop
                                                                                    +      <entire machine controller as given above>
                                                                                    +   )))
                                                                                    +

                                                                                    +We must define Scheme procedures to simulate the +operations used as primitives by the evaluator. These are +the same procedures we used for the metacircular evaluator in +section 4.1, together with the few additional ones +defined in footnotes throughout section 5.4. +

                                                                                    (define eceval-operations
                                                                                    +  (list (list 'self-evaluating? self-evaluating)
                                                                                    +        <complete list of operations for eceval machine>))
                                                                                    +

                                                                                    + + +Finally, we can initialize the global environment and run the evaluator: +

                                                                                    (define the-global-environment (setup-environment))
                                                                                    +
                                                                                    +(start eceval)
                                                                                    +;;; EC-Eval input:
                                                                                    +(define (append x y)
                                                                                    +  (if (null? x)
                                                                                    +      y
                                                                                    +      (cons (car x)
                                                                                    +            (append (cdr x) y))))
                                                                                    +;;; EC-Eval value:
                                                                                    +ok
                                                                                    +;;; EC-Eval input:
                                                                                    +(append '(a b c) '(d e f))
                                                                                    +;;; EC-Eval value:
                                                                                    +(a b c d e f)
                                                                                    +

                                                                                    + +Of course, evaluating expressions in this way will take much longer +than if we had directly typed them into Scheme, because of the +multiple levels of simulation involved. Our expressions are evaluated +by the explicit-control-evaluator machine, which is being simulated by +a Scheme program, which is itself being evaluated by the Scheme +interpreter.

                                                                                    + + +

                                                                                    Monitoring the performance of the evaluator

                                                                                    + + +Simulation can be a powerful tool to guide the implementation of +evaluators. Simulations make it easy not only to explore variations +of the register-machine design but also to monitor the performance of +the simulated evaluator. For example, one important factor in +performance is how efficiently the evaluator uses the stack. We can +observe the number of stack operations required to evaluate various +expressions by defining the evaluator register machine with the +version of the simulator that collects statistics on stack use +(section 5.2.4), and adding an instruction at the +evaluator's print-result entry point to print the +statistics:

                                                                                    + +

                                                                                    print-result
                                                                                    +  (perform (op print-stack-statistics)); added instruction
                                                                                    +  (perform
                                                                                    +   (op announce-output) (const ";;; EC-Eval value:"))
                                                                                    +  ... ; same as before
                                                                                    +

                                                                                    +Interactions with the evaluator now look like this: +

                                                                                    ;;; EC-Eval input:
                                                                                    +(define (factorial n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* (factorial (- n 1)) n)))
                                                                                    +(total-pushes = 3 maximum-depth = 3)
                                                                                    +;;; EC-Eval value:
                                                                                    +ok
                                                                                    +;;; EC-Eval input:
                                                                                    +(factorial 5)
                                                                                    +(total-pushes = 144 maximum-depth = 28)
                                                                                    +;;; EC-Eval value:
                                                                                    +120
                                                                                    +

                                                                                    +Note that the driver loop of the evaluator reinitializes the stack +at the start of +each interaction, so that the statistics printed will refer only to +stack operations used to evaluate the previous expression.

                                                                                    + +

                                                                                    +Exercise 5.26.  Use the monitored stack to explore the tail-recursive property of the +evaluator (section 5.4.2). Start the +evaluator and define the iterative factorial procedure from +section 1.2.1:

                                                                                    + +

                                                                                    (define (factorial n)
                                                                                    +  (define (iter product counter)
                                                                                    +    (if (> counter n)
                                                                                    +        product
                                                                                    +        (iter (* counter product)
                                                                                    +              (+ counter 1))))
                                                                                    +  (iter 1 1))
                                                                                    +

                                                                                    +Run the procedure with some small values of n. Record the maximum +stack depth and the number of pushes required to compute n! for each of +these values.

                                                                                    + +

                                                                                    a. You will find that the maximum depth required to evaluate n! is +independent of n. What is that depth?

                                                                                    + +

                                                                                    b. Determine from your data a formula in terms of n for the total +number of push operations used in evaluating n! for any n > 1. +Note that the number of operations used is a linear function of n +and is thus determined by two constants. +

                                                                                    + +

                                                                                    +Exercise 5.27.  For comparison with exercise 5.26, explore the +behavior of the following procedure for computing factorials +recursively: +

                                                                                    (define (factorial n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* (factorial (- n 1)) n)))
                                                                                    +

                                                                                    +By running this procedure with the monitored stack, determine, as a +function of n, the maximum depth of the stack and the total number +of pushes used in evaluating n! for n > 1. (Again, these functions +will be linear.) Summarize your experiments by filling in the +following table with the appropriate expressions in terms of n:

                                                                                    + + + + + + +
                                                                                    Maximum depth Number of pushes
                                                                                    Recursive
                                                                                    factorial
                                                                                    Iterative
                                                                                    factorial

                                                                                    + +The maximum depth is a measure of the amount of space used by the +evaluator in carrying out the computation, and the number of pushes +correlates well with the time required. + +

                                                                                    + +

                                                                                    + +

                                                                                    +Exercise 5.28.  Modify the definition of the evaluator by changing +eval-sequence as described in +section 5.4.2 so that the evaluator is no +longer tail-recursive. Rerun your experiments from +exercises 5.26 and 5.27 to demonstrate +that both versions of the factorial procedure now require space +that grows linearly with their input. +

                                                                                    + +

                                                                                    +Exercise 5.29.  Monitor the stack operations in the tree-recursive Fibonacci computation:

                                                                                    + +

                                                                                    (define (fib n)
                                                                                    +  (if (< n 2)
                                                                                    +      n
                                                                                    +      (+ (fib (- n 1)) (fib (- n 2)))))
                                                                                    +

                                                                                    +a. Give a formula in terms of n for the maximum depth of the stack +required to compute Fib(n) for n > 2. Hint: In +section 1.2.2 we argued that the space used by this +process grows linearly with n.

                                                                                    + +

                                                                                    b. Give a formula for the total number of pushes used to compute + Fib(n) for n > 2. You should find that the number of +pushes (which correlates well with the time used) grows exponentially +with n. Hint: Let S(n) be the number of pushes used in computing + Fib(n). You should be able to argue that there is a formula +that expresses S(n) in terms of S(n - 1), S(n - 2), and some fixed +``overhead'' constant k that is independent of n. Give the +formula, and say what k is. Then show that S(n) can be expressed +as a Fib(n + 1) + b and give the values of a and b. + +

                                                                                    + +

                                                                                    +Exercise 5.30.  Our evaluator currently catches and signals only two kinds of +errors -- unknown expression types and unknown procedure types. Other +errors will take us out of the evaluator read-eval-print loop. When +we run the evaluator using the register-machine simulator, these +errors are caught by the underlying Scheme system. This is analogous +to the computer crashing when a user program makes an +error.32 It is a large project to make a real +error system work, but it is well worth the effort to understand what +is involved here.

                                                                                    + +

                                                                                    a. Errors that occur in the evaluation process, such as an attempt to +access an unbound variable, could be caught by changing the lookup +operation to make it return a distinguished condition code, which cannot +be a possible value of any user variable. The evaluator can test +for this condition code and then do what is necessary to go to signal-error. Find all of the places in the evaluator where such a +change is necessary and fix them. This is lots of work.

                                                                                    + +

                                                                                    b. Much worse is the problem of handling errors that are signaled by +applying primitive procedures, such as an attempt to divide by zero or +an attempt to extract the car of a symbol. In a professionally +written high-quality system, each primitive application is checked for +safety as part of the primitive. For example, every call to car +could first check that the argument is a pair. If the argument is not +a pair, the application would return a distinguished condition code to +the evaluator, which would then report the failure. We could arrange +for this in our register-machine simulator by making each primitive +procedure +check for applicability and returning an appropriate distinguished +condition code on failure. Then the primitive-apply code in the +evaluator can check for the condition code and go to signal-error if necessary. Build this structure and make it work. +This is a major project. + +

                                                                                    + +


                                                                                    +

                                                                                    19 See Batali et al. 1982 for more +information on the chip and the method by which it was designed. + +

                                                                                    20 In our controller, the dispatch is written as a +sequence of test and branch instructions. Alternatively, +it could have been written in a data-directed style (and in a real +system it probably would have been) to avoid the need to perform +sequential tests and to facilitate the definition of new expression +types. A machine designed to run Lisp would probably include a dispatch-on-type instruction that would efficiently execute such +data-directed dispatches. + +

                                                                                    21 This is an important but subtle point in translating +algorithms from a procedural language, such as Lisp, to a +register-machine language. As an alternative to saving only what is +needed, we could save all the registers (except val) before each +recursive call. This is called a framed-stack discipline. This +would work but might save more registers than necessary; this could be +an important consideration in a system where stack operations are +expensive. Saving registers whose contents will not be needed later +may also hold onto useless data that could otherwise be +garbage-collected, freeing space to be reused. + +

                                                                                    22 We add to the evaluator data-structure procedures in +section 4.1.3 the following two procedures +for manipulating argument lists: +

                                                                                    (define (empty-arglist) '())
                                                                                    +
                                                                                    +(define (adjoin-arg arg arglist)
                                                                                    +  (append arglist (list arg)))
                                                                                    +

                                                                                    +We also use an additional syntax procedure to test for the +last operand in a combination: +

                                                                                    (define (last-operand? ops)
                                                                                    +  (null? (cdr ops)))
                                                                                    +

                                                                                    + + +

                                                                                    23 The optimization of treating the last operand +specially is known as evlis tail recursion (see Wand 1980). +We could be somewhat more efficient +in the argument evaluation loop if we made evaluation of the first +operand a special case too. This would permit us to postpone +initializing argl until after evaluating the first operand, so +as to avoid saving argl in this case. The compiler in +section 5.5 performs this optimization. (Compare +the construct-arglist procedure of +section 5.5.3.) + +

                                                                                    24 The +order of operand evaluation in the metacircular evaluator is +determined by the order of evaluation of the arguments to cons +in the procedure list-of-values of section 4.1.1 +(see exercise 4.1). + +

                                                                                    25 We saw in +section 5.1 how to implement such a +process with a register machine that had no stack; the state of the +process was stored in a fixed set of registers. + +

                                                                                    26 This implementation of tail recursion in +ev-sequence is one variety of a well-known optimization technique used +by many compilers. In compiling a procedure that ends with a procedure call, +one can replace the call by a jump to the called procedure's entry point. +Building this strategy into the interpreter, as we have done in this section, +provides the optimization uniformly throughout the language. + +

                                                                                    27 We can define no-more-exps? as follows: +

                                                                                    (define (no-more-exps? seq) (null? seq))
                                                                                    +

                                                                                    + + +

                                                                                    28 This isn't really cheating. In an actual +implementation built from scratch, we would use our explicit-control +evaluator to interpret a Scheme program that performs source-level +transformations like cond->if in a syntax phase that runs before +execution. + +

                                                                                    29 We assume here that read and the +various printing operations are +available as primitive machine operations, which is useful for our +simulation, but completely unrealistic in practice. These +are actually extremely complex operations. In practice, they would be +implemented using low-level input-output operations +such as transferring single characters to and from a device.

                                                                                    + +To support the get-global-environment operation we define +

                                                                                    (define the-global-environment (setup-environment))
                                                                                    +
                                                                                    +(define (get-global-environment)
                                                                                    +  the-global-environment)
                                                                                    +

                                                                                    + + +

                                                                                    30 There are other +errors that we would like the interpreter to handle, but these are not +so simple. See exercise 5.30. + +

                                                                                    31 We +could perform the stack initialization only after errors, but doing it in +the driver loop will be convenient for monitoring the evaluator's +performance, as described below. + +

                                                                                    32 Regrettably, this is the normal state of affairs in +conventional compiler-based language systems such as C. +In UNIX TM the system ``dumps core,'' and in +DOS/Windows TM it becomes catatonic. +The Macintosh TM displays a +picture of an exploding bomb and offers you the opportunity to reboot +the computer -- if you're lucky. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-35.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-35.html new file mode 100644 index 00000000..66c0da0b --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-35.html @@ -0,0 +1,2352 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    5.5  Compilation

                                                                                    + + + +The explicit-control evaluator of section 5.4 is a +register machine whose controller interprets Scheme programs. In this +section we will see how to run Scheme programs on a register machine +whose controller is not a Scheme interpreter.

                                                                                    + +The explicit-control evaluator machine is universal -- it can carry out +any computational process that can be described in Scheme. The +evaluator's controller orchestrates the use of its data paths to +perform the desired computation. Thus, the evaluator's data paths are +universal: They are sufficient to perform any computation we desire, +given an appropriate controller.33

                                                                                    + +Commercial general-purpose computers are register machines organized +around a collection of registers and operations that constitute +an efficient and convenient universal set of data paths. +The controller for a general-purpose machine is an interpreter for +a register-machine language like the one we have been using. This +language is called the native language of the machine, or simply +machine language. Programs written in machine language are +sequences of instructions that use the machine's data paths. +For example, the explicit-control evaluator's instruction sequence +can be thought of as a machine-language program for a general-purpose +computer rather than as the controller for a specialized interpreter +machine.

                                                                                    + +There are two common strategies for bridging the gap between +higher-level languages and register-machine languages. The +explicit-control evaluator illustrates the +strategy of interpretation. An interpreter written in the native +language of a machine configures the machine to execute programs +written in a language (called the source language) that may +differ from the native language of the machine performing the +evaluation. The primitive procedures of the source language are +implemented as a library of subroutines written in the native language +of the given machine. A program to be interpreted (called the source program) is represented as a data structure. The interpreter +traverses this data structure, analyzing the source program. As it +does so, it simulates the intended behavior of the source program by +calling appropriate primitive subroutines from the library.

                                                                                    + + +In this section, we explore the alternative strategy of compilation. A compiler for a given source language and machine +translates a source program into an equivalent program (called the +object program) written in the machine's native language. The +compiler that we implement in this section translates programs written +in Scheme into sequences of instructions to be executed using +the explicit-control evaluator machine's data paths.34

                                                                                    + +Compared with interpretation, compilation can provide a great increase +in the efficiency of program execution, as we will explain below in +the overview of the compiler. On the other hand, an interpreter +provides a more powerful environment for interactive program +development and debugging, because the source program being executed +is available at run time to be examined and modified. In addition, +because the entire library of primitives is present, new programs can +be constructed and added to the system during debugging.

                                                                                    + +In view of the complementary advantages of compilation and +interpretation, modern program-development environments pursue a mixed +strategy. Lisp interpreters are generally organized so that +interpreted procedures and compiled procedures can call each other. +This enables a programmer to compile those parts of a program that are +assumed to be debugged, thus gaining the efficiency advantage of +compilation, while retaining the interpretive mode of execution for +those parts of the program that are in the flux of interactive +development and debugging. In +section 5.5.7, after we have implemented +the compiler, we will show how to interface it with our interpreter to +produce an integrated interpreter-compiler development system.

                                                                                    + + +

                                                                                    An overview of the compiler

                                                                                    + + +Our compiler is much like our interpreter, both in its structure and in +the function it performs. Accordingly, the mechanisms used by the +compiler for analyzing expressions will be similar to those used by +the interpreter. Moreover, to make it easy to interface compiled and +interpreted code, we will design the compiler to generate code that +obeys the same conventions of register usage as the interpreter: The +environment will be kept in the env register, argument lists +will be accumulated in argl, a procedure to be applied will be +in proc, procedures will return their answers in val, +and the location to which a procedure should return will be kept in +continue. +In general, the compiler translates a source program into an object +program that performs essentially the same register operations as +would the interpreter in evaluating the same source program.

                                                                                    + +This description suggests a strategy for implementing a rudimentary +compiler: We traverse the expression in the same way the +interpreter does. When we encounter a register instruction that the +interpreter would perform in evaluating the expression, we do not +execute the instruction but instead accumulate it into a sequence. The +resulting sequence of instructions will be the object code. Observe +the efficiency advantage of compilation over interpretation. Each +time the interpreter evaluates an expression -- for example, +(f 84 96) -- it performs the work of +classifying the expression (discovering that this +is a procedure application) and testing for the end of the operand list +(discovering that there are two operands). With a +compiler, the expression is analyzed only once, when the +instruction sequence is generated at compile time. The object code +produced by the compiler contains only the instructions that evaluate +the operator and the two operands, assemble the argument list, +and apply the procedure (in proc) to the arguments (in argl).

                                                                                    + + +This is the same kind of optimization we implemented in the +analyzing evaluator of section 4.1.7. +But there are further opportunities to gain efficiency in compiled code. +As the interpreter runs, it follows a process that must be applicable +to any expression in the language. In contrast, a given segment of +compiled code is meant to execute some particular expression. This +can make a big difference, for example in the use of the stack to +save registers. When the interpreter evaluates an expression, it must +be prepared for any contingency. Before evaluating a subexpression, +the interpreter saves all +registers that will be needed later, because +the subexpression might require an arbitrary evaluation. +A compiler, on the other hand, can exploit the structure of the +particular expression it is processing to generate code that avoids +unnecessary stack operations.

                                                                                    + +As a case in point, consider the combination (f 84 96). Before +the interpreter evaluates the operator of the combination, it prepares +for this evaluation by saving the registers containing the operands +and the environment, whose values will be needed later. The +interpreter then evaluates the operator to obtain the result in val, restores the saved registers, and finally moves the result from +val to proc. However, in the particular expression we are +dealing with, the operator is the symbol f, whose evaluation is +accomplished by the machine operation lookup-variable-value, +which does not alter any registers. The compiler that we implement in +this section will take advantage of this fact and generate code that +evaluates the operator using the instruction +

                                                                                    (assign proc (op lookup-variable-value) (const f) (reg env))
                                                                                    +

                                                                                    +This code not only avoids the unnecessary saves and +restores but also assigns the value of the lookup directly to +proc, whereas the interpreter would obtain the result in val +and then move this to proc.

                                                                                    + + +A compiler can also optimize access to the environment. Having +analyzed the code, the compiler can in many cases know in which frame +a particular variable will be located and access that frame directly, +rather than performing the lookup-variable-value search. We +will discuss how to implement such variable access in +section 5.5.6. Until then, however, we will +focus on the kind of register and stack optimizations described above. +There are many other optimizations that can be performed by a +compiler, such as coding primitive operations ``in line'' instead of +using a general apply mechanism (see +exercise 5.38); but we will not emphasize these here. +Our main goal in this section is to illustrate the compilation process +in a simplified (but still interesting) context.

                                                                                    + + +

                                                                                    5.5.1  Structure of the Compiler

                                                                                    + + + +In section 4.1.7 we modified our original +metacircular interpreter to separate analysis from execution. We +analyzed each expression to produce an execution procedure that took +an environment as argument and performed the required operations. In +our compiler, we will do essentially the same analysis. Instead of +producing execution procedures, however, we will generate sequences of +instructions to be run by our register machine.

                                                                                    + + +The procedure compile is the top-level dispatch in the compiler. +It corresponds to the eval procedure of +section 4.1.1, the analyze procedure of +section 4.1.7, and the eval-dispatch +entry point of the explicit-control-evaluator in +section 5.4.1. +The compiler, like the interpreters, uses the expression-syntax +procedures defined in section 4.1.2.35 +Compile performs a case +analysis on the syntactic type of the expression to be compiled. For +each type of expression, it dispatches to a specialized code +generator:

                                                                                    + +

                                                                                    (define (compile exp target linkage)
                                                                                    +  (cond ((self-evaluating? exp)
                                                                                    +         (compile-self-evaluating exp target linkage))
                                                                                    +        ((quoted? exp) (compile-quoted exp target linkage))
                                                                                    +        ((variable? exp)
                                                                                    +         (compile-variable exp target linkage))
                                                                                    +        ((assignment? exp)
                                                                                    +         (compile-assignment exp target linkage))
                                                                                    +        ((definition? exp)
                                                                                    +         (compile-definition exp target linkage))
                                                                                    +        ((if? exp) (compile-if exp target linkage))
                                                                                    +        ((lambda? exp) (compile-lambda exp target linkage))
                                                                                    +        ((begin? exp)
                                                                                    +         (compile-sequence (begin-actions exp)
                                                                                    +                           target
                                                                                    +                           linkage))
                                                                                    +        ((cond? exp) (compile (cond->if exp) target linkage))
                                                                                    +        ((application? exp)
                                                                                    +         (compile-application exp target linkage))
                                                                                    +        (else
                                                                                    +         (error "Unknown expression type -- COMPILE" exp))))
                                                                                    +

                                                                                    + + + +

                                                                                    Targets and linkages

                                                                                    + +Compile and the code generators that it calls take two arguments +in addition to the expression to compile. There is a target, +which specifies the register in which the compiled code is to return +the value of the expression. There is also a linkage +descriptor, which describes how the code resulting from the +compilation of the expression should proceed when it has finished its +execution. The linkage descriptor can require that the code do one of +the following three things:

                                                                                    + +

                                                                                      +
                                                                                    • continue at the next instruction in sequence (this is +specified by the linkage descriptor next),

                                                                                      + +

                                                                                    • return from the procedure being compiled (this is specified +by the linkage descriptor return), or

                                                                                      + +

                                                                                    • jump to a named entry point (this is specified by using the +designated label as the linkage descriptor). +

                                                                                    + +For example, compiling the expression 5 (which is +self-evaluating) with a target of the val register and a +linkage of next should produce the instruction

                                                                                    + +

                                                                                    (assign val (const 5))
                                                                                    +

                                                                                    +Compiling the same expression with a linkage of return should +produce the instructions

                                                                                    + +

                                                                                    (assign val (const 5))
                                                                                    +(goto (reg continue))
                                                                                    +

                                                                                    +In the first case, execution will continue with the next instruction +in the sequence. In the second case, we will return from a procedure +call. In both cases, the value of the expression will be placed into +the target val register.

                                                                                    + + +

                                                                                    Instruction sequences and stack usage

                                                                                    + +

                                                                                    + +Each code generator returns an instruction sequence containing +the object code it has generated for the expression. Code generation +for a compound expression is accomplished by combining the output from +simpler code generators for component expressions, just as +evaluation of a compound expression is accomplished by evaluating the +component expressions.

                                                                                    + + +The simplest method for combining instruction sequences is a procedure +called append-instruction-sequences. It takes as arguments any +number of instruction sequences that are to be executed sequentially; +it appends them and returns the combined sequence. That is, if +<seq1> and <seq2> are sequences of instructions, then +evaluating +

                                                                                    (append-instruction-sequences <seq1> <seq2>)
                                                                                    +

                                                                                    +produces the sequence +

                                                                                    <seq1>
                                                                                    +<seq2>
                                                                                    +

                                                                                    + +Whenever registers might need to be saved, the compiler's code generators use +preserving, which is a more subtle method for combining +instruction sequences. Preserving takes three arguments: a set +of registers and two instruction sequences that are to be executed +sequentially. It appends the sequences in such a way that the +contents of each register in the set is preserved over the execution +of the first sequence, if this is needed for the execution of the +second sequence. That is, if the first sequence modifies the register +and the second sequence actually needs the register's original +contents, then preserving wraps a save and a restore +of the register around the first sequence before appending the +sequences. Otherwise, preserving simply returns the appended +instruction sequences. Thus, for example, +

                                                                                    (preserving (list <reg1> <reg2>) <seq1> <seq2>)
                                                                                    +

                                                                                    +produces one of the following four sequences of instructions, depending on how +<seq1> and <seq2> use <reg1> and <reg2>:

                                                                                    + +

                                                                                    + +By using preserving to combine instruction sequences the +compiler avoids unnecessary stack operations. This also isolates the +details of whether or not to generate save and restore +instructions within the preserving procedure, separating them +from the concerns that arise in writing each of the individual code +generators. +In fact no save or restore instructions are explicitly +produced by the code generators.

                                                                                    + +In principle, we could represent an instruction sequence simply as a +list of instructions. Append-instruction-sequences could then +combine instruction sequences by performing an ordinary list append. However, preserving would then be a complex operation, +because it would have to analyze each instruction sequence to +determine how the sequence uses its registers. Preserving +would be inefficient as well as complex, because it would have to +analyze each of its instruction sequence arguments, even though these +sequences might themselves have been constructed by calls to preserving, in which case their parts would have already been +analyzed. To avoid such repetitious analysis we will associate with each +instruction sequence some information about its register use. +When we construct a basic instruction sequence we +will provide this information explicitly, +and the procedures that combine instruction sequences will derive +register-use information for the combined sequence from the +information associated with the component sequences.

                                                                                    + +An instruction sequence will contain three pieces of information: +

                                                                                      +
                                                                                    • the set of registers that must be initialized before the +instructions in the sequence are executed (these registers are said to +be needed by the sequence),

                                                                                      + +

                                                                                    • the set of registers whose values are modified by the +instructions in the sequence, and

                                                                                      + +

                                                                                    • the actual instructions (also called statements) in +the sequence. +

                                                                                    + +We will represent an instruction sequence as a list of its three +parts. The constructor for instruction sequences is thus

                                                                                    + +

                                                                                    (define (make-instruction-sequence needs modifies statements)
                                                                                    +  (list needs modifies statements))
                                                                                    +

                                                                                    + +For example, the two-instruction sequence that looks up the value of +the variable x in the current environment, assigns the result +to val, and then returns, requires registers env and continue to have been initialized, and modifies register val. +This sequence would therefore be constructed as

                                                                                    + +

                                                                                    (make-instruction-sequence '(env continue) '(val)
                                                                                    + '((assign val
                                                                                    +           (op lookup-variable-value) (const x) (reg env))
                                                                                    +   (goto (reg continue))))
                                                                                    +

                                                                                    + +We sometimes need to construct an instruction sequence with no statements: +

                                                                                    (define (empty-instruction-sequence)
                                                                                    +  (make-instruction-sequence '() '() '()))
                                                                                    +

                                                                                    +

                                                                                    + +The procedures for combining instruction sequences are shown in +section 5.5.4.

                                                                                    + +

                                                                                    +Exercise 5.31.  In evaluating a procedure application, the explicit-control evaluator +always saves and restores +the env register around the evaluation of the operator, saves and +restores env around the evaluation of each operand (except the +final one), saves and restores argl around the evaluation of each +operand, and saves and restores proc around the evaluation of the +operand sequence. For each of the following combinations, say which +of these save and restore operations are superfluous and +thus could be eliminated by the compiler's preserving mechanism:

                                                                                    + +

                                                                                    (f 'x 'y)
                                                                                    +
                                                                                    +((f) 'x 'y)
                                                                                    +
                                                                                    +(f (g 'x) y)
                                                                                    +
                                                                                    +(f (g 'x) 'y)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.32.  Using the preserving mechanism, the compiler will avoid saving +and restoring env around the evaluation of the operator of a +combination in the case where the operator is a symbol. We could also +build such optimizations into the evaluator. Indeed, the +explicit-control evaluator of section 5.4 already +performs a similar optimization, by treating combinations with no +operands as a special case.

                                                                                    + +

                                                                                    a. Extend the explicit-control evaluator to recognize as a separate class +of expressions combinations whose operator is a symbol, and to take +advantage of this fact in evaluating such expressions.

                                                                                    + +

                                                                                    b. Alyssa P. Hacker suggests that by extending the evaluator to recognize +more and more special cases we could incorporate all the compiler's +optimizations, and that this would eliminate the advantage of compilation +altogether. What do you think of this idea? +

                                                                                    + + +

                                                                                    5.5.2  Compiling Expressions

                                                                                    + +In this section and the next we implement the code generators to which the compile procedure dispatches.

                                                                                    + + +

                                                                                    Compiling linkage code

                                                                                    + +In general, the output of each code generator will end with +instructions -- generated by the procedure compile-linkage -- that +implement the required linkage. If the linkage is return then +we must generate the instruction (goto (reg continue)). This +needs the continue register and does not modify any registers. +If the linkage is next, then we needn't include any additional +instructions. Otherwise, the linkage is a label, and we generate a +goto to that label, an instruction that does not need or modify +any registers.36

                                                                                    + + +

                                                                                    (define (compile-linkage linkage)
                                                                                    +  (cond ((eq? linkage 'return)
                                                                                    +         (make-instruction-sequence '(continue) '()
                                                                                    +          '((goto (reg continue)))))
                                                                                    +        ((eq? linkage 'next)
                                                                                    +         (empty-instruction-sequence))
                                                                                    +        (else
                                                                                    +         (make-instruction-sequence '() '()
                                                                                    +          `((goto (label ,linkage)))))))
                                                                                    +

                                                                                    +The linkage code is appended to an instruction sequence by preserving +the continue register, since a return linkage will +require the continue register: +If the given instruction sequence modifies continue and the +linkage code needs it, continue will be saved and restored.

                                                                                    + + +

                                                                                    (define (end-with-linkage linkage instruction-sequence)
                                                                                    +  (preserving '(continue)
                                                                                    +   instruction-sequence
                                                                                    +   (compile-linkage linkage)))
                                                                                    +

                                                                                    + +

                                                                                    + + +

                                                                                    Compiling simple expressions

                                                                                    + +The code generators for self-evaluating expressions, +quotations, and variables construct instruction +sequences that assign the required value to the target register +and then proceed as specified by the linkage descriptor.

                                                                                    + + +

                                                                                    (define (compile-self-evaluating exp target linkage)
                                                                                    +  (end-with-linkage linkage
                                                                                    +   (make-instruction-sequence '() (list target)
                                                                                    +    `((assign ,target (const ,exp))))))
                                                                                    +(define (compile-quoted exp target linkage)
                                                                                    +  (end-with-linkage linkage
                                                                                    +   (make-instruction-sequence '() (list target)
                                                                                    +    `((assign ,target (const ,(text-of-quotation exp)))))))
                                                                                    +(define (compile-variable exp target linkage)
                                                                                    +  (end-with-linkage linkage
                                                                                    +   (make-instruction-sequence '(env) (list target)
                                                                                    +    `((assign ,target
                                                                                    +              (op lookup-variable-value)
                                                                                    +              (const ,exp)
                                                                                    +              (reg env))))))
                                                                                    +

                                                                                    +All these assignment instructions modify the target register, +and the one that looks up a variable needs the env register.

                                                                                    + +Assignments and definitions are handled much as they are in the +interpreter. We recursively generate code that computes the value to +be assigned to the variable, and append to it a two-instruction +sequence that actually sets or defines the variable and assigns the +value of the whole expression (the symbol ok) to the target +register. The recursive compilation has target val and linkage +next so that the code will put its result into val and +continue with the code that is appended after it. The appending is +done preserving env, since the environment is needed for setting +or defining the variable and the code for the variable value could be +the compilation of a complex expression that might modify the +registers in arbitrary ways.

                                                                                    + +

                                                                                    (define (compile-assignment exp target linkage)
                                                                                    +  (let ((var (assignment-variable exp))
                                                                                    +        (get-value-code
                                                                                    +         (compile (assignment-value exp) 'val 'next)))
                                                                                    +    (end-with-linkage linkage
                                                                                    +     (preserving '(env)
                                                                                    +      get-value-code
                                                                                    +      (make-instruction-sequence '(env val) (list target)
                                                                                    +       `((perform (op set-variable-value!)
                                                                                    +                  (const ,var)
                                                                                    +                  (reg val)
                                                                                    +                  (reg env))
                                                                                    +         (assign ,target (const ok))))))))
                                                                                    +(define (compile-definition exp target linkage)
                                                                                    +  (let ((var (definition-variable exp))
                                                                                    +        (get-value-code
                                                                                    +         (compile (definition-value exp) 'val 'next)))
                                                                                    +    (end-with-linkage linkage
                                                                                    +     (preserving '(env)
                                                                                    +      get-value-code
                                                                                    +      (make-instruction-sequence '(env val) (list target)
                                                                                    +       `((perform (op define-variable!)
                                                                                    +                  (const ,var)
                                                                                    +                  (reg val)
                                                                                    +                  (reg env))
                                                                                    +         (assign ,target (const ok))))))))
                                                                                    +

                                                                                    +The appended two-instruction sequence requires env and val +and modifies the target. Note that although we preserve env for +this sequence, we do not preserve val, because the get-value-code is designed to explicitly place its result in val for use by this sequence. +(In fact, if we did preserve val, we would +have a bug, because this would cause the previous contents of val to be restored right after the get-value-code is run.)

                                                                                    + + +

                                                                                    Compiling conditional expressions

                                                                                    + +The code for an if expression +compiled with a given target and linkage has the form

                                                                                    + +

                                                                                     <compilation of predicate, target val, linkage next>
                                                                                    + (test (op false?) (reg val))
                                                                                    + (branch (label false-branch))
                                                                                    +true-branch
                                                                                    + <compilation of consequent with given target and given linkage or after-if>
                                                                                    +false-branch
                                                                                    + <compilation of alternative with given target and linkage>
                                                                                    +after-if
                                                                                    +

                                                                                    + +To generate this code, we compile the predicate, consequent, +and alternative, and combine the resulting code with instructions +to test the predicate result and with newly generated labels +to mark the true and false branches and the end of the conditional.37 +In this arrangement of code, we must branch around the true branch +if the test is false. The only slight complication is in how the +linkage for the true branch should be handled. If the linkage for the +conditional is return or a label, then the true and false +branches will both use this same linkage. If the linkage is next, the true branch ends with a jump around the code for the false +branch to the label at the end of the conditional.

                                                                                    + + + +

                                                                                    (define (compile-if exp target linkage)
                                                                                    +  (let ((t-branch (make-label 'true-branch))
                                                                                    +        (f-branch (make-label 'false-branch))                    
                                                                                    +        (after-if (make-label 'after-if)))
                                                                                    +    (let ((consequent-linkage
                                                                                    +           (if (eq? linkage 'next) after-if linkage)))
                                                                                    +      (let ((p-code (compile (if-predicate exp) 'val 'next))
                                                                                    +            (c-code
                                                                                    +             (compile
                                                                                    +              (if-consequent exp) target consequent-linkage))
                                                                                    +            (a-code
                                                                                    +             (compile (if-alternative exp) target linkage)))
                                                                                    +        (preserving '(env continue)
                                                                                    +         p-code
                                                                                    +         (append-instruction-sequences
                                                                                    +          (make-instruction-sequence '(val) '()
                                                                                    +           `((test (op false?) (reg val))
                                                                                    +             (branch (label ,f-branch))))
                                                                                    +          (parallel-instruction-sequences
                                                                                    +           (append-instruction-sequences t-branch c-code)
                                                                                    +           (append-instruction-sequences f-branch a-code))
                                                                                    +          after-if))))))
                                                                                    +

                                                                                    +Env is preserved around the predicate code because it could be needed by +the true and false branches, and continue is preserved because it could +be needed by the linkage code in those branches. The code for the true and +false branches (which are not executed sequentially) is appended using a +special combiner parallel-instruction-sequences described in +section 5.5.4.

                                                                                    + + +Note that cond is a derived expression, so all that the +compiler needs to do handle it is to apply the cond->if +transformer (from section 4.1.2) and +compile the resulting if expression.

                                                                                    + + +

                                                                                    Compiling sequences

                                                                                    + +The compilation of sequences (from procedure bodies or explicit begin expressions) parallels their evaluation. Each expression of the +sequence is compiled -- the last expression with the linkage specified +for the sequence, and the other expressions with linkage next +(to execute the rest of the sequence). +The instruction sequences for the individual expressions are appended +to form a single instruction sequence, such that env (needed for +the rest of the sequence) and continue (possibly needed for the +linkage at the end of the sequence) are preserved.

                                                                                    + +

                                                                                    (define (compile-sequence seq target linkage)
                                                                                    +  (if (last-exp? seq)
                                                                                    +      (compile (first-exp seq) target linkage)
                                                                                    +      (preserving '(env continue)
                                                                                    +       (compile (first-exp seq) target 'next)
                                                                                    +       (compile-sequence (rest-exps seq) target linkage))))
                                                                                    +

                                                                                    + + +

                                                                                    Compiling lambda expressions

                                                                                    + +Lambda expressions construct procedures. +The object code for a lambda expression must have the form

                                                                                    + +

                                                                                    <construct procedure object and assign it to target register>
                                                                                    +<linkage>
                                                                                    +

                                                                                    +When we compile the lambda expression, we also generate the code for the +procedure body. Although the body won't be executed at the time of procedure +construction, it is convenient to insert it into the object code right after +the code for the lambda. If the linkage for the lambda expression +is a label or return, this is fine. But if the linkage is next, +we will need to skip around the code for the procedure body by using a linkage +that jumps to a label that is inserted after the body. The object code thus +has the form

                                                                                    + +

                                                                                     <construct procedure object and assign it to target register>
                                                                                    + <code for given linkage>or (goto (label after-lambda))
                                                                                    + <compilation of procedure body>
                                                                                    +after-lambda
                                                                                    +

                                                                                    + +Compile-lambda generates the code for constructing the procedure +object followed by the code for the procedure body. +The procedure object will be constructed at run time by combining +the current environment (the environment at the point of definition) +with the entry point to the compiled procedure body (a newly generated +label).38

                                                                                    + +

                                                                                    (define (compile-lambda exp target linkage)
                                                                                    +  (let ((proc-entry (make-label 'entry))
                                                                                    +        (after-lambda (make-label 'after-lambda)))
                                                                                    +    (let ((lambda-linkage
                                                                                    +           (if (eq? linkage 'next) after-lambda linkage)))
                                                                                    +      (append-instruction-sequences
                                                                                    +       (tack-on-instruction-sequence
                                                                                    +        (end-with-linkage lambda-linkage
                                                                                    +         (make-instruction-sequence '(env) (list target)
                                                                                    +          `((assign ,target
                                                                                    +                    (op make-compiled-procedure)
                                                                                    +                    (label ,proc-entry)
                                                                                    +                    (reg env)))))
                                                                                    +        (compile-lambda-body exp proc-entry))
                                                                                    +       after-lambda))))
                                                                                    +

                                                                                    +Compile-lambda uses the special combiner tack-on-instruction-sequence +(section 5.5.4) rather than append-instruction-sequences to append the procedure body to the lambda +expression code, because the body is not part of the sequence of instructions +that will be executed when the combined sequence is entered; rather, it is in +the sequence only because that was a convenient place to put it.

                                                                                    + + +Compile-lambda-body constructs the code for the body of the +procedure. This code begins with a label for the entry point. Next +come instructions that will cause the run-time evaluation environment +to switch to the correct environment for evaluating the procedure +body -- namely, the definition environment of the procedure, extended +to include the bindings of the formal parameters to the arguments with +which the procedure is called. After this comes the code for the +sequence of expressions that makes up the procedure body. +The sequence is compiled with linkage return and target val +so that it will end by returning from the procedure with the +procedure result in val.

                                                                                    + +

                                                                                    (define (compile-lambda-body exp proc-entry)
                                                                                    +  (let ((formals (lambda-parameters exp)))
                                                                                    +    (append-instruction-sequences
                                                                                    +     (make-instruction-sequence '(env proc argl) '(env)
                                                                                    +      `(,proc-entry
                                                                                    +        (assign env (op compiled-procedure-env) (reg proc))
                                                                                    +        (assign env
                                                                                    +                (op extend-environment)
                                                                                    +                (const ,formals)
                                                                                    +                (reg argl)
                                                                                    +                (reg env))))
                                                                                    +     (compile-sequence (lambda-body exp) 'val 'return))))
                                                                                    +

                                                                                    + + +

                                                                                    5.5.3  Compiling Combinations

                                                                                    + + + +The essence of the compilation process is the compilation of procedure +applications. +The code for a combination compiled with a given target and linkage +has the form +

                                                                                    <compilation of operator, target proc, linkage next>
                                                                                    +<evaluate operands and construct argument list in argl>
                                                                                    +<compilation of procedure call with given target and linkage>
                                                                                    +

                                                                                    +The registers env, proc, and argl may have to be +saved and restored during evaluation of the operator and operands. +Note that this is the only place in the compiler where a target other +than val is specified.

                                                                                    + +The required code is generated by compile-application. This +recursively compiles the operator, to produce code that puts the +procedure to be applied into proc, and compiles the operands, to +produce code that evaluates the individual operands of the +application. The instruction sequences for the operands are combined +(by construct-arglist) with code that constructs the list of +arguments in argl, and the resulting argument-list code is +combined with the procedure code and the code that performs the +procedure call (produced by compile-procedure-call). In +appending the code sequences, the env register must be preserved +around the evaluation of the operator (since evaluating the operator +might modify env, which will be needed to evaluate the +operands), and the proc register must be preserved around the +construction of the argument list (since evaluating the operands might +modify proc, which will be needed for the actual procedure +application). Continue must also be preserved throughout, since +it is needed for the linkage in the procedure call.

                                                                                    + +

                                                                                    (define (compile-application exp target linkage)
                                                                                    +  (let ((proc-code (compile (operator exp) 'proc 'next))
                                                                                    +        (operand-codes
                                                                                    +         (map (lambda (operand) (compile operand 'val 'next))
                                                                                    +              (operands exp))))
                                                                                    +    (preserving '(env continue)
                                                                                    +     proc-code
                                                                                    +     (preserving '(proc continue)
                                                                                    +      (construct-arglist operand-codes)
                                                                                    +      (compile-procedure-call target linkage)))))
                                                                                    +

                                                                                    + +The code to construct the argument list will evaluate each operand into +val and then cons that value onto the argument list being +accumulated in argl. +Since we cons the arguments onto argl in sequence, we must +start with the last argument and end with the first, so that the +arguments will appear in order from first to last in the resulting list. +Rather than waste an instruction by initializing argl to the empty list +to set up for this sequence of evaluations, +we make the first code sequence construct the initial argl. +The general form of the argument-list construction is thus as follows:

                                                                                    + +

                                                                                    <compilation of last operand, targeted to val>
                                                                                    +(assign argl (op list) (reg val))
                                                                                    +<compilation of next operand, targeted to val>
                                                                                    +(assign argl (op cons) (reg val) (reg argl))
                                                                                    +...<compilation of first operand, targeted to val>
                                                                                    +(assign argl (op cons) (reg val) (reg argl))
                                                                                    +

                                                                                    +Argl must be preserved around each operand evaluation except +the first (so that arguments accumulated so far won't be lost), and +env must be preserved around each operand evaluation +except the last (for use by subsequent operand evaluations).

                                                                                    + +Compiling this argument code is a bit tricky, because of +the special treatment of the first operand to be evaluated and the +need to preserve argl and env in different places. +The construct-arglist procedure takes as arguments the code that +evaluates the individual operands. If there are no operands at all, it simply +emits the instruction

                                                                                    + +

                                                                                    (assign argl (const ()))
                                                                                    +

                                                                                    +Otherwise, construct-arglist creates code that initializes argl with the last argument, and appends code that evaluates +the rest of the arguments and adjoins them to argl in +succession. In order to process the arguments from last to +first, we must reverse the list of operand code sequences from the order +supplied by compile-application.

                                                                                    + +

                                                                                    (define (construct-arglist operand-codes)
                                                                                    +  (let ((operand-codes (reverse operand-codes)))
                                                                                    +    (if (null? operand-codes)
                                                                                    +        (make-instruction-sequence '() '(argl)
                                                                                    +         '((assign argl (const ()))))
                                                                                    +        (let ((code-to-get-last-arg
                                                                                    +               (append-instruction-sequences
                                                                                    +                (car operand-codes)
                                                                                    +                (make-instruction-sequence '(val) '(argl)
                                                                                    +                 '((assign argl (op list) (reg val)))))))
                                                                                    +          (if (null? (cdr operand-codes))
                                                                                    +              code-to-get-last-arg
                                                                                    +              (preserving '(env)
                                                                                    +               code-to-get-last-arg
                                                                                    +               (code-to-get-rest-args
                                                                                    +                (cdr operand-codes))))))))
                                                                                    +(define (code-to-get-rest-args operand-codes)
                                                                                    +  (let ((code-for-next-arg
                                                                                    +         (preserving '(argl)
                                                                                    +          (car operand-codes)
                                                                                    +          (make-instruction-sequence '(val argl) '(argl)
                                                                                    +           '((assign argl
                                                                                    +              (op cons) (reg val) (reg argl)))))))
                                                                                    +    (if (null? (cdr operand-codes))
                                                                                    +        code-for-next-arg
                                                                                    +        (preserving '(env)
                                                                                    +         code-for-next-arg
                                                                                    +         (code-to-get-rest-args (cdr operand-codes))))))
                                                                                    +

                                                                                    + + +

                                                                                    Applying procedures

                                                                                    + +After evaluating the elements of a combination, the compiled code must +apply the procedure in proc to the arguments in argl. The +code performs essentially the same dispatch as the apply procedure in the +metacircular evaluator of section 4.1.1 or the +apply-dispatch entry point in the explicit-control evaluator of +section 5.4.1. It checks whether the +procedure to be applied is a primitive procedure or a compiled +procedure. For a primitive procedure, it uses apply-primitive-procedure; we will see shortly how it handles +compiled procedures. The procedure-application code has the following +form:

                                                                                    + +

                                                                                     (test (op primitive-procedure?) (reg proc))
                                                                                    + (branch (label primitive-branch))
                                                                                    +compiled-branch
                                                                                    + <code to apply compiled procedure with given target and appropriate linkage>
                                                                                    +primitive-branch
                                                                                    + (assign <target>
                                                                                    +         (op apply-primitive-procedure)
                                                                                    +         (reg proc)
                                                                                    +         (reg argl))
                                                                                    + <linkage>
                                                                                    +after-call
                                                                                    +

                                                                                    +Observe that the compiled branch must skip around the primitive +branch. Therefore, if the linkage for the original procedure call was +next, the compound branch must use a linkage that jumps to a +label that is inserted after the primitive branch. (This is similar +to the linkage used for the true branch in compile-if.)

                                                                                    + +

                                                                                    (define (compile-procedure-call target linkage)
                                                                                    +  (let ((primitive-branch (make-label 'primitive-branch))
                                                                                    +        (compiled-branch (make-label 'compiled-branch))
                                                                                    +        (after-call (make-label 'after-call)))
                                                                                    +    (let ((compiled-linkage
                                                                                    +           (if (eq? linkage 'next) after-call linkage)))
                                                                                    +      (append-instruction-sequences
                                                                                    +       (make-instruction-sequence '(proc) '()
                                                                                    +        `((test (op primitive-procedure?) (reg proc))
                                                                                    +          (branch (label ,primitive-branch))))
                                                                                    +       (parallel-instruction-sequences
                                                                                    +        (append-instruction-sequences
                                                                                    +         compiled-branch
                                                                                    +         (compile-proc-appl target compiled-linkage))
                                                                                    +        (append-instruction-sequences
                                                                                    +         primitive-branch
                                                                                    +         (end-with-linkage linkage
                                                                                    +          (make-instruction-sequence '(proc argl)
                                                                                    +                                     (list target)
                                                                                    +           `((assign ,target
                                                                                    +                     (op apply-primitive-procedure)
                                                                                    +                     (reg proc)
                                                                                    +                     (reg argl)))))))
                                                                                    +       after-call))))
                                                                                    +

                                                                                    +The primitive and compound branches, like the true +and false branches in compile-if, are appended using +parallel-instruction-sequences rather than the ordinary append-instruction-sequences, because they will +not be executed sequentially.

                                                                                    + + +

                                                                                    Applying compiled procedures

                                                                                    + +The code that handles procedure application is the most subtle part of +the compiler, even though the instruction sequences it generates are +very short. A compiled procedure (as constructed by compile-lambda) has an entry point, which is a label that designates +where the code for the procedure starts. The code at this entry point +computes a result in val and returns by executing the +instruction (goto (reg continue)). Thus, we might expect the +code for a compiled-procedure application (to be generated by compile-proc-appl) with a given target and linkage to look like this +if the linkage is a label + + +

                                                                                     (assign continue (label proc-return))
                                                                                    + (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    + (goto (reg val))
                                                                                    +proc-return
                                                                                    + (assign <target> (reg val))   ; included if target is not val
                                                                                    + (goto (label <linkage>))   ; linkage code
                                                                                    +

                                                                                    +or like this if the linkage is return. + +

                                                                                     (save continue)
                                                                                    + (assign continue (label proc-return))
                                                                                    + (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    + (goto (reg val))
                                                                                    +proc-return
                                                                                    + (assign <target> (reg val))   ; included if target is not val
                                                                                    + (restore continue)
                                                                                    + (goto (reg continue))   ; linkage code
                                                                                    +

                                                                                    +This code sets up continue so that the procedure will return to a +label proc-return and jumps to the procedure's entry point. The code +at proc-return transfers the procedure's result from val +to the target register (if necessary) and then jumps to +the location specified by the linkage. +(The linkage is always return or a label, because compile-procedure-call replaces a next linkage for the +compound-procedure branch by an after-call label.)

                                                                                    + + +In fact, if the target is not val, that is exactly the code our +compiler will generate.39 +Usually, however, the target is val (the only time the compiler +specifies a different register is when targeting the evaluation of an +operator to proc), so the procedure result is put directly into +the target register and there is no need to return to a special +location that copies it. Instead, we simplify the code by +setting up continue so that the procedure will ``return'' +directly to the place specified by the caller's linkage: + +

                                                                                    <set up continue for linkage>
                                                                                    +(assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +(goto (reg val))
                                                                                    +

                                                                                    +If the linkage is a label, we set up continue so that the procedure will return to +that label. (That is, the (goto (reg continue)) the procedure +ends with becomes equivalent to the (goto (label <linkage>)) at +proc-return above.) + +

                                                                                    (assign continue (label <linkage>))
                                                                                    +(assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +(goto (reg val))
                                                                                    +

                                                                                    +If the linkage is return, we don't need to set up continue +at all: It already holds the desired location. (That is, the (goto (reg continue)) the procedure ends with goes directly to the +place where the (goto (reg continue)) at proc-return would +have gone.) + +

                                                                                    (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +(goto (reg val))
                                                                                    +

                                                                                    +With this implementation of the return linkage, the compiler +generates tail-recursive code. Calling a procedure as the final step +in a procedure body does a direct transfer, without saving any +information on the stack.

                                                                                    + + +Suppose instead that we had handled the case of a procedure call with +a linkage of return and a target of val as shown above for +a non-val target. This would destroy tail recursion. Our +system would still give the same value for any expression. But each +time we called a procedure, we would save continue and return +after the call to undo the (useless) save. These extra saves would +accumulate during a nest of procedure calls.40

                                                                                    + +Compile-proc-appl generates the above procedure-application code by +considering four cases, depending on whether the target for the call +is val and whether the linkage is return. +Observe that the instruction sequences are +declared to modify all the registers, since executing the procedure +body can change the registers in arbitrary ways.41 +Also note that the code sequence for the case with target val +and linkage return is declared to need continue: Even +though continue is not explicitly used in the two-instruction +sequence, we must be sure that continue will have the correct +value when we enter the compiled procedure.

                                                                                    + + +

                                                                                    (define (compile-proc-appl target linkage)
                                                                                    +  (cond ((and (eq? target 'val) (not (eq? linkage 'return)))
                                                                                    +         (make-instruction-sequence '(proc) all-regs
                                                                                    +           `((assign continue (label ,linkage))
                                                                                    +             (assign val (op compiled-procedure-entry)
                                                                                    +                         (reg proc))
                                                                                    +             (goto (reg val)))))
                                                                                    +        ((and (not (eq? target 'val))
                                                                                    +              (not (eq? linkage 'return)))
                                                                                    +         (let ((proc-return (make-label 'proc-return)))
                                                                                    +           (make-instruction-sequence '(proc) all-regs
                                                                                    +            `((assign continue (label ,proc-return))
                                                                                    +              (assign val (op compiled-procedure-entry)
                                                                                    +                          (reg proc))
                                                                                    +              (goto (reg val))
                                                                                    +              ,proc-return
                                                                                    +              (assign ,target (reg val))
                                                                                    +              (goto (label ,linkage))))))
                                                                                    +        ((and (eq? target 'val) (eq? linkage 'return))
                                                                                    +         (make-instruction-sequence '(proc continue) all-regs
                                                                                    +          '((assign val (op compiled-procedure-entry)
                                                                                    +                        (reg proc))
                                                                                    +            (goto (reg val)))))
                                                                                    +        ((and (not (eq? target 'val)) (eq? linkage 'return))
                                                                                    +         (error "return linkage, target not val -- COMPILE"
                                                                                    +                target))))
                                                                                    +

                                                                                    +

                                                                                    + + +

                                                                                    5.5.4  Combining Instruction Sequences

                                                                                    + + + +This section describes the details on how instruction sequences are +represented and combined. Recall from +section 5.5.1 that an instruction sequence +is represented as a list of the registers needed, the registers +modified, and the actual instructions. We will also consider a label +(symbol) to be a degenerate case of an instruction sequence, which doesn't +need or modify any registers. +So to determine the registers needed +and modified by instruction sequences we use the selectors +

                                                                                    (define (registers-needed s)
                                                                                    +  (if (symbol? s) '() (car s)))
                                                                                    +(define (registers-modified s)
                                                                                    +  (if (symbol? s) '() (cadr s)))
                                                                                    +(define (statements s)
                                                                                    +  (if (symbol? s) (list s) (caddr s)))
                                                                                    +

                                                                                    +and to determine whether a given +sequence needs or modifies a given register we use the predicates +

                                                                                    (define (needs-register? seq reg)
                                                                                    +  (memq reg (registers-needed seq)))
                                                                                    +(define (modifies-register? seq reg)
                                                                                    +  (memq reg (registers-modified seq)))
                                                                                    +

                                                                                    +In terms of these predicates and selectors, we can implement the +various instruction sequence combiners used throughout the compiler.

                                                                                    + +The basic combiner is append-instruction-sequences. This takes as +arguments an arbitrary number of instruction sequences that are to be executed +sequentially and returns an instruction sequence whose statements are the +statements of all the sequences appended together. The subtle point is to +determine the registers that are needed and modified by the resulting +sequence. It modifies those registers that are modified by any of the +sequences; it needs those registers that must be initialized before the first +sequence can be run (the registers needed by the first sequence), together +with those registers needed by any of the other sequences that are not +initialized (modified) by sequences preceding it.

                                                                                    + +The sequences are appended two at a time by append-2-sequences. This +takes two instruction sequences seq1 and seq2 and returns the +instruction sequence whose statements are the statements of seq1 +followed by the statements of seq2, whose modified registers are those +registers that are modified by either seq1 or seq2, and whose +needed registers are the registers needed by seq1 together with those +registers needed by seq2 that are not modified by seq1. (In terms +of set operations, the new set of needed registers is the union of the set of +registers needed by seq1 with the set difference of the registers needed +by seq2 and the registers modified by seq1.) Thus, append-instruction-sequences is implemented as follows:

                                                                                    + +

                                                                                    (define (append-instruction-sequences . seqs)
                                                                                    +  (define (append-2-sequences seq1 seq2)
                                                                                    +    (make-instruction-sequence
                                                                                    +     (list-union (registers-needed seq1)
                                                                                    +                 (list-difference (registers-needed seq2)
                                                                                    +                                  (registers-modified seq1)))
                                                                                    +     (list-union (registers-modified seq1)
                                                                                    +                 (registers-modified seq2))
                                                                                    +     (append (statements seq1) (statements seq2))))
                                                                                    +  (define (append-seq-list seqs)
                                                                                    +    (if (null? seqs)
                                                                                    +        (empty-instruction-sequence)
                                                                                    +        (append-2-sequences (car seqs)
                                                                                    +                            (append-seq-list (cdr seqs)))))
                                                                                    +  (append-seq-list seqs))
                                                                                    +

                                                                                    + +This procedure uses some simple operations for manipulating sets +represented as lists, similar to the (unordered) set representation +described in section 2.3.3: +

                                                                                    (define (list-union s1 s2)
                                                                                    +  (cond ((null? s1) s2)
                                                                                    +        ((memq (car s1) s2) (list-union (cdr s1) s2))
                                                                                    +        (else (cons (car s1) (list-union (cdr s1) s2)))))
                                                                                    +(define (list-difference s1 s2)
                                                                                    +  (cond ((null? s1) '())
                                                                                    +        ((memq (car s1) s2) (list-difference (cdr s1) s2))
                                                                                    +        (else (cons (car s1)
                                                                                    +                    (list-difference (cdr s1) s2)))))
                                                                                    +

                                                                                    + + +Preserving, the second major instruction sequence combiner, takes a list +of registers regs and two instruction sequences seq1 and seq2 that are to be executed sequentially. It returns an instruction +sequence whose statements are the statements of seq1 followed by the +statements of seq2, with appropriate save and restore +instructions around seq1 to protect the registers in regs that are +modified by seq1 but needed by seq2. To accomplish this, preserving first creates a sequence that has the required saves +followed by the statements of seq1 followed by the required restores. This sequence needs the registers being saved and restored in +addition to the registers needed by seq1, and modifies the registers +modified by seq1 except for the ones being saved and restored. This +augmented sequence and seq2 are then appended in the usual way. The +following procedure implements this strategy recursively, walking down the +list of registers to be preserved:42 +

                                                                                    (define (preserving regs seq1 seq2)
                                                                                    +  (if (null? regs)
                                                                                    +      (append-instruction-sequences seq1 seq2)
                                                                                    +      (let ((first-reg (car regs)))
                                                                                    +        (if (and (needs-register? seq2 first-reg)
                                                                                    +                 (modifies-register? seq1 first-reg))
                                                                                    +            (preserving (cdr regs)
                                                                                    +             (make-instruction-sequence
                                                                                    +              (list-union (list first-reg)
                                                                                    +                          (registers-needed seq1))
                                                                                    +              (list-difference (registers-modified seq1)
                                                                                    +                               (list first-reg))
                                                                                    +              (append `((save ,first-reg))
                                                                                    +                      (statements seq1)
                                                                                    +                      `((restore ,first-reg))))
                                                                                    +             seq2)
                                                                                    +            (preserving (cdr regs) seq1 seq2)))))
                                                                                    +

                                                                                    + +Another sequence combiner, tack-on-instruction-sequence, +is used by compile-lambda to append a procedure body to another +sequence. Because the procedure body is not ``in line'' to be +executed as part of the combined sequence, its register use has no +impact on the register use of the sequence in which it is embedded. +We thus ignore the procedure body's sets of needed and modified +registers when we tack it onto the other sequence.

                                                                                    + +

                                                                                    (define (tack-on-instruction-sequence seq body-seq)
                                                                                    +  (make-instruction-sequence
                                                                                    +   (registers-needed seq)
                                                                                    +   (registers-modified seq)
                                                                                    +   (append (statements seq) (statements body-seq))))
                                                                                    +

                                                                                    + +Compile-if and compile-procedure-call use a special +combiner called parallel-instruction-sequences to append the two +alternative branches that follow a test. The two branches will never be +executed sequentially; for any particular evaluation of the test, one +branch or the other will be entered. Because of this, the registers +needed by the second branch are still needed by the combined sequence, +even if these are modified by the first branch.

                                                                                    + +

                                                                                    (define (parallel-instruction-sequences seq1 seq2)
                                                                                    +  (make-instruction-sequence
                                                                                    +   (list-union (registers-needed seq1)
                                                                                    +               (registers-needed seq2))
                                                                                    +   (list-union (registers-modified seq1)
                                                                                    +               (registers-modified seq2))
                                                                                    +   (append (statements seq1) (statements seq2))))
                                                                                    +

                                                                                    + + +

                                                                                    5.5.5  An Example of Compiled Code

                                                                                    + + +Now that we have seen all the elements of the compiler, let us examine +an example of compiled code to see how things fit together. We will +compile the definition of a recursive factorial procedure by +calling compile:

                                                                                    + +

                                                                                    (compile
                                                                                    + '(define (factorial n)
                                                                                    +    (if (= n 1)
                                                                                    +        1
                                                                                    +        (* (factorial (- n 1)) n)))
                                                                                    + 'val
                                                                                    + 'next)
                                                                                    +

                                                                                    +We have specified that the value of the define expression should +be placed in the val register. We don't care what the compiled +code does after executing the define, so our choice of next as the linkage descriptor is arbitrary.

                                                                                    + +Compile determines that the expression is a definition, so it calls compile-definition to compile code to compute the value to be assigned +(targeted to val), followed by code to install the definition, followed +by code to put the value of the define (which is the symbol ok) +into the target register, followed finally by the linkage code. Env is +preserved around the computation of the value, because it is needed in order +to install the definition. Because the linkage is next, there is no +linkage code in this case. The skeleton of the compiled code is thus

                                                                                    + +

                                                                                      <save env if modified by code to compute value>
                                                                                    +  <compilation of definition value, target val, linkage next>
                                                                                    +  <restore env if saved above>
                                                                                    +  (perform (op define-variable!)
                                                                                    +           (const factorial)
                                                                                    +           (reg val)
                                                                                    +           (reg env))
                                                                                    +  (assign val (const ok))
                                                                                    +

                                                                                    + +The expression that is to be compiled to produce the value for the +variable factorial is a lambda expression whose value is +the procedure that computes factorials. Compile handles this by +calling compile-lambda, which compiles the procedure body, +labels it as a new entry point, and generates the instruction that +will combine the procedure body at the new entry point with the +run-time environment and assign the result to val. The sequence +then skips around the compiled procedure code, which is inserted at +this point. The procedure code itself begins by extending the +procedure's definition environment by a frame that binds +the formal parameter n to the procedure argument. Then comes the actual +procedure body. Since this code for the value of the variable +doesn't modify the env register, the optional save +and restore shown above aren't generated. (The procedure code at +entry2 isn't executed at this point, so its use of env +is irrelevant.) +Therefore, the skeleton for the compiled code becomes

                                                                                    + +

                                                                                      (assign val (op make-compiled-procedure)
                                                                                    +              (label entry2)
                                                                                    +              (reg env))
                                                                                    +  (goto (label after-lambda1))
                                                                                    +entry2
                                                                                    +  (assign env (op compiled-procedure-env) (reg proc))
                                                                                    +  (assign env (op extend-environment)
                                                                                    +              (const (n))
                                                                                    +              (reg argl)
                                                                                    +              (reg env))
                                                                                    +  <compilation of procedure body>
                                                                                    +after-lambda1
                                                                                    +  (perform (op define-variable!)
                                                                                    +           (const factorial)
                                                                                    +           (reg val)
                                                                                    +           (reg env))
                                                                                    +  (assign val (const ok))
                                                                                    +

                                                                                    + +A procedure body is always compiled (by compile-lambda-body) as +a sequence with target val and linkage return. The +sequence in this case consists of a single if expression:

                                                                                    + +

                                                                                    (if (= n 1)
                                                                                    +    1
                                                                                    +    (* (factorial (- n 1)) n))
                                                                                    +

                                                                                    +Compile-if generates code that first computes the predicate (targeted to +val), then checks the result and branches around the true branch if the +predicate is false. Env and continue are preserved around the +predicate code, since they may be needed for the rest of the if +expression. Since the if expression is the final expression (and only +expression) in the sequence making up the procedure body, its target is val and its linkage is return, so the true and false branches are both +compiled with target val and linkage return. +(That is, the value of the conditional, which is the value computed by +either of its branches, is the value of the procedure.)

                                                                                    + +

                                                                                      <save continueenv if modified by predicate and needed by branches>
                                                                                    +  <compilation of predicate, target val, linkage next>
                                                                                    +  <restore continueenv if saved above>
                                                                                    +  (test (op false?) (reg val))
                                                                                    +  (branch (label false-branch4))
                                                                                    +true-branch5
                                                                                    +  <compilation of true branch, target val, linkage return>
                                                                                    +false-branch4
                                                                                    +  <compilation of false branch, target val, linkage return>
                                                                                    +after-if3
                                                                                    +

                                                                                    + +The predicate (= n 1) is a procedure call. This +looks up the operator (the symbol =) and places this value in +proc. It then assembles the arguments 1 and the value of +n into argl. Then it tests whether proc contains a +primitive or a compound procedure, and dispatches to a primitive branch +or a compound branch accordingly. Both branches resume at the after-call label. The requirements to preserve registers +around the evaluation of the operator and operands don't result in +any saving of registers, because in this case those evaluations don't +modify the registers in question.

                                                                                    + +

                                                                                      (assign proc
                                                                                    +          (op lookup-variable-value) (const =) (reg env))
                                                                                    +  (assign val (const 1))
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (assign val (op lookup-variable-value) (const n) (reg env))
                                                                                    +  (assign argl (op cons) (reg val) (reg argl))
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch17))
                                                                                    +compiled-branch16
                                                                                    +  (assign continue (label after-call15))
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch17
                                                                                    +  (assign val (op apply-primitive-procedure)
                                                                                    +              (reg proc)
                                                                                    +              (reg argl))
                                                                                    +after-call15
                                                                                    +

                                                                                    + +The true branch, which is the constant 1, compiles (with target +val and linkage return) to

                                                                                    + +

                                                                                      (assign val (const 1))
                                                                                    +  (goto (reg continue))
                                                                                    +

                                                                                    +The code for the false branch is another a procedure call, where the +procedure is the value of the symbol *, and the arguments are +n and the result of another procedure call (a call to factorial). +Each of these calls sets up proc and argl and its own primitive +and compound branches. Figure 5.17 +shows the complete compilation of the +definition of the factorial procedure. +Notice that the possible save and restore of +continue and env around the predicate, shown above, +are in fact generated, because these registers are modified by the procedure +call in the predicate and needed for the procedure call and the +return linkage in the branches. + + +

                                                                                    +Exercise 5.33.  Consider the following definition of a factorial procedure, which is +slightly different from the one given above: +

                                                                                    (define (factorial-alt n)
                                                                                    +  (if (= n 1)
                                                                                    +      1
                                                                                    +      (* n (factorial-alt (- n 1)))))
                                                                                    +

                                                                                    +Compile this procedure and compare the resulting code with that produced for +factorial. Explain any differences you find. Does either +program execute more efficiently than the other? +

                                                                                    + +

                                                                                    +Exercise 5.34.  Compile the iterative factorial procedure +

                                                                                    (define (factorial n)
                                                                                    +  (define (iter product counter)
                                                                                    +    (if (> counter n)
                                                                                    +        product
                                                                                    +        (iter (* counter product)
                                                                                    +              (+ counter 1))))
                                                                                    +  (iter 1 1))
                                                                                    +

                                                                                    +Annotate the resulting code, showing the essential difference between +the code for iterative and recursive versions of factorial that +makes one process build up stack space and the other run in constant +stack space. +

                                                                                    + + +

                                                                                    + +

                                                                                    ;; construct the procedure and skip over code for the procedure body
                                                                                    +  (assign val
                                                                                    +          (op make-compiled-procedure) (label entry2) (reg env))
                                                                                    +  (goto (label after-lambda1))
                                                                                    +
                                                                                    +entry2     ; calls to factorial will enter here
                                                                                    +  (assign env (op compiled-procedure-env) (reg proc))
                                                                                    +  (assign env
                                                                                    +          (op extend-environment) (const (n)) (reg argl) (reg env))
                                                                                    +;; begin actual procedure body
                                                                                    +  (save continue)
                                                                                    +  (save env)
                                                                                    +
                                                                                    +;; compute (= n 1)
                                                                                    +  (assign proc (op lookup-variable-value) (const =) (reg env))
                                                                                    +  (assign val (const 1))
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (assign val (op lookup-variable-value) (const n) (reg env))
                                                                                    +  (assign argl (op cons) (reg val) (reg argl))
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch17))
                                                                                    +compiled-branch16
                                                                                    +  (assign continue (label after-call15))
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch17
                                                                                    +  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
                                                                                    +
                                                                                    +after-call15   val now contains result of (= n 1)
                                                                                    +  (restore env)
                                                                                    +  (restore continue)
                                                                                    +  (test (op false?) (reg val))
                                                                                    +  (branch (label false-branch4))
                                                                                    +true-branch5  ; return 1
                                                                                    +  (assign val (const 1))
                                                                                    +  (goto (reg continue))
                                                                                    +
                                                                                    +false-branch4
                                                                                    +;; compute and return (* (factorial (- n 1)) n)
                                                                                    +  (assign proc (op lookup-variable-value) (const *) (reg env))
                                                                                    +  (save continue)
                                                                                    +  (save proc)   ; save * procedure
                                                                                    +  (assign val (op lookup-variable-value) (const n) (reg env))
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (save argl)   ; save partial argument list for *
                                                                                    +
                                                                                    +;; compute (factorial (- n 1)), which is the other argument for *
                                                                                    +  (assign proc
                                                                                    +          (op lookup-variable-value) (const factorial) (reg env))
                                                                                    +  (save proc)  ; save factorial procedure
                                                                                    +

                                                                                    +

                                                                                    Figure 5.17:  Compilation of the definition of the factorial +procedure (continued on next page).
                                                                                    + + +

                                                                                    + +

                                                                                    ;; compute (- n 1), which is the argument for factorial
                                                                                    +  (assign proc (op lookup-variable-value) (const -) (reg env))
                                                                                    +  (assign val (const 1))
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (assign val (op lookup-variable-value) (const n) (reg env))
                                                                                    +  (assign argl (op cons) (reg val) (reg argl))
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch8))
                                                                                    +compiled-branch7
                                                                                    +  (assign continue (label after-call6))
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch8
                                                                                    +  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
                                                                                    +
                                                                                    +after-call6   val now contains result of (- n 1)
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (restore proc) ; restore factorial
                                                                                    +;; apply factorial
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch11))
                                                                                    +compiled-branch10
                                                                                    +  (assign continue (label after-call9))
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch11
                                                                                    +  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
                                                                                    +
                                                                                    +after-call9      val now contains result of (factorial (- n 1))
                                                                                    +  (restore argl) ; restore partial argument list for *
                                                                                    +  (assign argl (op cons) (reg val) (reg argl))
                                                                                    +  (restore proc) ; restore *
                                                                                    +  (restore continue)
                                                                                    +;; apply * and return its value
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch14))
                                                                                    +compiled-branch13
                                                                                    +;; note that a compound procedure here is called tail-recursively
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch14
                                                                                    +  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
                                                                                    +  (goto (reg continue))
                                                                                    +after-call12
                                                                                    +after-if3
                                                                                    +after-lambda1
                                                                                    +;; assign the procedure to the variable factorial
                                                                                    +  (perform
                                                                                    +   (op define-variable!) (const factorial) (reg val) (reg env))
                                                                                    +  (assign val (const ok))
                                                                                    +

                                                                                    +

                                                                                    Figure 5.17:  (continued)
                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.35.  What expression was compiled to produce the code shown in +figure 5.18? +

                                                                                      (assign val (op make-compiled-procedure) (label entry16)
                                                                                    +                                           (reg env))
                                                                                    +  (goto (label after-lambda15))
                                                                                    +entry16
                                                                                    +  (assign env (op compiled-procedure-env) (reg proc))
                                                                                    +  (assign env
                                                                                    +          (op extend-environment) (const (x)) (reg argl) (reg env))
                                                                                    +  (assign proc (op lookup-variable-value) (const +) (reg env))
                                                                                    +  (save continue)
                                                                                    +  (save proc)
                                                                                    +  (save env)
                                                                                    +  (assign proc (op lookup-variable-value) (const g) (reg env))
                                                                                    +  (save proc)
                                                                                    +  (assign proc (op lookup-variable-value) (const +) (reg env))
                                                                                    +  (assign val (const 2))
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (assign val (op lookup-variable-value) (const x) (reg env))
                                                                                    +  (assign argl (op cons) (reg val) (reg argl))
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch19))
                                                                                    +compiled-branch18
                                                                                    +  (assign continue (label after-call17))
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch19
                                                                                    +  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
                                                                                    +after-call17
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (restore proc)
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch22))
                                                                                    +compiled-branch21
                                                                                    +  (assign continue (label after-call20))
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch22
                                                                                    +  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
                                                                                    +

                                                                                    +

                                                                                    Figure 5.18:  An example of compiler output (continued on next page). +See exercise 5.35.
                                                                                    + + +

                                                                                    + +

                                                                                    after-call20
                                                                                    +  (assign argl (op list) (reg val))
                                                                                    +  (restore env)
                                                                                    +  (assign val (op lookup-variable-value) (const x) (reg env))
                                                                                    +  (assign argl (op cons) (reg val) (reg argl))
                                                                                    +  (restore proc)
                                                                                    +  (restore continue)
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-branch25))
                                                                                    +compiled-branch24
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +primitive-branch25
                                                                                    +  (assign val (op apply-primitive-procedure) (reg proc) (reg argl))
                                                                                    +  (goto (reg continue))
                                                                                    +after-call23
                                                                                    +after-lambda15
                                                                                    +  (perform (op define-variable!) (const f) (reg val) (reg env))
                                                                                    +  (assign val (const ok))
                                                                                    +

                                                                                    +

                                                                                    Figure 5.18:  (continued)
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.36.  What order of evaluation does our compiler produce for operands of a +combination? Is it left-to-right, right-to-left, or some other order? +Where in the compiler is this order determined? Modify the compiler +so that it produces some other order of evaluation. (See the +discussion of order of evaluation for the explicit-control evaluator +in section 5.4.1.) How does changing the order of +operand evaluation affect the efficiency of the code that constructs +the argument list? +

                                                                                    + +

                                                                                    +Exercise 5.37.  One way to understand the compiler's preserving mechanism for +optimizing stack usage is to see what extra operations would +be generated if we did not use this idea. Modify preserving so +that it always generates the save and restore operations. +Compile some simple expressions and identify the unnecessary stack +operations that are generated. +Compare the code to that generated with the preserving mechanism intact. +

                                                                                    + +

                                                                                    +Exercise 5.38.  Our compiler is clever about avoiding unnecessary stack operations, +but it is not clever at all when it comes to compiling calls to the primitive +procedures of the language in terms of the primitive operations +supplied by the machine. For example, consider how much code is +compiled to compute (+ a 1): The code sets up an argument list +in argl, puts the primitive addition procedure (which it finds +by looking up the symbol + in the environment) into proc, +and tests whether the procedure is primitive or compound. The +compiler always generates code to perform the test, as well as code +for primitive and compound branches (only one of which will be executed). +We have not shown the part of the controller that implements +primitives, but we presume that these instructions make use of +primitive arithmetic operations in the machine's data paths. Consider +how much less code would be generated if the compiler could open-code primitives -- that is, if it could generate code to directly +use these primitive machine operations. The expression (+ a 1) +might be compiled into something as simple as 43 +

                                                                                    (assign val (op lookup-variable-value) (const a) (reg env))
                                                                                    +(assign val (op +) (reg val) (const 1))
                                                                                    +

                                                                                    +In this exercise we will extend our compiler to support open coding of +selected primitives. Special-purpose code will be generated +for calls to these primitive procedures instead of the general +procedure-application code. In order to support this, we will augment +our machine with special argument registers arg1 and arg2. +The primitive arithmetic operations of the machine will take their +inputs from arg1 and arg2. The results may be put into +val, arg1, or arg2.

                                                                                    + +The compiler must be able to recognize the application of an +open-coded primitive in the source program. We will augment the +dispatch in the compile procedure to recognize the names of +these primitives in addition to the reserved words (the special forms) +it currently recognizes.44 For each special form our compiler has a code generator. In +this exercise we will construct a family of code generators for the +open-coded primitives.

                                                                                    + + +a.  The open-coded primitives, unlike the special forms, all need their +operands evaluated. Write a code generator spread-arguments for use by +all the open-coding code generators. Spread-arguments should take an +operand list and compile the given operands targeted to successive argument +registers. Note that an operand may contain a call to an open-coded +primitive, so argument registers will have to be preserved during operand +evaluation.

                                                                                    + +b.  For each of the primitive procedures =, *, -, and ++, write a code generator that takes a combination with that +operator, together with a target and a linkage descriptor, and +produces code to spread the arguments into the registers and then +perform the operation targeted to the given target with the given +linkage. You need only handle expressions with two operands. Make +compile dispatch to these code generators.

                                                                                    + +c.  Try your new compiler on the factorial example. Compare the +resulting code with the result produced without open coding.

                                                                                    + +d.  Extend your code generators for + and * so that they +can handle expressions with arbitrary numbers of operands. An +expression with more than two operands will have to be compiled into a +sequence of operations, each with only two inputs. + +

                                                                                    + + +

                                                                                    5.5.6  Lexical Addressing

                                                                                    + + + + +One of the most common optimizations performed by compilers is the +optimization of variable lookup. Our compiler, as we have implemented +it so far, generates code that uses the lookup-variable-value +operation of the evaluator machine. This searches for a variable by +comparing it with each variable that is currently bound, working frame +by frame outward through the run-time environment. This search can be +expensive if the frames are deeply nested or if there are many +variables. For example, consider the problem of looking up the value +of x while evaluating the expression (* x y z) in an +application of the procedure that is returned by

                                                                                    + +

                                                                                    (let ((x 3) (y 4))
                                                                                    +  (lambda (a b c d e)
                                                                                    +    (let ((y (* a b x))
                                                                                    +          (z (+ c d x)))
                                                                                    +      (* x y z))))
                                                                                    +

                                                                                    +Since a let expression is just syntactic sugar for a lambda combination, this expression is equivalent to

                                                                                    + +

                                                                                    ((lambda (x y)
                                                                                    +   (lambda (a b c d e)
                                                                                    +     ((lambda (y z) (* x y z))
                                                                                    +      (* a b x)
                                                                                    +      (+ c d x))))
                                                                                    + 3
                                                                                    + 4)
                                                                                    +

                                                                                    +Each time lookup-variable-value searches for x, it must +determine that the symbol x is not eq? to y or z (in the first frame), nor to a, b, c, d, or +e (in the second frame). We will assume, for the moment, that +our programs do not use define -- that variables are +bound only with lambda. Because our language is lexically +scoped, the run-time environment for any expression will have a +structure that parallels the lexical structure of the program in which +the expression appears.45 +Thus, the compiler can know, when it analyzes the +above expression, that each time the procedure is applied the variable +x in (* x y z) will be found two frames out from the +current frame and will be the first variable in that frame.

                                                                                    + +We can exploit this fact by inventing a new kind of variable-lookup +operation, lexical-address-lookup, that takes as arguments an +environment and a lexical address that consists of two numbers: +a frame number, which specifies how many frames to pass over, +and a displacement number, which specifies how many variables to +pass over in that frame. Lexical-address-lookup will produce +the value of the variable stored at that lexical address relative to +the current environment. If we add the lexical-address-lookup +operation to our machine, we can make the compiler generate code that +references variables using this operation, rather than lookup-variable-value. Similarly, our compiled code can use a new +lexical-address-set! operation instead of set-variable-value!.

                                                                                    + +In order to generate such code, the compiler must be able to determine +the lexical address of a variable it is about to compile a reference +to. The lexical address of a variable in a program depends on where +one is in the code. For example, in the following program, the +address of x in expression <e1> is (2,0) -- two frames back +and the first variable in the frame. At that point y is at +address (0,0) and c is at address (1,2). In expression +<e2>, x is at (1,0), y is at (1,1), and c is at (0,2).

                                                                                    + +

                                                                                    ((lambda (x y)
                                                                                    +   (lambda (a b c d e)
                                                                                    +     ((lambda (y z) <e1>)
                                                                                    +      <e2>
                                                                                    +      (+ c d x))))
                                                                                    + 3
                                                                                    + 4)
                                                                                    +

                                                                                    + +One way for the compiler to produce code that uses lexical addressing +is to maintain a data structure called a compile-time +environment. This keeps track of which variables will be at which +positions in which frames in the run-time environment when a +particular variable-access operation is executed. The compile-time +environment is a list of frames, each containing a list of variables. +(There will of course be no values bound to the variables, since +values are not computed at compile time.) The compile-time +environment becomes an additional argument to compile and is +passed along to each code generator. The top-level call to compile uses an empty compile-time environment. +When a lambda body is compiled, compile-lambda-body +extends the compile-time environment by a frame containing the +procedure's parameters, so that the sequence making up the body +is compiled with that extended environment. +At each point in the compilation, compile-variable and compile-assignment use the compile-time +environment in order to generate the appropriate lexical addresses.

                                                                                    + +Exercises 5.39 +through 5.43 describe how to complete this sketch of +the lexical-addressing strategy in order to incorporate lexical lookup +into the compiler. +Exercise 5.44 describes another use for the +compile-time environment.

                                                                                    + +

                                                                                    +Exercise 5.39.  Write a procedure lexical-address-lookup that implements the new +lookup operation. It should take two arguments -- a lexical address +and a run-time environment -- and return the value of the variable +stored at the specified lexical address. Lexical-address-lookup +should signal an error if the value of the variable is the symbol *unassigned*.46 Also write a procedure lexical-address-set! that +implements the operation that changes the value of the variable at a +specified lexical address. + + +

                                                                                    + +

                                                                                    +Exercise 5.40.  Modify the compiler to maintain the compile-time environment as +described above. That is, add a compile-time-environment argument to +compile and the various code generators, and extend it in +compile-lambda-body. +

                                                                                    + +

                                                                                    +Exercise 5.41.  Write a procedure find-variable that takes as arguments a +variable and a compile-time environment and returns the lexical +address of the variable with respect to that environment. For +example, in the program fragment that is shown above, the compile-time +environment during the compilation of expression <e1> is ((y +z) (a b c d e) (x y)). Find-variable should produce

                                                                                    + +

                                                                                    (find-variable 'c '((y z) (a b c d e) (x y)))
                                                                                    +(1 2)
                                                                                    +
                                                                                    +(find-variable 'x '((y z) (a b c d e) (x y)))
                                                                                    +(2 0)
                                                                                    +
                                                                                    +(find-variable 'w '((y z) (a b c d e) (x y)))
                                                                                    +not-found
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.42.  Using find-variable from exercise 5.41, +rewrite compile-variable and compile-assignment to output +lexical-address instructions. In cases where find-variable +returns not-found (that is, where the variable is not in the +compile-time environment), you should have the code generators use the +evaluator operations, as before, to search for the binding. +(The only place a variable that is not found at compile time can be is in +the global environment, which is part of the run-time environment but +is not part of the compile-time environment.47 +Thus, if you wish, you may have the evaluator operations look directly in +the global environment, which can be obtained with the operation (op get-global-environment), instead of having them search the whole run-time +environment found in env.) +Test the modified compiler on a few simple cases, such as the nested +lambda combination at the beginning of this section. + +

                                                                                    + +

                                                                                    +Exercise 5.43.  We argued in section 4.1.6 that internal definitions +for block structure should not be considered ``real'' defines. Rather, +a procedure body should be interpreted as if the internal variables being +defined were installed as ordinary lambda variables initialized to their +correct values using set!. Section 4.1.6 and +exercise 4.16 showed how to modify the metacircular +interpreter to accomplish this by scanning out internal definitions. Modify +the compiler to perform the same transformation before it compiles a procedure +body. + + +

                                                                                    + +

                                                                                    +Exercise 5.44.  In this section we have focused on the use of the compile-time +environment to produce lexical addresses. But there are other uses +for compile-time environments. For instance, in +exercise 5.38 we increased the efficiency of compiled +code by open-coding primitive procedures. Our implementation treated +the names of open-coded procedures as reserved words. If a program +were to rebind such a name, the mechanism described in +exercise 5.38 would still open-code it as a primitive, +ignoring the new binding. For example, consider the procedure

                                                                                    + +

                                                                                    (lambda (+ * a b x y)
                                                                                    +  (+ (* a x) (* b y)))
                                                                                    +

                                                                                    +which computes a linear combination of x and y. We might +call it with arguments +matrix, *matrix, and four +matrices, but the open-coding compiler would still open-code the + and the * in (+ (* a x) (* b y)) as primitive + +and *. Modify the open-coding compiler to consult the +compile-time environment in order to compile the correct code for +expressions involving the names of primitive procedures. +(The code will work correctly as long as the program does not define or set! these names.) + +

                                                                                    + + +

                                                                                    5.5.7  Interfacing Compiled Code to the Evaluator

                                                                                    + + + +We have not yet explained how to load compiled code into the evaluator machine +or how to run it. We will assume that the explicit-control-evaluator machine +has been defined as in section 5.4.4, with the +additional operations specified in footnote 38. +We will implement +a procedure compile-and-go that compiles a Scheme expression, loads the +resulting object code into the evaluator machine, +and causes the machine to run the code in the +evaluator global environment, print the result, and +enter the evaluator's driver loop. We will also modify the evaluator so that +interpreted expressions can call compiled procedures as well as interpreted +ones. We can then put a compiled procedure into the machine and use the +evaluator to call it:

                                                                                    + +

                                                                                    (compile-and-go
                                                                                    + '(define (factorial n)
                                                                                    +    (if (= n 1)
                                                                                    +        1
                                                                                    +        (* (factorial (- n 1)) n))))
                                                                                    + ;;; EC-Eval value:
                                                                                    +ok
                                                                                    + ;;; EC-Eval input:
                                                                                    +(factorial 5)
                                                                                    +;;; EC-Eval value:
                                                                                    +120
                                                                                    +

                                                                                    + + +To allow the evaluator to handle compiled procedures (for example, +to evaluate the call to factorial above), +we need to change the code at apply-dispatch +(section 5.4.1) so that it recognizes +compiled procedures (as distinct from compound or primitive +procedures) and transfers control directly to the entry point of the +compiled code:48 +

                                                                                    apply-dispatch
                                                                                    +  (test (op primitive-procedure?) (reg proc))
                                                                                    +  (branch (label primitive-apply))
                                                                                    +  (test (op compound-procedure?) (reg proc))  
                                                                                    +  (branch (label compound-apply))
                                                                                    +  (test (op compiled-procedure?) (reg proc))  
                                                                                    +  (branch (label compiled-apply))
                                                                                    +  (goto (label unknown-procedure-type))
                                                                                    +compiled-apply
                                                                                    +  (restore continue)
                                                                                    +  (assign val (op compiled-procedure-entry) (reg proc))
                                                                                    +  (goto (reg val))
                                                                                    +

                                                                                    +Note the restore of continue at compiled-apply. Recall that the +evaluator was arranged so that at apply-dispatch, the continuation would +be at the top of the stack. The compiled code entry point, on the other hand, +expects the continuation to be in continue, so continue must be +restored before the compiled code is executed.

                                                                                    + + +To enable us to run some compiled code when we start the evaluator +machine, we add a branch instruction at +the beginning of the evaluator machine, which causes the machine to +go to a new entry point if the flag register is set.49

                                                                                    + + +

                                                                                      (branch (label external-entry))      ; branches if flag is set
                                                                                    +read-eval-print-loop
                                                                                    +  (perform (op initialize-stack))
                                                                                    +  ...

                                                                                    +External-entry assumes that the machine is started with +val containing the location of an instruction sequence that +puts a result into val and ends with (goto (reg +continue)). Starting at this entry point jumps to the location designated +by val, but first assigns continue so that execution will return +to print-result, which prints the value in val and then goes to +the beginning of the evaluator's read-eval-print loop.50

                                                                                    + + +

                                                                                    external-entry
                                                                                    +  (perform (op initialize-stack))
                                                                                    +  (assign env (op get-global-environment))
                                                                                    +  (assign continue (label print-result))
                                                                                    +  (goto (reg val))
                                                                                    +

                                                                                    + +Now we can use the following procedure to compile a procedure definition, +execute the compiled code, and run the read-eval-print loop so we can try the +procedure. Because we want the compiled code to return to the location in +continue with its result in val, we compile the expression with a +target of val and a linkage of return. In order to transform the +object code produced by the compiler into executable instructions for the +evaluator register machine, we use the procedure assemble from the +register-machine simulator (section 5.2.2). We then initialize +the val register to point to the list of instructions, set the +flag so that the evaluator will go to external-entry, and start +the evaluator.

                                                                                    + +

                                                                                    (define (compile-and-go expression)
                                                                                    +  (let ((instructions
                                                                                    +         (assemble (statements
                                                                                    +                    (compile expression 'val 'return))
                                                                                    +                   eceval)))
                                                                                    +    (set! the-global-environment (setup-environment))
                                                                                    +    (set-register-contents! eceval 'val instructions)
                                                                                    +    (set-register-contents! eceval 'flag true)
                                                                                    +    (start eceval)))
                                                                                    +

                                                                                    + +If we have set up stack monitoring, as at the end of +section 5.4.4, we can examine the +stack usage of compiled code:

                                                                                    + +

                                                                                    (compile-and-go
                                                                                    + '(define (factorial n)
                                                                                    +    (if (= n 1)
                                                                                    +        1
                                                                                    +        (* (factorial (- n 1)) n))))
                                                                                    +
                                                                                    +(total-pushes = 0 maximum-depth = 0)
                                                                                    + ;;; EC-Eval value:
                                                                                    +ok
                                                                                    + ;;; EC-Eval input:
                                                                                    +(factorial 5)
                                                                                    +(total-pushes = 31 maximum-depth = 14)
                                                                                    +;;; EC-Eval value:
                                                                                    +120
                                                                                    +

                                                                                    +Compare this example with the evaluation of (factorial 5) using +the interpreted version of the same procedure, shown at the end of +section 5.4.4. The interpreted version required +144 pushes and a maximum stack depth of 28. This illustrates the +optimization that results from our compilation strategy.

                                                                                    + + +

                                                                                    Interpretation and compilation

                                                                                    + + +With the programs in this section, we can now experiment with the +alternative execution strategies of interpretation and +compilation.51 An interpreter raises +the machine to the level of the user program; a compiler lowers the +user program to the level of the machine language. We can regard the +Scheme language (or any programming language) as a coherent family of +abstractions erected on the machine language. Interpreters are good +for interactive program development and debugging because the steps of +program execution are organized in terms of these abstractions, and +are therefore more intelligible to the programmer. Compiled code can +execute faster, because the steps of program execution are organized +in terms of the machine language, and the compiler is free to make +optimizations that cut across the higher-level +abstractions.52

                                                                                    + + +The alternatives of interpretation and compilation also lead to +different strategies for porting languages to new computers. Suppose +that we wish to implement Lisp for a new machine. One strategy is +to begin with the explicit-control evaluator of section 5.4 +and translate its instructions to instructions for the +new machine. A different strategy is to begin with the compiler and +change the code generators so that they generate code for the new +machine. The second strategy allows us to run any Lisp program on +the new machine by first compiling it with the compiler running on our +original Lisp system, and linking it with a compiled version of the +run-time library.53 Better yet, we can compile the compiler itself, and run +this on the new machine to compile other Lisp programs.54 Or we can +compile one of the interpreters of section 4.1 to +produce an interpreter that runs on the new machine.

                                                                                    + +

                                                                                    +Exercise 5.45.  By comparing the stack operations used by compiled code to the stack +operations used by the evaluator for the same computation, we can +determine the extent to which the compiler optimizes use of the stack, +both in speed (reducing the total number of stack operations) and in +space (reducing the maximum stack depth). Comparing this optimized +stack use to the performance of a special-purpose machine for the same +computation gives some indication of the quality of the compiler.

                                                                                    + +

                                                                                    a. Exercise 5.27 asked you to determine, as a function of +n, the number of pushes and the maximum stack depth needed by the +evaluator to compute n! using the recursive factorial procedure +given above. Exercise 5.14 asked you to do the same +measurements for the special-purpose factorial machine shown in +figure 5.11. Now perform the same analysis using the +compiled factorial procedure.

                                                                                    + +Take the ratio of the number of pushes in the compiled version to the +number of pushes in the interpreted version, and do the same for the +maximum stack depth. Since the number of operations and the stack +depth used to compute n! are linear in n, these ratios should +approach constants as n becomes large. What are these constants? +Similarly, find the ratios of the stack usage in the special-purpose +machine to the usage in the interpreted version.

                                                                                    + +Compare the ratios for special-purpose versus interpreted code to the ratios +for compiled versus interpreted code. You should find that the +special-purpose machine does much better than the compiled code, since +the hand-tailored controller code should be much better than what is +produced by our rudimentary general-purpose compiler.

                                                                                    + +

                                                                                    b. Can you suggest improvements to the compiler that would help it +generate code that would come closer in performance to the +hand-tailored version? + +

                                                                                    + +

                                                                                    +Exercise 5.46.  Carry out an analysis like the one in +exercise 5.45 to determine the effectiveness of +compiling the tree-recursive Fibonacci procedure

                                                                                    + +

                                                                                    (define (fib n)
                                                                                    +  (if (< n 2)
                                                                                    +      n
                                                                                    +      (+ (fib (- n 1)) (fib (- n 2)))))
                                                                                    +

                                                                                    +compared to the effectiveness of using the special-purpose Fibonacci machine of +figure 5.12. (For measurement of the interpreted +performance, see exercise 5.29.) +For Fibonacci, the time resource used is not linear in n; hence the +ratios of stack operations will not approach a limiting value that is +independent of n. +

                                                                                    + +

                                                                                    +Exercise 5.47.  This section described how to modify the explicit-control evaluator so +that interpreted code can call compiled procedures. Show how to +modify the compiler so that compiled procedures can call not only +primitive procedures and compiled procedures, but interpreted +procedures as well. This requires modifying compile-procedure-call +to handle the case of compound (interpreted) procedures. +Be sure to handle all the same target and linkage combinations +as in compile-proc-appl. To do the actual procedure application, +the code needs to jump to the evaluator's compound-apply entry point. +This label cannot be directly referenced in object code +(since the assembler requires that all labels referenced by the +code it is assembling be defined there), so we will add a register +called compapp to the evaluator machine to hold this +entry point, and add an instruction to initialize it: +

                                                                                      (assign compapp (label compound-apply))
                                                                                    +  (branch (label external-entry))      ; branches if flag is set
                                                                                    +read-eval-print-loop
                                                                                    +  ...

                                                                                    +To test your code, start by defining a procedure f that calls a +procedure g. Use compile-and-go to compile the definition +of f and start the evaluator. Now, typing at the evaluator, +define g and try to call f. + +

                                                                                    + +

                                                                                    +Exercise 5.48.  The compile-and-go interface implemented in this section is +awkward, since the compiler can be called only once (when the +evaluator machine is started). Augment the compiler-interpreter +interface by providing a compile-and-run primitive that can be +called from within the explicit-control evaluator as follows:

                                                                                    + +

                                                                                    ;;; EC-Eval input:
                                                                                    +(compile-and-run
                                                                                    + '(define (factorial n)
                                                                                    +    (if (= n 1)
                                                                                    +        1
                                                                                    +        (* (factorial (- n 1)) n))))
                                                                                    +;;; EC-Eval value:
                                                                                    +ok
                                                                                    +;;; EC-Eval input:
                                                                                    +(factorial 5)
                                                                                    +;;; EC-Eval value:
                                                                                    +120
                                                                                    +

                                                                                    +

                                                                                    + +

                                                                                    +Exercise 5.49.  As an alternative to using the explicit-control evaluator's +read-eval-print loop, design a register machine that performs a +read-compile-execute-print loop. That is, the machine should run a +loop that reads an expression, compiles it, assembles and +executes the resulting code, and prints the result. This is easy to +run in our simulated setup, since we can arrange to call the +procedures compile and assemble as ``register-machine +operations.'' + +

                                                                                    + +

                                                                                    +Exercise 5.50.  Use the compiler to compile the metacircular evaluator of +section 4.1 and run this program using the register-machine +simulator. (To compile more than one definition at a time, you can +package the definitions in a begin.) The resulting interpreter +will run very slowly because of the multiple levels of interpretation, +but getting all the details to work is an instructive exercise. +

                                                                                    + +

                                                                                    +Exercise 5.51.  Develop a rudimentary implementation of Scheme in C (or some other +low-level language of your choice) by translating the explicit-control +evaluator of section 5.4 into C. In order to run this code +you will need to also +provide appropriate storage-allocation routines and other run-time +support. + +

                                                                                    + +

                                                                                    +Exercise 5.52.  As a counterpoint to exercise 5.51, modify the compiler +so that it compiles Scheme procedures into sequences of C +instructions. Compile the metacircular evaluator of +section 4.1 to produce a Scheme interpreter written in C. + +

                                                                                    +

                                                                                    + + + +


                                                                                    +

                                                                                    33 This is a theoretical statement. We are not claiming +that the evaluator's data paths are a particularly convenient or +efficient set of data paths for a general-purpose computer. For example, +they are not very good for implementing high-performance floating-point +calculations or calculations that intensively manipulate bit vectors. + +

                                                                                    34 Actually, the machine that runs +compiled code can be simpler than the interpreter machine, because we +won't use the exp and unev registers. The interpreter +used these to hold pieces of unevaluated expressions. With the +compiler, however, these expressions get built into the +compiled code that the register machine will run. For the same +reason, we don't need the machine operations that deal with expression +syntax. But compiled code will use a few additional machine +operations (to represent compiled procedure objects) that didn't +appear in the explicit-control evaluator machine. + +

                                                                                    35 Notice, however, that our +compiler is a Scheme program, and the syntax procedures that it uses +to manipulate expressions are the actual Scheme procedures used with +the metacircular evaluator. For the explicit-control evaluator, in +contrast, we assumed that equivalent syntax operations were available +as operations for the register machine. (Of course, when we simulated +the register machine in Scheme, we used the actual Scheme procedures +in our register machine simulation.) + +

                                                                                    36 This procedure uses a feature of Lisp called backquote (or quasiquote) that is handy for constructing lists. +Preceding a list with a backquote symbol is much like quoting it, +except that anything in the list that is flagged with a comma is evaluated.

                                                                                    + +For example, if the value of linkage is the symbol +branch25, then the expression +`((goto (label ,linkage))) +evaluates to the list +((goto (label branch25))). +Similarly, if the value of x is the list (a b c), then +`(1 2 ,(car x)) +evaluates to the list +(1 2 a). + +

                                                                                    37 We can't just +use the labels true-branch, false-branch, and +after-if as shown above, +because there might be more than one if in the program. +The compiler uses the procedure make-label to generate labels. +Make-label takes a symbol as argument and returns a new symbol +that begins with the given symbol. For example, successive calls to +(make-label 'a) would return a1, a2, and so on. +Make-label can be implemented similarly to the generation of +unique variable names in the query language, as follows: +

                                                                                    (define label-counter 0)
                                                                                    +
                                                                                    +(define (new-label-number)
                                                                                    +  (set! label-counter (+ 1 label-counter))
                                                                                    +  label-counter)
                                                                                    +
                                                                                    +(define (make-label name)
                                                                                    +  (string->symbol
                                                                                    +    (string-append (symbol->string name)
                                                                                    +                   (number->string (new-label-number)))))
                                                                                    +

                                                                                    + + +

                                                                                    38 We need machine operations to implement a data +structure for representing compiled procedures, analogous to the structure for +compound procedures described in section 4.1.3: +

                                                                                    (define (make-compiled-procedure entry env)
                                                                                    +  (list 'compiled-procedure entry env))
                                                                                    +
                                                                                    +(define (compiled-procedure? proc)
                                                                                    +  (tagged-list? proc 'compiled-procedure))
                                                                                    +
                                                                                    +(define (compiled-procedure-entry c-proc) (cadr c-proc))
                                                                                    +
                                                                                    +(define (compiled-procedure-env c-proc) (caddr c-proc))
                                                                                    +

                                                                                    + + +

                                                                                    39 Actually, we signal an error when the target is not val +and the linkage is return, since +the only place we request return linkages is in compiling +procedures, and our convention is that procedures return their +values in val. + +

                                                                                    40 Making a +compiler generate tail-recursive code might seem like a +straightforward idea. But most compilers for common languages, +including C and Pascal, do not do this, and therefore these languages +cannot represent iterative processes in terms of procedure call alone. +The difficulty with tail recursion in these languages is that their +implementations use the stack to store procedure arguments and local +variables as well as return addresses. The Scheme implementations +described in this book store arguments and variables in memory to be +garbage-collected. The reason for using the stack for variables and +arguments is that it avoids the need for garbage collection in +languages that would not otherwise require it, and is generally +believed to be more efficient. Sophisticated Lisp compilers can, in +fact, use the stack for arguments without destroying tail recursion. +(See Hanson 1990 for a description.) There is also some debate about +whether stack allocation is actually more efficient than garbage +collection in the first place, but the details seem to hinge on fine +points of computer architecture. (See Appel 1987 and Miller and Rozas +1994 for opposing views on this issue.) + +

                                                                                    41 The variable +all-regs is bound to the list of names of all the registers: +

                                                                                    (define all-regs '(env proc val argl continue))
                                                                                    +

                                                                                    + + +

                                                                                    42 Note that preserving calls append with three +arguments. Though the definition of append shown in this book +accepts only two arguments, Scheme standardly provides an append +procedure that takes an arbitrary number of arguments. + +

                                                                                    43 We have used +the same symbol + here to denote both the source-language +procedure and the machine operation. In general there will not be a +one-to-one correspondence between primitives of the source language +and primitives of the machine. + +

                                                                                    44 Making the primitives into reserved +words is in general a bad idea, since a user cannot then rebind these +names to different procedures. Moreover, if we add reserved words to +a compiler that is in use, existing programs that define procedures +with these names will stop working. See +exercise 5.44 for ideas on how to avoid this +problem. + +

                                                                                    45 This is not true if we allow +internal definitions, unless we scan them out. +See exercise 5.43. + +

                                                                                    46 This is the modification to variable lookup +required if we implement the scanning method to eliminate internal +definitions (exercise 5.43). We will need +to eliminate these definitions in order for lexical addressing to +work. + +

                                                                                    47 Lexical addresses cannot be used to access variables in the global +environment, because these names can be defined and redefined +interactively at any time. With internal definitions scanned out, as +in exercise 5.43, the only definitions the +compiler sees are those at top level, which act on the global +environment. Compilation of a definition does not cause the defined +name to be entered in the compile-time environment. + +

                                                                                    48 Of course, compiled procedures as well as interpreted +procedures are compound (nonprimitive). For compatibility with +the terminology used in the explicit-control evaluator, in this +section we will use ``compound'' to mean interpreted (as opposed +to compiled). + +

                                                                                    49 Now that the evaluator machine starts +with a branch, we must always initialize the flag register +before starting the evaluator machine. To start the machine at +its ordinary read-eval-print loop, we could use +

                                                                                    (define (start-eceval)
                                                                                    +  (set! the-global-environment (setup-environment))
                                                                                    +  (set-register-contents! eceval 'flag false)
                                                                                    +  (start eceval))
                                                                                    +

                                                                                    + +

                                                                                    50 Since a compiled procedure is an +object that the system may try to print, we also modify the system +print operation user-print (from section 4.1.4) +so that it will not attempt to print the +components of a compiled procedure: +

                                                                                    (define (user-print object)
                                                                                    +  (cond ((compound-procedure? object)
                                                                                    +         (display (list 'compound-procedure
                                                                                    +                        (procedure-parameters object)
                                                                                    +                        (procedure-body object)
                                                                                    +                        '<procedure-env>)))
                                                                                    +        ((compiled-procedure? object)
                                                                                    +         (display '<compiled-procedure>))
                                                                                    +        (else (display object))))
                                                                                    +

                                                                                    + + +

                                                                                    51 We can do even better by extending the compiler +to allow compiled code to call interpreted procedures. See +exercise 5.47. + +

                                                                                    52 Independent of the strategy of execution, we +incur significant overhead if we insist that errors encountered in +execution of a user program be detected and signaled, rather than being +allowed to kill the system or produce wrong answers. For example, an +out-of-bounds array reference can be detected by checking the validity +of the reference before performing it. The overhead of checking, +however, can be many times the cost of the array reference itself, and +a programmer should weigh speed against safety in determining whether +such a check is desirable. A good compiler should be able to produce +code with such checks, should avoid redundant checks, and should allow +programmers to control the extent and type of error checking in the +compiled code.

                                                                                    + +Compilers for popular languages, such as C and C++, +put hardly any error-checking operations into +running code, so as to make things run as fast as possible. As a +result, it falls to programmers to explicitly provide error checking. +Unfortunately, people often neglect to do this, even in +critical applications where speed is not a constraint. Their programs +lead fast and dangerous lives. For example, the notorious ``Worm'' +that paralyzed the Internet in 1988 exploited the UNIX TM +operating system's failure to check whether the input buffer has +overflowed in the finger daemon. (See Spafford 1989.) + +

                                                                                    53 Of course, with either the +interpretation or the compilation strategy we must also implement for +the new machine storage allocation, input and output, and all the +various operations that we took as ``primitive'' in our discussion of +the evaluator and compiler. One strategy for minimizing work here is +to write as many of these operations as possible in Lisp and then +compile them for the new machine. Ultimately, everything reduces to a +small kernel (such as garbage collection and the mechanism for +applying actual machine primitives) that is hand-coded for the new +machine. + +

                                                                                    54 +This strategy leads to amusing tests of correctness of +the compiler, such as checking +whether the compilation of a program on the new machine, using the +compiled compiler, is identical with the +compilation of the program on the original Lisp system. Tracking +down the source of differences is fun but often frustrating, because +the results are extremely sensitive to minuscule details. + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-36.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-36.html new file mode 100644 index 00000000..b0ad45d5 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-36.html @@ -0,0 +1,417 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +References

                                                                                    + +

                                                                                    + +Abelson, Harold, Andrew Berlin, Jacob Katzenelson, +William McAllister, +Guillermo Rozas, Gerald Jay Sussman, and Jack Wisdom. 1992. The +Supercomputer Toolkit: A general framework for special-purpose +computing. International Journal of High-Speed Electronics +3(3):337-361.

                                                                                    + +Allen, John. 1978. Anatomy of Lisp. New York: McGraw-Hill.

                                                                                    + +ANSI X3.226-1994. American National Standard for Information +Systems -- Programming Language -- Common Lisp.

                                                                                    + +Appel, Andrew W. 1987. Garbage collection can be faster than stack +allocation. Information Processing Letters 25(4):275-279.

                                                                                    + +Backus, John. 1978. Can programming be liberated from the von +Neumann style? Communications of the ACM 21(8):613-641.

                                                                                    + +Baker, Henry G., Jr. 1978. List processing in real time on a serial +computer. Communications of the ACM 21(4):280-293.

                                                                                    + +Batali, John, Neil Mayle, Howard Shrobe, Gerald Jay Sussman, and +Daniel Weise. 1982. The Scheme-81 architecture -- System and chip. +In Proceedings of the MIT Conference on Advanced Research in +VLSI, edited by Paul Penfield, Jr. Dedham, MA: Artech House.

                                                                                    + +Borning, Alan. 1977. ThingLab -- An object-oriented system for +building simulations using constraints. In Proceedings of the 5th +International Joint Conference on Artificial Intelligence.

                                                                                    + +Borodin, Alan, and Ian Munro. 1975. The Computational +Complexity of Algebraic and Numeric Problems. New York: American +Elsevier.

                                                                                    + +Chaitin, Gregory J. 1975. Randomness and mathematical proof. Scientific American 232(5):47-52.

                                                                                    + +Church, Alonzo. 1941. The Calculi of Lambda-Conversion. +Princeton, N.J.: Princeton University Press.

                                                                                    + +Clark, Keith L. 1978. Negation as failure. In Logic and Data +Bases. New York: Plenum Press, pp. 293-322.

                                                                                    + +Clinger, William. 1982. Nondeterministic call by need is neither +lazy nor by name. In Proceedings of the ACM Symposium on Lisp and +Functional Programming, pp. 226-234.

                                                                                    + +Clinger, William, and Jonathan Rees. 1991. Macros that work. In +Proceedings of the 1991 ACM Conference on Principles of +Programming Languages, pp. 155-162.

                                                                                    + +Colmerauer A., H. Kanoui, R. Pasero, and P. Roussel. 1973. Un système +de communication homme-machine en français. Technical report, +Groupe Intelligence Artificielle, Université d'Aix Marseille, +Luminy.

                                                                                    + +Cormen, Thomas, Charles Leiserson, and Ronald Rivest. 1990. Introduction to Algorithms. Cambridge, MA: MIT Press.

                                                                                    + +Darlington, John, Peter Henderson, and David Turner. 1982. Functional Programming and Its Applications. New York: Cambridge +University Press.

                                                                                    + +Dijkstra, Edsger W. 1968a. The structure of the ``THE'' +multiprogramming system. Communications of the ACM +11(5):341-346.

                                                                                    + +Dijkstra, Edsger W. 1968b. Cooperating sequential processes. In Programming Languages, edited by F. Genuys. New York: Academic Press, pp. +43-112.

                                                                                    + +Dinesman, Howard P. 1968. Superior Mathematical Puzzles. New +York: Simon and Schuster.

                                                                                    + +deKleer, Johan, Jon Doyle, Guy Steele, and Gerald J. Sussman. 1977. +AMORD: Explicit control of reasoning. In Proceedings of the ACM +Symposium on Artificial Intelligence and Programming Languages, pp. +116-125.

                                                                                    + +Doyle, Jon. 1979. A truth maintenance system. Artificial +Intelligence 12:231-272.

                                                                                    + +Feigenbaum, Edward, and Howard Shrobe. 1993. The Japanese National +Fifth Generation Project: Introduction, survey, and evaluation. In Future Generation Computer Systems, vol. 9, pp. 105-117.

                                                                                    + +Feeley, Marc. 1986. Deux approches à l'implantation du +language Scheme. Masters thesis, Université de Montréal.

                                                                                    + +Feeley, Marc and Guy Lapalme. 1987. Using closures for code +generation. Journal of Computer Languages 12(1):47-66.

                                                                                    + +Feller, William. 1957. An Introduction to Probability Theory +and Its Applications, volume 1. New York: John Wiley & Sons.

                                                                                    + +Fenichel, R., and J. Yochelson. 1969. A Lisp garbage collector for +virtual memory computer systems. Communications of the ACM +12(11):611-612.

                                                                                    + +Floyd, Robert. 1967. Nondeterministic algorithms. JACM, 14(4):636-644.

                                                                                    + +Forbus, Kenneth D., and Johan deKleer. 1993. Building Problem +Solvers. Cambridge, MA: MIT Press.

                                                                                    + +Friedman, Daniel P., and David S. Wise. 1976. CONS should not +evaluate its arguments. In Automata, Languages, and Programming: +Third International Colloquium, edited by S. Michaelson and R. +Milner, pp. 257-284.

                                                                                    + +Friedman, Daniel P., Mitchell Wand, and Christopher T. Haynes. 1992. +Essentials of Programming Languages. Cambridge, MA: MIT +Press/McGraw-Hill.

                                                                                    + +Gabriel, Richard P. 1988. The Why of Y. Lisp Pointers +2(2):15-25.

                                                                                    + +Goldberg, Adele, and David Robson. 1983. Smalltalk-80: The +Language and Its Implementation. Reading, MA: Addison-Wesley.

                                                                                    + +Gordon, Michael, Robin Milner, and Christopher Wadsworth. 1979. Edinburgh LCF. Lecture Notes in Computer Science, volume 78. New +York: Springer-Verlag.

                                                                                    + +Gray, Jim, and Andreas Reuter. 1993. Transaction Processing: +Concepts and Models. San Mateo, CA: Morgan-Kaufman.

                                                                                    + +Green, Cordell. 1969. Application of theorem proving to problem +solving. In Proceedings of the International Joint Conference on +Artificial Intelligence, pp. 219-240.

                                                                                    + +Green, Cordell, and Bertram Raphael. 1968. The use of +theorem-proving techniques in question-answering systems. In Proceedings of the ACM National Conference, pp. 169-181.

                                                                                    + +Griss, Martin L. 1981. Portable Standard Lisp, a brief overview. +Utah Symbolic Computation Group Operating Note 58, University of Utah.

                                                                                    + +Guttag, John V. 1977. Abstract data types and the development of +data structures. Communications of the ACM 20(6):397-404.

                                                                                    + +Hamming, Richard W. 1980. Coding and Information Theory. +Englewood Cliffs, N.J.: Prentice-Hall.

                                                                                    + +Hanson, Christopher P. 1990. Efficient stack allocation for +tail-recursive languages. In Proceedings of ACM Conference on +Lisp and Functional Programming, pp. 106-118.

                                                                                    + +Hanson, Christopher P. 1991. A syntactic closures macro facility. +Lisp Pointers, 4(3).

                                                                                    + +Hardy, Godfrey H. 1921. Srinivasa Ramanujan. Proceedings of +the London Mathematical Society XIX(2).

                                                                                    + +Hardy, Godfrey H., and E. M. Wright. 1960. An Introduction to +the Theory of Numbers. 4th edition. New York: Oxford University +Press.

                                                                                    + +Havender, J. 1968. Avoiding deadlocks in multi-tasking systems. IBM Systems Journal 7(2):74-84.

                                                                                    + +Hearn, Anthony C. 1969. Standard Lisp. Technical report AIM-90, +Artificial Intelligence Project, Stanford University.

                                                                                    + +Henderson, Peter. 1980. Functional Programming: Application and +Implementation. Englewood Cliffs, N.J.: Prentice-Hall.

                                                                                    + +Henderson. Peter. 1982. Functional Geometry. In Conference Record +of the 1982 ACM Symposium on Lisp and Functional Programming, +pp. 179-187.

                                                                                    + +Hewitt, Carl E. 1969. PLANNER: A language for proving theorems in +robots. In Proceedings of the International Joint Conference on +Artificial Intelligence, pp. 295-301.

                                                                                    + +Hewitt, Carl E. 1977. Viewing control structures as patterns of +passing messages. Journal of Artificial Intelligence +8(3):323-364.

                                                                                    + +Hoare, C. A. R. 1972. Proof of correctness of data representations. +Acta Informatica 1(1).

                                                                                    + +Hodges, Andrew. 1983. Alan Turing: The Enigma. New York: Simon +and Schuster.

                                                                                    + +Hofstadter, Douglas R. 1979. Gödel, Escher, Bach: An Eternal +Golden Braid. New York: Basic Books.

                                                                                    + +Hughes, R. J. M. 1990. Why functional programming matters. In Research Topics in Functional Programming, edited by David Turner. +Reading, MA: Addison-Wesley, pp. 17-42.

                                                                                    + +IEEE Std 1178-1990. 1990. IEEE Standard for the Scheme +Programming Language.

                                                                                    + +Ingerman, Peter, Edgar Irons, Kirk Sattley, and Wallace Feurzeig; +assisted by M. Lind, Herbert Kanner, and Robert Floyd. 1960. THUNKS: +A way of compiling procedure statements, with some comments on +procedure declarations. Unpublished manuscript. (Also, private +communication from Wallace Feurzeig.)

                                                                                    + +Kaldewaij, Anne. 1990. Programming: The Derivation of +Algorithms. New York: Prentice-Hall.

                                                                                    + +Kohlbecker, Eugene Edmund, Jr. 1986. Syntactic extensions in the +programming language Lisp. Ph.D. thesis, Indiana University.

                                                                                    + +Konopasek, Milos, and Sundaresan Jayaraman. 1984. The TK!Solver +Book: A Guide to Problem-Solving in Science, Engineering, Business, +and Education. Berkeley, CA: Osborne/McGraw-Hill.

                                                                                    + +Knuth, Donald E. 1973. Fundamental Algorithms. Volume 1 of +The Art of Computer Programming. 2nd edition. Reading, MA: +Addison-Wesley.

                                                                                    + +Knuth, Donald E. 1981. Seminumerical Algorithms. Volume 2 of +The Art of Computer Programming. 2nd edition. Reading, MA: +Addison-Wesley.

                                                                                    + +Kowalski, Robert. 1973. Predicate logic as a programming language. +Technical report 70, Department of Computational Logic, School of +Artificial Intelligence, University of Edinburgh.

                                                                                    + +Kowalski, Robert. 1979. Logic for Problem Solving. New York: +North-Holland.

                                                                                    + +Lamport, Leslie. 1978. Time, clocks, and the ordering of events in a +distributed system. Communications of the ACM 21(7):558-565.

                                                                                    + +Lampson, Butler, J. J. Horning, R. London, J. G. Mitchell, and G. K. +Popek. 1981. Report on the programming language Euclid. Technical +report, Computer Systems Research Group, University of Toronto.

                                                                                    + +Landin, Peter. 1965. A correspondence between Algol 60 and Church's +lambda notation: Part I. Communications of the ACM +8(2):89-101.

                                                                                    + +Lieberman, Henry, and Carl E. Hewitt. 1983. A real-time garbage +collector based on the lifetimes of objects. Communications of +the ACM 26(6):419-429.

                                                                                    + +Liskov, Barbara H., and Stephen N. Zilles. 1975. Specification +techniques for data abstractions. IEEE Transactions on Software +Engineering 1(1):7-19.

                                                                                    + +McAllester, David Allen. 1978. A three-valued truth-maintenance +system. Memo 473, MIT Artificial Intelligence Laboratory.

                                                                                    + +McAllester, David Allen. 1980. An outlook on truth maintenance. +Memo 551, MIT Artificial Intelligence Laboratory.

                                                                                    + +McCarthy, John. 1960. Recursive functions of symbolic expressions +and their computation by machine. Communications of the ACM +3(4):184-195.

                                                                                    + +McCarthy, John. 1967. A basis for a mathematical theory of +computation. In Computer Programing and Formal Systems, edited +by P. Braffort and D. Hirschberg. North-Holland.

                                                                                    + +McCarthy, John. 1978. The history of Lisp. In Proceedings of +the ACM SIGPLAN Conference on the History of Programming Languages.

                                                                                    + +McCarthy, John, P. W. Abrahams, D. J. Edwards, T. P. Hart, and M. I. +Levin. 1965. Lisp 1.5 Programmer's Manual. 2nd edition. +Cambridge, MA: MIT Press.

                                                                                    + +McDermott, Drew, and Gerald Jay Sussman. 1972. Conniver reference +manual. Memo 259, MIT Artificial Intelligence Laboratory.

                                                                                    + +Miller, Gary L. 1976. Riemann's Hypothesis and tests for primality. +Journal of Computer and System Sciences 13(3):300-317.

                                                                                    + +Miller, James S., and Guillermo J. Rozas. 1994. Garbage collection is +fast, but a stack is faster. Memo 1462, MIT Artificial Intelligence +Laboratory.

                                                                                    + +Moon, David. 1978. MacLisp reference manual, Version 0. Technical +report, MIT Laboratory for Computer Science.

                                                                                    + +Moon, David, and Daniel Weinreb. 1981. Lisp machine manual. +Technical report, MIT Artificial Intelligence Laboratory.

                                                                                    + +Morris, J. H., Eric Schmidt, and Philip Wadler. 1980. Experience +with an applicative string processing language. In Proceedings +of the 7th Annual ACM SIGACT/SIGPLAN Symposium on the Principles of +Programming Languages.

                                                                                    + +Phillips, Hubert. 1934. The Sphinx Problem Book. London: Faber +and Faber.

                                                                                    + +Pitman, Kent. 1983. The revised MacLisp Manual (Saturday evening +edition). Technical report 295, MIT Laboratory for Computer Science.

                                                                                    + +Rabin, Michael O. 1980. Probabilistic algorithm for testing primality. +Journal of Number Theory 12:128-138.

                                                                                    + +Raymond, Eric. 1993. The New Hacker's Dictionary. 2nd edition. +Cambridge, MA: MIT Press.

                                                                                    + +Raynal, Michel. 1986. Algorithms for Mutual Exclusion. +Cambridge, MA: MIT Press.

                                                                                    + +Rees, Jonathan A., and Norman I. Adams IV. 1982. T: A dialect of Lisp +or, lambda: The ultimate software tool. In Conference Record of +the 1982 ACM Symposium on Lisp and Functional Programming, pp. +114-122.

                                                                                    + +Rees, Jonathan, and William Clinger (eds). 1991. The revised4 +report on the algorithmic language Scheme. Lisp Pointers, 4(3).

                                                                                    + +Rivest, Ronald, Adi Shamir, and Leonard Adleman. 1977. A method for +obtaining digital signatures and public-key cryptosystems. Technical +memo LCS/TM82, MIT Laboratory for Computer Science.

                                                                                    + +Robinson, J. A. 1965. A machine-oriented logic based on the +resolution principle. Journal of the ACM 12(1):23.

                                                                                    + +Robinson, J. A. 1983. Logic programming -- Past, present, and future. +New Generation Computing 1:107-124.

                                                                                    + +Spafford, Eugene H. 1989. The Internet Worm: Crisis and aftermath. +Communications of the ACM 32(6):678-688.

                                                                                    + +Steele, Guy Lewis, Jr. 1977. Debunking the ``expensive procedure +call'' myth. In Proceedings of the National Conference of the +ACM, pp. 153-62.

                                                                                    + +Steele, Guy Lewis, Jr. 1982. An overview of Common Lisp. In Proceedings of the ACM Symposium on Lisp and Functional Programming, +pp. 98-107.

                                                                                    + +Steele, Guy Lewis, Jr. 1990. Common Lisp: The Language. 2nd +edition. Digital Press.

                                                                                    + +Steele, Guy Lewis, Jr., and Gerald Jay Sussman. 1975. Scheme: An +interpreter for the extended lambda calculus. Memo 349, MIT +Artificial Intelligence Laboratory.

                                                                                    + +Steele, Guy Lewis, Jr., Donald R. Woods, Raphael A. Finkel, Mark R. +Crispin, Richard M. Stallman, and Geoffrey S. Goodfellow. 1983. The Hacker's Dictionary. New York: Harper & Row.

                                                                                    + +Stoy, Joseph E. 1977. Denotational Semantics. Cambridge, MA: +MIT Press.

                                                                                    + +Sussman, Gerald Jay, and Richard M. Stallman. 1975. Heuristic +techniques in computer-aided circuit analysis. IEEE Transactions +on Circuits and Systems CAS-22(11):857-865.

                                                                                    + +Sussman, Gerald Jay, and Guy Lewis Steele Jr. 1980. Constraints -- A +language for expressing almost-hierachical descriptions. AI +Journal 14:1-39.

                                                                                    + +Sussman, Gerald Jay, and Jack Wisdom. 1992. Chaotic evolution of the +solar system. Science 257:256-262.

                                                                                    + +Sussman, Gerald Jay, Terry Winograd, and Eugene Charniak. 1971. +Microplanner reference manual. Memo 203A, MIT Artificial Intelligence +Laboratory.

                                                                                    + +Sutherland, Ivan E. 1963. SKETCHPAD: A man-machine graphical +communication system. Technical report 296, MIT Lincoln Laboratory.

                                                                                    + +Teitelman, Warren. 1974. Interlisp reference manual. Technical +report, Xerox Palo Alto Research Center.

                                                                                    + +Thatcher, James W., Eric G. Wagner, and Jesse B. Wright. 1978. +Data type specification: Parameterization and the power of +specification techniques. In Conference Record of the Tenth Annual ACM +Symposium on Theory of Computing, pp. 119-132. + +Turner, David. 1981. The future of applicative languages. In Proceedings of the 3rd European Conference on Informatics, Lecture +Notes in Computer Science, volume 123. New York: Springer-Verlag, pp. +334-348.

                                                                                    + +Wand, Mitchell. 1980. Continuation-based program transformation +strategies. Journal of the ACM 27(1):164-180.

                                                                                    + +Waters, Richard C. 1979. A method for analyzing loop programs. IEEE Transactions on Software Engineering 5(3):237-247.

                                                                                    + +Winograd, Terry. 1971. Procedures as a representation for data in a +computer program for understanding natural language. Technical report +AI TR-17, MIT Artificial Intelligence Laboratory.

                                                                                    + +Winston, Patrick. 1992. Artificial Intelligence. 3rd edition. +Reading, MA: Addison-Wesley.

                                                                                    + +Zabih, Ramin, David McAllester, and David Chapman. 1987. +Non-deterministic Lisp with dependency-directed backtracking. +AAAI-87, pp. 59-64.

                                                                                    + +Zippel, Richard. 1979. Probabilistic algorithms for sparse +polynomials. Ph.D. dissertation, Department of Electrical Engineering +and Computer Science, MIT.

                                                                                    + +Zippel, Richard. 1993. Effective Polynomial Computation. +Boston, MA: Kluwer Academic Publishers.

                                                                                    + +

                                                                                    + + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-37.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-37.html new file mode 100644 index 00000000..f83c9342 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-37.html @@ -0,0 +1,581 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +List of Exercises

                                                                                    + +1.1
                                                                                    +1.2
                                                                                    +1.3
                                                                                    +1.4
                                                                                    +1.5
                                                                                    +1.6
                                                                                    +1.7
                                                                                    +1.8
                                                                                    +1.9
                                                                                    +1.10
                                                                                    +1.11
                                                                                    +1.12
                                                                                    +1.13
                                                                                    +1.14
                                                                                    +1.15
                                                                                    +1.16
                                                                                    +1.17
                                                                                    +1.18
                                                                                    +1.19
                                                                                    +1.20
                                                                                    +1.21
                                                                                    +1.22
                                                                                    +1.23
                                                                                    +1.24
                                                                                    +1.25
                                                                                    +1.26
                                                                                    +1.27
                                                                                    +1.28
                                                                                    +1.29
                                                                                    +1.30
                                                                                    +1.31
                                                                                    +1.32
                                                                                    +1.33
                                                                                    +1.34
                                                                                    +1.35
                                                                                    +1.36
                                                                                    +1.37
                                                                                    +1.38
                                                                                    +1.39
                                                                                    +1.40
                                                                                    +1.41
                                                                                    +1.42
                                                                                    +1.43
                                                                                    +1.44
                                                                                    +1.45
                                                                                    +1.46
                                                                                    +2.1
                                                                                    +2.2
                                                                                    +2.3
                                                                                    +2.4
                                                                                    +2.5
                                                                                    +2.6
                                                                                    +2.7
                                                                                    +2.8
                                                                                    +2.9
                                                                                    +2.10
                                                                                    +2.11
                                                                                    +2.12
                                                                                    +2.13
                                                                                    +2.14
                                                                                    +2.15
                                                                                    +2.16
                                                                                    +2.17
                                                                                    +2.18
                                                                                    +2.19
                                                                                    +2.20
                                                                                    +2.21
                                                                                    +2.22
                                                                                    +2.23
                                                                                    +2.24
                                                                                    +2.25
                                                                                    +2.26
                                                                                    +2.27
                                                                                    +2.28
                                                                                    +2.29
                                                                                    +2.30
                                                                                    +2.31
                                                                                    +2.32
                                                                                    +2.33
                                                                                    +2.34
                                                                                    +2.35
                                                                                    +2.36
                                                                                    +2.37
                                                                                    +2.38
                                                                                    +2.39
                                                                                    +2.40
                                                                                    +2.41
                                                                                    +2.42
                                                                                    +2.43
                                                                                    +2.44
                                                                                    +2.45
                                                                                    +2.46
                                                                                    +2.47
                                                                                    +2.48
                                                                                    +2.49
                                                                                    +2.50
                                                                                    +2.51
                                                                                    +2.52
                                                                                    +2.53
                                                                                    +2.54
                                                                                    +2.55
                                                                                    +2.56
                                                                                    +2.57
                                                                                    +2.58
                                                                                    +2.59
                                                                                    +2.60
                                                                                    +2.61
                                                                                    +2.62
                                                                                    +2.63
                                                                                    +2.64
                                                                                    +2.65
                                                                                    +2.66
                                                                                    +2.67
                                                                                    +2.68
                                                                                    +2.69
                                                                                    +2.70
                                                                                    +2.71
                                                                                    +2.72
                                                                                    +2.73
                                                                                    +2.74
                                                                                    +2.75
                                                                                    +2.76
                                                                                    +2.77
                                                                                    +2.78
                                                                                    +2.79
                                                                                    +2.80
                                                                                    +2.81
                                                                                    +2.82
                                                                                    +2.83
                                                                                    +2.84
                                                                                    +2.85
                                                                                    +2.86
                                                                                    +2.87
                                                                                    +2.88
                                                                                    +2.89
                                                                                    +2.90
                                                                                    +2.91
                                                                                    +2.92
                                                                                    +2.93
                                                                                    +2.94
                                                                                    +2.95
                                                                                    +2.96
                                                                                    +2.97
                                                                                    +3.1
                                                                                    +3.2
                                                                                    +3.3
                                                                                    +3.4
                                                                                    +3.5
                                                                                    +3.6
                                                                                    +3.7
                                                                                    +3.8
                                                                                    +3.9
                                                                                    +3.10
                                                                                    +3.11
                                                                                    +3.12
                                                                                    +3.13
                                                                                    +3.14
                                                                                    +3.15
                                                                                    +3.16
                                                                                    +3.17
                                                                                    +3.18
                                                                                    +3.19
                                                                                    +3.20
                                                                                    +3.21
                                                                                    +3.22
                                                                                    +3.23
                                                                                    +3.24
                                                                                    +3.25
                                                                                    +3.26
                                                                                    +3.27
                                                                                    +3.28
                                                                                    +3.29
                                                                                    +3.30
                                                                                    +3.31
                                                                                    +3.32
                                                                                    +3.33
                                                                                    +3.34
                                                                                    +3.35
                                                                                    +3.36
                                                                                    +3.37
                                                                                    +3.38
                                                                                    +3.39
                                                                                    +3.40
                                                                                    +3.41
                                                                                    +3.42
                                                                                    +3.43
                                                                                    +3.44
                                                                                    +3.45
                                                                                    +3.46
                                                                                    +3.47
                                                                                    +3.48
                                                                                    +3.49
                                                                                    +3.50
                                                                                    +3.51
                                                                                    +3.52
                                                                                    +3.53
                                                                                    +3.54
                                                                                    +3.55
                                                                                    +3.56
                                                                                    +3.57
                                                                                    +3.58
                                                                                    +3.59
                                                                                    +3.60
                                                                                    +3.61
                                                                                    +3.62
                                                                                    +3.63
                                                                                    +3.64
                                                                                    +3.65
                                                                                    +3.66
                                                                                    +3.67
                                                                                    +3.68
                                                                                    +3.69
                                                                                    +3.70
                                                                                    +3.71
                                                                                    +3.72
                                                                                    +3.73
                                                                                    +3.74
                                                                                    +3.75
                                                                                    +3.76
                                                                                    +3.77
                                                                                    +3.78
                                                                                    +3.79
                                                                                    +3.80
                                                                                    +3.81
                                                                                    +3.82
                                                                                    +4.1
                                                                                    +4.2
                                                                                    +4.3
                                                                                    +4.4
                                                                                    +4.5
                                                                                    +4.6
                                                                                    +4.7
                                                                                    +4.8
                                                                                    +4.9
                                                                                    +4.10
                                                                                    +4.11
                                                                                    +4.12
                                                                                    +4.13
                                                                                    +4.14
                                                                                    +4.15
                                                                                    +4.16
                                                                                    +4.17
                                                                                    +4.18
                                                                                    +4.19
                                                                                    +4.20
                                                                                    +4.21
                                                                                    +4.22
                                                                                    +4.23
                                                                                    +4.24
                                                                                    +4.25
                                                                                    +4.26
                                                                                    +4.27
                                                                                    +4.28
                                                                                    +4.29
                                                                                    +4.30
                                                                                    +4.31
                                                                                    +4.32
                                                                                    +4.33
                                                                                    +4.34
                                                                                    +4.35
                                                                                    +4.36
                                                                                    +4.37
                                                                                    +4.38
                                                                                    +4.39
                                                                                    +4.40
                                                                                    +4.41
                                                                                    +4.42
                                                                                    +4.43
                                                                                    +4.44
                                                                                    +4.45
                                                                                    +4.46
                                                                                    +4.47
                                                                                    +4.48
                                                                                    +4.49
                                                                                    +4.50
                                                                                    +4.51
                                                                                    +4.52
                                                                                    +4.53
                                                                                    +4.54
                                                                                    +4.55
                                                                                    +4.56
                                                                                    +4.57
                                                                                    +4.58
                                                                                    +4.59
                                                                                    +4.60
                                                                                    +4.61
                                                                                    +4.62
                                                                                    +4.63
                                                                                    +4.64
                                                                                    +4.65
                                                                                    +4.66
                                                                                    +4.67
                                                                                    +4.68
                                                                                    +4.69
                                                                                    +4.70
                                                                                    +4.71
                                                                                    +4.72
                                                                                    +4.73
                                                                                    +4.74
                                                                                    +4.75
                                                                                    +4.76
                                                                                    +4.77
                                                                                    +4.78
                                                                                    +4.79
                                                                                    +5.1
                                                                                    +5.2
                                                                                    +5.3
                                                                                    +5.4
                                                                                    +5.5
                                                                                    +5.6
                                                                                    +5.7
                                                                                    +5.8
                                                                                    +5.9
                                                                                    +5.10
                                                                                    +5.11
                                                                                    +5.12
                                                                                    +5.13
                                                                                    +5.14
                                                                                    +5.15
                                                                                    +5.16
                                                                                    +5.17
                                                                                    +5.18
                                                                                    +5.19
                                                                                    +5.20
                                                                                    +5.21
                                                                                    +5.22
                                                                                    +5.23
                                                                                    +5.24
                                                                                    +5.25
                                                                                    +5.26
                                                                                    +5.27
                                                                                    +5.28
                                                                                    +5.29
                                                                                    +5.30
                                                                                    +5.31
                                                                                    +5.32
                                                                                    +5.33
                                                                                    +5.34
                                                                                    +5.35
                                                                                    +5.36
                                                                                    +5.37
                                                                                    +5.38
                                                                                    +5.39
                                                                                    +5.40
                                                                                    +5.41
                                                                                    +5.42
                                                                                    +5.43
                                                                                    +5.44
                                                                                    +5.45
                                                                                    +5.46
                                                                                    +5.47
                                                                                    +5.48
                                                                                    +5.49
                                                                                    +5.50
                                                                                    +5.51
                                                                                    +5.52
                                                                                    + + + + + + +

                                                                                    + + +

                                                                                    + + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + +

                                                                                    + + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + + +

                                                                                    + + + + + + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + + + +

                                                                                    + +

                                                                                    + + +

                                                                                    + + + +

                                                                                    + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + +

                                                                                    + +

                                                                                    + + +

                                                                                    + + + +

                                                                                    + +

                                                                                    + + + +

                                                                                    + + + + + + +

                                                                                    + + + + + + + +

                                                                                    + + + +

                                                                                    + + + +

                                                                                    + + + + +

                                                                                    + + + +

                                                                                    + + + + + +

                                                                                    + +

                                                                                    + +

                                                                                    + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + + +

                                                                                    + + + + + + + + + +

                                                                                    + + + + + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + + + + +

                                                                                    + + + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-38.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-38.html new file mode 100644 index 00000000..1d60bf9b --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-38.html @@ -0,0 +1,3701 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +Index

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + + +Any inaccuracies in this index may be explained by the fact that it +has been prepared with the help of a computer. +

                                                                                    Donald E. Knuth, +Fundamental Algorithms (Volume 1 of +The Art of Computer Programming) + +

                                                                                    +
                                                                                    + +

                                                                                    +

                                                                                    + +
                                                                                    +
                                                                                    ! in names
                                                                                    +" (double quote)
                                                                                    + calculus, see lambda calculus +
                                                                                    + notation for mathematical function
                                                                                    + , see pi +
                                                                                    +sum (sigma) notation
                                                                                    + , see theta +
                                                                                    +' (single quote)
                                                                                    +    read and, +[2]
                                                                                    +* (primitive multiplication procedure)
                                                                                    ++ (primitive addition procedure)
                                                                                    +, (comma, used with backquote)
                                                                                    +- (primitive subtraction procedure)
                                                                                    +    as negation
                                                                                    +/ (primitive division procedure)
                                                                                    +< (primitive numeric comparison predicate)
                                                                                    += (primitive numeric equality predicate)
                                                                                    +=number?
                                                                                    +=zero? (generic)
                                                                                    +    for polynomials
                                                                                    +> (primitive numeric comparison predicate)
                                                                                    +>=, [2]
                                                                                    +? , in predicate names
                                                                                    +#f
                                                                                    +#t
                                                                                    +` (backquote)
                                                                                    +;, see semicolon

                                                                                    + +

                                                                                    + +
                                                                                    +Abelson, Harold
                                                                                    +abs, [2], +[3]
                                                                                    +absolute value
                                                                                    +abstract data, +see also data abstraction +
                                                                                    +abstract models for data
                                                                                    +abstract syntax +
                                                                                    +    in metacircular evaluator
                                                                                    +    in query interpreter
                                                                                    +abstraction, see also means of abstraction; data abstraction; higher-order procedures +
                                                                                    +    common pattern and
                                                                                    +    metalinguistic
                                                                                    +    procedural
                                                                                    +    in register-machine design
                                                                                    +    of search in nondeterministic programming
                                                                                    +abstraction barriers, +[2], [3]
                                                                                    +    in complex-number system
                                                                                    +    in generic arithmetic system
                                                                                    +accelerated-sequence
                                                                                    +accumulate, +[2]
                                                                                    +    same as fold-right
                                                                                    +accumulate-n
                                                                                    +accumulator, [2]
                                                                                    +Áchárya, Bháscara
                                                                                    +Ackermann's function
                                                                                    +acquire a mutex
                                                                                    +actions, in register machine
                                                                                    +actual-value
                                                                                    +Ada
                                                                                    +    recursive procedures
                                                                                    +Adams, Norman I., IV
                                                                                    +add (generic)
                                                                                    +    used for polynomial coefficients, +[2]
                                                                                    +add-action!, +[2]
                                                                                    +add-binding-to-frame!
                                                                                    +add-complex
                                                                                    +add-complex-to-schemenum
                                                                                    +add-interval
                                                                                    +add-lists
                                                                                    +add-poly
                                                                                    +add-rat
                                                                                    +add-rule-or-assertion!
                                                                                    +add-streams
                                                                                    +add-terms
                                                                                    +add-to-agenda!, +[2]
                                                                                    +add-vect
                                                                                    +addend
                                                                                    +adder +
                                                                                    +    full
                                                                                    +    half
                                                                                    +    ripple-carry
                                                                                    +adder (primitive constraint)
                                                                                    +additivity, [2], +[3], [4]
                                                                                    +address
                                                                                    +address arithmetic
                                                                                    +Adelman, Leonard
                                                                                    +adjoin-arg
                                                                                    +adjoin-set
                                                                                    +    binary-tree representation
                                                                                    +    ordered-list representation
                                                                                    +    unordered-list representation
                                                                                    +    for weighted sets
                                                                                    +adjoin-term, +[2]
                                                                                    +advance-pc
                                                                                    +after-delay, +[2]
                                                                                    +agenda, see digital-circuit simulation +
                                                                                    +A'h-mose
                                                                                    +algebra, symbolic, see symbolic algebra +
                                                                                    +algebraic expression
                                                                                    +    differentiating
                                                                                    +    representing
                                                                                    +    simplifying
                                                                                    +algebraic specification for data
                                                                                    +Algol +
                                                                                    +    block structure
                                                                                    +    call-by-name argument passing, +[2]
                                                                                    +    thunks, [2]
                                                                                    +    weakness in handling compound objects
                                                                                    +algorithm +
                                                                                    +    optimal
                                                                                    +    probabilistic, +[2]
                                                                                    +aliasing
                                                                                    +all-regs (compiler)
                                                                                    +Allen, John
                                                                                    +alternative of if
                                                                                    +always-true
                                                                                    +amb
                                                                                    +amb evaluator, see nondeterministic evaluator +
                                                                                    +ambeval
                                                                                    +an-element-of
                                                                                    +an-integer-starting-from
                                                                                    +analog computer
                                                                                    +analyze +
                                                                                    +    metacircular
                                                                                    +    nondeterministic
                                                                                    +analyze-... +
                                                                                    +    metacircular, +[2]
                                                                                    +    nondeterministic
                                                                                    +analyze-amb
                                                                                    +analyzing evaluator
                                                                                    +    as basis for nondeterministic evaluator
                                                                                    +    let
                                                                                    +and (query language)
                                                                                    +    evaluation of, +[2], [3]
                                                                                    +and (special form)
                                                                                    +    evaluation of
                                                                                    +    why a special form
                                                                                    +    with no subexpressions
                                                                                    +and-gate
                                                                                    +    and-gate
                                                                                    +angle +
                                                                                    +    data-directed
                                                                                    +    polar representation
                                                                                    +    rectangular representation
                                                                                    +    with tagged data
                                                                                    +angle-polar
                                                                                    +angle-rectangular
                                                                                    +announce-output
                                                                                    +APL
                                                                                    +Appel, Andrew W.
                                                                                    +append, [2], +[3]
                                                                                    +    as accumulation
                                                                                    +    append! vs.
                                                                                    +    with arbitrary number of arguments
                                                                                    +    as register machine
                                                                                    +    ``what is'' (rules) vs. ``how to'' (procedure)
                                                                                    +append!
                                                                                    +    as register machine
                                                                                    +append-instruction-sequences, +[2]
                                                                                    +append-to-form (rules)
                                                                                    +application?
                                                                                    +applicative-order evaluation
                                                                                    +    in Lisp
                                                                                    +    normal order vs., +[2], [3]
                                                                                    +apply (lazy)
                                                                                    +apply (metacircular)
                                                                                    +    primitive apply vs.
                                                                                    +apply (primitive procedure)
                                                                                    +apply-dispatch
                                                                                    +    modified for compiled code
                                                                                    +apply-generic
                                                                                    +    with coercion, +[2]
                                                                                    +    with coercion by raising
                                                                                    +    with coercion of multiple arguments
                                                                                    +    with coercion to simplify
                                                                                    +    with message passing
                                                                                    +    with tower of types
                                                                                    +apply-primitive-procedure, +[2], [3]
                                                                                    +apply-rules
                                                                                    +arbiter
                                                                                    +arctangent
                                                                                    +argl register
                                                                                    +argument passing, see call-by-name argument passing; call-by-need argument passing +
                                                                                    +argument(s)
                                                                                    +    arbitrary number of, +[2]
                                                                                    +    delayed
                                                                                    +Aristotle's De caelo (Buridan's commentary on)
                                                                                    +arithmetic +
                                                                                    +    address arithmetic
                                                                                    +    generic, +see also generic arithmetic operations +
                                                                                    +    on complex numbers
                                                                                    +    on intervals
                                                                                    +    on polynomials, see polynomial arithmetic +
                                                                                    +    on power series, +[2]
                                                                                    +    on rational numbers
                                                                                    +    primitive procedures for
                                                                                    +articles
                                                                                    +ASCII code
                                                                                    +assemble, [2]
                                                                                    +assembler, [2]
                                                                                    +assert! (query interpreter)
                                                                                    +assertion
                                                                                    +    implicit
                                                                                    +assign (in register machine)
                                                                                    +    simulating
                                                                                    +    storing label in register
                                                                                    +assign-reg-name
                                                                                    +assign-value-exp
                                                                                    +assignment, see also set! +
                                                                                    +    benefits of
                                                                                    +    bugs associated with, +[2]
                                                                                    +    costs of
                                                                                    +assignment operator, +see also set! +
                                                                                    +assignment-value
                                                                                    +assignment-variable
                                                                                    +assignment?
                                                                                    +assoc
                                                                                    +atan (primitive procedure)
                                                                                    +atomic operations supported in hardware
                                                                                    +atomic requirement for test-and-set!
                                                                                    +attach-tag
                                                                                    +    using Scheme data types
                                                                                    +augend
                                                                                    +automagically
                                                                                    +automatic search, +see also search +
                                                                                    +    history of
                                                                                    +automatic storage allocation
                                                                                    +average
                                                                                    +average damping
                                                                                    +average-damp
                                                                                    +averager (constraint)

                                                                                    + +

                                                                                    + +
                                                                                    +B-tree
                                                                                    +backquote
                                                                                    +backtracking, +see also nondeterministic computing +
                                                                                    +Backus, John
                                                                                    +Baker, Henry G., Jr.
                                                                                    +balanced binary tree, +see also binary tree +
                                                                                    +balanced mobile
                                                                                    +bank account, [2]
                                                                                    +    exchanging balances
                                                                                    +    joint, [2]
                                                                                    +    joint, modeled with streams
                                                                                    +    joint, with concurrent access
                                                                                    +    password-protected
                                                                                    +    serialized
                                                                                    +    stream model
                                                                                    +    transferring money
                                                                                    +barrier synchronization
                                                                                    +Barth, John
                                                                                    +Basic +
                                                                                    +    restrictions on compound data
                                                                                    +    weakness in handling compound objects
                                                                                    +Batali, John Dean
                                                                                    +begin (special form)
                                                                                    +    implicit in consequent of cond and in procedure body
                                                                                    +begin-actions
                                                                                    +begin?
                                                                                    +below, [2]
                                                                                    +Bertrand's Hypothesis
                                                                                    +beside, [2]
                                                                                    +bignum
                                                                                    +binary numbers, addition of, see adder +
                                                                                    +binary search
                                                                                    +binary tree
                                                                                    +    balanced
                                                                                    +    converting a list to a
                                                                                    +    converting to a list
                                                                                    +    for Huffman encoding
                                                                                    +    represented with lists
                                                                                    +    sets represented as
                                                                                    +    table structured as
                                                                                    +bind
                                                                                    +binding
                                                                                    +    deep
                                                                                    +binomial coefficients
                                                                                    +black box
                                                                                    +block structure, [2]
                                                                                    +    in environment model
                                                                                    +    in query language
                                                                                    +blocked process
                                                                                    +body of a procedure
                                                                                    +Bolt Beranek and Newman Inc.
                                                                                    +Borning, Alan
                                                                                    +Borodin, Alan
                                                                                    +bound variable
                                                                                    +box-and-pointer notation
                                                                                    +    end-of-list marker
                                                                                    +branch (in register machine)
                                                                                    +    simulating
                                                                                    +branch of a tree
                                                                                    +branch-dest
                                                                                    +breakpoint
                                                                                    +broken heart
                                                                                    +bug
                                                                                    +    capturing a free variable
                                                                                    +    order of assignments
                                                                                    +    side effect with aliasing
                                                                                    +bureaucracy
                                                                                    +Buridan, Jean
                                                                                    +busy-waiting

                                                                                    + +

                                                                                    + +
                                                                                    +C +
                                                                                    +    compiling Scheme into
                                                                                    +    error handling, +[2]
                                                                                    +    recursive procedures
                                                                                    +    restrictions on compound data
                                                                                    +    Scheme interpreter written in, +[2]
                                                                                    +ca...r
                                                                                    +cache-coherence protocols
                                                                                    +cadr
                                                                                    +calculator, fixed points with
                                                                                    +call-by-name argument passing, +[2]
                                                                                    +call-by-need argument passing, +[2]
                                                                                    +    memoization and
                                                                                    +call-each
                                                                                    +cancer of the semicolon
                                                                                    +canonical form, for polynomials
                                                                                    +capturing a free variable
                                                                                    +car (primitive procedure)
                                                                                    +    axiom for
                                                                                    +    implemented with vectors
                                                                                    +    as list operation
                                                                                    +    origin of the name
                                                                                    +    procedural implementation of, +[2], [3], +[4], [5]
                                                                                    +Carmichael numbers, +[2]
                                                                                    +case analysis +
                                                                                    +    data-directed programming vs.
                                                                                    +    general, see also cond +
                                                                                    +    with two cases (if)
                                                                                    +cd...r
                                                                                    +cdr (primitive procedure)
                                                                                    +    axiom for
                                                                                    +    implemented with vectors
                                                                                    +    as list operation
                                                                                    +    origin of the name
                                                                                    +    procedural implementation of, +[2], [3], +[4], [5]
                                                                                    +cdr down a list
                                                                                    +cell, in serializer implementation
                                                                                    +celsius-fahrenheit-converter
                                                                                    +    expression-oriented
                                                                                    +center
                                                                                    +Cesàro, Ernesto
                                                                                    +cesaro-stream
                                                                                    +cesaro-test
                                                                                    +Chaitin, Gregory
                                                                                    +Chandah-sutra
                                                                                    +change and sameness +
                                                                                    +    meaning of
                                                                                    +    shared data and
                                                                                    +changing money, see counting change +
                                                                                    +chaos in the Solar System
                                                                                    +Chapman, David
                                                                                    +character strings +
                                                                                    +    primitive procedures for, +[2]
                                                                                    +    quotation of
                                                                                    +character, ASCII encoding
                                                                                    +Charniak, Eugene
                                                                                    +Chebyshev, Pafnutii L'vovich
                                                                                    +chess, eight-queens puzzle, +[2]
                                                                                    +chip implementation of Scheme, +[2]
                                                                                    +chronological backtracking
                                                                                    +Chu Shih-chieh
                                                                                    +Church numerals
                                                                                    +Church, Alonzo, [2]
                                                                                    +Church-Turing thesis
                                                                                    +circuit +
                                                                                    +    digital, see digital-circuit simulation +
                                                                                    +    modeled with streams, +[2]
                                                                                    +Clark, Keith L.
                                                                                    +clause, of a cond
                                                                                    +    additional syntax
                                                                                    +Clinger, William, +[2]
                                                                                    +closed world assumption
                                                                                    +closure
                                                                                    +    in abstract algebra
                                                                                    +    closure property of cons
                                                                                    +    closure property of picture-language operations, [2]
                                                                                    +    lack of in many languages
                                                                                    +coal, bituminous
                                                                                    +code +
                                                                                    +    ASCII
                                                                                    +    fixed-length
                                                                                    +    Huffman, see Huffman code +
                                                                                    +    Morse
                                                                                    +    prefix
                                                                                    +    variable-length
                                                                                    +code generator
                                                                                    +    arguments of
                                                                                    +    value of
                                                                                    +coeff, [2]
                                                                                    +coercion
                                                                                    +    in algebraic manipulation
                                                                                    +    in polynomial arithmetic
                                                                                    +    procedure
                                                                                    +    table
                                                                                    +Colmerauer, Alain
                                                                                    +combination
                                                                                    +    combination as operator of
                                                                                    +    compound expression as operator of
                                                                                    +    evaluation of
                                                                                    +    lambda expression as operator of
                                                                                    +    as operator of combination
                                                                                    +    as a tree
                                                                                    +combination, means of, +see also closure +
                                                                                    +comma, used with backquote
                                                                                    +comments in programs
                                                                                    +Common Lisp
                                                                                    +    treatment of nil
                                                                                    +compacting garbage collector
                                                                                    +compilation, see compiler +
                                                                                    +compile
                                                                                    +compile-and-go, +[2]
                                                                                    +compile-and-run
                                                                                    +compile-application
                                                                                    +compile-assignment
                                                                                    +compile-definition
                                                                                    +compile-if
                                                                                    +compile-lambda
                                                                                    +compile-linkage
                                                                                    +compile-proc-appl
                                                                                    +compile-procedure-call
                                                                                    +compile-quoted
                                                                                    +compile-self-evaluating
                                                                                    +compile-sequence
                                                                                    +compile-time environment, +[2], [3]
                                                                                    +    open coding and
                                                                                    +compile-variable
                                                                                    +compiled-apply
                                                                                    +compiled-procedure-entry
                                                                                    +compiled-procedure-env
                                                                                    +compiled-procedure?
                                                                                    +compiler
                                                                                    +    interpreter vs., +[2]
                                                                                    +    tail recursion, stack allocation, and garbage-collection
                                                                                    +compiler for Scheme, +see also code generator; compile-time environment; instruction sequence; linkage descriptor; target register +
                                                                                    +    analyzing evaluator vs., +[2]
                                                                                    +    assignments
                                                                                    +    code generators, see compile-... +
                                                                                    +    combinations
                                                                                    +    conditionals
                                                                                    +    definitions
                                                                                    +    efficiency
                                                                                    +    example compilation
                                                                                    +    explicit-control evaluator vs., +[2], [3]
                                                                                    +    expression-syntax procedures
                                                                                    +    interfacing to evaluator
                                                                                    +    label generation
                                                                                    +    lambda expressions
                                                                                    +    lexical addressing
                                                                                    +    linkage code
                                                                                    +    machine-operation use
                                                                                    +    monitoring performance (stack use) of compiled code, [2], +[3]
                                                                                    +    open coding of primitives, +[2]
                                                                                    +    order of operand evaluation
                                                                                    +    procedure applications
                                                                                    +    quotations
                                                                                    +    register use, +[2], [3]
                                                                                    +    running compiled code
                                                                                    +    scanning out internal definitions, +[2]
                                                                                    +    self-evaluating expressions
                                                                                    +    sequences of expressions
                                                                                    +    stack usage, +[2], [3]
                                                                                    +    structure of
                                                                                    +    tail-recursive code generated by
                                                                                    +    variables
                                                                                    +complex package
                                                                                    +complex numbers +
                                                                                    +    polar representation
                                                                                    +    rectangular representation
                                                                                    +    rectangular vs. polar form
                                                                                    +    represented as tagged data
                                                                                    +complex->complex
                                                                                    +complex-number arithmetic
                                                                                    +    interfaced to generic arithmetic system
                                                                                    +    structure of system
                                                                                    +composition of functions
                                                                                    +compound data, need for
                                                                                    +compound expression, +see also combination; special form +
                                                                                    +    as operator of combination
                                                                                    +compound procedure, +see also procedure +
                                                                                    +    used like primitive procedure
                                                                                    +compound query
                                                                                    +    processing, [2], +[3], [4], +[5]
                                                                                    +compound-apply
                                                                                    +compound-procedure?
                                                                                    +computability, [2]
                                                                                    +computational process, +see also process +
                                                                                    +computer science, +[2]
                                                                                    +    mathematics vs., +[2]
                                                                                    +concrete data representation
                                                                                    +concurrency
                                                                                    +    correctness of concurrent programs
                                                                                    +    deadlock
                                                                                    +    functional programming and
                                                                                    +    mechanisms for controlling
                                                                                    +cond (special form)
                                                                                    +    additional clause syntax
                                                                                    +    clause
                                                                                    +    evaluation of
                                                                                    +    if vs.
                                                                                    +    implicit begin in consequent
                                                                                    +cond->if
                                                                                    +cond-actions
                                                                                    +cond-clauses
                                                                                    +cond-else-clause?
                                                                                    +cond-predicate
                                                                                    +cond?
                                                                                    +conditional expression +
                                                                                    +    cond
                                                                                    +    if
                                                                                    +congruent modulo n
                                                                                    +conjoin
                                                                                    +connect, [2]
                                                                                    +connector(s), in constraint system
                                                                                    +    operations on
                                                                                    +    representing
                                                                                    +Conniver
                                                                                    +cons (primitive procedure)
                                                                                    +    axiom for
                                                                                    +    closure property of
                                                                                    +    implemented with mutators
                                                                                    +    implemented with vectors
                                                                                    +    as list operation
                                                                                    +    meaning of the name
                                                                                    +    procedural implementation of, +[2], [3], +[4], [5], +[6]
                                                                                    +cons up a list
                                                                                    +cons-stream (special form), +[2]
                                                                                    +    lazy evaluation and
                                                                                    +    why a special form
                                                                                    +consciousness, expansion of
                                                                                    +consequent +
                                                                                    +    of cond clause
                                                                                    +    of if
                                                                                    +const (in register machine)
                                                                                    +    simulating
                                                                                    +    syntax of
                                                                                    +constant (primitive constraint)
                                                                                    +constant, specifying in register machine
                                                                                    +constant-exp
                                                                                    +constant-exp-value
                                                                                    +constraint network
                                                                                    +constraint(s) +
                                                                                    +    primitive
                                                                                    +    propagation of
                                                                                    +construct-arglist
                                                                                    +constructor
                                                                                    +    as abstraction barrier
                                                                                    +contents
                                                                                    +    using Scheme data types
                                                                                    +continuation +
                                                                                    +    in nondeterministic evaluator, +[2], +see also failure continuation; success continuation +
                                                                                    +    in register-machine simulator
                                                                                    +continue register
                                                                                    +    in explicit-control evaluator
                                                                                    +    recursion and
                                                                                    +continued fraction
                                                                                    +    e as
                                                                                    +    golden ratio as
                                                                                    +    tangent as
                                                                                    +control structure
                                                                                    +controller for register machine
                                                                                    +    controller diagram
                                                                                    +conventional interface
                                                                                    +    sequence as
                                                                                    +Cormen, Thomas H.
                                                                                    +corner-split
                                                                                    +correctness of a program
                                                                                    +cos (primitive procedure)
                                                                                    +cosine +
                                                                                    +    fixed point of
                                                                                    +    power series for
                                                                                    +cosmic radiation
                                                                                    +count-change
                                                                                    +count-leaves, +[2]
                                                                                    +    as accumulation
                                                                                    +    as register machine
                                                                                    +count-pairs
                                                                                    +counting change, [2]
                                                                                    +credit-card accounts, international
                                                                                    +Cressey, David
                                                                                    +cross-type operations
                                                                                    +cryptography
                                                                                    +cube, [2], +[3]
                                                                                    +cube root +
                                                                                    +    as fixed point
                                                                                    +    by Newton's method
                                                                                    +cube-root
                                                                                    +current time, for simulation agenda
                                                                                    +current-time, +[2]
                                                                                    +cycle in list
                                                                                    +    detecting

                                                                                    + +

                                                                                    + +
                                                                                    +Darlington, John
                                                                                    +data, [2]
                                                                                    +    abstract, +see also data abstraction +
                                                                                    +    abstract models for
                                                                                    +    algebraic specification for
                                                                                    +    compound
                                                                                    +    concrete representation of
                                                                                    +    hierarchical, +[2]
                                                                                    +    list-structured
                                                                                    +    meaning of
                                                                                    +    mutable, see mutable data objects +
                                                                                    +    numerical
                                                                                    +    procedural representation of
                                                                                    +    as program
                                                                                    +    shared
                                                                                    +    symbolic
                                                                                    +    tagged, [2]
                                                                                    +data abstraction, +[2], [3], +[4], [5], +see also metacircular evaluator +
                                                                                    +    for queue
                                                                                    +data base +
                                                                                    +    data-directed programming and
                                                                                    +    indexing, [2]
                                                                                    +    Insatiable Enterprises personnel
                                                                                    +    logic programming and
                                                                                    +    Microshaft personnel
                                                                                    +    as set of records
                                                                                    +data paths for register machine
                                                                                    +    data-path diagram
                                                                                    +data types +
                                                                                    +    in Lisp
                                                                                    +    in strongly typed languages
                                                                                    +data-directed programming, +[2]
                                                                                    +    case analysis vs.
                                                                                    +    in metacircular evaluator
                                                                                    +    in query interpreter
                                                                                    +data-directed recursion
                                                                                    +deadlock
                                                                                    +    avoidance
                                                                                    +    recovery
                                                                                    +debug
                                                                                    +decimal point in numbers
                                                                                    +declarative vs. imperative knowledge, +[2]
                                                                                    +    logic programming and, +[2]
                                                                                    +    nondeterministic computing and
                                                                                    +decode
                                                                                    +decomposition of program into parts
                                                                                    +deep binding
                                                                                    +deep-reverse
                                                                                    +deferred operations
                                                                                    +define (special form)
                                                                                    +    with dotted-tail notation
                                                                                    +    environment model of
                                                                                    +    lambda vs.
                                                                                    +    for procedures, +[2]
                                                                                    +    syntactic sugar
                                                                                    +    value of
                                                                                    +    why a special form
                                                                                    +define (special form) +
                                                                                    +    internal, see internal definition +
                                                                                    +define-variable!, +[2]
                                                                                    +definite integral
                                                                                    +    estimated with Monte Carlo simulation, [2]
                                                                                    +definition, see define; internal definition +
                                                                                    +definition-value
                                                                                    +definition-variable
                                                                                    +definition?
                                                                                    +deKleer, Johan, [2]
                                                                                    +delay (special form)
                                                                                    +    explicit
                                                                                    +    explicit vs. automatic
                                                                                    +    implementation using lambda
                                                                                    +    lazy evaluation and
                                                                                    +    memoized, [2]
                                                                                    +    why a special form
                                                                                    +delay, in digital circuit
                                                                                    +delay-it
                                                                                    +delayed argument
                                                                                    +delayed evaluation, +[2]
                                                                                    +    assignment and
                                                                                    +    explicit vs. automatic
                                                                                    +    in lazy evaluator
                                                                                    +    normal-order evaluation and
                                                                                    +    printing and
                                                                                    +    streams and
                                                                                    +delayed object
                                                                                    +delete-queue!, +[2]
                                                                                    +denom, [2]
                                                                                    +    axiom for
                                                                                    +    reducing to lowest terms
                                                                                    +dense polynomial
                                                                                    +dependency-directed backtracking
                                                                                    +deposit , with external serializer
                                                                                    +deposit message for bank account
                                                                                    +depth-first search
                                                                                    +deque
                                                                                    +deriv (numerical)
                                                                                    +deriv (symbolic)
                                                                                    +    data-directed
                                                                                    +derivative of a function
                                                                                    +derived expressions in evaluator
                                                                                    +    adding to explicit-control evaluator
                                                                                    +design, stratified
                                                                                    +differential equation, +see also solve +
                                                                                    +    second-order, +[2]
                                                                                    +differentiation +
                                                                                    +    numerical
                                                                                    +    rules for, [2]
                                                                                    +    symbolic, [2]
                                                                                    +diffusion, simulation of
                                                                                    +digital signal
                                                                                    +digital-circuit simulation
                                                                                    +    agenda
                                                                                    +    agenda implementation
                                                                                    +    primitive function boxes
                                                                                    +    representing wires
                                                                                    +    sample simulation
                                                                                    +Dijkstra, Edsger Wybe
                                                                                    +Dinesman, Howard P.
                                                                                    +Diophantus's Arithmetic, Fermat's copy of
                                                                                    +disjoin
                                                                                    +dispatching +
                                                                                    +    comparing different styles
                                                                                    +    on type, +see also data-directed programming +
                                                                                    +display (primitive procedure), +[2]
                                                                                    +display-line
                                                                                    +display-stream
                                                                                    +distinct?
                                                                                    +div (generic)
                                                                                    +div-complex
                                                                                    +div-interval
                                                                                    +    division by zero
                                                                                    +div-poly
                                                                                    +div-rat
                                                                                    +div-series
                                                                                    +div-terms
                                                                                    +divides?
                                                                                    +divisible?
                                                                                    +division of integers
                                                                                    +dog, perfectly rational, behavior of
                                                                                    +DOS/Windows
                                                                                    +dot-product
                                                                                    +dotted-tail notation +
                                                                                    +    for procedure parameters, +[2]
                                                                                    +    in query pattern, +[2]
                                                                                    +    in query-language rule
                                                                                    +    read and
                                                                                    +Doyle, Jon
                                                                                    +draw-line
                                                                                    +driver loop +
                                                                                    +    in explicit-control evaluator
                                                                                    +    in lazy evaluator
                                                                                    +    in metacircular evaluator
                                                                                    +    in nondeterministic evaluator, +[2]
                                                                                    +    in query interpreter, +[2]
                                                                                    +driver-loop +
                                                                                    +    for lazy evaluator
                                                                                    +    for metacircular evaluator
                                                                                    +    for nondeterministic evaluator

                                                                                    + +

                                                                                    + +
                                                                                    +e +
                                                                                    +    as continued fraction
                                                                                    +    as solution to differential equation
                                                                                    +ex, power series for
                                                                                    +Earth, measuring circumference of
                                                                                    +edge1-frame
                                                                                    +edge2-frame
                                                                                    +efficiency, see also order of growth, +see also order of growth +
                                                                                    +    of compilation
                                                                                    +    of data-base access
                                                                                    +    of evaluation
                                                                                    +    of Lisp
                                                                                    +    of query processing
                                                                                    +    of tree-recursive process
                                                                                    +EIEIO
                                                                                    +eight-queens puzzle, +[2]
                                                                                    +electrical circuits, modeled with streams, [2]
                                                                                    +element-of-set?
                                                                                    +    binary-tree representation
                                                                                    +    ordered-list representation
                                                                                    +    unordered-list representation
                                                                                    +else (special symbol in cond)
                                                                                    +embedded language, language design using
                                                                                    +empty list
                                                                                    +    denoted as '()
                                                                                    +    recognizing with null?
                                                                                    +empty stream
                                                                                    +empty-agenda?, +[2]
                                                                                    +empty-arglist
                                                                                    +empty-instruction-sequence
                                                                                    +empty-queue?, +[2]
                                                                                    +empty-termlist?, +[2]
                                                                                    +encapsulated name
                                                                                    +enclosing environment
                                                                                    +enclosing-environment
                                                                                    +encode
                                                                                    +end-of-list marker
                                                                                    +end-segment, +[2]
                                                                                    +end-with-linkage
                                                                                    +engineering vs. mathematics
                                                                                    +entry
                                                                                    +enumerate-interval
                                                                                    +enumerate-tree
                                                                                    +enumerator
                                                                                    +env register
                                                                                    +environment, [2]
                                                                                    +    compile-time, see compile-time environment +
                                                                                    +    as context for evaluation
                                                                                    +    enclosing
                                                                                    +    global, see global environment +
                                                                                    +    lexical scoping and
                                                                                    +    in query interpreter
                                                                                    +    renaming vs.
                                                                                    +environment model of evaluation, +[2]
                                                                                    +    environment structure
                                                                                    +    internal definitions
                                                                                    +    local state
                                                                                    +    message passing
                                                                                    +    metacircular evaluator and
                                                                                    +    procedure-application example
                                                                                    +    rules for evaluation
                                                                                    +    tail recursion and
                                                                                    +eq? (primitive procedure)
                                                                                    +    for arbitrary objects
                                                                                    +    as equality of pointers, +[2]
                                                                                    +    implementation for symbols
                                                                                    +    numerical equality and
                                                                                    +equ? (generic predicate)
                                                                                    +equal-rat?
                                                                                    +equal?
                                                                                    +equality +
                                                                                    +    in generic arithmetic system
                                                                                    +    of lists
                                                                                    +    of numbers, [2], +[3]
                                                                                    +    referential transparency and
                                                                                    +    of symbols
                                                                                    +equation, solving, see half-interval method; Newton's method; solve +
                                                                                    +Eratosthenes
                                                                                    +error (primitive procedure)
                                                                                    +error handling +
                                                                                    +    in compiled code
                                                                                    +    in explicit-control evaluator, +[2]
                                                                                    +Escher, Maurits Cornelis
                                                                                    +estimate-integral
                                                                                    +estimate-pi, +[2]
                                                                                    +Euclid's Algorithm, +[2], +see also greatest common divisor +
                                                                                    +    order of growth
                                                                                    +    for polynomials
                                                                                    +Euclid's Elements
                                                                                    +Euclid's proof of infinite number of primes
                                                                                    +Euclidean ring
                                                                                    +Euler, Leonhard
                                                                                    +    proof of Fermat's Little Theorem
                                                                                    +    series accelerator
                                                                                    +euler-transform
                                                                                    +ev-application
                                                                                    +ev-assignment
                                                                                    +ev-begin
                                                                                    +ev-definition
                                                                                    +ev-if
                                                                                    +ev-lambda
                                                                                    +ev-quoted
                                                                                    +ev-self-eval
                                                                                    +ev-sequence +
                                                                                    +    with tail recursion
                                                                                    +    without tail recursion
                                                                                    +ev-variable
                                                                                    +eval (lazy)
                                                                                    +eval (metacircular), +[2]
                                                                                    +    analyzing version
                                                                                    +    data-directed
                                                                                    +    primitive eval vs.
                                                                                    +eval (primitive procedure)
                                                                                    +    MIT Scheme
                                                                                    +    used in query interpreter
                                                                                    +eval-assignment
                                                                                    +eval-definition
                                                                                    +eval-dispatch
                                                                                    +eval-if (lazy)
                                                                                    +eval-if (metacircular)
                                                                                    +eval-sequence
                                                                                    +evaluation +
                                                                                    +    applicative-order, see applicative-order evaluation +
                                                                                    +    delayed, see delayed evaluation +
                                                                                    +    environment model of, see environment model of evaluation +
                                                                                    +    models of
                                                                                    +    normal-order, see normal-order evaluation +
                                                                                    +    of a combination
                                                                                    +    of and
                                                                                    +    of cond
                                                                                    +    of if
                                                                                    +    of or
                                                                                    +    of primitive expressions
                                                                                    +    of special forms
                                                                                    +    order of subexpression evaluation, see order of evaluation +
                                                                                    +    substitution model of, see substitution model of procedure application +
                                                                                    +evaluator, see also interpreter +
                                                                                    +    as abstract machine
                                                                                    +    metacircular
                                                                                    +    as universal machine
                                                                                    +evaluators, see metacircular evaluator; analyzing evaluator; lazy evaluator; nondeterministic evaluator; query interpreter; explicit-control evaluator +
                                                                                    +even-fibs, [2]
                                                                                    +even?
                                                                                    +evening star, see Venus +
                                                                                    +event-driven simulation
                                                                                    +evlis tail recursion
                                                                                    +exact integer
                                                                                    +exchange
                                                                                    +exclamation point in names
                                                                                    +execute
                                                                                    +execute-application +
                                                                                    +    metacircular
                                                                                    +    nondeterministic
                                                                                    +execution procedure +
                                                                                    +    in analyzing evaluator
                                                                                    +    in nondeterministic evaluator, +[2], [3]
                                                                                    +    in register-machine simulator, +[2]
                                                                                    +exp register
                                                                                    +expand-clauses
                                                                                    +explicit-control evaluator for Scheme
                                                                                    +    assignments
                                                                                    +    combinations
                                                                                    +    compound procedures
                                                                                    +    conditionals
                                                                                    +    controller
                                                                                    +    data paths
                                                                                    +    definitions
                                                                                    +    derived expressions
                                                                                    +    driver loop
                                                                                    +    error handling, +[2]
                                                                                    +    expressions with no subexpressions to evaluate
                                                                                    +    as machine-language program
                                                                                    +    machine model
                                                                                    +    modified for compiled code
                                                                                    +    monitoring performance (stack use)
                                                                                    +    normal-order evaluation
                                                                                    +    operand evaluation
                                                                                    +    operations
                                                                                    +    optimizations (additional)
                                                                                    +    primitive procedures
                                                                                    +    procedure application
                                                                                    +    registers
                                                                                    +    running
                                                                                    +    sequences of expressions
                                                                                    +    special forms (additional), +[2]
                                                                                    +    stack usage
                                                                                    +    tail recursion, +[2], [3]
                                                                                    +    as universal machine
                                                                                    +expmod, [2], +[3]
                                                                                    +exponential growth
                                                                                    +    of tree-recursive Fibonacci-number computation
                                                                                    +exponentiation
                                                                                    +    modulo n
                                                                                    +expression, see also compound expression; primitive expression +
                                                                                    +    algebraic, see algebraic expressions +
                                                                                    +    self-evaluating
                                                                                    +    symbolic, +see also symbol(s) +
                                                                                    +expression-oriented vs. imperative programming style
                                                                                    +expt +
                                                                                    +    linear iterative version
                                                                                    +    linear recursive version
                                                                                    +    register machine for
                                                                                    +extend-environment, +[2]
                                                                                    +extend-if-consistent
                                                                                    +extend-if-possible
                                                                                    +external-entry
                                                                                    +extract-labels, +[2]

                                                                                    + +

                                                                                    + +
                                                                                    +#f
                                                                                    +factorial, +see also factorial +
                                                                                    +    infinite stream
                                                                                    +    with letrec
                                                                                    +    without letrec or define
                                                                                    +factorial +
                                                                                    +    as an abstract machine
                                                                                    +    compilation of, +[2]
                                                                                    +    environment structure in evaluating
                                                                                    +    linear iterative version
                                                                                    +    linear recursive version
                                                                                    +    register machine for (iterative), +[2]
                                                                                    +    register machine for (recursive), +[2]
                                                                                    +    stack usage, compiled
                                                                                    +    stack usage, interpreted, +[2]
                                                                                    +    stack usage, register machine
                                                                                    +    with assignment
                                                                                    +    with higher-order procedures
                                                                                    +failure continuation (nondeterministic evaluator), [2]
                                                                                    +    constructed by amb
                                                                                    +    constructed by assignment
                                                                                    +    constructed by driver loop
                                                                                    +failure, in nondeterministic computation
                                                                                    +    bug vs.
                                                                                    +    searching and
                                                                                    +false
                                                                                    +false
                                                                                    +false?
                                                                                    +fast-expt
                                                                                    +fast-prime?
                                                                                    +feedback loop, modeled with streams
                                                                                    +Feeley, Marc
                                                                                    +Feigenbaum, Edward
                                                                                    +Fenichel, Robert
                                                                                    +Fermat, Pierre de
                                                                                    +Fermat test for primality
                                                                                    +    variant of
                                                                                    +Fermat's Little Theorem
                                                                                    +    alternate form
                                                                                    +    proof
                                                                                    +fermat-test
                                                                                    +fetch-assertions
                                                                                    +fetch-rules
                                                                                    +fib +
                                                                                    +    linear iterative version
                                                                                    +    logarithmic version
                                                                                    +    register machine for (tree-recursive), [2]
                                                                                    +    stack usage, compiled
                                                                                    +    stack usage, interpreted
                                                                                    +    tree-recursive version, +[2]
                                                                                    +    with memoization
                                                                                    +    with named let
                                                                                    +Fibonacci numbers, +see also fib +
                                                                                    +    Euclid's GCD algorithm and
                                                                                    +    infinite stream of, see fibs +
                                                                                    +fibs (infinite stream)
                                                                                    +    implicit definition
                                                                                    +FIFO buffer
                                                                                    +filter, [2]
                                                                                    +filter
                                                                                    +filtered-accumulate
                                                                                    +find-assertions
                                                                                    +find-divisor
                                                                                    +first-agenda-item, +[2]
                                                                                    +first-class elements in language
                                                                                    +first-exp
                                                                                    +first-frame
                                                                                    +first-operand
                                                                                    +first-segment
                                                                                    +first-term, +[2]
                                                                                    +fixed point
                                                                                    +    computing with calculator
                                                                                    +    of cosine
                                                                                    +    cube root as
                                                                                    +    fourth root as
                                                                                    +    golden ratio as
                                                                                    +    as iterative improvement
                                                                                    +    in Newton's method
                                                                                    +    nth root as
                                                                                    +    square root as, +[2], [3]
                                                                                    +    of transformed function
                                                                                    +    unification and
                                                                                    +fixed-length code
                                                                                    +fixed-point
                                                                                    +    as iterative improvement
                                                                                    +fixed-point-of-transform
                                                                                    +flag register
                                                                                    +flatmap
                                                                                    +flatten-stream
                                                                                    +flip-horiz, +[2]
                                                                                    +flip-vert, [2]
                                                                                    +flipped-pairs, +[2], [3]
                                                                                    +Floyd, Robert
                                                                                    +fold-left
                                                                                    +fold-right
                                                                                    +for-each, [2]
                                                                                    +for-each-except
                                                                                    +Forbus, Kenneth D.
                                                                                    +force, [2]
                                                                                    +    forcing a thunk vs.
                                                                                    +force a thunk
                                                                                    +force-it
                                                                                    +    memoized version
                                                                                    +forget-value!, +[2]
                                                                                    +formal parameters
                                                                                    +    names of
                                                                                    +    scope of
                                                                                    +formatting input expressions
                                                                                    +Fortran, [2]
                                                                                    +    inventor of
                                                                                    +    restrictions on compound data
                                                                                    +forwarding address
                                                                                    +fourth root, as fixed point
                                                                                    +fraction, see rational number(s) +
                                                                                    +frame (environment model)
                                                                                    +    as repository of local state
                                                                                    +    global
                                                                                    +frame (picture language), +[2]
                                                                                    +    coordinate map
                                                                                    +frame (query interpreter), +see also pattern matching; unification +
                                                                                    +    representation
                                                                                    +frame-coord-map
                                                                                    +frame-values
                                                                                    +frame-variables
                                                                                    +framed-stack discipline
                                                                                    +Franz Lisp
                                                                                    +free register, +[2]
                                                                                    +free list
                                                                                    +free variable
                                                                                    +    capturing
                                                                                    +    in internal definition
                                                                                    +Friedman, Daniel P., +[2]
                                                                                    +fringe
                                                                                    +    as a tree enumeration
                                                                                    +front-ptr
                                                                                    +front-queue, +[2]
                                                                                    +full-adder
                                                                                    +    full-adder
                                                                                    +function (mathematical) +
                                                                                    +     notation for
                                                                                    +    Ackermann's
                                                                                    +    composition of
                                                                                    +    derivative of
                                                                                    +    fixed point of
                                                                                    +    procedure vs.
                                                                                    +    rational
                                                                                    +    repeated application of
                                                                                    +    smoothing of
                                                                                    +function box, in digital circuit
                                                                                    +functional programming, +[2]
                                                                                    +    concurrency and
                                                                                    +    functional programming languages
                                                                                    +    time and

                                                                                    + +

                                                                                    + +
                                                                                    +Gabriel, Richard P.
                                                                                    +garbage collection
                                                                                    +    memoization and
                                                                                    +    mutation and
                                                                                    +    tail recursion and
                                                                                    +garbage collector +
                                                                                    +    compacting
                                                                                    +    mark-sweep
                                                                                    +    stop-and-copy
                                                                                    +GCD, see greatest common divisor +
                                                                                    +gcd
                                                                                    +    register machine for, +[2]
                                                                                    +gcd-terms
                                                                                    +general-purpose computer, as universal machine
                                                                                    +generate-huffman-tree
                                                                                    +generating sentences
                                                                                    +generic arithmetic operations
                                                                                    +    structure of system
                                                                                    +generic operation
                                                                                    +generic procedure, +[2]
                                                                                    +    generic selector, +[2]
                                                                                    +Genesis
                                                                                    +get, [2]
                                                                                    +get-contents
                                                                                    +get-global-environment
                                                                                    +get-register
                                                                                    +get-register-contents, +[2]
                                                                                    +get-signal, +[2]
                                                                                    +get-value, [2]
                                                                                    +glitch
                                                                                    +global environment, +[2]
                                                                                    +    in metacircular evaluator
                                                                                    +global frame
                                                                                    +Goguen, Joseph
                                                                                    +golden ratio
                                                                                    +    as continued fraction
                                                                                    +    as fixed point
                                                                                    +Gordon, Michael
                                                                                    +goto (in register machine)
                                                                                    +    label as destination
                                                                                    +    simulating
                                                                                    +goto-dest
                                                                                    +grammar
                                                                                    +graphics, see picture language +
                                                                                    +Gray, Jim
                                                                                    +greatest common divisor, +see also gcd +
                                                                                    +    generic
                                                                                    +    of polynomials
                                                                                    +    used to estimate
                                                                                    +    used in rational-number arithmetic
                                                                                    +Green, Cordell
                                                                                    +Griss, Martin Lewis
                                                                                    +Guttag, John Vogel

                                                                                    + +

                                                                                    + +
                                                                                    +half-adder
                                                                                    +    half-adder
                                                                                    +    simulation of
                                                                                    +half-interval method
                                                                                    +    half-interval-method
                                                                                    +    Newton's method vs.
                                                                                    +halting problem
                                                                                    +Halting Theorem
                                                                                    +Hamming, Richard Wesley, +[2]
                                                                                    +Hanson, Christopher P., +[2]
                                                                                    +Hardy, Godfrey Harold, +[2]
                                                                                    +has-value?, +[2]
                                                                                    +Hassle
                                                                                    +Havender, J.
                                                                                    +Haynes, Christopher T.
                                                                                    +headed list, [2]
                                                                                    +Hearn, Anthony C.
                                                                                    +Henderson, Peter, +[2], [3]
                                                                                    +    Henderson diagram
                                                                                    +Heraclitus
                                                                                    +Heron of Alexandria
                                                                                    +Hewitt, Carl Eddie, +[2], [3], +[4]
                                                                                    +hiding principle
                                                                                    +hierarchical data structures, +[2]
                                                                                    +hierarchy of types
                                                                                    +    in symbolic algebra
                                                                                    +    inadequacy of
                                                                                    +high-level language, machine language vs.
                                                                                    +higher-order procedures
                                                                                    +    in metacircular evaluator
                                                                                    +    procedure as argument
                                                                                    +    procedure as general method
                                                                                    +    procedure as returned value
                                                                                    +    strong typing and
                                                                                    +Hilfinger, Paul
                                                                                    +Hoare, Charles Antony Richard
                                                                                    +Hodges, Andrew
                                                                                    +Hofstadter, Douglas R.
                                                                                    +Horner, W. G.
                                                                                    +Horner's rule
                                                                                    +``how to'' vs. ``what is'' description, see imperative vs. declarative knowledge +
                                                                                    +Huffman code
                                                                                    +    optimality of
                                                                                    +    order of growth of encoding
                                                                                    +Huffman, David
                                                                                    +Hughes, R. J. M.

                                                                                    + +

                                                                                    + +
                                                                                    +IBM 704
                                                                                    +identity
                                                                                    +if (special form)
                                                                                    +    cond vs.
                                                                                    +    evaluation of
                                                                                    +    normal-order evaluation of
                                                                                    +    one-armed (without alternative)
                                                                                    +    predicate, consequent, and alternative of
                                                                                    +    why a special form
                                                                                    +if-alternative
                                                                                    +if-consequent
                                                                                    +if-predicate
                                                                                    +if?
                                                                                    +imag-part +
                                                                                    +    data-directed
                                                                                    +    polar representation
                                                                                    +    rectangular representation
                                                                                    +    with tagged data
                                                                                    +imag-part-polar
                                                                                    +imag-part-rectangular
                                                                                    +imperative programming
                                                                                    +imperative vs. declarative knowledge, +[2]
                                                                                    +    logic programming and, +[2]
                                                                                    +    nondeterministic computing and
                                                                                    +imperative vs. expression-oriented programming style
                                                                                    +implementation dependencies, see also unspecified values +
                                                                                    +    numbers
                                                                                    +    order of subexpression evaluation
                                                                                    +inc
                                                                                    +incremental development of programs
                                                                                    +indeterminate of a polynomial
                                                                                    +indexing a data base, +[2]
                                                                                    +inference, method of
                                                                                    +infinite series
                                                                                    +infinite stream(s)
                                                                                    +    merging, [2], +[3], [4]
                                                                                    +    merging as a relation
                                                                                    +    of factorials
                                                                                    +    of Fibonacci numbers, see fibs +
                                                                                    +    of integers, see integers +
                                                                                    +    of pairs
                                                                                    +    of prime numbers, see primes +
                                                                                    +    of random numbers
                                                                                    +    representing power series
                                                                                    +    to model signals
                                                                                    +    to sum a series
                                                                                    +infix notation, prefix notation vs.
                                                                                    +inform-about-no-value
                                                                                    +inform-about-value
                                                                                    +information retrieval, see data base +
                                                                                    +Ingerman, Peter
                                                                                    +initialize-stack operation in register machine, [2]
                                                                                    +insert! +
                                                                                    +    in one-dimensional table
                                                                                    +    in two-dimensional table
                                                                                    +insert-queue!, +[2]
                                                                                    +install-complex-package
                                                                                    +install-polar-package
                                                                                    +install-polynomial-package
                                                                                    +install-rational-package
                                                                                    +install-rectangular-package
                                                                                    +install-scheme-number-package
                                                                                    +instantiate
                                                                                    +instantiate a pattern
                                                                                    +instruction counting
                                                                                    +instruction execution procedure
                                                                                    +instruction sequence, +[2]
                                                                                    +instruction tracing
                                                                                    +instruction-execution-proc
                                                                                    +instruction-text
                                                                                    +integer(s)
                                                                                    +    dividing
                                                                                    +    exact
                                                                                    +integerizing factor
                                                                                    +integers (infinite stream)
                                                                                    +    implicit definition
                                                                                    +    lazy-list version
                                                                                    +integers-starting-from
                                                                                    +integral, see also definite integral; Monte Carlo integration +
                                                                                    +    of a power series
                                                                                    +integral, [2], +[3]
                                                                                    +    with delayed argument
                                                                                    +    with lambda
                                                                                    +    lazy-list version
                                                                                    +    need for delayed evaluation
                                                                                    +integrate-series
                                                                                    +integrated-circuit implementation of Scheme, [2]
                                                                                    +integrator, for signals
                                                                                    +interleave
                                                                                    +interleave-delayed
                                                                                    +Interlisp
                                                                                    +internal definition
                                                                                    +    in environment model
                                                                                    +    free variable in
                                                                                    +    let vs.
                                                                                    +    in nondeterministic evaluator
                                                                                    +    position of
                                                                                    +    restrictions on
                                                                                    +    scanning out
                                                                                    +    scope of name
                                                                                    +Internet ``Worm''
                                                                                    +interning symbols
                                                                                    +interpreter, see also evaluator +
                                                                                    +    compiler vs., +[2]
                                                                                    +    read-eval-print loop
                                                                                    +intersection-set
                                                                                    +    binary-tree representation
                                                                                    +    ordered-list representation
                                                                                    +    unordered-list representation
                                                                                    +interval arithmetic
                                                                                    +invariant quantity of an iterative process
                                                                                    +inverter
                                                                                    +    inverter
                                                                                    +iteration contructs, see looping constructs +
                                                                                    +iterative improvement
                                                                                    +iterative process
                                                                                    +    as a stream process
                                                                                    +    design of algorithm
                                                                                    +    implemented by procedure call, +[2], [3], +see also tail recursion +
                                                                                    +    linear, [2]
                                                                                    +    recursive process vs., +[2], [3], +[4]
                                                                                    +    register machine for

                                                                                    + +

                                                                                    + +
                                                                                    +Jayaraman, Sundaresan

                                                                                    + +

                                                                                    + +
                                                                                    +Kaldewaij, Anne
                                                                                    +Karr, Alphonse
                                                                                    +Kepler, Johannes
                                                                                    +key
                                                                                    +key of a record +
                                                                                    +    in a data base
                                                                                    +    in a table
                                                                                    +    testing equality of
                                                                                    +Khayyam, Omar
                                                                                    +Knuth, Donald E., [2], +[3], [4], +[5], [6], +[7]
                                                                                    +Kohlbecker, Eugene Edmund, Jr.
                                                                                    +Kolmogorov, A. N.
                                                                                    +Konopasek, Milos
                                                                                    +Kowalski, Robert
                                                                                    +KRC, [2]

                                                                                    + +

                                                                                    + +
                                                                                    +label (in register machine)
                                                                                    +    simulating
                                                                                    +label-exp
                                                                                    +label-exp-label
                                                                                    +Lagrange interpolation formula
                                                                                    + calculus (lambda calculus)
                                                                                    +lambda (special form)
                                                                                    +    define vs.
                                                                                    +    with dotted-tail notation
                                                                                    +lambda expression +
                                                                                    +    as operator of combination
                                                                                    +    value of
                                                                                    +lambda-body
                                                                                    +lambda-parameters
                                                                                    +lambda?
                                                                                    +Lambert, J.H.
                                                                                    +Lamé, Gabriel
                                                                                    +Lamé's Theorem
                                                                                    +Lamport, Leslie
                                                                                    +Lampson, Butler
                                                                                    +Landin, Peter, [2]
                                                                                    +language, see natural language; programming language +
                                                                                    +Lapalme, Guy
                                                                                    +last-exp?
                                                                                    +last-operand?
                                                                                    +last-pair, [2]
                                                                                    +    rules
                                                                                    +lazy evaluation
                                                                                    +lazy evaluator
                                                                                    +lazy list
                                                                                    +lazy pair
                                                                                    +lazy tree
                                                                                    +leaf?
                                                                                    +least commitment, principle of
                                                                                    +lecture, something to do during
                                                                                    +left-branch, +[2]
                                                                                    +Leibniz, Baron Gottfried Wilhelm von +
                                                                                    +    proof of Fermat's Little Theorem
                                                                                    +    series for , +[2]
                                                                                    +Leiserson, Charles E., +[2]
                                                                                    +length
                                                                                    +    as accumulation
                                                                                    +    iterative version
                                                                                    +    recursive version
                                                                                    +let (special form)
                                                                                    +    evaluation model
                                                                                    +    internal definition vs.
                                                                                    +    named
                                                                                    +    scope of variables
                                                                                    +    as syntactic sugar, +[2]
                                                                                    +let* (special form)
                                                                                    +letrec (special form)
                                                                                    +lexical addressing
                                                                                    +    lexical address
                                                                                    +lexical scoping
                                                                                    +    environment structure and
                                                                                    +lexical-address-lookup, +[2]
                                                                                    +lexical-address-set!, +[2]
                                                                                    +Lieberman, Henry
                                                                                    +LIFO buffer, see stack +
                                                                                    +line segment +
                                                                                    +    represented as pair of points
                                                                                    +    represented as pair of vectors
                                                                                    +linear growth, [2]
                                                                                    +linear iterative process
                                                                                    +    order of growth
                                                                                    +linear recursive process
                                                                                    +    order of growth
                                                                                    +linkage descriptor
                                                                                    +Liskov, Barbara Huberman
                                                                                    +Lisp +
                                                                                    +    acronym for LISt Processing
                                                                                    +    applicative-order evaluation in
                                                                                    +    on DEC PDP-1
                                                                                    +    efficiency of, [2]
                                                                                    +    first-class procedures in
                                                                                    +    Fortran vs.
                                                                                    +    history of
                                                                                    +    internal type system
                                                                                    +    original implementation on IBM 704
                                                                                    +    Pascal vs.
                                                                                    +    suitability for writing evaluators
                                                                                    +    unique features of
                                                                                    +Lisp dialects +
                                                                                    +    Common Lisp
                                                                                    +    Franz Lisp
                                                                                    +    Interlisp
                                                                                    +    MacLisp
                                                                                    +    MDL
                                                                                    +    Portable Standard Lisp
                                                                                    +    Scheme
                                                                                    +    Zetalisp
                                                                                    +lisp-value (query interpreter)
                                                                                    +lisp-value (query language), +[2]
                                                                                    +    evaluation of, +[2], [3]
                                                                                    +list (primitive procedure)
                                                                                    +list structure
                                                                                    +    list vs.
                                                                                    +    mutable
                                                                                    +    represented using vectors
                                                                                    +list(s)
                                                                                    +    backquote with
                                                                                    +    cdring down
                                                                                    +    combining with append
                                                                                    +    consing up
                                                                                    +    converting a binary tree to a
                                                                                    +    converting to a binary tree
                                                                                    +    empty, see empty list +
                                                                                    +    equality of
                                                                                    +    headed, [2]
                                                                                    +    last pair of
                                                                                    +    lazy
                                                                                    +    length of
                                                                                    +    list structure vs.
                                                                                    +    manipulation with car, cdr, and cons
                                                                                    +    mapping over
                                                                                    +    nth element of
                                                                                    +    operations on
                                                                                    +    printed representation of
                                                                                    +    quotation of
                                                                                    +    reversing
                                                                                    +    techniques for manipulating
                                                                                    +list->tree
                                                                                    +list-difference
                                                                                    +list-of-arg-values
                                                                                    +list-of-delayed-args
                                                                                    +list-of-values
                                                                                    +list-ref, [2]
                                                                                    +list-structured memory
                                                                                    +list-union
                                                                                    +lives-near (rule), +[2]
                                                                                    +local evolution of a process
                                                                                    +local name, [2]
                                                                                    +local state
                                                                                    +    maintained in frames
                                                                                    +local state variable
                                                                                    +local variable
                                                                                    +location
                                                                                    +Locke, John
                                                                                    +log (primitive procedure)
                                                                                    +logarithm, approximating ln 2
                                                                                    +logarithmic growth, +[2], [3]
                                                                                    +logic programming, +see also query language; query interpreter +
                                                                                    +    computers for
                                                                                    +    history of, [2]
                                                                                    +    in Japan
                                                                                    +    logic programming languages
                                                                                    +    mathematical logic vs.
                                                                                    +logic puzzles
                                                                                    +logical and
                                                                                    +logical or
                                                                                    +logical-not
                                                                                    +lookup +
                                                                                    +    in one-dimensional table
                                                                                    +    in set of records
                                                                                    +    in two-dimensional table
                                                                                    +lookup-label
                                                                                    +lookup-prim
                                                                                    +lookup-variable-value, +[2]
                                                                                    +    for scanned-out definitions
                                                                                    +looping constructs, +[2]
                                                                                    +    implementing in metacircular evaluator
                                                                                    +lower-bound

                                                                                    + +

                                                                                    + +
                                                                                    +machine language
                                                                                    +    high-level language vs.
                                                                                    +Macintosh
                                                                                    +MacLisp
                                                                                    +macro, +see also reader macro character +
                                                                                    +magician, see numerical analyst +
                                                                                    +magnitude +
                                                                                    +    data-directed
                                                                                    +    polar representation
                                                                                    +    rectangular representation
                                                                                    +    with tagged data
                                                                                    +magnitude-polar
                                                                                    +magnitude-rectangular
                                                                                    +make-account
                                                                                    +    in environment model
                                                                                    +    with serialization, +[2], [3]
                                                                                    +make-account-and-serializer
                                                                                    +make-accumulator
                                                                                    +make-agenda, +[2]
                                                                                    +make-assign
                                                                                    +make-begin
                                                                                    +make-branch
                                                                                    +make-center-percent
                                                                                    +make-center-width
                                                                                    +make-code-tree
                                                                                    +make-compiled-procedure
                                                                                    +make-complex-from-mag-ang
                                                                                    +make-complex-from-real-imag
                                                                                    +make-connector
                                                                                    +make-cycle
                                                                                    +make-decrementer
                                                                                    +make-execution-procedure
                                                                                    +make-frame, +[2], [3]
                                                                                    +make-from-mag-ang, +[2]
                                                                                    +    message-passing
                                                                                    +    polar representation
                                                                                    +    rectangular representation
                                                                                    +make-from-mag-ang-polar
                                                                                    +make-from-mag-ang-rectangular
                                                                                    +make-from-real-imag, +[2]
                                                                                    +    message-passing
                                                                                    +    polar representation
                                                                                    +    rectangular representation
                                                                                    +make-from-real-imag-polar
                                                                                    +make-from-real-imag-rectangular
                                                                                    +make-goto
                                                                                    +make-if
                                                                                    +make-instruction
                                                                                    +make-instruction-sequence
                                                                                    +make-interval, +[2]
                                                                                    +make-joint
                                                                                    +make-label
                                                                                    +make-label-entry
                                                                                    +make-lambda
                                                                                    +make-leaf
                                                                                    +make-leaf-set
                                                                                    +make-machine, +[2]
                                                                                    +make-monitored
                                                                                    +make-mutex
                                                                                    +make-new-machine
                                                                                    +make-operation-exp
                                                                                    +make-perform
                                                                                    +make-point
                                                                                    +make-poly
                                                                                    +make-polynomial
                                                                                    +make-primitive-exp
                                                                                    +make-procedure
                                                                                    +make-product, +[2]
                                                                                    +make-queue, +[2]
                                                                                    +make-rat, [2], +[3]
                                                                                    +    axiom for
                                                                                    +    reducing to lowest terms
                                                                                    +make-rational
                                                                                    +make-register
                                                                                    +make-restore
                                                                                    +make-save
                                                                                    +make-scheme-number
                                                                                    +make-segment, +[2]
                                                                                    +make-serializer
                                                                                    +make-simplified-withdraw, +[2]
                                                                                    +make-stack
                                                                                    +    with monitored stack
                                                                                    +make-sum, [2]
                                                                                    +make-table +
                                                                                    +    message-passing implementation
                                                                                    +    one-dimensional table
                                                                                    +make-tableau
                                                                                    +make-term, [2]
                                                                                    +make-test
                                                                                    +make-time-segment
                                                                                    +make-tree
                                                                                    +make-vect
                                                                                    +make-wire, [2], +[3]
                                                                                    +make-withdraw
                                                                                    +    in environment model
                                                                                    +    using let
                                                                                    +making change, see counting change +
                                                                                    +map, [2]
                                                                                    +    as accumulation
                                                                                    +    with multiple arguments
                                                                                    +map-over-symbols
                                                                                    +map-successive-pairs
                                                                                    +mapping +
                                                                                    +    over lists
                                                                                    +    nested, [2]
                                                                                    +    as a transducer
                                                                                    +    over trees
                                                                                    +mark-sweep garbage collector
                                                                                    +mathematical function, see function (mathematical) +
                                                                                    +mathematics +
                                                                                    +    computer science vs., +[2]
                                                                                    +    engineering vs.
                                                                                    +matrix, represented as sequence
                                                                                    +matrix-*-matrix
                                                                                    +matrix-*-vector
                                                                                    +max (primitive procedure)
                                                                                    +McAllester, David Allen, +[2]
                                                                                    +McCarthy, John, [2], +[3], [4]
                                                                                    +McDermott, Drew
                                                                                    +MDL
                                                                                    +means of abstraction
                                                                                    +    define
                                                                                    +means of combination, +see also closure +
                                                                                    +measure in a Euclidean ring
                                                                                    +member
                                                                                    +memo-fib
                                                                                    +memo-proc
                                                                                    +memoization, [2]
                                                                                    +    call-by-need and
                                                                                    +    by delay
                                                                                    +    garbage collection and
                                                                                    +    of thunks
                                                                                    +memoize
                                                                                    +memory +
                                                                                    +    in 1964
                                                                                    +    list-structured
                                                                                    +memq
                                                                                    +merge
                                                                                    +merge-weighted
                                                                                    +merging infinite streams, see infinite stream(s) +
                                                                                    +message passing, [2]
                                                                                    +    environment model and
                                                                                    +    in bank account
                                                                                    +    in digital-circuit simulation
                                                                                    +    tail recursion and
                                                                                    +metacircular evaluator
                                                                                    +metacircular evaluator for Scheme
                                                                                    +    analyzing version
                                                                                    +    combinations (procedure applications)
                                                                                    +    compilation of, +[2]
                                                                                    +    data abstraction in, +[2], [3], +[4]
                                                                                    +    data-directed eval
                                                                                    +    derived expressions
                                                                                    +    driver loop
                                                                                    +    efficiency of
                                                                                    +    environment model of evaluation in
                                                                                    +    environment operations
                                                                                    +    eval and apply
                                                                                    +    eval-apply cycle, +[2]
                                                                                    +    expression representation, +[2]
                                                                                    +    global environment
                                                                                    +    higher-order procedures in
                                                                                    +    implemented language vs. implementation language
                                                                                    +    job of
                                                                                    +    order of operand evaluation
                                                                                    +    primitive procedures
                                                                                    +    representation of environments
                                                                                    +    representation of procedures
                                                                                    +    representation of true and false
                                                                                    +    running
                                                                                    +    special forms (additional), +[2], [3], +[4], [5], +[6]
                                                                                    +    special forms as derived expressions
                                                                                    +    symbolic differentiation and
                                                                                    +    syntax of evaluated language, +[2], [3]
                                                                                    +    tail recursiveness unspecified in
                                                                                    +    true and false
                                                                                    +metalinguistic abstraction
                                                                                    +MicroPlanner
                                                                                    +Microshaft
                                                                                    +midpoint-segment
                                                                                    +Miller, Gary L.
                                                                                    +Miller, James S.
                                                                                    +Miller-Rabin test for primality
                                                                                    +Milner, Robin
                                                                                    +min (primitive procedure)
                                                                                    +Minsky, Marvin Lee, [2]
                                                                                    +Miranda
                                                                                    +MIT
                                                                                    +    Artificial Intelligence Laboratory
                                                                                    +    early history of
                                                                                    +    Project MAC
                                                                                    +    Research Laboratory of Electronics, +[2]
                                                                                    +MIT Scheme +
                                                                                    +    the empty stream
                                                                                    +    eval
                                                                                    +    internal definitions
                                                                                    +    numbers
                                                                                    +    random
                                                                                    +    user-initial-environment
                                                                                    +    without-interrupts
                                                                                    +ML
                                                                                    +mobile
                                                                                    +modeling +
                                                                                    +    as a design strategy
                                                                                    +    in science and engineering
                                                                                    +models of evaluation
                                                                                    +modified registers, see instruction sequence +
                                                                                    +modifies-register?
                                                                                    +modularity, [2]
                                                                                    +    along object boundaries
                                                                                    +    functional programs vs. objects
                                                                                    +    hiding principle
                                                                                    +    streams and
                                                                                    +    through dispatching on type
                                                                                    +    through infinite streams
                                                                                    +    through modeling with objects
                                                                                    +modulo n
                                                                                    +modus ponens
                                                                                    +money, changing, see counting change +
                                                                                    +monitored procedure
                                                                                    +Monte Carlo integration
                                                                                    +    stream formulation
                                                                                    +Monte Carlo simulation
                                                                                    +    stream formulation
                                                                                    +monte-carlo
                                                                                    +    infinite stream
                                                                                    +Moon, David A., [2]
                                                                                    +morning star, see evening star +
                                                                                    +Morris, J. H.
                                                                                    +Morse code
                                                                                    +Mouse, Minnie and Mickey
                                                                                    +mul (generic)
                                                                                    +    used for polynomial coefficients
                                                                                    +mul-complex
                                                                                    +mul-interval
                                                                                    +    more efficient version
                                                                                    +mul-poly
                                                                                    +mul-rat
                                                                                    +mul-series
                                                                                    +mul-streams
                                                                                    +mul-terms
                                                                                    +Multics time-sharing system
                                                                                    +multiple-dwelling
                                                                                    +multiplicand
                                                                                    +multiplication by Russian peasant method
                                                                                    +multiplier +
                                                                                    +    primitive constraint
                                                                                    +    selector
                                                                                    +Munro, Ian
                                                                                    +mutable data objects, +see also queue; table +
                                                                                    +    implemented with assignment
                                                                                    +    list structure
                                                                                    +    pairs
                                                                                    +    procedural representation of
                                                                                    +    shared data
                                                                                    +mutator
                                                                                    +mutex
                                                                                    +mutual exclusion
                                                                                    +mystery

                                                                                    + +

                                                                                    + +
                                                                                    +name, see also local name; variable; local variable +
                                                                                    +    encapsulated
                                                                                    +    of a formal parameter
                                                                                    +    of a procedure
                                                                                    +named let (special form)
                                                                                    +naming +
                                                                                    +    of computational objects
                                                                                    +    of procedures
                                                                                    +naming conventions +
                                                                                    +    ! for assignment and mutation
                                                                                    +    ? for predicates
                                                                                    +native language of machine
                                                                                    +natural language +
                                                                                    +    parsing, see parsing natural language +
                                                                                    +    quotation in
                                                                                    +needed registers, see instruction sequence +
                                                                                    +needs-register?
                                                                                    +negate
                                                                                    +nested applications of car and cdr
                                                                                    +nested combinations
                                                                                    +nested definitions, see internal definition +
                                                                                    +nested mappings, see mapping +
                                                                                    +new register
                                                                                    +new-cars register
                                                                                    +new-cdrs register
                                                                                    +new-withdraw
                                                                                    +newline (primitive procedure), +[2]
                                                                                    +Newton's method +
                                                                                    +    for cube roots
                                                                                    +    for differentiable functions
                                                                                    +    half-interval method vs.
                                                                                    +    for square roots, +[2], [3]
                                                                                    +newton-transform
                                                                                    +newtons-method
                                                                                    +next (linkage descriptor)
                                                                                    +next-to (rules)
                                                                                    +nil +
                                                                                    +    dispensing with
                                                                                    +    as empty list
                                                                                    +    as end-of-list marker
                                                                                    +    as ordinary variable in Scheme
                                                                                    +no-more-exps?
                                                                                    +no-operands?
                                                                                    +node of a tree
                                                                                    +non-computable
                                                                                    +non-strict
                                                                                    +nondeterminism, in behavior of concurrent programs, [2]
                                                                                    +nondeterministic choice point
                                                                                    +nondeterministic computing
                                                                                    +nondeterministic evaluator
                                                                                    +    order of operand evaluation
                                                                                    +nondeterministic programming vs. Scheme programming, [2], +[3], [4]
                                                                                    +nondeterministic programs +
                                                                                    +    logic puzzles
                                                                                    +    pairs with prime sums
                                                                                    +    parsing natural language
                                                                                    +    Pythagorean triples, +[2], [3]
                                                                                    +normal-order evaluation
                                                                                    +    applicative order vs., +[2], [3]
                                                                                    +    delayed evaluation and
                                                                                    +    in explicit-control evaluator
                                                                                    +    of if
                                                                                    +normal-order evaluator, see lazy evaluator +
                                                                                    +not (primitive procedure)
                                                                                    +not (query language), +[2]
                                                                                    +    evaluation of, +[2], [3]
                                                                                    +notation in this book +
                                                                                    +    italic symbols in expression syntax
                                                                                    +    slanted characters for interpreter response
                                                                                    +nouns
                                                                                    +nth root, as fixed point
                                                                                    +null? (primitive procedure)
                                                                                    +    implemented with typed pointers
                                                                                    +number theory
                                                                                    +number(s) +
                                                                                    +    comparison of
                                                                                    +    decimal point in
                                                                                    +    equality of, [2], +[3]
                                                                                    +    in generic arithmetic system
                                                                                    +    implementation dependencies
                                                                                    +    integer vs. real number
                                                                                    +    integer, exact
                                                                                    +    in Lisp
                                                                                    +    rational number
                                                                                    +number? (primitive procedure)
                                                                                    +    data types and
                                                                                    +    implemented with typed pointers
                                                                                    +numer, [2]
                                                                                    +    axiom for
                                                                                    +    reducing to lowest terms
                                                                                    +numerical analysis
                                                                                    +numerical analyst
                                                                                    +numerical data

                                                                                    + +

                                                                                    + +
                                                                                    +obarray
                                                                                    +object program
                                                                                    +object(s)
                                                                                    +    benefits of modeling with
                                                                                    +    with time-varying state
                                                                                    +object-oriented programming languages
                                                                                    +old register
                                                                                    +oldcr register
                                                                                    +ones (infinite stream)
                                                                                    +    lazy-list version
                                                                                    +op (in register machine)
                                                                                    +    simulating
                                                                                    +open coding of primitives, +[2]
                                                                                    +operands
                                                                                    +operands of a combination
                                                                                    +operation +
                                                                                    +    cross-type
                                                                                    +    generic
                                                                                    +    in register machine
                                                                                    +operation-and-type table
                                                                                    +    assignment needed for
                                                                                    +    implementing
                                                                                    +operation-exp
                                                                                    +operation-exp-op
                                                                                    +operation-exp-operands
                                                                                    +operator
                                                                                    +operator of a combination
                                                                                    +    combination as
                                                                                    +    compound expression as
                                                                                    +    lambda expression as
                                                                                    +optimality +
                                                                                    +    of Horner's rule
                                                                                    +    of Huffman code
                                                                                    +or (query language)
                                                                                    +    evaluation of, +[2]
                                                                                    +or (special form)
                                                                                    +    evaluation of
                                                                                    +    why a special form
                                                                                    +    with no subexpressions
                                                                                    +or-gate
                                                                                    +    or-gate, +[2]
                                                                                    +order, [2]
                                                                                    +order notation
                                                                                    +order of evaluation +
                                                                                    +    assignment and
                                                                                    +    implementation-dependent
                                                                                    +    in compiler
                                                                                    +    in explicit-control evaluator
                                                                                    +    in metacircular evaluator
                                                                                    +    in Scheme
                                                                                    +order of events +
                                                                                    +    decoupling apparent from actual
                                                                                    +    indeterminacy in concurrent systems
                                                                                    +order of growth
                                                                                    +    linear iterative process
                                                                                    +    linear recursive process
                                                                                    +    logarithmic
                                                                                    +    tree-recursive process
                                                                                    +order of subexpression evaluation, see order of evaluation +
                                                                                    +ordered-list representation of sets
                                                                                    +ordinary numbers (in generic arithmetic system)
                                                                                    +origin-frame
                                                                                    +Ostrowski, A. M.
                                                                                    +outranked-by (rule), +[2]

                                                                                    + +

                                                                                    + +
                                                                                    +P operation on semaphore
                                                                                    +package
                                                                                    +    complex-number
                                                                                    +    polar representation
                                                                                    +    polynomial
                                                                                    +    rational-number
                                                                                    +    rectangular representation
                                                                                    +    Scheme-number
                                                                                    +painter(s)
                                                                                    +    higher-order operations
                                                                                    +    operations
                                                                                    +    represented as procedures
                                                                                    +    transforming and combining
                                                                                    +pair(s)
                                                                                    +    axiomatic definition of
                                                                                    +    box-and-pointer notation for
                                                                                    +    infinite stream of
                                                                                    +    lazy
                                                                                    +    mutable
                                                                                    +    procedural representation of, +[2], [3]
                                                                                    +    represented using vectors
                                                                                    +    used to represent sequence
                                                                                    +    used to represent tree
                                                                                    +pair? (primitive procedure)
                                                                                    +    implemented with typed pointers
                                                                                    +pairs
                                                                                    +Pan, V. Y.
                                                                                    +parallel-execute
                                                                                    +parallel-instruction-sequences
                                                                                    +parallelism, see concurrency +
                                                                                    +parameter, see formal parameters +
                                                                                    +parameter passing, see call-by-name argument passing; call-by-need argument passing +
                                                                                    +parentheses +
                                                                                    +    delimiting combination
                                                                                    +    delimiting cond clauses
                                                                                    +    in procedure definition
                                                                                    +parse
                                                                                    +parse-...
                                                                                    +parsing natural language
                                                                                    +    real language understanding vs. toy parser
                                                                                    +partial-sums
                                                                                    +Pascal
                                                                                    +    lack of higher-order procedures
                                                                                    +    recursive procedures
                                                                                    +    restrictions on compound data
                                                                                    +    weakness in handling compound objects
                                                                                    +Pascal, Blaise
                                                                                    +Pascal's triangle
                                                                                    +password-protected bank account
                                                                                    +pattern
                                                                                    +pattern matching
                                                                                    +    implementation
                                                                                    +    unification vs., +[2]
                                                                                    +pattern variable
                                                                                    +    representation of, +[2]
                                                                                    +pattern-match
                                                                                    +pc register
                                                                                    +perform (in register machine)
                                                                                    +    simulating
                                                                                    +perform-action
                                                                                    +Perlis, Alan J., [2]
                                                                                    +    quips, [2]
                                                                                    +permutations of a set
                                                                                    +    permutations
                                                                                    +Phillips, Hubert
                                                                                    + (pi) +
                                                                                    +    approximation with half-interval method
                                                                                    +    approximation with Monte Carlo integration, [2]
                                                                                    +    Cesàro estimate for, +[2]
                                                                                    +    Leibniz's series for, +[2]
                                                                                    +    stream of approximations
                                                                                    +    Wallis's formula for
                                                                                    +pi-stream
                                                                                    +pi-sum
                                                                                    +    with higher-order procedures
                                                                                    +    with lambda
                                                                                    +picture language
                                                                                    +Pingala, Áchárya
                                                                                    +pipelining
                                                                                    +Pitman, Kent M.
                                                                                    +Planner
                                                                                    +point, represented as a pair
                                                                                    +pointer +
                                                                                    +    in box-and-pointer notation
                                                                                    +    typed
                                                                                    +polar package
                                                                                    +polar?
                                                                                    +poly
                                                                                    +polynomial package
                                                                                    +polynomial arithmetic
                                                                                    +    addition
                                                                                    +    division
                                                                                    +    Euclid's Algorithm
                                                                                    +    greatest common divisor, +[2]
                                                                                    +    interfaced to generic arithmetic system
                                                                                    +    multiplication
                                                                                    +    probabilistic algorithm for GCD
                                                                                    +    rational functions
                                                                                    +    subtraction
                                                                                    +polynomial(s)
                                                                                    +    canonical form
                                                                                    +    dense
                                                                                    +    evaluating with Horner's rule
                                                                                    +    hierarchy of types
                                                                                    +    indeterminate of
                                                                                    +    sparse
                                                                                    +    univariate
                                                                                    +pop
                                                                                    +Portable Standard Lisp
                                                                                    +porting a language
                                                                                    +power series, as stream
                                                                                    +    adding
                                                                                    +    dividing
                                                                                    +    integrating
                                                                                    +    multiplying
                                                                                    +PowerPC
                                                                                    +predicate
                                                                                    +    of cond clause
                                                                                    +    of if
                                                                                    +    naming convention for
                                                                                    +prefix code
                                                                                    +prefix notation
                                                                                    +    infix notation vs.
                                                                                    +prepositions
                                                                                    +preserving, +[2], [3], +[4]
                                                                                    +pretty-printing
                                                                                    +prime number(s)
                                                                                    +    cryptography and
                                                                                    +    Eratosthenes's sieve for
                                                                                    +    Fermat test for
                                                                                    +    infinite stream of, see primes +
                                                                                    +    Miller-Rabin test for
                                                                                    +    testing for
                                                                                    +prime-sum-pair
                                                                                    +prime-sum-pairs
                                                                                    +    infinite stream
                                                                                    +prime?, [2]
                                                                                    +primes (infinite stream)
                                                                                    +    implicit definition
                                                                                    +primitive constraints
                                                                                    +primitive expression
                                                                                    +    evaluation of
                                                                                    +    name of primitive procedure
                                                                                    +    name of variable
                                                                                    +    number
                                                                                    +primitive procedures (those marked ns are not in the IEEE Scheme standard) +
                                                                                    +    *
                                                                                    +    +
                                                                                    +    -, [2]
                                                                                    +    /
                                                                                    +    <
                                                                                    +    =
                                                                                    +    >
                                                                                    +    apply
                                                                                    +    atan
                                                                                    +    car
                                                                                    +    cdr
                                                                                    +    cons
                                                                                    +    cos
                                                                                    +    display
                                                                                    +    eq?
                                                                                    +    error (ns)
                                                                                    +    eval (ns)
                                                                                    +    list
                                                                                    +    log
                                                                                    +    max
                                                                                    +    min
                                                                                    +    newline
                                                                                    +    not
                                                                                    +    null?
                                                                                    +    number?
                                                                                    +    pair?
                                                                                    +    quotient
                                                                                    +    random (ns), +[2]
                                                                                    +    read
                                                                                    +    remainder
                                                                                    +    round
                                                                                    +    runtime (ns)
                                                                                    +    set-car!
                                                                                    +    set-cdr!
                                                                                    +    sin
                                                                                    +    symbol?
                                                                                    +    vector-ref
                                                                                    +    vector-set!
                                                                                    +primitive query, see simple query +
                                                                                    +primitive-apply
                                                                                    +primitive-implementation
                                                                                    +primitive-procedure-names
                                                                                    +primitive-procedure-objects
                                                                                    +primitive-procedure?, +[2]
                                                                                    +principle of least commitment
                                                                                    +print operation in register machine
                                                                                    +print-point
                                                                                    +print-queue
                                                                                    +print-rat
                                                                                    +print-result
                                                                                    +    monitored-stack version
                                                                                    +print-stack-statistics operation in register machine
                                                                                    +printing, primitives for
                                                                                    +probabilistic algorithm, +[2], [3]
                                                                                    +probe +
                                                                                    +    in constraint system
                                                                                    +    in digital-circuit simulator
                                                                                    +proc register
                                                                                    +procedural abstraction
                                                                                    +procedural representation of data
                                                                                    +    mutable data
                                                                                    +procedure, [2]
                                                                                    +    anonymous
                                                                                    +    arbitrary number of arguments, +[2]
                                                                                    +    as argument
                                                                                    +    as black box
                                                                                    +    body of
                                                                                    +    compound
                                                                                    +    creating with define
                                                                                    +    creating with lambda, +[2], [3]
                                                                                    +    as data
                                                                                    +    definition of
                                                                                    +    first-class in Lisp
                                                                                    +    formal parameters of
                                                                                    +    as general method
                                                                                    +    generic, [2]
                                                                                    +    higher-order, see higher-order procedure +
                                                                                    +    implicit begin in body of
                                                                                    +    mathematical function vs.
                                                                                    +    memoized
                                                                                    +    monitored
                                                                                    +    name of
                                                                                    +    naming (with define)
                                                                                    +    as pattern for local evolution of a process
                                                                                    +    as returned value
                                                                                    +    returning multiple values
                                                                                    +    scope of formal parameters
                                                                                    +    special form vs., +[2]
                                                                                    +procedure application +
                                                                                    +    combination denoting
                                                                                    +    environment model of
                                                                                    +    substitution model of, see substitution model of procedure application +
                                                                                    +procedure-body
                                                                                    +procedure-environment
                                                                                    +procedure-parameters
                                                                                    +process
                                                                                    +    iterative
                                                                                    +    linear iterative
                                                                                    +    linear recursive
                                                                                    +    local evolution of
                                                                                    +    order of growth of
                                                                                    +    recursive
                                                                                    +    resources required by
                                                                                    +    shape of
                                                                                    +    tree-recursive
                                                                                    +product
                                                                                    +    as accumulation
                                                                                    +product?
                                                                                    +program
                                                                                    +    as abstract machine
                                                                                    +    comments in
                                                                                    +    as data
                                                                                    +    incremental development of
                                                                                    +    structure of, [2], +[3], +see also abstraction barriers +
                                                                                    +    structured with subroutines
                                                                                    +program counter
                                                                                    +programming +
                                                                                    +    data-directed, see data-directed programming +
                                                                                    +    demand-driven
                                                                                    +    elements of
                                                                                    +    functional, see functional programming +
                                                                                    +    imperative
                                                                                    +    odious style
                                                                                    +programming language
                                                                                    +    design of
                                                                                    +    functional
                                                                                    +    logic
                                                                                    +    object-oriented
                                                                                    +    strongly typed
                                                                                    +    very high-level
                                                                                    +Prolog, [2]
                                                                                    +prompt-for-input
                                                                                    +prompts
                                                                                    +    explicit-control evaluator
                                                                                    +    lazy evaluator
                                                                                    +    metacircular evaluator
                                                                                    +    nondeterministic evaluator
                                                                                    +    query interpreter
                                                                                    +propagate
                                                                                    +propagation of constraints
                                                                                    +proving programs correct
                                                                                    +pseudo-random sequence
                                                                                    +pseudodivision of polynomials
                                                                                    +pseudoremainder of polynomials
                                                                                    +push
                                                                                    +put, [2]
                                                                                    +puzzles +
                                                                                    +    eight-queens puzzle, +[2]
                                                                                    +    logic puzzles
                                                                                    +Pythagorean triples +
                                                                                    +    with nondeterministic programs, +[2], [3]
                                                                                    +    with streams

                                                                                    + +

                                                                                    + +
                                                                                    +qeval, [2]
                                                                                    +quantum mechanics
                                                                                    +quasiquote
                                                                                    +queens
                                                                                    +query, +see also simple query; compound query +
                                                                                    +query interpreter
                                                                                    +    adding rule or assertion
                                                                                    +    compound query, see compound query +
                                                                                    +    data base
                                                                                    +    driver loop, +[2]
                                                                                    +    environment structure in
                                                                                    +    frame, [2]
                                                                                    +    improvements to, +[2], [3]
                                                                                    +    infinite loops, +[2]
                                                                                    +    instantiation
                                                                                    +    Lisp interpreter vs., +[2], [3]
                                                                                    +    overview
                                                                                    +    pattern matching, +[2]
                                                                                    +    pattern-variable representation, +[2]
                                                                                    +    problems with not and lisp-value, [2]
                                                                                    +    query evaluator, +[2]
                                                                                    +    rule, see rule +
                                                                                    +    simple query, see simple query +
                                                                                    +    stream operations
                                                                                    +    streams of frames, +[2]
                                                                                    +    syntax of query language
                                                                                    +    unification, +[2]
                                                                                    +query language, [2]
                                                                                    +    abstraction in
                                                                                    +    compound query, see compound query +
                                                                                    +    data base
                                                                                    +    equality testing in
                                                                                    +    extensions to, +[2]
                                                                                    +    logical deductions
                                                                                    +    mathematical logic vs.
                                                                                    +    rule, see rule +
                                                                                    +    simple query, see simple query +
                                                                                    +query-driver-loop
                                                                                    +question mark, in predicate names
                                                                                    +queue
                                                                                    +    double-ended
                                                                                    +    front of
                                                                                    +    operations on
                                                                                    +    procedural implementation of
                                                                                    +    rear of
                                                                                    +    in simulation agenda
                                                                                    +quotation
                                                                                    +    of character strings
                                                                                    +    of Lisp data objects
                                                                                    +    in natural language
                                                                                    +quotation mark, single vs. double
                                                                                    +quote (special form)
                                                                                    +    read and, +[2]
                                                                                    +quoted?
                                                                                    +quotient (primitive procedure)

                                                                                    + +

                                                                                    + +
                                                                                    +Rabin, Michael O.
                                                                                    +radicand
                                                                                    +Ramanujan numbers
                                                                                    +Ramanujan, Srinivasa
                                                                                    +rand
                                                                                    +    with reset
                                                                                    +random (primitive procedure)
                                                                                    +    assignment needed for
                                                                                    +    MIT Scheme
                                                                                    +random-in-range
                                                                                    +random-number generator, +[2]
                                                                                    +    in Monte Carlo simulation
                                                                                    +    in primality testing
                                                                                    +    with reset
                                                                                    +    with reset, stream version
                                                                                    +random-numbers (infinite stream)
                                                                                    +Raphael, Bertram
                                                                                    +rational package
                                                                                    +rational function
                                                                                    +    reducing to lowest terms
                                                                                    +rational number(s) +
                                                                                    +    arithmetic operations on
                                                                                    +    in MIT Scheme
                                                                                    +    printing
                                                                                    +    reducing to lowest terms, +[2]
                                                                                    +    represented as pairs
                                                                                    +rational-number arithmetic
                                                                                    +    interfaced to generic arithmetic system
                                                                                    +    need for compound data
                                                                                    +Raymond, Eric, [2]
                                                                                    +RC circuit
                                                                                    +read (primitive procedure)
                                                                                    +    dotted-tail notation handling by
                                                                                    +    macro characters
                                                                                    +read operation in register machine
                                                                                    +read-eval-print loop, +see also driver loop +
                                                                                    +read-eval-print-loop
                                                                                    +reader macro character
                                                                                    +real number
                                                                                    +real-part +
                                                                                    +    data-directed
                                                                                    +    polar representation
                                                                                    +    rectangular representation
                                                                                    +    with tagged data
                                                                                    +real-part-polar
                                                                                    +real-part-rectangular
                                                                                    +rear-ptr
                                                                                    +receive procedure
                                                                                    +record, in a data base
                                                                                    +rectangle, representing
                                                                                    +rectangular package
                                                                                    +rectangular?
                                                                                    +recursion
                                                                                    +    data-directed
                                                                                    +    expressing complicated process
                                                                                    +    in rules
                                                                                    +    in working with trees
                                                                                    +recursion equations
                                                                                    +recursion theory
                                                                                    +recursive procedure +
                                                                                    +    recursive procedure definition
                                                                                    +    recursive process vs.
                                                                                    +    specifying without define
                                                                                    +recursive process
                                                                                    +    iterative process vs., +[2], [3], +[4]
                                                                                    +    linear, [2]
                                                                                    +    recursive procedure vs.
                                                                                    +    register machine for
                                                                                    +    tree, [2]
                                                                                    +red-black tree
                                                                                    +reducing to lowest terms, +[2], [3]
                                                                                    +Rees, Jonathan A., +[2]
                                                                                    +referential transparency
                                                                                    +reg (in register machine)
                                                                                    +    simulating
                                                                                    +register machine
                                                                                    +    actions
                                                                                    +    controller
                                                                                    +    controller diagram
                                                                                    +    data paths
                                                                                    +    data-path diagram
                                                                                    +    design of
                                                                                    +    language for describing
                                                                                    +    monitoring performance
                                                                                    +    simulator
                                                                                    +    stack
                                                                                    +    subroutine
                                                                                    +    test operation
                                                                                    +register table, in simulator
                                                                                    +register(s)
                                                                                    +    representing
                                                                                    +    tracing
                                                                                    +register-exp
                                                                                    +register-exp-reg
                                                                                    +register-machine language +
                                                                                    +    assign, +[2]
                                                                                    +    branch, +[2]
                                                                                    +    const, +[2], [3]
                                                                                    +    entry point
                                                                                    +    goto, [2]
                                                                                    +    instructions, +[2]
                                                                                    +    label
                                                                                    +    label, +[2]
                                                                                    +    op, [2]
                                                                                    +    perform, +[2]
                                                                                    +    reg, [2]
                                                                                    +    restore, +[2]
                                                                                    +    save, [2]
                                                                                    +    test, [2]
                                                                                    +register-machine simulator
                                                                                    +registers-modified
                                                                                    +registers-needed
                                                                                    +relations, computing in terms of, +[2]
                                                                                    +relatively prime
                                                                                    +relativity, theory of
                                                                                    +release a mutex
                                                                                    +remainder (primitive procedure)
                                                                                    +remainder modulo n
                                                                                    +remainder-terms
                                                                                    +remove
                                                                                    +remove-first-agenda-item!, +[2]
                                                                                    +require
                                                                                    +    as a special form
                                                                                    +reserved words, [2]
                                                                                    +resistance +
                                                                                    +    formula for parallel resistors, +[2]
                                                                                    +    tolerance of resistors
                                                                                    +resolution principle
                                                                                    +resolution, Horn-clause
                                                                                    +rest-exps
                                                                                    +rest-operands
                                                                                    +rest-segments
                                                                                    +rest-terms, +[2]
                                                                                    +restore (in register machine), +[2]
                                                                                    +    implementing
                                                                                    +    simulating
                                                                                    +return (linkage descriptor)
                                                                                    +returning multiple values
                                                                                    +Reuter, Andreas
                                                                                    +reverse
                                                                                    +    as folding
                                                                                    +    rules
                                                                                    +Rhind Papyrus
                                                                                    +right-branch, +[2]
                                                                                    +right-split
                                                                                    +ripple-carry adder
                                                                                    +Rivest, Ronald L., +[2]
                                                                                    +RLC circuit
                                                                                    +Robinson, J. A.
                                                                                    +robustness
                                                                                    +rock songs, 1950s
                                                                                    +Rogers, William Barton
                                                                                    +root register
                                                                                    +roots of equation, see half-interval method; Newton's method +
                                                                                    +rotate90
                                                                                    +round (primitive procedure)
                                                                                    +roundoff error, [2]
                                                                                    +Rozas, Guillermo Juan
                                                                                    +RSA algorithm
                                                                                    +rule (query language)
                                                                                    +    applying, [2], +[3]
                                                                                    +    without body, +[2], [3]
                                                                                    +Runkle, John Daniel
                                                                                    +runtime (primitive procedure)
                                                                                    +Russian peasant method of multiplication

                                                                                    + +

                                                                                    + +
                                                                                    +same (rule)
                                                                                    +same-variable?, +[2]
                                                                                    +sameness and change +
                                                                                    +    meaning of
                                                                                    +    shared data and
                                                                                    +satisfy a compound query
                                                                                    +satisfy a pattern (simple query)
                                                                                    +save (in register machine), +[2]
                                                                                    +    implementing
                                                                                    +    simulating
                                                                                    +scale-list, +[2], [3]
                                                                                    +scale-stream
                                                                                    +scale-tree, +[2]
                                                                                    +scale-vect
                                                                                    +scan register
                                                                                    +scan-out-defines
                                                                                    +scanning out internal definitions
                                                                                    +    in compiler, +[2]
                                                                                    +Scheme
                                                                                    +    history of
                                                                                    +Scheme chip, [2]
                                                                                    +scheme-number package
                                                                                    +scheme-number->complex
                                                                                    +scheme-number->scheme-number
                                                                                    +Schmidt, Eric
                                                                                    +scope of a variable, +see also lexical scoping +
                                                                                    +    internal define
                                                                                    +    in let
                                                                                    +    procedure's formal parameters
                                                                                    +search +
                                                                                    +    of binary tree
                                                                                    +    depth-first
                                                                                    +    systematic
                                                                                    +search
                                                                                    +secretary, importance of
                                                                                    +segment-queue
                                                                                    +segment-time
                                                                                    +segments
                                                                                    +segments->painter
                                                                                    +selector
                                                                                    +    as abstraction barrier
                                                                                    +    generic, [2]
                                                                                    +self-evaluating expression
                                                                                    +self-evaluating?
                                                                                    +semaphore
                                                                                    +    of size n
                                                                                    +semicolon
                                                                                    +    comment introduced by
                                                                                    +separator code
                                                                                    +sequence accelerator
                                                                                    +sequence of expressions +
                                                                                    +    in consequent of cond
                                                                                    +    in procedure body
                                                                                    +sequence(s)
                                                                                    +    as conventional interface
                                                                                    +    as source of modularity
                                                                                    +    operations on
                                                                                    +    represented by pairs
                                                                                    +sequence->exp
                                                                                    +serialized-exchange
                                                                                    +    with deadlock avoidance
                                                                                    +serializer
                                                                                    +    implementing
                                                                                    +    with multiple shared resources
                                                                                    +series, summation of
                                                                                    +    accelerating sequence of approximations
                                                                                    +    with streams
                                                                                    +set
                                                                                    +    set +
                                                                                    +        
                                                                                    (special form), see also assignment +
                                                                                    +    data base as
                                                                                    +    operations on
                                                                                    +    permutations of
                                                                                    +    represented as binary tree
                                                                                    +    represented as ordered list
                                                                                    +    represented as unordered list
                                                                                    +    subsets of
                                                                                    +set! (special form)
                                                                                    +    environment model of
                                                                                    +    value of
                                                                                    +set-car! (primitive procedure)
                                                                                    +    implemented with vectors
                                                                                    +    procedural implementation of
                                                                                    +    value of
                                                                                    +set-cdr! (primitive procedure)
                                                                                    +    implemented with vectors
                                                                                    +    procedural implementation of
                                                                                    +    value of
                                                                                    +set-contents!
                                                                                    +set-current-time!
                                                                                    +set-front-ptr!
                                                                                    +set-instruction-execution-proc!
                                                                                    +set-rear-ptr!
                                                                                    +set-register-contents!, +[2]
                                                                                    +set-segments!
                                                                                    +set-signal!, +[2]
                                                                                    +set-value!, +[2]
                                                                                    +set-variable-value!, +[2]
                                                                                    +setup-environment
                                                                                    +shadow a binding
                                                                                    +Shamir, Adi
                                                                                    +shape of a process
                                                                                    +shared data
                                                                                    +shared resources
                                                                                    +shared state
                                                                                    +shrink-to-upper-right
                                                                                    +Shrobe, Howard E.
                                                                                    +side-effect bug
                                                                                    +sieve of Eratosthenes
                                                                                    +    sieve
                                                                                    +sum (sigma) notation
                                                                                    +signal processing +
                                                                                    +    smoothing a function
                                                                                    +    smoothing a signal, +[2]
                                                                                    +    stream model of
                                                                                    +    zero crossings of a signal, +[2], [3]
                                                                                    +signal, digital
                                                                                    +signal-error
                                                                                    +signal-flow diagram, +[2]
                                                                                    +signal-processing view of computation
                                                                                    +simple query
                                                                                    +    processing, [2], +[3], [4]
                                                                                    +simple-query
                                                                                    +simplification of algebraic expressions
                                                                                    +Simpson's Rule for numerical integration
                                                                                    +simulation +
                                                                                    +    of digital circuit, see digital-circuit simulation +
                                                                                    +    event-driven
                                                                                    +    as machine-design tool
                                                                                    +    for monitoring performance of register machine
                                                                                    +    Monte Carlo, see Monte Carlo simulation +
                                                                                    +    of register machine, see register-machine simulator +
                                                                                    +sin (primitive procedure)
                                                                                    +sine +
                                                                                    +    approximation for small angle
                                                                                    +    power series for
                                                                                    +singleton-stream
                                                                                    +SKETCHPAD
                                                                                    +smallest-divisor
                                                                                    +    more efficient version
                                                                                    +Smalltalk
                                                                                    +smoothing a function
                                                                                    +smoothing a signal, +[2]
                                                                                    +snarf
                                                                                    +Solar System's chaotic dynamics
                                                                                    +Solomonoff, Ray
                                                                                    +solve differential equation, +[2]
                                                                                    +    lazy-list version
                                                                                    +    with scanned-out definitions
                                                                                    +solving equation, see half-interval method; Newton's method; solve +
                                                                                    +source language
                                                                                    +source program
                                                                                    +Spafford, Eugene H.
                                                                                    +sparse polynomial
                                                                                    +special form
                                                                                    +    as derived expression in evaluator
                                                                                    +    need for
                                                                                    +    procedure vs., +[2]
                                                                                    +special forms (those marked ns are not in the IEEE Scheme standard) +
                                                                                    +    and
                                                                                    +    begin
                                                                                    +    cond
                                                                                    +    cons-stream (ns)
                                                                                    +    define, [2]
                                                                                    +    delay (ns)
                                                                                    +    if
                                                                                    +    lambda
                                                                                    +    let
                                                                                    +    let*
                                                                                    +    letrec
                                                                                    +    named let
                                                                                    +    or
                                                                                    +    quote
                                                                                    +    set!
                                                                                    +split
                                                                                    +sqrt
                                                                                    +    block structured
                                                                                    +    in environment model
                                                                                    +    as fixed point, +[2], [3], +[4]
                                                                                    +    as iterative improvement
                                                                                    +    with Newton's method, +[2]
                                                                                    +    register machine for
                                                                                    +    as stream limit
                                                                                    +sqrt-stream
                                                                                    +square
                                                                                    +    in environment model
                                                                                    +square root, see also sqrt +
                                                                                    +    stream of approximations
                                                                                    +square-limit, +[2]
                                                                                    +square-of-four
                                                                                    +squarer (constraint), +[2]
                                                                                    +squash-inwards
                                                                                    +stack
                                                                                    +    framed
                                                                                    +    for recursion in register machine
                                                                                    +    representing, +[2]
                                                                                    +stack allocation and tail recursion
                                                                                    +stack-inst-reg-name
                                                                                    +Stallman, Richard M., +[2]
                                                                                    +start register machine, +[2]
                                                                                    +start-eceval
                                                                                    +start-segment, +[2]
                                                                                    +state +
                                                                                    +    local, see local state +
                                                                                    +    shared
                                                                                    +    vanishes in stream formulation
                                                                                    +state variable, [2]
                                                                                    +    local
                                                                                    +statements, see instruction sequence +
                                                                                    +statements
                                                                                    +Steele, Guy Lewis Jr., +[2], [3], +[4], [5], +[6]
                                                                                    +stop-and-copy garbage collector
                                                                                    +Stoy, Joseph E., [2], +[3]
                                                                                    +Strachey, Christopher
                                                                                    +stratified design
                                                                                    +stream(s), [2]
                                                                                    +    delayed evaluation and
                                                                                    +    empty
                                                                                    +    implemented as delayed lists
                                                                                    +    implemented as lazy lists
                                                                                    +    implicit definition
                                                                                    +    infinite, see infinite streams +
                                                                                    +    used in query interpreter, +[2]
                                                                                    +stream-append
                                                                                    +stream-append-delayed
                                                                                    +stream-car, +[2]
                                                                                    +stream-cdr, +[2]
                                                                                    +stream-enumerate-interval
                                                                                    +stream-filter
                                                                                    +stream-flatmap, +[2]
                                                                                    +stream-for-each
                                                                                    +stream-limit
                                                                                    +stream-map
                                                                                    +    with multiple arguments
                                                                                    +stream-null?
                                                                                    +    in MIT Scheme
                                                                                    +stream-ref
                                                                                    +stream-withdraw
                                                                                    +strict
                                                                                    +string, see character string +
                                                                                    +strongly typed language
                                                                                    +sub (generic)
                                                                                    +sub-complex
                                                                                    +sub-interval
                                                                                    +sub-rat
                                                                                    +sub-vect
                                                                                    +subroutine in register machine
                                                                                    +subsets of a set
                                                                                    +substitution model of procedure application, [2]
                                                                                    +    inadequacy of
                                                                                    +    shape of process
                                                                                    +subtype
                                                                                    +    multiple
                                                                                    +success continuation (nondeterministic evaluator), [2]
                                                                                    +successive squaring
                                                                                    +sum
                                                                                    +    as accumulation
                                                                                    +    iterative version
                                                                                    +sum-cubes
                                                                                    +    with higher-order procedures
                                                                                    +sum-integers
                                                                                    +    with higher-order procedures
                                                                                    +sum-odd-squares, +[2]
                                                                                    +sum-of-squares
                                                                                    +    in environment model
                                                                                    +sum-primes, +[2]
                                                                                    +sum?
                                                                                    +summation of a series
                                                                                    +    with streams
                                                                                    +supertype
                                                                                    +    multiple
                                                                                    +Sussman, Gerald Jay, +[2], [3], +[4], [5], +[6], [7]
                                                                                    +Sussman, Julie Esther Mazel, nieces of
                                                                                    +Sutherland, Ivan
                                                                                    +symbol(s)
                                                                                    +    equality of
                                                                                    +    interning
                                                                                    +    quotation of
                                                                                    +    representation of
                                                                                    +    uniqueness of
                                                                                    +symbol-leaf
                                                                                    +symbol? (primitive procedure)
                                                                                    +    data types and
                                                                                    +    implemented with typed pointers
                                                                                    +symbolic algebra
                                                                                    +symbolic differentiation, +[2]
                                                                                    +symbolic expression, +see also symbol(s) +
                                                                                    +symbols
                                                                                    +SYNC
                                                                                    +synchronization, see concurrency +
                                                                                    +syntactic analysis, separated from execution +
                                                                                    +    in metacircular evaluator
                                                                                    +    in register-machine simulator, +[2]
                                                                                    +syntactic sugar
                                                                                    +    define
                                                                                    +    let as
                                                                                    +    looping constructs as
                                                                                    +    procedure vs. data as
                                                                                    +syntax, see also special forms +
                                                                                    +    abstract, see abstract syntax +
                                                                                    +    of expressions, describing
                                                                                    +    of a programming language
                                                                                    +syntax interface
                                                                                    +systematic search

                                                                                    + +

                                                                                    + +
                                                                                    +#t
                                                                                    +table
                                                                                    +    backbone of
                                                                                    +    for coercion
                                                                                    +    for data-directed programming
                                                                                    +    local
                                                                                    +    n-dimensional
                                                                                    +    one-dimensional
                                                                                    +    operation-and-type, see operation-and-type table +
                                                                                    +    represented as binary tree vs. unordered list
                                                                                    +    testing equality of keys
                                                                                    +    two-dimensional
                                                                                    +    used in simulation agenda
                                                                                    +    used to store computed values
                                                                                    +tableau
                                                                                    +tabulation, [2]
                                                                                    +tack-on-instruction-sequence
                                                                                    +tagged architecture
                                                                                    +tagged data, [2]
                                                                                    +tagged-list?
                                                                                    +tail recursion
                                                                                    +    compiler and
                                                                                    +    environment model of evaluation and
                                                                                    +    explicit-control evaluator and, +[2], [3]
                                                                                    +    garbage collection and
                                                                                    +    metacircular evaluator and
                                                                                    +    in Scheme
                                                                                    +tail-recursive evaluator
                                                                                    +tangent +
                                                                                    +    as continued fraction
                                                                                    +    power series for
                                                                                    +target register
                                                                                    +Technological University of Eindhoven
                                                                                    +Teitelman, Warren
                                                                                    +term list of polynomial
                                                                                    +    representing
                                                                                    +term-list
                                                                                    +terminal node of a tree
                                                                                    +test (in register machine)
                                                                                    +    simulating
                                                                                    +test operation in register machine
                                                                                    +test-and-set!, +[2]
                                                                                    +test-condition
                                                                                    +text-of-quotation
                                                                                    +Thatcher, James W.
                                                                                    +THE Multiprogramming System
                                                                                    +the-cars +
                                                                                    +    register, [2]
                                                                                    +    vector
                                                                                    +the-cdrs +
                                                                                    +    register, [2]
                                                                                    +    vector
                                                                                    +the-empty-stream
                                                                                    +    in MIT Scheme
                                                                                    +the-empty-termlist, +[2]
                                                                                    +the-global-environment, +[2]
                                                                                    +theorem proving (automatic)
                                                                                    + (f(n)) (theta of f(n))
                                                                                    +thunk
                                                                                    +    call-by-name
                                                                                    +    call-by-need
                                                                                    +    forcing
                                                                                    +    implementation of
                                                                                    +    origin of name
                                                                                    +time +
                                                                                    +    assignment and
                                                                                    +    communication and
                                                                                    +    in concurrent systems
                                                                                    +    functional programming and
                                                                                    +    in nondeterministic computing, +[2]
                                                                                    +    purpose of
                                                                                    +time segment, in agenda
                                                                                    +time slicing
                                                                                    +timed-prime-test
                                                                                    +timing diagram
                                                                                    +TK!Solver
                                                                                    +tower of types
                                                                                    +tracing +
                                                                                    +    instruction execution
                                                                                    +    register assignment
                                                                                    +transform-painter
                                                                                    +transparency, referential
                                                                                    +transpose a matrix
                                                                                    +tree +
                                                                                    +    B-tree
                                                                                    +    binary, +see also binary tree +
                                                                                    +    combination viewed as
                                                                                    +    counting leaves of
                                                                                    +    enumerating leaves of
                                                                                    +    fringe of
                                                                                    +    Huffman
                                                                                    +    lazy
                                                                                    +    mapping over
                                                                                    +    red-black
                                                                                    +    represented as pairs
                                                                                    +    reversing at all levels
                                                                                    +tree accumulation
                                                                                    +tree->list...
                                                                                    +tree-map
                                                                                    +tree-recursive process
                                                                                    +    order of growth
                                                                                    +trigonometric relations
                                                                                    +true
                                                                                    +true
                                                                                    +true?
                                                                                    +truncation error
                                                                                    +truth maintenance
                                                                                    +try-again
                                                                                    +Turing machine
                                                                                    +Turing, Alan M., [2]
                                                                                    +Turner, David, [2], +[3]
                                                                                    +type field
                                                                                    +type tag, [2]
                                                                                    +    two-level
                                                                                    +type(s) +
                                                                                    +    cross-type operations
                                                                                    +    dispatching on
                                                                                    +    hierarchy in symbolic algebra
                                                                                    +    hierarchy of
                                                                                    +    lowering, [2]
                                                                                    +    multiple subtype and supertype
                                                                                    +    raising, [2]
                                                                                    +    subtype
                                                                                    +    supertype
                                                                                    +    tower of
                                                                                    +type-inferencing mechanism
                                                                                    +type-tag
                                                                                    +    using Scheme data types
                                                                                    +typed pointer
                                                                                    +typing input expressions

                                                                                    + +

                                                                                    + +
                                                                                    +unbound variable
                                                                                    +unev register
                                                                                    +unification
                                                                                    +    discovery of algorithm
                                                                                    +    implementation
                                                                                    +    pattern matching vs., +[2]
                                                                                    +unify-match
                                                                                    +union-set
                                                                                    +    binary-tree representation
                                                                                    +    ordered-list representation
                                                                                    +    unordered-list representation
                                                                                    +unique (query language)
                                                                                    +unique-pairs
                                                                                    +unit square
                                                                                    +univariate polynomial
                                                                                    +universal machine
                                                                                    +    explicit-control evaluator as
                                                                                    +    general-purpose computer as
                                                                                    +University of California at Berkeley
                                                                                    +University of Edinburgh
                                                                                    +University of Marseille
                                                                                    +UNIX, [2]
                                                                                    +unknown-expression-type
                                                                                    +unknown-procedure-type
                                                                                    +unordered-list representation of sets
                                                                                    +unspecified values +
                                                                                    +    define
                                                                                    +    display
                                                                                    +    if without alternative
                                                                                    +    newline
                                                                                    +    set!
                                                                                    +    set-car!
                                                                                    +    set-cdr!
                                                                                    +up-split
                                                                                    +update-insts!
                                                                                    +upper-bound
                                                                                    +upward compatibility
                                                                                    +user-initial-environment (MIT Scheme)
                                                                                    +user-print
                                                                                    +    modified for compiled code

                                                                                    + +

                                                                                    + +
                                                                                    +V operation on semaphore
                                                                                    +val register
                                                                                    +value +
                                                                                    +    of a combination
                                                                                    +    of an expression, +see also unspecified values +
                                                                                    +value-proc
                                                                                    +variable, see also local variable +
                                                                                    +    bound
                                                                                    +    free
                                                                                    +    scope of, +see also scope of a variable +
                                                                                    +    unbound
                                                                                    +    value of, [2]
                                                                                    +variable
                                                                                    +variable-length code
                                                                                    +variable?, [2]
                                                                                    +vector (data structure)
                                                                                    +vector (mathematical) +
                                                                                    +    operations on, +[2]
                                                                                    +    in picture-language frame
                                                                                    +    represented as pair
                                                                                    +    represented as sequence
                                                                                    +vector-ref (primitive procedure)
                                                                                    +vector-set! (primitive procedure)
                                                                                    +Venus
                                                                                    +verbs
                                                                                    +very high-level language

                                                                                    + +

                                                                                    + +
                                                                                    +Wadler, Philip
                                                                                    +Wadsworth, Christopher
                                                                                    +Wagner, Eric G.
                                                                                    +Walker, Francis Amasa
                                                                                    +Wallis, John
                                                                                    +Wand, Mitchell, [2]
                                                                                    +Waters, Richard C.
                                                                                    +weight
                                                                                    +weight-leaf
                                                                                    +Weyl, Hermann
                                                                                    +``what is'' vs. ``how to'' description, see declarative vs. imperative knowledge +
                                                                                    +wheel (rule), +[2]
                                                                                    +width
                                                                                    +width of an interval
                                                                                    +Wilde, Oscar (Perlis's paraphrase of)
                                                                                    +Wiles, Andrew
                                                                                    +Winograd, Terry
                                                                                    +Winston, Patrick Henry, +[2]
                                                                                    +wire, in digital circuit
                                                                                    +Wisdom, Jack
                                                                                    +Wise, David S.
                                                                                    +wishful thinking, +[2]
                                                                                    +withdraw
                                                                                    +    problems in concurrent system
                                                                                    +without-interrupts
                                                                                    +world line of a particle, +[2]
                                                                                    +Wright, E. M.
                                                                                    +Wright, Jesse B.

                                                                                    + +

                                                                                    + +
                                                                                    +xcor-vect
                                                                                    +Xerox Palo Alto Research Center, +[2]

                                                                                    + +

                                                                                    + +
                                                                                    +Y operator
                                                                                    +ycor-vect
                                                                                    +Yochelson, Jerome C.

                                                                                    + +

                                                                                    + +
                                                                                    +Zabih, Ramin
                                                                                    +zero crossings of a signal, +[2], [3]
                                                                                    +zero test (generic)
                                                                                    +    for polynomials
                                                                                    +Zetalisp
                                                                                    +Zilles, Stephen N.
                                                                                    +Zippel, Richard E.

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-4.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-4.html new file mode 100644 index 00000000..d0e09f72 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-4.html @@ -0,0 +1,169 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +Contents

                                                                                    + +

                                                                                    +    Foreword
                                                                                    +

                                                                                    +    Preface to the Second Edition
                                                                                    +

                                                                                    +    Preface to the First Edition
                                                                                    +

                                                                                    +    Acknowledgments
                                                                                    +

                                                                                    +    1  Building Abstractions with Procedures
                                                                                    +        1.1  The Elements of Programming
                                                                                    +            1.1.1  Expressions
                                                                                    +            1.1.2  Naming and the Environment
                                                                                    +            1.1.3  Evaluating Combinations
                                                                                    +            1.1.4  Compound Procedures
                                                                                    +            1.1.5  The Substitution Model for Procedure Application
                                                                                    +            1.1.6  Conditional Expressions and Predicates
                                                                                    +            1.1.7  Example: Square Roots by Newton's Method
                                                                                    +            1.1.8  Procedures as Black-Box Abstractions
                                                                                    +        1.2  Procedures and the Processes They Generate
                                                                                    +            1.2.1  Linear Recursion and Iteration
                                                                                    +            1.2.2  Tree Recursion
                                                                                    +            1.2.3  Orders of Growth
                                                                                    +            1.2.4  Exponentiation
                                                                                    +            1.2.5  Greatest Common Divisors
                                                                                    +            1.2.6  Example: Testing for Primality
                                                                                    +        1.3  Formulating Abstractions with Higher-Order Procedures
                                                                                    +            1.3.1  Procedures as Arguments
                                                                                    +            1.3.2  Constructing Procedures Using Lambda
                                                                                    +            1.3.3  Procedures as General Methods
                                                                                    +            1.3.4  Procedures as Returned Values
                                                                                    +

                                                                                    +    2  Building Abstractions with Data
                                                                                    +        2.1  Introduction to Data Abstraction
                                                                                    +            2.1.1  Example: Arithmetic Operations for Rational Numbers
                                                                                    +            2.1.2  Abstraction Barriers
                                                                                    +            2.1.3  What Is Meant by Data?
                                                                                    +            2.1.4  Extended Exercise: Interval Arithmetic
                                                                                    +        2.2  Hierarchical Data and the Closure Property
                                                                                    +            2.2.1  Representing Sequences
                                                                                    +            2.2.2  Hierarchical Structures
                                                                                    +            2.2.3  Sequences as Conventional Interfaces
                                                                                    +            2.2.4  Example: A Picture Language
                                                                                    +        2.3  Symbolic Data
                                                                                    +            2.3.1  Quotation
                                                                                    +            2.3.2  Example: Symbolic Differentiation
                                                                                    +            2.3.3  Example: Representing Sets
                                                                                    +            2.3.4  Example: Huffman Encoding Trees
                                                                                    +        2.4  Multiple Representations for Abstract Data
                                                                                    +            2.4.1  Representations for Complex Numbers
                                                                                    +            2.4.2  Tagged data
                                                                                    +            2.4.3  Data-Directed Programming and Additivity
                                                                                    +        2.5  Systems with Generic Operations
                                                                                    +            2.5.1  Generic Arithmetic Operations
                                                                                    +            2.5.2  Combining Data of Different Types
                                                                                    +            2.5.3  Example: Symbolic Algebra
                                                                                    +

                                                                                    +    3  Modularity, Objects, and State
                                                                                    +        3.1  Assignment and Local State
                                                                                    +            3.1.1  Local State Variables
                                                                                    +            3.1.2  The Benefits of Introducing Assignment
                                                                                    +            3.1.3  The Costs of Introducing Assignment
                                                                                    +        3.2  The Environment Model of Evaluation
                                                                                    +            3.2.1  The Rules for Evaluation
                                                                                    +            3.2.2  Applying Simple Procedures
                                                                                    +            3.2.3  Frames as the Repository of Local State
                                                                                    +            3.2.4  Internal Definitions
                                                                                    +        3.3  Modeling with Mutable Data
                                                                                    +            3.3.1  Mutable List Structure
                                                                                    +            3.3.2  Representing Queues
                                                                                    +            3.3.3  Representing Tables
                                                                                    +            3.3.4  A Simulator for Digital Circuits
                                                                                    +            3.3.5  Propagation of Constraints
                                                                                    +        3.4  Concurrency: Time Is of the Essence
                                                                                    +            3.4.1  The Nature of Time in Concurrent Systems
                                                                                    +            3.4.2  Mechanisms for Controlling Concurrency
                                                                                    +        3.5  Streams
                                                                                    +            3.5.1  Streams Are Delayed Lists
                                                                                    +            3.5.2  Infinite Streams
                                                                                    +            3.5.3  Exploiting the Stream Paradigm
                                                                                    +            3.5.4  Streams and Delayed Evaluation
                                                                                    +            3.5.5  Modularity of Functional Programs and Modularity of Objects
                                                                                    +

                                                                                    +    4  Metalinguistic Abstraction
                                                                                    +        4.1  The Metacircular Evaluator
                                                                                    +            4.1.1  The Core of the Evaluator
                                                                                    +            4.1.2  Representing Expressions
                                                                                    +            4.1.3  Evaluator Data Structures
                                                                                    +            4.1.4  Running the Evaluator as a Program
                                                                                    +            4.1.5  Data as Programs
                                                                                    +            4.1.6  Internal Definitions
                                                                                    +            4.1.7  Separating Syntactic Analysis from Execution
                                                                                    +        4.2  Variations on a Scheme -- Lazy Evaluation
                                                                                    +            4.2.1  Normal Order and Applicative Order
                                                                                    +            4.2.2  An Interpreter with Lazy Evaluation
                                                                                    +            4.2.3  Streams as Lazy Lists
                                                                                    +        4.3  Variations on a Scheme -- Nondeterministic Computing
                                                                                    +            4.3.1  Amb and Search
                                                                                    +            4.3.2  Examples of Nondeterministic Programs
                                                                                    +            4.3.3  Implementing the Amb Evaluator
                                                                                    +        4.4  Logic Programming
                                                                                    +            4.4.1  Deductive Information Retrieval
                                                                                    +            4.4.2  How the Query System Works
                                                                                    +            4.4.3  Is Logic Programming Mathematical Logic?
                                                                                    +            4.4.4  Implementing the Query System
                                                                                    +

                                                                                    +    5  Computing with Register Machines
                                                                                    +        5.1  Designing Register Machines
                                                                                    +            5.1.1  A Language for Describing Register Machines
                                                                                    +            5.1.2  Abstraction in Machine Design
                                                                                    +            5.1.3  Subroutines
                                                                                    +            5.1.4  Using a Stack to Implement Recursion
                                                                                    +            5.1.5  Instruction Summary
                                                                                    +        5.2  A Register-Machine Simulator
                                                                                    +            5.2.1  The Machine Model
                                                                                    +            5.2.2  The Assembler
                                                                                    +            5.2.3  Generating Execution Procedures for Instructions
                                                                                    +            5.2.4  Monitoring Machine Performance
                                                                                    +        5.3  Storage Allocation and Garbage Collection
                                                                                    +            5.3.1  Memory as Vectors
                                                                                    +            5.3.2  Maintaining the Illusion of Infinite Memory
                                                                                    +        5.4  The Explicit-Control Evaluator
                                                                                    +            5.4.1  The Core of the Explicit-Control Evaluator
                                                                                    +            5.4.2  Sequence Evaluation and Tail Recursion
                                                                                    +            5.4.3  Conditionals, Assignments, and Definitions
                                                                                    +            5.4.4  Running the Evaluator
                                                                                    +        5.5  Compilation
                                                                                    +            5.5.1  Structure of the Compiler
                                                                                    +            5.5.2  Compiling Expressions
                                                                                    +            5.5.3  Compiling Combinations
                                                                                    +            5.5.4  Combining Instruction Sequences
                                                                                    +            5.5.5  An Example of Compiled Code
                                                                                    +            5.5.6  Lexical Addressing
                                                                                    +            5.5.7  Interfacing Compiled Code to the Evaluator
                                                                                    +

                                                                                    +    References
                                                                                    +

                                                                                    +    List of Exercises
                                                                                    +

                                                                                    +    Index
                                                                                    +

                                                                                    + + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-5.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-5.html new file mode 100644 index 00000000..f6520658 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-5.html @@ -0,0 +1,208 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +Foreword

                                                                                    + +Educators, generals, dieticians, psychologists, and parents program. +Armies, students, and some societies are programmed. An assault on +large problems employs a succession of programs, most of which spring +into existence en route. These programs are rife with issues that +appear to be particular to the problem at hand. To appreciate +programming as an intellectual activity in its own right you must turn +to computer programming; you must read and write computer +programs -- many of them. It doesn't matter much what the programs are +about or what applications they serve. What does matter is how well +they perform and how smoothly they fit with other programs in the +creation of still greater programs. The programmer must seek both +perfection of part and adequacy of collection. In this book the use +of ``program'' is focused on the creation, execution, and study of +programs written in a dialect of Lisp for execution on a digital +computer. Using Lisp we restrict or limit not what we may program, +but only the notation for our program descriptions.

                                                                                    + +Our traffic with the subject matter of this book involves us with +three foci of phenomena: the human mind, collections of computer +programs, and the computer. Every computer program is a model, +hatched in the mind, of a real or mental process. These processes, +arising from human experience and thought, are huge in number, +intricate in detail, and at any time only partially understood. They +are modeled to our permanent satisfaction rarely by our computer +programs. Thus even though our programs are carefully handcrafted +discrete collections of symbols, mosaics of interlocking functions, +they continually evolve: we change them as our perception of the model +deepens, enlarges, generalizes until the model ultimately attains a +metastable place within still another model with which we struggle. +The source of the exhilaration associated with computer programming is +the continual unfolding within the mind and on the computer of +mechanisms expressed as programs and the explosion of perception they +generate. If art interprets our dreams, the computer executes them in +the guise of programs!

                                                                                    + +For all its power, the computer is a harsh taskmaster. Its programs +must be correct, and what we wish to say must be said accurately in +every detail. As in every other symbolic activity, we become +convinced of program truth through argument. Lisp itself can be +assigned a semantics (another model, by the way), and if a program's +function can be specified, say, in the predicate calculus, the proof +methods of logic can be used to make an acceptable correctness +argument. Unfortunately, as programs get large and complicated, as +they almost always do, the adequacy, consistency, and correctness of +the specifications themselves become open to doubt, so that complete +formal arguments of correctness seldom accompany large programs. +Since large programs grow from small ones, it is crucial that we +develop an arsenal of standard program structures of whose correctness +we have become sure -- we call them idioms -- and learn to combine them +into larger structures using organizational techniques of proven +value. These techniques are treated at length in this book, and +understanding them is essential to participation in the Promethean +enterprise called programming. More than anything else, the +uncovering and mastery of powerful organizational techniques +accelerates our ability to create large, significant programs. +Conversely, since writing large programs is very taxing, we are +stimulated to invent new methods of reducing the mass of function and +detail to be fitted into large programs.

                                                                                    + +Unlike programs, computers must obey the laws of physics. If they +wish to perform rapidly -- a few nanoseconds per state change -- they +must transmit electrons only small distances (at most 1 1/2 +feet). The heat generated by the huge number of devices so +concentrated in space has to be removed. An exquisite engineering art +has been developed balancing between multiplicity of function and +density of devices. In any event, hardware always operates at a level +more primitive than that at which we care to program. The processes +that transform our Lisp programs to ``machine'' programs are +themselves abstract models which we program. Their study and creation +give a great deal of insight into the organizational programs +associated with programming arbitrary models. Of course the computer +itself can be so modeled. Think of it: the behavior of the smallest +physical switching element is modeled by quantum mechanics described +by differential equations whose detailed behavior is captured by +numerical approximations represented in computer programs executing on +computers composed of ...!

                                                                                    + +It is not merely a matter of tactical convenience to separately +identify the three foci. Even though, as they say, it's all in the +head, this logical separation induces an acceleration of symbolic +traffic between these foci whose richness, vitality, and potential is +exceeded in human experience only by the evolution of life itself. At +best, relationships between the foci are metastable. The computers +are never large enough or fast enough. Each breakthrough in hardware +technology leads to more massive programming enterprises, new +organizational principles, and an enrichment of abstract models. +Every reader should ask himself periodically ``Toward what end, toward +what end?'' -- but do not ask it too often lest you pass up the fun of +programming for the constipation of bittersweet philosophy.

                                                                                    + +Among the programs we write, some (but never enough) perform a precise +mathematical function such as sorting or finding the maximum of a +sequence of numbers, determining primality, or finding the square +root. We call such programs algorithms, and a great deal is known of +their optimal behavior, particularly with respect to the two important +parameters of execution time and data storage requirements. A +programmer should acquire good algorithms and idioms. Even though +some programs resist precise specifications, it is the responsibility +of the programmer to estimate, and always to attempt to improve, their +performance.

                                                                                    + +Lisp is a survivor, having been in use for about a quarter of a +century. Among the active programming languages only Fortran has had +a longer life. Both languages have supported the programming needs of +important areas of application, Fortran for scientific and engineering +computation and Lisp for artificial intelligence. These two areas +continue to be important, and their programmers are so devoted to +these two languages that Lisp and Fortran may well continue in active +use for at least another quarter-century.

                                                                                    + +Lisp changes. The Scheme dialect used in this text has evolved from +the original Lisp and differs from the latter in several important +ways, including static scoping for variable binding and permitting +functions to yield functions as values. In its semantic structure +Scheme is as closely akin to Algol 60 as to early Lisps. Algol 60, +never to be an active language again, lives on in the genes of Scheme +and Pascal. It would be difficult to find two languages that are the +communicating coin of two more different cultures than those gathered +around these two languages. Pascal is for building +pyramids -- imposing, breathtaking, static structures built by armies +pushing heavy blocks into place. Lisp is for building +organisms -- imposing, breathtaking, dynamic structures built by squads +fitting fluctuating myriads of simpler organisms into place. The +organizing principles used are the same in both cases, except for one +extraordinarily important difference: The discretionary exportable +functionality entrusted to the individual Lisp programmer is more than +an order of magnitude greater than that to be found within Pascal +enterprises. Lisp programs inflate libraries with functions whose +utility transcends the application that produced them. The list, +Lisp's native data structure, is largely responsible for such growth +of utility. The simple structure and natural applicability of lists +are reflected in functions that are amazingly nonidiosyncratic. In +Pascal the plethora of declarable data structures induces a +specialization within functions that inhibits and penalizes casual +cooperation. It is better to have 100 functions operate on one data +structure than to have 10 functions operate on 10 data structures. As +a result the pyramid must stand unchanged for a millennium; the +organism must evolve or perish.

                                                                                    + +To illustrate this difference, compare the treatment of material and +exercises within this book with that in any first-course text using +Pascal. Do not labor under the illusion that this is a text +digestible at MIT only, peculiar to the breed found there. It is +precisely what a serious book on programming Lisp must be, no matter +who the student is or where it is used.

                                                                                    + +Note that this is a text about programming, unlike most Lisp books, +which are used as a preparation for work in artificial intelligence. +After all, the critical programming concerns of software engineering +and artificial intelligence tend to coalesce as the systems under +investigation become larger. This explains why there is such growing +interest in Lisp outside of artificial intelligence.

                                                                                    + +As one would expect from its goals, artificial intelligence research +generates many significant programming problems. In other +programming cultures this spate of problems spawns new languages. +Indeed, in any very large programming task a useful organizing +principle is to control and isolate traffic within the task modules +via the invention of language. These languages tend to become less +primitive as one approaches the boundaries of the system where we +humans interact most often. As a result, such systems contain complex +language-processing functions replicated many times. Lisp has such a +simple syntax and semantics that parsing can be treated as an +elementary task. Thus parsing technology plays almost no role in Lisp +programs, and the construction of language processors is rarely an +impediment to the rate of growth and change of large Lisp systems. +Finally, it is this very simplicity of syntax and semantics that is +responsible for the burden and freedom borne by all Lisp programmers. +No Lisp program of any size beyond a few lines can be written without +being saturated with discretionary functions. Invent and fit; have +fits and reinvent! We toast the Lisp programmer who pens his thoughts +within nests of parentheses.

                                                                                    + +

                                                                                    + +

                                                                                    + +Alan J. Perlis
                                                                                    +New Haven, Connecticut +

                                                                                    +

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-6.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-6.html new file mode 100644 index 00000000..fd11b905 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-6.html @@ -0,0 +1,91 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +Preface to the Second Edition

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + +

                                                                                    + +Is it possible that software is not like anything else, that it +is meant to be discarded: that the whole point is to +always see it as a soap bubble?

                                                                                    + +Alan J. Perlis

                                                                                    + + +

                                                                                    +
                                                                                    + +

                                                                                    + +The material in this book has been the basis of MIT's entry-level +computer science subject since 1980. We had been teaching this +material for four years when the first edition was published, and +twelve more years have elapsed until the appearance of this second +edition. We are pleased that our work has been widely adopted and +incorporated into other texts. We have seen our students take the +ideas and programs in this book and build them in as the core of new +computer systems and languages. In literal realization of an ancient +Talmudic pun, our students have become our builders. We are lucky to +have such capable students and such accomplished builders.

                                                                                    + +In preparing this edition, we have incorporated hundreds of +clarifications suggested by our own teaching experience and the +comments of colleagues at MIT and elsewhere. We have redesigned +most of the major programming systems in the book, including +the generic-arithmetic system, the interpreters, the register-machine +simulator, and the compiler; and we have rewritten all the program +examples to ensure that any Scheme implementation conforming to +the IEEE Scheme standard (IEEE 1990) will be able to run the code.

                                                                                    + +This edition emphasizes several new themes. The most important +of these is the central role played by different approaches to +dealing with time in computational models: objects with state, +concurrent programming, functional programming, lazy evaluation, +and nondeterministic programming. We have included new sections on +concurrency and nondeterminism, and we have tried to integrate this +theme throughout the book.

                                                                                    + +The first edition of the book closely followed the syllabus of our MIT +one-semester subject. With all the new material in the second +edition, it will not be possible to cover everything in a single +semester, so the instructor will have to pick and choose. In our own +teaching, we sometimes skip the section on logic programming +(section 4.4), we have students use the +register-machine simulator but we do not cover its implementation +(section 5.2), and we give only a cursory overview of +the compiler (section 5.5). Even so, this is still +an intense course. Some instructors may wish to cover only the first +three or four chapters, leaving the other material for subsequent +courses.

                                                                                    + +The World-Wide-Web site mitpress.mit.edu/sicp +provides support for users of this book. +This includes programs from the book, +sample programming assignments, supplementary materials, +and downloadable implementations of the Scheme dialect of Lisp.

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-7.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-7.html new file mode 100644 index 00000000..681da5d1 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-7.html @@ -0,0 +1,145 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +Preface to the First Edition

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + +

                                                                                    + +A computer is like a violin. You can imagine a novice trying first a +phonograph and then a violin. The latter, he says, sounds terrible. +That is the argument we have heard from our humanists and most of our +computer scientists. Computer programs are good, they say, for +particular purposes, but they aren't flexible. Neither is a violin, +or a typewriter, until you learn how to use it.

                                                                                    + +Marvin Minsky, ``Why Programming Is a Good
                                                                                    +Medium for Expressing Poorly-Understood and Sloppily-Formulated +Ideas''

                                                                                    + + +

                                                                                    +
                                                                                    + +

                                                                                    + +``The Structure and Interpretation of Computer Programs'' is the +entry-level subject in computer science at the Massachusetts Institute +of Technology. It is required of all students at MIT who major +in electrical engineering or in computer science, as one-fourth of the +``common core curriculum,'' which also includes two subjects on +circuits and linear systems and a subject on the design of digital +systems. We have been involved in the development of this subject +since 1978, and we have taught this material in its present form since +the fall of 1980 to between 600 and 700 students each year. Most of +these students have had little or no prior formal training in +computation, although many have played with computers a bit and a few +have had extensive programming or hardware-design experience.

                                                                                    + +Our design of this introductory computer-science subject reflects two +major concerns. First, we want to establish the idea that a computer +language is not just a way of getting a computer to perform operations +but rather that it is a novel formal medium for expressing ideas about +methodology. Thus, programs must be written for people to read, and +only incidentally for machines to execute. Second, we believe that +the essential material to be addressed by a subject at this level is +not the syntax of particular programming-language constructs, nor +clever algorithms for computing particular functions efficiently, nor +even the mathematical analysis of algorithms and the foundations of +computing, but rather the techniques used to control the intellectual +complexity of large software systems.

                                                                                    + +Our goal is that students who complete this subject should have a good +feel for the elements of style and the aesthetics of programming. +They should have command of the major techniques for controlling +complexity in a large system. They should be capable of reading a +50-page-long program, if it is written in an exemplary style. They +should know what not to read, and what they need not understand at any +moment. They should feel secure about modifying a program, retaining +the spirit and style of the original author.

                                                                                    + +These skills are by no means unique to computer programming. The +techniques we teach and draw upon are common to all of engineering +design. We control complexity by building abstractions that hide +details when appropriate. We control complexity by establishing +conventional interfaces that enable us to construct systems by +combining standard, well-understood pieces in a ``mix and match'' way. +We control complexity by establishing new languages for describing a +design, each of which emphasizes particular aspects of the design and +deemphasizes others.

                                                                                    + +Underlying our approach to this subject is our conviction that +``computer science'' is not a science and that its significance has +little to do with computers. The computer revolution is a revolution +in the way we think and in the way we express what we think. The +essence of this change is the emergence of what might best be called +procedural epistemology -- the study of the structure of +knowledge from an imperative point of view, as opposed to the more +declarative point of view taken by classical mathematical subjects. +Mathematics provides a framework for dealing precisely with notions of +``what is.'' Computation provides a framework for dealing precisely +with notions of ``how to.''

                                                                                    + +In teaching our material we use a dialect of the programming language +Lisp. We never formally teach the language, because we don't have to. +We just use it, and students pick it up in a few days. This is one +great advantage of Lisp-like languages: They have very few ways of +forming compound expressions, and almost no syntactic structure. All +of the formal properties can be covered in an hour, like the rules of +chess. After a short time we forget about syntactic details of the +language (because there are none) and get on with the real +issues -- figuring out what we want to compute, how we will decompose +problems into manageable parts, and how we will work on the parts. +Another advantage of Lisp is that it supports (but does not enforce) +more of the large-scale strategies for modular decomposition of +programs than any other language we know. We can make procedural and +data abstractions, we can use higher-order functions to capture common +patterns of usage, we can model local state using assignment and data +mutation, we can link parts of a program with streams and delayed +evaluation, and we can easily implement embedded languages. All of +this is embedded in an interactive environment with excellent support +for incremental program design, construction, testing, and debugging. +We thank all the generations of Lisp wizards, starting with John +McCarthy, who have fashioned a fine tool of unprecedented power and +elegance.

                                                                                    + +Scheme, the dialect of Lisp that we use, is an attempt to bring +together the power and elegance of Lisp and Algol. From Lisp we take +the metalinguistic power that derives from the simple syntax, the +uniform representation of programs as data objects, and the +garbage-collected heap-allocated data. From Algol we take lexical +scoping and block structure, which are gifts from the pioneers of +programming-language design who were on the Algol committee. We wish +to cite John Reynolds and Peter Landin for their insights into the +relationship of Church's lambda calculus to the structure of +programming languages. We also recognize our debt to the +mathematicians who scouted out this territory decades before computers +appeared on the scene. These pioneers include Alonzo Church, Barkley +Rosser, Stephen Kleene, and Haskell Curry.

                                                                                    + +

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-8.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-8.html new file mode 100644 index 00000000..e3e9d084 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-8.html @@ -0,0 +1,157 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +
                                                                                     

                                                                                    +Acknowledgments

                                                                                    + +We would like to thank the many people who have helped us develop this +book and this curriculum.

                                                                                    + +Our subject is a clear intellectual descendant of ``6.231,'' a +wonderful subject on programming linguistics and the lambda calculus +taught at MIT in the late 1960s by Jack Wozencraft and Arthur Evans, +Jr.

                                                                                    + +We owe a great debt to Robert Fano, who reorganized MIT's introductory +curriculum in electrical engineering and computer science to emphasize +the principles of engineering design. He led us in starting out on +this enterprise and wrote the first set of subject notes from which +this book evolved.

                                                                                    + +Much of the style and aesthetics of programming that we try to teach +were developed in conjunction with Guy Lewis Steele Jr., who +collaborated with Gerald Jay Sussman in the initial development of the +Scheme language. In addition, David Turner, Peter Henderson, Dan +Friedman, David Wise, and Will Clinger have taught us many of the +techniques of the functional programming community that appear in this +book.

                                                                                    + +Joel Moses taught us about structuring large systems. His experience +with the Macsyma system for symbolic computation provided the insight +that one should avoid complexities of control and concentrate on +organizing the data to reflect the real structure of the world being +modeled.

                                                                                    + +Marvin Minsky and Seymour Papert formed many of our attitudes about +programming and its place in our intellectual lives. To them we owe +the understanding that computation provides a means of expression for +exploring ideas that would otherwise be too complex to deal with +precisely. They emphasize that a student's ability to write and +modify programs provides a powerful medium in which exploring becomes +a natural activity.

                                                                                    + +We also strongly agree with Alan Perlis that programming is lots of +fun and we had better be careful to support the joy of programming. +Part of this joy derives from observing great masters at work. We are +fortunate to have been apprentice programmers at the feet of Bill +Gosper and Richard Greenblatt.

                                                                                    + +It is difficult to identify all the people who have contributed to the +development of our curriculum. We thank all the lecturers, recitation +instructors, and tutors who have worked with us over the past fifteen +years and put in many extra hours on our subject, especially Bill +Siebert, Albert Meyer, Joe Stoy, Randy Davis, Louis Braida, Eric +Grimson, Rod Brooks, Lynn Stein, and Peter Szolovits. +We would like to specially acknowledge the outstanding teaching +contributions of Franklyn Turbak, now at Wellesley; his work +in undergraduate instruction set a standard that we can +all aspire to. +We are grateful to Jerry Saltzer and Jim Miller for +helping us grapple with the mysteries of concurrency, and to +Peter Szolovits and David McAllester for their contributions +to the exposition of nondeterministic evaluation in chapter 4.

                                                                                    + +Many people have put in significant effort presenting this material at +other universities. Some of the people we have worked closely with +are Jacob Katzenelson at the Technion, Hardy Mayer at the University +of California at Irvine, Joe Stoy at Oxford, Elisha Sacks at Purdue, +and Jan Komorowski at the Norwegian University of Science and +Technology. We are exceptionally proud of our colleagues who have +received major teaching awards for their adaptations of this subject +at other universities, including Kenneth Yip at Yale, Brian Harvey at +the University of California at Berkeley, and Dan Huttenlocher at +Cornell.

                                                                                    + +Al Moyé arranged for us to teach this material to engineers at +Hewlett-Packard, and for the production of videotapes of these +lectures. +We would like to thank the talented instructors -- in +particular Jim Miller, Bill Siebert, and Mike Eisenberg -- who have +designed continuing education courses incorporating these tapes and +taught them at universities and industry all over the world.

                                                                                    + +Many educators in other countries have put in significant +work translating the first edition. +Michel Briand, Pierre Chamard, and André Pic produced a French edition; +Susanne Daniels-Herold produced a German +edition; and Fumio Motoyoshi produced a Japanese edition. +We do not know who produced the Chinese edition, +but we consider it an honor to have been selected as the +subject of an ``unauthorized'' translation.

                                                                                    + +It is hard to enumerate all the people who have made technical +contributions to the development of the Scheme systems we use for +instructional purposes. In addition to Guy Steele, principal wizards +have included Chris Hanson, Joe Bowbeer, Jim Miller, Guillermo Rozas, +and Stephen Adams. Others who have put in significant time are +Richard Stallman, Alan Bawden, Kent Pitman, Jon Taft, Neil Mayle, John +Lamping, Gwyn Osnos, Tracy Larrabee, George Carrette, Soma +Chaudhuri, Bill Chiarchiaro, Steven Kirsch, Leigh Klotz, Wayne Noss, +Todd Cass, Patrick O'Donnell, Kevin Theobald, Daniel Weise, Kenneth +Sinclair, Anthony Courtemanche, Henry M. Wu, Andrew Berlin, and Ruth +Shyu.

                                                                                    + +Beyond the MIT implementation, we would like to thank the many people +who worked on the IEEE Scheme standard, including William Clinger and +Jonathan Rees, who edited the R4RS, and Chris Haynes, David +Bartley, Chris Hanson, and Jim Miller, who prepared the IEEE standard.

                                                                                    + +Dan Friedman has been a long-time leader of the Scheme community. +The community's broader work goes beyond issues of language design to +encompass significant educational innovations, such as the high-school +curriculum based on EdScheme by Schemer's Inc., and the wonderful +books by Mike Eisenberg and by Brian Harvey and Matthew Wright.

                                                                                    + +We appreciate the work of those who contributed to making this a real +book, especially Terry Ehling, Larry Cohen, and Paul Bethge at the MIT +Press. Ella Mazel found the wonderful cover image. For the second +edition we are particularly grateful to Bernard and Ella Mazel for +help with the book design, and to David Jones, TEX wizard +extraordinaire. We also are indebted to those readers who made +penetrating comments on the new draft: Jacob Katzenelson, Hardy +Mayer, Jim Miller, and especially Brian Harvey, who did unto this book +as Julie did unto his book Simply Scheme. +

                                                                                    Finally, we would like to acknowledge the support of the organizations that + have encouraged this work over the years, including support from Hewlett-Packard, + made possible by Ira Goldstein and Joel Birnbaum, and support from DARPA, made + possible by Bob Kahn. +

                                                                                    + + +

                                                                                    + +

                                                                                    + +

                                                                                    + + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-9.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-9.html new file mode 100644 index 00000000..fb7e4ea9 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-9.html @@ -0,0 +1,201 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + +

                                                                                    + + +

                                                                                    +

                                                                                    +Building Abstractions with Procedures

                                                                                    + +

                                                                                    +

                                                                                    +
                                                                                    + +

                                                                                    + +The acts of the mind, wherein it exerts its power over simple ideas, +are chiefly these three: 1. Combining several simple ideas into one +compound one, and thus all complex ideas are made. 2. The second is +bringing two ideas, whether simple or complex, together, and setting +them by one another so as to take a view of them at once, without +uniting them into one, by which it gets all its ideas of relations. +3. The third is separating them from all other ideas that accompany +them in their real existence: this is called abstraction, and thus all +its general ideas are made.

                                                                                    + +John Locke, An Essay Concerning Human Understanding +(1690)

                                                                                    + + +

                                                                                    +
                                                                                    + +

                                                                                    + +We are about to study the idea of a computational process. +Computational processes are abstract beings that inhabit computers. +As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules +called a program. People create programs to direct processes. +In effect, we conjure the spirits of the computer with our spells.

                                                                                    + +A computational process is indeed much like a sorcerer's idea of a +spirit. It cannot be seen or touched. It is not composed of matter +at all. However, it is very real. It can perform intellectual work. +It can answer questions. It can affect the world by disbursing money +at a bank or by controlling a robot arm in a factory. The programs we +use to conjure processes are like a sorcerer's spells. They are +carefully composed from symbolic expressions in arcane and esoteric +programming languages that prescribe the tasks we want our +processes to perform.

                                                                                    + +A computational process, in a correctly working computer, executes +programs precisely and accurately. Thus, like the sorcerer's +apprentice, novice programmers must learn to understand and to +anticipate the consequences of their conjuring. Even small errors +(usually called bugs or glitches) in programs can have +complex and unanticipated consequences.

                                                                                    + +Fortunately, learning to program is considerably less dangerous than +learning sorcery, because the spirits we deal with are conveniently +contained in a secure way. Real-world programming, however, +requires care, expertise, and wisdom. A small bug in a computer-aided +design program, for example, can lead to the catastrophic collapse of +an airplane or a dam or the self-destruction of an industrial robot.

                                                                                    + +Master software engineers have the ability to organize programs so +that they can be reasonably sure that the resulting processes will +perform the tasks intended. They can visualize the behavior of their +systems in advance. They know how to structure programs so that +unanticipated problems do not lead to catastrophic consequences, and +when problems do arise, they can debug their programs. Well-designed +computational systems, like well-designed automobiles or nuclear +reactors, are designed in a modular manner, so that the parts can be +constructed, replaced, and debugged separately.

                                                                                    + + +

                                                                                    Programming in Lisp

                                                                                    + +We need an appropriate language for describing processes, and we will +use for this purpose the programming language Lisp. Just as our +everyday thoughts are usually expressed in our natural language (such +as English, French, or Japanese), and descriptions of quantitative +phenomena are expressed with mathematical notations, our procedural +thoughts will be expressed in Lisp. Lisp was invented in the late +1950s as a formalism for reasoning about the use of certain kinds of +logical expressions, called recursion equations, as a model for +computation. The language was conceived by John McCarthy and is based +on his paper ``Recursive Functions of Symbolic Expressions and Their +Computation by Machine'' (McCarthy 1960).

                                                                                    + +Despite its inception as a mathematical formalism, Lisp is a practical +programming language. A Lisp interpreter is a machine that +carries out processes described in the Lisp language. The first Lisp +interpreter was implemented by McCarthy with the help of colleagues +and students in the Artificial Intelligence Group of the MIT Research +Laboratory of Electronics and in the MIT Computation +Center.1 Lisp, whose name is an acronym for LISt Processing, +was designed to provide symbol-manipulating capabilities for +attacking programming problems such as the symbolic differentiation +and integration of algebraic expressions. It included for this +purpose new data objects known as atoms and lists, which most +strikingly set it apart from all other languages of the period.

                                                                                    + +Lisp was not the product of a concerted design effort. Instead, it +evolved informally in an experimental manner in response to users' +needs and to pragmatic implementation considerations. Lisp's informal +evolution has continued through the years, and the community of Lisp +users has traditionally resisted attempts to promulgate any +``official'' definition of the language. This evolution, together +with the flexibility and elegance of the initial conception, has +enabled Lisp, which is the second oldest language in widespread use +today (only Fortran is older), to continually adapt to encompass the +most modern ideas about program design. Thus, Lisp is by now a family +of dialects, which, while sharing most of the original features, may +differ from one another in significant ways. The dialect of Lisp used +in this book is called Scheme.2

                                                                                    + +Because of its experimental character and its emphasis on symbol +manipulation, Lisp was at first very inefficient for numerical +computations, at least in comparison with Fortran. Over the years, +however, Lisp compilers have been developed that translate programs +into machine code that can perform numerical computations reasonably +efficiently. And for special applications, Lisp has been used with +great effectiveness.3 Although Lisp has not yet overcome its old reputation +as hopelessly inefficient, Lisp is now used in many applications where +efficiency is not the central concern. For example, Lisp has become +a language of choice for operating-system shell languages and for +extension languages for editors and computer-aided design systems.

                                                                                    + +If Lisp is not a mainstream language, why are we using it as the +framework for our discussion of programming? Because the language +possesses unique features that make it an excellent medium for +studying important programming constructs and data structures and for +relating them to the linguistic features that support them. The most +significant of these features is the fact that Lisp descriptions of +processes, called procedures, can +themselves be represented and manipulated as Lisp data. The +importance of this is that there are powerful program-design +techniques that rely on the ability to blur the traditional +distinction between ``passive'' data and ``active'' processes. As we +shall discover, Lisp's flexibility in handling procedures as data +makes it one of the most convenient languages in existence for +exploring these techniques. The ability to represent procedures as +data also makes Lisp an excellent language for writing programs that +must manipulate other programs as data, such as the interpreters and +compilers that support computer languages. Above and beyond these +considerations, programming in Lisp is great fun.

                                                                                    + +


                                                                                    +

                                                                                    1 The Lisp 1 Programmer's Manual appeared in +1960, and the Lisp 1.5 Programmer's Manual (McCarthy 1965) +was published in 1962. The early history of Lisp is described in +McCarthy 1978. + +

                                                                                    2 The two dialects in which most +major Lisp programs of the 1970s were written are MacLisp (Moon 1978; +Pitman 1983), developed at the MIT Project MAC, and Interlisp +(Teitelman 1974), developed at Bolt Beranek and Newman Inc. and the +Xerox Palo Alto Research Center. Portable Standard Lisp (Hearn 1969; +Griss 1981) was a Lisp dialect designed to be easily portable +between different machines. MacLisp spawned a number of subdialects, +such as Franz Lisp, which was developed at the University of +California at Berkeley, and Zetalisp (Moon 1981), which was based on a +special-purpose processor designed at the MIT Artificial Intelligence +Laboratory to run Lisp very efficiently. The Lisp dialect used in +this book, called Scheme (Steele 1975), was invented in 1975 by Guy +Lewis Steele Jr. and Gerald Jay Sussman of the MIT Artificial +Intelligence Laboratory and later reimplemented for instructional use +at MIT. Scheme became an IEEE standard in 1990 (IEEE 1990). The +Common Lisp dialect (Steele 1982, Steele 1990) was developed by the +Lisp community to combine features from the earlier Lisp dialects +to make an industrial standard for Lisp. Common Lisp became an ANSI +standard in 1994 (ANSI 1994). + +

                                                                                    3 One such special application was a +breakthrough computation of scientific importance -- an integration of +the motion of the Solar System that extended previous results by +nearly two orders of magnitude, and demonstrated that the dynamics of +the Solar System is chaotic. This computation was made possible by +new integration algorithms, a special-purpose compiler, and a +special-purpose computer all implemented with the aid of software +tools written in Lisp (Abelson et al. 1992; Sussman and +Wisdom 1992). + +

                                                                                    + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html new file mode 100644 index 00000000..7cdb1a58 --- /dev/null +++ b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html @@ -0,0 +1,172 @@ + + + + + +Structure and Interpretation +of Computer Programs + + + + + + + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + +

                                                                                    + + +

                                                                                    + + + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + +

                                                                                    + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + + +

                                                                                    + +

                                                                                    + + +

                                                                                    + +

                                                                                    + + +

                                                                                    + + +

                                                                                    + + + +

                                                                                    + +

                                                                                    + + +

                                                                                    + +

                                                                                    + + + +

                                                                                    + +

                                                                                    + + + + +

                                                                                    + + + + +

                                                                                    + + +

                                                                                    + + + + + + + + + + + + + +

                                                                                    + + + + + + + + +

                                                                                    + + + + +

                                                                                    + + +

                                                                                    + +

                                                                                    + +

                                                                                    + +

                                                                                    + + + + +

                                                                                    + + +

                                                                                    + + +

                                                                                      
                                                                                    +

                                                                                    + + +

                                                                                    + + + diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-1.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a52e94f487e96e6ecfd0074ea5736e154dd228c GIT binary patch literal 1646 zcmV-!29fzkNk%w1VI%?f0Du4h00030|NkNR1OWg50RSuj0000a0rvm^0{)DTsmtvT zqXCqj3a*vB`wxcVNS5a5Wr4a**@njQOxN};SMJ33_zw&Uhr|VJg=zVU%%<}RH7Zmr zR`iO^Y8^UmVq-aO$K>)5V|BrjnzZ>1kC)K$y8RBMUK5m5GKL015 z-tkVaA8-87&t-3)z%K#sr6@RXUp@r?{2@%(ZXv@F5+P=*c!2~){)@;q!i(UMqppy? z4mK1?jburaC?h`fheBmbO)^)edN~tSO`A7Q=5)1_XV0G3Bq5{X4VWAEfmh62`)w&g>-3FqEmlf z?eKIB*-mN09*V_wW!<+yzILZYHD2Kic<=6ge2ekq$T$Di==M2f;$EUJzfHZm_2!DD z&#C79Y<8I7uR9)3zC3r|=5MsOfu3Ic^oZYcoln31dUACBlZEGq9|ZP2HegEu3b@CC z$0(Rz9Sn~2A8LL@=u&}s6hdJ+4XTa4OKL8SNleQ$C=o z5Qn2;qKqE1&IynPNL1-(Tm3XjMV7sWb!xD?u37#jti%?_<*k`G8)^fH!Ut`%pH5pF zwwG2L3?SM9>S#*d0%C10+}2_UE97np#<9*c@=F`%u11L?@2=4Xv-6(UXuOB^o3FI% z0x3on%6gVY!T}9DT_BkrY@{0!OUm$Evpfv(8L{xw)3=N~qA)TzpKMgbSD<})h zTg4*P%HJn2v+SJ713@E8#?&^%vt=%SXiu@io<#I#-paQy$ucJ`;B!AuBhIfnGiIs; zW*sf=SpN(g!#Y|=_%tn;0yMQ@DaNL;&1k;VbEzq?R7BV`;Z*b@3!Nq$)~)79c2`Ep zmYv*rG3682_0Wd6pL+Xko2g~92VBXW2L8H{pr5dq?55F9yX}KbhWF~cQ!R(u2zTANmtE_w#IQR7zB=*8H{WYe ziKEF}HH(U(d6u;yMyQ1K=ro({id(2#^eu*8cJrlYujZLMgVr*v9>(bLU~>$*cuZv> zkEQCVoll?z#mzbYbKm~dXFwrbhfMQRAOdGIz?$`sSb}pN0iU&^2<8rh!_lAweUw2N z<=}xlK-64;HrpG sBcU{(^b literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-10.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-10.gif new file mode 100644 index 0000000000000000000000000000000000000000..335c6350e5c3f5d9940af0e2e7de31da2f4f9dc0 GIT binary patch literal 1292 zcmV+n1@rnxNk%w1VVMAw0Du4h00030|NkNR1OWg50RSuj0001)0F(d#0{)DTsmtvT zql}>1Tj$H?PM|5EV^JIzBG}5ZsS2m#`$4EN(*dS=FUs5bgqa`?$SZY*yN&Xwi>hvt zT$3@H6-Aw+^~&v%K)0{-N3|ua!LM7K1{2FpT9oPrhe?G`NUGr-Or&atC%B-)M3)4yqG#=b@ZuJ zj8d!mv5Iv})~#5gave(L8dYH&Y2l2x5@fla>h$H~)|RB!qE)8Iba{_VOqq9E_Vr44 z;uL;CE5<#z1f2_r9uHDgvr;Ra!Vncd61?Xlq{oow?kQQhqhUTmM4Hz44|L*93ssv$ zl+aOMi+W+=tW*;(=S-dE@m`H4@Yh;^OA8+!4Jz{CyO;Yc?wlF)=*Xs1CuaRRudoDuc$7T%w?UQeB#uJ{3>J@!wl%LrKZ;$(3?N)jI{nF;N&u4_KRhcy+2{hOw z4Qb&8Yo_q0*Kw#RHjqU2O=#IA4rcUPSv-*j2WTQvbQ(*XxCT^Lj71@vMgMKKS57kK z2io5p!4T7m3Xh}e$r1@c-RC}Or6q@@5y<9?FdMw4!ZoMqIR5bhKvomP$+ z&X2FcO6#o0aB1sXxh{k2uAlmPYp=jYHtaA}7Q6l-vcH5?9$DwPg2}3?suk;{wYsGw zW9k_tt5R33iI$^(zFB9SWZI$LSxi)EXrl)zO38vD#;2!b)XIBIM`VqwSCKzwN430bSw_KMNXnU@%W8a?eoXnQoi((7r*>K-ma9tCT zMrp!8D{La(7BZw_qpBU{PD`g=^irU?J?Bn&#+5gyQ@X6qrAN!(_2N>3ynU;(9z})3GSmv$KZh4APJ8y6v zf`sTc!k#@p8^tqD0=c^S`FF9G3_p19*C78bc4Bsy9opHbj;8m6_Ks}RzL%w3cZHCf zocG#bQtTNvE002AG CdWMex literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-11.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-11.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2c13eaee13ff23712aeb8fd4167552b61870168 GIT binary patch literal 238 zcmVum-shhxW zAUjSPWUFmB&n{8ZMk*EfX^^;`>Te9D) odAgX$d5pYg1}V%;9IR{{JzX4?DdY@It&OeODeVb)y-)xEJ9nRIiU0rr literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-12.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-12.gif new file mode 100644 index 0000000000000000000000000000000000000000..3669688cf791ff31bffb4ad0b9d238b77dad29ff GIT binary patch literal 732 zcmV<20weuLNk%w1VIKiD0Du4h00030|NkNR1OWg50RSuj0000V0X6^t0{)DTsmtvS zo}9GWi?iOm`(H)iNS5Y_rYZ%9OzW=lOdoO3s&FmeiJ0RFhbUhOXe4@)1{YHajY^&$ zr*!nRUbkEug1Yo}Ia%@eOx(eIx!p#K#*~}!x)AQg+tzD^-aZ9k21r;m_;q;kSNI}G z#|TNX7!>rw=Z5$g*)WH*`Png<_m&8%`BG`BI&qn*=_&`i3btBnyGeViyNi~~`wOh( z8%$iRV~m{4GpyX~9P%8k+ZiftE!_Ib`M|u*eGPddD+#^#(-;`WISvlkt;p_oo++PR z{oRf`;|nLsqV6c4ofz-rl=FmxQlC?8Too);PhcE1n9Nnwz;EFr{)O7~uxXWq)f zGKVd4`$CQ5U4!&K9X;`y+_v(hG|KtG>=4{{zP~*G^VhDm@!$UGU3E^;;lx*m1w;^j z2y`wxcVNS5Y_rog%xZLmgcoYwY@=laf{@AG2>g`!#Sh)gP%%+OG1gwb5l zMYS`_Hn-fa_gkbqf3ImGX69VM?6&*8O+&^A@;uCf>-YS=^Fnt(Bj+MGQugGhxX7rN z2o$B2^|%HyMcA0BxyggcY32DTI!dZhIuUxRx+?m}dgl5nJNuSOOBH*oyW5k?OZ6Kp zoZ~xeJB*x+S`2xZ*YvC`J$>g=13D1^wM^uDT6bu9n@Ieh$yM4*G7{ z?jE1NIseKI)lfZ%~I5JNWE-1AFHT*T1atK6>9dRcci{u0pVuU)@!DCfzE%c&~1J3hehRO(8+k!(HsaAwaesQIC>tq=m zKUSUtC2KQId7T?vf^jB@WF7)XnrOPI)|#WWNf4YJ%Bd!uSk;H8lzQ&jh@C~fb`gs{ z_37k8g`!XeA~IYf=%Q*+)Kr-%CTa+x;5>TCZI5Cx=v0H45#UdeMpk2v64-RAqHOj< zBrp_Ss%flfwGd8u8^|YLp8M4%1j`I$U6R3u#@)sDvYw)!d0!urs}M+(@I$2 zP9{cT#3Yw((<(LJ7%K&`L@di}e29+AZ64mTmhDX8u8QZps-~+hnfBfr>L&Z@^6#eF zeiHC31)nP~!8#s{Fuwkxc<6g2F#I8KGA>zDm6rA^V4MkIY_Y~44-6i6Bg5yEiW8IE z@tDn0m$Hh!CR}onFXIN-j9O95g?v8G+-1fgn^$SeDxXYR%t8|lQh`Px4Oz}L&&jdK zOEX>9(~nWz^wAJO&6d(dSj96F7w)`P*{)747}t_oJ@(FiX$USf%zw>4dx z+_&8m}g2%JDh_Ixl zH|T)Zwr%Eht}g7bplp5kc(Rv!b)KlYOs&AP=2i62l>;lY->)OiukZB4UAxi4KVKzc zyCZ+Q^6hzLEugt)n!L^E!c#iErgv`mu6JYKu=TL}3Fi9UzrPjsj}rs@ujBKsyE);D zkLl^)$k(R1PMgZc_6ri2z~cF$d*OT<#MSAmH`C>DexQ1T+q>N`t@N zMR0keqhS3Y$i501&=@MLUI)zussNr4g((c-2%lub*j>D}(T!0wVi0H7Lu4#bif5EqADNRzHLj73Wz^#vv6w_53KEcYwBsGY7)L8^ z50Qz~StSh?$VEO9l3V1(wqntr&UA7_09;kP^7ySndh(EzjAZEMNJ?B8=aPdYBrP#{ zML2>jlbS4r`4V_aR3fpKviM{#+qjHTLdblxyyYhGsLWUFk&jrj$_)?h0RG~8+sY{h&(S0f+V(HWvL)4Jbpwi4l+*wLuVV=m71|QIF<}rb^}MRfWpcTWO>xgaK<I`5}d zJu46ibU(L-A`P+0s=}t()n2HysT;{FuqZKvzSfhP4U*+e;m1+3-t|ugB?GP!F^IAT zwo#tKAouFySUJ*_rS8P3nU?VkN$kZWRQ>E^iR9Km1xsq9C9O}VXrZ1Rbt|bQ)kI=j zQf5B3wzeHEan1f#v7M4DsttP_<#0z>zb5sySW0d+ zzye;Wb^U0{aW2-s_$Bav8ywh+HIjS|E^30;=G_C|ceUGIfAvNh-TUFrZv)b|9Odt;Z>JA+AQtzDMYkSG= zQ$M=b(Qe0mcO9sqt@X!C9`d`-UFTNkyE%nO36=l)V>j>lr1cDXBm+M39OiT734ivy zPj>H?2a9PuZ}{VyCGA=d@#*89_1fzi>GagBxl!zvEO^8*OBIsXSBd;P~;?~O`pape|z6;V#Hw^;e-enF>C*QR;lr)^Khd-^AL>tug2MRW)# zZueJsQ|EsG@_r3CZ`B7XjVF0KWnSsGftR;{ap!*%Xlpk1O2~I|*Hjz~sAuD)W+fMy$aA~WMe&D%CYXoFbcROwcZzs{N+^Hc*M-xPh_h5IDro+IMMYja2YZj` zf<)DZfizV>_)Eyg617!`eAtNE7i2gmcxd=|_jif`h&$|;WcmhuY&ca=HF+ddg6aiy zc*usOwiIG$T;wu`%8`VU$AA?$EV>99dB1v^4^1cboa=D*y0mLQ90l>&H<2^Wg9HF!wbdIi~j#D|OJ$B9%(ab<^D=4Np{ zNR_qNl+faSAlZq|^om{SRjgHv1nG>T7?4$|m*`Y;TL@}v$(GT#iEtT~MK_jYS(bZQ zdh|Dgc=?C(n3?o=i8|B6|Nt}%Fl>#?MiB_7F zc_9mxe3QwSl&Lb+`I{oxin_U-#l(`#*_O~bCgS;+{$PfkoGF;+NlNMYYU(F}_vxNK z7@uvqoVv+k_StLfxtqp$pTK4)O7%gg7n?nWpQa$1LTQ$onV>bbpaZy`0s3Y2ercnxY*A}XEK`Jg8Hp%oXRvx$NE>3GP&i!C;z z)45_zX>B+Pi7?7`CF*h1h>k&eoUj;_ddZ@6NS|M}jq0RUqNgS7^qMl-i2sRuRhmLM z>YY0pr3zL(R(5fu2o*nSm{jVcm?(HDDMg$mq*^LZWNL|KYNHjVab#whBg$<*>P?1*)a%9W7X z3g`A`D4COlz^2cmrnl3Mdlswd1FH6DE0jvAjhdl*iK^(~m|7{3Sh=Jjw{Ws^tK}7E zP1;bKnwWY8q zr@h**f_kFk8ecN_s*@O_kBOOHIxv40z0rI8?o=%bRRoq{z_ybJB%i)oG=Tq zpb3J{nW7I%c@H|PJbH!>yHRQAlE(hImC<^GiaCl0YoSOxvotG{&k3^UmyKsiOUXK+ z80WJE3$!P=ngq*cTsw%_$!x61hzgpjfcd6%$(j{eiC61|`*TD8>%gq68@UTd{w z%CDwMjAJXYC(E?wMzVY=w%%vAajTZmsk90ktO1vUY$>=a_qbInrZxGU9!jypHk4;u zw}Jbj>p8iBhq#vew2RxcLOOB&S+Qkhs#N%^7VEUH%d&nuhrmghbk+x zmn*wc>5#H%xG^iAx9hr>%e5IBx>CEeYDlN1dA!8yxxu%((zmm{JG_cJYo1rHfoi*X zt6!~aX)U4S8Dk35daN$ii^Ttq>VeC-#)JnVC2IYeek0 zPKld+ik!*{tdht_BwUsZ3y4OXy@HCuwA#Xz^{v{wy)7BULR?}}T*QycyV7eqIFXwW zOusQ)vtF6Gb`jVh>o0ojJ(F@6N@_* zm-2?mjCI8tD}g(_88j(naCfSz=!jI@xjfpvQ3JHsyT=>M%U0>jc1O%EBgvA4vT;1i zh|I&w%)@4^#La9-<2k;`48v92$$Lwenu5zk$%Q4%v!k2G)tt^AB6H%J4zrB2=q%5x zyw2&nFO8k-%J<$riwUH>m`ay)B!qG?@N*a8y7@Zpj%}GPL(5S)5 z6^+mp63Z?A`VOCq!w@af(kat)Bq44(m8blRopPtS0!xBcg=}TfGsX}_ZPcP%BM;eX z(p)Y~ZCGDyHxb&>vm*yqy-JzdsavW%@yU~D&8(uhpG>%W9{j>)eb)Dj)cTkx{&p_fIUeF?&^`j zgDBn4v#t+8V(U1L>uoXOmfp#|4n9CF(CRGg;ByeCo@W5S?6!UECIl;k5Sp!l0NP?CbvSmb2+m zhVJ)%-SZyf{GK)WzT*Jj;LeWZ1i#|$UB?Jd=URIbh0gHuQt$Gv=bRq#lwI$MeDOIx M@f5%D7f}EJJ1X1fT>t<8 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-14.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-14.gif new file mode 100644 index 0000000000000000000000000000000000000000..996a5d5017d98775fb51ba1312870b0d1d0573e6 GIT binary patch literal 278 zcmV+x0qOonNk%w1VVD3C0Du4h00030|NkNR1OWg50RSuj0001(01^NI0_}{Csmtwe zfSdr@i?iOm*A9l_NMc`!rfRe%r}DNk6mxG)el;GP)5weLToT03DDo8_L56b4YUr9w zC@k8u`l8yTi>BFLr3Wf_VMPkd*s0kuWWv8}G`&|R#&Epgt-kg1<}^0v)KzwrXQ&31 zhNTymD3(>B6G0r5dH3`{XS`3p|Gh!m~6uRKHD)<5TFum%9yB{Ply literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-16.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..535af204cfbc8f1a3cd35ff3ecba75e7edfbe30a GIT binary patch literal 173 zcmZ?wbhEHbbZ3xfXkY+=|Ns9h{$ycfU|?j>0r5dH3`{LO{VPwu27311S*iB+AlnP?wqtKnzq`+VQ~&CYhl2=Do8hyZlkT zRocZ{ee}tupFMu7ufN&$o45b;^Dnz%*X}X?`cPB;(f4vjH5Dh1qsD?37An(T1YX(t Z<;jl49T_*LKiRgE<3*>2XD9=MH2`YHO-ld( literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-17.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-17.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4d7ab4d174cf2d4e79c8547e35fb2392431860a GIT binary patch literal 330 zcmV-Q0k!@|Nk%w1VNC#J0Du4h00030|NkNR1OWg50RSuj0000@0Av6F0{)DTsmlfp zqntE>TeIHq@efvBNS2m~nq$gtYYR_rOfz$h2iKnW{tpZahs2`sh)gP%I?YYVqePjf z%yW6QQ5D%m7x}Gj4`D>Pcy^4<&b4kAhNs>1y8VvN>-YR&dMfh+7~z2-F_?2Uq8P-e zCe_H{DClApY4vwmGe^Stcqj-bBYH^McZ!;-y2{$>8Yp5onkgv@+5}sMXbJh2J1Ob% z2V5DeXnXs?IY+A;%nR$>i%Uo*5~90UYCY{_+Og{u&h`CjevY25zJBhBiBpIiecMcE zyDa5dk3SDR&tFPjwQJn`f&0{NAi{1P3MOpm5S*N3U*rh%!lq5MB6{@7NsM#R#yBz_ c*_k|vGNsCuEL*yK2{WclnKNFvlTZKvJNEfg%5Hg!n2lhEkO^8k>;*nkm^GBD;JF@nH^y7xf{!1JL+ts0FygYuY*vyl z=uruz)uvg7jmoQM}vw>=pOQn)43<#?GC(Xe8C9OFl-!)lvMGvY(<}( z+ms4I)vy-pmHQL4c`+Y)am4I#l(RCxgfQW?!Wyp%%3@WEa*psAyGp z7=th-*a&jiQzE%o$3i5>sF-0n)rUz)let)^B$~Jsl1V1^7>P<5_}S(Xn^HSTxU1uf zi?;eF>Iul>IcIzftlaG73`Pz2T+NJ4WviW~*}dZh?oB+tQf`iJE_+?QypGe3Ef0TN Zzd(Oq26~UGALFmytAFR-_48B!06Qdsf^Yx; literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-2.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..515862df8d266f94e7f07b019ff1cbea214d0fcd GIT binary patch literal 418 zcmV;T0bTw_Nk%w1VS4~J0Du4h00030|NkNR1OWg50RSuj0001c05$*s0{)DTsmllr zqnxzb>#*LubMSancz|L9l4qo@qq~GAjM7#6P9$y{d>>H#Bs0hks2J)}%AkoEgEES- z5;D;wX01NdHdXCjxu2~#=)K{NevF4D)yG8V1QxXv*s<7V zK!3J^MPt@Xp0q;Grk#6|>t8BW$hb|UAxz>$dW;b*Zv0pSq)2rm zO9C``@fgZBDu3lH|!C0Lbg%SI239?N8L(EgOZxh zq;rYHW^vF{SG8qcqq-b-1YGn^>lknNUdC~zp4sf%`S2DrKe+P;_#)Ub%&GChu< literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-22.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-22.gif new file mode 100644 index 0000000000000000000000000000000000000000..a138b50eced63a76a64086f169b234aa6baf1be0 GIT binary patch literal 312 zcmV-80muGFNk%w1VM_ou0Du4h00030|NkNR1OWg50RSuj0000>05$*s0{)C2pvdhH zqnu{Zi}M6k`!89D2ts7YUFmU_&q~3e`^j?*D>gmuuiwxCc?==06=Y?E%#HF{gubN2 zX@`1E+>j=w&Y2iqxs{Z-YB{Gj-YS={|^`_7~}WlVQ5t-7X-A( zV|Lil;;1pHX0sNBC(|}kv;t~$N9pAP&3)!G+p`#M-{eT|*1z0KY2{VnZVvh&MFZ5H}GH;I$<9KP-jR$4o} zIxc@xDpI~43jayj7f}F-%ql4GUp+^~jH#m)Odd6459vkJbT46(5G|C@1+14RlQWP4 K6`_Jx002Ao&XM>4 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-23.png b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-23.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f8bab4a2b3dba710f8b4c2cb22e8582b78c1c4 GIT binary patch literal 11261 zcmZ{K1yCi;lJ3EMa37q(-Q67qcXt`w-QC^YT@UU$ID_3@Obb5002o^N=*6hwexQyg@yimKIR?T1_0n;tVBf>rA0-F z6`kzOt!&Hy0IA5(GG~oR5&JMjahtIMaI&ZfDOBN7 z8ZI6TTvag)gx~;hEEgeYumf%?a2l#haFra-OK#_X>Rh`8%S{K`Kwk?@{02W5$P)oIPK+c4&ao445rGy;Wi+<+ z`RE*T@2oCGiGMC6FBS-k0+*C<+q&)HS;zY=P_%&`!R2P0&tOo=x6^-r`U+-mi$vDo0mEzy*9gCM`#E@b%4M_0pAmXrUGX# zK)MTLW`g19M{NgZ+(B*y!(y@j%A!Uy26z?X7=x1RcT@zY>Bm(>U2Jg4M#+J!6K6Z>X>LZRYs>cbR(4B7!xX`EB?P0&qZ^hD{* zK|kh1OL%okb*Od189is9PTWS2H@-WMJL;p^ADB%bA0(kCAuS=rFS|VDJX$_7K7?*n zeR_Qj5EqCKLR|+bUpKoA;%7UQJ zN|WspIxC*OzP&!XdA%yXPQNiYASy0CzHx!^qT|o^ixiOiq$8#-6CToLQtXoa7(`Qy#zH1BCS1m+#%0Dj$IQn# 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 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-24.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-24.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d9ff2a75472ddc3e56121dfed86b542c0dfa1f9 GIT binary patch literal 263 zcmV+i0r>t$Nk%w1VT}L}0Du4h00030|NkNR1OWg50RSuj0001u01p5F0^W>|sk^|B z9GtXHX%h~hcjbNI2xi>2nOX?4&gf~!XVUZ;VKJ9SD)0OC3^yF{hSJGYk`!u1Tt=Bv zA#fI)DYMSs3zC{To8E9ZbHtW;fR3;;I;@la=PH9Y#Fj)$X1Z#H z+o$VGCJ0!ncpC`23p2b!D-@U`?HrASx+^@W=hz+Y?MW^kT7GV>p16j-K3$dmZr%z$ N-|lt)-Z@?X06R+9b?X2C literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-25.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-25.gif new file mode 100644 index 0000000000000000000000000000000000000000..de87059f54b6cb5f5317f0dc3147a2756edc76d8 GIT binary patch literal 813 zcmV+|1Je9QNk%w1VYdKY0Du4h00030|NkNR1OWg50RSuj0002D0A2t90{)DTsk^`r zV{)?Ednt}Ofd46AIF{l8P9d^pZMR{jnwH}UrMb4golp7wP=;5LSL6^q$e4^LMDa8y4C5)BqpkeM`g2mxwuJMsz`;}cmwxkhl*%Qo0#W{ z8K)!nCkxDLISH$Le43m5%VeS|(MrkKoclZ_RsCw3bX&U&9j%KjEEzsrZrc^5ERJVQ zojrs7KEwPS`dy}tyB(ka2IO}RV84Xa-VNM_N!X}|6d%dBR?*5Z{)weBdW2{}BFBjC zMuPl^(&W689#v9wiEB?BzGJ)yZI=B~Wt7H~`U#d1vFg2pxb8M| zeGfM3*%~K8rH#Ap?b^9}qdVNrH*UA5g&RMPJh}4a%$qxZ4m~LG=r>hY6CC^#6zYq& zhbrb!ZYCq#KVCkRS@&;tp+(s}TegJ3}z890zwca7H0NTp#IRci+MR}elmRQL~wNBL!!ib%0In2SZd z7o&_bl4N6!I_}70k3RkgWROBCHrBTT9Z2TWN_e}xngfZA literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-26.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-26.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ddaa9b597d7e9a333873e874ae85447f22893e5 GIT binary patch literal 289 zcmV++0p9*cNk%w1VVM9P0Du4h00030|NkNR1OWg50RSuj0001)03HAU0{D!N0m<$E z7MzsIiZcdW``CRV!(HR4ndqmktP4+VY|-Lu!+758eE-Y&f`%cnc#Ii?OJXxAgF2o+ zsuXxlScTbJX^Z-TSK_Yuj8418WVO~EJ+ry+2zqYAAN997GAtG-7-%;&cqmxdgUE=e zNb(k$H<)xNM~R@)!uOcPx#l-@7y8LlnsIu<`BYNV8CNmXx&i45*d&4X6?<7GCJjsNi3JXtX}Eo@Aj%9i0XQg#H|7H9R%7V* z!A5xJ0jcNasG`VNw`SFWC6*Qj%JC^_26-42Q5we@mk`;|NH_Yrk|o-9nbw-x_X{jr zwF}258%z9ZTsuO%Y>S(#tm_vo)mY5Ti-AqH*k}_C(+Qo!MU3K>&}x`$;4OO{ zD|+&Rl8Q)M`fgcUsRLp`kYz3^tcf$H&Ye7a`sDU0+NqyJC9(`vG^r;vLh&hmYJm<) LS5T`qC;$LE#YC%U literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-28.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-28.gif new file mode 100644 index 0000000000000000000000000000000000000000..f776bc59938f6b945563cc4aa1ef55dbe6612e01 GIT binary patch literal 833 zcmV-H1HSx6Nk%w1VWR;b0Du4h00030|NkNR1OWg50RSuj0001^0UrPW0{)DTsmmPz zotzZKinHEa-wuZ2D1GDz0p~iYo68>XGRL%yC$*k4d*Az6fWDY;b!;S24ij)m1SOrp zsC7vtLOoh5COf=(SzwuWJMNUtY4o?7amQ1#)J!f-qv!_vU93mO*Jl?thUeolXoH8? zqG<8s$Q7stS$6|hx!0#7*+z0XNg+4d#73AIWU2>q_xZ%S*-4A3AREW|P|KLx`|wv( zHT#l^dizAo1k5807~;CNT!D+c>#CHj?5l$9j8nY{8LS#5>$X^YD~;p_oNf$F6;4C% z*Il^2w?khi8GertJZ8`8wRmIdQ?-5szh$ez&SADUMy8P36^Vnz{)UDwRy=hAO9?a) zOX#zvP7uf@|I|?PrE(%mgDF+Pdihc2G>M+5ojcjAX2^{*Q3_22v)xK1Hz_&eSBeqQ zoj{R3Dyj1wzj|dDV&oZV9@nYsKDYxbf^6BXYqQGCr}chu^bY?ijVzuYx7b(w9ptk?u+=bt&S$CW_J7);$Enu19FZFH>m1bq)nrG zHTG=S(y2d}9*k1-UaO%Gd)hslw%FgU3uEpJ+xNlPwL$Z>)-^EX)y^jyW`lRR5zEvI zV~oy?-1M~EH9{9}ooT3^jmJ^0`yLG2ZsXm1zwY@od&Bnr@!#kV#a!hb1z=SJCiR(f zvUQgqXbjr6;DZ50_+Vw@-RE6#`uTIggw1V8-i1za7{P*htq0;HrLaR+iYiLyQ-BA` z<%n1Bh2_zW6uETJLT0qMSYrEeLE|<&u7MQ~MH;z`G)Y>h(H2jxL_8GE{^qna+2c*cms z@Roy(g{pVvpN1OPC^vEj$!DTmqUflX{!yB#Pn|95fg&G{+39A7mKrLasD`3wpP3@k zs(!ILxaxhgPFgF5w~D!Ejg}6ytB{>ih^ADz#ugi>pScdyD=5c)TF|pNol&Q>)*f|j LCBbHEMF9Xi#0r_8 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-29.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-29.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9bf099c15985828226d7ae90262e1da95ff8b5b GIT binary patch literal 561 zcmV-10?z$MNk%w1VN?Mf0Du4h00030|NkNR1OWg50RSuj0000~0UZDU0{%<@rpxUQ zqnxzbi?iOm`wv=4NS5Y_rs~S3NDIgEOxJez-ulk>{{KMafW)Hlh@^}T$)@uOmF0%f zs`ZMMOtajs7rIP@so%2se0q%+%dF7*c9YR*EpF1*33w|7ApV#suWc!&qH z*ckC>H_3q*RtbnH*cXUmsUYbg8TvuG31R9mDvAoKNvYS$`C50H8Vjp(%ka21o2v?X znK?NWdMxY;Sv9s%kUNA1{F55PsXkFrULjzl1U5g)t+W{)h+ri69fv(8ODW zLb4M{>5>{*-3$(smkJvO-0<&cp|Uu6;u^@e#6xbKX33^*Pp5;^HW7?<2zG74jOd1d{oVxPc={*HT>Wwc6CR zXI4umy!i3W$KWQ9K0TWA>f5`=!v4Md`9NILzmLBOzx@0P`yWBdpsEFirGTKDh@c7Mn0PUu((XwkpX5gg?sfQw-fQN?;_`V@jVv z2XWT~C5J+5raP=2M#pkX>{MaHq+c|Bh6uC&Zi){RoP0LLS7yQP``30W-roOH|uDiwk&W`3z zKd&3TOfSxle+CXqBy{`&`YV{OnKFb78#;U_Dx$=R6f0W1h%uwao{bnEdi)47q{xvZ zOG0Ak;$J?K2o+kg)}qM1YSh}Xytj#!N;dIc+N3dU=gm3sU;?~j4yhJiLWdTz*)+=v zBj%zKbegbdtbV9oEeVI!8!{VFmyv=oGps?M!X&DRl9Gj6U{=)%#Klh1L2_!1-DSF# wC!dpi`^J=+2W>O5HCzt+X*eN7I|b`TE*v=8-phF#%Js~-GD<(2KNbK0JG3IxH~;_u literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-30.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-30.gif new file mode 100644 index 0000000000000000000000000000000000000000..d94c22df3838a827c72e8e99beb023e75fefa2a3 GIT binary patch literal 335 zcmV-V0kHl@Nk%w1VUGYF0Du4h00030|NkNR1OWg50RSuj0001w03HAU0{)DTsf*wY zqnvM=Y8|k=#~oml7jhsdo!Nns?s|1CoX(#OVff1@=)M3lge(tH@#|@pJ*13u3~4e` zlZdy8K7F}hm+MnCkm50UW`U)E>J4;(@`ywcsmz&1x`wJW_ zJWO0Xe2bi%$*bJ#{0to}Jw3`<6B@atP5Sp0Rd)Stog>&ej$55Kvbb)Noru^S$Ia&H z=1vXgcs^uLNaar-zI~?BD8j@?h?*ccc3d&YrxCYD6ctiTIPW67CyfiGlxspMo}_lz h-Vp?(qXxozlUCjvh?1WXnPCD3vbn3?r5*(U06U*Bm`nfw literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-31.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-31.gif new file mode 100644 index 0000000000000000000000000000000000000000..a93987f7150da7c3c2ec724b37d110365f50dba9 GIT binary patch literal 454 zcmV;%0XhChNk%w1VJiU<0Du4h00030|NkNR1OWg50RSuj0000h0TBQI0{)DTsmtvT zql}==i?iOm`wxa9XpQEHrYZt>t@^G?9K19M<8pEzz1XY7ei)+8x2xSsq2-9Vamt_u zY13(IqG-a0vB>&<7hLLREDocORkf+i(w>4|xnw-cKkE&;15d%D2NZ@x_~h4jRb>`8 zVFq~7Xh@dG5a~5!Nn+DgGb2RAG}IBAHF)_K%1HTn*GKw;2}+rkib|&HIa-?=McNiD zT=>U2>|^T5!{w`}DyZZb=xiZdYV3O3EUkSh#d{nsi4811X~^oHBk5*t<%@48A3({xn*;R3s*UD-PqNG_^6ewo^1&u+M77BW5!{f zFs>o#qTfS~5))!F0&JiLki{xe6zPzrISx9Plu<@y6;295qwRwUOPLZV=REGiwzR1( zO*Jd2IR~?7RAgL_{u*`hrb&!vGR(?3j*nQLWQVStW)|(7I4w4HyLk51lw)~sExh)y wuUk0?1^cBdN-e{-WmhPD%M%h1rj21xb~^L2;+c+t0{)DTsmtxZ z0Gzbii?ddsL%D_GNQ$6ymg>ruDf71SY;+zS#2jjaca952e3PEB_<8(lHJy-la;luh z-Y`LYYJoW^qH04b$KQi@yCR-VNfg$MepYA4hP2*X#`pX+j1L%iktJAY$f0+rxX9S( z_y`#(IZ0V*d5M{+xyjjCnb_jzNrw|Q+9xD>nx?wZx=LaN74q}i8Knf~XZzL#+r}kB zrMnaSYuA(uCZ>UVY)2?e3-=7oOM!IFSapc^)Xvn7^XDZL8=0(J64&=?*IS* literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-33.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-33.gif new file mode 100644 index 0000000000000000000000000000000000000000..f11130d6e7dea79157328af13be6b001f220f918 GIT binary patch literal 323 zcmV-J0lfZ4Nk%w1VXXiU0Du4h00030|NkNR1OWg50RSuj0002301p5F0{)DT0h!AW z9X#^YIx~)$&f9ci14vsqDy7GiX15x#=ptLq+OwjW*O_YZhOpGa0X)h^ASUsoTnb;s zoHY1pR$*G5&1ub|ykFAzQx0RzR~pS{fxjt0vh4P2<+*hGS{H+d(-s$4h@>}2w0NlI zLIntUr`W~#*9LXtriK|O#Cc}P2oGy3n6K-7^jz>o+#~QngGG07A zOs~<6Op9z^EB^}(K3BBxMG^Lo-;!qs(=-f7%nCC$`($A|h0YkT8&DagbR66nc9WNj7lHQ zDduTKVUeP&j_dW+!m2UZwmq}V>UNI8cFSRLBpg1^Z|cpv{|^`_I7nD%cxY(R5UAIv z!{->O0V!GeWr;Znmg$1GMo94#h7B)@C_7*5pmQqS5b{Fj2;v-n($@MW3@6O znH-bQvE&g~-Sm+Wh_BftmD={rq#4R46`W{7?&L{sR~nt^+8K2jO{XT=Nk%w1VP61A0Du4h00030|NkNR1OWg50RSuj0001A07(D<0{)DTsmlou z4s5jAi?fVU`wxOo7nbJ9ae;cau9X_>OV{Mc&i0P38xIsACZwQII6NvTM44j=MMkHv z5%r4AYPVbsdq$KIF=x|b&i6PlTNv3fVtS3xUh`=da{nFbtO z##`jW1WRmOypa2*Cd<&g87W;uC(~MT8rNEljJ^ClE9ebdDE^VCyi!>{_?Uz~3E3%6 z%4y%*o$CH=nO{ZSG<5Fz5duDp3}rLF<@o9Y}B# kN4jEXvgA4<*$D1ZiEtlGfY0cq^eFPCF@w|EB`5#@JBm!4!~g&Q literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-36.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-36.gif new file mode 100644 index 0000000000000000000000000000000000000000..9d55aaaa2071c19017b297b4154254f5528e8383 GIT binary patch literal 330 zcmV-Q0k!@|Nk%w1VUhqw0Du4h00030|NkNR1OWg50RSuj0001z07d`+0{)DTsmtvT zV*-@Qi?iOm8|#JQNQPjErYZ`o?h9XSOxJLA+WOABa}Nwke!`*=L1ZM4%oOfdIXo59 zrd2kPY6DAd*Za(U!sN2~j83c9I4(8%iNCM(p&SI2XO-ppaRw+A=tbqX0_SwHCWvTQ zBIX$BF(_GS@@1I`0jb&P`KeLW2>QuMdTM$Kim6)K`damh!75uhTI-67s=Ld(>ihdf zCd^iBZ0tu1oV=_V>v`K8nJR5XSv{?cZA888{XNtM2F}z?9%O#rqpi-v-d^(zFFgOJ zSC2l1|M$MH676qCzkr7(^g(hgAwXGq2Q%4iefJb#dN04 z#nHryW~fh&RR+3twbGk$x+=rN)Wx8cvEZor^Q|NN#-ECI22gpN|))#b`boHi} zV@1@oqsY<>4Pe1`gNID_o_x>*}AD2>NE=pddFCs8Asdm z=|@48Y8U)yi;3Ck=$ouFH%$y2EnUo)?1HNns6&~%Z2>N~R0%ykg6%nGn6B;`>;8Kj qFB>+my#LF8pEyYsnp03HAU0{)DTsmtwe z0G#y5iZ9c+`_6q05F(`Ll*x&! zm|l1kHBot4muQ9u#Xx01yBG0{)DTsmtvT zqnxzbixb$n?*Db-NS5X)a;O5V?hD6q(*|{X%j)dxksmB`mtbGUFCdP>)7)4FB)1`Ageh&bC-i5WX+L>jB= zmx)9rOlX{n`szB{E7!bP#wzs8oVm>V)!aAC{mq#eM@>zWOU&#^o4S5R{;kegdo6lh z9&dk3x(y8uIPuQbvVQbj1+>-AP`i6A%H=|&2cJ7ws{EbnqoE--Kt5O$?c205WFvPC z_hl?8F69xB7cB(?CXHn{Ei5&vNpaJ~zno5HaOBCZAkZs9A&KMZ5XVptKbQX6ITYE8 G0suSZJFH^> literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-5.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-5.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ba16a22ff8352ecb04ffe542609084917e3d6c6 GIT binary patch literal 185 zcmZ?wbhEHbv|&(SXkY+=|Ns9h{$ycfU|?j>0r5dH3``Sx`d6~;KDjeXPiTDZi&>RG_|I z*`m_U?qm1FMdb9CY@fq3&8qC=$|bj!6kqrKwf8^2goecn<VxV`wnA*uQE lx`m{B`p<1sc3wZu`RwOR)mxrcMQNuVPIQxc8o|I|4FKUfO(g&T literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-6.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-6.gif new file mode 100644 index 0000000000000000000000000000000000000000..505731460a83f3c518597dba2690a0e76ba4b770 GIT binary patch literal 1229 zcmV;;1TybCn0kIU!uy8VvN>-YS={|^`_I7nD%c!-#|cc$1F z#ON4F11VWaLTQ=VfvMSv!RZ+q0V-O`Kx&%$qsj__+FJSw8!9{7S!8#;UlF`~qY`Ya%!*e?gh{t#befRQodR7f#g zMv~mfWeE=|N~(Zd1v5bumMBHCXh}t;#h4|Hgsgc{nbZswpis-q+8eR+D&#L;+61M zZ{81q1&iEkxB}b_ixV$s%(!ns$SEZAqg>fCJ zZ|DBKS9tJu$3HfYs5=q$wb`#mPiXoU`Pb;rhY!g98vNM)+&|I(3xHOtcoImWmnI4*|8OOJ5~IR}yK{8)mKLm~+zaZDzpq+?O0MrD;&UWsLvT3#vF zlfYy(C04}!Cy_^BAVC#dQ&E)@QBB=s)q+m>M3R|RNr9(5D_LR1Oe1~t!c2Vj0F$75 z3M$VYJ&N|Js7o;|3TTIiwmHR~k8xKhs;CZy zD2JcI3TaSm8dZc$UL@q^igZStxJt$$BnjmX{S&()RttY@z1gv zo3tdu4Sn|~fCt^n*9ErSDTydoG$6^tM5xa3=iG)4 z5R-nBnYtmSuiCBEvCmF>?Y7^JyEBYixBF%`u31&H9>pmq4|j%%X|cK{fBdg55qc`F zn*J1Pz)rcjT&jdl4@s>$bn26>g+7JmNg#edKJvOgn!HqjhI*2pu)2!9s4>2pQ}qCW r&MSGgdcQqi32T7EThmxTa=haGX@JQpRRhf@rriDObp-oM0RR9y&%0;7 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-7.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-7.gif new file mode 100644 index 0000000000000000000000000000000000000000..4cc5be498a3cab8819355b30d2935bf54a5658ae GIT binary patch literal 2420 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 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-8.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-8.gif new file mode 100644 index 0000000000000000000000000000000000000000..39959e6838a9e62d5267cfa64e563b1691e53c8c GIT binary patch literal 287 zcmV+)0pR{eNk%w1VbTB(0Du4h00030|NkNR1OWg50RSuj0002e01p5F0``o5fXnT_ z6r5C2WUr39`|o7nD2`m>m1Y81?aHd*tH~(**(7~mI%(kje8F09*!m4|jAiabWMX<;$xp-*UfY+(`rdP@r7fGpVgL+EKNrPM4+H{piXI3e? z`TN=x3leJVi2`_ge0n+ACp;JZJl)K)SP|v<8SEMn8op(^%^RJ4sJ&ud;hqMsj64s$ lR!@zuzrV$=n&t0Wz=8a-c>z<9phATPyB*xuaG`+$06WAOiH-mO literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-9.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch1-Z-G-9.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad150a8e09efb93de80ca152dc0fd0d2bcd4b02e GIT binary patch literal 396 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 RJyi=M`_{|WHM9x<06W_=PY?hA literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-13.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-13.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a18c510de135e9931491766854fb2ecc669832d GIT binary patch literal 1050 zcmV+#1m*ijNk%w1VHp8R0Du4h00030|NkNR1OWg50RSuj0000P0ZIS>0{)DTsR->4 zqnxy@d#m0Y;Lmj8=z$-JZsuC9?i;i)GuNk0g4Zl}02t2ZqOr3J++&wXm zVJs?b+NLHh$V<&)ao~`rd?Rbs>~VW5e*0#^>kys5EA)9cJpLy~2iRpnWW{$#I43x` zh~($km|>{6COK&oi5b|*mj&7(P&fdOG zZ|trV@m)WE&nsbDI)JrU?6dUCo;WipMl2-e4jaUVA|4VsSS}&O{tnr$S-c2rqXl^$ zN$PVE@FPZv6Fq($mro!+nEns~tfDU>OJ%)`9L!l0sLPivrS%(_t>8AJG`S^xw{#~@ zm+8D%)oGJy#&)e-ZIybl>nB|^xhfrNwrto_V!^(|1y>kUudC*Mt&3Lc)}eao{&U;K z*WIkI3WJq}ST0n)ee(_`%GR;exXB3r#cTL7J;seQTZSCC@>{`}AA@eI3H70xibbCk z9r`Tb)_y;qmRt4fXAc4W^)6aTion|JNo%VXQMBHX!J=+RXpCxr{7NQz0e zZ|v^9p_K6AsRuWYes+53+1C$u@4h{J<@3$UuRk3>`uqC+P4_?kUvmKpI3REZ-fea0QQ?1I>pnJkYO#y73Bzfybc zlhJCMEw_^W_bjZ{rq?X7+hR+gkmnw`uD1yhiEOv*%FEuk=rZG*xzpr2<5N+pYYV*b zp0}rONICmno44evFTv1~Nann-@T=?%3^QwD!NyQLFj@cJ`^#t#J1lO%99Il+#P#~i zCCW!xsiVmUH;kIXDXVN>yAo?OGsgR#3^GhWTbpjs2Kr2|f;#V<8@NkwVJn?=*nozMaN1gDN$%TBm+j!$Vt>sw-Z2K-_SkdN U?X}*$0?VDSe9Jnl4g~-JJ41^HwEzGB literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-14.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-14.gif new file mode 100644 index 0000000000000000000000000000000000000000..2551fda3a95efdc771e4724ffed0fbcf26bcc7c5 GIT binary patch literal 344 zcmV-e0jK^)Nk%w1VZ{Is0Du4h00030|NkNR1OWg50RSuj0002R01p5F0{)C)smtw( zo@8;_P_M?j=T0rz2bQGvoo0EdtoU*XFh;ILgZD)4cr5W9gfn0YCVLT!v7-_AST2)F z2yEIosjwj=E7#0Qvt(!u0-n(-Yj%6s){54ccpcmeqtowu-#Ula7njDghd}6e;5CF6 zRA&eo1(<`VCP|g)XUACBh56Zdxj0(JRGC!C23V>IXBm0JXH!ZW>59S{xH_pzH4=4} z$_sp3s6|^$+M61?oY_O@`75?8%Se6OX;`cbEsR$r==-?}yT})+<0#3C``k_kddEK3Q4SeJ_9MiYy-<(~qR3Yp%=uoUPT%LHyX9fyDFpV46IitkUV6JA^ qR)j3baSTag+D@7Za;)SRmn~DGh{+NqO?V=8dZbzLN0pof00282$emgM literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-15.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-15.gif new file mode 100644 index 0000000000000000000000000000000000000000..d14510bae396cc86809b2cc835318d3f55d5d8e5 GIT binary patch literal 1726 zcmV;v20{5pNk%w1VP65X0Du4h00030|NkNR1OWg50RSuj0001A0ki-B0{)DTsmtvT zqnxzbi!%bi@DFi^sFmi4rs~SJ?%64^LwfIx=lag~Z0!LqI zr}c`>Y9m!!;{)t&$K#=wF{tp<))W;=gc!-#&xX9S( z_y`$kLMT~j*+_Y*xe1ub`3c(Q8A@7uHENow+Jn04`uYPaJG;|Ldy6ZTyUUAV+Y3zl z8%*pvT#Q_LoXpI*+zeg$98K*wU5%Z1oy{G%-3^}i9Zv2xUXD(7p3ctK{;s$VKaV6& zf3IVYzwe^Y|3Ar#KY#=)5b;tl;UFUj6*}~BaNxsG^tXg(v~`X3Kb31 zsZ@>HT*J}`C7DBhM!7KTn9e3)OXw>LmTSYcU)Y4WGX*Qyq8i37^ko(eT?+02A2zfl^$$@vK?RJxI$FGC`X3RWDWJWi; zK0$4}^x#9_!*2k8x~5q4!n;ULX}2Ea@7*bh~QD>Qu!cfk$}#mr30!INRUMXaUdQH~x4n61VtO`+r!{RBx#kLz zJ;`UEk;rK$oqqmF;cnOs%21+;ZU$+jU-m|+d4Z~MXo7{-31X>^F52lbXKk9(FJoG< z;)(~xYNBkk)@n>Suja$fu5k*Qj<2MmiH@+3Y8n2luD}+nEGE4+i!8I`7@J$N(=H1w zIMh0qZ8zIaDs4F5=GiSb;~M(xwa!{AF1G5nyKcDJx(jc;L#AslvE^oSE~xm<8}Gi@ z^c&K@-qH(jzC0;Q+`$3Q+i*1v6O5Qg=Ke%+CpKh^nZ^88dNIg|5XUij9!C?=!Y2>B zax+AfJlARxx6I7T_sTpo#4yu|^GiGbVW~JjD><|tJ@0We%F`At2h+4^2c2rJ-Z~-- zR97vSilS&8hiabM=k=((;+BLb(`9k?7y<5MS1g3nng6`coYH+VVB0 z;oy7biy-(e*sAiSFiOZ<9s~FG!T8ZHPS2}f_9`Mh{DF{oLF=HXX81r#iEs&wy5aE_ z=RPV31&OQ+o^XJeiXuXBiaGq+{+>{0MF&!`Y|SHu6t%d;3IZi)uLC0rgJ`>4RWXY$ z#NG4ASjIDk5h7iDAM|P`yd=Ugj(l9>?~bTOBfe05O&nyHD5p6z7IGF}^cUI8xX3xO zv43flpaH33wM$OLFE{&$$sZpAN#65+bs752II#$&2qavkfM>9&& zde~5qJYW(_Q%blaHFA|8at}-=w?<)YMUpo?&P#RrG@kas#HK)wH712Do3|E)sVKdt6=r2M{|(KvSL)LK0T{i+ltbxO7yKI U{VKY!O4lBB@}GMpNdW)=I}GYv1poj5 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-16.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-16.gif new file mode 100644 index 0000000000000000000000000000000000000000..bda33665891d6cf10fc312a4fc867043ebd05bbc GIT binary patch literal 679 zcmV;Y0$BY=Nk%w1VTb^60Du4h00030|NkNR1OWg50RSuj0001p0C4~S0{)DTsmmPz z5;QQnYF}=6uSt2%NR}q0WRWNx>iLWy3fHzdhb`{1X`YJpZp7jaA@WH)N@R1wG)jrd zpsdPcbdb|749mS(Hq9f)>`iN#Dh$W169Yf9x%%$1O3Qn^|D#9sM>AMxc!-#&xX9S( z_y`#(smM2J*#&p0sn$`s`AO0VI$9)3dV11nhsxSBmf0Gs(WW6QTj3OEdy1Q@yZhN| zwh9a>yyROvd5oN_{K(ww{Ja<~?MlsP9f+Ncxcx)t>0L@3E>8XjPWLvRj$_W={_eGY zCP%*)|90h`@8oY9x_@8xi78=^V7GGc6oxVwDpf#l2^(5;xMbp*{(=|<>Z<{fT1bgD zMglXL>ITYKD=$ja$O|UIi4||joJpnSl@NR~LDWey=S@H;dgdW?@SBmEE`?;NmGqlT zrV-Kb3$u~ZO{y2TWyN|<>lCh9yq+WTRqR-xy0)~d!-8$8dUA&%HC1a_4@QFMpOydbH!ys@Ie@ z%{md3){zap#yKk(?S-)SUP3+44-nu>WfLF1TV-J&T*b&=(WKNWROA*No0{m9tmWCNXp<;Vm$_<&QVA%_aljgJjvo|OU{BC N2vsI|BSr-P06P{!L*f7c literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-17.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-17.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea5a68bcfee313b300f7eeb1f50d738f6df30a25 GIT binary patch literal 1941 zcmV;G2Wt37Nk%w1VUq!W0Du4h00030|NkNR1OWg50RSuj0001!0e=7h0{#q+smtvT zBM7wGi*uH|d#Ht?_?2cirs~SJZacm5EXQpdXqUyV>p7!r-FGpw8MGBoI)v*{?q+#DC`0V1F)>uKhaHGq zZ4z`!!sComlQwwPVA||zNA_)t7jDu$c5?>qY&RUSw`#>StLAy%+sKnwr&}DW^0Q8~ z*Jg#4_jmE*F+nZgT_5`F1+RD8P88_+efYO^pI!4QI|?aR`N7O zkm!K)VNUtTgrruZA;<=cX_3j+i9ap|Cv8av2WFjX0m-9ekHKV>72&xvor>rzsYnw= z$@tloiC$F7Wm3#ZSEGO3*;}4Q*{Rq}Z}uqMS75wVPmYtanUtGxBDI&CmLBzzT39B; zglDEP;AfegQo0qG>liv&hOBLXT9pgcis*^3mL~q?k(*X}YgjaPX>67xz6Tk78na2x2cgI-JMGvJycZZ+$syNI{Iy$edaD3&`RyvESmiM{Hsy05;y z@T-ZxH8wl1z`77j%d-Om{P48+LVNG44u$LEGys^aQ&Nz?53v=9@!YO0C zGRiozT(Za{gWNLA;ktbDfI1I|bG#?1Pb=O{h4R+XKk4<*jW}l6A+G?-OcH3^h4R_pf&rNsTcHfP6-g@uNci(>h z4S3*!4^DXDh98c2;)*ZMc;k*g4teB~PySAM<(6NLdFGmL&Uxpae-3)+qK{5`>FPS& zwCUlZ&Uynjck5#7MwcOb?L#Bx?vA60uMCr z=6L*_^UNY2u<#W_KacgEq7S?H$-`g#?Zo%1{`mI~ z?0zB>2d}*K9q(J#Lj~>x_&>=og-f{lUILkRE`{LleGd#@03&Fuc#w}TijrWidPO7< zLP;P)D%Pj=*RczJa7s&ojk1=t6)$P$S0OwNs;)9Z6Y433sbY*_xZ)Un9k2$l@l*r- zLOdYeX@OdD)&n7v-nNARZ(zr;uS559vlG4zf+al9rK-R3QjO zQcIu;B>S>5#lw)%W|Q1vku2k#L#QS;MFPRBa;TX;t*KgItd%~VUXB(shxrByGC!TMX9}DKf`bUagmc}{xo8KN!cgySuik9h_W-*^xKUU($RnFv) zDiKJ;L-8k?+x#WEwg4ghv1g4dLS}SO*S*@g^Bow9W5(vm!FA#@TIsQ8b6R&Gb8f7h zXtH2Gxk*ieiY$+@BIkqt76{G+iL;v${pR#yDI|yL5=Kn?#deJ2Pb8i~iROsWNHNI9 z6oOBd9USJ*fMkepOpByMOlJJBiN#b3G%J84!Yilp${A7+WWh4xq5xIUEPc?3on&fI zpX$GrB6Uxujc#@$Y907SrQKG6)}C(Q-vj)U>ymrf0b&z2zyP}<`ZdwYO67Q30nZ()~awAMwN2A z)#xcRRJ{ZSI6`wO+u7=tdgmN&zxMe@z^atF29@qVHJa9h7Wb;zZ69_K8(ZhDg1Yqi zZg89X()4XNUeM*KbzjC^^uE`Y+MF*h<6GV29@D&<4exFpA=7}iSET37uXyng;0O(v bw+xae&w9FCMmTuF6rP>qDqJ7A6#xJ`%C*7Y literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-18.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-18.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2b2cfa5b5c45a8b10c551afd66838c183aad871 GIT binary patch literal 258 zcmV+d0sa0*Nk%w1VaNav0Du4h00030|NkNR1OWg50RSuj0002U01p5F0@;j@smtvT zBLcG8i?iOmM?iVvNS5Z=gy_nW;M-;|_^9!XSD~Hod9X9gXhMh2l{?0Q4CRfPGP0Z| z>WV^KSf@ZLtjWb~Q{U!HXDn-mrSUqQRj{MvxDaZ-IEn6q&n~hj*CUk&G|{uQ#{{Ed z1*kQoc37nI*H0Du4h00030|NkNR1OWg50RSuj0002m01p5F0{)C)smqED zqntFpinG>td)R$JD3&H^rs{~URLi*xERPbwswxt!)j`J*})w+RZG(h2Cel9F7_`=KK*Y zm05j!|CA3DSae1ZE?;zLsbg`+5x<3N<}qwY5a2^211Czf_(()W2#gsy^4ln)002AH Ci-{%x literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-2.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..cceb7750507a1f4f73e2e587c11fcccd9a808f72 GIT binary patch literal 333 zcmV-T0kZx_Nk%w1VT=GD0Du4h00030|NkNR1OWg50RSuj0001t03QGV0{)DTsmtvT z9RRV~X|vv3_HR(&NS0!mo#@I+YTIB6HoYS)ueg2G{I-kL7L=3m7C0tzonr6V6G@qu zBy<>(Lbp@Xc1cn)mDz;vJp0PTsx|rJ4#`3B`Fw3pb*=n8-|qAW_hj@_C8u@uM^$lD zc-M#UnAa3#iBy(%=BF_UmgPgqUs?7MX)cTot0{(;%smtvT zqfE!li?d#K`~P(if*qv@a-?HkB>KGC%F=A9*mnR&x+?kYc$wbFC(L=0DrSRed7S z*eLkuHN)liX!Yhop-JQh$Eg>p#zqQi+9oC^nHf~~L{$hY)4J(ddO8HV22>N5+WD(n zTk}~Ad^C)FY}bm&+I#}V2$>>D-8X%`l&wwK4Qc%i5-z@7p6HB8sO8FxEc={WERAZM zwIaOCJ2Z%IUvGyTyH&fkv>6zU)0u?@`Juwp&R~p&PfUeN!Z6vdAW`}%c9iI*QZ$H` axSiv8@(;O`bXXoT=`!HTm|F}K0029$cbWtM literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-21.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-21.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9d98c41e31f948d263434c534eaa4d204d5365e GIT binary patch literal 1952 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 b4nNH{ygK9J%fCu(KD~4G?7z29RsaAyHHZbS literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-23.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-23.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb8f58324968124a6cf0ad2b5d677cf1a4841389 GIT binary patch literal 3277 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 JI1>c`06WDPVz&SQ literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-25.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-25.gif new file mode 100644 index 0000000000000000000000000000000000000000..87f07599e8bec9485c21aa41df8205c7ccb24127 GIT binary patch literal 46223 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�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 WDy*+gIqRsXz8Wj7wdSf(0RTI1I(P>F literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-27.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-27.gif new file mode 100644 index 0000000000000000000000000000000000000000..69949a1e7a30c27730ee54ddf752eacba008ccb0 GIT binary patch literal 659 zcmV;E0&M+9Nk%w1VYUFa0Du4h00030|NkNR1OWg50RSuj0002C0JZ=C0{)DTsmtvT zqnxx_2d>_{`~PL&NS5Y_rs~RaVhhLe_0IN07=^fa z)zk

                                                                                    6kJ}sc3mwk*TS4$Jyx_I!fAt2wHj)iJDr%+S>D~1{>%hOG|-zi%ZBm<~#Me z3%u~ON{mcAIgHGF%lrnNoU=S_Q*GTLeXyOq)E#!Z0qz|@E^%&ktXl4bW899AE*~*Z zDjYA$U>}Y}L!Zx_D{biNQR266Q@~vR5XO1-PlLmS6bV*5SnT2!{*6e0O!Ua+Bga%C z*^MkY5@bprDBHALh#IbViKM}>(n5+P!LjBfbiKA2SV1; zjk%;w9mL5PHkb+lW@S=y#|v-(t`<@Hr>HF&X7wdJ+cvF0clzQ|g&~y}+F5!qMx?8@ zfz!ZL><0S_m@i?&mvrsa)Ku_eM z2WqxpgPZB6UP_kOx8H&kf;J#`8HO^JgB~jPp>rGd<)$^^^N8kmT01`X6t%!47>G==bFyb{eQXvhs2`sm=QvH%29Li1VyDz zCh`i!Y7bLRxA?_`x!dZitR17*>^4tL&cT67?qQ3yx5iPM>hcs6?3XbMD$I-^=S*2=$r#3 zddq7yNE{5@fh_tv>ukHrj07`12~CP!+@LI$N)s3^zARoo?o?x)gf1bZF1)3d&aK^^ zT<_&3?_D1;|6ZyNtxwLT5R8^)nJ<6}b5Xm(P$0Bv8zLI1_{(B8{(S5FJX@orM5s&q z?nx@y$K4%{E2+>+2(jP+;heY$iXOPQVu~&L N17nRdvdCfq06QQ_Ic5L= literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-29.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-29.gif new file mode 100644 index 0000000000000000000000000000000000000000..93b0ddf66e6e6c28db38f8321f2ffa3fd9e48856 GIT binary patch literal 488 zcmVN9E`Vza>Q)XU|8!@054OtzuZ?6&*uW3SR z#TW+3BltHWos`vg7dGWcq>**5oYr;|ugZU$cA0w_v}n$v&nRA+i?r#~ERVwK esycJ&(QesRe0)07?9fRQVa`o^_k>ji0028+Vf82g literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-3.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-3.gif new file mode 100644 index 0000000000000000000000000000000000000000..8eb9b251d3ef4038a6b73a7181121bf1bb62454b GIT binary patch literal 258 zcmV+d0sa0*Nk%w1VOjtj0Du4h00030|NkNR1OWg50RSuj0001502}}S0@(~;7t8Ih z4tliGs34McvuRjYxJ;aghTvL~?%Bp!+OQu;cVCIyHxG>E5<%0jWAbHY#uo`kW38Y^ zp~u-YS=pDz(8IMX#ZDClrVXsFnD z*!CAGsn$4Yd6~CJX?Let!&&$SDrYx3nsQ2s0_wSz>Uu^O*y#pXYZx1PwDiZTp}W)d zYICb<75qY&H0EViMp{G+#gv8Itn!pujdis(XdQ*iurgQ?E$9{#%P I4pRUCJ1e+(_5c6? literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-30.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-30.gif new file mode 100644 index 0000000000000000000000000000000000000000..65ccbb1c09c9e8271c597c9ae7f1b25192fa1d13 GIT binary patch literal 36899 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

                                                                                    uu6f@Uscj=%~V`US+xOCz47%ekwXI6uJJ;QbP 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 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-31.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-31.gif new file mode 100644 index 0000000000000000000000000000000000000000..20a1f58328b122e21a5384cca3d996ec5f1814f6 GIT binary patch literal 13186 zcmb_?hhG%e-u{`oGus%dOLgcAf)0qdU>la=QpCY1u8L+sL{N-tNhGmkwz4STBBIy_ zY$O`97?TiV;sA1@s5s;BS(%LI&|p3fdl*Z?{8~s zYi(_9X=&NLdv{Y))2>~+8X6kv>+5Yco5f-=nM`lL{r2|l+qZ7r`sSN&ZrQTs_19nD zv}x0Z4I9?4U%zhMy0vT9*3{IjUcGwNs#Pmjt}HJvfA!T@moHzwY}v9UOO`BNym--~ zMX$W_N=Zq{{Q2|e&6`(PSeT!mKX>lj+}zyk?Ch+ptT}V$%$hZ8#*7(1{q$2tM#hgn z{y2U5^pTN~Y15{?c=2ND)Tz&&JxfVRdGh4Rlqpj@9#3*|@^{~TH)+zOM~@yQBqTh1 z_%J>`erRYYHa7PD{rl0;(Rc6Ojf{-Eef##ri4)y!cX)XCS6_V<8X9`@=FQ;X;2Sq? zOqeiXaBwg%FmPaCz~A5h%9Sg=zP^2ZeLg-uq9`g9iqAj)TqcuUx^#&o$%_{+N+gn= zo*oRtKKke*1VJubxBx-W`Sa&pF4wtp=gyuz`|i8%c6D`~I(6#Ai4&cjoq`}7J$m%; z;ll?H9&B%K-?wky-o1PG?AhaVI-8rD8yg#U?%e5cIP7-2)oL}H%{a&ojq@>4>A15Xze*5jWYPI^og9mYO zao>FNO-xM8y?ghfqN48HxpV8*t%!(-ufP5}EG+EHFTV^43HjoSFH|bk_3PJzf`YDH zyA}`-aP{g{KR>_z{(g$0dV717O6BFtm*sN#XP(+62`Gbq)mH~O7?s&nhAEHZ@`q{=IA#mlryYCyOJn1t<*O%(g)L!Wf{OG-9 z_MD}k-8QuaDfQ>-+;v}k{Lh4?=dD+Mjm){P2%l1U>&fuPDf%TdtpUv^`-76gyZKR1 z?@;&Z;~ASrVDo``Upix>{JWoi{9x@7-L}EL*WXN5EXl0vxeZlzJHHW^|0>niM6@q+z6Q6B|d{ig?vi_fk%>n(gnSv|7jg6H=47RB%rWO5HEN0aw0S6``n_wMQM z4Hs0qgtvtl-$UwVqB((x$)uoM_T`{DOVX z5|M`{-x#haOgeI;W<}EUvV>i==))*6`cLW&gY4 zhkl4qdu}7G_`D<|DEZKborOvE=dJ?tS>xP7<(0SWmc;iSI;E4+?~0c5ZIF7`srN+l z@T5-{1$@uo`csQM09>b# zn*p!nq$m*oy?ca7Q*W>8-|F%V^tT=S;r7mCP5rcN`M)o^u0!8frr4N)9N*ljU)+r} zMbVdpknJmfG$L*8&--Ex>`-6f*!@=<{45Cxb0^IU$B~J0Enl?#_489G- zHO=QKO;tHhaA~SC>E^~G5A-)3@ikatHHR$TEAxx2&cSB$*3fp^7mN-}=qv#&VFugT zD`?m)0w!2+ws1febTu9>AHXl_{QYv!YpoYpJhjWes=#IT)jz?~S?#1s&XJxI9rFF) zK>E2~8f$8!0jin{|H(D4Z;X@;=sT%_y$AFM96_J8bMb|K$ctMWrYDbB)iYfUAzT)r z^YkK8XX7MQwyLj7n|kyY&FmN&yscwHKkCL-R+jtcxqByRj>oQfey#Y6v6zO-T=%p^ zXZr%CX|fVa1$ouqTIngu3INR;7e-32s}XRY;w51)WmAj6pL2M{%;R$D)WX9&lT{XQ zs^YIljzoQ=WuY?)XN{PQ?S_|WhOt*}+a^+s2`+mY@_jp;dbFhZH6jWztFF)&Z()Y2 z$k6L`TCiC(-wmkZHa>8>7VPxh*!={X{2t`*@Srs%QGS#4P%M$sw0?86;_+zSw4

                                                                                    +X#$ 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 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-32.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-32.gif new file mode 100644 index 0000000000000000000000000000000000000000..28f359acb13818ab9b69cb9ccc7bd1a3971d9d8f GIT binary patch literal 19691 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 N@P&g61_<=o{{gJa4MqR} literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-33.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-33.gif new file mode 100644 index 0000000000000000000000000000000000000000..edb5e9cdc4069590eee9677ec6ca66c2ffc6090f GIT binary patch literal 19071 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 z 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 ZLGMg4s!gL?HLfGpOf_a&Hz!^J06UBs_q_lB literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-36.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-36.gif new file mode 100644 index 0000000000000000000000000000000000000000..15f5346b6f018a8d9d031df0be1e134f864ff7be GIT binary patch literal 988 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 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-39.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-39.gif new file mode 100644 index 0000000000000000000000000000000000000000..873385593d06edffa844e73a01eea33d56c024f3 GIT binary patch literal 43914 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%0DW`XMO&Ix5>jf$?U^{gAY~{X?3>>@j>R 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 L*aWu5&}07(j!yY1 literal 0 HcmV?d00001 diff --git a/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-4.gif b/clones/sicp/mitpress.mit.edu/sites/default/files/sicp/full-text/book/ch2-Z-G-4.gif new file mode 100644 index 0000000000000000000000000000000000000000..a0da696d3e70c45c76f9df6e5d912d2aeefeb910 GIT binary patch literal 273 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