A statically-typed compiled language defined by a simple grammar.
It is now possible to write simple programs. The following program computes 9 factorial:
fn fact(n: Number): Number
var acc = 1
var i = 1
while i < n
acc = acc * i
i = i + 1
end
acc
end
print fact(9) # => 362880
You can also mess around with constant strings:
# FizzBuzz
#
# Implementation of the legendary `FizzBuzz` algorithm.
fn fizzbuzz(n: Number): String
(print 'fizzbuzz') if mod(n, 15) == 0 else
(print 'fizz') if mod(n, 3) == 0 else
(print 'buzz') if mod(n, 5) == 0 else
print_num(n)
end
The main build is performed by cargo. For running the functional
tests and benchmarks you'll need Python and to cargo install just. The suggested process is to
use the build.sh script:
$ ./build.shwill build the compilertarget/release/ullage.$ ./build.sh testwill build the compiler and run the test suite fromspecs/.$ ./build.sh benchwill run the benchmarks fromspec/bench/.
Ullage is open source, under the MIT License.
- Custom data structures
- Pattern matching
- First-class functions
- Recognise words, numbers, comments, operators and white-space
- Position information on each token
- Interpolated strings
- Expose whitespace to the parser
- Parse base constructs
- For loops and iterators
- Traditional
ifblocks - Keep track of all underlying tokens
- Expose position & span information on syntax nodes
- Round-trippable/pretty-printable trees
- Create LLVM module and lower basic constructs
- Array indexing
- Arbitrary types for local variables
- Heap allocated types
- Lowering of
Stringtype - User-defined types
- RC garbage collection (#26)
- Lowering of
- Library output types (LLVM ir, LLVM bc, object, staticlib, dylib, exe)
- Control of target machine & features
- Optimisation
- Linker support:
-
clang- macOS linker default - gold - GNU ld
- lld/llvm-link
- Microsoft LINK
-