Skip to content
Lua Lisp Language
Branch: master
Clone or download
Latest commit d102a59 Jul 15, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci Fix package name for CI build. Mar 9, 2018
rockspecs Fix #146, varargs in quote Mar 22, 2019
.gitignore We need to precompiled code to git for luarocks Dec 6, 2018
.luacheckrc Pacify luacheck; add makefile. Feb 15, 2018
CODE-OF-CONDUCT.md Improve formatting & fix links in CoC attribution Jun 6, 2019
CONTRIBUTING.md Use reference-style links in markdown instead of inline. Dec 28, 2018
LICENSE Create LICENSE Apr 4, 2018
Makefile Organize test cases. Dec 29, 2018
README.md Update README to reference fennel.vim Mar 12, 2019
api.md Use reference-style links in markdown instead of inline. Dec 28, 2018
changelog.md Require autogensym for identifiers inside backticked macros Jul 14, 2019
fennel Add support for line-numbered AOT in launcher script. Jul 15, 2019
fennel-watch.sh Add a script to "auto-compile" fennel code. Apr 4, 2018
fennel.1 Add --globals and --globals-only options to launcher script. Apr 7, 2019
fennel.bat Add a bat file for command line usage on windows. Jan 8, 2019
fennel.lua Require autogensym for identifiers inside backticked macros Jul 14, 2019
fennelview.fnl Don't error in fennelview when tables wrap sub-tables. Jun 21, 2019
fennelview.fnl.lua Rebuild fennelview.fnl Jun 24, 2019
generate.fnl Implement some proposed syntax changes Mar 27, 2019
lua-primer.md Updated for post-release fennel Jan 13, 2019
reference.md Update reference documentation. Jul 14, 2019
release-checklist.md Couple small documentation changes. Jun 1, 2019
test-macros.fnl Implement some proposed syntax changes Mar 27, 2019
test.lua Require autogensym for identifiers inside backticked macros Jul 14, 2019
tutorial.md Docs changes for literal/destructuring shorthand May 17, 2019

README.md

Fennel

Fennel (formerly fnl) is a lisp that compiles to Lua. It aims to be easy to use, expressive, and has almost zero overhead compared to handwritten Lua.

  • Full Lua compatibility - You can use any function or library from Lua.
  • Zero overhead - Compiled code should be just as or more efficient than hand-written Lua.
  • Compile-time macros - Ship compiled code with no runtime dependency on Fennel.
  • Embeddable - Fennel is a one-file library as well as an executable. Embed it in other programs to support runtime extensibility and interactive development.

Documentation

  • The tutorial is a great place to start
  • The reference describes all Fennel special forms
  • The API listing shows how to integrate Fennel into your codebaes
  • The Lua primer gives a very brief intro to Lua with pointers to further details
  • The test suite has basic usage examples for most features.

For a small complete example that uses the LÖVE game engine, see pong.fnl.

The changelog has a list of user-visible changes for each release.

Example

Hello World

(print "hello, world!")

Fibonacci sequence

(fn fib [n]
 (if (< n 2)
  n
  (+ (fib (- n 1)) (fib (- n 2)))))

(print (fib 10))

Usage

At https://fennel-lang.org there's a live in-browser repl you can use without installing anything.

Check your OS's package manager to see if Fennel is available there. If you use LuaRocks you can run luarocks install fennel.

Otherwise clone this repository, and run ./fennel to start a repl. Use ./fennel my-file.fnl to run code or ./fennel --compile my-file.fnl > my-file.lua to perform ahead-of-time compilation.

See the API documentation for how to embed Fennel in your program.

Differences from Lua

  • Syntax is much more regular and predictable (no statements; no operator precedence)
  • It's impossible to set or read a global by accident
  • Pervasive destructuring anywhere locals are introduced
  • Clearer syntactic distinction between sequential tables and key/value tables
  • Separate looping constructs for numeric loops vs iterators instead of overloading for
  • Opt-in mutability for local variables
  • Opt-in arity checks for lambda functions
  • Ability to extend the syntax with your own macros and special forms

Differences from other lisp languages

  • Lua VM can be embedded in other programs with only 180kb
  • Access to excellent FFI
  • LuaJIT consistently ranks at the top of performance shootouts
  • Inherits aggressively simple semantics from Lua; easy to learn
  • Lua VM is already embedded in databases, window managers, games, etc
  • Low memory usage
  • Readable compiler output resembles input

(Obviously not all these apply to every lisp you could compare Fennel to.)

Resources

License

Copyright © 2016-2019 Calvin Rose and contributors

Released under the MIT license

You can’t perform that action at this time.