Skip to content
This repository has been archived by the owner on Aug 29, 2023. It is now read-only.


Folders and files

Last commit message
Last commit date

Latest commit


Repository files navigation


A functional language with Reason-like syntax that compiles to Go.

I’m working on a language I’m calling Braid, an ML-like language that compiles to Go. Braid’s syntax is heavily inspired by Reason, itself a more C-like syntax on top of OCaml. So really I’m writing a language that aims to be fairly similar to OCaml in what it can do, but visually a bit closer to Go. I’m not trying to reimplement OCaml or Reason 1:1 on top of Go, but build something sharing many of the same concepts.

I've written some more about it on my Braid dev blog.


Very, very alpha.


  • Pair an OCaml-like language with the benefits of the Go platform (speed, concurrency, static binaries, a healthy ecosystem)
  • Bring powerful FP concepts to Go
  • Get around Go's lack of generics
  • Interop with Go code
  • Ability to use Go stdlib


  • Performance matching idiomatic Go
  • Just reimplementing Reason on top of Go

Language overview

Consider anything ticked off to exist in the language, but be barely usable.

  • Record types
  • Variant types
  • If-expressions
  • Importing Go functions and types
  • Immutability by default
  • Hindley-Milner type inference
  • Type annotations
  • Implicit return
  • Multiple return
  • Modules
  • Pattern matching
  • Currying
  • Typeclasses/traits
  • Concurrency
  • Infix operators

Braid supports records and variants:

type Person = {
  name: string,
  age: int64,

type Fruit = 
  | Peach
  | Plum
  | Pear

type Option ('a) =
  | Some ('a)
  | None
let result = Some("it worked")

Braid attempts to support significant newlines, meaning no ; required — however this is probably broken in a lot of cases right now.

A full example:

module Main

// record type
type Payload = {
  name: string,
  data: string,

// go interop - external functions must be annotated
extern func println = "fmt.Println" (s: string) -> ()
extern func printf1 = "fmt.Printf" (s: string, arg1:string) -> ()

/* func to add cheesiness to any two items */
let cheesy = (item, item2) {
  item ++ " and " ++ item2 ++ " with cheese please"

let main = {
  // nested functions
  let something = {
    4 + 9
  let a = something()
  let yumPizza = cheesy("pineapple", "bbq sauce")
  // calling a go function
  printf1("Woo I can print %s\n", "6")
  let b = Payload{name: "greeting", data: "hi"}

Trying it out

Grab the correct Braid package for your platform from the releases, extract the braid binary, and run it.


This will compile your Braid file to Go and print the resulting Go source code to stdout.

./braid > main.go

You can redirect this into a file if you like.




Making sure Go and GB are in your path, clone the Braid repository into a new directory:

git clone

Enter the new braid directory and fetch the requirements:

cd braid
gb vendor restore

Make sure the vendored dependencies are built (you'll only need to do this once):

cd vendor
gb build all

Use the makefile at src/braid/Makefile to build and run Braid:

cd ../src/braid
make run file=examples/


Will Braid support X?

I don't know yet. I'm open to proposals, provided you help me do the work.

Do you even know what you're doing?

Nope, not at all. I have no formal background in this stuff. Really I'm doing it for fun. I'd love to see it reach maturity, because I want to use it myself. But I'll need a lot of help if it's to get that far.


Contribution guidelines

Your help makes Braid better! I welcome pull requests, bug fixes, and issue reports.

Before proposing a change, please first create an issue to discuss your proposal.


Licensed under the MIT License.