moar debugging: find issues with upvalues

This commit is contained in:
Scott Richmond 2025-06-23 18:59:12 -04:00
parent 24f57c1529
commit 987cc172c1
6 changed files with 172 additions and 205 deletions

View File

@ -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?
}

View File

@ -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()

View File

@ -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());
}

View File

@ -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}");
}

View File

@ -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(),);
}
}
}

View File

@ -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();