Now the earlier error went away, but I get
Symbol’s value as variable is void: prev
I guess the read call should be inside the let:
(let ((str "TEST")
(pos 0)
(prev nil))
(read (lambda (&optional ch)
(cond
(ch (push ch prev))
(prev (pop prev))
((< pos (length str))
(prog1 (aref str pos)
(setq pos (1+ pos))))))))
Above returns "TEST".