static noeq transformable record FunctionCall(O function, O... args) { toString { ret function + "(" + joinWithComma(allToString(args)) + ")"; } public bool equals(O o) { ret o instanceof FunctionCall && eq(function, o/FunctionCall.function) && objectArraysEqual(args, o/FunctionCall.args); } public int hashCode() { ret hashAboutObjects(function, asList(args)); } L args() { ret asList(args); } }