示例#1
0
 /// <summary>
 /// Evaluates any type of object.
 /// </summary>
 /// <param name="o"></param>
 /// <returns></returns>
 public static object Evaluate(object o)
 {
     if (o is Water.List)
     {
         Water.List list = (Water.List)o;
         return(Apply(list.First(), list.NotFirst()));
     }
     else if (o is Water.Identifier)
     {
         return(EvaluateIdentifier((Water.Identifier)o));
     }
     else if (o is string)
     {
         return(EvaluateString((string)o));
     }
     else if (o is Water.Quote)
     {
         Water.Quote quote = (Water.Quote)o;
         return(quote.Evaluate(new Water.List()));
     }
     else
     {
         return(o);
     }
 }
示例#2
0
        public override void Evaluate(Water.List expressions, Water.List statements)
        {
            if (!(expressions[0] is Water.Identifier))
            {
                throw new Water.Error("Invalid arguments.\n\t" + expressions.ToString());
            }
            string name = ((Water.Identifier)expressions[0]).Value;

            string namespace_ = (string)Water.Environment.Identify("_Namespace");

            if (namespace_ != null && namespace_.Length > 0)
            {
                name = namespace_ + "." + name;
            }

            Water.Functions.Function function = new Water.Functions.Function(name);

            for (int i = 1; i < expressions.Count; i++)
            {
                if (expressions[i] is Water.Identifier)
                {
                    Water.Identifier identifier = (Water.Identifier)expressions[i];
                    function.Parameters.Add(identifier);
                }
                else if ((expressions[i] is Water.Quote))
                {
                    Water.Quote      quote      = (Water.Quote)expressions[i];
                    Water.Identifier identifier = (Water.Identifier)quote.Expression;
                    function.Parameters.Add(new Water.Identifier("'" + identifier.Value));
                }
                else
                {
                    throw new Water.Error("'" + expressions[i] + "' is not a valid parameter name.");
                }
            }

            foreach (Water.Statement statement in statements)
            {
                function.Statements.Add(statement);
            }

            bool hasOptional = HasOptional(function.Parameters);
            bool hasRest     = HasRest(function.Parameters);

            if (hasOptional && hasRest)
            {
                throw new Water.Error("Cannot have both optional and rest parameters: " + name);
            }
            else if (hasRest)
            {
                CheckRestLegal(name, function.Parameters);
            }

            Water.Environment.DefineConstant(function.Name, function);
        }
示例#3
0
        public static void Generate(object value, Water.TextWriter writer)
        {
            #region Generate

            if (value == null)
            {
                writer.WriteLine("null");
            }
            else if (value is bool)
            {
                bool b = (bool)value;

                writer.WriteLine(b.ToString());
            }
            else if (value is byte)
            {
                byte n = (byte)value;

                writer.WriteLine(n.ToString());
            }
            else if (value is char)
            {
                char ch = (char)value;

                writer.WriteLine(ch.ToString());
            }
            else if (value is short)
            {
                short n = (short)value;

                writer.WriteLine(n.ToString());
            }
            else if (value is int)
            {
                int n = (int)value;

                writer.WriteLine(n.ToString());
            }
            else if (value is long)
            {
                long n = (long)value;

                writer.WriteLine(n.ToString());
            }
            else if (value is decimal)
            {
                decimal d = (decimal)value;

                writer.WriteLine(d.ToString());
            }
            else if (value is float)
            {
                float f = (float)value;

                writer.WriteLine(f.ToString());
            }
            else if (value is double)
            {
                double d = (double)value;

                writer.WriteLine(d.ToString());
            }
            else if (value is System.DateTime)
            {
                System.DateTime dt = (System.DateTime)value;

                writer.WriteLine(dt.ToString());
            }
            else if (value is Water.Identifier)
            {
                Water.Identifier identifier = (Water.Identifier)value;

                writer.WriteLine(identifier.Value);
            }
            else if (value is Water.Quote)
            {
                Water.Quote quote = (Water.Quote)value;

                writer.Write("\'");
                Generate(quote.Expression, writer);
            }
            else if (value is Water.Comma)
            {
                Water.Comma comma = (Water.Comma)value;

                writer.Write(",");
                Generate(comma.Expression, writer);
            }
            else if (value is byte[])
            {
                byte[] bytes = (byte[])value;

                writer.Write("[");
                writer.Write(System.Convert.ToBase64String(bytes));
                writer.WriteLine("]");
            }
            else if (value is string)
            {
                string s = (string)value;

                writer.WriteLine("\"" + Escape(s) + "\"");
            }
            else if (value is System.Enum)
            {
                System.Enum enum_ = (System.Enum)value;

                writer.WriteLine(enum_.ToString());
            }
            else if ((value is System.Collections.IDictionary))
            {
                System.Collections.IDictionary dictionary = (System.Collections.IDictionary)value;

                writer.WriteLine("{");
                writer.Indent();

                bool first = true;
                foreach (object key in dictionary.Keys)
                {
                    try
                    {
                        object dictionaryValue = dictionary[key];
                        if (writer.NewlineString.Length == 0)
                        {
                            if (first)
                            {
                                first = false;
                            }
                            else
                            {
                                writer.Write(" ");
                            }
                        }

                        writer.Write(key.ToString() + ": ");
                        Generate(dictionaryValue, writer);
                    }
                    catch (System.Exception exception)
                    {
                        string thisIsAHackToIgnoreCompilerWarning = exception.Message;
                    }
                }

                writer.Unindent();
                writer.WriteLine("}");
            }
            else if ((value is Water.Dictionary))
            {
                //Water.Dictionary dictionary = (Water.Dictionary)value;

                //DUP
                writer.WriteLine("{");
                writer.Indent();

                bool first = true;

                System.Type type = value.GetType();
                foreach (System.Reflection.FieldInfo fieldInfo in type.GetFields())
                {
                    if (!fieldInfo.IsStatic)
                    {
                        try
                        {
                            object fieldValue = fieldInfo.GetValue(value);
                            if (writer.NewlineString.Length == 0)
                            {
                                if (first)
                                {
                                    first = false;
                                }
                                else
                                {
                                    writer.Write(" ");
                                }
                            }

                            writer.Write(fieldInfo.Name + ": ");
                            Generate(fieldValue, writer);
                        }
                        catch (System.Exception exception)
                        {
                            string thisIsAHackToIgnoreCompilerWarning = exception.Message;
                        }
                    }
                }

                System.ComponentModel.PropertyDescriptorCollection propertyDescriptors = System.ComponentModel.TypeDescriptor.GetProperties(value);
                foreach (System.ComponentModel.PropertyDescriptor propertyDescriptor in propertyDescriptors)
                {
                    try
                    {
                        object propertyValue = propertyDescriptor.GetValue(value);
                        if (writer.NewlineString.Length == 0)
                        {
                            if (first)
                            {
                                first = false;
                            }
                            else
                            {
                                writer.Write(" ");
                            }
                        }

                        writer.Write(propertyDescriptor.Name + ": ");
                        Generate(propertyValue, writer);
                    }
                    catch (System.Exception exception)
                    {
                        string thisIsAHackToIgnoreCompilerWarning = exception.Message;
                    }
                }

                writer.Unindent();
                writer.WriteLine("}");
            }
            else if (Water.Instructions.IsList(value))
            {
                System.Collections.IEnumerable list = (System.Collections.IEnumerable)value;

                writer.WriteLine("(");
                writer.Indent();

                bool first = true;
                foreach (object item in list)
                {
                    if (writer.NewlineString.Length == 0)
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            writer.Write(" ");
                        }
                    }

                    Generate(item, writer);
                }

                writer.Unindent();
                writer.WriteLine(")");
            }
            else
            {
                //DUP
                writer.WriteLine("{");
                writer.Indent();

                bool first = true;

                System.Type type = value.GetType();
                foreach (System.Reflection.FieldInfo fieldInfo in type.GetFields())
                {
                    if (!fieldInfo.IsStatic)
                    {
                        try
                        {
                            object fieldValue = fieldInfo.GetValue(value);
                            if (writer.NewlineString.Length == 0)
                            {
                                if (first)
                                {
                                    first = false;
                                }
                                else
                                {
                                    writer.Write(" ");
                                }
                            }

                            writer.Write(fieldInfo.Name + ": ");
                            Generate(fieldValue, writer);
                        }
                        catch (System.Exception exception)
                        {
                            string thisIsAHackToIgnoreCompilerWarning = exception.Message;
                        }
                    }
                }

                System.ComponentModel.PropertyDescriptorCollection propertyDescriptors = System.ComponentModel.TypeDescriptor.GetProperties(value);
                foreach (System.ComponentModel.PropertyDescriptor propertyDescriptor in propertyDescriptors)
                {
                    try
                    {
                        object propertyValue = propertyDescriptor.GetValue(value);
                        if (writer.NewlineString.Length == 0)
                        {
                            if (first)
                            {
                                first = false;
                            }
                            else
                            {
                                writer.Write(" ");
                            }
                        }

                        writer.Write(propertyDescriptor.Name + ": ");
                        Generate(propertyValue, writer);
                    }
                    catch (System.Exception exception)
                    {
                        string thisIsAHackToIgnoreCompilerWarning = exception.Message;
                    }
                }

                writer.Unindent();
                writer.WriteLine("}");
            }

            writer.Flush();

            #endregion
        }