using System.Collections.Generic;
using static System.Linq.Enumerable;
using System.Text.RegularExpressions;
public dynamic Evaluate(List<Value> values);
public record class Atom(dynamic data) : Value
public dynamic Evaluate(List<Value> values) => data;
public record class Add(int first, int second) : Value
public dynamic Evaluate(List<Value> values)
var v1 = values[first].Evaluate(values);
var v2 = values[second].Evaluate(values);
public static Value Parse(dynamic v)
Match m = Regex.Match(v, @"(\w+)\((\d+), (\d+)\)");
var lhs = Int32.Parse(m.Groups[2].Value);
var rhs = Int32.Parse(m.Groups[3].Value);
switch (m.Groups[1].Value) {
case "ADD": return new Add(lhs, rhs);
public static void Main()
List<Value> parsed = JsonConvert.DeserializeObject<List<dynamic>>("[15, 'hello', 32, 11.12, 'ADD(0, 2)']")
.Select<dynamic, Value>(Parse)
List<dynamic> evaluated = parsed.Select(p => p.Evaluate(parsed)).ToList();
Console.WriteLine(JsonConvert.SerializeObject(evaluated));