Subleq

var memory = ARGV.map{.to_i}
var ip = 0
 
while (ip.ge(0) && ip.lt(memory.len)) {
    var (a, b, c) = memory[ip, ip+1, ip+2]
    ip += 3
    if (a < 0) {
        memory[b] = STDIN.getc.ord
    }
    elsif (b < 0) {
        print memory[a].chr
    }
    elsif ((memory[b] -= memory[a]) <= 0) {
        ip = c
    }
}

Output:

$ sidef subleq.sf 15 17 -1 17 -1 -1 16 1 -1 16 3 -1 15 15 0 0 -1 72 101 108 108 111 44 32 119 111 114 108 100 33 10 0
Hello, world!

Last updated