Hi, Some time ago (long ago) we tried to establish a way when CODE REFs created in Tcl::call would be properly refcounted, but then gave up.
it appears that now I found a way how it could be done in a 99.999% clean way. I've just commited into repo Tcl.pm on github, https://github.com/gisle/tcl.pm/commit/fe4305492ee9fc845c992fae13c91fa01da26cdb so following piece of code behaves correctly: use strict; use Tcl; use Tcl::Tk; my $int = new Tcl::Tk; $int->Eval(<<'EOS'); package require Tk pack [button .b1 -text b1] pack [button .b2 -text b2] pack [button .b3 -text b3] focus .b1 EOS if (1) { my $r = 'aaa'; $int->call('.b1','configure',-command=>sub {print ".b1\n";}); $int->call('.b2','configure',-command=>sub {print ".b2\n";}); $int->call('.b3','configure',-command=>sub { print "reconfiguring .b2 r=$r\n"; $r++; $int->call('.b2','configure',-command=>sub {print "***.B2*** $r;\n";}, -text=> '.B2'); }); } $int->icall('tkwait', 'window', '.'); Button .b3 on click changes -command for .b2 button, and this command resolves to new TCL name each time, because of some scope lexical. However previous -command for .b2 button is now destroyed, due to my latest change (well, not destroyed very initial -command for .b2, for some known reasons) I will also add t/ test file for this, also I'll remove debugging output, and also fix some spur at the end - ==== called Tcl_FindHashEntry on deleted table Aborted ==== I would like to hear from experts - does it works for all. Also, is it useful to do same work for Tcl variables as well, or tcl vars are not that often? Thanks, Vadim.