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 | ||
@ |
read a line from stdin (as string) | |
! |
read an integer from stdin | |
| Unary operators | ||
? |
3 → 0 | check if arg is set |
| 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
External Resources
- interpreter, by User:zseri, License: MIT