aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sexp/util.rs25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/sexp/util.rs b/src/sexp/util.rs
index 1da9ccf..9b8e5dd 100644
--- a/src/sexp/util.rs
+++ b/src/sexp/util.rs
@@ -66,15 +66,22 @@ impl SExp {
}
pub fn parts(self) -> Vec<SExp> {
- match self {
- Atom(x) => vec![Atom(x)],
- SCons(a, b) if *b == Atom(Nil) => vec![*a],
- SCons(a, b) => {
- let mut res = vec![*a];
- res.extend_from_slice(&(*b).parts());
- res
- },
- }
+ let mut res = vec![];
+ let mut se = self;
+ loop {
+ match se {
+ Atom(Nil) => break,
+ Atom(x) => {
+ res.push(Atom(x));
+ break;
+ },
+ SCons(a, b) => {
+ res.push(*a);
+ se = *b;
+ }
+ }
+ }
+ res
}
pub fn check_let(self) -> Option<(String, SExp)> {