From 987cc172c1050b7ebc74f87ccd07f87d9e36f462 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Mon, 23 Jun 2025 18:59:12 -0400 Subject: [PATCH] moar debugging: find issues with upvalues --- assets/test_prelude.ld | 293 +++++++++++++++++++++-------------------- sandbox.ld | 48 +------ src/compiler.rs | 16 ++- src/main.rs | 10 +- src/value.rs | 4 +- src/vm.rs | 6 +- 6 files changed, 172 insertions(+), 205 deletions(-) diff --git a/assets/test_prelude.ld b/assets/test_prelude.ld index 963e67f..6cfc2c5 100644 --- a/assets/test_prelude.ld +++ b/assets/test_prelude.ld @@ -1210,168 +1210,171 @@ fn penwidth { box state = nil #{ - type - coll? - ordered? - assoc? - nil? - some? - some - eq? - bool? - true? - false? - bool - not - tuple? - fn? - first - rest - inc - dec - count - empty? - any? - list? - list - first - fold - foldr + apply_command + add_command! + + abs + abs + add + angle + any? append - map - filter - keep - concat - contains? - print! - show - report! - doc! - string - string? - join - split - trim - upcase - downcase + assert! + assoc + assoc? + at + atan/2 + back! + background! + between? + bg! + bk! + bool + bool? + box? + butlast + ceil chars chars/safe - ws? - strip - words - sentence - to_number - box? - unbox - store! - update! - add - sub - mult + clear! + coll? + colors + concat + contains? + cos + count + dec + deg/rad + deg/turn + dict + dict? + dissoc + dist div div/0 div/safe + doc! + downcase + each! + empty? + eq? + err + err? + even? + false? + fd! + filter + first + first + first + floor + fn? + fold + foldr + forward! + get + goto! + gt? + gte? + has? + heading + heading/vector + hideturtle! + home! + inc inv inv/0 inv/safe - abs - neg - zero? - gt? - gte? + join + keep + keys + keyword? + last + left! + list + list? + loadstate! + lt! lt? lte? - between? - neg? - pos? - abs - pi - tau - turn/deg - deg/turn - turn/rad - rad/turn - deg/rad - rad/deg - sin - cos - tan - rotate - atan/2 - angle + map mod mod/0 mod/safe - even? + mult + neg + neg? + nil? + not odd? - square - sqrt - sqrt/safe - dist - heading/vector - floor - ceil - round - range - at - first - second - last - butlast - slice - keyword? - assoc - dissoc - update - keys - values - get - has? - dict - dict? - each! - random - random_int ok ok? - err - err? + ordered? + pc! + pd! + pencolor + pencolor! + pendown! + pendown? + penup! + penwidth + penwidth! + pi + pos? + position + print! + pu! + pw! + rad/deg + rad/turn + random + random_int + range + report! + rest + right! + rotate + round + rt! + second + sentence + setheading! + show + showturtle! + sin + slice + some + some? + split + sqrt + sqrt/safe + square + state + store! + string + string? + strip + sub + tan + tau + to_number + trim + true? + tuple? + turn/deg + turn/rad + turtle_commands + turtle_init + turtle_state + type + unbox unwrap! unwrap_or - assert! - colors - turtle_init - turtle_commands - turtle_state - forward! - fd! - back! - bk! - left! - lt! - right! - rt! - penup! - pu! - pendown! - pd! - pencolor! - pc! - penwidth! - pw! - background! - bg! - home! - clear! - goto! - setheading! - showturtle! - hideturtle! - loadstate! - position - heading - pendown? - pencolor - penwidth - state + upcase + update + update! + values + words + ws? + zero? } diff --git a/sandbox.ld b/sandbox.ld index 0ec6ada..2590afc 100644 --- a/sandbox.ld +++ b/sandbox.ld @@ -1,46 +1,6 @@ -let state = #{:position (0, 0), :heading 0, :pencolor :white} +let add = :foo +let nil? = :bar -let command = (:forward, 10) - -& match command with { -& & (:goto, (x, y)) -> assoc (state, :position, (x, y)) -& & (:home) -> do state > -& & assoc (_, :position, (0, 0)) > -& & assoc (_, :heading, 0) -& & (:clear) -> do state > -& & assoc (state, :position, (0, 0)) > -& & assoc (_, :heading, 0) -& & (:right, turns) -> update (state, :heading, add (_, turns)) -& & (:left, turns) -> update (state, :heading, sub (_, turns)) -& (:forward, steps) -> { -& print! ("matched forward") -& let #{heading, position, ...} = state -& print! ("extracted {heading} and {position} from state") -& let unit = heading/vector (heading) -& print! ("unit vector at {heading}: {unit}") -& let vect = mult (steps, unit) -& print! ("update vector: {vect}") -& let new_state = update (state, :position, add (vect, _)) -& print! ("new state: {new_state}") -& new_state -& } -& & (:back, steps) -> { -& & let #{heading, position, ...} = state -& & let unit = heading/vector (heading) -& & let vect = mult (steps, unit) -& & update (state, :position, sub (_, vect)) -& & } -& & (:penup) -> assoc (state, :pendown?, false) -& & (:pendown) -> assoc (state, :pendown?, true) -& & (:penwidth, pixels) -> assoc (state, :penwidth, pixels) -& & (:pencolor, color) -> assoc (state, :pencolor, color) -& & (:setheading, heading) -> assoc (state, :heading, heading) -& & (:loadstate, position, heading, visible?, pendown?, penwidth, pencolor) -> #{position, heading, visible?, pendown?, penwidth, pencolor} -& & (:show) -> assoc (state, :visible?, true) -& & (:hide) -> assoc (state, :visible?, false) -& & (:background, _) -> state -& } -let #{heading, position, ...x} = state -let unit = heading/vector (heading) -unit +fn baz () -> (add, nil?) +baz() diff --git a/src/compiler.rs b/src/compiler.rs index e461456..424b094 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -393,10 +393,12 @@ impl<'a> Compiler<'a> { } fn msg(&mut self, str: String) { - self.emit_op(Op::Msg); - self.emit_byte(self.chunk.msgs.len()); - println!("{str}"); - self.chunk.msgs.push(str); + if self.debug { + self.emit_op(Op::Msg); + self.emit_byte(self.chunk.msgs.len()); + println!("{str}"); + self.chunk.msgs.push(str); + } } fn report_depth(&mut self, label: &'static str) { @@ -750,18 +752,18 @@ impl<'a> Compiler<'a> { } Splattern(patt) => self.visit(patt), InterpolatedPattern(parts, _) => { - println!("An interpolated pattern of {} parts", parts.len()); + // println!("An interpolated pattern of {} parts", parts.len()); let mut pattern = "".to_string(); let mut words = vec![]; for (part, _) in parts { match part { StringPart::Word(word) => { - println!("wordpart: {word}"); + // println!("wordpart: {word}"); words.push(word.clone()); pattern.push_str("(.*)"); } StringPart::Data(data) => { - println!("datapart: {data}"); + // println!("datapart: {data}"); let data = regex::escape(data); pattern.push_str(data.as_str()); } diff --git a/src/main.rs b/src/main.rs index 70eb87e..a34dcd1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,8 +3,8 @@ use imbl::HashMap; use std::env; use std::fs; -const DEBUG_SCRIPT_COMPILE: bool = true; -const DEBUG_SCRIPT_RUN: bool = true; +const DEBUG_SCRIPT_COMPILE: bool = false; +const DEBUG_SCRIPT_RUN: bool = false; const DEBUG_PRELUDE_COMPILE: bool = false; const DEBUG_PRELUDE_RUN: bool = false; @@ -146,10 +146,12 @@ pub fn run(src: &'static str) { let mut vm = Vm::new(vm_chunk, DEBUG_SCRIPT_RUN); let result = vm.run(); let output = match result { - Ok(val) => val.show(), + Ok(val) => val.to_string(), Err(panic) => format!("Ludus panicked! {panic}"), }; - vm.print_stack(); + if DEBUG_SCRIPT_RUN { + vm.print_stack(); + } println!("{output}"); } diff --git a/src/value.rs b/src/value.rs index 12d94cb..2f1e8c4 100644 --- a/src/value.rs +++ b/src/value.rs @@ -26,8 +26,10 @@ impl LFn { match self { LFn::Declared { .. } => unreachable!(), LFn::Defined { closed, .. } => { - println!("closing over in {}: {}", self.name(), value.show()); + let shown = value.show(); closed.borrow_mut().push(value); + let pos = closed.borrow().len(); + println!("closing over in {} at {pos}: {shown}", self.name(),); } } } diff --git a/src/vm.rs b/src/vm.rs index d6dd717..a5e3365 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -948,8 +948,6 @@ impl Vm { frame.ip = self.ip; self.ip = 0; - - if crate::DEBUG_SCRIPT_RUN {} } Value::BaseFn(base_fn) => { let value = match (arity, base_fn) { @@ -1014,7 +1012,7 @@ impl Vm { let val = self.pop(); - if crate::DEBUG_SCRIPT_RUN { + if self.debug { println!("=== calling into {val}/{arity} ==="); } @@ -1099,7 +1097,7 @@ impl Vm { } } Return => { - if crate::DEBUG_SCRIPT_RUN { + if self.debug { println!("== returning from {} ==", self.frame.function.show()) } self.frame = self.call_stack.pop().unwrap();