Thank you for your answer. That explains why I could not find any
information about the package namespaces in Maxima's documentation.
namespaces' functionality loosely reminds me Fortran 90's "module"
structure, which I use a lot in my Fortran programs. However, it is not the
same. I think I'll use namespaces only when it is absolutely necessary,
given it is not lexical but dynamic (as it is a big part of Maxima itself, I
think.)
As for the Python replacement, I am not sure it is worth the effort. Python
is very limited, to be honest.
2011/10/8 Robert Dodier <robert.dodier at gmail.com>
> On 10/6/11, Panagiotis Papasotiriou <p.j.papasot at gmail.com> wrote:
>
> > example, suppose package foo.mac defines 2 global functions A and B. I am
> > looking for a way to declare a variable/function C which would be local
> to
> > the package, so that only functions A and B will have access to it. Such
> a
> > local variable/function should not be visible to any other function
> defined
> > outside foo.mac, so that typing values; in a Maxima session won't even
> list
> > it.
>
> Well, there exists the share package "namespaces" which exposes
> CL's package mechanism. I guess it works OK.
> You can define A, B, and C in a namespace such that outside that
> namespace, A, B, and C refer to other things.
>
> e.g.
>
> ---- begin /tmp/foo.mac ----
> in_namespace (foo);
> A (x) := 1 - x;
> B (x) := 2 * x;
> C : 12345;
> ---- end foo.mac ----
>
> ---- in your Maxima session ----
> load (namespaces);
> load_namespace ("/tmp/foo.mac");
> A (100);
> => A(100)
> foo|A (100);
> => - 99
> C;
> => C
> C : 5678;
> foo|C;
> => 12345
> foo|C : 54321;
> C;
> => 5678
> functions;
> => [foo|A(foo|x), foo|B(foo|x)]
> values;
> => [foo|C, C]
> ---- end Maxima session ----
>
> Some notes:
>
> (1) namespaces are an experimental feature
> (2) namespaces are dynamic, not lexical:
> you change the namespace via in_namespace function call;
> the namespace isn't associated with a lexical unit
> (3) documentation in comment header of
> share/contrib/namespaces/namespaces.lisp
> (4) in_namespace changes the Lisp package so it has the potential
> to confuse Lisp code which makes assumptions about packages
> (:cl-user, :maxima, etc)
> (5) namespaces doesn't hide the existence of symbols
>
> At this point I would say that the biggest unresolved problem is to
> make sure that namespaces play nice w/ Lisp, and the biggest improvement
> would be to make namespaces lexical instead of dynamic.
>
> > Such a functionality, often called data hiding, is absolutely necessary
> for
> > creating something more complicated than a simple package, so I guess
> there
> > is a way to do it in Maxima, although I was not able to find a way by
> > looking to the documentation.
>
> Yeah -- Maxima's user language is pretty weak in that department ...
> Occasionally I have daydreams about replacing it with an existing language
> or an extension of one. E.g. Python + modified evaluation to allow
> partial evaluation of expressions. (Yes, I do understand that's a
> pretty big deal.)
>
> best
>
> Robert Dodier
>