/// <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); } }
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); }
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 }