Lisp for Java Users: Trivial Reader

We can now implement a very simple reader class for simplified Lisp lists. The class header and constructor look like this:

public class ListReader { private static final char OPEN_PAREN = '('; private static final char CLOSE_PAREN = ')'; private final PeekStream stream; public ListReader (final PeekStream stream) { this.stream = stream; } }

Here is the read method:

public Object read () throws IOException { stream.skipBlanks (); final int chr = stream.peekChar (); if (chr == OPEN_PAREN) { stream.readChar (OPEN_PAREN); final List<Object> result = new ArrayList<> (); while (!stream.peekChar (CLOSE_PAREN)) { result.add (read ()); stream.skipBlanks (); } stream.readChar (CLOSE_PAREN); return result; } final StringBuilder buffer = new StringBuilder (); while (!Character.isWhitespace (stream.peekChar ()) && stream.peekChar () != OPEN_PAREN && stream.peekChar () != CLOSE_PAREN) { buffer.append ((char)stream.readChar ()); } return Double.parseDouble (buffer.toString ()); }

The first part of this method reads everything in a balanced pair of parentheses as a List, using the read method recursively for the list content. The second part of this method reads characters that are not blanks or parentheses into a StringBuilder buffer and parses that as a double float number. You can download and run this code yourself, using a simple ReadDemo class with a main method.