diff --git a/docs/samples/happy_numbers.lyng b/docs/samples/happy_numbers.lyng index 1c8cedb..2bada4b 100644 --- a/docs/samples/happy_numbers.lyng +++ b/docs/samples/happy_numbers.lyng @@ -16,6 +16,9 @@ fun naiveCountHappyNumbers() { count } +// +// After all optimizations it takes ~120ms. +// val found = naiveCountHappyNumbers() println("Found happy numbers: "+found) -assert( found == 55252 ) +assert( found == 55252 ) \ No newline at end of file diff --git a/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt b/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt index 5a9973c..347f93f 100644 --- a/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt +++ b/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt @@ -749,9 +749,9 @@ class Compiler( var result: Obj = ObjVoid val iVar = ObjInt(0) loopVar.value = iVar - for( i in start ..< end) { - iVar.value = i.toLong() - if (catchBreak) + if( catchBreak) { + for (i in start.. ObjBool(a.isInstanceOf(b)) }, Operator.simple(Token.Type.NOTIS, lastPrty) { c, a, b -> ObjBool(!a.isInstanceOf(b)) }, // shuttle <=> 6 + Operator.simple(Token.Type.SHUTTLE, ++lastPrty) { c, a, b -> + ObjInt(a.compareTo(c, b).toLong()) }, // bit shifts 7 Operator.simple(Token.Type.PLUS, ++lastPrty) { ctx, a, b -> a.plus(ctx, b) }, Operator.simple(Token.Type.MINUS, lastPrty) { ctx, a, b -> a.minus(ctx, b) }, diff --git a/library/src/commonMain/kotlin/net/sergeych/lyng/Parser.kt b/library/src/commonMain/kotlin/net/sergeych/lyng/Parser.kt index 20f8903..d813038 100644 --- a/library/src/commonMain/kotlin/net/sergeych/lyng/Parser.kt +++ b/library/src/commonMain/kotlin/net/sergeych/lyng/Parser.kt @@ -153,7 +153,13 @@ private class Parser(fromPos: Pos) { '<' -> { if (currentChar == '=') { pos.advance() - Token("<=", from, Token.Type.LTE) + if( currentChar == '>' ) { + pos.advance() + Token("<=>", from, Token.Type.SHUTTLE) + } + else { + Token("<=", from, Token.Type.LTE) + } } else Token("<", from, Token.Type.LT) } diff --git a/library/src/commonMain/kotlin/net/sergeych/lyng/Token.kt b/library/src/commonMain/kotlin/net/sergeych/lyng/Token.kt index 556a47d..75fa942 100644 --- a/library/src/commonMain/kotlin/net/sergeych/lyng/Token.kt +++ b/library/src/commonMain/kotlin/net/sergeych/lyng/Token.kt @@ -13,6 +13,7 @@ data class Token(val value: String, val pos: Pos, val type: Type) { PLUS2, MINUS2, IN, NOTIN, IS, NOTIS, EQ, NEQ, LT, LTE, GT, GTE, REF_EQ, REF_NEQ, + SHUTTLE, AND, BITAND, OR, BITOR, NOT, BITNOT, DOT, ARROW, QUESTION, COLONCOLON, SINLGE_LINE_COMMENT, MULTILINE_COMMENT, LABEL, ATLABEL, // label@ at@label diff --git a/library/src/commonTest/kotlin/ScriptTest.kt b/library/src/commonTest/kotlin/ScriptTest.kt index 8e76856..c495862 100644 --- a/library/src/commonTest/kotlin/ScriptTest.kt +++ b/library/src/commonTest/kotlin/ScriptTest.kt @@ -1192,6 +1192,52 @@ class ScriptTest { fna(5,6) """ ) + } + + @Test + fun testSpoilLamdaArgsBug() = runTest { + eval( + """ + val fnb = { a,b -> a + b } + + val fna = { a, b -> + val a0 = a + val b0 = b + fnb(a + 1, b + 1) + assert( a0 == a ) + assert( b0 == b ) + } + + fna(5,6) + """ + ) + } + + @Test + fun commentBlocksShouldNotAlterBehavior() = runTest { + eval( + """ + fun test() { + 10 + /* + */ + //val x = 11 + } + assert( test() == 10 ) + """.trimIndent() + ) + } + + @Test + fun testShuttle() = runTest { + eval( + """ + assert( 5 <=> 3 > 0 ) + assert( 0 < 5 <=> 3 ) + assert( 5 <=> 5 == 0 ) + assert( 5 <=> 7 < 0 ) + """.trimIndent() + ) } } \ No newline at end of file diff --git a/library/src/jvmTest/kotlin/SamplesTest.kt b/library/src/jvmTest/kotlin/SamplesTest.kt index 2ab11ac..1165242 100644 --- a/library/src/jvmTest/kotlin/SamplesTest.kt +++ b/library/src/jvmTest/kotlin/SamplesTest.kt @@ -14,13 +14,12 @@ suspend fun executeSampleTests(fileName: String) { } runBlocking { val c = Context() - for( i in 1..1) { val start = Clock.System.now() c.eval(sample) val time = Clock.System.now() - start println("$time: $fileName") // delay(100) - } +// } } }