Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Print output into a file or not print output?

I'd like to save or ignore outputs when I execute a specific function in lisp. I use Emacs and CCL. For example,

(defun foo (x) (format t "x = ~s~%" x))

and if I execute the function, it prints out "x = 5". But I don't want to printout in a buffer, because if I have a large amount of iteration, the speed of simulation will be decreased.

Any idea?

like image 679
user1024748 Avatar asked Dec 22 '22 07:12

user1024748


2 Answers

You can temporarily redirect standard output by binding *standard-output* to a stream. For example, a broadcast stream with no output streams will serve as a black hole for output:

(let ((*standard-output* (make-broadcast-stream)))
  (foo 10)
  (foo 20))
;; Does not output anything.

You can also do this with other binding constructs, such as with-output-to-string or with-open-file:

(with-output-to-string (*standard-output*)
  (foo 10)
  (foo 20))
;; Does not print anything;
;; returns the output as a string instead.

(with-open-file (*standard-output* "/tmp/foo.txt" :direction :output)
  (foo 10)
  (foo 20))
;; Does not print anything;
;; writes the output to /tmp/foo.txt instead.
like image 60
Matthias Benkard Avatar answered Jan 14 '23 12:01

Matthias Benkard


Instead of t as the first argument to format, you can give it an output file stream and your output for that statement will be sent to that file stream.

However having excessive disk I/O will also will increase your running time, hence you can consider having two modes like a debug and a release mode for your program where the debug mode prints all the diagnostic messages and the release mode does not print anything at all.

like image 45
loudandclear Avatar answered Jan 14 '23 12:01

loudandclear