aboutsummaryrefslogtreecommitdiff
path: root/src/sexp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sexp')
-rw-r--r--src/sexp/mod.rs2
-rw-r--r--src/sexp/subst.rs10
2 files changed, 9 insertions, 3 deletions
diff --git a/src/sexp/mod.rs b/src/sexp/mod.rs
index d866be5..dee672f 100644
--- a/src/sexp/mod.rs
+++ b/src/sexp/mod.rs
@@ -9,6 +9,7 @@ pub mod subst;
/// variables, functions (to be added) or values.
#[derive(Debug)]
#[derive(PartialEq)]
+#[derive(Clone)]
pub enum SLeaf {
Add,
Sub,
@@ -24,6 +25,7 @@ pub enum SLeaf {
/// IETF-standardized s-expressions; they are only inspiration.
#[derive(Debug)]
#[derive(PartialEq)]
+#[derive(Clone)]
pub enum SExp {
SCons(Box<SExp>, Box<SExp>),
Atom(SLeaf),
diff --git a/src/sexp/subst.rs b/src/sexp/subst.rs
index 7cfa180..abab614 100644
--- a/src/sexp/subst.rs
+++ b/src/sexp/subst.rs
@@ -11,11 +11,15 @@ impl SExp {
/// use melisp::sexp::{SExp::*, SLeaf::*, util::*};
///
/// assert_eq!(
- /// scons(Add, scons(var("a"), var("b"))).subst("b", scons(Sub, scons(2, 1))),
+ /// scons(Add, scons(var("a"), var("b"))).subst("b", &scons(Sub, scons(2, 1))),
/// scons(Add, scons(var("a"), scons(Sub, scons(2, 1))))
/// );
/// ```
- pub fn subst(self, name: &str, value: SExp) -> SExp {
- todo!();
+ pub fn subst(self, name: &str, value: &SExp) -> SExp {
+ match self {
+ SCons(a, b) => scons((*a).subst(name, value), (*b).subst(name, value)),
+ Atom(Var(x)) if x == name => value.clone(),
+ t => t,
+ }
}
}