3

I was trying to read and eval Lisp forms from a string using a loop, instead of just putting the string into a buffer and using eval-buffer to load everything in the string. That method was mentioned in another thread here.

The problem is that read-from-string signals an error "End of file reached during parsing" and aborts my loop. I was hoping it would return nil, or some indication of the number of characters left, or give me some other way to figure out when to end my loop.

    (while (< pos (length contents))
      (setq pair (read-from-string contents pos))
      (setq obj (car pair))
      (setq pos (cdr pair))
      .. inspect the read obj here
      .. maybe eval it, or toss it, or fix it..
      )

Read-from-string returns starting position for the next read operation in the cdr of the pair returned. So I'm thinking that's so I can use it to start the next read in the right place. But I can't find any examples of how to read a string without getting the EOF error.

Probably it's just that I don't know how handle EOF errors while reading strings. Is there an ideomatic way of handling this kind of situation? Maybe with an unwind-protect or something?

Kevin
  • 1,308
  • 8
  • 20
  • 1
    [Tobias' answer](http://emacs.stackexchange.com/a/19909/5296) on the linked thread shows how to do the this. – npostavs Jul 15 '16 at 13:09
  • 1
    @npostavs, thanks for pointing me back to the Tobias posting. I had tried to understand that code months ago, but failed because I couldn't find enough doc or examples on the `(end-of-file)` expression there. It's the car of a cons cell, without the cdr part, and is (about 3 or 4 links later) a standard error condition. So now I understand. And I think it is a solution to my question. Thanks again. – Kevin Jul 16 '16 at 14:20
  • The `(end-of-file)` is part of the [`condition-case`](https://www.gnu.org/software/emacs/manual/html_node/elisp/Handling-Errors.html) form. – npostavs Jul 16 '16 at 16:38
  • Yes, it's one of many standard error conditions that are used throughout the system. Previously I was confused because it just sat there, and did nothing. Now I understand that it's just the front part of a condition handler required by `condition-case` (there could be other cases to handle other errors too), and the body of the handler was left out because there was nothing to do after reaching end of file. Another mystery of elisp figured out in my continuing education...:-) – Kevin Jul 16 '16 at 18:04

1 Answers1

4

If you want evaluation to return nil when it would normally raise an error, wrap the sexp to be evaluated in ignore-errors:

(ignore-errors (read-from-string contents pos))

See also with-demoted-errors.

Drew
  • 75,699
  • 9
  • 109
  • 225