Indefinite

Indefinite is an esoteric programming language created by User: LolloDev5123. At the moment of writing, Indefinite doesn't have any implementation, and therefore it's just an idea.
== Syntax & Overview ==
Indefinite is an imperative, declarative and functional language that supports a vast set of operators, conditions, loops, and variables.
=== Variable Definition ===
The following snippet of code declares a variable that can be accessed by any other statement in the code (global):
 @x;
or:
 @x = "Hello, world!";
The other following snippet of code declares a variable that can be accessed only by statements in the same function or scope of the variable (local):
 $x;
or:
 $x = "Hello, world!";
=== Function definition ===
The following snippet of code declares a global function:
 fn @x(a):
 -- Comment!!
 => a + 10 -- => is equivalent to return
 ;
or in it's short arrow function form:
 fn @x(a) => a + 10;
To declare a local function (eg. for functions inside functions), x just needs to be declared with $ instead of @.
=== Function Calls ===
The following snippet of code calls a global (or local) function:
 ::x(1); --> 1 + 10 = 11
=== If statements ===
The following snippet of code determines which group of statements to run, depending on different conditions and expectations:
 .if $x == 1: -- if x == 1 then call y
 ::y();
 ,if $x % 2 == 0: -- elseif x % 2 == 0 then call y
 ::y();
 , -- else call z
 ::z();
 ; -- end
Instead of ending with a semicolon, if statements can also end with an unless statement:
 .if $x % 2 == 0:
 ::y();
 !: $x == 4; --> unless x == 4, 
 considers all the expressions above if condition is falsey <--
=== If expressions ===
Indefinite also supports the use of if expressions instead of statements:
fn @x(a, b):
 .if a == 1: -- No need to use @ or $ for arguments
 => b
 ,
 => a
 ;
 ;
Becomes:
fn @x(a, b):
 => .if a == 1: b , a;
;
=== For Loops ===
 -- Start (i), increment => limit/end
 $for 10 as i, 1 => 20: 
 .if i % 3 == 0: skip;
 => ::doSomething();
 ;
=== While Loops ===
 $while stop false:
 ::doSomething();
 ;
=== Arrays and tables ===
An array can store variables and index them numerically, a table can do the same but it also supports string indexes.
The following snippet of code declares a global array:
 @[]x = 1, 3, 5, ..;
 --> With the values 1, 3, and 5.
 The ".." after "5," is used to repeat the array a second time,
 producing 1, 3, 5, 1, 3, 5 <--
The following snippet of code declares a local table:
 ${}x = "x":"hello", "y":"world";
 -- With the strings "hello" and "world" indexed as x and y.
 
 ::foo( $x{"y"} );
 -- Calls the function foo with the y index of table x ("y":"world").
 
=== Operators ===
Arithmetic Operators
Instruction	Description
x + y 	Addition
x - y 	Subtraction
x * y 	Multiplication
x / y 	Division
x % y 	Modulus
-x 	Unary Negation
√x 	Unary Square Root
x√y 	Root with custom base
x! 	Unary factorial
|x| 	Unary absolute value
Relation Operators (returns a bool)
Instruction	Description 	
x == y 	Equal to 	
x != y 	Not equal to 	
x > y 	Greater than 	
x < y 	Smaller than 	
x >= y 	Greater than or equal to 	
x <= y 	Smaller than or equal to 	
x && y 	AND operator 	
x 	y 	OR operator
!x 	Unary boolean inverse (!true = false)	
Bitwise Operators
Instruction	Description
x & y 	Bitwise AND
x | y 	Bitwise OR
x ^^ y 	Bitwise XOR
~x 	Unary Bitwise NOT
x << y 	Bitwise Left Shift
x >> y 	Bitwise Right Shift
x# 	Unary Popcount (Hamming Weight)
Misc Operators
Instruction	Description
s .. s 	String Concatenation
#t 	Length of string or table/array
s * r 	String Repetition
=== 99 Bottles of Beer ===
Note the "::" function call prefix, it is necessary only when the function is being called from the start of a line syntactically.
When it's used, it also allows for functions to be called without any arguments.
 $bottles = 99;
 fn $plural(bottles): 
 => .if bottles != 1: "s", "";
 ;
 $while bottles > 0:
 ::print(bottles.." bottle"..plural(bottles).." of beer on the wall")
 ::print(bottles.." bottle"..plural(bottles).." of beer")
 ::print("Take one down, pass it around")
 bottles--;
 ::print(bottles.." bottle"..plural(bottles).." of beer on the wall")
 ::print
 ;
Category:Languages Category:Functional paradigm Category:Declarative paradigm Category:Imperative paradigm Category:Unimplemented