From: Gerard R. <g.r...@fr...> - 2013-02-10 09:59:20
|
cat packagefoo.lisp (defpackage :foo) (in-package :foo) * (load "packagefoo") T * cl-user::*package* #<PACKAGE "COMMON-LISP-USER"> I expected #<COMMON-LISP:PACKAGE "FOO"> how can I run the program "packagefoo" as expected ? -- Gérard |
From: <ded...@ya...> - 2013-02-10 10:07:00
|
>cat packagefoo.lisp > >(defpackage :foo) >(in-package :foo) > >* (load "packagefoo") >T >* cl-user::*package* > >#<PACKAGE "COMMON-LISP-USER"> > >I expected >#<COMMON-LISP:PACKAGE "FOO"> > >how can I run the program "packagefoo" as expected ? Common Lisp HyperSpec: >load binds *readtable* and *package* to the values they held before loading the file. So, after the load is complete tha package is supposed to be reset no matter what. |
From: Stas B. <sta...@gm...> - 2013-02-10 10:07:24
|
Gerard ROBIN <g.r...@fr...> writes: > cat packagefoo.lisp > > (defpackage :foo) > (in-package :foo) > > * (load "packagefoo") > T > * cl-user::*package* > > #<PACKAGE "COMMON-LISP-USER"> > > I expected > #<COMMON-LISP:PACKAGE "FOO"> > > how can I run the program "packagefoo" as expected ? You can't. And your expectation is wrong. "load binds *readtable* and *package* to the values they held before loading the file." -- With best regards, Stas. |
From: Pascal J. B. <pj...@in...> - 2013-02-10 11:09:55
|
Stas Boukarev <sta...@gm...> writes: > Gerard ROBIN <g.r...@fr...> writes: > >> cat packagefoo.lisp >> >> (defpackage :foo) >> (in-package :foo) >> >> * (load "packagefoo") >> T >> * cl-user::*package* >> >> #<PACKAGE "COMMON-LISP-USER"> >> >> I expected >> #<COMMON-LISP:PACKAGE "FOO"> >> >> how can I run the program "packagefoo" as expected ? > You can't. And your expectation is wrong. > "load binds *readtable* and *package* to the values they held before > loading the file." The expectation is wrong, but we can still do it: -----(my-load.lisp)------------------------------------------------------ (defvar *source-file-types* '("LISP" "LSP")) (defun my-load (filespec &key (verbose *load-verbose*) (print *load-print*) (if-does-not-exist t) (external-format :default)) (unless (member (pathname-type (pathname filespec)) *source-file-types* :test (function string-equal)) (error "How can we load fasl files without shadowing the *PACKAGE*?")) (if (or (stringp filespec) (pathnamep filespec)) (with-open-file (stream filespec :if-does-not-exist if-does-not-exist :external-format external-format) (my-load stream :verbose verbose :print print :if-does-not-exist if-does-not-exist :external-format external-format)) (loop :for sexp = (read filespec nil filespec) :until (eq sexp filespec) :do (eval sexp)))) ----(my-load-test.lisp)-------------------------------------------------- (unless (find-package "FOO") (make-package "FOO" :use '("CL"))) (in-package "FOO") (defun bar () 'hi) ------------------------------------------------------------------------ cl-user> (load "~/my-load.lisp") #P"/home/pjb/my-load.lisp" cl-user> (load "~/my-load-test.lisp") #P"/home/pjb/my-load-test.lisp" cl-user> (my-load "~/my-load-test.lisp") nil foo> (bar) hi foo> Now, of course, to load fasl files without going thru cl:load, you would need either an implementation specific low level function, or you would need to rewrite a my-compile-file generating a known format, and implement reading it in my-load, which would also require implementation specific low level functions, if you want to load actual code vectors. But the problem is not this. The problem as experimenting with my-load is that *package* and *readtable* can be modified by loading a file. By the way it's funny that the other *read-…* variable are not shadowed the same way. Distributing a file file with (setf *read-base* 5.) should be "fun". -- __Pascal Bourguignon__ http://www.informatimago.com/ A bad day in () is better than a good day in {}. |
From: Gerard R. <g.r...@fr...> - 2013-02-10 19:46:12
|
* (load "my-load") T * (load "my-load-test.lisp") T * (my-load "my-load-test.lisp") debugger invoked on a TYPE-ERROR in thread #<THREAD "main thread" RUNNING {AB1F849}>: The value T is not of type (MEMBER NIL :CREATE :ERROR). Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level. (OPEN "my-load-test.lisp" :DIRECTION :INPUT :ELEMENT-TYPE BASE-CHAR :IF-EXISTS NIL :IF-DOES-NOT-EXIST T :EXTERNAL-FORMAT :DEFAULT) 0] maybe my version of sbcl is too old ? I use version 2:1.0.57.0-2 in wheezy (Debian) I asked this question because to run the examples in this program: ;;;; Examples that demonstrate some plplot graphs that can be made ;;;; with the cl-plplot-system package. ;;;; hazen 3/06 ;;;; http://common-lisp.net/project/cl-plplot/ (defpackage :system-examples (:use :common-lisp :cl-plplot-system)) (in-package :system-examples) -----------------------------8<------------------------------- to perform the function "plot", I have to write : (system-examples::plot) apart from that this is an interesting program for drawing graphs of functions. -- Gérard |
From: Gerard R. <g.r...@fr...> - 2013-02-11 07:12:31
|
On Sun, Feb 10, 2013 at 12:09:32PM +0100, Pascal J. Bourguignon wrote: > Date: Sun, 10 Feb 2013 12:09:32 +0100 > From: "Pascal J. Bourguignon" <pj...@in...> > To: Stas Boukarev <sta...@gm...> > Cc: Gerard ROBIN <g.r...@fr...>, sbcl-help > <sbc...@li...> > Subject: Re: [Sbcl-help] (make-package :foo) (in-package :foo) > -----(my-load.lisp)------------------------------------------------------ > (defvar *source-file-types* '("LISP" "LSP")) > > (defun my-load (filespec &key (verbose *load-verbose*) (print *load-print*) (if-does-not-exist t) (external-format :default)) --------------------------------------8<----------------------------- rewriting the previous line : (defun my-load (filespec &key (verbose *load-verbose*) (print *load-print*) (if-does-not-exist nil) (external-format :default)) it works for me. -- Gérard |