74 lines
No EOL
123 KiB
HTML
74 lines
No EOL
123 KiB
HTML
<!doctype html>
|
||
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-chap-22/cc-c-the-lisp-pretty-printer" data-has-hydrated="false">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="generator" content="Docusaurus v3.0.1">
|
||
<title data-rh="true">22.2 The Lisp Pretty Printer | Common Lisp (New) Language Reference</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://lisp-docs.github.io/cl-language-reference/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" name="twitter:image" content="https://lisp-docs.github.io/cl-language-reference/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" property="og:url" content="https://lisp-docs.github.io/cl-language-reference/chap-22/cc-c-the-lisp-pretty-printer"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="google-site-verification" content="Vzaw013_bfdKeUVG89Ch3W1zC9_vH9ID2dPB9Dz0vr0"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="22.2 The Lisp Pretty Printer | Common Lisp (New) Language Reference"><meta data-rh="true" name="description" content="22.2.1 Pretty Printer Concepts"><meta data-rh="true" property="og:description" content="22.2.1 Pretty Printer Concepts"><link data-rh="true" rel="icon" href="../img/favicon.ico"><link data-rh="true" rel="canonical" href="cc-c-the-lisp-pretty-printer.html"><link data-rh="true" rel="alternate" href="cc-c-the-lisp-pretty-printer.html" hreflang="en"><link data-rh="true" rel="alternate" href="cc-c-the-lisp-pretty-printer.html" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://C1F2Q5VM6X-dsn.algolia.net" crossorigin="anonymous"><link rel="preconnect" href="https://www.google-analytics.com">
|
||
<link rel="preconnect" href="https://www.googletagmanager.com">
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8TJCE4NSF8"></script>
|
||
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-8TJCE4NSF8",{})</script>
|
||
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml" title="Common Lisp (New) Language Reference" href="../opensearch.xml"><link rel="stylesheet" href="../assets/css/styles.f13b59fe.css">
|
||
<script src="../assets/js/runtime~main.02699c25.js" defer="defer"></script>
|
||
<script src="../assets/js/main.4f0a7a76.js" defer="defer"></script>
|
||
</head>
|
||
<body class="navigation-with-keyboard">
|
||
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="cc-c-the-lisp-pretty-printer.html#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a href="../../index.html" target="_blank" rel="noopener noreferrer" class="navbar__brand"><div class="navbar__logo"><img src="../img/logo.svg" alt="Lisp Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="../img/logo.svg" alt="Lisp Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Common Lisp Docs</b></a><a href="../../docs/tutorial/index.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Tutorial</a><a href="../index.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Technical Reference</a><a href="../../docs/whylisp.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Why Lisp?</a><a href="../../docs/howto.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Guides</a></div><div class="navbar__items navbar__items--right"><a href="../../docs/contribute.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Contribute!</a><a href="../../docs/help.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Getting Help</a><a href="../../docs/about.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">About</a><a href="../../blog.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Blog</a><a href="https://github.com/lisp-docs" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../index.html">Introduction</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-0/intro.html">Contents and Figures</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-1/b-b-scope-purpose-and-history.html">1. Introduction</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-2/c-b-character-syntax.html">2. Syntax</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-3/d-b-evaluation.html">3. Evaluation and Compilation</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-4/e-b-introduction.html">4. Types and Classes</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-5/f-b-generalized-reference.html">5. Data and Control Flow</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-6/g-b-the-loop-facility.html">6. Iteration</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-7/h-b-object-creation-and-initialization.html">7. Objects</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../category/81-structures-dictionary.html">8. Structures</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-9/j-b-condition-system-concepts.html">9. Conditions</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-10/ba-b-symbol-concepts.html">10. Symbols</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-11/bb-b-package-concepts.html">11. Packages</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-12/bc-b-number-concepts.html">12. Numbers</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-13/bd-b-character-concepts.html">13. Characters</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-14/be-b-cons-concepts.html">14. Conses</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-15/bf-b-array-concepts.html">15. Arrays</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-16/bg-b-string-concepts.html">16. Strings</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-17/bh-b-sequence-concepts.html">17. Sequences</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-18/bi-b-hash-table-concepts.html">18. Hash Tables</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-19/bj-b-overview-of-filenames.html">19. Filenames</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-20/ca-b-file-system-concepts.html">20. Files</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-21/cb-b-stream-concepts.html">21. Streams</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="cc-b-the-lisp-printer.html">22. Printer</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="cc-b-the-lisp-printer.html">22.1 The Lisp Printer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="cc-c-the-lisp-pretty-printer.html">22.2 The Lisp Pretty Printer</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="cc-d-formatted-output.html">22.3 Formatted Output</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" aria-expanded="false" tabindex="0" href="../category/224-printer-dictionary.html">22.4 Printer Dictionary</a><button aria-label="Expand sidebar category '22.4 Printer Dictionary'" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="intro.html">intro</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-23/cd-b-reader-concepts.html">23. Reader</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-24/ce-b-system-construction-concepts.html">24. System Construction</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-25/cf-b-the-external-environment.html">25. External Environment</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../environments.html">26. Environments</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../meta-object-protocol.html">27. Meta Object Protocol</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../data-structures.html">28. Data Structures</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../portability/trivial-packages.html">29. Portability</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../dictionary-entries.html">dictionary-entries</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../chap-26/intro.html">Glossary</a></div></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="../index.html"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">22. Printer</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">22.2 The Lisp Pretty Printer</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>22.2 The Lisp Pretty Printer</h1>
|
||
<!-- -->
|
||
<!-- -->
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2221-pretty-printer-concepts">22.2.1 Pretty Printer Concepts<a href="cc-c-the-lisp-pretty-printer.html#2221-pretty-printer-concepts" class="hash-link" aria-label="Direct link to 22.2.1 Pretty Printer Concepts" title="Direct link to 22.2.1 Pretty Printer Concepts"></a></h2>
|
||
<!-- -->
|
||
<p>The facilities provided by the <span><i>pretty printer</i></span> permit <span><i>programs</i></span> to redefine the way in which <span><i>code</i></span> is displayed, and allow the full power of <em>pretty printing</em> to be applied to complex combinations of data structures.</p>
|
||
<p>Whether any given style of output is in fact “pretty” is inherently a somewhat subjective issue. However, since the effect of the <span><i>pretty printer</i></span> can be customized by <span><i>conforming programs</i></span>, the necessary flexibility is provided for individual <span><i>programs</i></span> to achieve an arbitrary degree of aesthetic control.</p>
|
||
<p>By providing direct access to the mechanisms within the pretty printer that make dynamic decisions about layout, the macros and functions <span><b>pprint-logical-block</b></span>, <span><b>pprint-newline</b></span>, and <span><b>pprint-indent</b></span> make it possible to specify pretty printing layout rules as a part of any function that produces output. They also make it very easy for the detection of circularity and sharing, and abbreviation based on length and nesting depth to be supported by the function.</p>
|
||
<p>The <span><i>pretty printer</i></span> is driven entirely by dispatch based on the <span><i>value</i></span> of <span><b>*print-pprint-dispatch*</b></span>. The <span><i>function</i></span> <span><b>set-pprint-dispatch</b></span> makes it possible for <span><i>conforming programs</i></span> to associate new pretty printing functions with a <span><i>type</i></span>.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="22211-dynamic-control-of-the-arrangement-of-output">22.2.1.1 Dynamic Control of the Arrangement of Output<a href="cc-c-the-lisp-pretty-printer.html#22211-dynamic-control-of-the-arrangement-of-output" class="hash-link" aria-label="Direct link to 22.2.1.1 Dynamic Control of the Arrangement of Output" title="Direct link to 22.2.1.1 Dynamic Control of the Arrangement of Output"></a></h3>
|
||
<!-- -->
|
||
<p>The actions of the <span><i>pretty printer</i></span> when a piece of output is too large to fit in the space available can be precisely controlled. Three concepts underlie the way these operations work—<span><i>logical blocks</i></span>, <span><i>conditional newlines</i></span>, and <span><i>sections</i></span>. Before proceeding further, it is important to define these terms.</p>
|
||
<p>The first line of Figure 22–3 shows a schematic piece of output. Each of the characters in the output is represented by “-”. The positions of conditional newlines are indicated by digits. The beginnings and ends of logical blocks are indicated by “<” and “>” respectively.</p>
|
||
<p>The output as a whole is a logical block and the outermost section. This section is indicated by the 0’s on the second line of Figure 1. Logical blocks nested within the output are specified by the macro <span><b>pprint-logical-block</b></span>. Conditional newline positions are specified by calls to <span><b>pprint-newline</b></span>. Each conditional newline defines two sections (one before it and one after it) and is associated with a third (the section immediately containing it).</p>
|
||
<p>The section after a conditional newline consists of: all the output up to, but not including, (a) the next conditional newline immediately contained in the same logical block; or if (a) is not applicable, (b) the next newline that is at a lesser level of nesting in logical blocks; or if (b) is not applicable, (c) the end of the output.</p>
|
||
<p>The section before a conditional newline consists of: all the output back to, but not including, (a) the previous conditional newline that is immediately contained in the same logical block; or if (a)</p>
|
||
<p>is not applicable, (b) the beginning of the immediately containing logical block. The last four lines in Figure 1 indicate the sections before and after the four conditional newlines.</p>
|
||
<p>The section immediately containing a conditional newline is the shortest section that contains the conditional newline in question. In Figure 22–3, the first conditional newline is immediately contained in the section marked with 0’s, the second and third conditional newlines are immediately contained in the section before the fourth conditional newline, and the fourth conditional newline is immediately contained in the section after the first conditional newline.</p>
|
||
<p><-1–-<–<–2–-3->–4–>-></p>
|
||
<p>000000000000000000000000000</p>
|
||
<p>11 111111111111111111111111</p>
|
||
<p>22 222</p>
|
||
<p>333 3333</p>
|
||
<p>44444444444444 44444</p>
|
||
<p><strong>Figure 22–3. Example of Logical Blocks, Conditional Newlines, and Sections</strong></p>
|
||
<p>Whenever possible, the pretty printer displays the entire contents of a section on a single line. However, if the section is too long to fit in the space available, line breaks are inserted at conditional newline positions within the section.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="22212-format-directive-interface">22.2.1.2 Format Directive Interface<a href="cc-c-the-lisp-pretty-printer.html#22212-format-directive-interface" class="hash-link" aria-label="Direct link to 22.2.1.2 Format Directive Interface" title="Direct link to 22.2.1.2 Format Directive Interface"></a></h3>
|
||
<!-- -->
|
||
<p>The primary interface to operations for dynamically determining the arrangement of output is provided through the functions and macros of the pretty printer. Figure 22–4 shows the defined names related to <em>pretty printing</em>.</p>
|
||
<p>|</p><p><strong>*print-lines* pprint-dispatch pprint-pop *print-miser-width* pprint-exit-if-list-exhausted pprint-tab *print-pprint-dispatch* pprint-fill pprint-tabular *print-right-margin* pprint-indent set-pprint-dispatch copy-pprint-dispatch pprint-linear write</strong> </p><p><strong>format pprint-logical-block</strong> </p><p><strong>formatter pprint-newline</strong></p>|<p></p>
|
||
<p>| :- |</p>
|
||
<p><strong>Figure 22–4. Defined names related to pretty printing.</strong></p>
|
||
<p>Figure 22–5 identifies a set of <span><i>format directives</i></span> which serve as an alternate interface to the same pretty printing operations in a more textually compact form.</p>
|
||
<p>|</p><p>~I ~W ~<...~:> </p><p>~<!-- -->:T<!-- --> ~/.../ ~</p>|<p></p>
|
||
<p>| :- |</p>
|
||
<p><strong>Figure 22–5. Format directives related to Pretty Printing</strong></p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="22213-compiling-format-strings">22.2.1.3 Compiling Format Strings<a href="cc-c-the-lisp-pretty-printer.html#22213-compiling-format-strings" class="hash-link" aria-label="Direct link to 22.2.1.3 Compiling Format Strings" title="Direct link to 22.2.1.3 Compiling Format Strings"></a></h3>
|
||
<!-- -->
|
||
<p>A <span><i>format string</i></span> is essentially a program in a special-purpose language that performs printing, and that is interpreted by the <span><i>function</i></span> <span><b>format</b></span>. The <span><b>formatter</b></span> <span><i>macro</i></span> provides the efficiency of using a <span><i>compiled function</i></span> to do that same printing but without losing the textual compactness of <span><i>format strings</i></span>.</p>
|
||
<p>A <span><i>format control</i></span> is either a <span><i>format string</i></span> or a <span><i>function</i></span> that was returned by the the <span><b>formatter</b></span> <span><i>macro</i></span>.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="22214-pretty-print-dispatch-tables">22.2.1.4 Pretty Print Dispatch Tables<a href="cc-c-the-lisp-pretty-printer.html#22214-pretty-print-dispatch-tables" class="hash-link" aria-label="Direct link to 22.2.1.4 Pretty Print Dispatch Tables" title="Direct link to 22.2.1.4 Pretty Print Dispatch Tables"></a></h3>
|
||
<!-- -->
|
||
<p>A <span><i>pprint dispatch table</i></span> is a mapping from keys to pairs of values. Each key is a <span><i>type specifier</i></span> . The values associated with a key are a “function” (specifically, a <span><i>function designator</i></span> or <span><b>nil</b></span>) and a “numerical priority” (specifically, a <em>real</em>). Basic insertion and retrieval is done based on the keys with the equality of keys being tested by <span><b>equal</b></span>.</p>
|
||
<p>When <span><b>*print-pretty*</b></span> is <span><i>true</i></span>, the <span><i>current pprint dispatch table</i></span> (in <span><b>*print-pprint-dispatch*</b></span>) controls how <span><i>objects</i></span> are printed. The information in this table takes precedence over all other mechanisms for specifying how to print <span><i>objects</i></span>. In particular, it has priority over user-defined <span><b>print-object</b></span> <span><i>methods</i></span> because the <span><i>current pprint dispatch table</i></span> is consulted first.</p>
|
||
<p>The function is chosen from the <span><i>current pprint dispatch table</i></span> by finding the highest priority function that is associated with a <span><i>type specifier</i></span> that matches the <span><i>object</i></span>; if there is more than one such function, it is <span><i>implementation-dependent</i></span> which is used.</p>
|
||
<p>However, if there is no information in the table about how to <span><i>pretty print</i></span> a particular kind of <span><i>object</i></span>, a <span><i>function</i></span> is invoked which uses <span><b>print-object</b></span> to print the <span><i>object</i></span>. The value of <span><b>*print-pretty*</b></span> is still <span><i>true</i></span> when this function is <em>called</em>, and individual methods for <span><b>print-object</b></span> might still elect to produce output in a special format conditional on the <span><i>value</i></span> of <span><b>*print-pretty*</b></span>.</p>
|
||
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="22215-pretty-printer-margins">22.2.1.5 Pretty Printer Margins<a href="cc-c-the-lisp-pretty-printer.html#22215-pretty-printer-margins" class="hash-link" aria-label="Direct link to 22.2.1.5 Pretty Printer Margins" title="Direct link to 22.2.1.5 Pretty Printer Margins"></a></h3>
|
||
<!-- -->
|
||
<p>A primary goal of pretty printing is to keep the output between a pair of margins. The column where the output begins is taken as the left margin. If the current column cannot be determined at the time output begins, the left margin is assumed to be zero. The right margin is controlled by <span><b>*print-right-margin*</b></span>.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2222-examples-of-using-the-pretty-printer">22.2.2 Examples of using the Pretty Printer<a href="cc-c-the-lisp-pretty-printer.html#2222-examples-of-using-the-pretty-printer" class="hash-link" aria-label="Direct link to 22.2.2 Examples of using the Pretty Printer" title="Direct link to 22.2.2 Examples of using the Pretty Printer"></a></h2>
|
||
<!-- -->
|
||
<div class="language-lisp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-lisp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">As an example of the interaction of logical blocks, conditional newlines, and indentation, consider the function simple-pprint-defun below. This function prints out lists whose *cars* are **defun** in the standard way assuming that the list has exactly length </span><span class="token number" style="color:#36acaa">4.</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">simple-pprint-defun</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*standard-output</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*</span><span class="token defun arguments"> </span><span class="token defun arguments argument variable" style="color:#36acaa">list</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-logical-block</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\*standard-output\* list </span><span class="token lisp-property property" style="color:#36acaa">:prefix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"("</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:suffix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">")"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">first</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-newline</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:miser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-indent</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:current</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">second</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-newline</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:fill</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">third</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-indent</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:block</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-newline</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:linear</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">fourth</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Suppose that one evaluates the following: </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">simple-pprint-defun</span><span class="token plain"> \*standard-output\* ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">prod</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments argument variable" style="color:#36acaa">x</span><span class="token defun arguments"> </span><span class="token defun arguments argument variable" style="color:#36acaa">y</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\* x y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If the line width available is greater than or equal to 26, then all of the output appears on one line. If the line width available is reduced to 25, a line break is inserted at the linear-style conditional newline before the *expression* </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\* x y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">, producing the output shown. The </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-indent</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:block</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> causes </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\* x y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> to be printed at a relative indentation of </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> in the logical block. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">DEFUN</span><span class="token plain"> PROD </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">X</span><span class="token plain"> Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\* X Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If the line width available is 15, a line break is also inserted at the fill style conditional newline before the argument list. The call on </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-indent</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:current</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> causes the argument list to line up under the function name. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">DEFUN</span><span class="token plain"> PROD </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">X</span><span class="token plain"> Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\* X Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If **\*print-miser-width\*** were greater than or equal to 14, the example output above would have been as follows, because all indentation changes are ignored in miser mode and line breaks are inserted at miser-style conditional newlines. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">DEFUN</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> PROD </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">X</span><span class="token plain"> Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\* X Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">As an example of a per-line prefix, consider that evaluating the following produces the output shown with a line width of </span><span class="token number" style="color:#36acaa">20</span><span class="token plain"> and **\*print-miser-width\*** of **nil**. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-logical-block</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\*standard-output\* </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:per-line-prefix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">";;; "</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">simple-pprint-defun</span><span class="token plain"> \*standard-output\* ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">prod</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments argument variable" style="color:#36acaa">x</span><span class="token defun arguments"> </span><span class="token defun arguments argument variable" style="color:#36acaa">y</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\* x y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token heading comment title" style="color:#999988;font-style:italic">;;; (DEFUN PROD </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token heading comment title" style="color:#999988;font-style:italic">;;; (X Y) </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token heading comment title" style="color:#999988;font-style:italic">;;; (\* X Y)) </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">As a more complex </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> realistic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> example, consider the function pprint-let below. This specifies how to print a **let** *form* in the traditional style. It is more complex than the example above, because it has to deal with nested structure. Also, unlike the example above it contains complete code to readably print any possible list that begins with the *symbol* **let**. The outermost **pprint-logical-block** </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">*form* handles the printing of the input list as a whole and specifies that parentheses should be printed in the output. The second **pprint-logical-block** *form* handles the list of binding pairs. Each pair in the list is itself printed by the innermost **pprint-logical-block**. </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">A</span><span class="token plain"> **loop** *form* is used instead of merely decomposing the pair into two *objects* so that readable output will be produced no matter whether the list corresponding to the pair has one element, two elements, or </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">being</span><span class="token plain"> malformed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> has more than two elements.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> A space and a fill-style conditional newline are placed after each pair except the last. The loop at the end of the topmost **pprint-logical-block** *form* prints out the forms in the body of the **let** *form* separated by spaces and linear-style conditional newlines. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">pprint-let</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*standard-output</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*</span><span class="token defun arguments"> </span><span class="token defun arguments argument variable" style="color:#36acaa">list</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-logical-block</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> list </span><span class="token lisp-property property" style="color:#36acaa">:prefix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"("</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:suffix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">")"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-pop</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-exit-if-list-exhausted</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-logical-block</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-pop</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:prefix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"("</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:suffix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">")"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-exit-if-list-exhausted</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">loop</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-logical-block</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-pop</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:prefix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"("</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:suffix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">")"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-exit-if-list-exhausted</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">loop</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-pop</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-exit-if-list-exhausted</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-newline</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:linear</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-exit-if-list-exhausted</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-newline</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:fill</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-indent</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:block</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">loop</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-exit-if-list-exhausted</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-newline</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:linear</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-pop</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Suppose that one evaluates the following with **\*print-level\*** being 4, and **\*print-circle\*** being *true*. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-let</span><span class="token plain"> \*standard-output\* </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ’#1=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">x</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\*print-length\* </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">f</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">g</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">z</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">k</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">car</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">setq</span><span class="token plain"> x </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">sqrt</span><span class="token plain"> z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> #1#</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If the line length is greater than or equal to 77, the output produced appears on one line. However, </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">if the line length is 76, line breaks are inserted at the linear-style conditional newlines separating the forms in the body and the output below is produced. Note that, the degenerate binding pair x is printed readably even though it fails to be a list</span><span class="token comment" style="color:#999988;font-style:italic">; a depth abbreviation marker is printed in place of (g 3); the binding pair (z . 2) is printed readably even though it is not a proper list; and appropriate circularity markers are printed. </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#1=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">LET</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">X</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\*PRINT-LENGTH\* </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">F</span><span class="token plain"> #</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">Z</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">K</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">CAR</span><span class="token plain"> Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">SETQ</span><span class="token plain"> X </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">SQRT</span><span class="token plain"> Z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #1#</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If the line length is reduced to 35, a line break is inserted at one of the fill-style conditional newlines separating the binding pairs. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#1=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">LET</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">X</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\*PRINT-PRETTY\* </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">F</span><span class="token plain"> #</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">Z</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">K</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">CAR</span><span class="token plain"> Y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">SETQ</span><span class="token plain"> X </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">SQRT</span><span class="token plain"> Z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #1#</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Suppose that the line length is further reduced to </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"> and **\*print-length\*** is set to </span><span class="token number" style="color:#36acaa">3.</span><span class="token plain"> In this situation, line breaks are inserted after both the first and second binding pairs. In addition, the second binding pair is itself broken across two lines. Clause </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">b</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> of the description of fill-style conditional newlines </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">see</span><span class="token plain"> the *function* **pprint-newline**</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> prevents the binding pair </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">z</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> from being printed at the end of the third line. Note that the length abbreviation hides the circularity from view and therefore the printing of circularity markers disappears. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">LET</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">X</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">\*PRINT-LENGTH\* </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">F</span><span class="token plain"> #</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">Z</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> ...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">SETQ</span><span class="token plain"> X </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">SQRT</span><span class="token plain"> Z</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The next function prints a vector using “#</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">” notation. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">pprint-vector</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*standard-output</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*</span><span class="token defun arguments"> </span><span class="token defun arguments argument variable" style="color:#36acaa">v</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-logical-block</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:prefix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#("</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:suffix</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">")"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">end</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">length</span><span class="token plain"> v</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">i</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">when</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">plusp</span><span class="token plain"> end</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">loop</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-pop</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">aref</span><span class="token plain"> v i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">incf</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> end</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write-char</span><span class="token plain"> #\Space</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-newline</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:fill</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Evaluating the following with a line length of </span><span class="token number" style="color:#36acaa">15</span><span class="token plain"> produces the output shown. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-vector</span><span class="token plain"> \*standard-output\* ’#</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">12</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">34</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">567</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">9012</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">34</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">567</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">89</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">23</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">12</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">34</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">567</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token number" style="color:#36acaa">9012</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">34</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">567</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token number" style="color:#36acaa">89</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">23</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">As examples of the convenience of specifying pretty printing with *format strings*, consider that the functions simple-pprint-defun and pprint-let used as examples above can be compactly defined as follows. </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">The</span><span class="token plain"> function pprint-vector cannot be defined using **format** because the data structure it traverses is not a list.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">simple-pprint-defun</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*standard-output</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*</span><span class="token defun arguments"> </span><span class="token defun arguments argument variable" style="color:#36acaa">list</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">format</span><span class="token plain"> T </span><span class="token string" style="color:#e3116c">"~:<~</span><span class="token string argument" style="color:#e3116c">W</span><span class="token string" style="color:#e3116c"> ~@ ~:I~</span><span class="token string argument" style="color:#e3116c">W</span><span class="token string" style="color:#e3116c"> ~: ~W~1</span><span class="token string argument" style="color:#e3116c">I</span><span class="token string" style="color:#e3116c"> ~ ~W~:>"</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">pprint-let</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*standard-output</span><span class="token defun arguments">\</span><span class="token defun arguments argument variable" style="color:#36acaa">*</span><span class="token defun arguments"> </span><span class="token defun arguments argument variable" style="color:#36acaa">list</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">format</span><span class="token plain"> T </span><span class="token string" style="color:#e3116c">"~:<~W~<i><sup>∧</sup></i>~:<~@\&#123;~:<~@\&#123;~W~<i><sup>∧</sup></i>~ ~\&#125;~:>~<i><sup>∧</sup></i>~: ~\&#125;~:>~1I~@\&#123;~<i><sup>∧</sup></i>~ ~W~\&#125;~:>"</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">In the following example, the first *form* restores **\*print-pprint-dispatch\*** to the equivalent of its initial value. The next two forms then set up a special way to pretty print ratios. Note that the more specific *type specifier* has to be associated with a higher priority. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">setq</span><span class="token plain"> \*print-pprint-dispatch\* </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">copy-pprint-dispatch</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">set-pprint-dispatch</span><span class="token plain"> ’ratio </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">s</span><span class="token lambda arguments"> </span><span class="token lambda arguments argument variable" style="color:#36acaa">obj</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">format</span><span class="token plain"> s </span><span class="token string" style="color:#e3116c">"#.(/ ~</span><span class="token string argument" style="color:#e3116c">W</span><span class="token string" style="color:#e3116c"> ~W)"</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">numerator</span><span class="token plain"> obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">denominator</span><span class="token plain"> obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">set-pprint-dispatch</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> ratio </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">satisfies</span><span class="token plain"> minusp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">s</span><span class="token lambda arguments"> </span><span class="token lambda arguments argument variable" style="color:#36acaa">obj</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">format</span><span class="token plain"> s </span><span class="token string" style="color:#e3116c">"#.(</span><span class="token string argument" style="color:#e3116c">-</span><span class="token string" style="color:#e3116c"> (/ ~</span><span class="token string argument" style="color:#e3116c">W</span><span class="token string" style="color:#e3116c"> ~W))"</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">numerator</span><span class="token plain"> obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">denominator</span><span class="token plain"> obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> \5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">1/3 -2/3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">#.</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> #.</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The following two *forms* illustrate the definition of pretty printing functions for types of *code*. The first *form* illustrates how to specify the traditional method for printing quoted objects using *single-quote*. Note the care taken to ensure that data lists that happen to begin with **quote** will be printed readably. The second form specifies that lists beginning with the symbol my-let should print the same way that lists beginning with **let** print when the initial *pprint dispatch table* is in effect. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">set-pprint-dispatch</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">cons</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">member</span><span class="token plain"> quote</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">s</span><span class="token lambda arguments"> </span><span class="token lambda arguments argument variable" style="color:#36acaa">list</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">consp</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">cdr</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">null</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">cddr</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">funcall</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">formatter</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"’~W"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> s </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">cadr</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-fill</span><span class="token plain"> s list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">set-pprint-dispatch</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">cons</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">member</span><span class="token plain"> my-let</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint-dispatch</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">let</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The next example specifies a default method for printing lists that do not correspond to function calls. Note that the functions **pprint-linear**, **pprint-fill**, and **pprint-tabular** are all defined with optional *colon-p* and *at-sign-p* arguments so that they can be used as **pprint dispatch functions** as well as ~/.../ functions. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">set-pprint-dispatch</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">cons</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> symbol </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">satisfies</span><span class="token plain"> fboundp</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #’pprint-fill </span><span class="token number" style="color:#36acaa">-5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">;; Assume a line length of 9 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">pprint</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> b c d e f g h i j k</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> b c d </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> e f g h </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> i j k</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">This final example shows how to define a pretty printing function for a user defined data structure. </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">defstruct</span><span class="token plain"> family mom kids</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">set-pprint-dispatch</span><span class="token plain"> ’family </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">s</span><span class="token lambda arguments"> </span><span class="token lambda arguments argument variable" style="color:#36acaa">f</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">funcall</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">formatter</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"~@<#<~;~</span><span class="token string argument" style="color:#e3116c">W</span><span class="token string" style="color:#e3116c"> and ~2I~ ~/pprint-fill/~;>~:>"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> s </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">family-mom</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">family-kids</span><span class="token plain"> f</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The pretty printing function for the structure family specifies how to adjust the layout of the output so that it can fit aesthetically into a variety of line widths. In addition, it obeys the printer control variables **\*print-level\***, **\*print-length\***, **\*print-lines\***, **\*print-circle\*** and **\*print-escape\***, and can tolerate several different kinds of malformity in the data structure. The output below shows what is printed out with a right margin of 25, **\*print-pretty\*** being *true*, **\*print-escape\*** being *false*, and a malformed kids list. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">write</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">list</span><span class="token plain"> ’principal-family </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-family</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:mom</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Lucy"</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:kids</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Mark"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Bob"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Dan"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:right-margin</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:pretty</span><span class="token plain"> T </span><span class="token lisp-property property" style="color:#36acaa">:escape</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:miser-width</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">PRINCIPAL-FAMILY</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> #<Lucy and </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Mark Bob </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> Dan></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Note that a pretty printing function for a structure is different from the structure’s **print-object** *method*. While **print-object** *methods* are permanently associated with a structure, pretty printing functions are stored in *pprint dispatch tables* and can be rapidly changed to reflect different printing needs. If there is no pretty printing function for a structure in the current *pprint dispatch table*, its **print-object** *method* is used instead. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2223-notes-about-the-pretty-printer">22.2.3 Notes about the Pretty Printer<a href="cc-c-the-lisp-pretty-printer.html#2223-notes-about-the-pretty-printer" class="hash-link" aria-label="Direct link to 22.2.3 Notes about the Pretty Printer" title="Direct link to 22.2.3 Notes about the Pretty Printer"></a></h2>
|
||
<!-- -->
|
||
<!-- -->
|
||
<p>For a background reference to the abstract concepts detailed in this section, see <em>XP: A Common Lisp Pretty Printing System</em>. The details of that paper are not binding on this document, but may be helpful in establishing a conceptual basis for understanding this material.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/lisp-docs/cl-language-reference/tree/main/docs/chap-22/cc-c-the-lisp-pretty-printer.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">Last updated<!-- --> by <b>daninus14</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="cc-b-the-lisp-printer.html"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">22.1 The Lisp Printer</div></a><a class="pagination-nav__link pagination-nav__link--next" href="cc-d-formatted-output.html"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">22.3 Formatted Output</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="cc-c-the-lisp-pretty-printer.html#2221-pretty-printer-concepts" class="table-of-contents__link toc-highlight">22.2.1 Pretty Printer Concepts</a><ul><li><a href="cc-c-the-lisp-pretty-printer.html#22211-dynamic-control-of-the-arrangement-of-output" class="table-of-contents__link toc-highlight">22.2.1.1 Dynamic Control of the Arrangement of Output</a></li><li><a href="cc-c-the-lisp-pretty-printer.html#22212-format-directive-interface" class="table-of-contents__link toc-highlight">22.2.1.2 Format Directive Interface</a></li><li><a href="cc-c-the-lisp-pretty-printer.html#22213-compiling-format-strings" class="table-of-contents__link toc-highlight">22.2.1.3 Compiling Format Strings</a></li><li><a href="cc-c-the-lisp-pretty-printer.html#22214-pretty-print-dispatch-tables" class="table-of-contents__link toc-highlight">22.2.1.4 Pretty Print Dispatch Tables</a></li><li><a href="cc-c-the-lisp-pretty-printer.html#22215-pretty-printer-margins" class="table-of-contents__link toc-highlight">22.2.1.5 Pretty Printer Margins</a></li></ul></li><li><a href="cc-c-the-lisp-pretty-printer.html#2222-examples-of-using-the-pretty-printer" class="table-of-contents__link toc-highlight">22.2.2 Examples of using the Pretty Printer</a></li><li><a href="cc-c-the-lisp-pretty-printer.html#2223-notes-about-the-pretty-printer" class="table-of-contents__link toc-highlight">22.2.3 Notes about the Pretty Printer</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a href="../../docs/tutorial.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Common Lisp Tutorial</a></li><li class="footer__item"><a href="../index.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Common Lisp Technical Reference</a></li><li class="footer__item"><a href="../../docs/help.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Help</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/common-lisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://discord.gg/hhk46CE" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.reddit.com/r/common_lisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">Reddit<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://irclog.tymoon.eu/libera/commonlisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">IRC<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="../../blog.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Blog</a></li><li class="footer__item"><a href="https://github.com/lisp-docs/lisp-docs.github.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Tutorial and General Content GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/lisp-docs/cl-language-reference/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Technical Reference GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="../../docs/contribute.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Contribute to the Docs</a></li></ul></div><div class="col footer__col"><div class="footer__title">Common Lisp Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a href="../../docs/about.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">About</a></li><li class="footer__item"><a href="../../docs/whylisp.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Why Lisp</a></li><li class="footer__item"><a href="../../docs/getting-started.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Getting Started</a></li><li class="footer__item"><a href="../../docs/faq.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">FAQ</a></li><li class="footer__item"><a href="../../docs/help.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Getting Help</a></li><li class="footer__item"><a href="../../docs/howto.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">How To Guides</a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2024 Common Lisp Docs, MIT License (see GitHub Repo).</div></div></div></footer></div>
|
||
</body>
|
||
</html> |