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

  1. Path: sparky!uunet!crdgw1!rdsunx.crd.ge.com!dssv01!kennykb
  2. From: kennykb@dssv01.crd.ge.com (Kevin B. Kenny)
  3. Newsgroups: comp.lang.tcl
  4. Subject: Re: How do I imbed tcl in an application
  5. Message-ID: <1992Jul28.172714.25136@crd.ge.com>
  6. Date: 28 Jul 92 17:27:14 GMT
  7. References: <1992Jul27.175107.7633@rchland.ibm.com> <ADRIANHO.92Jul27175403@barkley.berkeley.edu> <1992Jul28.114518.12123@rchland.ibm.com>
  8. Sender: usenet@crd.ge.com (Required for NNTP)
  9. Reply-To: kennykb@crd.ge.com
  10. Organization: GE R&D, Information Architectures & Management Program
  11. Lines: 72
  12. Nntp-Posting-Host: dssv01.crd.ge.com
  13.  
  14.  
  15. In article <1992Jul28.114518.12123@rchland.ibm.com> you write:
  16. |> Question 2: (long winded, sorry)
  17. |> 
  18. |> How do I provide access to structures more complex than just strings?
  19. |> 
  20. |> For example, I've got a structure 
  21. |> 
  22. |> typedef struct {
  23. |>     char *name;
  24. |>     int  rank;
  25. |>     int  ssn;
  26. |> } Soldier;
  27. |> 
  28. |> Soldier grunt;
  29. |> 
  30. |> Now, is there any way I can pass ``grunt'' to a tcl proc and have it be
  31. |> able to access grunt.name or grunt.rank ?
  32.  
  33. My preference is to have a single Tcl function that represents an
  34. object.  For instance, in the tclTCP package, there is a command,
  35.  
  36.     tcp server
  37.  
  38. that creates a TCP server object.  One of the side effects to `tcp
  39. server' is that it creates a new Tcl command, with a name like
  40. `tcp_server_4', and returns its name.  The data structure describing
  41. the server is allocated from free store and initialized, and carried
  42. along as the command's client data.  That way, I can say
  43.  
  44.     set s [tcp server]
  45.  
  46. and then say things like
  47.  
  48.     # Begin accepting connections
  49.     $s start
  50.     # Tell the user what port we're listening to
  51.     puts stdout "Server is listening at [$s configure -port]"
  52.  
  53. ... and so on.  If you want to see some more coding examples, ftp the
  54. tclTCP package from barkley.berkeley.edu.
  55.  
  56. Extended Tcl uses a competing approach, owing primarily to personal
  57. taste (Karl Lehenbauer doesn't care for the noun-verb syntax that the
  58. use of the client data enforces, while I prefer it).  It has an
  59. additional type of object called a `handle' that provides a textual
  60. reference to the data structures.  If you ftp Extended Tcl from
  61. barkley.berkeley.edu, you'll find a file called `Handle.man' in the
  62. `man' directory that describes the C rountines that Extended Tcl uses
  63. to map between structure pointers and textual names.
  64.  
  65. If I had done tclTCP the latter way, the syntax would have looked
  66. like:
  67.  
  68.     set s [tcp create_server]
  69.     # Start accepting new connections
  70.     server start $s
  71.     # Tell the user the listening port
  72.     puts stdout "Server listening at port [server configure $s -port]"
  73.  
  74. ... and so on.  The code would also have been a trifle more
  75. complicated, because the handles would have to be converted to
  76. pointers explicitly, rather than having Tcl_Eval just look up a client
  77. data word.  As I said, which method to choose is largely a matter of
  78. personal taste.
  79.  
  80. John Ousterhout has experimented with both methods: files in Tcl are
  81. identified by handles, while widgets in Tk are independent commands
  82. having client data.  John, do you have anything to add about the
  83. tradeoffs?  
  84.  
  85. 73 de ke9tv/2, Kevin          There isn't any .signature virus, is there?
  86.