I made Rizzy as a learning project. I followed Thorsten Ball's book “Writing An Interpreter In Go” and I made a few changes, mostly changing the name of the keywords and adding some built-in functions for arrays. I just finished the book and I want to do some different things in the future, like adding some data types, some changes in language design. Before I started coding I never thought about the design because I had no idea how to make an interpreter. Now that I understand a little bit, I can think about it and make some changes. I learned a lot and I want to go beyond the book to keep learning. There are still a lot to do and a lot of problems I know about.
Rizzy is language with 6 data types (Integer
, Float
, Boolean
, String
, Array
, Map
) and a NULL
. Rizzy has first-class functions with closure. Everything in Rizzy is a expression (function) except def (Define) statements and return statements. So if you type 5
it's actually a expression that evaluates 5.
- Floats
- Error traceback (added for parse errors, no traceback for Error objects for now)
- Better terminal integration (use arrow keys on REPL)
- Multiline input
- GTE ("<=") and LTE (">=")
- INTEGER -> FLOAT and FLOAT -> INT
- AND ("&&", "&") and OR ("||", "|")
- Built-in function for formatting ("fmt()")
- Range operator ("[n..n+m]")
- Make runable files
With def
keyword you can define variables and functions.
def integer_var = 1;
def float_var = 1.;
def name = "Rizzler";
def arr = ["I", "am", "The", "Rizzler", "!", 1, 2];
def arr_of_nums = [1, 2, 3];
def boolean_variable = true;
Define functions and use call expression.
def factorial = func(x) { if (x == 0) { 1 } else { x * factorial(x - 1) } };
factorial(4);
Use index expression.
def arr = [1, 2, 3];
arr[0];
Use hashmap.
def mymap = {"name": "Rizzler", "version": 1};
mymap["name"];
They have the same definition. Prints the arguments in their own line and returs an null. So the use is just:
>>> puts("The", "Name", "Is", "Rizzler", "!");
The
Name
Is
Rizzler
!
Rizzler: null
Notice that it says "null" in the end. It does not evaluate anything. So if you say def a = puts("a");
, a;
will give you null
.
Exits the interpreter, with an optional exit status code (default=0).
Returns the length of the input as INTEGER. Takes 1 input, ARRAY or STRING.
Format string. Use %% and replace with order. Example :
>>> fmt("%% x %% = %%", 2, 2, 2*2)
Rizzler: 2 x 2 = 4
Returns first element of an array. Takes an ARRAY as argument. Same as using array[0]
.
Returns last element of an array. Takes an ARRAY as argument. Same as using array[len(array)-1]
.
Returns the array without the last element. Takes an ARRAY as argument.
Returns the array without the first element. Takes an ARRAY as argument.
Takes 2 arguments. Takes an ARRAY as first argument and an Expression as second. Returns an ARRAY with result of the given expression as last element.
Takes 1 arguments and 1 optional argument. Takes an ARRAY as first argument and an Expression as second. Returns an ARRAY without the element with index of result of the given expression.
Takes 2 arguments. Takes two INTEGER. Returns an INTEGER. pow(2,2)
= 4
Takes 1 argument. Takes an INTEGER. Returns an INTEGER. sqrt(4)
= 2
Under the MIT License.