Skip to content

Commit 3204182

Browse files
Closures remember now
1 parent e4ff414 commit 3204182

4 files changed

Lines changed: 34 additions & 9 deletions

File tree

src/utils/helpers.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ pub fn resolve_expression(expr: &Expression, state: &mut State) -> Value {
2323
}
2424
Value::Object(object)
2525
}
26+
Expression::Closure { args, body, returns } => {
27+
let closure = Function {
28+
args: args.clone(),
29+
body: body.clone(),
30+
returns: *returns.clone(),
31+
captured_vars: state.local_vars.to_vec(),
32+
};
33+
Value::Closure(Box::new(Callable::Function(closure)))
34+
}
2635
Expression::ListMemberAccess { list, index } => {
2736
let index = resolve_expression(index, state);
2837
let list = resolve_expression(list, state);

src/utils/language.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::collections::HashMap;
2-
3-
use super::{Function, Value};
2+
use super::Value;
43

54
// ========================= Tokenizer ========================= \\
65

@@ -257,6 +256,11 @@ pub enum Expression {
257256
Value(Value),
258257
List(Vec<Expression>),
259258
Object(HashMap<String, Expression>),
259+
Closure {
260+
args: Vec<String>,
261+
body: Vec<Statement>,
262+
returns: Box<Expression>,
263+
},
260264
ListMemberAccess {
261265
list: Box<Expression>,
262266
index: Box<Expression>,
@@ -301,6 +305,14 @@ impl Expression {
301305
.join(", ");
302306
format!("{{ {} }}", obj_str)
303307
}
308+
Expression::Closure { args, returns, .. } => {
309+
let args_str = args.join(", ");
310+
format!(
311+
"({}) {} {{ ... }}",
312+
args_str,
313+
returns.to_string(),
314+
)
315+
}
304316
Expression::ListMemberAccess { list, index } => {
305317
format!("{}[{}]", list.to_string(), index.to_string())
306318
}
@@ -838,13 +850,11 @@ impl Parser {
838850
}
839851
let returns = self.parse_binary(0)?;
840852
let body = self.parse_block()?;
841-
Ok(Expression::Value(Value::Closure(Box::new(
842-
crate::utils::Callable::Function(Function {
843-
args,
844-
body,
845-
returns,
846-
}),
847-
))))
853+
Ok(Expression::Closure {
854+
args,
855+
body,
856+
returns: Box::new(returns),
857+
})
848858
}
849859

850860
fn parse_primary(&mut self) -> Result<Expression, String> {

src/utils/sprite/function.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub struct Function {
77
pub args: Vec<String>,
88
pub body: Vec<Statement>,
99
pub returns: Expression,
10+
pub captured_vars: Vec<(String, Value)>,
1011
}
1112

1213
impl Function {
@@ -23,6 +24,9 @@ impl Function {
2324
for (i, arg) in self.args.iter().enumerate() {
2425
new_local_vars.push((arg.clone(), args[i].clone()));
2526
}
27+
for (name, value) in &self.captured_vars {
28+
new_local_vars.push((name.clone(), value.clone()));
29+
}
2630
let mut new_state = State {
2731
start: state.start,
2832
dt: state.dt,

src/utils/sprite/sprite.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ impl Sprite {
213213
args: args.clone(),
214214
body: body.clone(),
215215
returns: returns.clone(),
216+
captured_vars: vec![],
216217
}),
217218
);
218219
}
@@ -267,6 +268,7 @@ impl Sprite {
267268
args: args.clone(),
268269
body: body.clone(),
269270
returns: returns.clone(),
271+
captured_vars: vec![],
270272
},
271273
);
272274
}

0 commit comments

Comments
 (0)