<div dir="ltr">Not exactly what I meant<div><br></div><div>(use file) ;will create a package <current-dir>/file.lisp with a nickname file</div><div>and load the file, then it imports all the external symbol from file (it first saves the</div>
<div>symbols with the same name, if they exist, in the current package *package*)</div><div><br></div><div>(unuse file) ;; unintern all external symbol of file and restores the saved symbols (if they exist)</div><div><br>
</div><div><br></div><div>now, I use this as follows (from top level)</div><div><br></div><div>? *package*</div><div>#<Package "COMMON-LISP-USER"><br></div><div>? (defun share (x) (+ x 1))<br></div><div>SHARE</div>
<div>? (use calculus) ;;;; calculus exports the symbol SHARE</div><div>NIL</div><div>? (find-package :calculus)<br></div><div>#<Package "/Users/mazeboard/workspace/ccl/CALCULUS.LISP"><br></div><div>? (share 3)  ;; uses the symbol CALCULUS::SHARE</div>
<div>.3 boxes:(NIL)</div><div>.r:3</div><div>3</div><div>? (unuse calculus)  ; this will delete package calculus and restore the symbol COMMON-LISP-USER::SHARE</div><div>NIL</div><div>? (share 3)  ;; using the restored symbol COMMON-LISP-USER::SHARE</div>
<div>4</div><div>? </div><div><br></div><div>Now, I wanted to define with-package</div><div><br></div><div><div>(defmacro with-package ((&rest names) &body body)</div><div>  `(progn</div><div>     (use ,@names)</div>
<div>     ,@body</div><div>     (unuse ,@(reverse names))))</div></div><div><br></div><div><br></div><div>But the problem when I use with-package as follows:</div><div><br></div><div>? *package*</div><div><div>#<Package "COMMON-LISP-USER"><br>
</div></div><div><div>?  (with-package (calculus) (share 3))</div><div>NIL  ;;; I did not use CALCULUS::SHARE</div><div>? (share 3)</div><div>4</div><div>? </div></div><div><br></div><div>I want to find a solution to be able to use with-package such that the imported symbols from calculus are interned in the current package  before reading and/or compiling the body of with-package</div>
<div><br></div><div>I want (with-package (names) body) to behave exactly as (toplevel)</div><div>? (use names)</div><div>? body</div><div>? (unuse (reverse names))</div><div><br></div><div><br></div><div>Taoufik</div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Jan 12, 2013 at 3:12 PM, Pascal J. Bourguignon <span dir="ltr"><<a href="mailto:pjb@informatimago.com" target="_blank">pjb@informatimago.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">Taoufik Dachraoui <<a href="mailto:dachraoui.taoufik@gmail.com">dachraoui.taoufik@gmail.com</a>> writes:<br>

<br>
> On Sat, Jan 12, 2013 at 2:36 PM, Pascal J. Bourguignon <<br>
> <a href="mailto:pjb@informatimago.com">pjb@informatimago.com</a>> wrote:<br>
><br>
>     Taoufik Dachraoui <<a href="mailto:dachraoui.taoufik@gmail.com">dachraoui.taoufik@gmail.com</a>> writes:<br>
><br>
>     > Hi<br>
>     ><br>
>     > I am trying to define a macro as follows:<br>
>     ><br>
>     > (defmacro with-package ((&rest names) &body body)<br>
>     >   `(progn<br>
>     >      (use ,@names)<br>
>     >      ,@body<br>
>     >      (unuse ,@(reverse names))))<br>
>     ><br>
>     > The issue is that the body may use symbols defined in one of<br>
>     > the names (packages) and not in the current package<br>
><br>
>     "Current" WHEN?<br>
><br>
><br>
><br>
>     > How to do this? I tried with eval-when but I do not know how to<br>
>     use<br>
>     > it correctly<br>
><br>
>     What are the situations available to eval-WHEN?<br>
><br>
</div><div class="im">> Current package when you call with-package <br>
<br>
</div>Ok.  When you call with-package, it's at run-time.  And at run-time you<br>
can use the current package bound to *package* without any difficulty.<br>
<br>
With:<br>
<br>
    (defun use*   (syms) (format t "I'll use ~S~%" syms))<br>
    (defun unuse* (syms) (format t "I unused ~S~%" syms))<br>
<br>
    (defmacro use    (&rest syms) `(use* ',syms))<br>
    (defmacro unuse  (&rest syms) `(unuse* ',syms))<br>
<div class="im"><br>
    (defmacro with-package ((&rest names) &body body)<br>
      `(progn<br>
         (use ,@names)<br>
         ,@body<br>
         (unuse ,@(reverse names))))<br>
<br>
</div>    (defpackage :p1 (:export :*v*))<br>
    (defparameter p1:*v* 42)<br>
<br>
<br>
we get:<br>
<br>
    cl-user> (let ((*package* (find-package :p1)))<br>
               (with-package (a b)<br>
                 (let ((s (find-symbol "*V*" *package*)))<br>
                   (print (list s (symbol-value s)))<br>
                   (terpri))))<br>
    I'll use (common-lisp-user::a common-lisp-user::b)<br>
<br>
    (*v* 42)<br>
    I unused (common-lisp-user::b common-lisp-user::a)<br>
    nil<br>
<br>
As you can see, at run-time, find-symbol found the symbol P1:*V* in the<br>
current package that was the package named "P1", and print even printed<br>
it as *v*, since CL:*PACKAGE* was bound to that  package named "P1" (and<br>
I have CL:*PRINT-CASE* set to :DOWNCASE).<br>
<div class="im"><br>
<br>
> ? *package*<br>
> #<Package "COMMON-LISP-USER"><br>
><br>
> ;; The curent package is COMMON-LISP-USER<br>
><br>
> ? (with-package (calculus) (share '(fn x (+ x 1))))<br>
> ;;; (share '(fn x (+ x 1))) must be evaluated (use calculus), where<br>
> share is imported from the package calculus<br>
<br>
</div>It does.  See above, my macro USE is called at run-time.<br>
<div class="im"><br>
<br>
> I tried the following to show the issue:<br>
><br>
> ? (unintern 'share)<br>
> T<br>
> ? (use calculus)<br>
> NIL<br>
<br>
</div>Well here I get:<br>
<br>
    cl-user> (use calculus)<br>
    I'll use (calculus)<br>
    nil<br>
<div class="im"><br>
<br>
> ? (values (find-symbol "SHARE") (symbol-package 'share))<br>
> SHARE<br>
> #<Package "/Users/mazeboard/workspace/ccl/CALCULUS.LISP"><br>
<br>
</div>A strange name for a package, but why not.<br>
<div class="im"><br>
<br>
> ? (share '(fn x (+ x 1)))<br>
> ... ; result of the function share imported from calculus<br>
<br>
> ? (unuse calculus)<br>
> NIL<br>
<br>
</div>Same here:<br>
<br>
    cl-user> (unuse calculus)<br>
    I unused (calculus)<br>
    nil<br>
<div class="im"><br>
<br>
<br>
> ? (values (find-symbol "SHARE") (symbol-package 'share))<br>
> SHARE<br>
> #<Package "COMMON-LISP-USER">  ;;; after unuse calculus SHARE is not<br>
> from calculus anymore<br>
> ? (progn (use calculus) (values (find-symbol "SHARE") (symbol-package<br>
> 'share)))<br>
> SHARE<br>
> NIL<br>
> ? <br>
><br>
> As you can see in the last expression (progn) even though we use<br>
> calculus the symbol SHARE is<br>
> not visible<br>
<br>
<br>
</div>In:<br>
<br>
    (in-package "COMMON-LISP-USER)<br>
<div class="im">    (with-package (calculus)<br>
      (share '(fn x (+ x 1))))<br>
<br>
</div>the symbols WITH-PACKAGE CALCULUS SHARE FN and X are all interned in the<br>
package named "COMMON-LISP-USER" (unless you've used a package that<br>
export them or you've imported them from another package).<br>
<br>
WHEN are they interned?  At READ-TIME!<br>
<br>
<br>
Do the operator COMMON-LISP-USER:SHARE use the value of CL:*PACKAGE* at<br>
RUN-TIME?<br>
<br>
<br>
See my example, I used CL:*PACKAGE* at run-time twice:<br>
<br>
- once explicitely by passing *package* to find-symbol.<br>
<br>
- once implicitely by calling print which uses *package* to determine<br>
  how to print symbols.<br>
<br>
<br>
Perhaps you could have a look at:<br>
<a href="http://www.nhplace.com/kent/PS/Ambitious.html" target="_blank">http://www.nhplace.com/kent/PS/Ambitious.html</a><br>
<div class="HOEnZb"><div class="h5"><br>
--<br>
__Pascal Bourguignon__                     <a href="http://www.informatimago.com/" target="_blank">http://www.informatimago.com/</a><br>
A bad day in () is better than a good day in {}.<br>
<br>
_______________________________________________<br>
Openmcl-devel mailing list<br>
<a href="mailto:Openmcl-devel@clozure.com">Openmcl-devel@clozure.com</a><br>
<a href="http://clozure.com/mailman/listinfo/openmcl-devel" target="_blank">http://clozure.com/mailman/listinfo/openmcl-devel</a><br>
</div></div></blockquote></div><br></div>