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? ...
- 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.