This is a forked version of the lisp implementation Urn.

Kevin "The Nuclear" Bloom c53eb699eb maybe-map -> filter-map 4 년 전
bin 483dcc701f init commit 4 년 전
git 483dcc701f init commit 4 년 전
lib c53eb699eb maybe-map -> filter-map 4 년 전
plugins 483dcc701f init commit 4 년 전
tests 483dcc701f init commit 4 년 전
urn 483dcc701f init commit 4 년 전
LICENCE 483dcc701f init commit 4 년 전
Makefile 483dcc701f init commit 4 년 전
PKGBUILD 483dcc701f init commit 4 년 전
README.md 483dcc701f init commit 4 년 전
default.nix 483dcc701f init commit 4 년 전
urn-scm-1.rockspec 483dcc701f init commit 4 년 전

README.md

THIS IS A FORK OF THE URN LISP DIALECT. THE ORIGINAL PROJECT IS FOUND HERE: https://gitlab.com/urn/urn

Urn is a new language developed by SquidDev, and demhydraz. Urn is a Lisp dialect with a focus on minimalism which compiles to Lua.

What?

  • A minimal¹ Lisp implementation, with full support for compile time code execution and macros.
  • Support for Lua 5.1, 5.2 and 5.3. Should also work with LuaJIT.
  • Lisp-1 scoping rules (functions and data share the same namespace).
  • Influenced by a whole range of Lisp implementations, including Common Lisp and Clojure.
  • Produces standalone, optimised Lua files: no dependencies on a standard library.

¹: Minimalism is an implementation detail.

Features

Pattern matching

> (case '("x" (foo 2 3))
.   [(string?  @ ?x) (.. "Got a string " x)]
.   [("x" (foo . ?x)) (.. "Got some remaining values " (pretty x))])
out = "Got some remaining values (2 3)"

Various looping constructs

> (loop [(o '())
.        (l '(1 2 3))]
.   [(empty? l) o]
.   (recur (cons (car l) o) (cdr l)))
out = (3 2 1)

Powerful assertion and testing framework

> (import test ())
out = nil
> (affirm (eq? '("foo" "bar" "")
.              (string/split "foo-bar" "-")))
[ERROR] <stdin>:1 (compile#111{split,temp}:46): Assertion failed
(eq? (quote ("foo" "bar" "")) (string/split "foo-bar" "-"))
     |                        |
     |                        ("foo" "bar")
     ("foo" "bar" "")

First-class support for Lua tables

> { :foo 1
.   :bar 2 }
out = {"bar" 2 "foo" 1}

Friendly error messages

> (]
[ERROR] Expected ')', got ']'
  => <stdin>:[1:2 .. 1:2] ("]")
 1 │ (]
 ^... block opened with '('
 1 │ (]
  ^ ']' used here
> 

Getting started

We have a getting started guide to help you get set up. Or you can clone the repo and jump right in!

The website also contains documentation for all functions and macros, should you need to check how something works.

If you have any questions, would like to contribute or just feel like chatting, do join us in the #urn channel on FreeNode.