splat any Iterable
This commit is contained in:
		
							parent
							
								
									2b87845a40
								
							
						
					
					
						commit
						397dcaae92
					
				@ -70,7 +70,31 @@ destructuring arrays when calling functions and lambdas:
 | 
			
		||||
    fun getFirstAndLast(first, args..., last) {
 | 
			
		||||
        [ first, last ]
 | 
			
		||||
    }
 | 
			
		||||
    getFirstAndLast( ...(1..10).toList() )
 | 
			
		||||
    getFirstAndLast( ...(1..10) ) // see "splats" section below
 | 
			
		||||
    >>> [1, 10]
 | 
			
		||||
 | 
			
		||||
# Splats
 | 
			
		||||
 | 
			
		||||
Ellipsis allows to convert argument lists to lists. The inversa algorithm that converts [List],
 | 
			
		||||
or whatever implementing [Iterable], is called _splats_. Here is how we use it:
 | 
			
		||||
 | 
			
		||||
    fun testSplat(data...) {
 | 
			
		||||
        println(data)
 | 
			
		||||
    }
 | 
			
		||||
    val array = [1,2,3]
 | 
			
		||||
    testSplat("start", ...array, "end")
 | 
			
		||||
    >>> ["start", 1, 2, 3, "end"]
 | 
			
		||||
    >>> void
 | 
			
		||||
 | 
			
		||||
There could be any number of splats at any positions. You can splat any other [Iterable] type:
 | 
			
		||||
 | 
			
		||||
    fun testSplat(data...) {
 | 
			
		||||
        println(data)
 | 
			
		||||
    }
 | 
			
		||||
    val range = 1..3
 | 
			
		||||
    testSplat("start", ...range, "end")
 | 
			
		||||
    >>> ["start", 1, 2, 3, "end"]
 | 
			
		||||
    >>> void
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
[tutorial]: tutorial.md
 | 
			
		||||
 | 
			
		||||
@ -8,8 +8,18 @@ suspend fun Collection<ParsedArgument>.toArguments(context: Context): Arguments
 | 
			
		||||
    for (x in this) {
 | 
			
		||||
        val value = x.value.execute(context)
 | 
			
		||||
        if (x.isSplat) {
 | 
			
		||||
            (value as? ObjList) ?: context.raiseClassCastError("expected list of objects for splat argument")
 | 
			
		||||
            for (subitem in value.list) list.add(Arguments.Info(subitem, x.pos))
 | 
			
		||||
            when {
 | 
			
		||||
                value is ObjList -> {
 | 
			
		||||
                    for (subitem in value.list) list.add(Arguments.Info(subitem, x.pos))
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                value.isInstanceOf(ObjIterable) -> {
 | 
			
		||||
                    val i = (value.invokeInstanceMethod(context, "toList") as ObjList).list
 | 
			
		||||
                    i.forEach { list.add(Arguments.Info(it, x.pos)) }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                else -> context.raiseClassCastError("expected list of objects for splat argument")
 | 
			
		||||
            }
 | 
			
		||||
        } else
 | 
			
		||||
            list.add(Arguments.Info(value, x.pos))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user