Beispiel #1
0
        /// <summary>
        /// Compares 2 therms in assuming they are in the given type
        /// </summary>
        /// <param name="therms">(type:th1:th2)</param>
        /// <returns>Equals, 1 is false and 0 is true; Compare \< is 1, \> is 2, 0 is = </returns>
        private int Compare(string therms)
        {
            var elemtents = therms.Replace("(", "").Replace(")", "").Split('|');
            var cmp_type  = elemtents.ElementAtOrDefault(0); //Type
            var first     = elemtents.ElementAtOrDefault(1); //First
            var second    = elemtents.ElementAtOrDefault(2); //Second

            first  = Getter(first);
            second = Getter(second);
            var type     = Type.GetType(cmp_type) ?? TypeAliasContainer.GetFromAlias(cmp_type);
            var variable = GetVariableOfType(type);

            if ((variable is IComparable) && (variable is IConvertible))
            {
                var new_f    = Convert.ChangeType(first, type);
                var new_s    = Convert.ChangeType(second, type);
                var compared = ((dynamic)new_f).CompareTo(new_s);
                return(compared == 0 ? 0 : compared == -1?1:compared == 1?2:-1);
            }
            else if (variable is IConvertible)
            {
                var new_f = Convert.ChangeType(first, type);
                var new_s = Convert.ChangeType(second, type);
                return(new_f.Equals(new_s) ? 0 : 1);
            }
            else
            {
                return(((object)first).Equals((object)second) ? 0 : 1);
            }
        }
Beispiel #2
0
        private void HandleToRam(string generator)
        {
            var dst1  = generator.Split(':');
            var name  = dst1.ElementAtOrDefault(0); //Name
            var value = dst1.ElementAtOrDefault(1); //Value
            var type  = dst1.ElementAtOrDefault(2); //Type

            //Remove if exsists the variable from ram
            if (Ram.Any((s) => s.Name == name))
            {
                Ram.Remove(Ram.First((s) => s.Name == name));
            }
            //The variable is not in ram and has to be created
            var actual_type = Type.GetType(type) ?? TypeAliasContainer.GetFromAlias(type);

            if (actual_type == null)
            {
                throw new InvalidVariableTypeException(string.Format("The type {0} is not a valid .Net or SelfLanguage type", type));
            }
            var convert = Conversion.GetConversion(actual_type);
            var obj     = GetVariableOfType(actual_type);

            if (convert.Any(s => s == PossibleConversion.IStringable))
            {
                dynamic o = obj;
                Ram.Add(new Variable(o.FromString(value), name));
            }
            else if (convert.Any(s => s == PossibleConversion.IConvertible))
            {
                var o = Convert.ChangeType(value, obj.GetType());
                Ram.Add(new Variable(o, name));
            }
            else if (convert.Any(s => s == PossibleConversion.Constructor))
            {
                var o = obj.GetType().GetConstructors().First((s) => s.GetParameters().Length == 1 && s.GetParameters().First().GetType() == typeof(string));
                Ram.Add(new Variable(o, name));
            }
            else if (convert.Any(s => s == PossibleConversion.FromStringImplicit))  //is the type implicitally convertible from string
            {
                obj = value;
                Ram.Add(new Variable(obj, name));
            }
            else if (convert.Any(s => s == PossibleConversion.FromStringExplicit))
            {
                obj = value; //TODO
            }
            else if (obj.GetType() is object)
            {
                obj = value;
                Ram.Add(new Variable(obj, name));
            }
            else
            {
                throw new InvalidVariableTypeException("The type {0} is not castable or convertible from string, and it does not have a constructor using one string argument");
            }
        }