将tcl嵌入红宝石中

时间:2010-04-15 13:32:22

标签: ruby tcl

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

由于

3 个答案:

答案 0 :(得分:3)

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

  • Tcl_FindExecutable - 首先调用此方法初始化库
  • Tcl_CreateInterp - 返回新执行上下文的句柄
  • Tcl_Eval - 这会评估一个脚本;返回常量TCL_OK(0)或TCL_ERROR(1)(或其他一些在常规代码中很少见的内容)
  • Tcl_GetResult - 返回结果值(或错误消息)
  • Tcl_ResetResult - 清除结果值
  • Tcl_DeleteInterp - 也许你可以猜到它的作用......

您还可以使用Tcl_GetVarTcl_SetVar访问上下文中的“全局”变量;这是传递可能不是有效脚本的值的非常方便的方法。

答案 1 :(得分:0)

如果您在命令行上,则可以使用tclsh。 tcl也有一个C api,所以如果没有预先存在的方法,你应该可以使用它来将tcl嵌入ruby中吗?

答案 2 :(得分:0)

  问:将tcl嵌入ruby [。]有什么方法吗?

我遇到了 this post 通过 Matz 自己在2005年,来自一个名为“在ruby中运行TCL”的线程。

他的示例程序(后文)评估了来自Ruby的Tcl代码的字符串,而无需掏空:

require 'tcltklib'

def test
  ip1 = TclTkIp.new

  puts ip1._eval('button .lab -text exit -command "destroy ."').inspect
  puts ip1._eval('pack .lab').inspect

  puts ip1._eval(%q+puts [ruby {print "print by ruby\n"; 'puts by tcl/tk'}]+).inspect

  TclTkLib.mainloop
end

test

其控制台输出为:

".lab"
""
print by ruby
puts by tcl/tk
""

引用他的帖子:

  

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

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

  1. /c/Ruby/lib/tcltk/tcl8.5/c/Ruby/lib/tcl8.5
  2. /c/Ruby/lib/tcltk/tk8.5/c/Ruby/lib/tk8.5

(可能是您的Ruby安装在其他地方。)

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

在Matz公司下方的回复信中,永井秀敏说:

  

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

下面是Matz的程序,将其更改为在没有Tk图形窗口的情况下运行:

require 'tcltklib'

def test
# nil, false means without Tk:
  ip1 = TclTkIp.new nil, false

  puts ip1._eval('list { aa bb cc }').inspect

  puts ip1._eval('set list { aa bb cc }; join $list ""').inspect

  TclTkLib.mainloop
end

test

其控制台输出为:

"{ aa bb cc }"
"aabbcc"

这两个程序对我有用,在Windows 7上使用Ruby 2.2.5(带有Tk 8.5.12)。

对于它的价值,这是 manualtcltklib