8.6 KiB
ZRE (Zongors Reality Engine) Design parameters
What is zre?
zre is an domain specific language for 3d games with C/Lua style syntax. The compiler is written in C which should make it easy to port to other systems.
ZRE Grammar and Specification
Types
- there are also a list of "substantial types" which come with the language which are the building blocks for more complex types. If you are coming from object oriented languages you can think of self as "primitive types"
- Note that these look like classes but act like structs the methods actually have a implied struct as their first argument
type «token» {
init() {
// values
}
}
! example
type Vec3 {
init(x real, y real, z real) {
this.x = x;
this.y = z;
this.y = z;
}
}
Basic Types
numeric
-
real
- 32 bit floats
-
int
- 32 bit integer
-
nat
- 32 bit unsigned integer (for loop counting and indexing)
string
-
str
- utf8 / ascii encoded string depending on the language output
normal string
"«utf8 encoded characters»"
string interpolation
"«utf8 encoded characters» ${some_var}"
binary
-
byte
- same as uint8 or c char, also used for interop
logical
-
bool
true
/false
datastructure
Array
Array of a specific type
let «variable» = [val1, val2, ...];
Map
Hashmap
let «variable» = {key1: val1, key2: val2, ...};
Tunnel
described in "tunnel" section
Basic operators
The following is a list of global operators and their effect:
-
!
- comment
-
??
- unwrap or
-
.?
- null check or return error
-
-
- addition
-
-
-
- subtraction
- negation
-
-
-
- multiplication
-
-
/
- divisor
-
^
- power
-
==
- equals
-
<
- less than
-
>
- greater than
-
>=
- greater than or equals
-
<=
- less than or equals
-
.
- accessor
-
++
- inline add 1
-
–
- inline subtract 1
-
+=
- inline add n
-
-=
- inline subtract n
-
*=
- inline multiply n
-
\=
- inline divide n
logical / bitwise operators
-
mod
- modulo
-
not
- logical not
-
and
- logical and
-
or
- logical or
-
xor
- logical xor
-
band
- bitwise and
-
bor
- bitwise or
-
bxor
- bitwise xor
-
srl
- bit shift right
-
sll
- bit shift left
keywords
let
let operator
let «token» = true;
is
checks if a object is of that type
if («token» is real) {
print("hello yes self is a real?");
}
also used for letting constants
as
coerces a type as another type if possible
let «token» = 0; ! default is int
some_functon(«token» as real); ! needs a real
in
checks if a object's type, or a type implements a contract
if («token» in Tunnel, Drawable) {
print("im tunnel-able and draw-able");
}
also used inside of the for loops
for («token» in «collection») { «body» }
Object
An object is an invoked type.
let «variable» = «type»(«fields», …);
Tunnel
Represents a path to a file, url endpoint, other process endpoint (like a socket, etc.)
Tunnels are inspired by translators in gnu/hurd, plan9 9p protocol, and unix sockets
tunnels are invoked like objects, but have scope like control flow end scope closes the tunnel
note the type must always be of a type which is "tunnel-able" i.e. Files, sockets, etc
Tunnels have almost the same interface as 9p since they are closely based on 9p.
transtypes for tunnels
tunnel? : attach(tunnel_object)
-> open communication
success? : tunnel_object.clunk()
-> close communication
success? : tunnel_object.flush()
-> cancels long operation and dumps
whatever is in buffer
success? : tunnel_object.open(resource, mode)
-> opens a tunnel for
doing operations on
success? : tunnel_object.create(resource)
-> creates the object from
the database graph/file from file structure
data? : tunnel_object.read(resource)
-> reads from a tunnel
success? : tunnel_object.write(resource, data)
-> writes to a tunnel
success? : tunnel_object.remove(resource)
-> removes the object from
the database graph/file from file structure
stat_data? : tunnel_object.stat(resource)
-> returns the status of the
file/resource
version? : tunnel_object.version()
-> returns the version code for the
connected tunnel
success? : tunnel_object.walk(path_or_endpoint)
-> moves around the
filesystem or through the graph
! client
let endpoint = Client("tcp://path/to/source");
let tunnel = endpoint.attach(user, auth);
let data = tunnel.open("/some/resource").read();
std.write(data);
data.flush();
endpoint.clunk();
! server
let server = Server("tcp://0.0.0.0:25565");
s.bind("/some/resource", fn () str {
return "hello world";
})
server.start();
Functions
Functions are all typechecked statically at compile time. Since we
always have a "default type" for all constant values or a developer can
use the as
keyword we do not have to define all values like in C,
while keeping the same type safety as a more strongly typed language.
fn «token» («parameter» «type», ...) «return_type» {
«body»
}
-
Built in transtypes
- sort
- filter
- trig functions
- calc functions
- statistical functions
Control flow
loops
for («token» in «collection») { «body» }
iterates through each object in the collection setting it to token
while («boolean expression») { «body» }
loops until the expression is false
do (let «variable» = initial_value, end_value, increment) { «body» }
loops from initial value to end value by increment value (like a for loop in other languages)
branching
if («boolean expression») {
} else if («boolean expression») {
} else {
}
switch (value) {
case A:
case B:
case C:
default:
}
Error handling
Error handling is much like in C/C++ where a try catch can be used.
let rr = nil;
let var = rr ?? 0; ! value is 0
try {
let other_var = 1 / rr; ! will panic
} catch (e) {
print("Caught error ${e}");
}
Localization
will look up the text of «token» in the linked localization.json file
#«token»
{
"some_token": [
"localization_1": ""
],
"some_other_token": [
"localization_1": "",
"localization_2": ""
]
}
Libraries and "includes"
In most languages the include or use statements get libraries which link to other files and so on.
use "./some_local_file.zre"
Testing
assertion
assert(«expression», «expected output») ! returns «error or none»
Measurements
-
types
-
time
-
unit
- seconds (s)
-
subtypes
-
date
- Default is ISO 8601
-
-
-
length
-
unit
- metre (m)
-
subtypes
-
angle
- radian (rad)
-
-
-
mass
-
unit
- kilogram (kg)
-
-
electric current
-
unit
- ampere (a)
-
-
temperature
-
unit
- kelvin (K)
-
-
amount of substance
-
unit
- mol (mol)
-
-
luminous intensity
-
unit
- candela (candela)
-
-