1
0
Fork 0
cl-sites/lisp-docs.github.io/docs/tutorial/projects/guide_to_packages.html

107 lines
No EOL
153 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-tutorial/projects/guide_to_packages" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">The Complete Idiots Guide to Common Lisp Packages | Common Lisp Docs</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/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" name="twitter:image" content="https://lisp-docs.github.io/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" property="og:url" content="https://lisp-docs.github.io/docs/tutorial/projects/guide_to_packages"><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="The Complete Idiots Guide to Common Lisp Packages | Common Lisp Docs"><meta data-rh="true" name="description" content="Erann Gat"><meta data-rh="true" property="og:description" content="Erann Gat"><link data-rh="true" rel="icon" href="../../../img/favicon.ico"><link data-rh="true" rel="canonical" href="guide_to_packages.html"><link data-rh="true" rel="alternate" href="guide_to_packages.html" hreflang="en"><link data-rh="true" rel="alternate" href="guide_to_packages.html" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://C1F2Q5VM6X-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="../../../blog/rss.xml" title="Common Lisp Docs RSS Feed">
<link rel="alternate" type="application/atom+xml" href="../../../blog/atom.xml" title="Common Lisp Docs Atom Feed">
<link rel="search" type="application/opensearchdescription+xml" title="Common Lisp Docs" href="../../../opensearch.xml"><link rel="stylesheet" href="../../../assets/css/styles.d316d1e5.css">
<script src="../../../assets/js/runtime~main.8ea071ee.js" defer="defer"></script>
<script src="../../../assets/js/main.8eecaa6d.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="guide_to_packages.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 class="navbar__brand" href="../../../index.html"><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 aria-current="page" class="navbar__item navbar__link navbar__link--active" href="../../tutorial.html">Tutorial</a><a href="../../../cl-language-reference/index.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Technical Reference</a><a class="navbar__item navbar__link" href="../../whylisp.html">Why Lisp?</a><a class="navbar__item navbar__link" href="../../howto.html">Guides</a></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="../../contribute.html">Contribute!</a><a class="navbar__item navbar__link" href="../../help.html">Getting Help</a><a class="navbar__item navbar__link" href="../../about.html">About</a><a class="navbar__item navbar__link" href="../../../blog.html">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="../../tutorial.html">Tutorial Introduction</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../for_beginners.html">Beginner Programmers</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" aria-expanded="false" href="../for_programmers.html">Experienced Programmers</a><button aria-label="Expand sidebar category &#x27;Experienced Programmers&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../macros.html">Macros</a></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--active" aria-expanded="true" href="../projects.html">Structuring projects</a><button aria-label="Collapse sidebar category &#x27;Structuring projects&#x27;" type="button" class="clean-btn menu__caret"></button></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 menu__link--active" aria-current="page" tabindex="0" href="guide_to_packages.html">The Complete Idiots Guide to Common Lisp Packages</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="packages-systems.html">Packages and Systems</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="package_inferred.html">Package Inferred Systems</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="structuring_large_projects.html">Structuring Large Projects</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../documentation.html">Documenting your Code</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../motivation.html">Motivation</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../using-cl-implementation.html">Using a Common Lisp Implementation</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../informal-introduction-to-lisp.html">An Informal Introduction to Common Lisp</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../control-flows.html">Control Flow</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../data-structures.html">Data Structures</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../processing-data.html">Processing Data</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../io.html">Input and Output</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../errors.html">Dealing with Errors</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../classes-methods.html">Classes and Methods</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" aria-expanded="false" href="../../category/advanced-topics.html">Advanced Topics</a><button aria-label="Expand sidebar category &#x27;Advanced Topics&#x27;" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="https://lisp-docs.github.io/docs/tutorial/index">Index</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../glossary.html">Glossary</a></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 itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="../projects.html"><span itemprop="name">Structuring projects</span></a><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">The Complete Idiots Guide to Common Lisp Packages</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>The Complete Idiots Guide to Common Lisp Packages</h1>
<blockquote>
<p>Erann Gat</p>
<p>Copyright © 2003 by the author. Permission is hereby granted for non-commercial use provided this notice is retained.</p>
<p>Source: <a href="https://flownet.com/ron/packages.pdf" target="_blank" rel="noopener noreferrer">https://flownet.com/ron/packages.pdf</a></p>
<p>Version 1.2</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-introduction">1. Introduction<a href="guide_to_packages.html#1-introduction" class="hash-link" aria-label="Direct link to 1. Introduction" title="Direct link to 1. Introduction"></a></h2>
<p>When coding a large project with multiple programmers two different programmers will often want to use the same name for two different purposes. It is possible to solve this problem using a naming convention, e.g. Bob prefixes all his names with “BOB-“ and Jane prefixes all her names with “JANE-“. This is in fact how Scheme addresses this problem (or fails to address it as the case may be). Common Lisp provides a language mechanism called packages for segregating namespaces. Heres an example of how packages work:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-package</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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-package</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">foo</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 punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;This is Bob&#x27;s foo&quot;</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">FOO</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">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">foo</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 punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;This is Jane&#x27;s foo&quot;</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">FOO</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">foo</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 string" style="color:#e3116c">&quot;This is Jane&#x27;s foo&quot;</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">foo</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 string" style="color:#e3116c">&quot;This is Bob&#x27;s foo&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>(NOTE: Code examples are cut-and-pasted from Macintosh Common Lisp (MCL). The command prompt in MCL is a question mark.) Bob and Jane each have a function named FOO that does something different, and they dont conflict with each other.</p>
<p>What if Bob wants to use a function written by Jane? There are several ways he can do it. One is to use a special syntax to indicate that a different package is to be used:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:foo</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 string" style="color:#e3116c">&quot;This is Jane&#x27;s foo&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Another is to import what he wants to use into his own package. Of course, he wont want to import Janes FOO function because then it would conflict with his own, but if Jane had a BAZ function that he wanted to use by simply typing (BAZ) instead of (JANE::BAZ) he could do it like this:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">baz</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 punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;This is Jane&#x27;s baz&quot;</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">BAZ</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">import</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:baz</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">T</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">baz</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 string" style="color:#e3116c">&quot;This is Jane&#x27;s baz&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Alas, things dont always go quite so smoothly:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">bar</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 punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;This is Jane&#x27;s bar&quot;</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">BAR</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">bar</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">&gt; Error: Undefined function BAR called with arguments </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 plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; While executing: </span><span class="token string" style="color:#e3116c">&quot;Unknown&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; Type Command-/ to continue, Command-. to abort.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; If continued: Retry applying BAR to NIL.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">See the Restarts… menu item for further choices.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> &gt;</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">; Oops! Forgot to import.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Aborted</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">import</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:bar</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">&gt; Error: Importing JANE:</span><span class="token lisp-property property" style="color:#36acaa">:BAR</span><span class="token plain"> to #&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt; would conflict with</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">symbol BAR </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">&gt; While executing: CCL:</span><span class="token lisp-property property" style="color:#36acaa">:IMPORT-1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; Type Command-/ to continue, Command-. to abort.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; If continued: Ignore attempt to import JANE:</span><span class="token lisp-property property" style="color:#36acaa">:BAR</span><span class="token plain"> to #&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">See the Restarts… menu item for further choices.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> &gt;</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">; Huh?</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>
<p>To understand why this happened, what to do about it, and many of the other subtleties and surprises of packages, it is important to understand what packages actually do and how they work. For example, it is important to understand that when you type (import jane::foo) you are importing the symbol JANE::FOO, not the function associated with that symbol. It is important to understand the difference, and so we have to start with a review of some basic Lisp concepts.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-symbols-values-and-the-read-eval-print-loop">2. Symbols, Values, and the READ-EVAL-PRINT Loop<a href="guide_to_packages.html#2-symbols-values-and-the-read-eval-print-loop" class="hash-link" aria-label="Direct link to 2. Symbols, Values, and the READ-EVAL-PRINT Loop" title="Direct link to 2. Symbols, Values, and the READ-EVAL-PRINT Loop"></a></h2>
<p>Lisp operates in a READ-EVAL-PRINT loop. Most of the interesting stuff happens in the EVAL phase, but when it comes to packages interesting stuff happens in all three phases, and its important to understand what happens when. In particular, some of the processing related to packages can change the state of the Lisp system at READ time, which can in turn result in some surprising (and often annoying) behavior, like the last example in the previous section. A package is a collection of Lisp symbols, so to understand packages you first have to understand symbols. A symbol is a perfectly ordinary Lisp data structure, just as lists, numbers, strings, etc. are. There are built-in Lisp functions for creating and manipulating symbols. For example, there is a function called GENTEMP that creates new symbols:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">gentemp</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">T1</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">gentemp</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">T2</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</span><span class="token plain"> x </span><span class="token number" style="color:#36acaa">123</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">; Note the use of SET, not SETQ or SETF</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">123</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? x</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">T2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? t2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">123</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>(If you are not familiar with the SET function now would be a good time to look it up because if you dont you will be lost in short order.) The symbols created by GENTEMP behave in all respects like symbols that you get just by typing in their names. You have only limited control over the name of a symbol created by GENTEMP. You can pass it an optional prefix string that, but the system will add a suffix and you have to take whatever it decides to give you. If you want to make a symbol with a particular name you have to use a different function, MAKE-SYMBOL:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-symbol</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;MY-SYMBOL&quot;</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">:MY-SYMBOL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Hm, thats odd. Whats that funny-looking “#:” doing there? To understand this we have to dig a little deeper into the guts of symbols.</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">setq</span><span class="token plain"> symbol1 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-symbol</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;MY-SYMBOL&quot;</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">:MY-SYMBOL</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"> symbol2 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-symbol</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;MY-SYMBOL&quot;</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">:MY-SYMBOL</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"> symbol3 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;my-symbol</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">MY-SYMBOL</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"> symbol4 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;my-symbol</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">MY-SYMBOL</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">eq</span><span class="token plain"> symbol1 symbol2</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">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">eq</span><span class="token plain"> symbol3 symbol4</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">T</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>As you see, MAKE-SYMBOL can make multiple distinct symbols that have the same name, whereas symbols that the reader gives you by typing the same name on two different occasions are the same symbol. This property of symbol identity is very important. It is what insures that the FOO you type in one place is the same FOO as the FOO you type someplace else. If this were not so you could end up with some very weird results:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">set</span><span class="token plain"> symbol1 </span><span class="token number" style="color:#36acaa">123</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 number" style="color:#36acaa">123</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</span><span class="token plain"> symbol2 </span><span class="token number" style="color:#36acaa">456</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 number" style="color:#36acaa">456</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"> code-fragment-1 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">list</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;print</span><span class="token plain"> symbol1</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">PRINT</span><span class="token plain"> #</span><span class="token lisp-property property" style="color:#36acaa">:MY-SYMBOL</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"> code-fragment-2 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">list</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;print</span><span class="token plain"> symbol2</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">PRINT</span><span class="token plain"> #</span><span class="token lisp-property property" style="color:#36acaa">:MY-SYMBOL</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">eval</span><span class="token plain"> code-fragment-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 number" style="color:#36acaa">123</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">123</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">eval</span><span class="token plain"> code-fragment-2</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 number" style="color:#36acaa">456</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">456</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">Contrast this with:</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</span><span class="token plain"> symbol3 </span><span class="token number" style="color:#36acaa">123</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 number" style="color:#36acaa">123</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</span><span class="token plain"> symbol4 </span><span class="token number" style="color:#36acaa">456</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 number" style="color:#36acaa">456</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"> code-fragment-3 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">list</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;print</span><span class="token plain"> symbol3</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">PRINT</span><span class="token plain"> MY-SYMBOL</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"> code-fragment-4 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">list</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;print</span><span class="token plain"> symbol4</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">PRINT</span><span class="token plain"> MY-SYMBOL</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">eval</span><span class="token plain"> code-fragment-3</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 number" style="color:#36acaa">456</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">456</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">eval</span><span class="token plain"> code-fragment-4</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 number" style="color:#36acaa">456</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">456</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Symbols 1-4 all have the name “MY-SYMBOL” but symbols 1 and 2 are different symbols, while symbols 3 and 4 are the same symbol. How did this happen? Well, one obvious difference is that we called the function MAKE-SYMBOL to make symbols 1 and 2, while symbols 3 and 4 were made for us by the Lisp reader. Maybe the Lisp reader has a different way of making symbols than calling MAKE- SYMBOL. We can test this hypothesis:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">trace</span><span class="token plain"> make-symbol</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">NIL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;foobaz</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Calling </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">MAKE-SYMBOL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;FOOBAZ&quot;</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">MAKE-SYMBOL returned #</span><span class="token lisp-property property" style="color:#36acaa">:FOOBAZ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FOOBAZ</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>
<p>Nope, the reader apparently makes symbols the same way we did, by calling MAKE-SYMBOL. But wait, the symbol returned by MAKE-SYMBOL had that funny #: thing in front of it, but by the time the reader was done the #: prefix had vanished. What gives? We can find the answer by trying the same experiment a second time with MAKE- SYMBOL still traced:</p>
<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">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;foobaz</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FOOBAZ</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>
<p>Aha! The second time we type FOOBAZ the reader doesnt call MAKE-SYMBOL. So the reader is apparently keeping a collection of all the symbols it has made, and before it makes a new one it checks that collection to see if there is already a symbol there by the same name. If there is, then it simply returns that same symbol instead of making a new one. And a symbol that is a member of such a collection loses its mysterious #: prefix. That collection of symbols is called a package. A package is a collection of Lisp symbols with the property that no two symbols in the collection have the same name. Unfortunately, that is more or less the last aspect of packages that is simple and straightforward. From here on out things get rather hairier.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-interning">3. Interning<a href="guide_to_packages.html#3-interning" class="hash-link" aria-label="Direct link to 3. Interning" title="Direct link to 3. Interning"></a></h2>
<p>The act of putting a symbol into a package is called interning a symbol. A symbol that is a member of a package is said to be interned in that package. Symbols that are not members of any package are said to be uninterned. When an uninterned symbol is printed, it gets a #: prefix<sup><a href="guide_to_packages.html#user-content-fn-2" id="user-content-fnref-2" data-footnote-ref="true" aria-describedby="footnote-label">1</a></sup> to distinguish it from an interned symbol, and to warn you that just because it looks just like another symbol that you saw before it might not in fact be the same symbol. Now, heres where things start to get a tad confusing. There is a Lisp function called INTERN, which you might expect to add a symbol to a package, but it doesnt. That function is performed by a function called IMPORT.</p>
<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">? symbol1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#</span><span class="token lisp-property property" style="color:#36acaa">:MY-SYMBOL</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">import</span><span class="token plain"> symbol1</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">T</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? symbol1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MY-SYMBOL</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">eq</span><span class="token plain"> symbol1 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;my-symbol</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">T</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>As you can see, symbol1 has gone from being an uninterned symbol to an interned symbol. It has lost its #: prefix, and it is now EQ to the symbol MY- SYMBOL as produced by the Lisp reader. Now, you might expect that to undo the effect of IMPORT you would call UNIMPORT, but there is no such function. (I warned you that things would not be straightforward.) To remove a symbol from a package you call UNINTERN:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">unintern</span><span class="token plain"> symbol1</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">T</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? symbol1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">#</span><span class="token lisp-property property" style="color:#36acaa">:MY-SYMBOL</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">eq</span><span class="token plain"> symbol1 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;my-symbol</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">NIL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Things are back to the way they were. Symbol 1 is now uninterned, and it is now a different symbol than the one the reader gives you. Lets put symbol1 back into our package:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">import</span><span class="token plain"> symbol1</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">&gt; Error: Importing #</span><span class="token lisp-property property" style="color:#36acaa">:MY-SYMBOL</span><span class="token plain"> to #&lt;Package </span><span class="token string" style="color:#e3116c">&quot;COMMON-LISP-USER&quot;</span><span class="token plain">&gt; would</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conflict with symbol MY-SYMBOL </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">&gt; While executing: CCL:</span><span class="token lisp-property property" style="color:#36acaa">:IMPORT-1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; Type Command-/ to continue, Command-. to abort.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; If continued: Ignore attempt to import #</span><span class="token lisp-property property" style="color:#36acaa">:MY-SYMBOL</span><span class="token plain"> to #&lt;Package</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token string" style="color:#e3116c">&quot;COMMON-LISP-USER&quot;</span><span class="token plain">&gt;. See the Restarts… menu item for further choices.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> &gt;</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>
<p>Whoa! What happened? (It is a good exercise to try to figure out whats going on here before reading any further. You have all the information you need. Hint: try the experiment yourself with MAKE-SYMBOL traced.) Heres what happened:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">unintern</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;my-symbol</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">T</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">eq</span><span class="token plain"> symbol1 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;my-symbol</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Calling </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">MAKE-SYMBOL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;MY-SYMBOL&quot;</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">MAKE-SYMBOL returned #</span><span class="token lisp-property property" style="color:#36acaa">:MY-SYMBOL</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">NIL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>When we typed (eq symbol1 &#x27;my-symbol) the reader interned the symbol MY- SYMBOL. So when we tried to import symbol1 there was already a symbol with the same name in the package. Remember, packages maintain the invariant that there can only be one symbol with the same name in the package at any one time (thats the whole point) so when we tried to import symbol1 (whose name is also MY-SYMBOL) there was already a symbol there with the same name (having been quietly interned by the reader). This situation is called a symbol conflict, and it is, alas, very common. Note, by the way, that the output from the trace of MAKE-SYMBOL above appears inside the S-expression (eq symbol1 my-symbol). This is because MCL rearranges the text on the screen to reflect the true order of events. Because MAKE-SYMBOL was called by the reader while processing the string “my-symbol” but before processing the close-paren, the output appears at that point. If we type: (list &#x27;x1 &#x27;x2 &#x27;x3 &#x27;x4) the resulting output looks like this:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">list</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;x1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Calling </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">MAKE-SYMBOL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;X1&quot;</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">MAKE-SYMBOL returned #</span><span class="token lisp-property property" style="color:#36acaa">:X1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;x2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Calling </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">MAKE-SYMBOL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;X2&quot;</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">MAKE-SYMBOL returned #</span><span class="token lisp-property property" style="color:#36acaa">:X2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;x3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Calling </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">MAKE-SYMBOL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;X3&quot;</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">MAKE-SYMBOL returned #</span><span class="token lisp-property property" style="color:#36acaa">:X3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;x4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Calling </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">MAKE-SYMBOL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;X4&quot;</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">MAKE-SYMBOL returned #</span><span class="token lisp-property property" style="color:#36acaa">:X4</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><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>
<p>Here, the text formatting has been preserved to help illustrate what is happening. The text typed by the user is in bold type. (Note that most Lisp systems dont do this reformatting.) There are a few more useful functions that we can go ahead and mention at this point. SYMBOL-NAME returns the name of a symbol as a string. FIND-SYMBOL takes a string and tells you if there is a symbol with that name already interned. And, finally, INTERN, which can be defined as follows:</p>
<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 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">intern</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">name</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 keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">find-symbol</span><span class="token plain"> name</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">s</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-symbol</span><span class="token plain"> name</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">import</span><span class="token plain"> s</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 punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</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>
<p>In other words, INTERN is sort of the opposite of SYMBOL-NAME. SYMBOL-NAME takes a symbol and returns the string that is that symbols name. INTERN takes a string and returns the symbol whose name is that string. INTERN is the function that READ uses to make symbols.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-which-package">4. Which Package?<a href="guide_to_packages.html#4-which-package" class="hash-link" aria-label="Direct link to 4. Which Package?" title="Direct link to 4. Which Package?"></a></h2>
<p>The functions that operate on packages like FIND-SYMBOL, IMPORT and INTERN by default operate on a package that is the value of the global variable <em>PACKAGE</em>, also known as the current package. Like symbols, packages have names, and no two packages can have the same name. Packages, like symbols, are also ordinary Lisp data structures. There are functions PACKAGE-NAME and FIND-PACKAGE which operate analogously to SYMBOL-NAME and FIND-SYMBOL, except of course, that FIND-PACKAGE doesnt take a package argument. (Its as if there is one global meta-package for package names.) As weve already seen, we can make new packages by calling MAKE-PACKAGE, and set the current package by calling IN-PACKAGE. (Note that IN-PACKAGE is not a function but a macro that does not evaluate its argument.) You can access symbols that are not in the current package by using a special syntax: the package name followed by two colons followed by the symbol name. This is handy if you want to use a symbol without importing it. For example, if Bob wanted to use Janes FOO function he could type JANE::FOO.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="41-home-packages">4.1 Home packages<a href="guide_to_packages.html#41-home-packages" class="hash-link" aria-label="Direct link to 4.1 Home packages" title="Direct link to 4.1 Home packages"></a></h2>
<p>One of the invariants that Common Lisp tries to maintain is a property called print-read consistency. This property says that if you print a symbol, and then read the resulting printed representation of that symbol, the result is the same symbol, with two caveats: 1) this does not apply to uninterned symbols, and 2) it applies only if you refrain from certain “dangerous” actions. Well cover what those are in a moment. To maintain print-read consistency, some symbols need to be printed with their package qualifier. For example:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;foo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FOO</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:foo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FOO</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;foo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FOO</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:foo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">JANE:</span><span class="token lisp-property property" style="color:#36acaa">:FOO</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;bob</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:foo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FOO</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Obviously one of the “dangerous actions” that allows print-read consistency to be violated is calling IN-PACKAGE. Now, consider the following situation:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">unintern</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;foo</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">T</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">import</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:foo</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">T</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-package</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:charlie</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;CHARLIE&quot;</span><span class="token plain">&gt;</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">in-package</span><span class="token plain"> charlie</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;CHARLIE&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;bob</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:foo</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">JANE:</span><span class="token lisp-property property" style="color:#36acaa">:FOO</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Here we have a symbol FOO which is interned in both the JANE and the BOB packages. That one symbol is therefore accessible as both JANE::FOO and BOB::FOO. How does the system decide which printed representation to use when the symbol is printed from the CHARLIE package, in which the symbol is not interned? It turns out that every symbol keeps track of a single package called its home package, which is usually the first package in which that symbol was interned (but there are exceptions). When a symbol needs to be printed with a package qualifier, it uses the qualifier from its home package. You can query a symbol for its home package using the function SYMBOL-PACKAGE.</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">symbol-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;bob</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:foo</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>Note that it is possible to make symbols without home packages. Uninterned symbols, for examples, have no home packages. But it is also possible to make interned symbols with no home packages. For example:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;weird-symbol</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WEIRD-SYMBOL</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">import</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:weird-symbol</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">T</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">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">unintern</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;weird-symbol</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">T</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;weird-symbol</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WEIRD-SYMBOL</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">symbol-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;weird-symbol</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">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">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">? </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;bob</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:weird-symbol</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">:WEIRD-SYMBOL</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>
<p>Such things are best avoided.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="5-export-and-use-package">5. Export and Use-package<a href="guide_to_packages.html#5-export-and-use-package" class="hash-link" aria-label="Direct link to 5. Export and Use-package" title="Direct link to 5. Export and Use-package"></a></h2>
<p>Suppose Jane and Bob are collaborating on a software development project, each working in their own package to avoid conflicts. Jane writes:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">defclass</span><span class="token plain"> jane-class </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">slot1</span><span class="token plain"> slot2 slot3</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">#&lt;STANDARD-CLASS JANE-CLASS&gt;</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>
<p>Now, imagine that Bob wants to use JANE-CLASS. He writes:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">import</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</span><span class="token plain">:</span><span class="token lisp-property property" style="color:#36acaa">:jane-class</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">T</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-instance</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane-class</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">#&lt;JANE-CLASS #x130565E&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>So far so good. Now he tries:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">setq</span><span class="token plain"> jc1 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-instance</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane-class</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">#&lt;JANE-CLASS #x130BA96&gt;</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">slot-value</span><span class="token plain"> jc1 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;slot1</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">&gt; Error: #&lt;JANE-CLASS #x130BA96&gt; has no slot named SLOT1.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; While executing: #&lt;CCL:</span><span class="token lisp-property property" style="color:#36acaa">:STANDARD-KERNEL-METHOD</span><span class="token plain"> SLOT-MISSING </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">T</span><span class="token plain"> T T T</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">&gt;</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>
<p>What happened? Well, JANE-CLASS was defined in the JANE package, so the slot names are symbols interned in that package. But Bob tried to access an instance of that class using a symbol interned in the BOB package. In other words, JANE- CLASS has a slot named JANE::SLOT1, and Bob tried to access a slot name BOB::SLOT1, and there is no such slot. What Bob would really like to do is import all the symbols that are “associated” with JANE-CLASS, that is, all the slot names, method names, etc. etc. How can he know what all those symbols are? He could examine Janes code and try to figure it out for himself, but that would lead to many problems, not least of which is that he might decide to import a symbol that Jane didnt want Bob to mess with (remember, separating Janes symbols from the effects of Bobs meddling is the whole point of having packages to being with). A better solution would be for Jane to assemble a list of symbols that Bob should import in order to use her software. Then Jane could do something like:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token defvar keyword" style="color:#00009f">defvar</span><span class="token defvar"> </span><span class="token defvar variable" style="color:#36acaa">*published-symbols*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&#x27;(</span><span class="token car">jane-class</span><span class="token plain"> slot1 slot2 slot3</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">*PUBLISHED-SYMBOLS*</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>And Bob could then do (import jane::<em>published-symbols</em>). Common Lisp provides a standard mechanism for doing this. Every package maintains a list of symbols that are intended to be used by other packages. This list is called the exported symbol list of that package, and to add a symbol to that package you use the function EXPORT. To remove a symbol from a packages exported symbol list you use (as you might expect this time) UNEXPORT. To import all of the exported symbols in a package you call USE-PACKAGE. To unimport them all you call UNUSE-PACKAGE. There are two things to note about exporting symbols. First, a symbol can be exported from any package in which that symbol is interned, not just its home package. A symbol also does not have to be exported from its home package in order to be exported from some other package in which that symbol is interned. Second, a symbol that is exported from its home package uses only one colon instead of two when printed with its package qualifier. This is to alert you to the fact that the symbol is exported from its home package (and so you might want to USE-PACKAGE the symbols package instead of IMPORTing the symbol), and also to discourage you from using unexported symbols by forcing you to type an extra colon in order to access them. (No, I am not kidding.)</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="6-shadowing">6. Shadowing<a href="guide_to_packages.html#6-shadowing" class="hash-link" aria-label="Direct link to 6. Shadowing" title="Direct link to 6. Shadowing"></a></h2>
<p>There is one last gotcha: using USE-PACKAGE is slightly different from IMPORTing all the exported symbols in the package. When you IMPORT a symbol you can undo the effect of the IMPORT using UNINTERN. You cannot use UNINTERN to (partially) undo the effect of a USE-PACKAGE. For example:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> jane</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">export</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&#x27;(</span><span class="token car">slot1</span><span class="token plain"> slot2 slot3</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">T</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">in-package</span><span class="token plain"> bob</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">use-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;jane</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">T</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">symbol-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;slot1</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</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">unintern</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;slot1</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">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">symbol-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;slot1</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;JANE&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>This is a problem, because it would seem to make it impossible to use two different packages that export a symbol with the same name. For example, suppose you wanted to use two packages P1 and P2 in a third package named MYPACKAGE, and both P1 and P2 exported a symbol named X. If you just tried to USE-PACKAGE both P1 and P2 you would get a name conflict because Lisp would have no way of knowing whether X in MYPACKAGE should now be P1<!-- -->:X<!-- --> or P2<!-- -->:X<!-- -->. To resolve such name conflicts every package maintains what is called a shadowing symbols list. The shadowing symbols list is a list of symbols that shadow or override any symbols would normally become visible in that package as a result of calling USE-PACKAGE. There are two ways to add symbols to a packages shadowing symbols list, SHADOW and SHADOWING-IMPORT. SHADOW is used to add symbols that are in the package to the shadowing symbols list. SHADOWING-IMPORT is used to add symbols that are in some other package.</p>
<p>For example:</p>
<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">? </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">in-package</span><span class="token plain"> p1</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;P1&quot;</span><span class="token plain">&gt;</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">export</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&#x27;(</span><span class="token car">x</span><span class="token plain"> y 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">T</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">in-package</span><span class="token plain"> p2</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;P2&quot;</span><span class="token plain">&gt;</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">export</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&#x27;(</span><span class="token car">x</span><span class="token plain"> y 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">T</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">in-package</span><span class="token plain"> bob</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">T</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">use-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;p1</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">T</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">use-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;p2</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">&gt; Error: Using #&lt;Package </span><span class="token string" style="color:#e3116c">&quot;P2&quot;</span><span class="token plain">&gt; in #&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; would cause name conflicts with symbols inherited</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; by that package:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; Z P2</span><span class="token lisp-property property" style="color:#36acaa">:Z</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; Y P2</span><span class="token lisp-property property" style="color:#36acaa">:Y</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt; X P2</span><span class="token lisp-property property" style="color:#36acaa">: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"> </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 number" style="color:#36acaa">1</span><span class="token plain"> &gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Aborted</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">unuse-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;p1</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">T</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">shadow</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;x</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">T</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">shadowing-import</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;p1</span><span class="token lisp-property property" style="color:#36acaa">: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">T</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">shadowing-import</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;p2</span><span class="token lisp-property property" style="color:#36acaa">:z</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">T</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">use-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;p1</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">T</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">use-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;p2</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">T</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">symbol-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;x</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;BOB&quot;</span><span class="token plain">&gt;</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">symbol-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;P1&quot;</span><span class="token plain">&gt;</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">symbol-package</span><span class="token plain"> </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;z</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">#&lt;Package </span><span class="token string" style="color:#e3116c">&quot;P2&quot;</span><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">?</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>
<p>To undo the effect of SHADOW or SHADOWING-IMPORT use UNINTERN. Note that UNINTERN (and many, many other surprising things) can result in name conflicts unexpectedly appearing. The most common cause of an unexpected name conflict is usually inadvertently interning a symbol in a package by typing it at the reader without paying close attention to which package you were in at the time.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="7-defpackage">7. DEFPACKAGE<a href="guide_to_packages.html#7-defpackage" class="hash-link" aria-label="Direct link to 7. DEFPACKAGE" title="Direct link to 7. DEFPACKAGE"></a></h2>
<p>Now that youve learned all about the myriad functions and macros that can be used to manipulate packages you shouldnt really be using any of them. Instead, all of the functionality of IMPORT, EXPORT, SHADOW, etc. is all rolled up in a single macro called DEFPACKAGE, which is what you should use for real (non- prototype) code.</p>
<p>Im not going to try to explain DEFPACKAGE here because now that you understand the basic concepts of packages you should just be able to read the documentation in the hyperspec and understand it. (There are also a lot of other goodies, like DO-SYMBOLS and WITH-PACKAGE-ITERATOR, in the hyperspec that you should now be able to understand on your own.)</p>
<p>One caveat about using DEFPACKAGE though: note that most of the arguments to DEFPACKAGE are string designators, not symbols. This means that they can be symbols, but if you choose to use symbols then those symbols will get interned in the current package, whatever it may be, at the time that the DEFPACKAGE form is read. This often leads to undesirable consequences, so its a good idea to get into the habit of using keywords or strings in your DEFPACKAGE forms.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="8-final-thoughts">8. Final Thoughts<a href="guide_to_packages.html#8-final-thoughts" class="hash-link" aria-label="Direct link to 8. Final Thoughts" title="Direct link to 8. Final Thoughts"></a></h2>
<p>The most important thing to understand about packages is that they are fundamentally a part of the Lisp reader and not the evaluator. Once you wrap your brain around that idea, everything else will fall into place. Packages control how the reader maps strings onto symbols (and how PRINT maps symbols onto strings), nothing else. In particular, packages have nothing to do with the functions, values, property lists, etc. that might or might not be associated with any particular symbol. Note in particular (this has nothing to do with packages but newcomers often get confused by this anyway) that both symbols and function objects can be used as functions, but they behave slightly differently. For example:</p>
<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">? </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">foo</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 punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;Original foo&quot;</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">FOO</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">setf</span><span class="token plain"> f1 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">&#x27;foo</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">FOO</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">setf</span><span class="token plain"> f2 </span><span class="token quoted-symbol variable symbol" style="color:#36acaa">#&#x27;foo</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">#&lt;Compiled-function FOO #xEB3446&gt;</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">demo</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 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">list</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">funcall</span><span class="token plain"> f1</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">funcall</span><span class="token plain"> f2</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 quoted-symbol variable symbol" style="color:#36acaa">#&#x27;foo</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">funcall</span><span class="token plain"> #.</span><span class="token quoted-symbol variable symbol" style="color:#36acaa">#&#x27;foo</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 comment" style="color:#999988;font-style:italic">;Compiler warnings :</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">; Undeclared free variable F1, in DEMO.</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">; Undeclared free variable F2, in DEMO.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DEMO</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">demo</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 string" style="color:#e3116c">&quot;Original foo&quot;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;Original foo&quot;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;Original foo&quot;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;Original foo&quot;</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">foo</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 punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;New foo&quot;</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">FOO</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">demo</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 string" style="color:#e3116c">&quot;New foo&quot;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;Original foo&quot;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;New foo&quot;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;Original foo&quot;</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></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>
<p>In this example we have two variables, F1 and F2. The value of F1 is the symbol FOO. The value of F2 is the function object that was in the symbol-function slot of the symbol FOO at the time F2 was assigned. Note that when FOO is redefined, the effect of calling the symbol FOO is to get the new behavior, whereas calling the function object produces the old behavior. Explaining the second and third result in the list is left as an exercise for the reader (no pun intended).</p>
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorWithStickyNavbar_LWe7 sr-only" id="footnote-label">Footnotes<a href="guide_to_packages.html#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes"></a></h2>
<ol>
<li id="user-content-fn-2">
<p>This is not quite accurate, but a good enough approximation for now. The real truth is that a #: prefix just means that a symbol has no home package, not necessarily that it is not interned in any package. <a href="guide_to_packages.html#user-content-fnref-2" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref"></a></p>
</li>
</ol>
</section></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/lisp-docs.github.io/tree/main/docs/tutorial/projects/guide_to_packages.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="../projects.html"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Structuring Projects</div></a><a class="pagination-nav__link pagination-nav__link--next" href="packages-systems.html"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Packages and Systems</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="guide_to_packages.html#1-introduction" class="table-of-contents__link toc-highlight">1. Introduction</a></li><li><a href="guide_to_packages.html#2-symbols-values-and-the-read-eval-print-loop" class="table-of-contents__link toc-highlight">2. Symbols, Values, and the READ-EVAL-PRINT Loop</a></li><li><a href="guide_to_packages.html#3-interning" class="table-of-contents__link toc-highlight">3. Interning</a></li><li><a href="guide_to_packages.html#4-which-package" class="table-of-contents__link toc-highlight">4. Which Package?</a></li><li><a href="guide_to_packages.html#41-home-packages" class="table-of-contents__link toc-highlight">4.1 Home packages</a></li><li><a href="guide_to_packages.html#5-export-and-use-package" class="table-of-contents__link toc-highlight">5. Export and Use-package</a></li><li><a href="guide_to_packages.html#6-shadowing" class="table-of-contents__link toc-highlight">6. Shadowing</a></li><li><a href="guide_to_packages.html#7-defpackage" class="table-of-contents__link toc-highlight">7. DEFPACKAGE</a></li><li><a href="guide_to_packages.html#8-final-thoughts" class="table-of-contents__link toc-highlight">8. Final Thoughts</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 class="footer__link-item" href="../../tutorial.html">Common Lisp Tutorial</a></li><li class="footer__item"><a href="../../../cl-language-reference/index.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Common Lisp Technical Reference</a></li><li class="footer__item"><a class="footer__link-item" href="../../help.html">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 class="footer__link-item" href="../../../blog.html">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 class="footer__link-item" href="../../contribute.html">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 class="footer__link-item" href="../../about.html">About</a></li><li class="footer__item"><a class="footer__link-item" href="../../whylisp.html">Why Lisp</a></li><li class="footer__item"><a class="footer__link-item" href="../../getting-started.html">Getting Started</a></li><li class="footer__item"><a class="footer__link-item" href="../../faq.html">FAQ</a></li><li class="footer__item"><a class="footer__link-item" href="../../help.html">Getting Help</a></li><li class="footer__item"><a class="footer__link-item" href="../../howto.html">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>