Maps as Objects

Wikipedia: Prototype-based programming
Tengo has no classes. The idiomatic pattern is a constructor function that returns a map bundling data and closures as "methods".

fmt := import("fmt")
new_counter := func(start) {
    count := start
    return {
        inc:   func() { count++ },
        dec:   func() { count-- },
        value: func() { return count },
        reset: func() { count = start },
    }
}

c := new_counter(0)
c.inc()
c.inc()
c.inc()
fmt.println(c.value())

c.dec()
fmt.println(c.value())

c.reset()
fmt.println(c.value())
a := new_counter(10)
b := new_counter(20)
a.inc()
b.inc()
b.inc()
fmt.printf("%d %d\n", a.value(), b.value())
new_point := func(x, y) {
    return {
        x: x,
        y: y,
        string: func() {
            return fmt.sprintf("(%d, %d)", x, y)
        },
    }
}

p := new_point(3, 4)
fmt.println(p.string())
fmt.printf("%d %d\n", p.x, p.y)

try it

3
2
0
11 22
(3, 4)
3 4
loading…