garden/README.md

56 lines
1.7 KiB
Markdown
Raw Normal View History

# Garden
An experiment in combining [Fennel](https://fennel-lang.org) and [Terra](https://terralang.org).
## Rationale
Idk, seemed cool
## Usage
At the top of your file, include the following:
```fennel
(import-macros {: def : q : ttype} :terra)
```
The `def` macro defines a new terra function. The `q` macro defines a quoted terra expression.
The `ttype` macro allows you to specify terra type definitions that can't be expressed with
regular lua syntax.
Notably, all of these macros return values, and none of them define new variables, local or global.
I could maybe be persuaded to make `def` work like `fn` and optionally define a local, but for now,
eh, whatever.
### def
Defines a function, compiling down to the `terra` keyword.
Syntax:
```fennel
(def [argname1 argtype1 argname2 argtype2... : rettype1 rettype2...] statement...)
```
Simple example:
```fennel
(local add (def [x int y int : int]
(return (+ x y))))
(add 1 2) ; returns 3
```
To define a function as returning "void", simply end the argument list with a `:`.
To make terra infer the return type, do not include a `:` in the argument list at all.
Unlike Fennel, we do not implement implicit return semantics, and early returns are A-OK.
Sorry Phil.
### q
Defines a terra quotation, compiling down to the `\`` operator if given one argument, and
`quote` / `end` if given more than one.
### syntax within `def` and `q` forms
```fennel
(var name initial-value)
(var name type initial-value)
```
Define a local variable named `var`, and set its initial value to `initial-value`. You can
manually specify a `type`, or you can let terra infer it from `initial-value`. There is no
syntax for _not_ initalizing the variable on declaration.
```fennel
```