public override async Task<object> Invoke(IExpression head, IExpression[] args) { var target = await head.Eval(this); var macro = target as PlasticMacro; var expression = target as IExpression; var array = target as object[]; if (macro != null) { return await InvokeMacro(this, macro, args); } if (expression != null) { return await expression.Eval(this); } if (array != null) { var index = (int)(decimal) await args.First().Eval(this); return array[index]; } throw new NotImplementedException(); }