I think you're missing the point Edi :)
Here is a simple example that I think gets to the heart of the problem: I'm certainly not claiming that this isn't a problem with my understanding, however :)
When you visit /foo, the webpage returned displays this text: "package: #<The COMMON-LISP-USER package>"
What I'm not understanding is *why* that is what is displayed. I would have hoped for "package: #<MYPACKAGE package>".
(defpackage :mypackage) (in-package :mypackage)
(defun some-func () (cl-who:with-html-output-to-string (*standard-output* nil :prologue nil :indent nil) (:HTML (:HEAD (:TITLE "foo")) (:BODY (cl-who:str (CL-WHO:ESCAPE-STRING (format () "package: ~A" *package*)))))))
(setq tbnl:*dispatch-table* (list (tbnl:create-prefix-dispatcher "/foo" #'some-func)))
Jim
James E. Prewett Jim@Prewett.org download@hpc.unm.edu Systems Team Leader LoGS: http://www.hpc.unm.edu/~download/LoGS/ Designated Security Officer OpenPGP key: pub 1024D/31816D93 HPC Systems Engineer III UNM HPC 505.277.8210
On Fri, 10 Feb 2006, Edi Weitz wrote:
On Fri, 10 Feb 2006 06:25:45 -0700 (MST), Jim Prewett download@hpc.unm.edu wrote:
I'm guessing this is what I just ran into and the answer is your new function names and symbols will be interned in :CL-USER :) I'd love to know how to change that, but haven't bothered to dig yet. (in my case, :CL-USER would be my second choice after one of my own packages)
In my case, I had code that uses the multi-method dispatch mechanism to display the right page (I'm not yet sure if thats a good idea :) something like this:
(defmethod display-page (page-name (eql 'login-page)) ... )
To convert the text strings given by the user into the right symbol (so this dispatch mecnhanism can work), I must intern them in the :CL-USER package.
This did take me a while to figure out and *I* couldn't find it in the documentation anywhere. (I guess, maybe, it should have been obvious, but I still consider myself mostly a Lisp newbie). I believe my CMUCL Lisp starts with a core file causing it to start in :Jims-PackageA, then I've been loading a file (that causes TBNL and all that good stuff to be loaded) and immediately switching to :Jims-PackageB, so it was really confusing to be using the :CL-USER package at all. :)
Hmm. It /seems/ to me that both of you are rather talking about general problems with packages and not about TBNL in particular. TBNL itself never interns symbols except when it creates keywords, and in this case the package is clearly defined.
You should always create your own package to work in if you write code, don't use CL-USER. See test.lisp in TBNL for an example.
If your code looks like this
(defmethod display-page (page-name (eql 'login-page)) ... )
then LOGIN-PAGE will be a symbol accessible in the package you're in, i.e. the package of the file the method is defined in (assuming you used LOAD to load the file). In 99.9% of all cases this should be the package you find in the very first line starting with IN-PACKAGE. If you don't have such a line there - see above... :)
Sorry if that sounds patronizing, maybe I'm again missing the point.
Cheers, Edi.