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