cleanup, fix closure scope error
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::cell::RefCell;
|
|
||||||
use sl::Form;
|
use sl::Form;
|
||||||
|
|
||||||
grammar;
|
grammar;
|
||||||
|
|||||||
0
slj/src/grammer.lalrpoplib.rs
Normal file
0
slj/src/grammer.lalrpoplib.rs
Normal file
@@ -1,7 +1,6 @@
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::collections::{BTreeSet,BTreeMap};
|
use std::collections::{BTreeSet,BTreeMap};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::cell::RefCell;
|
|
||||||
|
|
||||||
use anyhow::{anyhow,bail,Result};
|
use anyhow::{anyhow,bail,Result};
|
||||||
|
|
||||||
@@ -138,12 +137,12 @@ impl Form {
|
|||||||
fn pair(&self) -> Result<(Rc<Form>,Rc<Form>)> {
|
fn pair(&self) -> Result<(Rc<Form>,Rc<Form>)> {
|
||||||
match self {
|
match self {
|
||||||
Form::Pair(car, cdr) => Ok((Rc::clone(car),Rc::clone(cdr))),
|
Form::Pair(car, cdr) => Ok((Rc::clone(car),Rc::clone(cdr))),
|
||||||
_ => Err(anyhow!("pair on not a pair")),
|
_ => Err(anyhow!("pair on not a pair {self}")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn car(&self) -> Result<Rc<Form>> {
|
fn car(&self) -> Result<Rc<Form>> {
|
||||||
match self {
|
match self {
|
||||||
Form::Pair(car, cdr) => Ok(Rc::clone(car)),
|
Form::Pair(car, _cdr) => Ok(Rc::clone(car)),
|
||||||
_ => Err(anyhow!("car on not a pair")),
|
_ => Err(anyhow!("car on not a pair")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,13 +217,13 @@ impl Form {
|
|||||||
impl fmt::Display for Op {
|
impl fmt::Display for Op {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
Op::Guard { const_value, side_val, side_cont, side_id, tbk } => write!(f, "Guard{side_id}({const_value})"),
|
Op::Guard { const_value, side_val:_, side_cont:_, side_id, tbk:_ } => write!(f, "Guard{side_id}({const_value})"),
|
||||||
Op::Debug => write!(f, "Debug"),
|
Op::Debug => write!(f, "Debug"),
|
||||||
Op::Define { sym } => write!(f, "Define({sym})"),
|
Op::Define { sym } => write!(f, "Define({sym})"),
|
||||||
Op::Const ( con ) => write!(f, "Const_{con}"),
|
Op::Const ( con ) => write!(f, "Const_{con}"),
|
||||||
Op::Drop => write!(f, "Drop"),
|
Op::Drop => write!(f, "Drop"),
|
||||||
Op::Lookup { sym } => write!(f, "Lookup({sym})"),
|
Op::Lookup { sym } => write!(f, "Lookup({sym})"),
|
||||||
Op::Call { len, nc, nc_id, statik } => write!(f, "Call{nc_id}({len},{statik:?})"),
|
Op::Call { len, nc:_, nc_id, statik } => write!(f, "Call{nc_id}({len},{statik:?})"),
|
||||||
Op::InlinePrim(prim) => write!(f, "{prim:?}"),
|
Op::InlinePrim(prim) => write!(f, "{prim:?}"),
|
||||||
Op::Tail(len,oid) => write!(f, "Tail({len},{oid:?})"),
|
Op::Tail(len,oid) => write!(f, "Tail({len},{oid:?})"),
|
||||||
Op::Return => write!(f, "Return"),
|
Op::Return => write!(f, "Return"),
|
||||||
@@ -365,7 +364,7 @@ impl Ctx {
|
|||||||
|
|
||||||
return None;
|
return None;
|
||||||
},
|
},
|
||||||
Form::Closure(ps, e, b, id) => {
|
Form::Closure(_ps, _e, _b, id) => {
|
||||||
if nc.is_ret() {
|
if nc.is_ret() {
|
||||||
if *id == trace.tbk.func_id {
|
if *id == trace.tbk.func_id {
|
||||||
// we removed the loop opcode because this trace needs to know the
|
// we removed the loop opcode because this trace needs to know the
|
||||||
@@ -499,8 +498,8 @@ impl Ctx {
|
|||||||
trace.tbk.stack_const.push(true);
|
trace.tbk.stack_const.push(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn trace_lambda(&mut self, params: &[String], e: &Rc<Form>, body: &Rc<Form>) {
|
fn trace_lambda(&mut self, _params: &[String], _e: &Rc<Form>, _body: &Rc<Form>) {
|
||||||
if let Some(trace) = &mut self.tracing {
|
if let Some(_trace) = &mut self.tracing {
|
||||||
// TODO
|
// TODO
|
||||||
// kinda both also
|
// kinda both also
|
||||||
unimplemented!("trace lambda");
|
unimplemented!("trace lambda");
|
||||||
@@ -595,10 +594,11 @@ impl Ctx {
|
|||||||
ret_stack.push((Rc::clone(&e), (*nc).clone(), Some(*nc_id)));
|
ret_stack.push((Rc::clone(&e), (*nc).clone(), Some(*nc_id)));
|
||||||
if let Some(new_trace) = self.traces.get(call_id) {
|
if let Some(new_trace) = self.traces.get(call_id) {
|
||||||
println!("\tchaining to call trace b/c Call with dyamic but traced");
|
println!("\tchaining to call trace b/c Call with dyamic but traced");
|
||||||
|
e = Rc::clone(ie);
|
||||||
trace = new_trace;
|
trace = new_trace;
|
||||||
break; // break out of this trace and let infinate loop spin
|
break; // break out of this trace and let infinate loop spin
|
||||||
} else {
|
} else {
|
||||||
return Ok(Some((Rc::clone(&b), e, Cont::Frame { syms: ps.clone(), id: *call_id, c: Rc::new(Cont::Eval { c: Rc::new(Cont::Ret { id: *call_id }) }) })));
|
return Ok(Some((Rc::clone(&b), Rc::clone(ie), Cont::Frame { syms: ps.clone(), id: *call_id, c: Rc::new(Cont::Eval { c: Rc::new(Cont::Ret { id: *call_id }) }) })));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Form::Prim(p) => {
|
Form::Prim(p) => {
|
||||||
@@ -622,7 +622,7 @@ impl Ctx {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Op::Tail(len,oid) => {
|
Op::Tail(_len,_oid) => {
|
||||||
println!("Tail(op)");
|
println!("Tail(op)");
|
||||||
// Huh, this actually has to know how many envs we pushed on so we can pop
|
// Huh, this actually has to know how many envs we pushed on so we can pop
|
||||||
// them off
|
// them off
|
||||||
@@ -662,8 +662,8 @@ enum Cont {
|
|||||||
impl Cont {
|
impl Cont {
|
||||||
fn is_ret(&self) -> bool {
|
fn is_ret(&self) -> bool {
|
||||||
match self {
|
match self {
|
||||||
Cont::Ret { id } => true,
|
Cont::Ret { id: _ } => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -777,12 +777,14 @@ pub fn eval(f: Rc<Form>) -> Result<Rc<Form>> {
|
|||||||
bail!("arguments length doesn't match");
|
bail!("arguments length doesn't match");
|
||||||
}
|
}
|
||||||
ret_stack.push((Rc::clone(&e), nc, resume_data));
|
ret_stack.push((Rc::clone(&e), nc, resume_data));
|
||||||
if let Some((fp, ep, cp)) = ctx.execute_trace_if_exists(*id, &e, &mut tmp_stack, &mut ret_stack)? {
|
if let Some((fp, ep, cp)) = ctx.execute_trace_if_exists(*id, ie, &mut tmp_stack, &mut ret_stack)? {
|
||||||
f = fp;
|
f = fp;
|
||||||
e = ep;
|
e = ep;
|
||||||
c = cp;
|
c = cp;
|
||||||
println!("After executing trace, f={f}, tmp_stack is {tmp_stack:?}");
|
println!("After executing trace, f={f}, tmp_stack is {tmp_stack:?}");
|
||||||
} else {
|
} else {
|
||||||
|
println!("replacing {e} with {ie}");
|
||||||
|
e = Rc::clone(ie);
|
||||||
c = Cont::Frame { syms: ps.clone(), id: *id, c: Rc::new(Cont::Eval { c: Rc::new(Cont::Ret { id: *id }) }) };
|
c = Cont::Frame { syms: ps.clone(), id: *id, c: Rc::new(Cont::Eval { c: Rc::new(Cont::Ret { id: *id }) }) };
|
||||||
f = Rc::clone(&b);
|
f = Rc::clone(&b);
|
||||||
}
|
}
|
||||||
@@ -922,7 +924,7 @@ impl fmt::Display for Form {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Form::Closure(params, inner_env, code, id) => {
|
Form::Closure(params, _inner_env, _code, id) => {
|
||||||
write!(f, "<closure{} {:?}>", id, params)
|
write!(f, "<closure{} {:?}>", id, params)
|
||||||
}
|
}
|
||||||
Form::Prim(p) => {
|
Form::Prim(p) => {
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
#[macro_use] extern crate lalrpop_util;
|
#[macro_use] extern crate lalrpop_util;
|
||||||
lalrpop_mod!(pub grammar);
|
lalrpop_mod!(pub grammar);
|
||||||
|
|
||||||
use std::rc::Rc;
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
use sl::eval;
|
use sl::eval;
|
||||||
|
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
let input = "
|
let input = "
|
||||||
(begin
|
(begin
|
||||||
@@ -28,7 +29,9 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define faft (lambda (n) (if (= n 1) (debug 1) (+ n (faft (- n 1))))))
|
(define faft_h (lambda (faft_h n) (if (= n 1) (debug 1) (+ n (faft_h faft_h (- n 1))))))
|
||||||
|
(define faft (lambda (n) (faft_h faft_h n)))
|
||||||
|
|
||||||
(debug 'gonna_faft_it)
|
(debug 'gonna_faft_it)
|
||||||
(debug faft)
|
(debug faft)
|
||||||
(debug (faft 6))
|
(debug (faft 6))
|
||||||
|
|||||||
Reference in New Issue
Block a user