1
0
Fork 0
cl-sites/ecl.common-lisp.dev/static/manual/Package-locks.html

306 lines
13 KiB
HTML
Raw Permalink Normal View History

2024-12-24 19:15:49 +01:00
<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.0.3, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Package locks (ECL Manual)</title>
<meta name="description" content="Package locks (ECL Manual)">
<meta name="keywords" content="Package locks (ECL Manual)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Indexes.html" rel="index" title="Indexes">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Extensions.html" rel="up" title="Extensions">
<link href="CDR-Extensions.html" rel="next" title="CDR Extensions">
<link href="Package-local-nicknames.html" rel="prev" title="Package local nicknames">
<style type="text/css">
<!--
/* colors */
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span.r {font-family: initial; font-weight: normal; font-style: normal}
span:hover a.copiable-link {visibility: visible}
strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
@media (prefers-color-scheme: dark) {
/* dark theme */
html { color: seashell;
background: #1A1A1A; }
body { background: #1A1A1A; }
th { border-bottom: 2px solid lightgray; }
h1, h2, h3, h4, h5 { background-image: linear-gradient(to left, #202020, #3A3A3A); }
code, var, code a { color: darkorange;
background: #2A2A2A; }
a { color: seashell; }
pre { background: #2A2A2A;
color: seashell;
/* mark longer code block with stripe on the left */
border-left: 5px solid darkorange;
padding-left: 10px; }
pre.screen { background: #2A2A2A;
border: 1px solid lightgray; }
pre.programlisting { background: #2A2A2A;
border-left: 1px solid lightgray;
border-top: 1px solid lightgray; }
/* we need a light background in order for the images to be readable */
img { background: white }
}
@media (prefers-color-scheme: light) {
/* light theme */
html { background: white }
body { background: white }
th { border-bottom: 2px solid gray; }
h1, h2, h3, h4, h5 { background: lightgray; }
code, var, code a { color: darkred;
background: whitesmoke; }
a { color: #000; }
pre { background: whitesmoke;
color: black;
/* mark longer code block with stripe on the left */
border-left: 5px solid darkred;
padding-left: 10px; }
pre.screen { background: #EEE;
border: 1px solid black; }
pre.programlisting { background: #EEEEEE;
border-left: 1px solid black;
border-top: 1px solid black; }
}
body {
margin: 1em 125px 0 10%;
line-height: 1.5em;
padding: 0 2em 1em 2em;
font: 13px Verdana,Arial, sans-serif
}
ul, dd, dl, dt { margin-top: 0; margin-bottom: 0; }
p, code, td, dl, dt {
line-height: 1.5em;
}
table {
font: inherit;
border-collapse: collapse;
}
th, td {
vertical-align: top;
}
h1, h2, h3 { padding-left: 15px; }
h4, h5 { padding-left: 5px; }
code, pre {
font-size: 1em;
font-family: monospace;
}
var {
font-size: 1em;
}
/* links inside code appear the same as the code itself */
code a {
font-weight: normal;
text-decoration: none;
}
/* but get an underline when hovering */
code a:hover {
text-decoration: underline;
}
/* ordinary links appear in bold */
a { font-weight: bold; }
pre.verbatim {
margin: 0 0 0 0;
}
pre {
overflow: auto;
}
pre.screen {
font-weight: bold;
padding: 0.5em;
}
pre.programlisting {
padding: 0.5em;
}
div p { padding: 0 2em }
li p { padding: 0; margin: 0 }
hr { display: none; }
div.funcsynopsis p {
text-indent: -2em;
}
div.variablelist {
padding: 0 2em;
}
.type, .funcsynopsis, .symbol {
font-family: monospace;
}
.type, .symbol, .replaceable {
white-space: nowrap;
}
-->
</style>
</head>
<body lang="en">
<div class="section-level-extent" id="Package-locks">
<div class="nav-panel">
<p>
Next: <a href="CDR-Extensions.html" accesskey="n" rel="next">CDR Extensions</a>, Previous: <a href="Package-local-nicknames.html" accesskey="p" rel="prev">Local package nicknames</a>, Up: <a href="Extensions.html" accesskey="u" rel="up">Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indexes.html" title="Index" rel="index">Index</a>]</p>
</div>
<h3 class="section" id="Package-locks-1">3.11 Package locks</h3>
<a class="index-entry-id" id="index-Package-locks"></a>
<a class="index-entry-id" id="index-PACKAGE_002dLOCKS"></a>
<ul class="mini-toc">
<li><a href="Package-locks.html#Package-Locking-Overview" accesskey="1">Package Locking Overview</a></li>
<li><a href="Package-locks.html#Operations-Violating-Package-Locks" accesskey="2">Operations Violating Package Locks</a></li>
<li><a href="Package-locks.html#Package-Lock-Dictionary" accesskey="3">Package Lock Dictionary</a></li>
</ul>
<div class="subsection-level-extent" id="Package-Locking-Overview">
<h4 class="subsection">3.11.1 Package Locking Overview</h4>
<p>ECL borrows parts of the protocol and documentation from SBCL for
compatibility. Interface is the same except that the home package for
locking is <code class="code">ext</code> and that ECL doesn&rsquo;t implement Implementation
Packages and a few constructs. To load the extension you need to
require <code class="code">package-locks</code>:
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(require '#:package-locks)
</pre></div>
<p>Package locks protect against unintentional modifications of a package:
they provide similar protection to user packages as is mandated to
<code class="code">common-lisp</code> package by the ANSI specification. They are not, and
should not be used as, a security measure.
</p>
<p>Newly created packages are by default unlocked (see the <code class="code">:lock</code>
option to <code class="code">defpackage</code>).
</p>
<p>The package <code class="code">common-lisp</code> and ECL internal implementation packages
are locked by default, including <code class="code">ext</code>.
</p>
<p>It may be beneficial to lock <code class="code">common-lisp-user</code> as well, to
ensure that various libraries don&rsquo;t pollute it without asking,
but this is not currently done by default.
</p>
</div>
<div class="subsection-level-extent" id="Operations-Violating-Package-Locks">
<h4 class="subsection">3.11.2 Operations Violating Package Locks</h4>
<p>The following actions cause a package lock violation if the package
operated on is locked, and <code class="code">*package*</code> is not an implementation
package of that package, and the action would cause a change in the
state of the package (so e.g. exporting already external symbols is
never a violation). Package lock violations caused by these operations
signal errors of type <code class="code">package-error</code>.
</p>
<ol class="enumerate">
<li> Shadowing a symbol in a package.
</li><li> Importing a symbol to a package.
</li><li> Uninterning a symbol from a package.
</li><li> Exporting a symbol from a package.
</li><li> Unexporting a symbol from a package.
</li><li> Changing the packages used by a package.
</li><li> Renaming a package.
</li><li> Deleting a package.
</li><li> Attempting to redefine a function in a locked package.
</li><li> Adding a new package local nickname to a package.
</li><li> Removing an existing package local nickname to a package.
</li></ol>
</div>
<div class="subsection-level-extent" id="Package-Lock-Dictionary">
<h4 class="subsection">3.11.3 Package Lock Dictionary</h4>
<a class="anchor" id="ext_003apackage_002dlocked_002dp"></a><a class="index-entry-id" id="index-ext_003apackage_002dlocked_002dp-1"></a>
<dl class="first-deffn first-defun-alias-first-deffn">
<dt class="deffn defun-alias-deffn" id="index-ext_003apackage_002dlocked_002dp"><span class="category-def">Function: </span><span><strong class="def-name">ext:package-locked-p</strong> <var class="def-var-arguments">package</var><a class="copiable-link" href='Package-locks.html#index-ext_003apackage_002dlocked_002dp'> &para;</a></span></dt>
<dd><p>Returns <code class="code">t</code> when <var class="var">package</var> is locked, <code class="code">nil</code>
otherwise. Signals an error if <var class="var">package</var> doesn&rsquo;t designate a valid
package.
</p></dd></dl>
<a class="anchor" id="ext_003alock_002dpackage"></a><a class="index-entry-id" id="index-ext_003alock_002dpackage-1"></a>
<dl class="first-deffn first-defun-alias-first-deffn">
<dt class="deffn defun-alias-deffn" id="index-ext_003alock_002dpackage"><span class="category-def">Function: </span><span><strong class="def-name">ext:lock-package</strong> <var class="def-var-arguments">package</var><a class="copiable-link" href='Package-locks.html#index-ext_003alock_002dpackage'> &para;</a></span></dt>
<dd><p>Locks <var class="var">package</var> and returns <code class="code">t</code>. Has no effect if package was
already locked. Signals an error if package is not a valid
<var class="var">package</var> designator
</p></dd></dl>
<a class="anchor" id="ext_003aunlock_002dpackage"></a><a class="index-entry-id" id="index-ext_003aunlock_002dpackage-1"></a>
<dl class="first-deffn first-defun-alias-first-deffn">
<dt class="deffn defun-alias-deffn" id="index-ext_003aunlock_002dpackage"><span class="category-def">Function: </span><span><strong class="def-name">ext:unlock-package</strong> <var class="def-var-arguments">package</var><a class="copiable-link" href='Package-locks.html#index-ext_003aunlock_002dpackage'> &para;</a></span></dt>
<dd><p>Unlocks <var class="var">package</var> and returns <code class="code">t</code>. Has no effect if
<var class="var">package</var> was already unlocked. Signals an error if <var class="var">package</var>
is not a valid package designator.
</p></dd></dl>
<a class="anchor" id="ext_003awithout_002dpackage_002dlocks"></a><a class="index-entry-id" id="index-ext_003awithout_002dpackage_002dlocks-1"></a>
<dl class="first-deffn first-defmac-alias-first-deffn">
<dt class="deffn defmac-alias-deffn" id="index-ext_003awithout_002dpackage_002dlocks"><span class="category-def">Macro: </span><span><strong class="def-name">ext:without-package-locks</strong> <var class="def-var-arguments">&amp;body body</var><a class="copiable-link" href='Package-locks.html#index-ext_003awithout_002dpackage_002dlocks'> &para;</a></span></dt>
<dd><p>Ignores all runtime package lock violations during the execution of
body. Body can begin with declarations.
</p></dd></dl>
<a class="anchor" id="ext_003awith_002dunlocked_002dpackages"></a><a class="index-entry-id" id="index-ext_003awith_002dunlocked_002dpackages-1"></a>
<dl class="first-deffn first-defmac-alias-first-deffn">
<dt class="deffn defmac-alias-deffn" id="index-ext_003awith_002dunlocked_002dpackages"><span class="category-def">Macro: </span><span><strong class="def-name">ext:with-unlocked-packages</strong> <var class="def-var-arguments">(&amp;rest packages) &amp;body body</var><a class="copiable-link" href='Package-locks.html#index-ext_003awith_002dunlocked_002dpackages'> &para;</a></span></dt>
<dd><p>Unlocks <var class="var">packages</var> for the dynamic scope of the
<var class="var">body</var>. Signals an error if any of <var class="var">packages</var> is not a valid
package designator.
</p></dd></dl>
<dl class="first-deffn first-defmac-alias-first-deffn">
<dt class="deffn defmac-alias-deffn" id="index-cl_003adefpackage-1"><span class="category-def">Macro: </span><span><strong class="def-name">cl:defpackage</strong> <var class="def-var-arguments">name [[option]]* &rArr; package</var><a class="copiable-link" href='Package-locks.html#index-cl_003adefpackage-1'> &para;</a></span></dt>
<dd>
<p>Options are extended to include
</p>
<div class="example">
<pre class="example-preformatted"> :lock boolean
</pre></div>
<p>If the argument to <code class="code">:lock</code> is <code class="code">t</code>, the package is initially
locked. If <code class="code">:lock</code> is not provided it defaults to <code class="code">nil</code>.
</p>
<a class="index-entry-id" id="index-Defpackage-_003alock-option"></a>
<p>Example:
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(defpackage &quot;FOO&quot; (:export &quot;BAR&quot;) (:lock t))
;;; is equivalent to
(defpackage &quot;FOO&quot;) (:export &quot;BAR&quot;))
(lock-package &quot;FOO&quot;)
</pre></div>
</dd></dl>
</div>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="CDR-Extensions.html" accesskey="n" rel="next">CDR Extensions</a>, Previous: <a href="Package-local-nicknames.html" accesskey="p" rel="prev">Local package nicknames</a>, Up: <a href="Extensions.html" accesskey="u" rel="up">Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indexes.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>