A functional language with Reason-like syntax that compiles to Go.
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.
Consider anything ticked off to exist in the language, but be barely usable.
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")
println(yumPizza)
// calling a go function
printf1("Woo I can print %s\n", "6")
let b = Payload{name: "greeting", data: "hi"}
println(b.name)
}
Grab the correct Braid package for your platform from the releases, extract the braid
binary, and run it.
./braid filename.bd
This will compile your Braid file to Go and print the resulting Go source code to stdout.
./braid filename.bd > 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 https://github.com/joshsharp/braid.git
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/example.bd
I don't know yet. I'm open to proposals, provided you help me do the work.
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.
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.