aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/sloth_vm/src/native.rs1
-rw-r--r--crates/sloth_vm/src/sloth_std/file.rs2
-rw-r--r--crates/sloth_vm/src/sloth_std/misc.rs39
-rw-r--r--crates/sloth_vm/src/sloth_std/mod.rs3
-rw-r--r--crates/sloth_vm/src/sloth_std/rand.rs2
-rw-r--r--crates/sloth_vm/src/sloth_std/stdio.rs3
-rw-r--r--crates/sloth_vm/src/sloth_std/term.rs2
-rw-r--r--crates/sloth_vm/src/sloth_std/time.rs1
-rw-r--r--examples/snake.sloth40
9 files changed, 93 insertions, 0 deletions
diff --git a/crates/sloth_vm/src/native.rs b/crates/sloth_vm/src/native.rs
index 8790cbd..fbd2626 100644
--- a/crates/sloth_vm/src/native.rs
+++ b/crates/sloth_vm/src/native.rs
@@ -15,4 +15,5 @@ pub struct NativeFunction {
pub function: NativeFunctionInput,
pub arity: u8,
pub returns_value: bool,
+ pub doc: Option<&'static str>,
}
diff --git a/crates/sloth_vm/src/sloth_std/file.rs b/crates/sloth_vm/src/sloth_std/file.rs
index b6c8adf..5761f09 100644
--- a/crates/sloth_vm/src/sloth_std/file.rs
+++ b/crates/sloth_vm/src/sloth_std/file.rs
@@ -31,6 +31,7 @@ pub const FILE_READ: NativeFunction = NativeFunction {
function: file_read,
arity: 1,
returns_value: true,
+ doc: None,
};
fn file_write(vm: &mut VM, args: &[Primitive]) -> NativeFunctionResult {
@@ -70,4 +71,5 @@ pub const FILE_WRITE: NativeFunction = NativeFunction {
function: file_write,
arity: 2,
returns_value: false,
+ doc: None,
};
diff --git a/crates/sloth_vm/src/sloth_std/misc.rs b/crates/sloth_vm/src/sloth_std/misc.rs
new file mode 100644
index 0000000..72be48f
--- /dev/null
+++ b/crates/sloth_vm/src/sloth_std/misc.rs
@@ -0,0 +1,39 @@
+use super::NATIVE_LIBRARY;
+use crate::native::{self, NativeFunction, NativeFunctionResult};
+use crate::value::{Object, ObjectType, Primitive};
+use crate::VM;
+
+fn get_doc(vm: &mut VM, args: &[Primitive]) -> NativeFunctionResult {
+ let Some(Primitive::Object(ptr)) = args.get(0).cloned() else {
+ return Err(native::Error::InvalidArgument);
+ };
+
+ let object = vm
+ .objects()
+ .get(ptr as usize)
+ .ok_or(native::Error::InvalidArgument)?;
+
+ let ObjectType::String(str) = &object.typ else {
+ return Err(native::Error::InvalidArgument);
+ };
+
+ let docs = NATIVE_LIBRARY
+ .get(str.as_str())
+ .ok_or(native::Error::InvalidArgument)?
+ .doc
+ .ok_or(native::Error::InvalidArgument)?
+ .to_string();
+
+ let object = Object::new(ObjectType::String(docs));
+ let ptr = vm.objects_mut().allocate(object);
+
+ Ok(Primitive::Object(ptr as u32))
+}
+
+pub const GET_DOC: NativeFunction = NativeFunction {
+ name: "get$doc",
+ function: get_doc,
+ arity: 1,
+ returns_value: true,
+ doc: None,
+};
diff --git a/crates/sloth_vm/src/sloth_std/mod.rs b/crates/sloth_vm/src/sloth_std/mod.rs
index 56e166c..982017d 100644
--- a/crates/sloth_vm/src/sloth_std/mod.rs
+++ b/crates/sloth_vm/src/sloth_std/mod.rs
@@ -5,6 +5,7 @@ use once_cell::sync::Lazy;
use crate::native::NativeFunction;
pub mod file;
+pub mod misc;
pub mod rand;
pub mod stdio;
pub mod term;
@@ -27,6 +28,8 @@ pub static NATIVE_LIBRARY: Lazy<HashMap<&'static str, NativeFunction>> = Lazy::n
map.insert("term$setpos", term::TERM_SETPOS);
// filesystem
+ // TODO: Make the files commands work by making a global file variable with
+ // certain permissions created by 'file.open' instead of just reading the file.
map.insert("file$read", file::FILE_READ);
map.insert("file$write", file::FILE_WRITE);
diff --git a/crates/sloth_vm/src/sloth_std/rand.rs b/crates/sloth_vm/src/sloth_std/rand.rs
index bae0606..93da0d7 100644
--- a/crates/sloth_vm/src/sloth_std/rand.rs
+++ b/crates/sloth_vm/src/sloth_std/rand.rs
@@ -16,6 +16,7 @@ pub const GEN_FUNCTION: NativeFunction = NativeFunction {
function: gen,
arity: 0,
returns_value: true,
+ doc: None,
};
fn gen_range(_vm: &mut VM, args: &[Primitive]) -> NativeFunctionResult {
@@ -36,4 +37,5 @@ pub const GEN_RANGE_FUNCTION: NativeFunction = NativeFunction {
function: gen_range,
arity: 2,
returns_value: true,
+ doc: None,
};
diff --git a/crates/sloth_vm/src/sloth_std/stdio.rs b/crates/sloth_vm/src/sloth_std/stdio.rs
index 75029bd..160d012 100644
--- a/crates/sloth_vm/src/sloth_std/stdio.rs
+++ b/crates/sloth_vm/src/sloth_std/stdio.rs
@@ -28,6 +28,7 @@ pub const WRITE_FUNCTION: NativeFunction = NativeFunction {
function: write,
arity: 1,
returns_value: false,
+ doc: None,
};
fn writeln(vm: &mut VM, args: &[Primitive]) -> NativeFunctionResult {
@@ -54,6 +55,7 @@ pub const WRITELN_FUNCTION: NativeFunction = NativeFunction {
function: writeln,
arity: 1,
returns_value: false,
+ doc: None,
};
fn read(vm: &mut VM, _args: &[Primitive]) -> NativeFunctionResult {
@@ -74,4 +76,5 @@ pub const READ_FUNCTION: NativeFunction = NativeFunction {
function: read,
arity: 0,
returns_value: true,
+ doc: None,
};
diff --git a/crates/sloth_vm/src/sloth_std/term.rs b/crates/sloth_vm/src/sloth_std/term.rs
index cffa1e8..41e6708 100644
--- a/crates/sloth_vm/src/sloth_std/term.rs
+++ b/crates/sloth_vm/src/sloth_std/term.rs
@@ -11,6 +11,7 @@ pub const TERM_CLEAR: NativeFunction = NativeFunction {
},
arity: 0,
returns_value: false,
+ doc: None,
};
fn term_setpos(_vm: &mut VM, args: &[Primitive]) -> NativeFunctionResult {
@@ -29,4 +30,5 @@ pub const TERM_SETPOS: NativeFunction = NativeFunction {
function: term_setpos,
arity: 2,
returns_value: false,
+ doc: None,
};
diff --git a/crates/sloth_vm/src/sloth_std/time.rs b/crates/sloth_vm/src/sloth_std/time.rs
index 4df715e..1c22294 100644
--- a/crates/sloth_vm/src/sloth_std/time.rs
+++ b/crates/sloth_vm/src/sloth_std/time.rs
@@ -22,4 +22,5 @@ pub const WAIT: NativeFunction = NativeFunction {
function: wait,
arity: 1,
returns_value: false,
+ doc: None,
};
diff --git a/examples/snake.sloth b/examples/snake.sloth
new file mode 100644
index 0000000..c60819d
--- /dev/null
+++ b/examples/snake.sloth
@@ -0,0 +1,40 @@
+var xPos = 0;
+var yPos = 0;
+# 0=right 1=down 2=left 3=up
+var direction = 0;
+
+while true {
+ if direction == 0{
+ var x = xPos + 1;
+ xPos = x;
+ }
+ if direction == 1 {
+ var y = yPos + 1;
+ yPos = y;
+ }
+ if direction == 2{
+ var x = xPos - 1;
+ xPos = x;
+ }
+ if direction == 3 {
+ var y = yPos - 1;
+ yPos = y;
+ }
+
+ var input = readln();
+ if input == "w" && direction != 1 {
+ direction = 3;
+ }
+ if input == "a" && direction != 0 {
+ direction = 2;
+ }
+ if input == "s" && direction != 3 {
+ direction = 1;
+ }
+ if input == "d" && direction != 2 {
+ direction = 0;
+ }
+
+ term_setpos(x, y);
+ print("*");
+}