home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / tcl / 1071 < prev    next >
Encoding:
Internet Message Format  |  1992-07-29  |  4.2 KB

  1. Path: sparky!uunet!sun-barr!ames!agate!agate!adrianho
  2. From: adrianho@barkley.berkeley.edu (Adrian J Ho)
  3. Newsgroups: comp.lang.tcl
  4. Subject: Re: How do I imbed tcl in an application
  5. Date: 29 Jul 92 20:17:30
  6. Organization: University of California, Berkeley
  7. Lines: 70
  8. Message-ID: <ADRIANHO.92Jul29201730@barkley.berkeley.edu>
  9. References: <1992Jul27.175107.7633@rchland.ibm.com>
  10.     <ADRIANHO.92Jul27175403@barkley.berkeley.edu>
  11.     <1992Jul28.113922.19882@cas.org>,<156g6sINNnp2@agate.berkeley.edu>
  12.     <1992Jul29.222557.7305@cpu.com>
  13. NNTP-Posting-Host: barkley.berkeley.edu
  14. In-reply-to: gwlester@cpu.com's message of Wed, 29 Jul 1992 22:25:57 GMT
  15.  
  16. In article <1992Jul29.222557.7305@cpu.com> gwlester@cpu.com (Gerald W. Lester) writes:
  17. >You could also rename string to something else (eg string_org) than add
  18. >a proc called string that sees if the "command" is an extended command (like
  19. >"remove" in your example above), if so it would process it, otherwise it would
  20. >do an uplevel on "string_orig $args".  I know it is "cheating", but it works.
  21.  
  22. True, but in a very dangerous fashion.  Suppose you and I published
  23. new suboptions to the "canvas" widget that do, say, pixmap and 3D
  24. polygon drawing respectively.  Unless the user (manually) rolls the
  25. two sets of suboptions together into a single suboption package, the
  26. original widget code would become inaccessible from the command level.
  27.  
  28. Of course, you could do a recursive renaming, but then the overhead of
  29. crawling through 20 different "canvas{_orig}*" suboption wrappers
  30. (mostly at the Tcl level) just to use one of the *original* "canvas"
  31. suboptions could become pretty high.  Suboption namespace collisions
  32. are also next to impossible to handle cleanly in this fashion.
  33.  
  34. IMHO, a neater way is to modify the Tcl library to allow for the
  35. specification and storage of subcommand descriptors.  Properly done, a
  36. Tcl programmer would be able to create a theoretically infinite tree
  37. of subcommands without changing the programming interface a single
  38. bit, like this:
  39.  
  40. Tcl_CreateCommand(interp, "string remove", Tcl_StringRemoveCmd,
  41.           clientData, deleteProc);
  42.  
  43. Support can also be designed in to handle namespace collisions.
  44. Here's how I'd implement it:
  45. -----
  46. (0) Change the definition of struct Command (in tclInt.h) to:
  47.  
  48. typedef struct Command {
  49.     Tcl_CmdProc *proc;          /* Procedure to process command. */
  50.     ClientData clientData;      /* Arbitrary value to pass to proc. */
  51.     Tcl_CmdDeleteProc *deleteProc;
  52.                                 /* Procedure to invoke when deleting
  53.                                  * command. */
  54.     int is_subproc;             /* Flag to denote subprocs underneath */
  55.     Tcl_HashTable subprocs;     /* Table of Command structs pointing
  56.                                  * to suboptions */
  57. } Command;
  58.  
  59. (1) Modify Tcl_CreateCommand() to:
  60.     (a) logically divide the cmdName argument (eg. "string remove")
  61.         into space-delimited command words
  62.     (b) create an entry in the main commandTable for the first word if
  63.         it doesn't exist, and an empty Command struct
  64.     (c) while there are command words left, set is_subproc to TRUE and
  65.         insert a pointer to a new Command struct in the subprocs hash
  66.         table with the next command word as key.  (if the key already
  67.         exists, and is_subproc == FALSE, signal a namespace collision,
  68.         else use that struct as the next link in the chain)
  69.     (d) [no more command words] set is_subproc to FALSE and fill in
  70.         the other fields as per normal
  71.  
  72. (2) Modify Tcl_Eval() to:
  73.     (a) decompose the cmd argument into words and walk down the
  74.         Command tree as far as possible
  75.     (b) when a leaf Command is reached (ie. is_subproc == FALSE),
  76.         execute the proc as per normal
  77. -----
  78. I've left out quite a few details, but there should be enough in there
  79. to enable anyone to patch the sources themselves.
  80. --
  81. -----------------------------------------------------------------------------
  82. Adrian Ho, He With The Embarrassingly *Dead* Passion ** Phone: (510) 642-5563
  83. System Manager, CFD Lab, ME Dept, UC Berkeley * adrianho@barkley.berkeley.edu
  84. Maintainer, Tcl/Tk Contrib Archive ---- barkley.berkeley.edu [128.32.142.237]
  85.   Send all Tcl/Tk Archive-related stuff to tcl-archive@barkley.berkeley.edu
  86.