added userlib reduce function

Signed-off-by: Ava Hahn <ava@sunnypup.io>
This commit is contained in:
Ava Apples Affine 2023-03-20 21:07:16 -07:00
parent 3f75157fac
commit 4f6622730a
Signed by: affine
GPG key ID: 3A4645B8CF806069
3 changed files with 28 additions and 1 deletions

View file

@ -507,7 +507,6 @@ Note: this section only tracks the state of incomplete TODO items. Having everyt
- Custom ast pretty print
- Implement Compose for lambdas
Document this in relevant readme sections
- Userlib Reduce function
- File operations
- read-to-string
- write-to-file

View file

@ -35,6 +35,7 @@
(let ((test-val 0))
(set (q test-val) 3)
(eq? test-val 3))))
('prepend prepends to list'
(quote
(let ((list (2 3 4))
@ -48,6 +49,12 @@
(adder (lambda (x) (add 1 x))))
(eq? (map adder list) (2 3 4)))))
('reduce function adds numbers'
(quote
(let ((list (1 2 3))
(adder (lambda (x y) (add x y))))
(eq? (reduce adder list) (add 1 2 3)))))
;; add more test cases here
))

View file

@ -64,3 +64,24 @@ result is added to a new list. Returns the new list.'
(set (q result) (cons result current-res))
(set (q list-iter) (pop remaining))))
result))
(def reduce
'Takes two arguments: a function and a list.
The function is expected to take two arguments:
* the current list item
* the previous result
Initially the function will take element1 and element2, outputting result1.
Then the function will take result1 and element3, outputting result2.
this will continue iuntil the list is exhausted.'
(func list)
(let ((list-iter (pop list))
(result (car list-iter)))
(set (q list-iter) (pop (cdr list-iter)))
(if (lt? (len list) 2)
(echo "list too short!")
(while (gt? (len list-iter) 1)
(let ((current (car list-iter))
(remaining (cdr list-iter)))
(set (q result) (func result current))
(set (q list-iter) (pop remaining)))))
result))