A simple programming language created in scala
Archie is a small, general purpose, embeddable programming language created from scratch in scala as a project for school. It is designed to be easily contained within JVM applications to allow application developers to give their users access to custom scripts.
Archie is an interpreted language and is organised into the following major sub-systems:
----------------------------
External API -> |Parsing -> (AST + Runtime)|
----------------------------
The external API is designed to make working with Archie in the host language as easy as possible. The core of the language is in the Parsing and Runtime sub-systems which allow execution of archie code. The Parser takes in code and produces an Abstract Syntax Tree which can then be executed
Internally the language is represented by an AST. This is a wrapper on List[Line]
. A Line
is
one of three things:
Comment
- A one line commentClassDef
- A class definitionElement
- The core atom of the library
Anything that isn't a direct subtype of Line
will be an Element. The main difference is that an
Element must return a value (even if it is a void) when run whilst a Line does not. This may change
in the future. The AST is immutable and has no knowledge of state so the only way to use it is to
traverse it. The Archie core library provides two ways of doing this: ASTTransform
and ASTVisitor
.
ASTVisitor
is an implementation of the visitor pattern whilst ASTTransform
uses an anonymous function
which assumes pattern matching.
Interpretation is implemented as an ASTVisitor
with all the state separated from the actual tree.
The language has a number of influences both syntactically and conceptually
- Dynamic Typing - As this is a scripting language designed for extending existing applications I have decided on dynamic typing. It will be similar to the typing seen in javascript or python
- C-Like syntax - Archie will use syntax familliar to any C++, C# or Java programmer
with semi-colons, curly braces and
if (condition) {}
expressions - Syntactic Sugar - My personal favourite language is scala as such many of the more "nice
to have" features will be borrowed from there and other FP languages
- Function application with the
apply
method - Higher Order Functions
- Maximised use of expressions over statements
- To minimise "Special Cases" I intend to make as many things as possible
Elements
(Expressions that can return a value) instead ofLines
(Statements that can't). - This should allow greater flexibility and ease of use
- To minimise "Special Cases" I intend to make as many things as possible
- Optional Semi-colons - I intend to make semicolons optional to give the language a greater "flow"
- Function application with the
##Some Example code
class Person (name, yearOfBirth) {
this.age = () => {
return currentYear - yearOfBirth;
}
this.apply = () => {
return "Person (" + name + ")"
}
//Yes I know this is a stupid function but who cares
this.+ = (years) => {
return new Person(name, yearOfBirth+years)
}
this.+= = (years) => {
this.yearOfBirth = this.yearOfBirth + years
}
}
currentYear = 2016
freddie = new Person("Freddie", 2000)
println(freddie.age()) //Prints 4
println(freddie()) //Prints "Person (Freddie)"
freddie.name = "Freddie Poser"
println(freddie()) // Prints "Person (Freddie Poser)"
newFreddie = freddie + 1
println(freddie.yearOfBirth) //Prints 2000
println(newFreddie.yearOfBirth) //Prints 2001
freddie += 2
println(freddie.yearOfBirth) //prints 2002
println(newFreddie.yearOfBirth) //Prints 2001
##Roadmap
ParsingVisitor and Transform FrameworkSimple File Application for testing- Interpreter
Type Backend- Element Implementations
- Standard Library
- API
- Optimisation framework
- Custom IL Compiler (writes the AST to a file as an intermediate representation that is easy to parse, improving speed when running code
- Online try-out site
##TODO:
- Allow comments inside of a
CodeBlock
- Perhaps make comments some sort of element
- Make assignments lines then allow lines inside of a codeblock
- return statements
- if and while
- Apply syntax?
- Function calls inside of objects need object scope
##Contributing I will not be accepting contributions at the moment as this is a project for school
Archie by Freddie Poser is licensed under a Creative Commons Attribution 4.0 International License.