在ruby中嵌入tcl

在ruby中嵌入tcl,ruby,tcl,Ruby,Tcl,有没有办法做到这一点?似乎唯一可行的方法是使用ruby/tk并通过该api创建一个tcl解释器。但是,我希望在没有GUI(x窗口)的系统上使用它。我别无选择了吗 谢谢如果您在命令行上,您可以向tclsh发送命令。tcl还有一个C api,所以如果没有预先存在的方法,您应该能够使用它将tcl嵌入ruby中 如果您可以在Tcl的C API中调用任意简单函数,那么关键函数有: Tcl\u FindExecutable–首先调用此函数初始化库 Tcl_CreateInterp–这将返回新执行上下文的句

有没有办法做到这一点?似乎唯一可行的方法是使用ruby/tk并通过该api创建一个tcl解释器。但是,我希望在没有GUI(x窗口)的系统上使用它。我别无选择了吗


谢谢

如果您在命令行上,您可以向tclsh发送命令。tcl还有一个C api,所以如果没有预先存在的方法,您应该能够使用它将tcl嵌入ruby中

如果您可以在Tcl的C API中调用任意简单函数,那么关键函数有:

  • Tcl\u FindExecutable
    –首先调用此函数初始化库
  • Tcl_CreateInterp
    –这将返回新执行上下文的句柄
  • Tcl_Eval
    –这会评估脚本;返回常量
    TCL\u OK
    (0)或
    TCL\u ERROR
    (1)(或一些在一般代码中罕见的其他常量)
  • Tcl_GetResult
    –返回结果值(或错误消息)
  • Tcl\u ResetResult
    –这将清除结果值
  • Tcl\u DeleteInterp
    –也许你能猜出这是什么
您还可以使用
Tcl_GetVar
Tcl_SetVar
访问上下文中的“全局”变量;这是传递可能不是有效脚本的值的非常方便的方法

将tcl嵌入ruby[。]有什么方法可以做到这一点吗

我偶然发现 通过 2005年,他在一个名为“用ruby运行TCL”的帖子中写道

他的示例程序(来自post)评估Ruby中的Tcl代码字符串,而不进行以下处理:

需要“tcltklib”
def测试
ip1=TclTkIp.new
放置ip1._eval('button.lab-text exit-command“destroy.”)。检查
放置ip1._eval('pack.lab')。检查
puts ip1._eval(%q+puts[ruby{print“print by ruby\n”;'puts by tcl/tk'}]+)。检查
TclTkLib.mainloop
结束
测试
其控制台输出为:

".lab"
""
print by ruby
puts by tcl/tk
""
"{ aa bb cc }"
"aabbcc"
引用他的帖子:

标准发行版附带的tcltklib扩展直接调用Tcl解释器,而无需任何进程间通信

为了使其正常工作,我需要复制以下目录:

  • /c/Ruby/lib/tcltk/tcl8.5
    as
    /c/Ruby/lib/tcl8.5
  • /c/Ruby/lib/tcltk/tk8.5
    as
    /c/Ruby/lib/tk8.5
  • (您的Ruby可能安装在其他地方。)

    我想在没有GUI(x窗口)的系统上使用它

    在Matz下方的回复帖子中,长井英寿说:

    如果不需要Tk,可以创建没有Tk的IP。为此,请致电
    TclTkIp.new(nil,false)

    下面是Matz的程序,它被修改为在没有Tk图形窗口的情况下运行:

    需要“tcltklib”
    def测试
    #无,假表示没有Tk:
    ip1=TclTkIp.new无,假
    放置ip1._eval('list{aa bb cc}')。检查
    放置ip1._eval('set list{aa bb cc};join$list”“)。检查
    TclTkLib.mainloop
    结束
    测试
    
    其控制台输出为:

    ".lab"
    ""
    print by ruby
    puts by tcl/tk
    ""
    
    "{ aa bb cc }"
    "aabbcc"
    
    这两个程序在Windows7上使用Ruby 2.2.5(含Tk 8.5.12)对我来说很有效

    值得一提的是,以下是
    对于
    tcltklib

    Python的Tkinter允许用户创建不加载Tk的Tcl解释器实例(参数
    useTk
    for
    Tk
    的构造函数)。也许Ruby的包装器也需要?为什么你需要嵌入它而不是外壳呢?你看了吗?有没有办法指定tcl解释器的路径?使用
    mkmf.rb
    ,你需要
    have\u library
    find\u library
    。我不是一个优秀的Ruby程序员,不会告诉你如何充分利用这个API。