199 lines
4.0 KiB
Markdown
199 lines
4.0 KiB
Markdown
Emil's Fever Dream Language (EFDL)
|
|
|
|
## Basic
|
|
|
|
EFDL is case sensitive, but I recommend you use lower case and snake_case.
|
|
|
|
Statements, declarations, functions and loops are terminated with semicolons:
|
|
|
|
for int i; < 10; print i + 1;;
|
|
|
|
formatted over many lines...
|
|
|
|
for < 10;
|
|
print i;
|
|
;
|
|
|
|
Comments and Whitespace:
|
|
|
|
Whitespace is discarded and is only useful for separating tokens.
|
|
|
|
# ... EOL
|
|
## ranged comment ##
|
|
|
|
Variables, Initializations & Declarations:
|
|
|
|
Initializations & Declarations will only be ran once within a given scope.
|
|
|
|
## Examples
|
|
|
|
int x; # Uninitialized declaration
|
|
int x 2 + 2; # Initialized declaration to the value of 2 + 2.
|
|
|
|
# declares x & i, initializes x to i, after initializing i to 2
|
|
int x (int i 2);
|
|
|
|
# declares x with 2 and i with 3
|
|
int x 2 i 3;
|
|
|
|
# You can NOT do
|
|
float x int y; (this is a function now!)
|
|
|
|
## Paren
|
|
|
|
Parens () are evaled FIRST.
|
|
|
|
parens, when used, delineate a freestanding statement.
|
|
The following two lines are equivalent in result:
|
|
|
|
int x 2; x add x, 1; + 1; # 2 + 1 + 1
|
|
int x 2; x add (x + 1), 1;; # (2 + 1) + 1 = 3 + 1
|
|
|
|
parens, when started with first with an operator or function will evaluate as non-freestanding and will not assign anything.
|
|
|
|
()'s can contain multible statements and return the last statement within them.
|
|
|
|
(int i 2; i 2;)
|
|
|
|
## Arith
|
|
|
|
Arithmetic operators and functions are evaled SECOND, LTR (Left-To-Right).
|
|
|
|
i 2;
|
|
i + 2; # adds 2 to i, which in this case is 2 + 2 = 4
|
|
# The last two statements are equivalent to
|
|
i 2 + 2;
|
|
|
|
(2 + i) is equivalent in operation to (i + 2) but i is added to 2.
|
|
Meaningful comparison: (i - 2) and (2 - i) respectively if i is 10 then i is mutated to: 8, -8
|
|
|
|
1 + 2 * 3 / 10;
|
|
|
|
add add 2 3; 4;
|
|
|
|
## Logical
|
|
|
|
Logical operators are handled LAST and LAST-1
|
|
|
|
1 = 2;
|
|
FALSE
|
|
|
|
Functions declarations:
|
|
|
|
int func int a int b; a + b;;
|
|
|
|
Functions implementations have at least one statement.
|
|
|
|
Default arguments:
|
|
|
|
int func -1 int a 5;
|
|
if a > 0;; # returns the default value here
|
|
else a;; # returns a
|
|
end func;
|
|
|
|
explicit version
|
|
|
|
int func -1 int a 5;
|
|
if a > 0;
|
|
return;;
|
|
else
|
|
return a;;
|
|
end func;
|
|
|
|
calling int func3 int a 1 int b int c 3:
|
|
|
|
func3 .b 2; # specify .b
|
|
|
|
## Arrays
|
|
|
|
Arrays are addressed starting at 0, meaning offset 0.
|
|
Arrays are apart of the type, and may be specified implicitly or explicitly.
|
|
|
|
int [3]i 1 2 3;
|
|
|
|
With Arith,
|
|
Use whitespace to make code readable, as opposed to not:
|
|
|
|
int [6]i 1 + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6; # worst
|
|
int [6]i 1+1 1+2 1+3 1+4 1+5 1+6; # better
|
|
int [6]i 1 + 1 1 + 2
|
|
1 + 3 1 + 4
|
|
1 + 5 1 + 6; # better, ration to your needs
|
|
|
|
Arbitrary scopes & Goto:
|
|
|
|
LABEL:
|
|
int x; x 2;
|
|
;
|
|
|
|
to make scopes easier to read, there's an optional token that visualizes this,
|
|
|
|
label:
|
|
int x;
|
|
x
|
|
func
|
|
2 3 4
|
|
end func;
|
|
end x;
|
|
# x is available
|
|
end label;
|
|
|
|
# x is not available
|
|
|
|
goto can be used against labels.
|
|
goto is restricted to scope.
|
|
|
|
## Loops
|
|
|
|
for (int i 2; i + 1;) < 4;
|
|
print i;
|
|
end while;
|
|
|
|
This is an example of a "short" forloop.
|
|
Here, we use ()'s to initialize i to 2, and then add 1 to it at each step. This loop will print 3 4.
|
|
|
|
A "long" forloop and "short" forloop would be defined as:
|
|
|
|
for <initialization> ; <conditional> ; <leading-statement> ; <statement>; ... ;
|
|
for <conditional> ; <statement> ; ... ;
|
|
|
|
hence a "long" forloop:
|
|
|
|
for int i 5; i > 0; i - 1; print i;;
|
|
# prints: 5 4 3 2 1
|
|
|
|
## If
|
|
|
|
if x; print x;;
|
|
|
|
if x: a else b;;
|
|
|
|
if a;
|
|
if b; a + b;
|
|
else a;;
|
|
else 0;;
|
|
|
|
if a; if b; a + b; else a;; else 0;;
|
|
|
|
in C:
|
|
|
|
if (a) {
|
|
if (b) {
|
|
return a + b;
|
|
} else {
|
|
return a;
|
|
}
|
|
}
|
|
else {
|
|
return 0;
|
|
}
|
|
|
|
compacted:
|
|
|
|
if (a)
|
|
if (b) return a + b;
|
|
else return a;
|
|
else return 0;
|
|
|
|
if (a) if (b) return a + b; else return a; else return 0;
|