1
0
Fork 0
cl-sites/HyperSpec-7-0/HyperSpec/Body/m_w_pkg_.htm
2024-04-01 10:24:07 +02:00

124 lines
13 KiB
HTML

<!-- Common Lisp HyperSpec (TM), version 7.0 generated by Kent M. Pitman on Mon, 11-Apr-2005 2:31am EDT -->
<HTML>
<HEAD>
<TITLE>CLHS: Macro WITH-PACKAGE-ITERATOR</TITLE>
<LINK HREF="../Data/clhs.css" REL="stylesheet" TYPE="text/css" />
<META HTTP-EQUIV="Author" CONTENT="Kent M. Pitman">
<META HTTP-EQUIV="Organization" CONTENT="LispWorks Ltd.">
<LINK REL=TOP HREF="../Front/index.htm">
<LINK REL=COPYRIGHT HREF="../Front/Help.htm#Legal">
<LINK REL=DISCLAIMER HREF="../Front/Help.htm#Disclaimer">
<LINK REL=PREV HREF="f_mk_pkg.htm">
<LINK REL=UP HREF="c_packag.htm">
<LINK REL=NEXT HREF="f_unexpo.htm">
</HEAD>
<BODY>
<H1><A REV=MADE HREF="http://www.lispworks.com/"><IMG WIDTH=80 HEIGHT=65 ALT="[LISPWORKS]" SRC="../Graphics/LWSmall.gif" ALIGN=Bottom></A><A REL=TOP HREF="../Front/index.htm"><IMG WIDTH=237 HEIGHT=65 ALT="[Common Lisp HyperSpec (TM)]" SRC="../Graphics/CLHS_Sm.gif" ALIGN=Bottom></A> <A REL=PREV HREF="f_mk_pkg.htm"><IMG WIDTH=40 HEIGHT=40 ALT="[Previous]" SRC="../Graphics/Prev.gif" ALIGN=Bottom></A><A REL=UP HREF="c_packag.htm"><IMG WIDTH=40 HEIGHT=40 ALT="[Up]" SRC="../Graphics/Up.gif" ALIGN=Bottom></A><A REL=NEXT HREF="f_unexpo.htm"><IMG WIDTH=40 HEIGHT=40 ALT="[Next]" SRC="../Graphics/Next.gif" ALIGN=Bottom></A></H1>
<HR>
<A NAME="with-package-iterator"><I>Macro</I> <B>WITH-PACKAGE-ITERATOR</B></A> <P>
<P>
<P>
<P><B>Syntax:</B><P>
<P>
<B>with-package-iterator</B> <I>(name package-list-form <TT>&amp;rest</TT> symbol-types) <I>declaration</I><B>*</B> <I>form</I><B>*</B></I><P> =&gt; <I><I>result</I><B>*</B></I><P>
<P>
<P><B>Arguments and Values:</B><P>
<P>
<I>name</I>---a <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A>. <P>
<I>package-list-form</I>---a <A REL=DEFINITION HREF="26_glo_f.htm#form"><I>form</I></A>; evaluated once to produce a <I>package-list</I>. <P>
<I>package-list</I>---a <A REL=DEFINITION HREF="26_glo_d.htm#designator"><I>designator</I></A> for a list of <A REL=DEFINITION HREF="26_glo_p.htm#package_designator"><I>package designators</I></A>. <P>
<I>symbol-type</I>---one of the <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> <TT>:internal</TT>, <TT>:external</TT>, or <TT>:inherited</TT>. <P>
<I>declaration</I>---a <A REL=DEFINITION HREF="s_declar.htm#declare"><B>declare</B></A> <A REL=DEFINITION HREF="26_glo_e.htm#expression"><I>expression</I></A>; not evaluated. <P>
<I>forms</I>---an <A REL=DEFINITION HREF="26_glo_i.htm#implicit_progn"><I>implicit progn</I></A>. <P>
<I>results</I>---the <A REL=DEFINITION HREF="26_glo_v.htm#value"><I>values</I></A> of the <I>forms</I>. <P>
<P><B>Description:</B><P>
<P>
Within the lexical scope of the body <I>forms</I>, the <I>name</I> is defined via <A REL=DEFINITION HREF="s_flet_.htm#macrolet"><B>macrolet</B></A> such that successive invocations of <TT>(</TT><I>name</I><TT>)</TT> will return the <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A>, one by one, from the <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>packages</I></A> in <I>package-list</I>. <P>
It is unspecified whether <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> inherited from multiple <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>packages</I></A> are returned more than once. The order of <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> returned does not necessarily reflect the order of <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>packages</I></A> in <I>package-list</I>. When <I>package-list</I> has more than one element, it is unspecified whether duplicate <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> are returned once or more than once. <P>
<I>Symbol-types</I> controls which <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> that are <A REL=DEFINITION HREF="26_glo_a.htm#accessible"><I>accessible</I></A> in a <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A> are returned as follows: <P>
<P><DL><DT><TT>:internal</TT> <P><DD>
The <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> that are <A REL=DEFINITION HREF="26_glo_p.htm#present"><I>present</I></A> in the <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A>, but that are not <A REL=DEFINITION HREF="26_glo_e.htm#exported"><I>exported</I></A>. <P>
<DT><TT>:external</TT> <P><DD>
The <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> that are <A REL=DEFINITION HREF="26_glo_p.htm#present"><I>present</I></A> in the <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A> and are <A REL=DEFINITION HREF="26_glo_e.htm#exported"><I>exported</I></A>. <P>
<DT><TT>:inherited</TT> <P><DD>
The <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> that are <A REL=DEFINITION HREF="26_glo_e.htm#exported"><I>exported</I></A> by used <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>packages</I></A> and that are not <I>shadowed</I>. <P></DL><P>
When more than one argument is supplied for <I>symbol-types</I>, a <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A> is returned if its <A REL=DEFINITION HREF="26_glo_a.htm#accessibility"><I>accessibility</I></A> matches any one of the <I>symbol-types</I> supplied. Implementations may extend this syntax by recognizing additional symbol accessibility types. <P>
An invocation of <TT>(</TT><I>name</I><TT>)</TT> returns four values as follows: <P>
<P><DL><DT>1. A flag that indicates whether a <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A> is returned (true means that a <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A> is returned). <DD><DT>2. A <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A> that is <A REL=DEFINITION HREF="26_glo_a.htm#accessible"><I>accessible</I></A> in one the indicated <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>packages</I></A>. <DD><DT>3. The accessibility type for that <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A>; i.e., one of the symbols <TT>:internal</TT>, <TT>:external</TT>, or <TT>:inherited</TT>. <DD><DT>4. The <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A> from which the <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A> was obtained. The <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A> is one of the <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>packages</I></A> present or named in <I>package-list</I>. <P><DD></DL><P>
After all <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbols</I></A> have been returned by successive invocations of <TT>(</TT><I>name</I><TT>)</TT>, then only one value is returned, namely <A REL=DEFINITION HREF="a_nil.htm#nil"><B>nil</B></A>. <P>
The meaning of the second, third, and fourth <A REL=DEFINITION HREF="26_glo_v.htm#value"><I>values</I></A> is that the returned <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A> is <A REL=DEFINITION HREF="26_glo_a.htm#accessible"><I>accessible</I></A> in the returned <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A> in the way indicated by the second return value as follows: <P>
<P><DL><DT><TT>:internal</TT> <P><DD>
Means <A REL=DEFINITION HREF="26_glo_p.htm#present"><I>present</I></A> and not <A REL=DEFINITION HREF="26_glo_e.htm#exported"><I>exported</I></A>. <P>
<DT><TT>:external</TT> <P><DD>
Means <A REL=DEFINITION HREF="26_glo_p.htm#present"><I>present</I></A> and <A REL=DEFINITION HREF="26_glo_e.htm#exported"><I>exported</I></A>. <P>
<DT><TT>:inherited</TT> <P><DD>
Means not <A REL=DEFINITION HREF="26_glo_p.htm#present"><I>present</I></A> (thus not <I>shadowed</I>) but inherited from some used <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A>. <P></DL><P>
It is unspecified what happens if any of the implicit interior state of an iteration is returned outside the dynamic extent of the <A REL=DEFINITION HREF="#with-package-iterator"><B>with-package-iterator</B></A> form such as by returning some <A REL=DEFINITION HREF="26_glo_c.htm#closure"><I>closure</I></A> over the invocation <A REL=DEFINITION HREF="26_glo_f.htm#form"><I>form</I></A>. <P>
Any number of invocations of <A REL=DEFINITION HREF="#with-package-iterator"><B>with-package-iterator</B></A> can be nested, and the body of the innermost one can invoke all of the locally <I>established</I> <A REL=DEFINITION HREF="26_glo_m.htm#macro"><I>macros</I></A>, provided all those <A REL=DEFINITION HREF="26_glo_m.htm#macro"><I>macros</I></A> have distinct names. <P>
<P><B>Examples:</B><P>
<P>
The following function should return <A REL=DEFINITION HREF="a_t.htm#t"><B>t</B></A> on any <A REL=DEFINITION HREF="26_glo_p.htm#package"><I>package</I></A>, and signal an error if the usage of <A REL=DEFINITION HREF="#with-package-iterator"><B>with-package-iterator</B></A> does not agree with the corresponding usage of <A REL=DEFINITION HREF="m_do_sym.htm#do-symbols"><B>do-symbols</B></A>. <P>
<PRE>
(defun test-package-iterator (package)
(unless (packagep package)
(setq package (find-package package)))
(let ((all-entries '())
(generated-entries '()))
(do-symbols (x package)
(multiple-value-bind (symbol accessibility)
(find-symbol (symbol-name x) package)
(push (list symbol accessibility) all-entries)))
(with-package-iterator (generator-fn package
:internal :external :inherited)
(loop
(multiple-value-bind (more? symbol accessibility pkg)
(generator-fn)
(unless more? (return))
(let ((l (multiple-value-list (find-symbol (symbol-name symbol)
package))))
(unless (equal l (list symbol accessibility))
(error &quot;Symbol ~S not found as ~S in package ~A [~S]&quot;
symbol accessibility (package-name package) l))
(push l generated-entries)))))
(unless (and (subsetp all-entries generated-entries :test #'equal)
(subsetp generated-entries all-entries :test #'equal))
(error &quot;Generated entries and Do-Symbols entries don't correspond&quot;))
t))
</PRE>
</TT> <P>
The following function prints out every <A REL=DEFINITION HREF="26_glo_p.htm#present"><I>present</I></A> <A REL=DEFINITION HREF="26_glo_s.htm#symbol"><I>symbol</I></A> (possibly more than once): <P>
<PRE>
(defun print-all-symbols ()
(with-package-iterator (next-symbol (list-all-packages)
:internal :external)
(loop
(multiple-value-bind (more? symbol) (next-symbol)
(if more?
(print symbol)
(return))))))
</PRE>
</TT> <P>
<P><B>Side Effects:</B> None.
<P>
<P><B>Affected By:</B> None.
<P>
<P><B>Exceptional Situations:</B><P>
<P>
<A REL=DEFINITION HREF="#with-package-iterator"><B>with-package-iterator</B></A> signals an error of <A REL=DEFINITION HREF="26_glo_t.htm#type"><I>type</I></A> <A REL=DEFINITION HREF="e_progra.htm#program-error"><B>program-error</B></A> if no <I>symbol-types</I> are supplied or if a <I>symbol-type</I> is not recognized by the implementation is supplied. <P>
The consequences are undefined if the local function named <I>name</I> <I>established</I> by <A REL=DEFINITION HREF="#with-package-iterator"><B>with-package-iterator</B></A> is called after it has returned <A REL=DEFINITION HREF="26_glo_f.htm#false"><I>false</I></A> as its <A REL=DEFINITION HREF="26_glo_p.htm#primary_value"><I>primary value</I></A>. <P>
<P><B>See Also:</B><P>
<P>
<A REL=CHILD HREF="03_f.htm">Section 3.6 (Traversal Rules and Side Effects)</A> <P>
<P><B>Notes:</B> None.
<P>
<P>
<P><HR>The following <A REL=META HREF="../Front/X3J13Iss.htm">X3J13 cleanup issues</A>, <I>not part of the specification</I>, apply to this section:<P><UL><LI> <A REL=CHILD HREF="../Issues/iss240.htm">MAPPING-DESTRUCTIVE-INTERACTION:EXPLICITLY-VAGUE</A><LI> <A REL=CHILD HREF="../Issues/iss188.htm">HASH-TABLE-PACKAGE-GENERATORS:ADD-WITH-WRAPPER</A><LI> <A REL=CHILD HREF="../Issues/iss097.htm">DECLS-AND-DOC</A><P></UL><HR>
<A REL=NAVIGATOR HREF="../Front/StartPts.htm"><IMG WIDTH=80 HEIGHT=40 ALT="[Starting Points]" SRC="../Graphics/StartPts.gif" ALIGN=Bottom></A><A REL=TOC HREF="../Front/Contents.htm"><IMG WIDTH=80 HEIGHT=40 ALT="[Contents]" SRC="../Graphics/Contents.gif" ALIGN=Bottom></A><A REL=INDEX HREF="../Front/X_Master.htm"><IMG WIDTH=80 HEIGHT=40 ALT="[Index]" SRC="../Graphics/Index.gif" ALIGN=Bottom></A><A REL=INDEX HREF="../Front/X_Symbol.htm"><IMG WIDTH=80 HEIGHT=40 ALT="[Symbols]" SRC="../Graphics/Symbols.gif" ALIGN=Bottom></A><A REL=GLOSSARY HREF="../Body/26_a.htm"><IMG WIDTH=80 HEIGHT=40 ALT="[Glossary]" SRC="../Graphics/Glossary.gif" ALIGN=Bottom></A><A HREF="../Front/X3J13Iss.htm"><IMG WIDTH=80 HEIGHT=40 ALT="[Issues]" SRC="../Graphics/Issues.gif" ALIGN=Bottom></A><BR>
<A REL=COPYRIGHT HREF="../Front/Help.htm#Legal"><I>Copyright 1996-2005, LispWorks Ltd. All rights reserved.</I></A><P>
</BODY>
</HTML>