import kotlin.* import kotlin.collections.* @CompileTimeCalculation fun interface IntPredicate { fun accept(i: Int): Boolean fun defaultMethod() = 1 } const val isEven = IntPredicate { it % 2 == 0 } .let { predicate -> listOf(1, 2, 3, 4, 5).map { predicate.accept(it) }.joinToString() } const val isOdd = IntPredicate { it % 2 != 0 } .let { predicate -> listOf(1, 2, 3, 4, 5).map { predicate.accept(it) }.joinToString() } const val callToDefault = IntPredicate { false }.defaultMethod() const val callToString = IntPredicate { false }. kotlin.Boolean`!>toString() @CompileTimeCalculation fun interface KRunnable { fun invoke(): String } @CompileTimeCalculation object OK : () -> String { override fun invoke(): String = "OK" } @CompileTimeCalculation fun foo(k: KRunnable) = k.invoke() const val invokeFromObject = foo(OK) const val invokeFromFunInterface = foo(KRunnable { "OK" })