Exemple #1
0
        public void TestFormatVariable()
        {
            var cases = new Dictionary <string, Erlang.TermType> {
                { "B", Erlang.TermType.Object },
                { "B::int()", Erlang.TermType.Int },
                { "B::integer()", Erlang.TermType.Int },
                { "B::string()", Erlang.TermType.String },
                { "B::atom()", Erlang.TermType.Atom },
                { "B::float()", Erlang.TermType.Double },
                { "B::double()", Erlang.TermType.Double },
                { "B::binary()", Erlang.TermType.Binary },
                { "B::bool()", Erlang.TermType.Boolean },
                { "B::boolean()", Erlang.TermType.Boolean },
                { "B::byte()", Erlang.TermType.Byte },
                { "B::char()", Erlang.TermType.Char },
                { "B::list()", Erlang.TermType.List },
                { "B::tuple()", Erlang.TermType.Tuple },
                { "B::pid()", Erlang.TermType.Pid },
                { "B::ref()", Erlang.TermType.Ref },
                { "B::reference()", Erlang.TermType.Ref },
                { "B::port()", Erlang.TermType.Port }
            };

            foreach (var p in cases)
            {
                Erlang.Object o = Erlang.Object.Format(p.Key);
                Assert.IsInstanceOf(typeof(Erlang.Var), o);
                Assert.AreEqual(p.Value, o.Cast <Erlang.Var>().VarTermType);
            }

            var pat1 = Erlang.Object.Format("{A::char(), B::tuple(), C::float(), D::list(), [E::string(), F::int()], G::bool()}");
            var obj1 = Erlang.Object.Format("{$a, {1,2,3}, 10.0, [5,6], [\"abc\", 190], true}");

            var binding = new Erlang.VarBind();

            Assert.IsTrue(pat1.match(obj1, binding)); // Match unbound variables
            Assert.IsTrue(pat1.match(obj1, binding)); // Match bound variables

            var obj2 = Erlang.Object.Format("{$a, {1,2,3}, 20.0, [5,6], [\"abc\", 190], true}");

            Assert.IsFalse(pat1.match(obj2, binding)); // Match bound variables

            binding.clear();

            var obj3 = Erlang.Object.Format("{$a, {1,2,3}, 10.0, [5,6], [\"abc\", bad], false}");

            Assert.IsFalse(pat1.match(obj3, binding));
        }
Exemple #2
0
        /// <summary>
        /// Match a term against the patterns in the collection.
        /// The first successful match will result in invokation of the action
        /// associated with the pattern
        /// </summary>
        /// <param name="term">Term to match against patterns</param>
        /// <returns>ID of the pattern that matched, or -1 if there were no matches</returns>
        public int Match <TErlTerm>(TErlTerm term, params object[] args) where TErlTerm : ErlObject
        {
            var binding = new VarBind();

            foreach (var p in m_patterns)
            {
                if (p.Term.match(term, binding))
                {
                    p.Action(p, term, binding, args);
                    return(p.ID);
                }
                binding.clear();
            }

            return(-1);
        }