"Register" Ruby function as Tcl function in Ruby-Tk?

Python has a “register” function that wraps a Python function into a Tcl
function and returns the new Tcl function’s name. This is sometimes used
in Python-Tk applications for functions that need to be attached to Tk
widgets in some complex way. Does Ruby-Tk have any similar
functionality?

My use case is a native widget that is called via Tcl/Tk and exposed via
Tk bindings–there is no easy way to pass Python or Ruby calls to this
widget. “Register” allows me to pass a Python function that is executed
as if it were Tcl code. I would love similar functionality in Ruby.

From: Kevin W. [email protected]
Subject: “Register” Ruby function as Tcl function in Ruby-Tk?
Date: Sat, 30 Jun 2012 22:19:54 +0900
Message-ID: [email protected]

Ruby.
There are some ways of interaction betwenn Ruby and Tcl.
Followings are some of useful methods to do that.


Tk.install_cmd(proc_or_method)
: get Tcl-command string to call Ruby’s proc (or method) from Tcl
interp.
: ruby_proc must be an object of Proc, Method, or TkCallbackEntry.

Tk.ip_eval(tcl_script_string)
: eval Tcl’s script on Tcl interp.

Tk.ip_invoke(tcl_cmd_name, tcl_cmd_arg, …)
: call Tcl command with args.

For example,

$ irb19
irb(main):001:0> require ‘tk’
=> true
irb(main):002:0> tcl_cmd = Tk.install_cmd(proc{|*args| p [:foo, args]})
=> “rb_out c00001”
irb(main):003:0> Tk.ip_eval(“proc foo_cmd {} {#{tcl_cmd} 1 2 3}”)
=> “”
irb(main):004:0> exit
[nagai@orca17 ~]$ irb20
irb(main):001:0> require ‘tk’
=> true
irb(main):002:0> tcl_cmd = Tk.install_cmd(proc{|*args| p [:foo, args]})
=> “rb_out c00001”
irb(main):003:0> Tk.ip_eval(tcl_cmd + " a b c d")
[:foo, [“a”, “b”, “c”, “d”]]
=> “foo {a b c d}”
irb(main):004:0> Tk.ip_eval(“proc foo_cmd {} {#{tcl_cmd} 1 2 3}”)
=> “”
irb(main):005:0> Tk.ip_invoke(“foo_cmd”)
[:foo, [“1”, “2”, “3”]]
=> “foo {1 2 3}”
irb(main):006:0>