Igor is a dialect of Go language with the support for structured concurrency.
WARNING: This project is meant as a playground for experimenting with what a language with native
support fot structured concurrency would look like. If you want to do serious work, please use
golang.org/x/sync/errgroup
instead.
go
statement is prohibited - very much like goto
in most modern languages.
Instead, launch the goroutines in nurseries using run
function:
n := make(nursery)
run(n, foo(a, b, c))
err := n.Wait()
Note that Igor uses a calling convention that differs from the standard Go. Namely, there's an
implicit first context.Context
argument passed to each function. Therefore, you have to call
the functions from the native packages with gocc
specifier:
fmt.Println.gocc("Hi there!")
Nursery holds a set of goroutines. The goroutine function MUST must have an error
return type.
If goroutine exits with nil
it is silently removed from the nursery. If goroutine exits with
an error, all the other goroutines in the nursery are immediately canceled. The error is stored
to be later returned to the owner of the nursery.
The owner, in addition to launching goroutines, can use the following functions on the nursery:
Close()
immediately cancels all the goroutines in the nursery. There's no return value.
Wait() error
waits until all the goroutines in the nursery are finished. If one of them fails,
the error is returned from the Wait
function. If no goroutine has failed, nil
is returned.
Err() error
checks whether the nursery failed, but doesn't block. In case of previous failure,
it returns the error. If the nursery is in running state it returns nil
. This function can be used
when periodic checking of the health of the nursery is desired.
igor
tool is a transpiler that takes files with extension .igor
and produces standard Go files
with extension .go
.
To install the transpiler:
go install github.com/sustrik/igor/igor
Run it like this:
igor
The transpiler compiles all the Igor files in the current directory and in all of its subdirectories, recursively. Alternatively, starting directory can be specified on the command line:
igor ./go/src/github.com/foo/bar
The compiled Igor programs are linked with the lib/igor
package which contains the language
runtime.