Skip to content

Commit c6ad9ae

Browse files
committed
fix a bug in under under
1 parent c7c8584 commit c6ad9ae

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

src/compile/invert/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ pub(crate) const DEBUG: bool = false;
3030

3131
macro_rules! dbgln {
3232
($($arg:tt)*) => {
33-
if DEBUG {
33+
if crate::compile::invert::DEBUG {
3434
println!($($arg)*); // Allow println
3535
}
3636
}
3737
}
38-
use dbgln;
38+
pub(crate) use dbgln;
3939

4040
trait AsNode: fmt::Debug + Sync {
4141
fn as_node(&self, span: usize) -> Node;

src/compile/modifier.rs

+31-29
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,7 @@ impl Compiler {
839839
node
840840
}
841841
Un => {
842+
invert::dbgln!("\n//////////////\n// begin UN //\n//////////////");
842843
let (sn, span) = self.monadic_modifier_op(modified)?;
843844
self.add_span(span.clone());
844845
let mut normal = sn.un_inverse(&self.asm);
@@ -847,15 +848,21 @@ impl Compiler {
847848
*e = InversionError::Pretty;
848849
}
849850
}
850-
let cust = CustomInverse {
851-
normal,
852-
un: Some(sn),
853-
..Default::default()
854-
};
855-
let span = self.add_span(modified.modifier.span.clone());
856-
Node::CustomInverse(cust.into(), span)
851+
invert::dbgln!("////////////\n// end UN //\n////////////\n");
852+
if let Ok(Node::CustomInverse(..)) = normal.as_ref().map(|sn| &sn.node) {
853+
normal.unwrap().node
854+
} else {
855+
let cust = CustomInverse {
856+
normal,
857+
un: Some(sn),
858+
..Default::default()
859+
};
860+
let span = self.add_span(modified.modifier.span.clone());
861+
Node::CustomInverse(cust.into(), span)
862+
}
857863
}
858864
Anti => {
865+
invert::dbgln!("\n////////////////\n// begin ANTI //\n////////////////");
859866
let (sn, span) = self.monadic_modifier_op(modified)?;
860867
self.add_span(span.clone());
861868
let normal = sn.anti_inverse(&self.asm);
@@ -866,9 +873,11 @@ impl Compiler {
866873
..Default::default()
867874
};
868875
let span = self.add_span(modified.modifier.span.clone());
876+
invert::dbgln!("//////////////\n// end ANTI //\n//////////////\n");
869877
Node::CustomInverse(cust.into(), span)
870878
}
871879
Under => {
880+
invert::dbgln!("\n/////////////////\n// begin UNDER //\n/////////////////");
872881
let (f, g, f_span, _) = self.dyadic_modifier_ops(modified)?;
873882
let normal = {
874883
let (f_before, f_after) = f
@@ -883,27 +892,19 @@ impl Compiler {
883892
};
884893
let span = self.add_span(modified.modifier.span.clone());
885894
let un = if normal.sig == (1, 1) || self.allow_experimental() {
886-
if f.sig.args() == f.sig.outputs() {
887-
let (f_before, f_after) = f
888-
.node
889-
.under_inverse(g.sig, true, &self.asm)
890-
.map_err(|e| self.error(f_span.clone(), e))?;
891-
(g.node.un_inverse(&self.asm).ok())
892-
.map(|g_inv| -> UiuaResult<SigNode> {
893-
let mut node = f_before;
894-
node.push(g_inv);
895-
node.push(f_after);
896-
let sig = self.sig_of(&node, &f_span)?;
897-
Ok(SigNode::new(sig, node))
898-
})
899-
.transpose()?
900-
} else {
901-
let cust = CustomInverse::from(InversionError::UnUnderSignature(f.sig));
902-
Some(SigNode::new(
903-
normal.sig.inverse(),
904-
Node::CustomInverse(cust.into(), span),
905-
))
906-
}
895+
let (f_before, f_after) = f
896+
.node
897+
.under_inverse(g.sig, true, &self.asm)
898+
.map_err(|e| self.error(f_span.clone(), e))?;
899+
(g.node.un_inverse(&self.asm).ok())
900+
.map(|g_inv| -> UiuaResult<SigNode> {
901+
let mut node = f_before;
902+
node.push(g_inv);
903+
node.push(f_after);
904+
let sig = self.sig_of(&node, &f_span)?;
905+
Ok(SigNode::new(sig, node))
906+
})
907+
.transpose()?
907908
} else {
908909
let cust = CustomInverse::from(InversionError::UnUnderExperimental);
909910
Some(SigNode::new(
@@ -912,7 +913,7 @@ impl Compiler {
912913
))
913914
};
914915
let under = if normal.sig.args() == normal.sig.outputs() {
915-
Some((normal.clone(), normal.clone()))
916+
un.clone().map(|un| (normal.clone(), un))
916917
} else {
917918
None
918919
};
@@ -923,6 +924,7 @@ impl Compiler {
923924
..Default::default()
924925
};
925926
let span = self.add_span(modified.modifier.span.clone());
927+
invert::dbgln!("///////////////\n// end UNDER //\n///////////////\n");
926928
Node::CustomInverse(cust.into(), span)
927929
}
928930
Obverse => {

tests/under.ua

+2
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,8 @@ F ← ⌅(+|⊃⌊(⍜×⁅1e12◿1)|⟜+|-|-)
432432

433433
# Under under
434434
⍤⤙≍ [1 2 3 4 5 0] ⍜⍜°⊏⇌(⊂0) +1⇡5
435+
⍤⤙≍ ⟜⍜⍜°⍉≡↻₁∘ [1_2_3 4_5_6 7_8_9]
436+
⍤⤙≍ ⟜⍜°⍜°⍉≡↻₁∘ [1_2_3 4_5_6 7_8_9]
435437

436438
# Reach
437439
⍤⤙≍ [4 ∞ 5] [⍜𝄐⊟+ 1 ∞ 2 3]

0 commit comments

Comments
 (0)