Citrus

Author

Mac Malone

License

See LICENSE

Copyright

Copyright (c) 2011 Mac Malone

Citrus is a simple dynamically typed linear language written in Ruby, Treetop, and LLVM. It is meant to be an example of how to write a basic compiler.

Being linear, it could be called very c-like, but it has been written to have a syntax closer to Ruby. Its current main features are:

  • Dynamically typed
  • Extremely ruby-like syntax
  • Integer, Float, String, Symbol, Boolean, Array, and Range types
  • Easy integration of C functions into the API

It's prime examples are in the example directory, but here is an excerpt from factorial.ct:

def factorial(num)
  if num == 0
    fac = 1
  else
    fac = num*factorial(num-1)
  end
  return fac
end

printf("factorial(%d): %d", 6, factorial(6))

As you can see, very ruby-like.

Installing & Requirements

Citrus requires the following libraries:

  • LLVM 2.9 compiled with shared libraries
    • On Mac OS X, the quickest way is to use brew install llvm --shared
    • On Linux, there are usually pre-compiled packages
  • Ruby
  • Treetop
  • Ruby LLVM (currently building the source from Jeremy's next branch is required)

Everything except LLVM (and presently, ruby-llvm) is installed when running gem install citrus-compiler

Running

Citrus is a pretty simple thing to run:

$ ruby bin/citrus [options] FILENAME
    -O				Doesn't run optimization
    -i				Dumps bitcode
    -c NAME			Compiles to the given file name
    -h				Prints help

If citrus is run without -c it JIT complies the code, running it in place.

Problems & Todos

  • Hashs
  • Create a standard library
  • Better dynamically typed arrays (using structures)
  • Better exception handling (currently only works semi-effectively within begin blocks)
  • Garbage Collection