sergeych 1479df4426 +better comparison
+splat arguments in calls
2025-05-30 12:05:21 +04:00

42 lines
1.2 KiB
Kotlin

package net.sergeych.ling
data class ParsedArgument(val value: Statement, val pos: Pos, val isSplat: Boolean = false)
suspend fun Collection<ParsedArgument>.toArguments(context: Context): Arguments {
val list = mutableListOf<Arguments.Info>()
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))
} else
list.add(Arguments.Info(value, x.pos))
}
return Arguments(list)
}
data class Arguments(val list: List<Info>) : Iterable<Obj> {
data class Info(val value: Obj, val pos: Pos)
val size by list::size
operator fun get(index: Int): Obj = list[index].value
fun firstAndOnly(): Obj {
if (list.size != 1) throw IllegalArgumentException("Expected one argument, got ${list.size}")
return list.first().value
}
companion object {
val EMPTY = Arguments(emptyList())
}
override fun iterator(): Iterator<Obj> {
return list.map { it.value }.iterator()
}
}