Re: How to avoid new line from stream
Jean Louis <[email protected]> Fri, 3 Aug 2018 14:38:35 +0200
| Newsgroups | gmane.lisp.clisp.general |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Aug 03, 2018 at 02:15:00PM +0200, Max Zettlmeißl wrote: > On Fri, Aug 3, 2018 at 11:36 AM, Jean Louis <[email protected]> wrote: > > > > Thank you. > > > > I found one reference here: > > https://rosettacode.org/wiki/Read_a_file_character_by_character/UTF8#Common_Lisp > > > > Right now it is working this way. > > > > (defun slurp-stream-io-command2 (command string) > > "Returns the output of a command to which string > > has been fed, very usable for markdown, emacs Org > > mode processing and similar" > > (let* ((stream (make-pipe-io-stream command :external-format "utf-8")) > > (in (two-way-stream-input-stream stream)) > > (out (two-way-stream-output-stream stream)) > > (result "")) > > (princ string out) > > (finish-output out) > > (close out) > > (setf result (with-output-to-string (var) > > (loop for c = (read-char in nil) > > while c > > do (format var "~a" c)))) > > (finish-output in) > > (close in) > > (close stream) > > result)) > > I took a closer look at make-pipe-io-stream and most of the things > your are doing are superfluous or even nonsensical. > As you can see in the CLISP documentation, the primary value returned > by make-pipe-io-stream is a bidirectional stream. > (https://clisp.sourceforge.io/impnotes/shell.html#pipe) > If you wanted to access the input and output streams separately, you > would use multiple-value-bind, but in your case there is no reason to > do so. > Your example does not apply exactly to this situation, since streams > connected to files behave differently from network streams or pipes, > where it is very uncertain if and when output will be available. > Personally I would choose a better name for the function, but here is > how you could write it in a better way: > > (defun slurp-stream-io (command input) > (with-open-stream (stream (make-pipe-io-stream command :buffered nil)) > (princ input stream) > (with-output-to-string (output) > (loop > do (write-char (read-char stream) output) > while (listen stream))))) > > It blocks until the first character is received > from the command. (slurp-stream-io "markdown" "hello") OK but example is not working. It blocks forever. > I don't see any reason to use > slurp-stream-io-command over run-program. Your > intent would be transported way more clearly by > run-program. > (https://clisp.sourceforge.io/impnotes/shell.html#run-prog) > Additionally it is more customizable than > make-pipe-io-stream e.g. when you want to > supply arguments to the program which you > invoke. > > (defun slurp-stream-io-1 (command input) > (with-open-stream (stream (run-program command > :input :stream > :output :stream)) > (princ input stream) > (finish-output stream) > (with-output-to-string (output) > (loop > do (write-char (read-char stream) output) > while (listen stream))))) (slurp-stream-io "markdown" "hello") that one blocks forever too. I get the idea, and I just cannot find working example. I would like to learn how to use it with run-program. Until then this one below works. (defun slurp-stream-io-command2 (command string) "Returns the output of a command to which string has been fed, very usable for markdown, emacs Org mode processing and similar" (let* ((stream (make-pipe-io-stream command :external-format "utf-8")) (in (two-way-stream-input-stream stream)) (out (two-way-stream-output-stream stream)) (result "")) (princ string out) (finish-output out) (close out) (setf result (with-output-to-string (var) (loop for c = (read-char in nil) while c do (format var "~a" c)))) (finish-output in) (close in) (close stream) result)) (slurp-stream-io-command2 "markdown" "Hello") Jean ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ clisp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/clisp-list