Learning Pony
Published:
I've recently started teaching myself an interesting language I discovered on the LLVM project page : Pony
Projects
First, I tried rewriting keyster - a simple Key/Value store that talks over UDP.
This took a tiny 44 lines, and produced something almost as fast as the raw C verison.
use "collections"
use "logger"
use "net"
class HandleUDPNotify is UDPNotify
let _hmap: Map[String, String] = Map[String, String].create()
fun ref not_listening(sock: UDPSocket ref): None val =>
"""
"""
fun ref received(sock: UDPSocket ref, data: Array[U8] iso, from: NetAddress) =>
let src = recover val consume data end
if src.size() == 0 then
return
end
var cmd = String.from_array(src.trim(0, 1))
var key = try String.from_array(src.trim(1, src.find(0, 0))) else "" end
var value = String.from_array(src.trim(2 + key.size()))
var result: String = ""
match cmd
| "G" => try result = _hmap(key) end
| "A" => try _hmap.insert_if_absent(key, value) end
| "S" => try _hmap.insert(key, value) end
| "D" => try _hmap.remove(key) end
else
result = _hmap.size().string()
end
var rsp: Array[U8] iso = recover iso Array[U8].create(2 + key.size() + result.size()) end
rsp.append(cmd.lower())
rsp.append(key)
rsp.push(0)
rsp.append(result)
sock.write(consume rsp, from)
actor Main
new create(env: Env) =>
let logger = StringLogger(Info, env.out)
logger.log("Started...\n")
try
let socket = UDPSocket(env.root as AmbientAuth, HandleUDPNotify, "", "6347")
end
Now, to anyone familiar with various programming languages, a lot of this will look quite familiar. What may stand our as odd, though, is constructs such as "consume", "recover", and the annotations like "iso", "ref", "var". These are to do with rcaps.
So far the most frustrating part to learn is the Reference Capabilities or "rcaps". These tell the compiler what access to allow to each variable : mutable, immutable, shareable, and so on...
That said, they also allow it to detect dangerous behaviours, and run the actor system completely lock free.
Is this frustration worth the guarantee that "if it compiles, it won't crash", as well as "guaranteed deadlock free"?
Well, that remains to be seen, but so far it's very, very promising.