This is the specification on how to create an Argon interpreter.
This specification should be used as a guildline, and is subject to change for later versions.
Later updates for Argon 3 should be backwards compatable (where possible) with code designed for older versions of the interpreter.
The Argon 3 interpreter is not intentionally designed to understand code written for Argon 1 and/or 2, but may follow some design patterns found in those interpreters.
Argon 3 is a programming language primarily designed for maths computation, it is designed to use techniques and
rules set in maths. It's designed to be easy for mathematicians to write and understand algorithms in.
(e.g. f(x) = x^2
to set a function)
reused variables, and infomation for use in understanding the pseudo REGEX:
- NAME = [a-zA-Z][a-za-z0-9]*
- spaces used in the pseudo REGEX should be taken as 1 or many spaces.
- there can be 0 or more spaces around any of the pseudo REGEX
(let or nothing) {NAME} = {ANY}
let variables will set variables. at the end of a opperation (e.g. if, while, or function) drop the variable stack.
having no verb at the start suggests the program would like to edit a variables from a different stack. if there is no variable found in the other stacks, then it sets one in the current stack as a let.
example:
let x = 10
y = 20
let z = x + y
setting variables returns the value, which can be used.
example:
if ((x = 10) > 5) do
term.log(x, 'is bigger than 5')
(let or nothing) {NAME}({PARAMS}) = {CODE}
the starting verb follows the rules set by set variable.
function can be called by using its name followed by brackets with the params.
example:
let f(x) = x^2 + 2*x + 1
term.log('f(10) =', f(10))
output:
f(10) = 121
if the function does not return, then the value returned is null
do
{CODE}
a wrap encloses code indented in after the word do
its used to create a new scope, so variables set from
inside the wraps scope are deleted once the wrap is finished.
example:
let name = null
do
name = input('name: ')
let age = input('age: ')
log('you are', age, 'years old!')
term.log('hello', name)
term.log('we do not know your age anymore because it got deleted when the wrap finished.')
A wrap, unless specificifed otherwise, can have a return value. This value can be used as the value of the wrap.
example:
let password = do
let password = passwordInput("set password: ")
while (password.length < 8) do
term.log("password must be longer then 8 characters!")
password = passwordInput("set password: ")
return password
term.log("your password is", password)
If the wrap does not take a return value, then the wrap passes the return value back to a parent wrap.
#{COMMENT}
Comments allow the programmer to write a message into their code, without the message being processed by the computer.