TEWNLSWAC

Pronounced toons-whack, TEWNLSWAC is an idea for a programming language by User:Zseri. It's inspired by TEWELSWAC, but uses a very different syntax.
The name stands for: The Esolang Where No Line Starts With A Colon.
TEWNLSWAC was created as a more golfed version of TEWELSWAC with additionally object orientation.
== Memory Model ==
TEWNLSWAC is an internally stack based language, but uses variables in the frontend.
A symbol is an reference to a constant dynamically allocated container of data.
A variable is a name for a symbol. Any variables are global, but you can emulate local variables using objects.
All parameters to functions are passed via symbols.
== Syntax ==
Most lines of code are like this:
 command args;
When a condition is specified, the syntax is:
 (condition) { commands... }
When no condition is specified, the line is executed no matter what. All whitespace is supported.
The ; is used to separate commands. Newlines after this are not necessary.
Labels are just special commands, because they don't have a semi-colon as separator, but a colon:
 identifier:
A comment starts with // that goes to the end of the line.
== Expressions ==
Expressions are used within lines of code as conditions or arguments. They could be enclosed in ()s (parentheses). An example of an expression is 4 > 5 or A + 5. The expression will return a value. You can nest these.
== Keywords ==
=== Command List ===
Command	Arguments 	Description
a 	variables list 	fetch arguments from argument stack
c: or ç	target type, expression 	casting operator
c 	label, optional arguments in parentheses	call function beginning at label, push current instruction pointer to the return stack
e 	none 	end the execution of the progam
g 	label 	skip to label
n 	identifier, code block in curly brackets	namespace limiter
p 	expression 	print something without a newline
r 	optional expression 	pop instruction pointer from the return stack, go after the pointed instruction
=== Variable Assign Commands ===
The first argument is always a variable.
==== Unary ====
Command	Description
= o 	assign an empty object to a variable
= ?? 	assign a null pointer to a variable (can only be compared via = and ?)
==== Binary ====
Command	Second argument	Description
= 	expression 	assign a expression value to a variable
.= 	identifier 	call a method on first arg, determinated by second arg, then assign the return value to first arg
==== Ternary ====
The first argument is always an object variable, the second argument is always a identifier (identifies a key of an object).
First part	Second part	Third argument	Description
. 	= 	expression 	assign a expression value to a variable of an object
. 	=& 	label 	assign a label to a variable (which is then a method) of an object
=== Types ===
Cast operator keyword	Name 	Internal representation
f 	floating point number	double
i 	integer 	int
s 	string 	c++ std::string
 	object 	hashmap(std::string → symbol)
=== Operators only valid in expressions ===
Operator 	Compat Levels 	Description
Nullary operators	Nullary operators	Nullary operators
@ 	 	read a line from stdin (as string)
! 	 	read an integer from stdin
Unary operators 	Unary operators 	Unary operators
? 	3 → 0 	check if arg is set
Binary operators 	Binary operators 	Binary operators
= 	3 → 0 	check for equality
< 	1 → 0 	check for lesser than
> 	1 → 0 	check for greater than
+ 	2 → 2 	add
- 	2 → 2 	subtract
* 	1 → 1 	multiply
/ 	1 → 1 	divide (could raise division by null error)
% 	0 → 0 	modulo (could raise division by null error)
. 	4 . 5 → 3 	call a method on first arg, determinated by second arg
==== Operator Compatibility (Compat Levels) ====
Level	Name 	integer	float	string	object	identifier
0 	integer 	X 	 	 	 	
1 	number 	X 	X 	 	 	
2 	anything except object	X 	X 	X 	 	
3 	anything 	X 	X 	X 	X 	
4 	higher types 	 	 	X 	X 	
5 	abstract identifier 	 	 	 	 	X
== Examples ==
=== Cat ===
 _: p @ + '\n;
 g _;
=== Fibonacci sequence ===
 A = 0;
 B = 1;
 LOOP:
 p A;
 p '\n;
 C = A;
 A = B;
 B = B + C;
 (C < A) { g LOOP; }
 (C = A) { g LOOP; }
=== Truth-machine ===
 (0 = !) { g F; }
 T: p "1\n";
 g T;
 F: p "0\n";
=== 99 bottles of beer ===
 B = 99;
 A = " bottles of beer";
 C = " on the wall";
 D = "No more";
 loop:
 p B;
 p A;
 p C;
 p ".\n";
 p B;
 p A;
 p ".\nTake one down, pass it around.\n";
 B = B - 1;
 p B;
 p A;
 p C;
 p ".\n";
 (B) { g loop; }
 p D;
 p A;
 p C;
 p ".\n";
 p D;
 p A;
 p ".\nGo to the store, buy some more.\n";
 p 99;
 p A;
 p C;
 p ".\n";
=== Object Orientation ===
 // based on zeiksh/examples/oopex.zkl
 Hello = o;
 Hello.say = &Hello_say;
 Hello.juge = &Hello_juge;
 Dog = Hello;
 Dog.juge = &Dog_juge;
 Hex = Hello;
 Hex.say;
 MyDog = Dog;
 MyDog.say;
 e;
 Hello_say:
 a this;
 p "I say: ";
 p this.juge();
 p "\n";
 r;
 Hello_juge:
 a this;
 r "Hello World!";
 Dog_juge:
 a this;
 r "Wouff!";
== Computational class ==
ABCDXYZ can be compiled into TEWNLSWAC, but ABCDXYZ's computational class is unknown. TEWNLSWAC is at least capable of simulating a Bounded-storage machine, but it is probably Turing-complete (prove needed).
== See also ==
* TEWELSWAC
== External Resources ==
* interpreter, by User:zseri, License: MIT
Category:Languages Category:Implemented Category:High-level