diff interps/2l/README @ 996:859f9b4339e6

<Gregor> tar xf egobot.tar.xz
author HackBot
date Sun, 09 Dec 2012 19:30:08 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/2l/README	Sun Dec 09 19:30:08 2012 +0000
@@ -0,0 +1,98 @@
+2L is a deceptively confusing but non-complex language.  Like PATH and Befunge, it's
+two-dimensional.  Like BrainFuck, it operates on a tape.  However, it only has two symbols.  It
+manages this by overloading the * symbol by direction.  Your data pointer starts at location 2,
+not 0 as in BrainFuck, because 0 and 1 are significant.  The tape is filled with 0s, as in BF.
+Your program pointer starts at 0,0 moving down, and ends when the program pointer goes below 0
+left or up.  Here are the symbols:
+
+   SYMBOL | FUNCTION
+----------+----------
+        * | All IO and tape operations.  This operation has a different function for all four
+          | cardinal directions:
+          | Up: Move the data pointer to the right (> in BF)
+          | Down: Move the data pointer to the left (< in BF)
+          | Left: Decrement the value at the data pointer (- in BF)
+          | Right: Increment the value at the data pointer (+ in BF)
+          |
+        + | if the value the data pointer points to is nonzero, turn right
+          |  otherwise turn left
+
+Tape locations 0 and 1 are significant.  1 doesn't actually hold a value, it mearly causes an IO
+operation if you attempt to increment or decrement it.  (I will from here on shorten "Tape
+location" to "TL")
+If the value at TL0 is 0, and you attempt to change the value of TL1, a character will be read from
+input into TL0.  If TL0 is not 0, and you attempt to change the value of TL1, a character will be
+outputted from the value of TL0.
+
+The + turn is not a simple turn.  Imagine the lines are your path:
+           |
+           |
+-----------/+
+
+Is the direction of your program pointer, rather than
+           |
+           |
+-----------+
+
+This is because the second method would make many types of loop impossible.  Trust me .... I spent
+way to long figuring that out.
+
+Here's a simple loop, that produces the value 9 by multiplying 5 by two then subtracting 1:
+
+  **  +
+    +               
+    * *****+
+   +
+     +    *
+   +     * 
+          +
+  <*       +
+    +
+
+The < is the direction that your program pointer will be going in when you're done producing the
+value.  Here's how it works:
+
+--**-\+
+    +|              
+    * *****+
+   +|/    |
+    |+    *
+   + ----*/
+     +    +
+  <*       +
+    +
+
+That's more helpful, right?  No?  OK, lesse...
+The first two * you hit increases your value to 2
+You then turn right, go down, turn left then up...
+
+Now you're here:
+/----\
+| +  |
+| * *|
+|+^  |
+|  + |
+\----/
+
+You'll hit that * going up, and hence shift your data pointer's location.
+Now you'll hit that series of five *s, which will increase your value by 5.
+Then you turn down, and hit that next * below there.  That makes you go back down to the cell with
+the value 2.  Then you turn right, and are going left.  You hit that *, and decrement.
+Still with me?  No?  Good.
+
+Now you're here:
+/----\
+|   +|
+| + <|
+|   +|
+| *  |
+\----/
+
+You'll hit that +.  The first time, you'll still have a value of 1, so you'll turn right and go
+into the loop again.  The second time, you'll have a value of 0, and will hence turn left.
+Then you'll go all the way to the right, and the two +s there will turn you around.  You hit that
+final * (next to the output <), and then your 10 (remember, you added 5 twice) is now 9!
+
+WOW!  That was simple!
+
+That's it!  That's the whole language!  Isn't that simple ... but not!