summaryrefslogtreecommitdiffstats
path: root/src/Var.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/Var.vala')
-rw-r--r--src/Var.vala58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/Var.vala b/src/Var.vala
new file mode 100644
index 0000000..1437ede
--- /dev/null
+++ b/src/Var.vala
@@ -0,0 +1,58 @@
+namespace Eva {
+ public class Var : Object, Term {
+ public string name {get; construct;}
+
+ public Var(string name0) {
+ assert(name0.get_char() == '_' || name0.get_char().isupper());
+
+ Object(name: name0);
+ }
+
+ public string to_string() {
+ return name;
+ }
+
+ internal static string alias(string key, Gee.Map<string, string> aliases) {
+ if(!(key in aliases))
+ return key;
+ else
+ return alias(aliases[key], aliases);
+ }
+
+ protected bool do_match(Term o, Gee.Map<string, Term> vars, Gee.Map<string, string> aliases) {
+ string key = alias(name, aliases);
+
+ if(o is Var) {
+ Var v = o as Var;
+ string vkey = alias(v.name, aliases);
+
+ if(key == vkey)
+ return true;
+
+ if(key in vars && vkey in vars)
+ return vars[key].do_match(vars[vkey], vars, aliases);
+ else if(!(vkey in vars)) {
+ aliases[vkey] = key;
+ return true;
+ }
+ else /* !(key in vars) */ {
+ aliases[key] = vkey;
+ return true;
+ }
+ }
+ else {
+ if(key in vars) {
+ return vars[key].do_match(o, vars, aliases);
+ }
+ else {
+ vars[key] = o;
+ return true;
+ }
+ }
+ }
+
+ public void encode(Erl.Buffer buffer) {
+ assert_not_reached();
+ }
+ }
+}