分裂对象模型和TclCL(4)
上面过程还有一个疑问:如何在command函数中向解释器传递执行结果?
哈,这个用Tcl类可以解决。
Tcl类封装了Otcl解释器的实例,并提供了访问解释器的方法。这个类提供了以下的操作方法:
1、 获得Tcl实例的引用2、通过解释器调用Otcl过程3、从解释器获取结果,或将结果传回给解释器4、存取、查找TclObject5、获得到解释器的直接访问。
1、 获得Tcl实例的引用
当ns一开始运行,Tcl类即被实例化。Tcl类的一个静态成员变量“Tcl Tcl::instance_“用来保存该实例。这个Tcl对象就是Otcl解释器对象,可以通过获得它的引用来访问Otcl解释器的功能。
获得此实例引用的语句为:Tcl& tcl=Tcl::instance();
2、 通过解释器调用Otcl过程
通过Tcl实例调用Otcl的命令:tcl.eval(char* s) (有四种命令,只是参数不同,每个函数传一个字符串给解释器,然后解释器在全局上下文中将这个字符串当作Otcl命令来执行)
当c++调用一个Otcl命令时,解释器将执行结保存在私有成员变量tcl_->result中。用户必须用tcl.result(void)来获取该执行结果。注意:结果是字符串。
想要扩展NS的Otcl脚本:不仅把他放在_ns/tcl/目录下,还要加一条source命令在tcl/lib/ns-lib.tcl中,以便在用tcl-expand.tcl扩展ns-lib/tcl的时候将该脚本的内容包含进去,足后还需要重新编译NS重新生成ns_tcl.cc。具体的原理查看EmbeddedTcl类。
tips:看了这么多觉得还是有点模糊,下次的目标是添加一个简单的协议,让自己对整个流程更熟悉些。