better elvis + throw
+added run {}
			
			
This commit is contained in:
		
							parent
							
								
									835333dfad
								
							
						
					
					
						commit
						95c1da60ed
					
				@ -225,6 +225,19 @@ It works much like `also`, but is executed in the context of the source object:
 | 
			
		||||
    assertEquals(p, Point(2,3))
 | 
			
		||||
    >>> void
 | 
			
		||||
 | 
			
		||||
## run
 | 
			
		||||
 | 
			
		||||
Executes a block after it returning the value passed by the block. for example, can be used with elvis operator:
 | 
			
		||||
 | 
			
		||||
    var someVar = null
 | 
			
		||||
    val result = someVar ?: run {
 | 
			
		||||
      someVar = 121
 | 
			
		||||
      "reset"
 | 
			
		||||
    }
 | 
			
		||||
    assertEquals("reset", result)
 | 
			
		||||
    assertEquals(121, someVar)
 | 
			
		||||
    >>> void
 | 
			
		||||
 | 
			
		||||
## Math
 | 
			
		||||
 | 
			
		||||
It is rather simple, like everywhere else:
 | 
			
		||||
@ -1311,6 +1324,7 @@ See [math functions](math.md). Other general purpose functions are:
 | 
			
		||||
| flow {}                                      | create flow sequence, see [parallelism]                    |
 | 
			
		||||
| delay, launch, yield                         | see [parallelism]                                          |
 | 
			
		||||
| cached(builder)                              | remembers builder() on first invocation and return it then |
 | 
			
		||||
| let, also, apply, run                        | see above, flow controls                                   |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Built-in constants
 | 
			
		||||
 | 
			
		||||
@ -376,6 +376,11 @@ class Compiler(
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        "throw" -> {
 | 
			
		||||
                            val s = parseThrowStatement()
 | 
			
		||||
                            operand = Accessor { s.execute(it).asReadonly }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        else -> operand?.let { left ->
 | 
			
		||||
                            // selector: <lvalue>, '.' , <id>
 | 
			
		||||
                            // we replace operand with selector code, that
 | 
			
		||||
 | 
			
		||||
@ -315,6 +315,9 @@ open class Obj {
 | 
			
		||||
                args.firstAndOnly().callOn(copy(Arguments(thisObj)))
 | 
			
		||||
                thisObj
 | 
			
		||||
            }
 | 
			
		||||
            addFn("run") {
 | 
			
		||||
                args.firstAndOnly().callOn(this)
 | 
			
		||||
            }
 | 
			
		||||
            addFn("getAt") {
 | 
			
		||||
                requireExactCount(1)
 | 
			
		||||
                thisObj.getAt(this, requiredArg<Obj>(0))
 | 
			
		||||
 | 
			
		||||
@ -2961,5 +2961,25 @@ class ScriptTest {
 | 
			
		||||
        """.trimIndent())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    fun testElvisAndThrow() = runTest {
 | 
			
		||||
        eval("""
 | 
			
		||||
            val x = assertThrows {
 | 
			
		||||
                null ?: throw "test" + "x"
 | 
			
		||||
            }
 | 
			
		||||
            assertEquals( "testx", x.message)
 | 
			
		||||
        """.trimIndent())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    fun testElvisAndRunThrow() = runTest {
 | 
			
		||||
        eval("""
 | 
			
		||||
            val x = assertThrows {
 | 
			
		||||
                null ?: run { throw "testx" }
 | 
			
		||||
            }
 | 
			
		||||
            assertEquals( "testx", x.message)
 | 
			
		||||
        """.trimIndent())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user