Skip to content

A scripting language created mainly for game engines

License

Notifications You must be signed in to change notification settings

Hammurabi/HCode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HCode

Hammurabi's Code

A scripting language created for the use in games and game engines.

Currently supported features and roadmap

  • Structs
  • Functions
  • Primitives (long long, long double)
  • Operator Overloading
  • Manual Memory Management (Pointers, Malloc, Calloc, Delete)
  • Function Pointers
  • Lambdas
  • Strongly Typed
  • For Loops
  • If Statements
  • Elseif, Else
  • ASM output

Simple To use

The purpose of this language is to be able to create libraries with minimal lines of code, a template function is created and the compiler would do the rest (see operator overloading).

The other reason I created this language is simple, none of the available scripting languages felt right for my game engine, and therefore I decided to create HCode specifically for my engine.

I needed full control of the internals of the VM and a dynamic, somewhat object oriented language. Whenever a feature is implemented, (eventually) I would be able to compile the script into ASM.

import Collections
import StringLib

Variable: int = 5 //variable declaration (64bit signed)
VarFloat: float = Variable^float //cast to float (64bit) (no implicit conversion)
VarPointer: int ***//pointers, supported by the parser, but not the runtime env
Vector: vector = vector()//must import Collections

//any object can be passed here
//will add type checking later.
Vector.push_back(...)
//the following functions take int index
//as an argument.
Vector.erase(...)
Vector.get(...)

if Vector.get(1) != Vector.get(6){
    print("Oh No!")
}


 for x:int=0, x<4, x=x+1{
   for y:int=0, y<4, y=y+1{
     print(quick_concat(quick_concat("x: ", to_string(x)),   quick_concat(" y: ", to_string(y))))
   }
 }

Dosomething:: void() {//function declaration
    print(5 * 5)
}
SomeStruct:: struct {//structs do not hold functions
    Field1: int
    Field2: float
    FuncPointer: (int)(this: SomeStruct, X:int, Y:int) //function pointer
    ...
}

operator:: SomeStruct (SomeStruct + int) {//operator overloading
    Res: SomeStruct
    Res.Field1 = A.Field1 + B
    Res.Field2 = A.Field2 + B^float //cast using ^
    Res.FuncPointer(B, B+12) //using the '.' operator tells the compiler
    //that the first argument is (Res)
    //so we don't need to pass "this" argument
    return Res
}
//One definition fits all.
//using '~' will create a generic operator
//function, it will require a list of operators
//after the function declaration declared in brackets.
//[+ - /] for example tells the compiler to generate
//operator functions for addition, subtraction, and division
operator:: Vector4(Vector4~float) [+ - * /] {
  //~ will be replaced
  //by real operators
  return Vector4(A.x~B, A.y~B, A.z~B, A.w~B)
}
//can be called with Var: Type = make_copy(SomeVar)
//the compiler will find the suitable copy constructor
//for the variable type and use it.
clone:: SomeStruct(SomeStruct){ //copy constructor
    Result: SomeStruct
    ...
    return Result
}

Releases

No releases published

Packages

No packages published

Languages