a tree-walk interpreter implemented in Kotlin that was created to learn how programming languages worked
Although not very practical to use in a real project, it is Turing complete and provides basic scripting needs.
Yes, its slow.
Made possible with http://craftinginterpreters.com/
log ("Hello world")
loop(var i = 0 as i < 10: i++) {
log("Hello world")
}
class A {
}
class littleA from A {
}
task fib(n) {
if (num <= 1) return 1;
return fib(n - 1) + fib( n - 2);
}
//Native function asking question and the type of response
var ans = responseTo("What is 10 - 10?", "number")
if (ans != 0) {
log("Idiot")
return;
}
- HashMaps for environments
- Implementation of Visitor Pattern
- separate parser and lexer
- No modes
- primitives
- boolean,
- number (64 bit)
- strings
- Semantic Analysis
- Recursive Descent Parser
- Classes
- Inheritance
- super keyword
- this keyword
- Functions
- Lexical Scoping
- Global variables
- Closures
- Lexically scoped variables
- if / else (No else if)
- Comments and comment blocks
- Short-hands for expressions ( +=, ++, --)
- return statements
- ternary operators
- loops (loop, while)
- Kotlin and JS syntax inspiration
- Object getters and setters
- multi-line strings
- truthy values
- short circuiting evaluation
- Native functions :
- asking for user response in terminal
- stopwatch
- exitProcess
- No implicit primitive type conversions (number to number, string to string only)
- Module system
- multi-file support
- standard library
- type system
- immutability
- speed
- syntax highlighting (yet)
- bitwise operators
typeof
orinstanceof
operators- dead code elimination
- static methods in classes
- escape characters
- template literals
- no data structures
As stated above, this language was created to learn language design and is not meant for practical use
-
super
-
class
-
return
-
var
-
task
-
false
-
true
-
null
-
if
-
else
-
loop
-
while
-
from
-
super
-
this
-
NaN
-
log
-
as
-
this
-
init
-
object
{
}
(
)
;
.
,
:
?
#
!
=
>
<=
>=
<
-
.
+
++
--
"
%
/
/=
And many more! (tokens are similar to C / JS syntax)
declare a variable -> var hi = "Hello"
- declared but not assigned variables are null by default
- variables that have not been declared nor defined but accessed throw undefined variable error
- semicolons are always omitted
declare function -> task name() {}
- returns must end in semicolon
- nested functions are okay (closures)
declare class -> class T {}
- classes have optional init blocks like Kotlin. use
init{ #stmts | expressions #}
-
class joeWithInit { init { log("a new joe class was instatiated") //does not have access to 'this' properties //cannot return anything } //constructor object(a,b) { this.a = a this.b = b } eatChicken() { log(this.a + " ate" + " chicken") } }
extending class -> class E from T{}
constructor -> object( #parameters#) {}
while -> while(expression) {}
loop -> loop(as:) #infinite loop#
, simple loop ->loop (var i = 0 as i < 10: i++)
comments -> // line specific
comment blocks -> # comments #
print to terminal -> log()
- Automatically appends new line (\n) (equivalent to
println()
)
declare method in class -> name(#parameters#){}
ternary operators -> condition expression ? expression evaluated if true : expression evaluated if false
- Cannot compound ternary operators
Short Circuiting -> expression || expression
- Evaluates first truthy values
- NaN and null are falsy
- VScode extension in the process
- logo
- a cmdlet or something to make this easier to run then direct jar
- usable download on this repo