Initially EXCON has one pool with 8 binary digits, all set to 0 and a pointer set to the right-most digit in the pool.
|:||Reset all digits in the pool to 0|
|^||Flip the digit at the pointer|
|!||Output the pool|
|<||Move the pointer to the left|
Initially, we start out with an empty pool, with the pointer pointing at the right-most digit
(the above code is just for clarification, and is not actual source code)
If we want to write the letter A, which in binary is 01000001, we must flip the first and the seventh bit. Like this
: Reset the pool (this is optional at the beginning of a program) ^ Flip the first bit (making it 1) <<<<<< Move 6 steps to the left ^ Flip the 7th bit ! Output the pool (A or in binary 01000001)
EXCON treats all other characters than ':', '^', '<' and '!' as comments. The above program can be written like this as well
Notice that we don't have to move to the eight bit, since this remains 0, we don't have to do anything with it.
Note: If you move the pointer more than 8 steps, the program will take this as a fault operation, since all ASCII characters converted to binary consists only of 8 digits.
hello-world.excon :<<<^<<<^! 1001000 H :^<<^<<<^<^! 1100101 e :<<^<^<<^<^! 1101100 l ! 1101100 l :^<^<^<^<<^<^! 1101111 o :<<<<<^! 0100000 SPACE :^<^<^<<^<<^! 1010111 W :^<^<^<^<<^<^! 1101111 o :<^<<<^<^<^! 1110010 r :<<^<^<<^<^! 1101100 l :<<^<<<^<^! 1100100 d :^<<<<<^! 0100001 BANG
Above code would output in ASCII
Here's an EXCON interpreter written in Ruby:
# interpreter.rb def interpret_EXCON source pool = %w[0 0 0 0 0 0 0 0] pointer = 7 for i in 0..source.length case source[i..i] when ":" then pool = %w[0 0 0 0 0 0 0 0]; pointer = 7 when "^" then pool[pointer] = if pool[pointer]==1 then 0 else 1 end when "<" then pointer -= 1 when "!" then print pool.join.to_i(2).chr end end end interpret_EXCON File.open(ARGV, "r").read
And here is an interpreter in Io:
#!/usr/local/bin/io exconI := Object clone exconI pool := List clone setSize(8) map(0) exconI pointer := 7 exconI interpret := method(source, source foreach (c, if(c == 58, pool = pool map(0); pointer = 7) if(c == 94, pool atPut(pointer, if(pool at(pointer) == 1, 0, 1))) if(c == 60, pointer = pointer - 1) if(c == 33, pool map(print) "\n" print) ) ) if(System args at(1), exconI interpret(System args at(1)) println, "No input" println)