Introduction
... general text, maybe partly from slides/paper ....
TODO: I think, we should not use ::nx::core, but import "needed" commands into
::nx.
Supporting XOTcl 1 in Next
In general, the Next environment supports multiple object
systems concurrently. Effectively, every object system has different
base classes for creating both, objects and classes. Therefore, the
object systems can have different different interfaces and names of
builtin methods. Currently, Next supports primarily XOTcl and the
Next scripting language (XOTcl provides about twice as many predefined builtin
methods compared to Next).
A single Tcl interpreter can host both, XOTcl and the Next
scripting language at the same time. This makes migration
from XOTcl to Next easier. The following example script shows to use
in a single XOTcl and Next
namespace eval mypackage {
package require XOTcl
# Import XOTcl into the current namespace
namespace import -force ::xotcl::*
# Define a class using XOTcl
Class C1
C1 instproc foo {} {puts "hello world"}
# Import Next into the current namespace
namespace import -force ::nx::*
# Define a class using Next
Class create C2 {
:method foo {} {puts "hello world"}
}
}
"Switching" between XOTcl and Next effectively means the load some
libraries if needed and to import either the base classes
(Object
and Class
) of XOTcl or Next
into the current namespace.
XOTcl Idioms in the Next scripting language
Defining Objects and Classes
XOTcl | Next |
Class ClassName |
Class create ClassName |
Object ObjectName |
Object create ObjectName |
::xotcl::Class ClassName |
::nx::Class create ClassName |
::xotcl::Object ObjectName |
::nx::Object create ObjectName |
Defining Methods
XOTcl | Next |
Class C
C instproc foo args {...}
C proc bar args {...}
|
Class create C {
:method foo args {...}
:object method bar args {...}
}
Class create C
C method foo args {...}
C object method bar args {...}
|
Object o
o set x 1
o proc foo args {...}
|
Object create o {
set :x 1
:method foo args {...}
}
Object create o
o eval {set :x 1}
# ::nx::core::setvar o x 1
o method foo args {...}
|
Resolvers
Next defines Tcl resolvers for method and variable names to refer
to object specific behavior. Withing method bodies these resolver
treat names staring with a dot "." specially. If one wants to refer to
a name starting with a "." (e.g. the name of a Tcl function starts
with a dot), the dot has to be duplicated, or one has to use the
usual namespace prefix "::" to refer to a namespaced entity. Note that
the Next resolvers are used in the XOTcl environment as well.
Invoking Methods
XOTcl | Next |
Class C
C instproc foo args {...}
C instproc bar args {
my foo 1 2 3 ;# invoke own method
o baz ;# invoke others method
}
Object o
o proc baz {} {...}
|
Class create C {
:method foo args {...}
:method bar args {
:foo 1 2 3 ;# invoke own method
o baz ;# invoke others method
}
}
Object create o {
:method baz {} {...}
}
|
Accessing Instance Variables from Method Bodies
XOTcl | Next |
Class C
C instproc foo args {
# method scoped variable a
set a 1
# instance variable b
my instvar b
set b 2
# global variable/namespaced variable c
set ::c 3
}
|
Class create C {
:method foo args {...}
# method scoped variable a
set a 1
# instance variable b
set :b 2
# global variable/namespaced variable c
set ::c 3
}
}
|
my set varname value |
set :varname value |
set newVar [my set otherVar] |
set newVar [set :otherVar]
set newVar ${:otherVar}
|
my instvar newVar
set newVar value
|
set :newVar value |
my exists varname |
info :varname |
Accessing Instance Variables of other Objects
XOTcl | Next |
obj set varname value |
obj eval [list set :varname value] |
set newVar [obj set otherVar] |
set newVar [obj eval {set :otherVar}]
|
obj instvar newVar
set newVar value
|
::nx::core::importvar obj newVar
set newVar value |
obj exists varname |
obj eval {info exists :varname} |
Object Parameters
Method Parameters
Introspection
List methods defined by objects
XOTcl | Next |
obj info commands ?pattern? |
obj info methods ?pattern? |
obj info parametercmd ?pattern? |
obj info methods -methodtype setter ?pattern? |
obj info procs ?pattern? |
obj info methods -methodtype scripted ?pattern? |
n.a. |
obj info methods -methodtype alias ?pattern? |
n.a. |
obj info methods -methodtype forwarder ?pattern? |
n.a. |
obj info methods -methodtype object ?pattern? |
n.a. |
obj info methods -callprotection public|protected ... |
List methods defined by classes
cls info instcommands ?pattern? |
cls info methods ?pattern? |
cls info instparametercmd ?pattern? |
cls info methods -methodtype setter ?pattern? |
cls info instprocs ?pattern? |
cls info methods -methodtype scripted ?pattern? |
n.a. |
cls info methods -methodtype alias ?pattern? |
n.a. |
cls info methods -methodtype forwarder ?pattern? |
n.a. |
cls info methods -methodtype object ?pattern? |
n.a. |
cls info methods -callprotection public|protected ... |
List class object specific methods
cls info commands ?pattern? |
cls object info methods ?pattern? |
cls info parametercmd ?pattern? |
cls object info methods -methodtype setter ?pattern? |
cls info procs ?pattern? |
cls object info methods -methodtype scripted ?pattern? |
n.a. |
cls object info methods -methodtype alias ?pattern? |
n.a. |
cls object info methods -methodtype forwarder ?pattern? |
n.a. |
cls object info methods -methodtype object ?pattern? |
n.a. |
cls object info methods -callprotection public|protected ... |
List callable methods
XOTcl | Next |
obj info methods ?pattern? |
obj info callable ?pattern? |
n.a. |
# list only application specific methods
obj info callable -application |
List object/class where some method is defined
XOTcl | Next |
obj procsearch methodName |
obj info callable -which methodName |
List definition of scripted methods defined by classes
XOTcl | Next |
cls info instbody methodName |
cls info method body methodName |
cls info instargs methodName |
cls info method args methodName |
cls info instnonposargs methodName |
cls info method parameter methodName |
cls info instdefault methodName |
cls info method parameter methodName |
cls info instpre methodName |
cls info method precondition methodName |
cls info instpost methodName |
cls info method postcondition methodName |
n.a. |
cls info method definition methodName |
List definition of scripted object specific methods
XOTcl | Next |
obj info body methodName |
obj info method body methodName |
obj info args methodName |
obj info method args methodName |
obj info nonposargs methodName |
obj info method parameter methodName |
obj info default methodName |
obj info method parameter methodName |
obj info pre methodName |
obj info method precondition methodName |
obj info post methodName |
obj info method postcondition methodName |
n.a. |
obj info method definition methodName |
For definition of class object specific methods, use modifier
object
as shown in examples above.
List filter or mixins
XOTcl | Next |
obj info filter ?-order? ?-guards? ?pattern? |
obj info filter ?-order? ?-guards? ?pattern? |
cls info filter ?-order? ?-guards? ?pattern? |
cls object info filter ?-order? ?-guards? ?pattern? |
cls info instfilter ?-order? ?-guards? ?pattern? |
cls info filter ?-order? ?-guards? ?pattern? |
obj info mixin ?-order? ?-guards? ?pattern? |
obj info mixin ?-order? ?-guards? ?pattern? |
cls info mixin ?-order? ?-guards? ?pattern? |
cls object info mixin ?-order? ?-guards? ?pattern? |
cls info instmixin ?-order? ?-guards? ?pattern? |
cls info mixin ?-order? ?-guards? ?pattern? |
List definition of methods defined by aliases, setters or forwarders
XOTcl | Next |
n.a. |
obj info method definition methodName |
n.a. |
cls ?object? info method definition methodName |
List fully qualified name of method
XOTcl | Next |
n.a. |
obj info method name methodName |
n.a. |
cls ?object? info method name methodName |
List type of a method
XOTcl | Next |
n.a. |
obj info method type methodName |
n.a. |
cls ?object? info method type methodName |
List the scope of mixin classes
XOTcl | Next |
cls info mixinof ?-closure? ?pattern? |
cls info mixinof -scope object ?-closure? ?pattern? |
cls info instmixinof ?-closure? ?pattern? |
cls info mixinof -scope class ?-closure? ?pattern? |
n.a. |
cls info mixinof -scope all ?-closure? ?pattern? |
Check properties of object and classes
XOTcl | Next |
obj istype sometype |
TODO: ::nx::core::objectproperty and/or
::nx::objectproperty and/or nx::is?
::nx::core::objectproperty obj type sometype
obj info is type sometype
|
obj ismixin cls |
::nx::core::objectproperty obj mixin cls
obj info is mixin cls
|
obj isclass ?cls? |
::nx::core::objectproperty obj|cls class
obj info is class
|
obj ismetaclass cls |
::nx::core::objectproperty obj|cls metaclass
obj info is metaclass
|
n.a. |
::nx::core::objectproperty cls baseclass
cls info is baseclass
|
obj isobject obj2 |
::nx::core::objectproperty obj|obj2 object
obj info is object
|
Predefined Methods
Dispatch, Aliases, etc.
Assertions
XOTcl | Next |
obj check checkptions |
::nx::core::assertion obj check checkptions |
obj info check |
::nx::core::assertion obj check |
obj invar conditions |
::nx::core::assertion obj object-invar conditions |
obj info invar |
::nx::core::assertion obj object-invar |
cls instinvar conditions |
::nx::core::assertion cls class-invar conditions |
cls info instinvar |
::nx::core::assertion cls class-invar |
cls invar conditions |
::nx::core::assertion cls object-invar conditions |
cls info invar |
::nx::core::assertion cls object-invar |
Method Protection
Incompatibilities
Namespace resolvers
The Next namespace resolvers are use as well when XOTcl is used
within Next.
Stronger Checking
Next performs stronger checking than XOTcl. The requiredness
of slots in XOTcl was just a comment, while Next enforces it.
Different results
[self next]
returns
instead of "proc" and "instproc" => "method"
instead of "parametercmd" and "instparametercmd" => "setter"
instead of "instforward" => "forward"
instead of "instcmd" => "cmd".
The modifier "object" is added when needed.
[self filterreg]
returns
instead of "instforward" => "forward"
The modifier "object" is added when needed.
Exit handlers
The exit hander interface changed from a method of
::xotcl::Object
into procs in the ::nx::core
namespace. Next provides now:
::nx::core::setExitHandler script
::nx::core::getExitHandler
::nx::core::unsetExitHandler
Last modified: Tue May 25 14:00:20 CEST 2010