[package]
name = "scryer-prolog"
-version = "0.8.50"
+version = "0.8.51"
repository = "https://github.com/mthom/scryer-prolog"
description = "A modern Prolog implementation written mostly in Rust."
downcast = "0.10.0"
num = "0.2"
ordered-float = "0.5.0"
-prolog_parser = "0.8.17"
+prolog_parser = "0.8.18"
readline_rs_compat = { version = "0.1.7", optional = true }
ref_thread_local = "0.0.0"
name.as_str() == "-" && is_prefix!(cell.assoc())
}
}
+
+ #[inline]
+ fn is_left(&self) -> bool {
+ if let &DirectedOp::Left(..) = self {
+ true
+ } else {
+ false
+ }
+ }
}
fn needs_bracketing(child_spec: &SharedOpDesc, op: &DirectedOp) -> bool
if child_spec.prec() > priority || (child_spec.prec() == priority && is_strict_left) {
true
} else if (is_postfix!(spec) || is_infix!(spec)) && !is_postfix!(child_spec.assoc()) {
- child_spec.prec() == priority
+ !SharedOpDesc::ptr_eq(&cell, &child_spec) && child_spec.prec() == priority
} else {
false
}
fn requires_space(atom: &str, op: &str) -> bool {
match atom.chars().last() {
Some(ac) => op.chars().next().map(|oc| {
- if alpha_numeric_char!(ac) {
+ if ac == '0' {
+ oc == 'b' || oc == 'x' || oc == 'o' || !non_quoted_token(op.chars())
+ } else if alpha_numeric_char!(ac) {
oc == '(' || alpha_numeric_char!(oc)
} else if graphic_token_char!(ac) {
graphic_token_char!(oc)
sign_char!(oc) || decimal_digit_char!(oc)
} else if single_quote_char!(ac) {
single_quote_char!(oc)
- } else if ac == '0' {
- oc == 'b' || oc == 'x' || oc == 'o' || !non_quoted_token(op.chars())
} else {
false
}
self.state_stack.push(TokenOrRedirect::Open);
if let Some(ref op) = &op {
- if requires_space(op.as_str(), "(") {
+ if op.is_left() && requires_space(op.as_str(), "(") {
self.state_stack.push(TokenOrRedirect::Space);
}
}