IGB Compiler L2 compiles IGB L2 code into IGB L1 code.
- for and while loops (including break; continue;)
- else if statements
- automaticly allocated variables
- arrays
- functions (including returning values and function arguments)
- floating point values up to 3 decimal places (0.001)
- complex expression solving (
var d = a*b/c+1;
works just fine) - an built-in easy to draw canvas
- easy keyboard input checking
- multi-file support
- sqrt
- nested for breaks and continues
- objects
- strings, lists, maps, etc.
- file IO
- dynamic variable allocation (more explained here)
- variables in recursion
- switch statements
- dynamic array size (array size has to be known at compile-time)
- there is only one value type (float), so no int casting
The whole IGB language was designed to be executed in Minecraft (MCMPCv7).
You can also run it on your desktop using IGB VM created for easy program testing.
This code displays the string "Hello world!" on the canvas.
$ramcell = 70;
$startLine = 15000;
$import <charlib>;
void main() {
width = 72;
height = 21;
stype = rgb;
drawstring(3, 0, "Hello world!", "big", 0);
}
$ramcell = 70;
$startLine = 15000;
What the hell are those $ things?
They are called "compiler variables", and are used by the compiler.
They cannot be accessed in any way in the rest of your code.
You can set them only once.
$startline
(required) This where your code is meant to be placed.
Startlines are only allowed to be >= 15000, since charLib is taking all the previous space.$ramcell
(required) This where all your variables and arrays will start allocating.
Ramcells are only allowed to be >= 70, since the previous space is occupied by important variables (see a list of them here).$lenlimit
(optional) Specifies the maxium instruction size your code can be.
If your code after compilation to IGB L1 is larger than this number, an error is thrown.$ramlimit
(optional) Same as$lenlimit
but for variables/arrays.$thread
(optional, default=0) It's working but has no use since threads aren't implemented yet (and probably won't be).
Diffrent temporary cells for variable and if statement solving are chosen for values 0 or 1.
It's not in the Hello World, but some things are important to understand.
Here's a simple variable declaration with initial value:
var a = 5;
You don't need to provide a value:
var a;
IMPORTANT! the | |
thingy specifies a cell.
a|70|
means that a
is going is at cell 70
Example:
var a|75| = 5;
However, the code above didn't allocate any memory. Here's how you can allocate it:
var a|!75| = 5;
If you use the !
sign with a value outside of your allocation array (from $ramcell
to $ramcell
+ $ramlimit
) the compiler will cry.
The same with arrays.
var[][] arr1 = new var[7][4];
var[][][] arr2|!80| = new var[16][16];
More about variables here.
$import <charlib>;
That's not a compiler variable, that's a dependency.
For example, the code above imported library named charLib, which draws chars on the screen.
If you import a file/library, all of it's functions are shared and can be used as if they were in the same file.
Here are some examples:
$import myfile // it's the same as the line below
$import myfile.igb_l2
$import mydirectory/myfile1
$import /home/krypek/myfile2 // it's the same as the line below
$import /home/krypek/myfile2.igb_l2
void main() {
Defines the main function. There can only be 1 main function in a file, it has to return void and it cannot have any arguments.
To define a function with a return type, replece void
with var
var myfuncthatreturns() {
Add arguments to the function:
var myfuncthatreturns(var a) {
You can have multiple functions with the same name with diffrent amount of arguments:
var myfuncthatreturns() {}
var myfuncthatreturns(var a) {}
void myfuncthatreturns(var a, var b) {}
You don't need to type return;
at the end of every function, also it the compiler doesn't cry if you don't return any value at all (100% feature).
width = 100;
height = 30;
stype = rgb;
Those are built-in variables. They work like a normal variables.
List of built-in variables:
width
|1| Screen widthheight
|2| Screen heightstype
|3| Can be only set to16c
orrgb
.
Setting it will resize onwidth
andheight
, set it's type based onstype
and fill with #FFFFFF.keyboard
|4| Keyboard input
Compiler functions can have arguments like strings since they are coonverted to instructions at compile-time.
(If the variable type is int
, only ints can be provided, same with string
)
(If the variable type is cell
, only variables or integers can be provided, no expressions)
exit()
Jumps to cell -2wait(int tick)
Waitstick
ticksscreenUpdate()
Updates screen properties based on cells 1, 2 and 3dlog(var value)
Logsvalue
to the terminal/chatdrawstring(var x, var y, string text, string type, var spacing)
sqrt(var variable)
Returns the square root ofvariable
random(int from, int to)
Returns a random integer in range offrom
andto
pixelcache(var cache)
Sets the pixel cache tocache
pixelcache(var r, var g, var b)
Sets the pixel cache tor
,g
,b
setpixel(var x, var y)
Sets the pixel color atx
y
to pixel cache.getpixel(var x, var y)
Returns the 16c pixel type atx
y
getpixel(var x, var y, cell r, cell g, cell b)
Saves the rgb value to cellsr
,g
andb
atx
y
See theirs implementation here.
drawstring(0, 0, "Hello world!", "big", 0);
For this function to work charLib has to be imported.
The first 2 arguments specify the x & y of the text.
Third argument is text, the forth is what type of text is it.
Text types:
small
(plain, size=14)smallitalic
(italic, size=14)big
(plain, size=20)bigbold
(bold, size=20)bigitalic
(italic, size=20)bigbolditalic
(bold & italic, size=20)
The fifth argument is the text spacing. Y o u r t e x t c a n b e l i k e t h i s .
That's the hello world!
Here's a list of supported math operations:
+
-
*
/
%
Examples:
var a = 2;
var b = 3;
a++; // a is now 3
b--; // b is now 2
a += b; // a is now 5
b = a * b + b / a;
// 10 + 0.4
// b is now 10.4
b -= b % 1; // manual int casting, b is now 10
var[][] arr1 = new arr1[6][7];
arr1[6][2] = 4; // Index of of bounds error
var t1 = 7;
arr1[t1][4] = 6; // No error
t1 = arr1[1][2]; // t1 is now 0
var[][] arr2 = new var[t1][4]; // No dynamic size arrays error
final var a = 5;
var[] arr = new arr[a]; // No error becouse array size is known at compile-time
var b = a*a/a+a; // b is set to 10; It's only 1 operation, becouse the expression can be solved at compile-time.
var a = 5;
var b = 7;
if(a > b) {
// dead code
} else if(a == b) {
// dead code
} else {
// a < b
// will always execute
}
// 12 < 35
if(a+b < b*a) {}
for(var i=0; i<3; i++) { dlog(i); } // will print out 0, 1, 2
var a = 1;
for(;a<3; a++) { dlog(i); } // will print out 1, 2
for(int i=0;; i++) { dlog(i); } // infinite loop
for(;;) {} // same as while(true)
while(false) { /*dead code*/ }
while(true) { /* infinite loop*/ }
var a = 0;
while(a < 5) {
a++;
dlog(a);
} // will print out 1, 2, 3, 4, 5
for(int i=0; i<10; i++) {
if(i%2==1) { continue; }
if(i==6) { break; }
dlog(i);
} // will print out 0, 2, 4
You can break twice in a for loop.
for(int y=0; y<10; y++) {
for(int x=0; x<10; x++) {
if(x+y == 15) {
break 2; // exits both loops
}
}
}
break 1
is the same as break
.
The same thing with continue
.
Break can be used outside of loops.
if(true) {
break;
dlog(1); // dead code
}
void a() {
dlog(1);
redo; // jumps to function start
} // will print a lot of 1's; infinite loop
{ redo; } // infinite loop
var a = 5;
if(a == 5) {
// ...
redo;
} // will loop as long a == 5; same as while(a==5)
{
dlog(1);
{ redo 2; }
} // will print a lot of 1's; infinite loop
raw
is used to insert IGB L1 code
raw Init 5.3 70;
Licensed under GNU GPLv3 or later