Provided by: libtcl-perl_1.27+ds-1build3_amd64 bug

NAME

       Tcl - Tcl extension module for Perl

SYNOPSIS

           use Tcl;

           $interp = Tcl->new;
           $interp->Eval('puts "Hello world"');

DESCRIPTION

       The Tcl extension module gives access to the Tcl library with functionality and interface similar to the
       C functions of Tcl.  In other words, you can

       •   create Tcl interpreters

           The  Tcl  interpreters  so created are Perl objects whose destructors delete the interpreters cleanly
           when appropriate.

       •   execute Tcl code in an interpreter

           The code can come from strings, files or Perl filehandles.

       •   bind in new Tcl procedures

           The new procedures can be either C  code  (with  addresses  presumably  obtained  using  dl_open  and
           dl_find_symbol)  or  Perl  subroutines  (by  name,  reference  or  as anonymous subs). The (optional)
           deleteProc callback in the latter case is another perl subroutine which is called when the command is
           explicitly deleted by name or else when the destructor for the interpreter object  is  explicitly  or
           implicitly called.

       •   Manipulate the result field of a Tcl interpreter

       •   Set and get values of variables in a Tcl interpreter

       •   Tie perl variables to variables in a Tcl interpreter

           The variables can be either scalars or hashes.

   Methods in class Tcl
       To create a new Tcl interpreter, use

           $interp = Tcl->new;

       The  following  methods  and  routines  can then be used on the Perl object returned (the object argument
       omitted in each case).

       $interp->Init ()
           Invoke Tcl_Init on the interpreter.

       $interp->CreateSlave (NAME, SAFE)
           Invoke Tcl_CreateSlave on the interpreter.  Name is arbitrary.  The safe variable, if true, creates a
           safe sandbox interpreter.
            See: http://www.tcl.tk/software/plugin/safetcl.html
                 http://www.tcl.tk/man/tcl8.4/TclCmd/safe.htm

           This command returns a new interpreter.

       $interp->Eval (STRING, FLAGS)
           Evaluate script STRING in the interpreter. If the script returns successfully (TCL_OK) then the  Perl
           return  value corresponds to Tcl interpreter's result otherwise a die exception is raised with the $@
           variable corresponding to Tcl's interpreter result object. In each case, corresponds  means  that  if
           the method is called in scalar context then the string result is returned but if the method is called
           in  list context then the result is split as a Tcl list and returned as a Perl list.  The FLAGS field
           is optional and can be a bitwise OR of the constants Tcl::EVAL_GLOBAL or Tcl::EVAL_DIRECT.

       $interp->GlobalEval (STRING)
           REMOVED.  Evalulate script STRING at global level.  Call Eval(STRING, Tcl::EVAL_GLOBAL) instead.

       $interp->EvalFile (FILENAME)
           Evaluate the contents of the file with name FILENAME. Otherwise, the same as Eval() above.

       $interp->EvalFileHandle (FILEHANDLE)
           Evaluate the contents of the Perl filehandle FILEHANDLE. Otherwise, the same as Eval() above.  Useful
           when using the filehandle DATA to tack on a Tcl script following an __END__ token.

       $interp->call (PROC, ARG, ...)
           Looks  up  procedure  PROC  in  the  interpreter  and invokes it using Tcl's eval semantics that does
           command tracing and will use the ::unknown (AUTOLOAD) mechanism.  The arguments (ARG,  ...)  are  not
           passed through the Tcl parser.  For example, spaces embedded in any ARG will not cause it to be split
           into two Tcl arguments before being passed to PROC.

           Before invoking procedure PROC special processing is performed on ARG list:

           1.   All  subroutine  references within ARG will be substituted with Tcl name which is responsible to
           invoke this subroutine. This Tcl name will be created using CreateCommand subroutine (see below).

           2.  All  references  to  scalars  will  be  substituted  with  names  of  Tcl  variables  transformed
           appropriately.

           These first two items allow one to write and expect it to work properly such code as:

             my $r = 'aaaa';
             button(".d", -textvariable => \$r, -command=>sub {$r++});

           3.  All  references  to  hashes  will  be  substituted  with names of Tcl array variables transformed
           appropriately.

           4.  As a special case, there is a mechanism to deal with  Tk's  special  event  variables  (they  are
           mentioned  as  '%x',  '%y' and so on throughout Tcl).  When creating a subroutine reference that uses
           such variables, you must declare the desired variables using Tcl::Ev as the  first  argument  to  the
           subroutine.  Example:

             sub textPaste {
                 my ($x,$y,$w) = @_;
                 widget($w)->insert("\@$x,$y", $interp->Eval('selection get'));
             }
             $widget->bind('<2>', [\&textPaste, Tcl::Ev('%x', '%y'), $widget] );

       $interp->return_ref (NAME)
           returns   a   reference  corresponding  to  NAME,  which  was  associated  during  previously  called
           "$interpnt->call(...)" preprocessing. As a typical example this could be variable associated  with  a
           widget.

       $interp->delete_ref (NAME)
           deletes  and returns a reference corresponding to NAME, which was associated during previously called
           "$interpnt->call(...)" preprocessing.  this follows _code_dispose about if NAME is  a  TClNAME  or  a
           DESCNAME.  if NAME is a VARNAME then it is just deleted and returned.

       $interp->icall (PROC, ARG, ...)
           Looks  up  procedure  PROC  in  the  interpreter  and invokes it using Tcl's eval semantics that does
           command tracing and will use the ::unknown (AUTOLOAD) mechanism.  The arguments (ARG,  ...)  are  not
           passed through the Tcl parser.  For example, spaces embedded in any ARG will not cause it to be split
           into two Tcl arguments before being passed to PROC.

           This  is  the lower-level procedure that the 'call' method uses.  Arguments are converted efficiently
           from Perl SVs to Tcl_Objs.  A Perl AV array becomes a Tcl_ListObj, an SvIV becomes a Tcl_IntObj, etc.
           The reverse conversion is done to the result.

       $interp->invoke (PROC, ARG, ...)
           Looks up procedure PROC in the interpreter and invokes it directly with arguments (ARG, ...)  without
           passing through the Tcl parser. For example, spaces embedded in any ARG will not cause it to be split
           into two Tcl arguments before being passed to PROC.  This differs from icall/call in that it directly
           invokes  the  command  name  without  allowing  for  command  tracing  or making use of Tcl's unknown
           (AUTOLOAD) mechanism.  If the command does not already exist in the interpreter, and  error  will  be
           thrown.

           Arguments  are  converted  efficiently  from  Perl  SVs  to  Tcl_Objs.   A  Perl  AV  array becomes a
           Tcl_ListObj, an SvIV becomes a Tcl_IntObj, etc.  The reverse conversion is done to the result.

       Tcl::Ev (FIELD, ...)
           Used to declare %-substitution variables of interest to a subroutine callback.  FIELD is expected  to
           be  of  the form "%#" where # is a single character, and multiple fields may be specified.  Returns a
           blessed object that the 'call' method will recognize when it is passed as the  first  argument  to  a
           subroutine in a callback.  See description of 'call' method for details.

       $interp->result ()
           Returns the current Tcl interpreter result. List v. scalar context is handled as in Eval() above.

       $interp->CreateCommand (CMDNAME, CMDPROC, CLIENTDATA, DELETEPROC, FLAGS)
           Binds a new procedure named CMDNAME into the interpreter. The CLIENTDATA and DELETEPROC arguments are
           optional. There are two cases:

           (1) CMDPROC is the address of a C function

           (presumably  obtained  using  dl_open  and dl_find_symbol. In this case CLIENTDATA and DELETEPROC are
           taken to be raw data of the ClientData and deleteProc field presumably obtained in a similar way.

           (2) CMDPROC is a Perl subroutine

           (either a sub name, a sub reference or an anonymous sub). In this case CLIENTDATA  can  be  any  perl
           scalar (e.g. a ref to some other data) and DELETEPROC must be a perl sub too. When CMDNAME is invoked
           in the Tcl interpreter, the arguments passed to the Perl sub CMDPROC are

               (CLIENTDATA, INTERP, LIST)

           where INTERP is a Perl object for the Tcl interpreter which called out and LIST is a Perl list of the
           arguments  CMDNAME  was  called with.  If the 1-bit of FLAGS is set then the 3 first arguments on the
           call to CMDPROC are suppressed.  As usual in Tcl, the first element of the list  is  CMDNAME  itself.
           When  CMDNAME  is  deleted  from the interpreter (either explicitly with DeleteCommand or because the
           destructor for the interpreter object is called), it is passed the single argument CLIENTDATA.

       $interp->DeleteCommand (CMDNAME)
           Deletes command CMDNAME from the interpreter. If the command  was  created  with  a  DELETEPROC  (see
           CreateCommand  above),  then  it is invoked at this point. When a Tcl interpreter object is destroyed
           either explicitly or implicitly, an implicit DeleteCommand happens on all  its  currently  registered
           commands.

       (TCLNAME,GENCODE) = $interp->create_tcl_sub(CODEREF, EVENTS, TCLNAME, DESCRNAME)
           Creates  a  COMMAND  called  TCLNAME  calling  CODEREF in the interpreter $interp, and adds it to the
           internal tracking structure.  DESCRNAME and TCLNAME should not begin with = or @ or ::perl:: to avoid
           colisions If TCLNAME IS blank or undef, it is constructed from the CODEREF address.   GENCODE  starts
           as TCLNAME but gets @$EVENTS which can contain %vars joined to it.

           TCLNAME  and  DESCRNAME get stored in an internal structure, and can be used to purge things fRom the
           command table via code_destroy or $interp->delete_ref;

           Returns (TCLNAME,GENCODE).  if you are creating code refs with this you can continue to use the  same
           coderef  and  it  will be converted on each call.  but if you save GENCODE, you can replace the anon-
           coderef call in the tcl command with GENCODE.

           for instance

             $interp->call('FILEEVENT',$fileref,WRITABLE=>sub {...});

           can be replaced by

             my ($tclcode,$gencode)=$interp->create_tcl_sub(sub{...}, EVENTS, TCLNAME, DESCRNAME);
             $interp->call('FILEEVENT',$gencode,WRITABLE=>$gencode);

           or

             my $sub=sub{....};
             $interp->call('FILEEVENT',$fileref,WRITABLE=>$sub);

           can be replaced by

             my ($tclcode,$gencode)=$interp->create_tcl_sub($sub, EVENTS, TCLNAME, DESCRNAME);
             $interp->call('FILEEVENT',$gencode,WRITABLE=>$gencode);

           although

             $interp->call('FILEEVENT',$fileref,WRITABLE=>$sub);

           will stil work fine too.

           Then you later call

             $interp->delete_ref($tclname);

           when you are finished with that sub to clean it from the internal tracking and command  table.   This
           means no automatic cleanup will occur on the sub{...} or $sub

           And after the destroy inside Tcl any triggering writable on $fileref will fail as well.  so it should
           be replaced first via
             $interp->call('FILEEVENT',$fileref,WRITABLE=>'');

       (CODEREF) = Tcl::_code_dispose(NAME)
           Purges  the  internal  table of a NAME and may initiate destruction of something created thru call or
           create_tcl_sub

           TCLNAME and DESCRNAME get stored in an internal structure, and can be used to purge things  form  the
           command  table.   calling  _code_dispose  on  a  TCLNAME retruned from create_tcl_sub removes all use
           instances  and  purges  the  command  table.   calling  _code_dispose  on  a  DESCRNAME   passed   to
           create_tcl_sub  removes  only  that  instace  Code used in a DESCRNAME may be used in other places as
           well, only when the last usage is purged does the entry get purged from the command table

           While the internal tracking structure saves the INTERP the code was added to, it itself does not keep
           things separated by INTERP, A TCLNAME or DESCRNAMe can only exist in one INTERP at a  time,  using  a
           new INTERP just causes the one in the last INTERP to disappear, and probably end up with the Tcl code
           getting deleted

           Returns (CODEREF), this is the original coderef

       $interp->SetResult (STRING)
           Sets Tcl interpreter result to STRING.

       $interp->AppendResult (LIST)
           Appends each element of LIST to Tcl's interpreter result object.

       $interp->AppendElement (STRING)
           Appends STRING to Tcl interpreter result object as an extra Tcl list element.

       $interp->ResetResult ()
           Resets Tcl interpreter result.

       $interp->SplitList (STRING)
           Splits STRING as a Tcl list. Returns a Perl list or the empty list if there was an error (i.e. STRING
           was  not  a  properly  formed  Tcl  list).   In  the  latter case, the error message is left in Tcl's
           interpreter result object.

       $interp->SetVar (VARNAME, VALUE, FLAGS)
           The FLAGS field is optional. Sets Tcl variable  VARNAME  in  the  interpreter  to  VALUE.  The  FLAGS
           argument  is  the  usual  Tcl  one  and  can  be  a  bitwise  OR  of  the constants Tcl::GLOBAL_ONLY,
           Tcl::LEAVE_ERR_MSG, Tcl::APPEND_VALUE, Tcl::LIST_ELEMENT.

       $interp->SetVar2 (VARNAME1, VARNAME2, VALUE, FLAGS)
           Sets the element VARNAME1(VARNAME2) of a Tcl array to VALUE. The optional argument FLAGS  behaves  as
           in SetVar above.

       $interp->GetVar (VARNAME, FLAGS)
           Returns the value of Tcl variable VARNAME. The optional argument FLAGS behaves as in SetVar above.

       $interp->GetVar2 (VARNAME1, VARNAME2, FLAGS)
           Returns  the  value  of  the  element VARNAME1(VARNAME2) of a Tcl array.  The optional argument FLAGS
           behaves as in SetVar above.

       $interp->UnsetVar (VARNAME, FLAGS)
           Unsets Tcl variable VARNAME. The optional argument FLAGS behaves as in SetVar above.

       $interp->UnsetVar2 (VARNAME1, VARNAME2, FLAGS)
           Unsets the element VARNAME1(VARNAME2) of a Tcl array.  The optional  argument  FLAGS  behaves  as  in
           SetVar above.

   Command table cleanup
       In  V1.03  command  table  cleanup  was intoduced.  This tries to keep the internal structure and command
       table clean.  In V1.02 and prior heavy use of sub { .. } in Tcl commands could pollute  these  tables  as
       they were never cleared. Command table cleanup tries to alieviate this.

       if you call create_tcl_sub the internal reference exists until you delete_ref or _code_dispose it, or you
       call create_tcl_sub with the same DESCRNAME.

       if the internal reference was created internaly by call(...) there are two rules

       1)  If  the  command  is  an  "after"  the internal references is keept at least until 1 second after the
           delay.  If there are still other "users" of the TCLNAME then it is not deleted  until  the  last  one
           goes away.  If another call with the same CODEREF happens before this, then it will get registered as
           a "user" without any need to delete/recreate the tcl command first.

       2)  otherwise  a  DESCRNAME  is  created  with  the  text sections of the command, prefaced by "=".  Like
           "=after 1000" or "=:.m.m add command -command -label Exit" or "=::button .f3.b8 -text conn  -command"
           or "=gets sock9ac2b50" or "=fileevent sock9827430 writable"

           the  TCLCODES  created for that command will be kept at least until a command with the same DESCRNAME
           and containing a subroutine reference is run again.  Since many DESCRNAMES  can  reference  the  same
           TCLNAME only when the last DESCRNAME referencing a TCLNAME is released is the TCLNAME purged.

           NOTE: Since
             $interp->call('fileevent','sock9827430','writable');  does  not  contain a subroutine reference, it
           will not release/free the TCLNAME/DESCRNAME created by
             $interp->call('fileevent','sock9827430','writable',sub{...}); even  though  that  is  the  way  you
           deactivate a writable/readable callback in Tcl.

       Prior  to  V1.06 there was also a problem with the coderef never getting cleared from sas, a refcount was
       kept at the PVCV that prevented it from getting garbage collected, but that  SV  itself  got  "lost"  and
       could never be garbage collected, thereby also keeping anything in that codes PAD.

       To  assist  in  tracking chages to the internal table and the commands table 3 trace subs were added, set
       them to non-blank or non-zero to add the tracking output to SYSOUT, like this in your code:

           sub Tcl::TRACE_SHOWCODE(){1}

       Tcl::TRACE_SHOWCODE
           Display all generated Tcl code by call().  Be aware: Tkx::MainLoop runs by issuing a  lot  of  "winfo
           exists ." calls, a LOT.  But this is a nice way to tell what your programs are doing to Tcl.

       Tcl::TRACE_CREATECOMMAND
           Display Tcl subroutine creation by call/create_tcl_sub

       Tcl::TRACE_DELETECOMMAND
           Display Tcl subroutine deletion by cleanup/delete_ref/_code_dispose

   Linking Perl and Tcl variables
       You  can  tie  a  Perl  variable  (scalar  or hash) into class Tcl::Var so that changes to a Tcl variable
       automatically "change" the value of the Perl variable. In fact, as usual with Perl  tied  variables,  its
       current  value  is  just fetched from the Tcl variable when needed and setting the Perl variable triggers
       the setting of the Tcl variable.

       To tie a Perl scalar $scalar to the Tcl variable tclscalar in interpreter  $interp  with  optional  flags
       $flags (see SetVar above), use

               tie $scalar, "Tcl::Var", $interp, "tclscalar", $flags;

       Omit the $flags argument if not wanted.

       To  tie  a  Perl  hash  %hash  to the Tcl array variable array in interpreter $interp with optional flags
       $flags (see SetVar above), use

               tie %hash, "Tcl::Var", $interp, "array", $flags;

       Omit the $flags argument if not wanted. Any alteration to Perl  variable  $hash{"key"}  affects  the  Tcl
       variable array(key) and vice versa.

   Accessing Perl from within Tcl
       After  creation  of  Tcl interpreter, in addition to evaluation of Tcl/Tk commands within Perl, other way
       round also instantiated. Within a special namespace " ::perl " following objects are created:

          ::perl::Eval

       So it is possible to use Perl objects from within Tcl.

   Moving Tcl/Tk around with Tcl.pm
       NOTE: explanations below is for developers managing Tcl/Tk installations itself, users should  skip  this
       section.

       In  order  to  create Tcl/Tk application with this module, you need to make sure that Tcl/Tk is available
       within visibility of this module. There are many ways to achieve this, varying on ease of starting things
       up and providing flexible moveable archived files.

       Following list enumerates them, in order of increased possibility to change location.

       •   First method

           Install Tcl/Tk first, then install Perl module Tcl, so installed Tcl/Tk will be used.  This  is  most
           normal  approach,  and  no  care of Tcl/Tk distribution is taken on Perl side (this is done on Tcl/Tk
           side)

       •   Second method

           Copy installed Tcl/Tk binaries to some location, then install Perl module Tcl with a  special  action
           to  make  Tcl.pm know of this location. This approach makes sure that only chosen Tcl installation is
           used.

       •   Third method

           During compiling Tcl Perl module, Tcl/Tk could be statically linked into module's shared library  and
           all other files zipped into a single archive, so each file extracted when needed.

           To link Tcl/Tk binaries, prepare their libraries and then instruct Makefile.PL to use these libraries
           in a link stage.  (TODO provide better detailed description)

Other Tcl interpreter methods

       export_to_tcl method
         An  interpreter method, export_to_tcl, is used to expose a number of perl subroutines and variables all
         at once into tcl/tk.

         export_to_tcl takes a hash as arguments, which represents  named  parameters,  with  following  allowed
         values:

         namespace => '...'
             tcl  namespace,  where  commands  and  variables  are  to  be created, defaults to 'perl'. If '' is
             specified - then global namespace is used. A possible '::' at end is stripped.

         subs => { ... }
             anonymous hash of subs to be created in Tcl, in the form /tcl name/ => /code ref/

         vars => { ... }
             anonymous hash of vars to be created in Tcl, in the form /tcl name/ => /code ref/

         subs_from => '...'
             a name of Perl namespace, from where all existing subroutines will be searched and Tcl command will
             be created for each of them.

         vars_from => '...'
             a name of Perl namespace, from where all  existing  variables  will  be  searched,  and  each  such
             variable will be tied to Tcl.

         An example:

           use strict;
           use Tcl;

           my $int = Tcl->new;

           $tcl::foo = 'qwerty';
           $int->export_to_tcl(subs_from=>'tcl',vars_from=>'tcl');

           $int->Eval(<<'EOS');
           package require Tk

           button .b1 -text {a fluffy button} -command perl::fluffy_sub
           button .b2 -text {a foo button} -command perl::foo
           entry .e -textvariable perl::foo
           pack .b1 .b2 .e
           focus .b2

           tkwait window .
           EOS

           sub tcl::fluffy_sub {
               print "Hi, I am a fluffy sub\n";
           }
           sub tcl::foo {
               print "Hi, I am foo\n";
               $tcl::foo++;
           }

       export_tcl_namespace
         extra convenience sub, binds to tcl all subs and vars from perl tcl:: namespace

AUTHORS

        Malcolm Beattie, 23 Oct 1994
        Vadim Konovalov, 19 May 2003
        Jeff Hobbs, jeff (a) activestate . com, 22 Mar 2004
        Gisle Aas, gisle (a) activestate . com, 14 Apr 2004

       Special  thanks  for  contributions  to  Jan  Dubois, Slaven Rezic, Paul Cochrane, Huck Finn, Christopher
       Chavez, SJ Luo.

COPYRIGHT

       This program is free software; you can redistribute it and/or modify it under  the  same  terms  as  Perl
       itself.

       See http://www.perl.com/perl/misc/Artistic.html

perl v5.34.0                                       2022-02-07                                           Tcl(3pm)