Fix partial strings ending in lists

This commit is contained in:
bakaq
2024-08-16 08:08:05 -03:00
parent 8736526b35
commit c1b88cee99

View File

@@ -227,7 +227,9 @@ impl Value {
Value::List(elems) Value::List(elems)
} }
}, },
_ => Value::Structure(".".into(), vec![head, tail]), _ => {
Value::Structure(".".into(), vec![head, tail])
}
}; };
term_stack.push(list); term_stack.push(list);
} }
@@ -326,37 +328,50 @@ impl Value {
(HeapCellValueTag::PStr, atom) => { (HeapCellValueTag::PStr, atom) => {
let tail = term_stack.pop().unwrap(); let tail = term_stack.pop().unwrap();
if let Value::Atom(atom) = tail { match tail {
if atom == "[]" { Value::Atom(atom) => {
term_stack.push(Value::String(atom.as_str().to_string())); if atom == "[]" {
} term_stack.push(Value::String(atom.as_str().to_string()));
} else { }
let mut list: Vec<Value> = atom },
.as_str() Value::List(l) => {
.to_string() let mut list: Vec<Value> = atom
.chars() .as_str()
.map(|x| Value::Atom(x.to_string())) .to_string()
.collect(); .chars()
.map(|x| Value::Atom(x.to_string()))
.collect();
list.extend(l.into_iter());
term_stack.push(Value::List(list));
},
_ => {
let mut list: Vec<Value> = atom
.as_str()
.to_string()
.chars()
.map(|x| Value::Atom(x.to_string()))
.collect();
let mut partial_list = Value::Structure( let mut partial_list = Value::Structure(
".".into(),
vec![
list.pop().unwrap(),
tail,
],
);
while let Some(last) = list.pop() {
partial_list = Value::Structure(
".".into(), ".".into(),
vec![ vec![
last, list.pop().unwrap(),
partial_list, tail,
], ],
); );
}
term_stack.push(partial_list); while let Some(last) = list.pop() {
partial_list = Value::Structure(
".".into(),
vec![
last,
partial_list,
],
);
}
term_stack.push(partial_list);
}
} }
} }
// I dont know if this is needed here. // I dont know if this is needed here.