Skip to content

Instantly share code, notes, and snippets.

@occar421
Last active January 2, 2016 13:31
Show Gist options
  • Save occar421/08f96efa5cde58929eae to your computer and use it in GitHub Desktop.
Save occar421/08f96efa5cde58929eae to your computer and use it in GitHub Desktop.
NetLogo like processing on Kotlin (needs kotlin-reflect.kt)
fun main(args: Array<String>) {
setup()
}
var turtles = arrayOf<Turtle>()
infix inline fun <T : Turtle> T.ask(job: T.() -> Unit): Unit = job(this)
infix inline fun <T : Turtle> Array<T>.ask(job: T.() -> Unit): Unit {
for (t in this) {
job(t)
}
}
var counter = 0
inline fun <reified T : Turtle> create(num: Int, init: T.() -> Unit): Unit {
turtles = turtles.plus(Array(num, {
var t = T::class.constructors.first().call(counter, "", Shapes.Turtle, 0.0, 0.0) // var t = T() is best...
init(t)
counter += 1
t
}))
}
fun setup() {
create<Turtle>(5) {
shape = Shapes.Circle
}
create<Turtle>(2) {
shape = Shapes.Turtle
}
/*
for (t in turtles) {
println(t.who)
}
*/
turtles ask {
who += 10
label = who.toString()
}
turtles[0] ask {
who = 100
}
/*
for (t in turtles) {
println("${t.who} ; ${t.label} @ ${t.shape}")
}
*/
}
class Turtle(var who: Int,
var label: String,
var shape: Shapes,
var x: Double,
var y: Double) {
}
enum class Shapes {
Turtle,
Circle
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment