refine language a bit
This commit is contained in:
parent
52c33178d3
commit
ffbf044734
|
@ -6,11 +6,9 @@
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:CUSTOM_ID: what-is-ztl
|
:CUSTOM_ID: what-is-ztl
|
||||||
:END:
|
:END:
|
||||||
/ztl/ is an language transpiler with C/Lua style syntax. The transpiler
|
/ztl/ is an domain specific language for 3d games with C/Lua style syntax.
|
||||||
bootstrap is written in Lua which should make it easy to port to other
|
The compiler is written in C which should make it easy to port to other
|
||||||
systems. /ztl/ also can "run" standalone inside of a lua vm for
|
systems.
|
||||||
debugging purposes, it could be used for small scripting tasks or the
|
|
||||||
like.
|
|
||||||
|
|
||||||
* /ZTL/ Grammar and Specification
|
* /ZTL/ Grammar and Specification
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
|
@ -41,10 +39,12 @@ type «token» {
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:CUSTOM_ID: numeric
|
:CUSTOM_ID: numeric
|
||||||
:END:
|
:END:
|
||||||
- =byte=
|
- =real=
|
||||||
- unsigned 8 bit integer (uint8_t)
|
- 64 bit floating point (Double)
|
||||||
- =number=
|
- Is it slow and takes up a lot of space? yeah it does,
|
||||||
- 64 bit floating point (double)
|
but because it is the only numeric type it makes it so that you do not have to worry about type casting which actually ends up speeding up processing
|
||||||
|
This is also how Lua, Lox, and Wren programming language handles numbers. Also because ZTL is intended to be used for Games, floats are used more for
|
||||||
|
3D graphics than other numeric types.
|
||||||
|
|
||||||
** string
|
** string
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
|
@ -61,16 +61,19 @@ string interpolation
|
||||||
|
|
||||||
="«utf8 encoded characters» ${some_var}"=
|
="«utf8 encoded characters» ${some_var}"=
|
||||||
|
|
||||||
|
** binary
|
||||||
|
:PROPERTIES:
|
||||||
|
:CUSTOM_ID: binary
|
||||||
|
:END:
|
||||||
|
- =byte=
|
||||||
|
- same as uint8 or c char, used for interop
|
||||||
|
|
||||||
** logical
|
** logical
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:CUSTOM_ID: logical
|
:CUSTOM_ID: logical
|
||||||
:END:
|
:END:
|
||||||
=bool=
|
- =bool=
|
||||||
|
- =true= / =false=
|
||||||
=true= / =false=
|
|
||||||
|
|
||||||
Also follows the style boolean 'c' rules of nonzero / zero, but the
|
|
||||||
compiler will make fun of you
|
|
||||||
|
|
||||||
** error
|
** error
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
|
@ -106,10 +109,10 @@ syntax (yes I was nice and kept the syntax the same as most C like
|
||||||
langs)
|
langs)
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
// array same as a map of int to «type»
|
/* array same as a map of int to «type» */
|
||||||
let «variable» = [val1, val2, ...];
|
let «variable» = [val1, val2, ...];
|
||||||
|
|
||||||
// or as a map
|
/* or as a map */
|
||||||
let «variable» = {key1: val1, key2: val2, ...};
|
let «variable» = {key1: val1, key2: val2, ...};
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
|
@ -125,49 +128,47 @@ described in "tunnel" section
|
||||||
:END:
|
:END:
|
||||||
The following is a list of global operators and their effect:
|
The following is a list of global operators and their effect:
|
||||||
|
|
||||||
- =//=
|
- //
|
||||||
- comment
|
- comment
|
||||||
- =??=
|
- ??
|
||||||
- unwrap or
|
- unwrap or
|
||||||
- =+=
|
- +
|
||||||
- addition
|
- addition
|
||||||
- =-=
|
- -
|
||||||
- subtraction
|
- subtraction
|
||||||
- negation
|
- negation
|
||||||
- =*=
|
- *
|
||||||
- multiplication
|
- multiplication
|
||||||
- =/=
|
- /
|
||||||
- divisor
|
- divisor
|
||||||
- =**=
|
- ^
|
||||||
- power
|
- power
|
||||||
- ====
|
- ==
|
||||||
- equals
|
- equals
|
||||||
- =<=
|
- <
|
||||||
- less than
|
- less than
|
||||||
- =>=
|
- >
|
||||||
- greater than
|
- greater than
|
||||||
- =>==
|
- >=
|
||||||
- greater than or equals
|
- greater than or equals
|
||||||
- =<==
|
- <=
|
||||||
- less than or equals
|
- less than or equals
|
||||||
- =|>=
|
- |>
|
||||||
- curry a function into another function (like haskell shove)
|
- curry a function into another function (like haskell shove)
|
||||||
- =.=
|
- .
|
||||||
- accessor
|
- accessor
|
||||||
- =++=
|
- ++
|
||||||
- inline add 1
|
- inline add 1
|
||||||
- =--=
|
- --
|
||||||
- inline subtract 1
|
- inline subtract 1
|
||||||
- =+==
|
- +=
|
||||||
- inline add n
|
- inline add n
|
||||||
- =-==
|
- -=
|
||||||
- inline subtract n
|
- inline subtract n
|
||||||
- =*==
|
- *=
|
||||||
- inline multiply n
|
- inline multiply n
|
||||||
- =\==
|
- \=
|
||||||
- inline divide n
|
- inline divide n
|
||||||
- =**==
|
|
||||||
- inline power n
|
|
||||||
|
|
||||||
*** logical / bitwise operators
|
*** logical / bitwise operators
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
|
@ -202,7 +203,7 @@ The following is a list of global operators and their effect:
|
||||||
let operator
|
let operator
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
let «token» = 0;
|
let «token» = true;
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
=is=
|
=is=
|
||||||
|
@ -210,8 +211,8 @@ let «token» = 0;
|
||||||
checks if a object is of that type
|
checks if a object is of that type
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
if («token» is i32) {
|
if («token» is real) {
|
||||||
print("hello yes self is i32?");
|
print("hello yes self is a real?");
|
||||||
}
|
}
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
|
@ -222,8 +223,8 @@ also used for letting constants
|
||||||
coerces a type as another type if possible
|
coerces a type as another type if possible
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
let «token» = 0; // default is i32
|
let «token» = 0; /* default is real */
|
||||||
some_functon(«token» as i8); // needs an i8
|
some_functon(«token» as byte); /* needs an byte */
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
=in=
|
=in=
|
||||||
|
@ -305,12 +306,20 @@ connected tunnel
|
||||||
filesystem or through the graph
|
filesystem or through the graph
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
let endpoint = Tunnel("protocol://path/to/source");
|
/* client */
|
||||||
|
let endpoint = `protocol://path/to/source`;
|
||||||
let tunnel = endpoint.attach(user, auth);
|
let tunnel = endpoint.attach(user, auth);
|
||||||
let data = tunnel.open("/some/resource").read();
|
let data = tunnel.open("/some/resource").read();
|
||||||
std.write(data); //print(data);
|
std.write(data); //print(data);
|
||||||
data.flush();
|
data.flush();
|
||||||
endpoint.clunk();
|
endpoint.clunk();
|
||||||
|
|
||||||
|
/* server */
|
||||||
|
let server = `protocol://ip`;
|
||||||
|
s.bind("/some/resource", fn () str {
|
||||||
|
return "hello world";
|
||||||
|
})
|
||||||
|
server.start();
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
** Functions
|
** Functions
|
||||||
|
@ -362,7 +371,7 @@ loop { «body» }
|
||||||
loops infinitely until break or return
|
loops infinitely until break or return
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
do (let «variable» = initial_value, end_value, increment) { «body» }
|
do («variable» = initial_value, end_value, increment) { «body» }
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
loops from initial value to end value by increment value
|
loops from initial value to end value by increment value
|
||||||
|
@ -428,11 +437,11 @@ everything is lazily compiled jit anyways it (in theory) doesn't hurt
|
||||||
pertypeance much
|
pertypeance much
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
use "https://git.alfrescocavern.com/some_library/some_file.ztl"
|
use `https://example.com/some_library/some_file.ztl`
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
use "./some_local_file.ztl"
|
use `./some_local_file.ztl`
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
** Testing
|
** Testing
|
||||||
|
@ -444,7 +453,7 @@ use "./some_local_file.ztl"
|
||||||
:CUSTOM_ID: assertion
|
:CUSTOM_ID: assertion
|
||||||
:END:
|
:END:
|
||||||
#+begin_src ztl
|
#+begin_src ztl
|
||||||
assert(«expression», «expected output») //returns «error or none»
|
assert(«expression», «expected output») /* returns «error or none» */
|
||||||
#+end_src ztl
|
#+end_src ztl
|
||||||
|
|
||||||
** Measurements
|
** Measurements
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
fn build(ProjectConfig c) {
|
|
||||||
c.name("MMO Project");
|
|
||||||
c.mode("dev");
|
|
||||||
|
|
||||||
c.client([
|
|
||||||
LanguageSettings(
|
|
||||||
"c", // lang
|
|
||||||
"src/client.ztl", // file
|
|
||||||
"client/", // out path
|
|
||||||
[ // ffi settings
|
|
||||||
FFISetting (
|
|
||||||
"raylib", // libary name
|
|
||||||
"$RAYLIB_PATH/libraylib.a", // path
|
|
||||||
"./", // local path
|
|
||||||
"make build", // build command
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
|
|
||||||
c.server([
|
|
||||||
LanguageSettings(
|
|
||||||
"javascript",
|
|
||||||
"src/server.ztl",
|
|
||||||
"server/"
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
|
|
||||||
c.common([
|
|
||||||
LanguageSettings(
|
|
||||||
"c",
|
|
||||||
"src/common.ztl",
|
|
||||||
"client/"
|
|
||||||
),
|
|
||||||
LanguageSettings(
|
|
||||||
"javascript",
|
|
||||||
"src/common.ztl",
|
|
||||||
"server/"
|
|
||||||
),
|
|
||||||
LanguageSettings(
|
|
||||||
"sqlite",
|
|
||||||
"src/common.ztl",
|
|
||||||
"db/"
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
|
|
||||||
c.build();
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
use "common.ztl";
|
use `common.ztl`;
|
||||||
|
|
||||||
fn main (argc int, argv str[]) int {
|
fn main (argc real, argv str[]) {
|
||||||
let screen_width = 800;
|
let screen_width = 800;
|
||||||
let screen_height = 450;
|
let screen_height = 450;
|
||||||
|
|
||||||
|
@ -9,37 +9,34 @@ fn main (argc int, argv str[]) int {
|
||||||
|
|
||||||
let me = Player(
|
let me = Player(
|
||||||
username,
|
username,
|
||||||
Vec3(0.0, 1.0, 2.0),
|
(0.0, 1.0, 2.0),
|
||||||
purple
|
PURPLE
|
||||||
);
|
);
|
||||||
|
|
||||||
let players = me.login(password);
|
let players = me.login(password);
|
||||||
|
|
||||||
let window = Window("zwl client", screen_width, screen_height);
|
let window = Window("zwl client", screen_width, screen_height);
|
||||||
|
let splitbox = window.split("vertical", 0.75); /* vertical split 75% left */
|
||||||
|
let universe = Universe();
|
||||||
|
let canvas = Canvas();
|
||||||
|
canvas.append(Button("logout", fn () {
|
||||||
|
window.close = true;
|
||||||
|
}))
|
||||||
|
splitbox.left.append(universe);
|
||||||
|
splitbox.right.append(canvas);
|
||||||
|
|
||||||
while ( not window.should_close() ) {
|
while ( not window.should_close() ) {
|
||||||
me.update();
|
me.update();
|
||||||
|
|
||||||
window.begin_drawing();
|
universe.draw_grid(30, 1.0);
|
||||||
window.clear_background(WHITE);
|
universe.draw_cube(me.pos, 0.5, 0.5, 0.5, me.apperance);
|
||||||
|
|
||||||
window.begin_mode_3d(camera);
|
|
||||||
|
|
||||||
window.draw_grid(30, 1.0);
|
|
||||||
|
|
||||||
window.draw_cube(me.pos, 0.5, 0.5, 0.5, me.apperance);
|
|
||||||
|
|
||||||
for (player in players) {
|
for (player in players) {
|
||||||
window.draw_cube(player.pos, 0.5, 0.5, 0.5, player.apperance);
|
universe.draw_cube(player.pos, 0.5, 0.5, 0.5, player.apperance);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.end_mode_3d();
|
|
||||||
|
|
||||||
window.end_drawing();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
me.logout();
|
me.logout();
|
||||||
window.close();
|
window.close();
|
||||||
return 0;
|
exits("Client Closed Successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,37 +1,27 @@
|
||||||
type Vec3 {
|
/**
|
||||||
init(x real, y real, z real) {
|
* Camera .
|
||||||
this.x = x;
|
*/
|
||||||
this.y = y;
|
|
||||||
this.z = z;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Color {
|
|
||||||
init(r i8, g i8, b i8) {
|
|
||||||
this.r = r;
|
|
||||||
this.g = g;
|
|
||||||
this.b = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Camera {
|
type Camera {
|
||||||
init(pos Vec3, look Vec3) {
|
init(pos Vec3, look Vec3) {
|
||||||
this.setting = "CAMERA_PERSPECTIVE";
|
this.setting = "CAMERA_PERSPECTIVE";
|
||||||
this.pov = 45.0;
|
this.pov = 45.0;
|
||||||
this.up = Vec3(0.0, 1.0, 0.0);
|
this.up = (0.0, 1.0, 0.0);
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
this.look = look;
|
this.look = look;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Player .
|
||||||
|
*/
|
||||||
type Player {
|
type Player {
|
||||||
init (username str, pos Vec3, color Color) {
|
init (username str, pos Vec3, color Color) {
|
||||||
this.server = Tunnel("localhost:25565");
|
this.server = `tcp://localhost:25565`;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
this.color = color;
|
this.color = color;
|
||||||
this.camera = Camera(
|
this.camera = Camera(
|
||||||
Vec3(this.pos.x + 10.0,
|
(this.pos.x + 10.0,
|
||||||
this.pos.y + 10.0,
|
this.pos.y + 10.0,
|
||||||
this.pos.z),
|
this.pos.z),
|
||||||
this.pos
|
this.pos
|
||||||
|
@ -73,5 +63,6 @@ type Player {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const PURPLE is Color(255, 255, 0);
|
const RED is [255, 0, 0];
|
||||||
const WHITE is Color(0, 0, 0);
|
const WHITE is [0, 0, 0];
|
||||||
|
const PURPLE is [255, 255, 0];
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
use "common.ztl";
|
use `common.ztl`;
|
||||||
|
|
||||||
fn main (argc i32, argv str[]) i32 {
|
fn main (argc real, argv str[]) {
|
||||||
let s = Server("0.0.0.0:25565");
|
let s = `tcp://0.0.0.0:25565`;
|
||||||
return s.start();
|
s.bind("players", fn () Player[] {
|
||||||
|
let players = [ Player("user", (0, 0, 0), RED) ];
|
||||||
|
return players;
|
||||||
|
});
|
||||||
|
s.start();
|
||||||
|
exits(nil);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue