lua: generic for-in; ipairs/pairs/next; arity-tolerant fns +9 tests
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled

This commit is contained in:
2026-04-24 18:23:50 +00:00
parent e224fb2db0
commit 0934c4bd28
5 changed files with 313 additions and 42 deletions

View File

@@ -448,3 +448,84 @@
(cond
((lua-multi? r) (cons (quote lua-multi) (cons true (rest r))))
(else (list (quote lua-multi) true r)))))))
(define
lua-ipairs-iter
(fn
(t i)
(let
((nk (+ i 1)))
(let
((v (get t (str nk))))
(if (= v nil) nil (list (quote lua-multi) nk v))))))
(define
lua-ipairs
(fn
(t)
(list (quote lua-multi) lua-ipairs-iter t 0)))
(define ipairs lua-ipairs)
(define
lua-next-skip-meta
(fn
(ks)
(cond
((= (len ks) 0) (list))
((= (first ks) "__meta") (lua-next-skip-meta (rest ks)))
(else ks))))
(define
lua-next-after
(fn
(ks prev-key)
(cond
((= (len ks) 0) (list))
((= (first ks) (str prev-key)) (lua-next-skip-meta (rest ks)))
(else (lua-next-after (rest ks) prev-key)))))
(define
lua-key-to-value
(fn
(k)
(cond
((= k "true") true)
((= k "false") false)
(else
(let
((n (lua-to-number k))) (if (= n nil) k n))))))
(define
lua-next
(fn
(&rest args)
(let
((t (first args))
(prev (if (> (len (rest args)) 0) (first (rest args)) nil)))
(let
((all-keys (keys t)))
(let
((ks (if (= prev nil) (lua-next-skip-meta all-keys) (lua-next-after all-keys prev))))
(cond
((= (len ks) 0) nil)
(else
(let
((k (first ks)))
(list (quote lua-multi) (lua-key-to-value k) (get t k))))))))))
(define next lua-next)
(define
lua-pairs
(fn
(t)
(list (quote lua-multi) lua-next t nil)))
(define pairs lua-pairs)
(define
lua-arg
(fn
(args i)
(if (< i (len args)) (nth args i) nil)))