我如何找到在Tcl中声明函数的位置?

时间:2018-10-12 17:49:37

标签: tcl

我认为这更多是Tcl配置问题,而不是Tcl编码问题...

我继承了一系列Tcl脚本,这些脚本在我公司内部构建的仿真工具中使用。在我的脚本中,我发现了很多实例,这些实例中似乎有对未在任何地方声明的函数的函数调用。如何跟踪这些幻像函数的路径?

例如,某人构建了名为source的自定义包含函数,而不是使用INCLUDE。当我尝试在Tclsh上运行时,Tclsh显然表现不佳,但是使用我的仿真软件,它运行良好。

我已经为INCLUDE尝试了整个仿真软件,但是我没有任何运气。在模拟软件之外是否还有其他明显的位置可以定义Tcl函数?

2 个答案:

答案 0 :(得分:1)

可能性:

  • 在您的软件中。 (您已经检查过了)。
  • 在该软件随附的某些其他软件包中。 检查并查看是否设置了环境变量TCLLIBPATH。 还要检查并查看仿真软件是否设置了TCLLIBPATH。 这将是搜索Tcl软件包的目录列表,您 将需要搜索位于 主要的源代码树。

    另一种可能性是在pkgIndex.tcl文件中指定了位置。 检查所有pkgIndex.tcl文件,并在主源代码树之外查找位置。

  • unknown命令处理程序中。这可能在 您的软件或其他软件包中。您应该能够找到 一些处理INCLUDE语句的代码。
  • 在二进制包中。这些是已加载的共享库 由Tcl。如果是这种情况,应该使用一些C代码来 建立可以搜索的共享库。

由于您说过许多未知函数的实例,所以我首先 猜测是你有 找不到加载软件包的所有目录。但是 “未知”命令处理程序也是可能的。

编辑:

我忘记了另一种可能性。检查并查看您的软件是否设置了auto_path变量。检查添加到auto_path的所有目录是否存在 其他软件包。

答案 1 :(得分:0)

这对您来说不是一个很好的答案,但是我怀疑这是您将获得的最好的答案...

该过程可以在很多地方定义。最好的选择是使用findstr(在Windows上)或grep -R(在POSIX平台上)之类的工具搜索所有相关的源文件。但这可能仍无济于事!它可能不是一个过程,而是一个通用命令,可以用C而不是过程来实现,或者可以在打包的应用程序归档文件中定义(通常不方便查看)。还有其他类型的脚本实现命令,这可能会使事情变得尴尬。一般来说,搜索和调查是您最好的选择,但它可能无法正常工作。

除了某些自省操作外,Tcl并没有真正区分不同类型的命令。如果幸运的话,您会发现info body告诉您过程的定义(而info argsinfo default告诉您有关参数的信息),但这对其他命令没有帮助类型。 Tcl 8.7将包含一个命令(info cmdtype),该命令将有助于缩小下一步的工作范围,但这对您现在没有用,而且在旧版本中肯定不存在。