home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / lang / rexx / 753 < prev    next >
Encoding:
Text File  |  1992-08-19  |  6.0 KB  |  124 lines

  1. Newsgroups: comp.lang.rexx
  2. Path: sparky!uunet!mcsun!sunic!aun.uninett.no!ugle.unit.no!ugle!anders
  3. From: anders@lise11.lise.unit.no (Anders Christensen)
  4. Subject: Re: Capturing System Command Output (was: SH Backquote)
  5. In-Reply-To: Dave Gomberg's message of Wed, 19 Aug 1992 17:30:03 PDT
  6. Message-ID: <ANDERS.92Aug20065053@lise11.lise.unit.no>
  7. Sender: news@ugle.unit.no (NetNews Administrator)
  8. Organization: /home/flipper/anders/.organization
  9. References: <REXXLIST%92081920425567@UGA.CC.UGA.EDU>
  10. Date: 20 Aug 92 06:50:53
  11. Lines: 111
  12.  
  13. In article <REXXLIST%92081920425567@UGA.CC.UGA.EDU> Dave Gomberg <GOMBERG@UCSFVM.BITNET> writes:
  14.  
  15. > Usage:   X = CAPTURE('system_command'[,[address][,'stemname.']])
  16.  
  17. It only handles output from commands; it don't handle input. And for
  18. output, it only handles two special cases: 1) stack it in one
  19. particular order; and 2) put it into a collection of compound
  20. variables.  I think it needs more functionality, and to get more
  21. functionality it need more parameters (or more functions). With more
  22. parameters, it might become too difficult to use for new users.
  23.  
  24. The third parameter must be quoted, since it is the name of the
  25. parameter that is interesting, not its value (if any). This will
  26. somehow break with the syntax of clauses like PROCEDURE EXPOSE and
  27. DROP, which takes unquoted stems. The difference is: they are clauses,
  28. while CAPTURE() is a function ... but will that be obvious to new
  29. users?
  30.  
  31. The same goes to some extent for the second parameter. Normally the
  32. ADDRESS clause is called as  "ADDRESS COMMAND expr"  and the name of
  33. the environment is not quoted, since Rexx does not expect an
  34. expression there (unless it finds a special character.) In the
  35. CAPTURE() function, the environment name would have to be quoted to
  36. avoid any previous setting of the _variable_ COMMAND. Again, will this
  37. subtle (?) difference be obvious to new users?
  38.  
  39. What about the the following syntax, which is a slightly reworked
  40. version of what Ed Spire just posted. It also borrows inspiration from
  41. some of the ideas that Otto Stolz posted. This is a all-in-one
  42. solution, combining the current 'standard' way to do it with the need
  43. for more control over the redirection of input and output. 
  44.  
  45. | ADDRESS [ envir [ exprc [ TO dest ] [ FROM src ] ] ]
  46. |
  47. |     <envir> is the name of the environment to which commands are
  48. |             directed, and must be a symbol or literal string.
  49. |
  50. |     <exprc> is the command to be executed. One restriction applies,
  51. |             "TO" and "FROM" are reserved words, and can not be 
  52. |             used in unquoted form. 
  53. |
  54. |     <expre> an expression that evaluate to the name of an 
  55. |             environment, as already in language level 4.00
  56. |
  57. |     <dest>  =  OUTPUT         output to standard output (default)
  58. |                STEM name.     output to compound var with stem <name.>
  59. |                VAR name       output to variable <name>
  60. |                QUEUE          output is stacked FIFO
  61. |                PUSH           output is stacked LIFO
  62. |                NULL           output is discarded
  63. |                STREAM id      output is connected to stream named <id>
  64. |
  65. |             All these should be self-explaining, except (maybe) the last, 
  66. |             If it is used, the command is run in the background, and
  67. |             and the output from the command can be read using the 
  68. |             functions linein() and charin(), with stream identical to 
  69. |             the <id> given to ADDRESS. <id> is an expr that describes
  70. |             a particular stream, and can be used as first parameter
  71. |             to linein(), lineout() etc.
  72. |
  73. |     <src> =    INPUT          input from standard input (default)
  74. |                STEM name.     input from compound var with stem <name.>
  75. |                VAR name       input from variable <name>
  76. |                PULL           input is popped off the stack
  77. |                NULL           input is empty
  78. |                STREAM id      input is connected to stream named <id>
  79. |
  80. |             Here, STREAM is used the same way, but <id> is used as 
  81. |             the name of the stream for writing input to the command 
  82. |             running. And NULL is used to prohibit the command from 
  83. |             reading input, any read will get End-Of-File.
  84.  
  85. It is rather large, but only two extra subkeywords to ADDRESS are what
  86. is needed to hook it into standard Rexx. But most important, _all_
  87. functionality needed for redirection is provided in _one_
  88. construction: using the stack, streams or variables as the means for
  89. communication.  I can't think of any example of redirection of
  90. commands the during resent days that would not be handled with this
  91. expanded ADDRESS clause.
  92.  
  93. Then there is the 'breakage' to consider. Old commands using 'to' and
  94. 'from' in commands. I can imagine a lot of old Rexx scripts having 
  95. constructs like: 
  96.  
  97.     COPY from to 
  98.  
  99. to copy files or whatever. The actual order of the terms in the
  100. syntax-specification can be rearranged to minimize breakage and
  101. improve readability. If "TO" and "FROM" comes before <exprc>, then the
  102. the streamid (if STREAM is chosen) can not be an expression, since it
  103. would be difficult to differ between the streamid and <exprc>. _If_
  104. breakage is a major problem, the order of the subkeywords and the
  105. subkeywords themselves can be defined so that no breakage occurs.  I
  106. am not completely pleased with the syntax, but at least the idea seems
  107. OK, and the syntax above seems like a good start.
  108.  
  109. Then there are the ordinary commands, which are more or less just 
  110. special cases of ADDRESS (not defined as so in TRL, but at least used
  111. as such; omit the "ADDRESS <envir>", and you've got a command). If
  112. the same changes are applies to commands (acknowledging "TO" and
  113. "FROM" as subkeywords), Rexx would have full support for redirection
  114. of output and input to commands.
  115.  
  116. However, it still does not handle the problem of error output. Any
  117. error text that a command might write out should be possible to catch 
  118. in some way. Maybe it could be fixed by adding a 'ERROR' subkeyword 
  119. in addition to "TO" and "FROM"?
  120.  
  121. Comments, anyone?
  122.  
  123. -anders
  124.