gpt4 book ai didi

runtime - 将数学运算添加到标准 TCL 运算

转载 作者:行者123 更新时间:2023-12-04 05:43:28 33 4
gpt4 key购买 nike

如您所知,TCL 有一些数学函数,例如 , , 和 假设 中调用的expr 带有 的命令() 大括号如下:

puts [expr sin(1.57)]

现在如何使用 TCL 添加功能 library functions所以它被称为完全相同的方式,并且正在做某事 进程 定义。

我想澄清我的问题。假设有一个proc(字符串)如下:
proc add { a b } { return [expr $a+$b] } ;# string of a proc

我的 C++ 代码中还有一个 TCL 解释器。现在我想获取 proc 和运行时的字符串,并注册一个名为 的函数。添加进入 tcl::mathfunc namespace (我想我应该使用 Tcl_CreateObjCommand )以便我可以调用以下命令:
puts [expr add(1.57, 1.43)]

如何做到这一点。请你写一个简单的例子。我在 TCL 文档和书籍中找不到任何描述 this command 用法的示例。 .

最佳答案

从 C 创建一个函数并不难。为此,您必须编写将执行该操作的命令的实现,并将该实现注册为正确命名空间中的命令。 (在 8.4 和之前的版本中,功能是通过一个单独的接口(interface)完成的,使用起来有点麻烦;该机制在 8.5 中进行了全面检修。)

命令实现

请注意,签名已定义,ignored此处不使用参数。 (它确实是 void * — 当您想要执行诸如将命令绑定(bind)到对象之类的操作时非常棒 — 但它根本不需要添加。)

static int AddCmd(ClientData ignored, Tcl_Interp *interp, int objc,
Tcl_Obj *const objv[]) {
double x, y, sum;

/* First, check number of arguments: command name is objv[0] always */
if (objc != 3) {
Tcl_WrongNumArgs(interp, 1, objv, "x y");
return TCL_ERROR;
}

/* Get our arguments as doubles */
if ( Tcl_GetDoubleFromObj(interp, objv[1], &x) != TCL_OK ||
Tcl_GetDoubleFromObj(interp, objv[2], &y) != TCL_OK) {
return TCL_ERROR;
}

/* Do the real operation */
sum = x + y;

/* Pass the result out */
Tcl_SetObjResult(interp, Tcl_NewDoubleObj(sum));
return TCL_OK;
}

不用担心它在这里分配了一个值; Tcl 有一个非常高性能的自定义内存管理器,这使得它成为一种廉价的操作。

命令注册

这通常在作为 Tcl 包定义的一部分注册或作为整个应用程序初始化的一部分调用的初始化函数内完成。如果您调用 Tcl_CreateInterp,也可以直接进行手动。你做什么取决于你是如何与 Tcl 集成的,这本身就是一个很大的话题。所以我将展示如何创建一个初始化函数;在所有情况下,这通常都是一个好的开始。

int Add_Init(Tcl_Interp *interp) {
/* Use the fully-qualified name */
Tcl_CreateObjCommand(interp, "::tcl::mathfunc::add", AddCmd, NULL, NULL);
return TCL_OK;
}

第一个 NULL是作为第一个 ( ClientData ) 参数传递给实现的值。第二个是处理 ClientData 的回调。 (如果不需要任何操作,则为 NULL,如此处)。

从 C++ 中执行所有这些操作也很实用,但请记住 Tcl 是一个 C 库,因此它们必须是函数(不是方法,也不是没有适配器)并且它们需要 C 链接。

要从 C(或 C++)获取过程的主体,目前最简单的机制是使用 Tcl_Eval运行一个简单的脚本来运行 info body theCmdName .过程实现确实非常复杂,因此它们的接口(interface)纯粹是在脚本级别(除非您实际上将自己与 Tcl 纠缠得比真正明智的要多得多)。

关于runtime - 将数学运算添加到标准 TCL 运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10985325/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com