56 lines
1.7 KiB
Markdown
56 lines
1.7 KiB
Markdown
# 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
|
|
|
|
``` |