TypeString

TypeString(or T~ in short) is a Turing complete esolang based on String Concating and String Pointer.
It's the 3rd esolang of TS Series by User:GUAqwq
==Overview==
There's 4 keywords in T~: $, =, : and \n. Other texts are split by blank, called string. The code runs line by line, and halts at the end.
===\n (end of statements)===
Statements are split by \n.
===$ (expressions)===
When $ is in front of a string, the whole expression $string gets what the string is pointing to. That's why T~ is based on String Pointer.
All strings point to undefined(which is also a string) by default, the point relations can be changed by Assign Statements.
Multi-$ are allowed. For example, if a points to b , and b points to c. Then $$a will be c.
A string with no $ is also a expression.
==== (Assign and Bind)===
Assign Statement:
 $left = right1 right2 right3 ...
where left and right parts are expressions. When the statement is executed, left will point to right1right2right3...(the right parts will concat together).
 $a = b
 $b = a $a
Then $b will be ab
When there's no $ on the left, that will be a new statement: Bind Statement:
 left = right1 right2 right3 ...
where left is just a string.
When the statement is executed, all left in the code will replaced with right1right2right3..., and there's no way to undo.
Do not let the string bind to it self, or the code will try to replace the string with itself, then replace itself with itself... FOREVER!.
===: (Label and Jump)===
When a statement includes only one expression, its a label with the value of the expression. For example:
 $a = label2
 label1
 $a
We'll get 2 labels, label1 and label2.
Jump Statement:
 : first_expr second_expr label_expr
If the first_expr and the second_expr is equal, the program jumped to the label. (If there's more than 1 label with the same value, jump to the last)
===I/O===
String input binds to user_input.
The program will print out what output is binding when it halts.
Note: I/O is using bind, not assign.
==Turing Completement prove==
===Simple process controll===
It is easy to find out the ways to implement IF and WHILE:
pseudo-code:
 if(a==b){BLOCK0}
 elif(c==d){BLOCK1}
 else{BLOCK2}
 
 while(e!=f){BLOCK3}
T~ code:
 : a b __case0
 : c d __case1
 : __always __always __case2
 __case0
 BLOCK0
 : __always __always __ifend0
 __case1
 BLOCK1
 : __always __always __ifend0
 __case2
 BLOCK2
 __ifend0
 
 __loop0
 : e f __whileend0
 BLOCK3
 : __always __always __loop0
 __whileend0
As you see, while(e!=f) acts more like break. So there won't be the implement for break
===Boolean System===
Use true as true, And false as false. So that we can use if(expr == __true){BLOCK} for process controlling.
pseudo-code:
 $result = $a == $b
T~ code:
 $result = false
 : $a $b _true
 : _always _always _end
 _true
 $result = true
 _end
pseudo-code:
 $result = !$a
half-pseudo-code(using pseudo-code that are already implemented):
 if($a == true){
 $result = false
 }else{
 $result = true
 }
Other boolean operations are also easy to implement.
===Natural number System===
Use several . to express a unary number:
 0 = .
 1 = ..
 2 = ...
 $n+1 -> $n .
Now we have successors, let's implement predecessor:
half-pseudo-code:
 ;let's pretend this is a comment
 4 = .....
 $x = 4
 if($x==0){ $n = 0 }
 else{
 $temp = 1
 $n = 0
 while(temp!=x){ 
 	 temp++
 	 n++ ;wow! new systactic sugar!
 }
 }
 ;now the anwser is $n
It looks similar to how λ-calculus gets the predecessor.
Now it is easy to add 2 numbers up:
concat them together, then precede it.
===Array implement===
The solution is quite simple:
concat the array_name with the index.
half-pseudo-code:
 ;you have already got array as a string, and index as a index_pointer.
 $combined_name = array $index ;use combined_name to temporaly store array[idx] pointer.
 ;read
 $result = $$conbined_name
 ;write
 $$combined_name = value ;the first $ gets the name, and the second $ points at where value stored
The array is unbounded(of course you can set one).
===Turing Complete===
Actually, all above have no use proving TypeString's turing-completeness. Go & see TypeInt(TypeString--)!
Q.E.D. (fantastic)
==Examples==
===Cat===
 output = input
Note: never input "output"!!!
===NOT===
 $result = error;plz_enter_"True"_or_"False"
 : input False _true
 : input True _false
 : always always end
 _true
 $result = True
 : always always end
 _false
 $result = False
 end
 output = $result
==Interpreters==
Interpreter written in Python by User:GUAqwq
Category:Implemented Category:String-based Category:2023 Category:Turing complete
== See also ==
* Stringle, another language with a similar concept