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
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user