Public
Like
2
lisp
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
A mini lisp interpreter
To execute code:
const result = @zackoverflow.lisp(" (+ 1 2)")
To just parse and return the AST:
const ast = @zackoverflow.lisp("(+ 1 2)", true)
The value returned is the last expression of the program, for example:
const lispResult = @zackoverflow.lisp("(+ 1 2) (+ 400 20)")
console.log('Val', lispResult.val === 420)
let result = @zackoverflow.lisp(`
(defun fib (x)
(if (<= x 1)
x
(defun impl (i n-1 n-2)
(if (= x i)
(+ n-1 n-2)
(impl (+ i 1) (+ n-1 n-2) n-1)))
(impl 2 1 0)))
(assert-eq 0 (fib 0))
(assert-eq 1 (fib 1))
(assert-eq 1 (fib 2))
(assert-eq 2 (fib 3))
(assert-eq 3 (fib 4))
(assert-eq 5 (fib 5))
(assert-eq 8 (fib 6))
(assert-eq 13 (fib 7))
`);
You can define a function like so:
(defun hello (x) (print x))
Rest/variadic arguments are also supported
(defun variable-amount-of-args (...args) (print args)) (variable-amount-of-args "Hello" "World!")
Define a list like so:
(let ((my-list (list 1 2 3 4))) (print my-list) (print (list-get my-list 1)))
Internally, a list is just a Javascript array. So indexing is O(1), but that does mean cdr
requires copying (vs the linked list implementation).
Property lists, or records. Internally these are Javascript objects.
Create a plist like so:
(set null :key "Value")
TODO
Migrated from folder: lisp/lisp