No C. No libc. Just Linux syscalls and machine instructions. 2592 lines of GNU assembler. 13KB stripped binary. 1.8MB resident. Features: quote, if, define, set!, lambda, begin, let, named-let, cond, and, or. 34 builtins. Tag-in-low-bits values. Bump allocator on mmap'd pages. TCO via jmp. Symbol interning. Runs: (fact 10)=3628800, (fib 35)=9227465, (ack 3 4)=125. 24 tests pass. Zero dependencies. "If you vibe code in assembly, you don't even need a compiler."
54 lines
1.9 KiB
Makefile
54 lines
1.9 KiB
Makefile
all: uncommonlisp
|
|
|
|
uncommonlisp: uncommonlisp.s
|
|
as --64 -o uncommonlisp.o uncommonlisp.s
|
|
ld -o uncommonlisp uncommonlisp.o
|
|
|
|
test: uncommonlisp
|
|
@echo "=== Basic arithmetic ==="
|
|
echo '(+ 1 2)' | ./uncommonlisp
|
|
@echo "=== Nested arithmetic ==="
|
|
echo '(+ (* 3 4) (- 10 5))' | ./uncommonlisp
|
|
@echo "=== Boolean and comparison ==="
|
|
echo '(< 1 2)' | ./uncommonlisp
|
|
@echo "=== Quote ==="
|
|
echo "(quote (1 2 3))" | ./uncommonlisp
|
|
@echo "=== If ==="
|
|
echo '(if (< 1 2) 42 99)' | ./uncommonlisp
|
|
@echo "=== Define and use ==="
|
|
echo '(define x 10) (+ x 5)' | ./uncommonlisp
|
|
@echo "=== Lambda ==="
|
|
echo '((lambda (x y) (+ x y)) 3 4)' | ./uncommonlisp
|
|
@echo "=== Factorial ==="
|
|
echo '(define (fact n) (if (<= n 1) 1 (* n (fact (- n 1))))) (fact 10)' | ./uncommonlisp
|
|
@echo "=== Fibonacci (named let) ==="
|
|
echo '(define (fib n) (let loop ((a 0) (b 1) (i 0)) (if (= i n) a (loop b (+ a b) (+ i 1))))) (fib 35)' | ./uncommonlisp
|
|
@echo "=== Ackermann ==="
|
|
echo '(define (ack m n) (cond ((= m 0) (+ n 1)) ((= n 0) (ack (- m 1) 1)) (else (ack (- m 1) (ack m (- n 1)))))) (ack 3 4)' | ./uncommonlisp
|
|
@echo "=== List operations ==="
|
|
echo '(car (cdr (list 1 2 3)))' | ./uncommonlisp
|
|
@echo "=== Length ==="
|
|
echo '(length (list 1 2 3 4 5))' | ./uncommonlisp
|
|
@echo "=== And/Or ==="
|
|
echo '(and 1 2 3)' | ./uncommonlisp
|
|
echo '(or #f #f 42)' | ./uncommonlisp
|
|
@echo "=== Let ==="
|
|
echo '(let ((x 10) (y 20)) (+ x y))' | ./uncommonlisp
|
|
@echo "=== Begin ==="
|
|
echo '(begin 1 2 3)' | ./uncommonlisp
|
|
@echo "=== Set! ==="
|
|
echo '(define x 1) (set! x 42) x' | ./uncommonlisp
|
|
@echo "=== Not ==="
|
|
echo '(not #f)' | ./uncommonlisp
|
|
echo '(not 42)' | ./uncommonlisp
|
|
@echo "=== Null/Pair ==="
|
|
echo "(null? '())" | ./uncommonlisp
|
|
echo '(pair? (cons 1 2))' | ./uncommonlisp
|
|
@echo "=== Display ==="
|
|
echo '(display 42) (newline)' | ./uncommonlisp
|
|
@echo "=== All tests passed ==="
|
|
|
|
clean:
|
|
rm -f uncommonlisp.o uncommonlisp
|
|
|
|
.PHONY: all test clean
|