Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7a4d7ce
add more examples
mengzhuo Jun 20, 2025
fb15e03
add more functions cadr、caddr、cddr、list、length、map、filter、reduce、appe…
mengzhuo Jun 20, 2025
38f8a46
add test and odomu test
mengzhuo Jun 20, 2025
8ccc4f9
change sato
mengzhuo Jun 20, 2025
ed8b716
fix shato
mengzhuo Jun 20, 2025
5e87072
fix stack
mengzhuo Jun 20, 2025
f8cb608
fix or
mengzhuo Jun 20, 2025
f030045
Rewrite interpreter from Go to Rust
mengzhuo May 12, 2026
deed902
Update AGENTS.md for Rust rewrite
mengzhuo May 12, 2026
b128202
Remove unsafe code and add comprehensive tests
mengzhuo May 12, 2026
f923ffd
Rename all library functions to Hilichurlian
mengzhuo May 12, 2026
eae9aa1
Fix length function name: mani → tiga
mengzhuo May 13, 2026
ef48ee8
Add let, if, progn, setq special forms with Hilichurlian names
mengzhuo May 13, 2026
2dd6ae5
Add and fix example programs
mengzhuo May 13, 2026
427e444
Implement tail call optimization (TCO)
mengzhuo May 14, 2026
36e6980
Register-based VM with bytecode compiler
mengzhuo May 15, 2026
b551fcc
Add C FFI support and fix CI workflow
mengzhuo May 15, 2026
6c53c59
Update AGENTS.md with VM, compiler, and C FFI documentation
mengzhuo May 16, 2026
f48cdff
Add Go-like stdlib with web server support via C FFI
mengzhuo May 16, 2026
fc5ff19
Add string primitives and split HTTP library into pure MITA
mengzhuo May 18, 2026
52b194b
feat: expand odomu.mita with Common Lisp-style functions
mengzhuo May 18, 2026
1ce9d01
fix: add serve_once function for web server compatibility
mengzhuo May 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .github/workflows/mita-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: MITA LISP Library Test

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:
test-mita-lisp:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.21
- name: Build MITA
run: go build -o mita ./cmd/mita/main.go
- name: Run odomu.mita LISP tests
run: ./mita odomu.mita examples/odomu_test.mita
31 changes: 29 additions & 2 deletions elementary.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ func aba(a, b int) bool { return a < b }
func unta(a, b int) bool { return a > b }
func abaShato(a, b int) bool { return a <= b }
func untaShato(a, b int) bool { return a >= b }
func shato(a, b int) bool { return a == b }
func nyeShato(a, b int) bool { return a != b }

func (c *Context) boolFunc(expr *Expr, fn func(a, b int) bool) *Expr {
Expand All @@ -123,7 +122,6 @@ func (c *Context) abaFunc(name *token, expr *Expr) *Expr { return c.boolFu
func (c *Context) untaFunc(name *token, expr *Expr) *Expr { return c.boolFunc(expr, unta) }
func (c *Context) abaShatoFunc(name *token, expr *Expr) *Expr { return c.boolFunc(expr, abaShato) }
func (c *Context) untaShatoFunc(name *token, expr *Expr) *Expr { return c.boolFunc(expr, untaShato) }
func (c *Context) shatoFunc(name *token, expr *Expr) *Expr { return c.boolFunc(expr, shato) }
func (c *Context) nyeShatoFunc(name *token, expr *Expr) *Expr { return c.boolFunc(expr, nyeShato) }

func celi(a, b int) int { return a + b }
Expand All @@ -140,3 +138,32 @@ func (c *Context) celiFunc(name *token, expr *Expr) *Expr { return c.mathFunc(
func (c *Context) movoFunc(name *token, expr *Expr) *Expr { return c.mathFunc(expr, movo) }
func (c *Context) celiDaFunc(name *token, expr *Expr) *Expr { return c.mathFunc(expr, celida) }
func (c *Context) movoDaFunc(name *token, expr *Expr) *Expr { return c.mathFunc(expr, movoda) }

// deep equality for all Expr types
func equalExpr(a, b *Expr) bool {
if a == nil && b == nil {
return true
}
if a == nil || b == nil {
return false
}
if a.sada != nil && b.sada != nil {
// compare tokenType and value
if a.sada.typ != b.sada.typ {
return false
}
if a.sada.typ == 4 { // tokenTypeNumber
return a.sada.num == b.sada.num
}
return a.sada.text == b.sada.text
}
if a.sada != nil || b.sada != nil {
return false
}
// both are cons cells
return equalExpr(a.lawa, b.lawa) && equalExpr(a.kucha, b.kucha)
}

func (c *Context) shatoFunc(name *token, expr *Expr) *Expr {
return truthExpr(equalExpr(Lawa(expr), Lawa(Kucha(expr))))
}
1 change: 1 addition & 0 deletions examples/add.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(celi unu du) ; => 3
1 change: 1 addition & 0 deletions examples/car.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(lawa '(unu du unudu)) ; => unu
1 change: 1 addition & 0 deletions examples/cdr.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(kucha '(unu du unudu)) ; => (du unudu)
2 changes: 2 additions & 0 deletions examples/compare.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
(aba unu du) ; => da
(unta du unu) ; => da
1 change: 1 addition & 0 deletions examples/cond.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(dala ((shato unu du) 'yes) ('no)) ; => 'no
4 changes: 4 additions & 0 deletions examples/defn.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
(muhe(
(add2 (mita (x) (celi x du)))
))
(add2 unu) ; => 3
1 change: 1 addition & 0 deletions examples/hello.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(upa 'olah 'odomu) ; => (olah . odomu)
1 change: 1 addition & 0 deletions examples/lambda.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
((mita (x) (celi x unu)) du) ; => 3
1 change: 1 addition & 0 deletions examples/list.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(lalalakukucha '((1 2) (3 4) ((5 6)) (7 8))) ; => 5
59 changes: 59 additions & 0 deletions examples/odomu_test.mita
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
; cadr
(cadr '(1 2 3)) ; => 2

; caddr
(caddr '(1 2 3)) ; => 3

; cddr
(cddr '(1 2 3)) ; => (3)

; list
(list 1 2 3) ; => (1 2 3)

; length
(length '(1 2 3)) ; => 3

; map
(map (mita (x) (celi x x)) '(1 2 3)) ; => (1 4 9)

; filter
(filter (mita (x) (aba x du)) '(1 2 3)) ; => (1)

; reduce
(reduce (mita (a b) (celi a b)) 0 '(1 2 3)) ; => 6

; append
(append '(1 2) '(3 4)) ; => (1 2 3 4)

; reverse
(reverse '(1 2 3)) ; => (3 2 1)

; assoc
(assoc 'b '((a 1) (b 2) (c 3))) ; => (b 2)

; member
(member 'a '(b a c)) ; => da

; last
(last '(1 2 3)) ; => 3

; nth
(nth 1 '(a b c)) ; => b

; and
(and da da nye) ; => nye

; or
(or nye da nye) ; => da

; not
(not da) ; => nye

; equal
(equal unu unu) ; => da

; remove
(remove 'a '(a b a c)) ; => (b c)

; flatten
(flatten '((1 2) (3 (4 5)))) ; => (1 2 3 4 5)
91 changes: 91 additions & 0 deletions odomu.mita
Original file line number Diff line number Diff line change
@@ -1,2 +1,93 @@
(muhe(
; cadr: (cadr '(1 2 3)) => 2
(cadr (mita (lst) (lawa (kucha lst))))

; caddr: (caddr '(1 2 3)) => 3
(caddr (mita (lst) (lawa (kucha (kucha lst)))))

; cddr: (cddr '(1 2 3)) => (3)
(cddr (mita (lst) (kucha (kucha lst))))

; list: (list 1 2 3) => (1 2 3)
(list (mita args args))

; length: (length '(1 2 3)) => 3
(length (mita (lst)
(dala ((or (shato lst nya) (or (shato lst '()) (shato lst nil))) 0)
(da (celi unu (length (kucha lst)))))))

; map: (map (mita (x) (celi x x)) '(1 2 3)) => (1 4 9)
(map (mita (f lst)
(dala ((shato lst nya) '())
(da (upa (f (lawa lst)) (map f (kucha lst)))))))

; filter: (filter (mita (x) (aba x du)) '(1 2 3)) => (1)
(filter (mita (pred lst)
(dala ((shato lst nya) '())
(da (dala ((pred (lawa lst))
(upa (lawa lst) (filter pred (kucha lst))))
(filter pred (kucha lst)))))))

; reduce: (reduce (mita (a b) (celi a b)) 0 '(1 2 3)) => 6
(reduce (mita (f acc lst)
(dala ((shato lst nya) acc)
(da (reduce f (f acc (lawa lst)) (kucha lst))))))

; append: (append '(1 2) '(3 4)) => (1 2 3 4)
(append (mita (a b)
(dala ((shato a nya) b)
(da (upa (lawa a) (append (kucha a) b))))))

; reverse: (reverse '(1 2 3)) => (3 2 1)
(reverse (mita (lst)
(reduce (mita (acc x) (upa x acc)) '() lst)))

; assoc: (assoc 'b '((a 1) (b 2) (c 3))) => (b 2)
(assoc (mita (key alist)
(dala ((shato alist nya) nye)
(da (dala ((shato key (lawa (lawa alist))) (lawa alist))
(assoc key (kucha alist)))))))

; member: (member 'a '(b a c)) => da
(member (mita (x lst)
(dala ((shato lst nya) nye)
(da (dala ((shato x (lawa lst)) da)
(member x (kucha lst)))))))

; last: (last '(1 2 3)) => 3
(last (mita (lst)
(dala ((shato (kucha lst) nya) (lawa lst))
(da (last (kucha lst))))))

; nth: (nth 1 '(a b c)) => b
(nth (mita (n lst)
(dala ((shato n 0) (lawa lst))
(da (nth (movo n unu) (kucha lst))))))

; and: (and da da nye) => nye
(and (mita args
(reduce (mita (a b) (dala ((shato a da) b) a)) da args)))

; or: (or nye da nye) => da
(or (mita args
(reduce (mita (a b) (dala ((shato a da) da) b)) nye args)))

; not: (not (da)) => nye
(not (mita (x) (nyeshato x da)))

; equal: (equal a b) => da/nye
(equal (mita (a b) (shato a b)))

; remove: (remove 'a '(a b a c)) => (b c)
(remove (mita (x lst)
(dala ((shato lst nya) '())
(da (dala ((shato x (lawa lst)) (remove x (kucha lst)))
(upa (lawa lst) (remove x (kucha lst))))))))

; flatten: (flatten '((1 2) (3 (4 5)))) => (1 2 3 4 5)
(flatten (mita (lst)
(dala ((shato lst nya) '())
(da (dala ((shato (lawa lst) nya) (flatten (kucha lst)))
(dala ((shato (lawa lst) '()) (flatten (kucha lst)))
(append (flatten (lawa lst)) (flatten (kucha lst)))))))))
))