 
 # Given a stream, reads from the stream until a single complete lisp
 # object has been found and returns the object
+
 # IO -> Form
-read = (inStream, eofErrorP = false, eofError = EOF,
-        recursiveP = false, inReadMacros = null, keepComments = false) ->
+read = (inStream, eofErrorP = false, eofError = EOF, recursiveP = false, inReadMacros = null, keepComments = false) ->
   inStream = if inStream instanceof Source then inStream else new Source inStream
   inReadMacros = if InReadMacros? then inReadMacros else readMacros
   inReadMacroKeys = (i for i of inReadMacros)

    inStream.next()).join("")
  if not inStream.done()
    inStream.next()
  makeObj (new String r), 'comment', line, column

# IO -> (Node => Literal => String) | Error
readString = (inStream) ->
  [line, column] = inStream.position()
  inStream.next()
  string = until streq(inStream.peek(), '"') or inStream.done()
    if (streq inStream.peek(), '\\')
      inStream.next()
    inStream.next()
  if inStream.done()
    return handleError("end of file seen before end of string.")(line, column)
  inStream.next()
  makeObj (new String (string.join '')), 'string', line, column

# (String) -> (Node => Literal => Number) | Nothing
readMaybeNumber = (symbol) ->
  if streq(symbol[0], '+')
    return readMaybeNumber symbol.substr(1)
  if streq(symbol[0], '-')
    ret = readMaybeNumber symbol.substr(1)
    return if ret? then -1 * ret else undefined
  if symbol.search(/^0x[0-9a-fA-F]+$/) > -1

    [line1, column1] = inStream.position()
    obj = read inStream, true, null, true
    return obj if (car obj) == 'error'
    makeObj "list", cons((makeObj("symbol", type, line1, column1)), cons(obj)), line, column

# I really wanted to make anything more complex than a list (like an
# object or a vector) something handled by a read macro.  Maybe in a
