Rearrange repo; Add rust example
This commit is contained in:
parent
a3917238d9
commit
501801b63e
@ -1,7 +1,7 @@
|
|||||||
# Dust
|
# Dust
|
||||||
|
|
||||||
High-level programming language with effortless concurrency, automatic memory management, type
|
High-level programming language with effortless concurrency, automatic memory management, type
|
||||||
safety and advanced error handling.
|
safety and familiar syntax.
|
||||||
|
|
||||||
```dust
|
```dust
|
||||||
io.write_line("Guess the number.")
|
io.write_line("Guess the number.")
|
||||||
|
51
dust-lang/examples/interpreter_async.rs
Normal file
51
dust-lang/examples/interpreter_async.rs
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
use std::{
|
||||||
|
sync::{mpsc::channel, Arc},
|
||||||
|
thread,
|
||||||
|
time::Duration,
|
||||||
|
};
|
||||||
|
|
||||||
|
use context::Context;
|
||||||
|
use dust_lang::*;
|
||||||
|
|
||||||
|
fn run_fibnacci(interpreter: &Interpreter, i: u8) -> Value {
|
||||||
|
// These double brackets are not Dust syntax, it's just an escape sequence for Rust's format!
|
||||||
|
// macro.
|
||||||
|
let source = Arc::from(format!(
|
||||||
|
"
|
||||||
|
fib = fn (i: int) -> int {{
|
||||||
|
if i <= 1 {{
|
||||||
|
i
|
||||||
|
}} else {{
|
||||||
|
fib(i - 1) + fib(i - 2)
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
|
||||||
|
fib({i})"
|
||||||
|
));
|
||||||
|
|
||||||
|
interpreter
|
||||||
|
.run(Arc::from(i.to_string()), source)
|
||||||
|
.unwrap() // Panic if there are errors.
|
||||||
|
.unwrap() // Panic if the no value is returned.
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let interpreter = Interpreter::new(Context::new());
|
||||||
|
let (tx, rx) = channel();
|
||||||
|
|
||||||
|
for i in 1..10 {
|
||||||
|
let interpreter = interpreter.clone();
|
||||||
|
let tx = tx.clone();
|
||||||
|
|
||||||
|
thread::spawn(move || {
|
||||||
|
let value = run_fibnacci(&interpreter, i);
|
||||||
|
|
||||||
|
tx.send(value).unwrap();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Give the threads half a second to finish.
|
||||||
|
while let Ok(value) = rx.recv_timeout(Duration::from_millis(500)) {
|
||||||
|
println!("{}", value);
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,12 @@
|
|||||||
|
/**
|
||||||
|
The Dust programming language.
|
||||||
|
|
||||||
|
Dust is a statically typed, interpreted programming language.
|
||||||
|
|
||||||
|
The top-level module contains the `Interpreter` struct, which is used to lex, parse and/or
|
||||||
|
interpret Dust code. The `interpret` function is a convenience function that creates a new
|
||||||
|
`Interpreter` and runs the given source code.
|
||||||
|
*/
|
||||||
pub mod abstract_tree;
|
pub mod abstract_tree;
|
||||||
pub mod context;
|
pub mod context;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
@ -33,6 +42,7 @@ pub fn interpret(source_id: &str, source: &str) -> Result<Option<Value>, Interpr
|
|||||||
///
|
///
|
||||||
/// You must provide the interpreter with an ID for each piece of code you pass to it. These are
|
/// You must provide the interpreter with an ID for each piece of code you pass to it. These are
|
||||||
/// used to identify the source of errors and to provide more detailed error messages.
|
/// used to identify the source of errors and to provide more detailed error messages.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct Interpreter {
|
pub struct Interpreter {
|
||||||
context: Context,
|
context: Context,
|
||||||
sources: Arc<RwLock<HashMap<Arc<str>, Arc<str>>>>,
|
sources: Arc<RwLock<HashMap<Arc<str>, Arc<str>>>>,
|
||||||
|
Loading…
Reference in New Issue
Block a user