shuttle operator <=>
This commit is contained in:
		
							parent
							
								
									b331f4edaa
								
							
						
					
					
						commit
						75d90d7228
					
				@ -16,6 +16,9 @@ fun naiveCountHappyNumbers() {
 | 
				
			|||||||
    count
 | 
					    count
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// After all optimizations it takes ~120ms.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
val found = naiveCountHappyNumbers()
 | 
					val found = naiveCountHappyNumbers()
 | 
				
			||||||
println("Found happy numbers: "+found)
 | 
					println("Found happy numbers: "+found)
 | 
				
			||||||
assert( found == 55252 )
 | 
					assert( found == 55252 )
 | 
				
			||||||
@ -749,9 +749,9 @@ class Compiler(
 | 
				
			|||||||
        var result: Obj = ObjVoid
 | 
					        var result: Obj = ObjVoid
 | 
				
			||||||
        val iVar = ObjInt(0)
 | 
					        val iVar = ObjInt(0)
 | 
				
			||||||
        loopVar.value = iVar
 | 
					        loopVar.value = iVar
 | 
				
			||||||
        for( i in start ..< end) {
 | 
					        if( catchBreak) {
 | 
				
			||||||
            iVar.value = i.toLong()
 | 
					            for (i in start..<end) {
 | 
				
			||||||
            if (catchBreak)
 | 
					                iVar.value = i.toLong()
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    result = body.execute(forContext)
 | 
					                    result = body.execute(forContext)
 | 
				
			||||||
                } catch (lbe: LoopBreakContinueException) {
 | 
					                } catch (lbe: LoopBreakContinueException) {
 | 
				
			||||||
@ -760,7 +760,10 @@ class Compiler(
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    return lbe.result
 | 
					                    return lbe.result
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            else {
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            for (i in start.toLong()..<end.toLong()) {
 | 
				
			||||||
 | 
					                iVar.value = i
 | 
				
			||||||
                result = body.execute(forContext)
 | 
					                result = body.execute(forContext)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -1181,6 +1184,8 @@ class Compiler(
 | 
				
			|||||||
            Operator.simple(Token.Type.IS, lastPrty) { c, a, b -> ObjBool(a.isInstanceOf(b)) },
 | 
					            Operator.simple(Token.Type.IS, lastPrty) { c, a, b -> ObjBool(a.isInstanceOf(b)) },
 | 
				
			||||||
            Operator.simple(Token.Type.NOTIS, lastPrty) { c, a, b -> ObjBool(!a.isInstanceOf(b)) },
 | 
					            Operator.simple(Token.Type.NOTIS, lastPrty) { c, a, b -> ObjBool(!a.isInstanceOf(b)) },
 | 
				
			||||||
            // shuttle <=> 6
 | 
					            // shuttle <=> 6
 | 
				
			||||||
 | 
					            Operator.simple(Token.Type.SHUTTLE, ++lastPrty) { c, a, b ->
 | 
				
			||||||
 | 
					                ObjInt(a.compareTo(c, b).toLong()) },
 | 
				
			||||||
            // bit shifts 7
 | 
					            // bit shifts 7
 | 
				
			||||||
            Operator.simple(Token.Type.PLUS, ++lastPrty) { ctx, a, b -> a.plus(ctx, b) },
 | 
					            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) },
 | 
					            Operator.simple(Token.Type.MINUS, lastPrty) { ctx, a, b -> a.minus(ctx, b) },
 | 
				
			||||||
 | 
				
			|||||||
@ -153,7 +153,13 @@ private class Parser(fromPos: Pos) {
 | 
				
			|||||||
            '<' -> {
 | 
					            '<' -> {
 | 
				
			||||||
                if (currentChar == '=') {
 | 
					                if (currentChar == '=') {
 | 
				
			||||||
                    pos.advance()
 | 
					                    pos.advance()
 | 
				
			||||||
                    Token("<=", from, Token.Type.LTE)
 | 
					                    if( currentChar == '>' ) {
 | 
				
			||||||
 | 
					                        pos.advance()
 | 
				
			||||||
 | 
					                        Token("<=>", from, Token.Type.SHUTTLE)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else {
 | 
				
			||||||
 | 
					                        Token("<=", from, Token.Type.LTE)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                } else
 | 
					                } else
 | 
				
			||||||
                    Token("<", from, Token.Type.LT)
 | 
					                    Token("<", from, Token.Type.LT)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -13,6 +13,7 @@ data class Token(val value: String, val pos: Pos, val type: Type) {
 | 
				
			|||||||
        PLUS2, MINUS2,
 | 
					        PLUS2, MINUS2,
 | 
				
			||||||
        IN, NOTIN, IS, NOTIS,
 | 
					        IN, NOTIN, IS, NOTIS,
 | 
				
			||||||
        EQ, NEQ, LT, LTE, GT, GTE, REF_EQ, REF_NEQ,
 | 
					        EQ, NEQ, LT, LTE, GT, GTE, REF_EQ, REF_NEQ,
 | 
				
			||||||
 | 
					        SHUTTLE,
 | 
				
			||||||
        AND, BITAND, OR, BITOR, NOT, BITNOT, DOT, ARROW, QUESTION, COLONCOLON,
 | 
					        AND, BITAND, OR, BITOR, NOT, BITNOT, DOT, ARROW, QUESTION, COLONCOLON,
 | 
				
			||||||
        SINLGE_LINE_COMMENT, MULTILINE_COMMENT,
 | 
					        SINLGE_LINE_COMMENT, MULTILINE_COMMENT,
 | 
				
			||||||
        LABEL, ATLABEL, // label@ at@label
 | 
					        LABEL, ATLABEL, // label@ at@label
 | 
				
			||||||
 | 
				
			|||||||
@ -1192,6 +1192,52 @@ class ScriptTest {
 | 
				
			|||||||
        fna(5,6)
 | 
					        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()
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -14,13 +14,12 @@ suspend fun executeSampleTests(fileName: String) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    runBlocking {
 | 
					    runBlocking {
 | 
				
			||||||
        val c = Context()
 | 
					        val c = Context()
 | 
				
			||||||
        for( i in 1..1) {
 | 
					 | 
				
			||||||
            val start = Clock.System.now()
 | 
					            val start = Clock.System.now()
 | 
				
			||||||
            c.eval(sample)
 | 
					            c.eval(sample)
 | 
				
			||||||
            val time = Clock.System.now() - start
 | 
					            val time = Clock.System.now() - start
 | 
				
			||||||
            println("$time: $fileName")
 | 
					            println("$time: $fileName")
 | 
				
			||||||
//            delay(100)
 | 
					//            delay(100)
 | 
				
			||||||
        }
 | 
					//        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user