full brainfuck
This commit is contained in:
@@ -3,9 +3,14 @@
|
||||
<assign variable="prog">
|
||||
<call function="string-split">
|
||||
<arguments>
|
||||
<call function="input">
|
||||
<call function="array-get">
|
||||
<arguments>
|
||||
<call function="get-args">
|
||||
<arguments />
|
||||
</call>
|
||||
<integer value="1" />
|
||||
</arguments>
|
||||
</call>
|
||||
<string value="" />
|
||||
</arguments>
|
||||
</call>
|
||||
@@ -19,9 +24,47 @@
|
||||
<assign variable="t">
|
||||
<array />
|
||||
</assign>
|
||||
<assign variable="found">
|
||||
<integer value="0" />
|
||||
</assign>
|
||||
<assign variable="inp">
|
||||
<integer value="0" />
|
||||
</assign>
|
||||
<each variable="c">
|
||||
<value variable="prog" />
|
||||
<do>
|
||||
<if>
|
||||
<and>
|
||||
<equal>
|
||||
<value variable="found" />
|
||||
<integer value="0" />
|
||||
</equal>
|
||||
<equal>
|
||||
<value variable="c" />
|
||||
<string value="," />
|
||||
</equal>
|
||||
</and>
|
||||
<then>
|
||||
<assign variable="in">
|
||||
<call function="string-split">
|
||||
<arguments>
|
||||
<call function="input">
|
||||
<arguments />
|
||||
</call>
|
||||
<string value="" />
|
||||
</arguments>
|
||||
</call>
|
||||
</assign>
|
||||
<assign variable="found">
|
||||
<integer value="1" />
|
||||
</assign>
|
||||
</then>
|
||||
</if>
|
||||
</do>
|
||||
</each>
|
||||
<for variable="_">
|
||||
<from><integer value="0" /></from>
|
||||
<to><integer value="100" /></to>
|
||||
<to><integer value="10" /></to>
|
||||
<step><integer value="1" /></step>
|
||||
<do>
|
||||
<call function="array-push">
|
||||
@@ -133,6 +176,8 @@
|
||||
</equal>
|
||||
<then>
|
||||
<call function="print">
|
||||
<arguments>
|
||||
<call function="to-ascii">
|
||||
<arguments>
|
||||
<call function="array-get">
|
||||
<arguments>
|
||||
@@ -142,6 +187,8 @@
|
||||
</call>
|
||||
</arguments>
|
||||
</call>
|
||||
</arguments>
|
||||
</call>
|
||||
</then>
|
||||
<else>
|
||||
<if>
|
||||
@@ -150,7 +197,28 @@
|
||||
<value variable="c" />
|
||||
</equal>
|
||||
<then>
|
||||
|
||||
<call function="array-set">
|
||||
<arguments>
|
||||
<value variable="t" />
|
||||
<value variable="p" />
|
||||
<call function="from-ascii">
|
||||
<arguments>
|
||||
<call function="array-get">
|
||||
<arguments>
|
||||
<value variable="in" />
|
||||
<value variable="inp" />
|
||||
</arguments>
|
||||
</call>
|
||||
</arguments>
|
||||
</call>
|
||||
</arguments>
|
||||
</call>
|
||||
<assign variable="inp">
|
||||
<add>
|
||||
<value variable="inp" />
|
||||
<integer value="1" />
|
||||
</add>
|
||||
</assign>
|
||||
</then>
|
||||
<else>
|
||||
<if>
|
||||
@@ -337,11 +405,7 @@
|
||||
</while>
|
||||
</then>
|
||||
</if>
|
||||
|
||||
</then>
|
||||
<else>
|
||||
|
||||
</else>
|
||||
</if>
|
||||
</else>
|
||||
</if>
|
||||
@@ -363,6 +427,11 @@
|
||||
<integer value="1" />
|
||||
</add>
|
||||
</assign>
|
||||
<!-- <call function="print">
|
||||
<arguments>
|
||||
<value variable="t" />
|
||||
</arguments>
|
||||
</call> -->
|
||||
</do>
|
||||
</while>
|
||||
</main>
|
||||
|
||||
46
src/lib.rs
46
src/lib.rs
@@ -832,6 +832,10 @@ mod stl {
|
||||
String::from("array-length"),
|
||||
Value::StdFunction(array_length),
|
||||
);
|
||||
ctx.assign(String::from("to-ascii"), Value::StdFunction(to_ascii));
|
||||
ctx.assign(String::from("from-ascii"), Value::StdFunction(from_ascii));
|
||||
ctx.assign(String::from("get-args"), Value::StdFunction(get_args));
|
||||
|
||||
}
|
||||
|
||||
fn print(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
|
||||
@@ -964,6 +968,48 @@ mod stl {
|
||||
Err("bad argument count in call to 'array-length'")?
|
||||
}
|
||||
}
|
||||
|
||||
fn to_ascii(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
|
||||
if vals.len() == 1 {
|
||||
if let Value::Integer(i) = &vals[0] {
|
||||
if i <= &255 {
|
||||
Ok(Some(Value::String(String::from_utf8(vec![*i as u8])?)))
|
||||
} else {
|
||||
Err("invalid integer in call to 'to-ascii'")?
|
||||
}
|
||||
} else {
|
||||
Err("invalid argument in call to 'to-ascii'")?
|
||||
}
|
||||
} else {
|
||||
Err("bad argument count in call to 'to-ascii'")?
|
||||
}
|
||||
}
|
||||
|
||||
fn from_ascii(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
|
||||
if vals.len() == 1 {
|
||||
if let Value::String(s) = &vals[0] {
|
||||
if s.len() == 1 {
|
||||
Ok(Some(Value::Integer(s.as_bytes()[0] as i64)))
|
||||
} else {
|
||||
Err("invalid string in call to 'from-ascii'")?
|
||||
}
|
||||
} else {
|
||||
Err("invalid argument in call to 'from-ascii'")?
|
||||
}
|
||||
} else {
|
||||
Err("bad argument count in call to 'from-ascii'")?
|
||||
}
|
||||
}
|
||||
|
||||
fn get_args(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
|
||||
if vals.len() == 0 {
|
||||
Ok(Some(Value::Array(Rc::new(RefCell::new(
|
||||
std::env::args().skip(1).map(|arg| Value::String(arg)).collect()
|
||||
)))))
|
||||
} else {
|
||||
Err("bad argument count in call to 'get-args'")?
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run(filename: &str) -> Result<(), Box<dyn Error>> {
|
||||
|
||||
@@ -4,6 +4,6 @@ use std::env;
|
||||
fn main() {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if let Err(e) = run(&args[1]) {
|
||||
panic!("Error occurred: {}", e);
|
||||
eprintln!("Error occurred: {}", e);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user