Write docs and clean up

This commit is contained in:
Jeff 2024-08-13 22:25:33 -04:00
parent 64a3ce4cd3
commit 58780b5530
11 changed files with 67 additions and 45 deletions

107
README.md
View File

@ -3,57 +3,84 @@
High-level programming language with effortless concurrency, automatic memory management and type High-level programming language with effortless concurrency, automatic memory management and type
safety. safety.
## Concepts Dust is a work in progress. Because it aims to deliver a high level of safety, extensive testing
is required. The language is still in the design phase, and the syntax is subject to change.
Dust is heavily influenced by Rust, but aims to be more high-level and easier to use. Its approach ## Usage
to safety is similar in that it will refuse to run programs with issues that can be caught by
static analysis. However, Dust is not compiled and while performance is a concern, it is less The Dust command line tool can be used to run Dust programs. It is not yet available outside of
important than safety and ease of use. this repository.
```sh
cargo run --package dust-shell -- examples/hello_world.ds
```
```sh
cargo run --package dust-shell -- -c "'Hello my name is ' + read_line() + '!'"
```
Dust is easily embedded in another program. You can run a dust program of any size or complexity
with a single function.
```rust
use dust_lang::{run, Value};
fn main() {
let code = "
x = 'Dust'
y = ' is awesome!'
write_line(x + y)
42
";
let result = dust.run(code).unwrap();
assert_eq!(result, Ok(Some(Value::integer(42))));
}
```
## Concepts
### Effortless Concurrency ### Effortless Concurrency
Rust promises *fearless* concurrency, and Dust takes it a step further by making concurrency as Dust takes it a step further by making concurrency as effortless as possible. Dust is organized
*effortless* as possible. Dust is organized into **statements**, and any sequence of statements can into **statements**, and any sequence of statements can be run concurrently by simply adding the
be run concurrently by simply adding the `async` keyword before the block of statements. `async` keyword before the block of statements.
```dust ```rust
# This function will count from 0 to 9, sleeping for an increasing amount of // Counts from 0 to 9, sleeping for an increasing amount of time between each.
# time between each number. count_slowly = fn (multiplier: int) {
count_slowly = fn ( i = 0
multiplier: int,
) {
i = 0
while i < 10 { while i < 10 {
sleep_time = i * multiplier; sleep(i * multiplier)
write_line(i.to_string())
thread.sleep(sleep_time) i += 1
io.write_line(i as str) }
i += 1
}
} }
async { async {
count_slowly(200) # Finishes last count_slowly(200) // Finishes last
count_slowly(100) # Finishes second count_slowly(100) // Finishes second
count_slowly(50) # Finishes first count_slowly(50) // Finishes first
} }
``` ```
### Automatic Memory Management ### Automatic Memory Management
Dust uses a garbage collector to automatically manage memory. During the analysis phase, Dust will Dust uses a garbage collector to automatically manage memory. During the analysiys phase, Dust
determine the number of references to each value. During execution, the intepreter will check the will determine when a value is no longer needed. It can then be removed from memory at runtime.
context after each statement and remove values that will not be used again.
```dust ```rust
x = 0 # x is assigned but never used x = 0 // x is assigned but never used
# x is removed from memory // x is removed from memory
y = 41 # y is assigned y = 41 // y is assigned
y + 1 # y is kept alive for this statement y + 1 // y is kept alive for this statement
# y is removed from memory // y is removed from memory
``` ```
### Type Safety ### Type Safety
@ -62,19 +89,19 @@ Dust is statically typed and null-free, but the type of a value can usually be i
usage. Dust will refuse to run programs with type errors, but will usually not require type usage. Dust will refuse to run programs with type errors, but will usually not require type
annotations. annotations.
```dust ```rust
# These two statements are identical to Dust // These two statements are identical to Dust
x = 1 x = 1
x: int = 1 x: int = 1
# Numbers with decimals are floats // Numbers with decimals are floats
y = 10.0 y = 10.0
y: float = 10.0 y: float = 10.0
# Strings are enclosed in single or double quotes and are guaranteed to be valid UTF-8 // Strings are enclosed in single or double quotes and are guaranteed to be valid UTF-8
z = "Hello, world!" z = "Hello, world!"
z: string = "Hello, world!" z: string = "Hello, world!"
``` ```
Aside from the ubiqutous `bool`, `int`, `float`, and `string` types, Dust also has `list`, `map`, Aside from the ubiqutous `bool`, `int`, `float`, and `string` types, Dust also has list, maps,
`range`, structures, enums and functions. ranges, structures, enums and functions.

View File

@ -1183,11 +1183,6 @@ mod tests {
#[test] #[test]
fn tuple_struct_access() { fn tuple_struct_access() {
let input = "Foo(42, 'bar').0"; let input = "Foo(42, 'bar').0";
let mut tree = AbstractSyntaxTree::new();
if parse_into(input, &mut tree).is_err() {
println!("{:?}", tree);
}
assert_eq!( assert_eq!(
parse(input), parse(input),