Subject: bug#16576: Binding `standard-output' to a function doesn't work -- function sometimes called with garbage

From: Eli Zaretskii <[email-masked]>
Date: Tue, 28 Jan 2014 17:59:20 +0200

> Date: Tue, 28 Jan 2014 10:09:08 +0100
> From: Anders Lindgren <[email-masked]>
> 
>     emacs -Q
>     Eval the following:
> 
> (defvar bug-bind-output-str nil)
> 
> (defun bug-bind-output-function (char)
>   (setq bug-bind-output-str
>         (concat bug-bind-output-str (list char))))
> 
> (defun bug-bind-output-test ()
>   (interactive)
>   (let ((bug-bind-output-str "")
>         (standard-output 'bug-bind-output-function)
>         (s
>         s0)
>     (prin1 s)
>     bug-bind-output-str))
> 
> Type this a number of times:
> 
>     M-x (bug-bind-output-test) RET

I think there's a bug in your test program.  You let-bind
bug-bind-output-str, and print that local binding after you call
prin1.  But your print function concatenates each character onto the
_global_ binding of bug-bind-output-str, so the result is not in your
local binding, it's in the global one.

If you change your program like this:

  (defun bug-bind-output-test ()
    (interactive)
    (setq bug-bind-output-str "")
    (let ((standard-output 'bug-bind-output-function)
	  (s
	  s0)
      (prin1 s)
      bug-bind-output-str))

i.e., work with the global binding, then the program works as
expected, AFAICS.