Skip to content
/ z Public

Compiler for some statically typed language

Notifications You must be signed in to change notification settings

pyanzin/z

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

Compiler for some statically typed language backed by LLVM.

extern def allocate(size: Int): Ref
extern def allocateArray(count: Int, elemSize: Int): Ref
def Array[T](size: Int): Array[T] = {
   return allocateArray(size, sizeof[T]) as Array[T];
}

extern def concat(s1: String, s2: String): String
extern def print(s: String): None
extern def readline(): String
extern def getchar(): Char
extern def len(s: String): Int
extern def compare(s1: String, s2: String): Int
extern def int2string(i: Int): String
extern def double2string(d: Double): String
extern def char2string(ch: Char): String
extern def size(xs: Array[_]): Int
extern def string2int(s: String): Int
extern def strcmp(s1: String, s2: String): Int

struct Employee(name: String, salary: Double, yearsInCompany: Int, perfRate: Double)

def main(): None = {
   var emps = getEmployees();

   var toBeFired = filter(emps, e => e.perfRate < 0.8);
   // generic parameters, type of lambda and return type are infered
   var promotionFund = reduce(toBeFired, 0.0, (z, x) => z + x.salary); 
   var empsLeft = filter(emps, e => e.perfRate >= 0.8);
   var overallPerf = reduce(empsLeft, 0.0, (z, x) => z + x.perfRate);

   printLine("To be fired:");
   foreach(toBeFired, e => printLine(e.name));

   printLine("To be promoted:");
   for (var i = 0; i < size(empsLeft); ++i) {
      var emp = empsLeft(i);
      printLine(emp.name + "\t\t " + promotionFund * emp.perfRate / overallPerf);
   }

}

def getEmployees(): Array[Employee] = {
   var employees = Array[Employee](10);
   employees(0) = Employee("Jack Mulatto", 46000.0, 3, 1.1);
   employees(1) = Employee("John Albino", 39000.0, 1, 1.4);
   employees(2) = Employee("Simon Mosquito", 35000.0, 4, 1.7);
   employees(3) = Employee("Jane Libido", 56000.0, 3, 1.0);
   employees(4) = Employee("Chris Corrado", 58000.0, 2, 0.7);
   employees(5) = Employee("Brian Placebo", 50000.0, 3, 1.1);
   employees(6) = Employee("Anna Mario", 45000.0, 3, 1.3);
   employees(7) = Employee("Harry Potato", 60000.0, 2, 1.2); 
   employees(8) = Employee("Albert Relatio", 49000.0, 2, 0.6);
   employees(9) = Employee("Bad Tattoo", 46000.0, 3, 1.1);

   return employees;
}

def printLine(s: String): None = {
   print(s);
   print("\n");
}

def foreach[T](xs: Array[T], f: T => None): None = {
   for (var i = 0; i < size(xs); ++i)
      f(xs(i));
}

def reduce[T, R](xs: Array[T], z: R, f: (R, T) => R): R = {
   var result = z;
   for (var i = 0; i < size(xs); ++i)
      result = f(result, xs(i));   

   return result;
}

def count[T](xs: Array[T], f: T => Boolean): Int = {
   var result = 0;

   for (var i = 0; i < size(xs); ++i)
      if (f(xs(i)))
         ++result;   

   return result;
}

def filter[T](xs: Array[T], f: T => Boolean): Array[T] = {
   var result = Array[T](count[T](xs, f));

   var i = 0;
   var j = 0;
   while (i < size(xs)) {
      if (f(xs(i))) {
         result(j) = xs(i);
         ++j;
      }
      ++i;
   }

   return result;
}

def map[A, B](xs: Array[A], f: A => B): Array[B] = {
   var result = Array[B](size(xs));
   for (var i = 0; i < size(xs); ++i)
      result(i) = f(xs(i));   

   return result;
}

About

Compiler for some statically typed language

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published