有没有办法做到这一点?似乎唯一可行的方法是使用ruby / tk并通过该api创建一个tcl解释器。但是,我想在没有GUI(x windows)的系统上使用它。我没有选择吗?
由于
答案 0 :(得分:3)
如果你可以在Tcl的C API中调用任意简单函数,那么关键函数是:
Tcl_FindExecutable
- 首先调用此方法初始化库Tcl_CreateInterp
- 返回新执行上下文的句柄Tcl_Eval
- 这会评估一个脚本;返回常量TCL_OK
(0)或TCL_ERROR
(1)(或其他一些在常规代码中很少见的内容)Tcl_GetResult
- 返回结果值(或错误消息)Tcl_ResetResult
- 清除结果值Tcl_DeleteInterp
- 也许你可以猜到它的作用...... 您还可以使用Tcl_GetVar
和Tcl_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解释器。
要使其正常工作,我需要复制以下目录:
/c/Ruby/lib/tcltk/tcl8.5
为/c/Ruby/lib/tcl8.5
/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)。
对于它的价值,这是
manual
为tcltklib
。