X++

X++ has just a bool and a stream to store values. X++ was invented in April 2008 by User:Feuermonster.

Instructions
(* may be 1 or 0) (? may be a number from 0 to stream.len)


 * Xor * 
 * bool = bool xor *


 * Or * 
 * bool = bool or *


 * And *
 * bool = bool and *


 * Not 
 * bool = not bool


 * Addr
 * adds the bool to the stream which is actually a string. stream = stream + (string)bool


 * Addl
 * adds the bool to the stream which is actually a string. stream = (string)bool + stream


 * Outc
 * converts the stream to a number using binary representation. Then it prints the number as a character. (65=a)


 * Outn   
 * converts the stream to a number using binary representation. Then it prints the number in decimal.


 * Clear
 * clears the stream


 * Clear ?
 * removes stream[?] from the stream


 * Get ?
 * bool = stream[?]


 * Set ?
 * stream[?] = bool


 * XGet ?1:?2
 * bool = stream[bintodec(stream[?1:?1+?2])]


 * XSet ?1:?2
 * stream[bintodec(stream[?1:?1+?2])] = bool


 * XClear ?1:?2
 * removes stream[bintodec(stream[?1:?1+?2])] from the stream


 * In
 * Input. (0 or 1) bool = (bool)input

stream[?1:?1+?2] means the following: Clear Or 1 Addl XClear 0:8

//This would convert stream[0] + stream[1] ... + stream[7] to a number using binary representation //In this case, it would remove the 128th element from the stream.

Loops

 * [...]   while(bool=0) { ... }
 * (...)   while(bool!=0) { ... }
 * {...}   while(stream.Length < 8) { ... }

Examples
Or 1 Addr And 0 Addr Or 1 Addr Outn

This will print 101 as decimal -> 5.

Or 1 Set 1 And 0 Set 1 Set 2 Set 3 Set 4 Set 5 Or 1 Set 6 Outc

this will print 00100001 as character -> A

Implementation
Java implementation by User:Mafi with stream readers (use a for bit 0 in the stream, b=1, c=2 ... h=7). [now all loop types] Note: You can't use Addl in this implementation! import java.io.*;

class XppInterpreter { private static boolean actbool = false; private static boolean[] stream = new boolean[8]; private static int streamlength = 0; private static final String CMD_XOR  = "XOR _b_", CMD_OR   = "OR _b_", CMD_AND  = "AND _b_", CMD_NOT  = "NOT", CMD_ADDR = "ADDR", CMD_OUTC = "OUTC", CMD_OUTN = "OUTN", CMD_CLEAR = "CLEAR", CMD_GET  = "GET _i_", CMD_SET  = "SET _i_", CMD_IN   = "IN"; private static final String[] varnames = { "A","B","C","D","E","F","G","H" };

private static void initStream{ for(int i=0; i<=7; i++){ stream[i] = false; }   streamlength = 0; } private static void pushOnStream(boolean newb){ for(int i=1; i<=7; i++){ stream[i-1] = stream[i]; }   stream[7] = newb; streamlength++; if(streamlength>8) streamlength=8; } private static int streamToInt{ int t = 128, r = 0; for(int i=0; i<=7; i++){ if(stream[i] == true){ r += t;     } t /= 2; }   return(r); } private static String goBack(String code, String oldcode){ return(oldcode.substring(oldcode.length-code.length-1)); } public static void interpret(String code){ initStream; actbool = false; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); code = code.toUpperCase; String oldcode = code; boolean noelse = false; //continue while(code.length > 0){ noelse = false;

//simple Befehle / simple Commands //not if(code.startsWith(CMD_NOT)){ actbool = !actbool; code = code.substring(CMD_NOT.length); noelse = true; }     //addr if(code.startsWith(CMD_ADDR)){ pushOnStream(actbool); code = code.substring(CMD_ADDR.length); noelse = true; }     //outc if(code.startsWith(CMD_OUTC)){ System.out.print((char) streamToInt); code = code.substring(CMD_OUTC.length); noelse = true; }     //outn if(code.startsWith(CMD_OUTN)){ System.out.print(streamToInt); code = code.substring(CMD_OUTN.length); noelse = true; }     //clear if(code.startsWith(CMD_CLEAR)){ initStream; code = code.substring(CMD_CLEAR.length); noelse = true; }     //in if(code.startsWith(CMD_IN)){ try{ actbool = ((char)br.read == ' '); }catch(Exception ex){ actbool = false; }       code = code.substring(CMD_IN.length); noelse = true; }     //Bool-Funktionen / bool functions for(int i=0; i<=9; i++){ //true or false if(i <= 1) { //xor if( code.startsWith(CMD_XOR.replace("_b_",""+i)) ){ actbool = actbool ^ (1 == i); code = code.substring(CMD_XOR.length-2); noelse = true; }         //or if( code.startsWith(CMD_OR.replace("_b_",""+i)) ){ actbool = actbool | (1 == i); code = code.substring(CMD_OR.length-2); noelse = true; }         //and if( code.startsWith(CMD_AND.replace("_b_",""+i)) ){ actbool = actbool & (1 == i); code = code.substring(CMD_AND.length-2); noelse = true; }       }else{  //stream readers String var = varnames[i-2]; //xor if( code.startsWith(CMD_XOR.replace("_b_",var)) ){ actbool = actbool ^ stream[i-2]; code = code.substring(CMD_XOR.length-2); noelse = true; }         //or if( code.startsWith(CMD_OR.replace("_b_",var)) ){ actbool = actbool | stream[i-2]; code = code.substring(CMD_OR.length-2); noelse = true; }         //and if( code.startsWith(CMD_AND.replace("_b_",var)) ){ actbool = actbool & stream[i-2]; code = code.substring(CMD_AND.length-2); noelse = true; }       }      }      //Index-Funktionen / index functions for(int i=0; i<=7; i++){ //get if( code.startsWith(CMD_GET.replace("_i_",""+i)) ){ actbool = stream[i]; code = code.substring(CMD_GET.length-2); noelse = true; }       //set if( code.startsWith(CMD_SET.replace("_i_",""+i)) ){ stream[i] = actbool; code = code.substring(CMD_SET.length-2); noelse = true; }     }      //Schelife/loop //[...]     if(code.startsWith("[") && actbool == false){ int inside = 1; while(inside >= 1){ code = code.substring(1); if(code.startsWith("[")) inside++; if(code.startsWith("]")) inside--; }     }      if(code.startsWith("]") && actbool == true){ int inside = 1; while(inside >= 1){ code = goBack(code,oldcode); if(code.startsWith("[")) inside--; if(code.startsWith("]")) inside++; }     }      //(...)      if(code.startsWith("(") && actbool == true){        int inside = 1;        while(inside >= 1){          code = code.substring(1);          if(code.startsWith("(")) inside++; if(code.startsWith(")")) inside--;       }      }      if(code.startsWith(")") && actbool == false){ int inside = 1; while(inside >= 1){ code = goBack(code,oldcode); if(code.startsWith("(")) inside--;         if(code.startsWith(")")) inside++; }     }      //{...}      if(code.startsWith("{") && streamlength >= 8){ int inside = 1; while(inside >= 1){ code = code.substring(1); if(code.startsWith("{")) inside++; if(code.startsWith("}")) inside--; }     }      if(code.startsWith("}") && streamlength < 8){ int inside = 1; while(inside >= 1){ code = goBack(code,oldcode); if(code.startsWith("{")) inside--; if(code.startsWith("}")) inside++; }     }

//sonst... / else... if(noelse==false) code = code.substring(1); //...ein Zeichen wegmachen / ...remove one char } }  public static void main(String[] args){ interpret("or 1 [addr xor a ] outn"); //255 } }