 skipWS = (inStream) ->
   while inStream.peek() in WHITESPACE then inStream.next()
 
-invisibleProperty = (obj, name, value) ->
-  Object.defineProperty obj, name,
-    value: value
-    configurable: false
-    enumerable: false
-    writable: false
-  obj
-
-lineInfo = (obj, line, column) ->
-  invisibleProperty obj, '__position', {line: line, column: column}
-
 # (type, value, line, column) -> (node {type, value, line, column)}
-makeObj = (value, type, line, column) ->
-  lineInfo (invisibleProperty value, '__type', type), line, column
+makeObj = (type, value, line, column) ->
+  list(type, value, line, column)
 
 # msg -> (IO -> Node => Error)
 handleError = (message) ->
-  (line, column) -> lineInfo (cons "error", message), line, column
+  (line, column) -> makeObj('error', message, line, column)
 
 # IO -> Node => Comment
 readComment = (inStream) ->

    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


# 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) ->
  inStream = if inStream instanceof Source then inStream else new Source inStream
  inReadMacros = if InReadMacros? then inReadMacros else readMacros
  inReadMacroKeys = (i for i of inReadMacros)
