Skip to content

Commit

Permalink
Fix partial strings ending in lists
Browse files Browse the repository at this point in the history
  • Loading branch information
bakaq committed Aug 16, 2024
1 parent 8736526 commit c1b88ce
Showing 1 changed file with 42 additions and 27 deletions.
69 changes: 42 additions & 27 deletions src/machine/parsed_results.rs
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,9 @@ impl Value {
Value::List(elems)
}
},
_ => Value::Structure(".".into(), vec![head, tail]),
_ => {
Value::Structure(".".into(), vec![head, tail])
}
};
term_stack.push(list);
}
Expand Down Expand Up @@ -326,37 +328,50 @@ impl Value {
(HeapCellValueTag::PStr, atom) => {
let tail = term_stack.pop().unwrap();

if let Value::Atom(atom) = tail {
if atom == "[]" {
term_stack.push(Value::String(atom.as_str().to_string()));
}
} else {
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(
".".into(),
vec![
list.pop().unwrap(),
tail,
],
);

while let Some(last) = list.pop() {
partial_list = Value::Structure(
match tail {
Value::Atom(atom) => {
if atom == "[]" {
term_stack.push(Value::String(atom.as_str().to_string()));
}
},
Value::List(l) => {
let mut list: Vec<Value> = atom
.as_str()
.to_string()
.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(
".".into(),
vec![
last,
partial_list,
list.pop().unwrap(),
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.
Expand Down

0 comments on commit c1b88ce

Please sign in to comment.