Feat: UI/UX and ducking compressor
Some checks failed
Deploy Website / deploy (push) Failing after 4m52s
Some checks failed
Deploy Website / deploy (push) Failing after 4m52s
This commit is contained in:
@@ -799,16 +799,20 @@ impl Forth {
|
||||
drain_select_run(count, idx, stack, outputs, cmd)?;
|
||||
}
|
||||
|
||||
Op::Bounce(word_span) => {
|
||||
Op::Bounce(word_span) | Op::PBounce(word_span) => {
|
||||
let count = pop_int(stack)? as usize;
|
||||
if count == 0 {
|
||||
return Err("bounce count must be > 0".into());
|
||||
}
|
||||
let counter = match &ops[pc] {
|
||||
Op::Bounce(_) => ctx.runs,
|
||||
_ => ctx.iter,
|
||||
};
|
||||
let idx = if count == 1 {
|
||||
0
|
||||
} else {
|
||||
let period = 2 * (count - 1);
|
||||
let raw = ctx.runs % period;
|
||||
let raw = counter % period;
|
||||
if raw < count { raw } else { period - raw }
|
||||
};
|
||||
if let Some(span) = word_span {
|
||||
@@ -895,6 +899,47 @@ impl Forth {
|
||||
}
|
||||
}
|
||||
|
||||
Op::Except(word_span) => {
|
||||
let n = pop_int(stack)?;
|
||||
let quot = pop(stack)?;
|
||||
if n <= 0 {
|
||||
return Err("except count must be > 0".into());
|
||||
}
|
||||
let result = ctx.iter as i64 % n != 0;
|
||||
record_resolved(&trace_cell, *word_span, ResolvedValue::Bool(result));
|
||||
if result {
|
||||
run_quotation(quot, stack, outputs, cmd)?;
|
||||
}
|
||||
}
|
||||
|
||||
Op::EveryOffset(word_span) => {
|
||||
let offset = pop_int(stack)?;
|
||||
let n = pop_int(stack)?;
|
||||
let quot = pop(stack)?;
|
||||
if n <= 0 {
|
||||
return Err("every+ count must be > 0".into());
|
||||
}
|
||||
let result = ctx.iter as i64 % n == offset.rem_euclid(n);
|
||||
record_resolved(&trace_cell, *word_span, ResolvedValue::Bool(result));
|
||||
if result {
|
||||
run_quotation(quot, stack, outputs, cmd)?;
|
||||
}
|
||||
}
|
||||
|
||||
Op::ExceptOffset(word_span) => {
|
||||
let offset = pop_int(stack)?;
|
||||
let n = pop_int(stack)?;
|
||||
let quot = pop(stack)?;
|
||||
if n <= 0 {
|
||||
return Err("except+ count must be > 0".into());
|
||||
}
|
||||
let result = ctx.iter as i64 % n != offset.rem_euclid(n);
|
||||
record_resolved(&trace_cell, *word_span, ResolvedValue::Bool(result));
|
||||
if result {
|
||||
run_quotation(quot, stack, outputs, cmd)?;
|
||||
}
|
||||
}
|
||||
|
||||
Op::Bjork(word_span) | Op::PBjork(word_span) => {
|
||||
let n = pop_int(stack)?;
|
||||
let k = pop_int(stack)?;
|
||||
|
||||
Reference in New Issue
Block a user