From 4f6622730ae10fcd414d39abb71c91348b03cc4e Mon Sep 17 00:00:00 2001 From: Ava Hahn Date: Mon, 20 Mar 2023 21:07:16 -0700 Subject: [PATCH] added userlib reduce function Signed-off-by: Ava Hahn --- Readme.org | 1 - snippets/userlib-tests.rls | 7 +++++++ snippets/userlib.rls | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Readme.org b/Readme.org index e9408fa..f24e3a7 100644 --- a/Readme.org +++ b/Readme.org @@ -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 diff --git a/snippets/userlib-tests.rls b/snippets/userlib-tests.rls index ab46c66..e2ab3bf 100644 --- a/snippets/userlib-tests.rls +++ b/snippets/userlib-tests.rls @@ -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 )) diff --git a/snippets/userlib.rls b/snippets/userlib.rls index 41f9d79..0cef067 100644 --- a/snippets/userlib.rls +++ b/snippets/userlib.rls @@ -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))