private ElaValue Read(ElaExpression exp, string str) { switch (exp.Type) { case ElaNodeType.ListLiteral: { var n = (ElaListLiteral)exp; var arr = new ElaValue[n.Values.Count]; for (var i = 0; i < arr.Length; i++) { arr[i] = Read(n.Values[i], str); } return(new ElaValue(ElaList.FromEnumerable(arr))); } case ElaNodeType.TupleLiteral: { var n = (ElaTupleLiteral)exp; var arr = new ElaValue[n.Parameters.Count]; for (var i = 0; i < arr.Length; i++) { arr[i] = Read(n.Parameters[i], str); } return(new ElaValue(new ElaTuple(arr))); } case ElaNodeType.RecordLiteral: { var n = (ElaRecordLiteral)exp; var arr = new ElaRecordField[n.Fields.Count]; for (var i = 0; i < arr.Length; i++) { var f = n.Fields[i]; arr[i] = new ElaRecordField(f.FieldName, Read(f.FieldValue, str)); } return(new ElaValue(new ElaRecord(arr))); } case ElaNodeType.Primitive: { var n = (ElaPrimitive)exp; switch (n.Value.LiteralType) { case ElaTypeCode.Integer: return(new ElaValue(n.Value.AsInteger())); case ElaTypeCode.Single: return(new ElaValue(n.Value.AsReal())); case ElaTypeCode.Double: return(new ElaValue(n.Value.AsDouble())); case ElaTypeCode.Long: return(new ElaValue(n.Value.AsLong())); case ElaTypeCode.Char: return(new ElaValue(n.Value.AsChar())); case ElaTypeCode.Boolean: return(new ElaValue(n.Value.AsBoolean())); case ElaTypeCode.String: return(new ElaValue(n.Value.AsString())); default: throw Fail(str); } } case ElaNodeType.UnitLiteral: return(new ElaValue(ElaUnit.Instance)); default: throw Fail(str); } }
private ElaRecord ConvertToRecord() { var fields = new ElaRecordField[Map.Count]; var c = 0; foreach (var kv in Map) fields[c++] = new ElaRecordField(kv.Key.ToString(), kv.Value); return new ElaRecord(fields); }