@CompileTimeCalculation fun withLambda(arg: Int, function: (Int) -> Int): Int { return function(arg) } const val a1 = withLambda(10) { it * 2 } const val a2 = withLambda(20, { num -> num * 2 }) const val a3 = withLambda(30, @CompileTimeCalculation fun(number: Int) = number * 2) @CompileTimeCalculation fun withLambda2(arg1: T, arg2: E, function: (T, E) -> R): R { return function.invoke(arg1, arg2) } const val b1 = withLambda2(5, 2.75) { arg1, arg2 -> arg1 * arg2 } const val b2 = withLambda2(5, "unused") { arg1, _ -> arg1 * 5 } @CompileTimeCalculation fun withLambdaAndReceiver(arg1: T, arg2: E, function: T.(E) -> R): R { return function.invoke(arg1, arg2) // arg1.function(arg2) } const val c1 = withLambdaAndReceiver(5, 2.75) { arg -> this.plus(arg) }