punch
is a hobby programming language.
I'm mainly working on this as a learning experience.
I have some aspirations of working on a backend for this. To work out some issues with the AST, I added a js code generation step (to easily produce runnable code). I'm not sure if i'll fully commit to that.
To build you will need golang installed.
To run code locally, you will need node
or bun
installed in your PATH.
go build ./cmd/punch/
./punch ./examples/simple.pun # output: Hello, World!
// function declaration
bool is_best(i32 a, i32 b)
// simple function
i8 add(i32 a, i32 b) {
return a + b
}
// exported function
pub i32 add_two(i32 a, i32 b) {
return a + b
}
// multiple return types
(i32, bool) add_eq(i32 a, i32 b) {
return a + b, a == b
}
// no return
fn main() {
println("hello world")
}
if a && b {
println("abc")
}
i32 c = 42
i64 d = 42
u32 g = 42
u64 h = 42
f32 k = 42.0
f64 l = 42.0
bool m = true
str n = "hello"
struct message {
i8 sender
i8 recipient
str body
}
message msg = {
sender: 5,
recipient: 10,
body: "hello"
}
println(msg.sender, msg.recipient, msg.body)
// traditional for loop
for i := 0; i < 10 ; i = i + 1 {
}
// loop while true
for true {
}
// loop forever
for {
}
pkg main
import (
"fmt"
)
fn main() {
fmt.Println("hello, world!")
}
work in progress
Feature | ast | wasm | js |
---|---|---|---|
function declaration | ✅ | ✅ | ✅ |
function calls | ✅ | ✅ | ✅ |
function multiple returns | ❌ | ❌ | ❌ |
if/else | ✅ | ✅ | ✅ |
strings | ✅ | ✅ | ✅ |
integers | ✅ | ✅ | ✅ |
floats | ✅ | ✅ | ❌ |
structs | ✅ | ❌ | ✅ |
struct access | ✅ | ❌ | ✅ |
loops | ✅ | ❌ | ✅ |
lists | ✅ | ❌ | ✅ |
maps | ❌ | ❌ | ❌ |
pointers | ❌ | ❌ | ❌ |
enums | ❌ | ❌ | ❌ |
modules | ❌ | ❌ | ❌ |
type inference | ❌ | ❌ | ❌ |
interfaces | ❌ | ❌ | ❌ |