Let’s look at our helloworld
code again:
actor Main
new create(env: Env) =>
env.out.print("Hello, world!")
Let’s go through that line by line.
Line 1
actor Main
This is a type declaration. The keyword actor
means we are going to define an actor, which is a bit like a class in Python, Java, C#, C++, etc. Pony has classes too, which we’ll see later.
The difference between an actor and a class is that an actor can have asynchronous methods, called behaviours. We’ll talk more about that later.
A Pony program has to have a Main
actor. It’s kind of like the main
function in C or C++, or the main
method in Java, or the Main
method in C#. It’s where the action starts.
Line 2
new create(env: Env) =>
This is a constructor. The keyword new
means it’s a function that creates a new instance of the type. In this case, it creates a new Main.
Unlike other languages, constructors in Pony have names. That means there can be more than one way to construct an instance of a type. In this case, the name of the constructor is create
.
The parameters of a function come next. In this case, our constructor has a single parameter called env
that is of the type Env
.
In Pony, the type of something always comes after its name and is separated by a colon. In C, C++, Java or C#, you might say Env env
, but we do it the other way around (like Go, Pascal, Rust, TypeScript, and a bunch of other languages).
It turns out, our Main
actor has to have a constructor called create
that takes a single parameter of type Env
. That’s how all programs start! So the beginning of your program is essentially the body of that constructor.
Wait, what’s the body? It’s the code that comes after the =>
.
Line 3
env.out.print("Hello, world!")
This is your program! What the heck is it doing?
In Pony, a dot is either a field access or a method call, much like other languages. If the name after the dot has parentheses after it, it’s a method call. Otherwise, it’s a field access.
So here, we start with a reference to env
. We then look up the field out
on our object env
. As it happens, that field represents stdout, i.e. usually it means printing to your console. Then, we call the print
method on env.out
. The stuff inside the parentheses are the arguments to the function. In this case, we are passing a string literal, i.e. the stuff in double quotes.
In Pony, string literals can be in double quotes, "
, in which case they follow C/C++ style escaping (using stuff like \n), or they can be triple-quoted, """
like in Python, in which case they are considered raw data.
What’s an Env, anyway? It’s the “environment” your program was invoked with. That means it has command line arguments, environment variables, stdin, stdout, and stderr. Pony has no global variables, so these things are explicitly passed to your program.
That’s it!
Really, that’s it. The program begins by creating a Main
actor, and in the constructor, we print “Hello, world!” to stdout. Next, we’ll start diving into the Pony type system.