Write docs and clean up
This commit is contained in:
parent
64a3ce4cd3
commit
58780b5530
107
README.md
107
README.md
@ -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.
|
||||||
|
@ -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),
|
||||||
|
Loading…
Reference in New Issue
Block a user