View · Search · Index
No registered users in community xowiki
in last 10 minutes

Re: [Xotcl] xotcl namespace auto-import

From: Neil Madden <nem_at_cs.nott.ac.uk>
Date: Tue, 25 May 2004 14:13:05 +0100

Thanks for the reply. Comments below.

On 25 May 2004, at 09:43, Gustaf Neumann wrote:
> On Monday 24 May 2004 22:57, Neil Madden wrote:
>> Hello all,
>>
>> Small feature request: could XOTcl be made to automatically [namespace
>> import] the ::xotcl::* commands into every object it creates?
>> ...
>> 1) Fully qualify everything - lots of xotcl::my, xotcl::self etc
>> everywhere
>> 2) Import xotcl namespace manually into each object namespace.
>
> or 3) do a gobal namespace import.

That's generally not considered good style when writing a package - the
global namespace is "owned" by the application author, and so packages
shouldn't put stuff there unless explicitly asked.

>
>> 2 is better than 1, but is still a bit of a pain to remember to do,
>> and
>> I seem to remember trying it and it not always working (I could be
>> wrong about that).
>
> (2) does not help too much, since xotcl is "namespace transparent",
> which means that it simply keeps the current namespace.
> This means that if you do a "namespace eval xxx {o m}"
> the method is evaled in the namespace xxx (and not o}.

OK. That's good to know. But this namespace transparency does not
extend all the way. For instance:

package require XOTcl
namespace eval foo {
     proc bar {} { puts "ns = [namespace current]" }
     xotcl::Class Bar
     Bar instproc foo {} { puts "ns = [namespace current]" }
     Bar a
}
foo::bar ;# prints "ns = ::foo"
foo::a foo ;# prints "ns = ::"

I would expect that any object I create in a namespace will always be
evaluated in that namespace, as is the case for procs. Given the
namespace transparency you describe above, this would solve all my
problems.

<snip memory usage discussion>

>> So, my feature request would be that all Objects [namespace import]
>> the
>> xotcl namespace automatically.[1]
>
> we had something like this in earlier versions of xotcl, but it was
> quite
> a pain, where it was quite easy to run into inifine loops, since
> procs of objects were resolved without the object name. To be on
> the safe side, every reference to a gobal tcl command had to be
> prefixed by a :: (eg: ::set x 1), otherwise an "obj proc set .."
> was overruling the tcl command.

I'm not sure what you mean here. I wasn't suggesting that methods
should be able to be called without passing a message to self, just
that "my", "self" etc should be imported into each object.

> Note that we have multiple
> command sets in xotcl, not only in the procs, but in the instprocs
> of classes (superclasses, mixins) as well.
>
> you can do the following as other alternatives:
> a) you can import the xotcl commands into your
> components workspace, and do a namespace eval
> there
> b) you can eval the object in the ::xotcl namespace

Neither of these alternatives are particularly appealing, as they
require the consumer of my package to know to do this, and it would
clutter up their code quite a bit. I suppose I could write a wrapper
proc for each object:

xotcl::Class MyClass -superclass xotcl::Class
MyClass instproc create {name args} {
     eval [linsert $args 0 next ${name}_]
     uplevel 1 [list proc $name {args} "uplevel 1 \[linsert \$args 0
${name}_\]"]
}

But this still feels like something XOTcl should be doing for me.

> ... and, you can write a global unknown handler, but that is not
> better than importing xotcl (or at least self+my) globally, what
> still looks like the best option to me.

In 8.5 (hopefully) my [namespace unknown] TIP (181) will get in, so you
could do this per-namespace. But it is still a hack. For now, I will
import into my package namespace, and use wrapper procs.

Neil.