[slime-devel] Re: Handling ^M and ^H characters output from ext:run-program?

Jeff Cunningham jeffrey at cunningham.net
Sat Jul 16 20:36:30 UTC 2005

On Sat Jul 16, 2005 at 10:24:08AM -0700, GP lisper wrote:
> >
> > (with-open-stream (rip
> >                    (ext:process-output
> >                     (ext:run-program "cdrdao"
> >                                      `("read-test" "-v" "1" "--device"
> This needs to be a list, I'm not up enough on backtick tricks to know
> if it is.  Double check in the process list (something similar to "top
> -c" with a fast rep rate) that the proper arguments appear.
> >                                        ,*burner-scsi-id* ,tocfile)
> >                                      :output :stream
> >                                      :wait nil
> >                                      :error t)))
>     (when rip
>       (loop for line = (read-line rip nil)
> 	    while line do 
>  	     (format t "~a~%" line))
>       (close rip)))
> Is ~ what I use daily.  I built it up playing in the REPL.

It is a list. The command runs fine, its just filtering its output
which is problematic. Here's the only thing I've been able to make
work even remotely the way I want it to:

(let ((rip (ext:process-output
            (ext:run-program "cdrdao"
                             '("read-test" "-v" "1" "--device" "0,6,0" "p7.toc")
                             :output :stream
                             :wait nil
                             :error t))))
  (do ((line (read-line rip nil 'done)
             (read-line rip nil 'done)))
      ((eql line 'eof))
    (let ((progress (scan-to-strings "^Read \\d+ of \\d+ MB." line)))
      (if progress
          (format t "~a~%" progress)
          (format t "~a~%" (subseq line 0 (1- (length line))))))))

This works - except that there's no graceful exit out of the do loop - it results in the following:

Cdrdao version 1.1.9 - (C) Andreas Mueller <andreas at daneb.de>

Starting read test...
Writing track 01 (mode AUDIO/AUDIO )...
Read 0 of 547 MB.
Read 36 of 547 MB.
Read 104 of 547 MB.
Read 264 of 547 MB.
Read 341 of 547 MB.
Read 418 of 547 MB.
Read 244218 blocks.

; Compilation unit aborted.

(After I kill the process in the *slime-repl*):

   DONE is not of type SEQUENCE
   [Condition of type TYPE-ERROR]

  0: [ABORT] Abort SLIME compilation.
  1: [ABORT-READ] Abort reading input from Emacs.
  2: [ABORT] Abort SLIME compilation.
  3: [ABORT] Abort handling SLIME request.
  4: [ABORT] Return to Top-Level.

  1: (SCAN-TO-STRINGS #<#1=unavailable-arg> #<#1#> :START #<#1#> ...)
  2: ("Top-Level Form")[:TOP-LEVEL]

There must be some way to exit that loop gracefully. I tried the loop construct suggested:

  (when rip
    (loop for line = (read-line rip nil)
          while line do
          (format t "~a~%" line))
    (close rip)))

but couldn't get it to work at all. In any event, why would you need
to close rip? Isn't it handled automatically by the 'with-open-stream


More information about the slime-devel mailing list