diff options
Diffstat (limited to 'src/Atom.vala')
-rw-r--r-- | src/Atom.vala | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/Atom.vala b/src/Atom.vala new file mode 100644 index 0000000..bb3a6fd --- /dev/null +++ b/src/Atom.vala @@ -0,0 +1,54 @@ +namespace Eva { + public class Atom : Object, Term { + public string value {get; construct;} + + public Atom(string v) { + assert(v.validate()); + Object(value: v); + } + + public string to_string() { + if(value.length == 0) + return "''"; + + bool special = false; + unichar c = value.get_char(); + + if(!c.islower()) + special = true; + + for(unowned string rest = value.next_char(); rest.length != 0 && !special; rest = rest.next_char()) { + c = rest.get_char(); + + if(!(c == '_' || c.isalnum())) + special = true; + } + + if(!special) { + return value; + } + else { + return "'" + value.replace("\\", "\\\\").replace("'", "\\'") + "'"; + } + } + + protected bool do_match(Term o, Gee.Map<string, Term> vars, Gee.Map<string, string> aliases) { + if(o is Var) { + return o.do_match(this, vars, aliases); + } + + if(o is Atom) { + return value == (o as Atom).value; + } + else { + return false; + } + } + + public void encode(Erl.Buffer buffer) { + char[]? array = string_to_array(value); + assert(array != null); + buffer.encode_atom(array); + } + } +} |