<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>COPYING</filename>
    </added>
    <added>
      <filename>LICENSE.kawa</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/BaseUnit.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/BitOps.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/CComplex.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/CQuantity.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/Complex.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/DComplex.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/DFloNum.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/DQuantity.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/DateTime.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/Dimensions.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/Duration.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/ExponentialFormat.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/FixedRealFormat.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/IntFraction.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/IntNum.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/MPN.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/MulUnit.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/NamedUnit.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/Numeric.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/Quantity.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/RatNum.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/RealNum.java</filename>
    </added>
    <added>
      <filename>src/main/gnu/math/Unit.java</filename>
    </added>
    <added>
      <filename>src/main/ioke/lang/False.java</filename>
    </added>
    <added>
      <filename>src/main/ioke/lang/Mixins.java</filename>
    </added>
    <added>
      <filename>src/main/ioke/lang/Number.java</filename>
    </added>
    <added>
      <filename>src/main/ioke/lang/True.java</filename>
    </added>
    <added>
      <filename>src/main/ioke/lang/exceptions/ObjectIsNotRightType.java</filename>
    </added>
    <added>
      <filename>src/main/ioke/lang/mixins/Comparing.java</filename>
    </added>
    <added>
      <filename>test/number_spec.rb</filename>
    </added>
    <added>
      <filename>test/operators_spec.rb</filename>
    </added>
    <added>
      <filename>test/parsing_spec.rb</filename>
    </added>
    <added>
      <filename>test/scripts/bench_fib_rec.ik</filename>
    </added>
    <added>
      <filename>test/scripts/fib_iter.ik</filename>
    </added>
    <added>
      <filename>test/scripts/fib_rec.ik</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -61,6 +61,18 @@
     &lt;/jar&gt;
   &lt;/target&gt;
 
+  &lt;target name=&quot;jar-notest&quot; depends=&quot;compile&quot; description=&quot;Create the ioke.jar file&quot;&gt;
+    &lt;jar destfile=&quot;${lib.dist.dir}/ioke.jar&quot;&gt;
+      &lt;fileset dir=&quot;${classes.dir}&quot;&gt;
+        &lt;include name=&quot;**/*.class&quot;/&gt;
+        &lt;include name=&quot;**/*.properties&quot;/&gt;
+      &lt;/fileset&gt;
+      &lt;manifest&gt;
+        &lt;attribute name=&quot;Built-By&quot; value=&quot;${user.name}&quot;/&gt;
+      &lt;/manifest&gt;
+    &lt;/jar&gt;
+  &lt;/target&gt;
+
   &lt;target name=&quot;clean&quot; description=&quot;clean almost everything&quot;&gt;
     &lt;delete dir=&quot;${build.dir}&quot;/&gt;
     &lt;delete file=&quot;${lib.dist.dir}/ioke.jar&quot; quiet=&quot;true&quot;/&gt;</diff>
      <filename>build.xml</filename>
    </modified>
    <modified>
      <diff>@@ -2,10 +2,12 @@ grammar ioke;
 
 options { 
     output = AST; 
+    backtrack = true;
 }
 
 tokens {
     MESSAGE_SEND;
+    MESSAGE_SEND_EMPTY;
 }
 
 @lexer::header {
@@ -16,10 +18,28 @@ package ioke.lang.parser;
 package ioke.lang.parser;
 }
 
-@lexer::members {
+@members {
+  protected void mismatch(IntStream input, int ttype, BitSet follow) throws RecognitionException {
+    throw new MismatchedTokenException(ttype, input);
+  }
+
+  public void recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow) throws RecognitionException {
+			reportError(e);
+    throw e;
+  }
 }
 
-@members {
+@rulecatch {
+  catch(RecognitionException e) {
+    throw e;
+  }
+}
+
+@lexer::members {
+  public void reportError(RecognitionException e) {
+    displayRecognitionError(this.getTokenNames(), e);
+    throw new RuntimeException(e);
+  }
 }
 
 messageChain
@@ -34,24 +54,23 @@ commatedExpression
 
 assignmentExpression
     :
-        expression (Equals expression)?
+        expression+ (binaryOperator expression)?
     ;
 
 expression
     :
-        literal
-    |   message
-    |   Terminator
-    ;
-
-message
-    :
         Identifier ('(' commatedExpression? ')')? -&gt; ^(MESSAGE_SEND Identifier commatedExpression?)
+    |   binaryOperator '(' commatedExpression? ')'  -&gt; ^(MESSAGE_SEND binaryOperator commatedExpression?)
+    |   '(' commatedExpression? ')'  -&gt; ^(MESSAGE_SEND_EMPTY commatedExpression?)
+    |   StringLiteral
+    |   NumberLiteral
+    |   Terminator
     ;
 
-literal
+binaryOperator
     :
-        StringLiteral
+        ComparisonOperator
+    |   Equals
     ;
 
 Identifier
@@ -59,6 +78,10 @@ Identifier
         Letter (Letter|IDDigit|StrangeChars)*
     ;
 
+NumberLiteral
+    : '0'
+    | ('1'..'9') Digit*
+    ;
 
 StringLiteral
     :  '&quot;' ( EscapeSequence | ~('\\'|'&quot;') )* '&quot;'
@@ -75,6 +98,11 @@ LineComment
     : '#' ~('\n'|'\r')* {$channel=HIDDEN;}
     ;
 
+ComparisonOperator
+    :
+        '&lt;'
+    ;
+
 Equals
     :
         '='
@@ -105,6 +133,9 @@ UnicodeEscape
     ;
 
 fragment
+Digit : '0'..'9' ;
+
+fragment
 HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
 
 fragment</diff>
      <filename>src/grammar/ioke.g</filename>
    </modified>
    <modified>
      <diff>@@ -16,6 +16,12 @@ public class DefaultBehavior extends IokeObject {
     }
 
     public void init() {
+        registerMethod(new JavaMethod(runtime, &quot;&quot;, &quot;returns result of evaluating first argument&quot;) {
+                public IokeObject activate(Context context, Message message, IokeObject on) {
+                    return message.getEvaluatedArgument(0, context);
+                }
+            });
+
         registerMethod(new JavaMethod(runtime, &quot;internal:createText&quot;, &quot;expects one 'strange' argument. creates a new instance of Text with the given Java String backing it.&quot;) {
                 public IokeObject activate(Context context, Message message, IokeObject on) {
                     String s = (String)message.getArg1();
@@ -24,6 +30,13 @@ public class DefaultBehavior extends IokeObject {
                 }
             });
 
+        registerMethod(new JavaMethod(runtime, &quot;internal:createNumber&quot;, &quot;expects one 'strange' argument. creates a new instance of Number that represents the number found in the strange argument.&quot;) {
+                public IokeObject activate(Context context, Message message, IokeObject on) {
+                    String s = (String)message.getArg1();
+                    return new Number(runtime, s);
+                }
+            });
+
         registerMethod(new JavaMethod(runtime, &quot;=&quot;, &quot;expects two arguments, the first unevaluated, the second evaluated. assigns the result of evaluating the second argument in the context of the caller, and assigns this result to the name provided by the first argument. the first argument remains unevaluated. the result of the assignment is the value assigned to the name. if the second argument is a method-like object and it's name is not set, that name will be set to the name of the cell.&quot;) {
                 public IokeObject activate(Context context, Message message, IokeObject on) {
                     String name = ((Message)message.getArg1()).getName();
@@ -59,7 +72,7 @@ public class DefaultBehavior extends IokeObject {
 
         registerMethod(new JavaMethod(runtime, &quot;method&quot;, &quot;expects any number of unevaluated arguments. if no arguments at all are given, will just return nil. creates a new method based on the arguments. this method will be evaluated using the context of the object it's called on, and thus the definition can not refer to the outside scope where the method is defined. (there are other ways of achieving this). all arguments except the last one is expected to be names of arguments that will be used in the method. there will possible be additions to the format of arguments later on - including named parameters and optional arguments. the actual code is the last argument given.&quot;) {
                 public IokeObject activate(Context context, Message message, IokeObject on) {
-                    List&lt;IokeObject&gt; args = message.getArguments();
+                    List&lt;Object&gt; args = message.getArguments();
 
                     if(args.size() == 0) {
                         return new JavaMethod(runtime, &quot;nil&quot;, &quot;returns nil&quot;) {
@@ -69,7 +82,7 @@ public class DefaultBehavior extends IokeObject {
                     }
 
                     List&lt;String&gt; argNames = new ArrayList&lt;String&gt;(args.size()-1);
-                    for(IokeObject obj : args.subList(0, args.size()-1)) {
+                    for(Object obj : args.subList(0, args.size()-1)) {
                         argNames.add(((Message)obj).getName());
                     }
 </diff>
      <filename>src/main/ioke/lang/DefaultBehavior.java</filename>
    </modified>
    <modified>
      <diff>@@ -26,10 +26,14 @@ public class Ground extends IokeObject {
         registerCell(&quot;System&quot;, runtime.system);
         registerCell(&quot;Runtime&quot;, runtime.runtime);
         registerCell(&quot;Text&quot;, runtime.text);
+        registerCell(&quot;Number&quot;, runtime.number);
         registerCell(&quot;nil&quot;, runtime.nil);
+        registerCell(&quot;true&quot;, runtime._true);
+        registerCell(&quot;false&quot;, runtime._false);
         registerCell(&quot;Method&quot;, runtime.method);
         registerCell(&quot;DefaultMethod&quot;, runtime.defaultMethod);
         registerCell(&quot;JavaMethod&quot;, runtime.javaMethod);
+        registerCell(&quot;Mixins&quot;, runtime.mixins);
     }
 
     public String toString() {</diff>
      <filename>src/main/ioke/lang/Ground.java</filename>
    </modified>
    <modified>
      <diff>@@ -11,15 +11,16 @@ import java.util.IdentityHashMap;
 
 import ioke.lang.exceptions.NotActivatableException;
 import ioke.lang.exceptions.NoSuchCellException;
+import ioke.lang.exceptions.ObjectIsNotRightType;
 
 /**
  * @author &lt;a href=&quot;mailto:ola.bini@gmail.com&quot;&gt;Ola Bini&lt;/a&gt;
  */
 public class IokeObject {
-    Runtime runtime;
-    String documentation;
-    Map&lt;String, IokeObject&gt; cells = new HashMap&lt;String, IokeObject&gt;();
-    List&lt;IokeObject&gt; mimics = new ArrayList&lt;IokeObject&gt;();
+    public Runtime runtime;
+    public String documentation;
+    public Map&lt;String, IokeObject&gt; cells = new HashMap&lt;String, IokeObject&gt;();
+    public List&lt;IokeObject&gt; mimics = new ArrayList&lt;IokeObject&gt;();
     
     public IokeObject(Runtime runtime, String documentation) {
         this.runtime = runtime;
@@ -97,6 +98,10 @@ public class IokeObject {
         return false;
     }
 
+    public Number convertToNumber() {
+        throw new ObjectIsNotRightType(this, &quot;Number&quot;);
+    }
+
     public IokeObject getOrActivate(Context context, Message message, IokeObject on) {
         if(isActivatable()) {
             return activate(context, message, on);</diff>
      <filename>src/main/ioke/lang/IokeObject.java</filename>
    </modified>
    <modified>
      <diff>@@ -15,10 +15,12 @@ import ioke.lang.parser.iokeParser;
  * @author &lt;a href=&quot;mailto:ola.bini@gmail.com&quot;&gt;Ola Bini&lt;/a&gt;
  */
 public class Message extends IokeObject {
+    private static enum Type {MESSAGE, BINARY, BINARY_ASSIGNMENT};
+
     private String name;
-    private Object arg1;
-    private Object arg2;
-    private List&lt;IokeObject&gt; arguments = new ArrayList&lt;IokeObject&gt;();
+    private Type type = Type.MESSAGE;
+
+    private List&lt;Object&gt; arguments = new ArrayList&lt;Object&gt;();
 
     Message next;
     Message prev;
@@ -27,19 +29,27 @@ public class Message extends IokeObject {
         this(runtime, name, null);
     }
 
+    public Message(Runtime runtime, String name, Object arg1, Type type) {
+        this(runtime, name, arg1);
+        this.type = type;
+    }
+
     public Message(Runtime runtime, String name, Object arg1) {
         super(runtime, &quot;&lt;message &quot; + name + &quot;&gt;&quot;);
         this.name = name;
-        this.arg1 = arg1;
+
+        if(arg1 != null) {
+            arguments.add(arg1);
+        }
     }
     
-    public List&lt;IokeObject&gt; getArguments() {
+    public List&lt;Object&gt; getArguments() {
         return arguments;
     }
 
     IokeObject allocateCopy() {
-        Message m = new Message(runtime, name, arg1);
-        m.arg2 = arg2;
+        Message m = new Message(runtime, name);
+        m.arguments = new ArrayList&lt;Object&gt;(this.arguments);
         return m;
     }
 
@@ -47,37 +57,47 @@ public class Message extends IokeObject {
         this.next = next;
     }
 
+    private static Message fromMessageSend(Runtime runtime, String name, int argStart, Tree tree) {
+        Message m = new Message(runtime, name);
+        Message currentArg = null;
+        for(int i=argStart,j=tree.getChildCount(); i&lt;j; i++) {
+            if(currentArg == null) {
+                currentArg = fromTree(runtime, tree.getChild(i));
+                if(currentArg.name.equals(&quot;,&quot;)) {
+                    currentArg = null;
+                } else {
+                    m.arguments.add(currentArg);
+                }
+            } else {
+                currentArg.next = fromTree(runtime, tree.getChild(i));
+                currentArg.next.prev = currentArg;
+                currentArg = currentArg.next;
+            }
+        }
+        return m;
+    }
+
     public static Message fromTree(Runtime runtime, Tree tree) {
         if(!tree.isNil()) {
             switch(tree.getType()) {
             case iokeParser.StringLiteral:
                 return new Message(runtime, &quot;internal:createText&quot;, tree.getText());
+            case iokeParser.NumberLiteral:
+                return new Message(runtime, &quot;internal:createNumber&quot;, tree.getText());
             case iokeParser.Identifier:
                 return new Message(runtime, tree.getText());
             case iokeParser.Terminator:
                 return new Message(runtime, &quot;;&quot;);
             case iokeParser.Equals:
-                return new Message(runtime, &quot;=&quot;);
+                return new Message(runtime, &quot;=&quot;, null, Type.BINARY_ASSIGNMENT);
             case iokeParser.Comma:
                 return new Message(runtime, &quot;,&quot;);
+            case iokeParser.ComparisonOperator:
+                return new Message(runtime, tree.getText(), null, Type.BINARY);
+            case iokeParser.MESSAGE_SEND_EMPTY:
+                return fromMessageSend(runtime, &quot;&quot;, 0, tree);
             case iokeParser.MESSAGE_SEND:
-                Message m = new Message(runtime, tree.getChild(0).getText());
-                Message currentArg = null;
-                for(int i=1,j=tree.getChildCount(); i&lt;j; i++) {
-                    if(currentArg == null) {
-                        currentArg = fromTree(runtime, tree.getChild(i));
-                        if(currentArg.name.equals(&quot;,&quot;)) {
-                            currentArg = null;
-                        } else {
-                            m.arguments.add(currentArg);
-                        }
-                    } else {
-                        currentArg.next = fromTree(runtime, tree.getChild(i));
-                        currentArg.next.prev = currentArg;
-                        currentArg = currentArg.next;
-                    }
-                }
-                return m;
+                return fromMessageSend(runtime, tree.getChild(0).getText(), 1, tree);
             default:
                 java.lang.System.err.println(&quot;NOOOO: Can't handle &quot; + tree + &quot; : &quot; + tree.getType());
             }
@@ -90,24 +110,28 @@ public class Message extends IokeObject {
             for(int i=0,j=tree.getChildCount(); i&lt;j; i++) {
                 Message created = fromTree(runtime, tree.getChild(i));
 
-
-                if(currents.size() &gt; 0 &amp;&amp; currents.get(0).name.equals(&quot;=&quot;)) {
-                    currents.get(0).arg1 = currents.get(0).prev;
+                if(currents.size() &gt; 0 &amp;&amp; currents.get(0).type == Type.BINARY_ASSIGNMENT) {
+                    currents.get(0).arguments.add(null);
+                    currents.get(0).arguments.add(null);
+                    currents.get(0).arguments.set(0,currents.get(0).prev);
 
                     currents.get(0).prev.next = null;
 
                     if(currents.get(0).prev.prev != null) {
                         currents.get(0).prev = currents.get(0).prev.prev;
                         currents.get(0).prev.next = currents.get(0);
-                        ((Message)currents.get(0).arg1).prev = null;
+                        ((Message)currents.get(0).arguments.get(0)).prev = null;
                     } else {
-                        if(currents.get(0).arg1 == head) {
+                        if(currents.get(0).arguments.get(0) == head) {
                             head = currents.get(0);
                         }
                         currents.get(0).prev = null;
                     }
 
-                    currents.get(0).arg2 = created;
+                    currents.get(0).arguments.set(1,created);
+                    currents.add(0, created);
+                } else if(currents.size() &gt; 0 &amp;&amp; currents.get(0).type == Type.BINARY) {
+                    currents.get(0).arguments.add(created);
                     currents.add(0, created);
                 } else {
                     if(created.name.equals(&quot;;&quot;) &amp;&amp; currents.size() &gt; 1) {
@@ -135,18 +159,34 @@ public class Message extends IokeObject {
         return name;
     }
 
+    public IokeObject getEvaluatedArgument(int index, Context context) {
+        Object o = arguments.get(index);
+        if(!(o instanceof Message)) {
+            return (IokeObject)o;
+        }
+
+        return ((Message)o).evaluateCompleteWith(context, context.ground);
+    }
+
     public Object getArg1() {
-        return arg1;
+        return arguments.get(0);
     }
 
     public Object getArg2() {
-        return arg2;
+        return arguments.get(1);
     }
 
     public IokeObject sendTo(Context context, IokeObject recv) {
         return recv.perform(context, this);
     }
 
+    public IokeObject sendTo(Context context, IokeObject recv, IokeObject argument) {
+        Message m = (Message)allocateCopy();
+        m.arguments.clear();
+        m.arguments.add(argument);
+        return recv.perform(context, m);
+    }
+
     public IokeObject evaluateComplete() {
         return evaluateCompleteWith(runtime.getGround());
     }
@@ -173,8 +213,14 @@ public class Message extends IokeObject {
 
     @Override
     public String toString() {
-        if(arg1 != null) {
-            return name + &quot;(&quot; + arg1 + &quot;, &quot; + arg2 + &quot;)&quot; + (null == next ? &quot;&quot; : &quot; &quot; + next);
+        if(arguments.size() &gt; 0) {
+            StringBuilder sb = new StringBuilder();
+            String sep = &quot;&quot;;
+            for(Object o : arguments) {
+                sb.append(sep).append(o);
+                sep = &quot;, &quot;;
+            }
+            return name + &quot;(&quot; + sb + &quot;)&quot; + (null == next ? &quot;&quot; : &quot; &quot; + next);
         } else {
             return name + (null == next ? &quot;&quot; : &quot; &quot; + next);
         }</diff>
      <filename>src/main/ioke/lang/Message.java</filename>
    </modified>
    <modified>
      <diff>@@ -17,6 +17,14 @@ public class Origin extends IokeObject {
     }
 
     public void init() {
+        // asText, asRepresentation
+        registerMethod(new JavaMethod(runtime, &quot;println&quot;, &quot;Prints a text representation to standard output&quot;) {
+                public IokeObject activate(Context context, Message message, IokeObject on) {
+                    runtime.getOut().println(runtime.asText.sendTo(context, on).toString());
+                    runtime.getOut().flush();
+                    return runtime.getNil();
+                }
+            });
     }
 
     public String toString() {</diff>
      <filename>src/main/ioke/lang/Origin.java</filename>
    </modified>
    <modified>
      <diff>@@ -35,14 +35,19 @@ public class Runtime {
     DefaultBehavior defaultBehavior = new DefaultBehavior(this, &quot;DefaultBehavior is a mixin that provides most of the methods shared by most instances in the system.&quot;);
     Origin origin = new Origin(this, &quot;Any object created from scratch should usually be derived from Origin.&quot;);
     Nil nil = new Nil(this, &quot;nil is an oddball object that always represents itself. It can not be mimicked and is one of the two false values.&quot;);
-    Text text = new Text(this, &quot;Contains an immutable text.&quot;);
+    True _true = new True(this, &quot;true is an oddball object that always represents itself. It can not be mimicked and represents the a true value.&quot;);
+    False _false = new False(this, &quot;false is an oddball object that always represents itself. It can not be mimicked and is one of the two false values.&quot;);
+    Text text = new Text(this, &quot;&quot;, &quot;Contains an immutable text.&quot;);
+    Number number = new Number(this, &quot;0&quot;, &quot;Represents an exact number&quot;);
     Method method = new Method(this, null, &quot;Method is the origin of all methods in the system, both default and Java..&quot;);
     DefaultMethod defaultMethod = new DefaultMethod(this, null, &quot;DefaultMethod is the instance all methods in the system is derived from.&quot;);
     JavaMethod javaMethod = new JavaMethod(this, null, &quot;JavaMethod is a derivation of Method that represents a primitive implemented in Java.&quot;);
+    Mixins mixins = new Mixins(this, &quot;Mixins is the name space for most mixins in the system. DefaultBehavior is the notable exception.&quot;);
 
     // Core messages
     public Message asText = new Message(this, &quot;asText&quot;);
     public Message mimic = new Message(this, &quot;mimic&quot;);
+    public Message spaceShip = new Message(this, &quot;&lt;=&gt;&quot;);
 
     // NOT TO BE EXPOSED TO Ioke - used for internal usage only
     NullObject nul = new NullObject(this);
@@ -74,12 +79,16 @@ public class Runtime {
     public void init() {
         base.init();
         defaultBehavior.init();
+        mixins.init();
         system.init();
         runtime.init();
         ground.init();
         origin.init();
         nil.init();
+        _true.init();
+        _false.init();
         text.init();
+        number.init();
 
         ground.mimics(base);
         ground.mimics(defaultBehavior);
@@ -89,7 +98,10 @@ public class Runtime {
         runtime.mimics(defaultBehavior);
 
         nil.mimics(origin);
+        _true.mimics(origin);
+        _false.mimics(origin);
         text.mimics(origin);
+        number.mimics(origin);
 
         method.init();
         defaultMethod.init();
@@ -115,6 +127,10 @@ public class Runtime {
         return this.text;
     }
 
+    public Number getNumber() {
+        return this.number;
+    }
+
     public Base getBase() {
         return this.base;
     }
@@ -127,10 +143,12 @@ public class Runtime {
         return this.nil;
     }
 
-    public IokeObject evaluateStream(Reader reader) {
+    public Message parseStream(Reader reader) {
         try {
             iokeParser parser = new iokeParser(new CommonTokenStream(new iokeLexer(new ANTLRReaderStream(reader))));
-            return Message.fromTree(this, (Tree)(parser.messageChain().getTree())).evaluateComplete();
+            Message m = Message.fromTree(this, (Tree)(parser.messageChain().getTree()));
+//             System.err.println(m);
+            return m;
         } catch(RuntimeException e) {
             throw e;
         } catch(Exception e) {
@@ -138,6 +156,10 @@ public class Runtime {
         }
     }
 
+    public IokeObject evaluateStream(Reader reader) {
+        return parseStream(reader).evaluateComplete();
+    }
+
     public IokeObject evaluateFile(String filename) {
         try {
             return evaluateStream(new FileReader(filename));</diff>
      <filename>src/main/ioke/lang/Runtime.java</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,13 @@ public class Text extends IokeObject {
     private String text;
 
     public Text(Runtime runtime, String text) {
-        super(runtime, &quot;Text: &quot; + text);
+        super(runtime, runtime.text.documentation);
+        this.mimics(runtime.text);
+        this.text = text;
+    }
+
+    public Text(Runtime runtime, String text, String description) {
+        super(runtime, description);
         if(runtime.text != null) {
             this.mimics(runtime.text);
         }
@@ -23,13 +29,6 @@ public class Text extends IokeObject {
     }
 
     public void init() {
-        registerMethod(new JavaMethod(runtime, &quot;println&quot;, &quot;Prints the text to standard output&quot;) {
-                public IokeObject activate(Context context, Message message, IokeObject on) {
-                    runtime.getOut().println(runtime.asText.sendTo(context, on).toString());
-                    runtime.getOut().flush();
-                    return runtime.getNil();
-                }
-            });
         registerMethod(new JavaMethod(runtime, &quot;asText&quot;, &quot;Returns a text representation of the object&quot;) {
                 public IokeObject activate(Context context, Message message, IokeObject on) {
                     return on;</diff>
      <filename>src/main/ioke/lang/Text.java</filename>
    </modified>
    <modified>
      <diff>@@ -3,6 +3,9 @@
  */
 package ioke.lang.exceptions;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  *
  * @author &lt;a href=&quot;mailto:ola.bini@gmail.com&quot;&gt;Ola Bini&lt;/a&gt;
@@ -23,4 +26,17 @@ public class IokeException extends RuntimeException {
     public IokeException(String message, Throwable cause) {
         super(message, cause);
     }
+
+    public StackTraceElement[] getStackTrace() {
+        StackTraceElement[] trace = super.getStackTrace();
+        
+        List&lt;StackTraceElement&gt; stes = new ArrayList&lt;StackTraceElement&gt;();
+        for(StackTraceElement ste : trace) {
+            stes.add(ste);
+            if(ste.getClassName().equals(&quot;ioke.lang.Runtime&quot;) &amp;&amp; ste.getMethodName().equals(&quot;evaluateStream&quot;)) {
+                break;
+            }
+        }
+        return stes.toArray(new StackTraceElement[0]);
+    }
 }// IokeException</diff>
      <filename>src/main/ioke/lang/exceptions/IokeException.java</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c0bf1c7ffd953561a50f365eb8fabdc5a9d11905</id>
    </parent>
  </parents>
  <author>
    <name>Ola Bini</name>
    <email>ola.bini@gmail.com</email>
  </author>
  <url>http://github.com/olabini/ioke/commit/06267b02546de557406829e9b00e8bde0b38fc31</url>
  <id>06267b02546de557406829e9b00e8bde0b38fc31</id>
  <committed-date>2008-10-12T09:56:34-07:00</committed-date>
  <authored-date>2008-10-12T09:56:34-07:00</authored-date>
  <message>Add Numbers, and gnu math. Add empty message send, add mixin structure and comparators</message>
  <tree>0ba8bb04f0b868a8d4c0c165cec35d4e6bf9d2d6</tree>
  <committer>
    <name>Ola Bini</name>
    <email>ola.bini@gmail.com</email>
  </committer>
</commit>
