1
1
Fork 0
mirror of https://github.com/azur1s/bobbylisp.git synced 2024-10-16 02:37:40 -05:00

Compare commits

..

No commits in common. "cf3dccca2cbcb57bef77b541cb1bae4f4d057d3f" and "f9a88c14c581acc6cd35ed08de1062a37f3666d4" have entirely different histories.

9 changed files with 96 additions and 125 deletions

View file

@ -28,5 +28,98 @@ Steps to build:
2) Build executable `cargo build` 2) Build executable `cargo build`
3) Try running some examples! `path/to/executable compile path/to/file.hz` 3) Try running some examples! `path/to/executable compile path/to/file.hz`
# Syntax
> This language is still in development, the syntax can be changed at anytime.
Hazure is a [free-form](https://en.wikipedia.org/wiki/Free-form_language) syntax style, so the indentation is purely for readability.
```sml
fun main: void = do
@write("Hello, World!");
end;
```
is the same as
```sml
fun main: void = do @write("Hello, World!"); end;
```
Hazure is also [expression-oriented](https://en.wikipedia.org/wiki/Expression-oriented_programming_language) like OCaml. There are currently 10 expressions:
1) Comment
```
-- Comment!
-{ Block Comment }-
```
2) Values / Types
```sml
1
true
"string"
variable
```
3) Unary and Binary
```sml
1 + 2
!true
```
4) Call and Intrinsic. Intrinsic starts with a `@`
```sml
@write("Hello")
foo("bar")
```
5) Pipeline
```sml
"Hello, World" |> @write(_)
```
6) Variable declaration
```sml
let foo: int = 727;
let bar: string = "Hi";
let baz: boolean = true;
```
7) Function declaration
```sml
fun foo: void = @write("void returns nothing");
fun bar (x: int): int = x + 1;
fun baz (x: int) (y: int): int = x + y;
```
8) If conditions
```sml
let cond: bool = true;
if cond then
@write("True");
else
do
@write("False");
end;
end;
```
9) Case matching
```sml
case 1 + 1 of
| 2 -> @write("Yes");
\ @write("How?");
end;
```
10) Do notation. It allows you to have multiple expression because something like right hand side of the function declaration `fun a: int = ...` can only have 1 expression. Do allows you to bypass that.
```sml
do
@write("Hello, World");
foo(bar);
let baz: int = 6 + 10;
end;
```
Hazure isn't a scripting language, so, you will need a main function.
```sml
fun main: void = do
@write("Hello, World");
@write(34 + 35);
end;
```
# License # License
Hazure is licensed under both [MIT license](https://github.com/azur1s/hazure/blob/master/LICENSE-MIT) and [Apache License](https://github.com/azur1s/hazure/blob/master/LICENSE-APACHE) Hazure is licensed under both [MIT license](https://github.com/azur1s/hazure/blob/master/LICENSE-MIT) and [Apache License](https://github.com/azur1s/hazure/blob/master/LICENSE-APACHE)

View file

@ -1,92 +0,0 @@
# Syntax
> This language is still in development, the syntax can be changed at anytime.
Hazure is a [free-form](https://en.wikipedia.org/wiki/Free-form_language) syntax style, so the indentation is purely for readability.
```sml
fun main: void = do
@write("Hello, World!");
end;
```
is the same as
```sml
fun main: void = do @write("Hello, World!"); end;
```
Hazure is also [expression-oriented](https://en.wikipedia.org/wiki/Expression-oriented_programming_language) like OCaml. There are currently 10 expressions:
1) Comment
```
-- Comment!
-{ Block Comment }-
```
2) Values / Types
```sml
1
true
"string"
variable
```
3) Unary and Binary
```sml
1 + 2
!true
```
4) Call and Intrinsic. Intrinsic starts with a `@`
```sml
@write("Hello")
foo("bar")
```
5) Pipeline
```sml
"Hello, World" |> @write(_)
```
6) Variable declaration
```sml
let foo: int = 727;
let bar: string = "Hi";
let baz: boolean = true;
```
7) Function declaration
```sml
fun foo: void = @write("void returns nothing");
fun bar (x: int): int = x + 1;
fun baz (x: int) (y: int): int = x + y;
```
8) If conditions
```sml
let cond: bool = true;
if cond then
@write("True");
else
do
@write("False");
end;
end;
```
9) Case matching
```sml
case 1 + 1 of
| 2 -> @write("Yes");
\ @write("How?");
end;
```
10) Do notation. It allows you to have multiple expression because something like right hand side of the function declaration `fun a: int = ...` can only have 1 expression. Do allows you to bypass that.
```sml
do
@write("Hello, World");
foo(bar);
let baz: int = 6 + 10;
end;
```
Hazure isn't a scripting language, so, you will need a main function.
```sml
fun main: void = do
@write("Hello, World");
@write(34 + 35);
end;
```

View file

@ -17,7 +17,7 @@ impl Codegen {
pub fn gen(&mut self, irs: Vec<IR>) { pub fn gen(&mut self, irs: Vec<IR>) {
self.emit(format!("// Auto-generated by hazure compiler version {}\n", env!("CARGO_PKG_VERSION"))); self.emit(format!("// Auto-generated by hazure compiler version {}\n", env!("CARGO_PKG_VERSION")));
self.emit("import { read, write, readFile, writeFile } from \"https://raw.githubusercontent.com/azur1s/hazure/master/runtime/io.ts\"\n"); self.emit("import { write, writeFile } from \"https://raw.githubusercontent.com/azur1s/hazure/master/std/io.ts\"\n");
for ir in irs { for ir in irs {
self.emit(&self.gen_ir(&ir.kind, true)); self.emit(&self.gen_ir(&ir.kind, true));
@ -74,7 +74,7 @@ impl Codegen {
.collect::<Vec<_>>(). .collect::<Vec<_>>().
join(", "); join(", ");
format!( format!(
"const f_{} = ({}): {} => {};\n", "const f_{} = ({}): {} => {{\n{}\n}};\n",
name, name,
args, args,
return_type_hint, return_type_hint,
@ -90,11 +90,10 @@ impl Codegen {
}, },
IRKind::Do { body } => { IRKind::Do { body } => {
let mut out = "{\n".to_string(); let mut out = String::new();
for expr in body { for expr in body {
out.push_str(&self.gen_ir(&expr, true)); out.push_str(&self.gen_ir(&expr, true));
} }
out.push_str("}\n");
out out
}, },

View file

@ -1,7 +0,0 @@
fun main: void = do
do
let foo: string = "Hello";
@write(foo);
end;
@write(foo); -- TODO: This is a runtime error
end;

View file

@ -1,14 +0,0 @@
fun say_hi (name: string): void = do
@write("Hi ");
@write(name);
@write("!");
end;
fun main: void = do
let input: string = @read("Enter your name:");
case input of
| "" -> @write("I don't know your name :(");
\ say_hi(input);
end;
end;

View file

@ -1,5 +0,0 @@
-- Run this file from root path
fun main: void = do
@read_file("./example/io/read_file.hz")
|> @write(_);
end;

View file

@ -1,3 +0,0 @@
fun main: void = do
@write_file("console.log('Hello, World!')", "hello.js");
end;