Subject: bug#22961: The read function does not support a lambda argument

From: John Mastro <[email-masked]>
Date: Wed, 9 Mar 2016 10:27:28 -0800

Mihai Călin Bazon <[email-masked]> wrote:
> Example, I eval this in the scratch buffer (with lexical-binding set true):
>
>     (read (let ((str "TEST")
>                 (pos 0)
>                 (prev nil))
>             (lambda (ch)
>               (cond
>                 (ch (push ch prev))
>                 (prev (pop prev))
>                 ((< pos (length str))
>                  (prog1 (aref str pos)
>                    (setq pos (1+ pos))))))))
>
> According to the docs [1] an input stream can be a function.  I would expect
> the above to return the symbol TEST, but instead I get an error ("end of
> file during parsing").

Confirmed on Emacs 25. However, it does work with a named defun:

    (let ((str "TEST")
          (pos 0)
          (prev nil))
      (defun my-read-function (&optional ch)
        (cond (ch (push ch prev))
              (prev (pop prev))
              ((< pos (length str))
               (prog1 (elt str pos)
                 (setq pos (1+ pos)))))))

    (read #'my-read-function) ;=> TEST

(Mihai, the ‘ch’ argument should be ‘&optional’, though that's not
related to the error in question).

-- 
john