diff --git a/library/src/commonMain/kotlin/net/sergeych/lyng/Arguments.kt b/library/src/commonMain/kotlin/net/sergeych/lyng/Arguments.kt index 6f804f5..6e02ce8 100644 --- a/library/src/commonMain/kotlin/net/sergeych/lyng/Arguments.kt +++ b/library/src/commonMain/kotlin/net/sergeych/lyng/Arguments.kt @@ -3,52 +3,43 @@ package net.sergeych.lyng data class ParsedArgument(val value: Statement, val pos: Pos, val isSplat: Boolean = false) suspend fun Collection.toArguments(context: Context): Arguments { - val list = mutableListOf() + val list = mutableListOf() for (x in this) { val value = x.value.execute(context) if (x.isSplat) { when { value is ObjList -> { - for (subitem in value.list) list.add(Arguments.Info(subitem, x.pos)) + for (subitem in value.list) list.add(subitem) } value.isInstanceOf(ObjIterable) -> { val i = (value.invokeInstanceMethod(context, "toList") as ObjList).list - i.forEach { list.add(Arguments.Info(it, x.pos)) } + i.forEach { list.add(it) } } else -> context.raiseClassCastError("expected list of objects for splat argument") } } else - list.add(Arguments.Info(value, x.pos)) + list.add(value) } return Arguments(list) } -data class Arguments(val list: List) : Iterable { +data class Arguments(val list: List) : List by list { data class Info(val value: Obj, val pos: Pos) - val size by list::size - - operator fun get(index: Int): Obj = list[index].value - - val values: List by lazy { list.map { it.value } } + val values = list fun firstAndOnly(): Obj { if (list.size != 1) throw IllegalArgumentException("Expected one argument, got ${list.size}") - return list.first().value + return list.first() } companion object { val EMPTY = Arguments(emptyList()) - fun from(values: Collection) = Arguments(values.map { Info(it, Pos.UNKNOWN) }) + fun from(values: Collection) = Arguments(values.toList()) } - - override fun iterator(): Iterator { - return list.map { it.value }.iterator() - } - } diff --git a/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt b/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt index 10a8d2e..9c7cebb 100644 --- a/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt +++ b/library/src/commonMain/kotlin/net/sergeych/lyng/Compiler.kt @@ -170,7 +170,7 @@ class Compiler( v.invokeInstanceMethod( context, next.value, - Arguments(listOf(Arguments.Info(lambda, t.pos))) + Arguments(listOf(lambda)) ), isMutable = false ) } diff --git a/library/src/commonMain/kotlin/net/sergeych/lyng/Context.kt b/library/src/commonMain/kotlin/net/sergeych/lyng/Context.kt index 2c6d767..0a3f0ae 100644 --- a/library/src/commonMain/kotlin/net/sergeych/lyng/Context.kt +++ b/library/src/commonMain/kotlin/net/sergeych/lyng/Context.kt @@ -41,8 +41,8 @@ class Context( inline fun requiredArg(index: Int): T { if (args.list.size <= index) raiseError("Expected at least ${index + 1} argument, got ${args.list.size}") - return (args.list[index].value as? T) - ?: raiseClassCastError("Expected type ${T::class.simpleName}, got ${args.list[index].value::class.simpleName}") + return (args.list[index] as? T) + ?: raiseClassCastError("Expected type ${T::class.simpleName}, got ${args.list[index]::class.simpleName}") } inline fun requireOnlyArg(): T { @@ -80,7 +80,7 @@ class Context( value: Obj, visibility: Visibility = Visibility.Public ): ObjRecord { - return ObjRecord(value, isMutable, visibility).also { objects.put(name, it) } + return ObjRecord(value, isMutable, visibility).also { objects[name] = it } } fun getOrCreateNamespace(name: String): ObjClass { diff --git a/library/src/commonMain/kotlin/net/sergeych/lyng/Obj.kt b/library/src/commonMain/kotlin/net/sergeych/lyng/Obj.kt index a245440..64e02b0 100644 --- a/library/src/commonMain/kotlin/net/sergeych/lyng/Obj.kt +++ b/library/src/commonMain/kotlin/net/sergeych/lyng/Obj.kt @@ -61,7 +61,7 @@ open class Obj { fun isInstanceOf(someClass: Obj) = someClass === objClass || objClass.allParentsSet.contains(someClass) suspend fun invokeInstanceMethod(context: Context, name: String, vararg args: Obj): Obj = - invokeInstanceMethod(context, name, Arguments(args.map { Arguments.Info(it, context.pos) })) + invokeInstanceMethod(context, name, Arguments(args.toList())) inline suspend fun callMethod( context: Context, @@ -218,7 +218,7 @@ open class Obj { callOn( context.copy( context.pos, - args = Arguments(args.map { Arguments.Info(it, context.pos) }), + args = Arguments(args.toList()), newThisObj = thisObj ) )