Twocode

Twocode is a one-dimensional esoteric language with two-dimensional control structures. It was created by User:Fergusq in 2014. Language belongs to the category of visual programming languages and was designed to offer an alternative, visual GOTO statement.
== Twocode ==
Twocode is a two-dimensional language like SNUSP. It contains two-dimensional instruction series and onecode blocks. It is used to implement flow-control.
Instruction	Meaning
/ 	If going to north, go east, if to east, go north. If going to south, go west, if to west, go south.
\ 	If going to south, go east, if to east, go south. If going to north, go west, if to west, go south.
v 	Go south.
^ 	Go north.
> 	Go east.
< 	Go west.
Z 	If accumulator contains 0 continue forward, otherwise works like /.
S 	If accumulator contains 0 continue forward, otherwise works like \.
# 	Halt.
Debug commands:
Command	Meaning
n 	Prints accumulator as a number.
c 	Prints accumulator as a character.
f 	Flushes output stream.
Example: an infinite loop
 >===v
 | |
 ^===<
=== Twocode and gotos ===
Twocode is used in simillar manner to the GOTO statement. For example, a simle truth-machine like the following:
 {getc()='0'}=S={putc('0')}=#
 |
 >={putc('1')}=\
 \=============/
... can be translated to Onecode+Goto code:
 if(getc()='0') goto L2; else goto L1;
 L1:
 putc('0');
 halt();
 L2:
 putc('1');
 goto L2;
If debug commands are ignored, paths just connect program start, halt and onecode blocks. They can contain conditions, if something then come here otherwise go there. They are just like GOTOs.
=== Onecode blocks ===
Onecode blocks are blocks of onecode code inside twocode. A block begins with { and ends with }. The code must always be between the brackets. An onecode line starts with : and ends with ; (except the first and the last one, see examples). Colons are optional when the execution direction is left-to-right. After the block is executed its valeu is placed to the accumulator.
Acceptable blocks (<= and => show the direction, area which is parsed as onecode highlighted):
 =>{ code;
 smth else }=>
 =>{ code ;
 : code ;
 : code }=>
 <={ code ;
 : more code }<=
 =>{ stmt \
 : continues }=>
Inacceptable blocks
 =>{ code ; code }
Error: statements cannot share a line
 =>{ code
 code }
Error: no colons or semicolons.
 { code ;
 code }<=
 { code \
 code }<=
Error: no colon.
 { long line;
 : code }<=
Error: long line is not fully between the brackets.
== Onecode ==
:Main article: Onecode (Fergusq)
Onecode is used to do anything else but flow control.
=== Variables ===
A value can be assigned to a variable using operator ~.
 i~0;
 a~3;
 b~c~5;
 x~a+b+c;
=== Pointers ===
 i~1;
 *i~'H';
 *(i+1)~'i';
 putc(*i);
 putc(*(i+1));
==== Lists ====
List syntax can be used to write a few numbers to the memory.
 *i~[1,2,3];
 
 Is same as:
 
 *i~1;
 *(i+1)~2;
 *(i+2)~3;
Strings work like list and have always a null terminator.
 *s~"abc";
 *s~['a','b','c',0];
=== Boolean values ===
0 is false, everything else is true.
== Examples ==
=== Hello world ===
 { i~0; /={i~i+1}============\
 *i~"Hello world\n" }=>={putc(*i)}={!*i}=S=/
 #
 { putc('H');
 putc('e');
 putc('l');
 putc('l');
 putc('o');
 putc(32);
 putc('w');
 putc('o');
 putc('r');
 putc('l');
 putc('d');
 putc(10) }#
=== Factorial ===
 >=={ x~7 }===\ calculate !7
 |
 /=={ n~1 ; | initialization
 | : t~1 ; |
 | : x~x+1 }=/
 |
 v==============\
 \=={ n~n*t ; | main loop
 : t~t+1 }=\ |
 /============/ |
 \=={ !(t=x) }==Z=={putn(n)}#
Short version using debug command to print the answer:
 >{x~7}==v {n}n#
 v{x~x+1}< |
 >{t~1}{n~1}+===v
 >====={t=x}Z===v
 ^{t~t+1}{n~n*t}<
=== 99 bottles of beer ===
 >={i~99}==\
 /=====/
 /===|===========\
 |/==>={!(i=2)}S=/
 || /=========/
 || { putn(i);
 || s~0;
 || *s~" bottles of beer on the wall,\n" }=\
 || /=========================================/
 || | /={s~s+1}============\
 || \=>={putc(*s)}={!*s}=S=/
 || /==================f/
 || { putn(i);
 || s~0;
 || *s~" bottles of beer\n" }=\
 || /============================/
 || | /={s~s+1}============\
 || \=>={putc(*s)}={!*s}=S=/
 || /==================f/
 || { s~0;
 || *s~"Take one down, pass it around\n" }=\
 || /=========================================/
 || | /={s~s+1}============\
 || \=>={putc(*s)}={!*s}=S=/
 || /==================f/
 || { i~i-1;
 || putn(i);
 || s~0;
 || *s~" bottles of beer\n\n" }=\
 || /==============================/
 || | /={s~s+1}============\
 || \=>={putc(*s)}={!*s}=S=/
 |\=====================f/
 |
 \==={ s~0;
 *s~"2 bottles of beer on the wall,\n2 bottles of beer\nTake one down, pass it around\n1 bottle of beer on the wall\n\n" }=\
 /============================================================================================================================/
 | /={s~s+1}============\
 \=>={putc(*s)}={!*s}=S=/
 /==================f/
 { s~0;
 *s~"1 bottle of beer on the wall,\n1 bottle of beer\nTake one down, pass it around\nNo more bottles of beer on the wall\n\n" }=\
 /=================================================================================================================================/
 | /={s~s+1}============\
 \=>={putc(*s)}={!*s}=S=/
 /==================f/
 { s~0;
 *s~"No more bottles of beer on the wall,\nno more bottle of beer\nTake one down, pass it around\n99 bottles of beer on the wall\n\n" }=\
 /=========================================================================================================================================/
 | /={s~s+1}============\
 \=>={putc(*s)}={!*s}=S=/
 /==================f/
 #
=== Minsky machine ===
 v
 | Minsky machine interpreter
 | 
 | Program code structure in memory
 | op reg addr1 addr2
 | 
 | op = 1 if INC
 | reg = memory address
 | addr1 = next instruction address in memory
 | addr2 = second instruction address, used with DEC
 |
 >={i~0}=\ instruction pointer = 0
 |
 | INC If *p != 0 decrement
 /=======>========{*i=1}=S========{!(**(i+1)=0)}=S====\
 | /={**(i+1)~**(i+1)+1}=/ /={**(i+1)~**(i+1)-1}=/ |
 | \={i~*(i+2)}=\ \={i~*(i+2)}=\ |
 \=Z={i=0-1}====<=======================<=={i~*(i+3)}=/ otherwise jump
 |
 \=# Halt
Category:LanguagesCategory:Two-dimensional languagesCategory:Turing completeCategory:Low-levelCategory:2014