From d87028298426b896d85fefd140ea0fe79e5668ec Mon Sep 17 00:00:00 2001 From: Magnar Sveen Date: Fri, 28 Sep 2012 08:28:38 +0200 Subject: [PATCH] Add some tests, and fix the bugs they uncovered. --- README.md | 6 ++++-- bang.el | 9 +++++---- tests.el | 8 ++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b6c806d..530575c 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This is so much a work in progress that you should definitely not be using it ye ## Anaphoric functions While `!filter` takes a function to filter the list by, you can also pass -it a forms - which will then be executed with `it` exposed as the list item. +it a form - which will then be executed with `it` exposed as the list item. Here's an example: (!filter (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) ;; normal version @@ -22,7 +22,9 @@ Here's an example: of course the original can also be written like - (!filter 'even? '(1 2 3 4)) + (defun even? (num) (= 0 (% num 2))) + + (!filter even? '(1 2 3 4)) which demonstrates the usefulness of both versions. diff --git a/bang.el b/bang.el index dc330f9..9f67ed0 100644 --- a/bang.el +++ b/bang.el @@ -46,12 +46,13 @@ It should only be set using dynamic scope with a let, like: (!concat (!map fn list))) (defmacro !filter (form-or-fn list) - `(let (!--result) - (while list - (let ((it (car list))) + `(let ((!--list ,list) + (!--result '())) + (while !--list + (let ((it (car !--list))) (when ,(if (functionp form-or-fn) (list form-or-fn 'it) (list 'progn form-or-fn)) (setq !--result (cons it !--result)))) - (setq list (cdr list))) + (setq !--list (cdr !--list))) (nreverse !--result))) (defun !uniq (list) diff --git a/tests.el b/tests.el index 139df00..5f1a9dc 100644 --- a/tests.el +++ b/tests.el @@ -1,6 +1,14 @@ (require 'ert) (require 'bang) +(defun even? (num) (= 0 (% num 2))) + +(ert-deftest filter () + "`!filter' returns a new list of only those elements where the predicate was non-nil." + (should (equal (!filter (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) '(2 4))) + (should (equal (!filter (= 0 (% it 2)) '(1 2 3 4)) '(2 4))) + (should (equal (!filter even? '(1 2 3 4)) '(2 4)))) + (ert-deftest difference () "`!difference' returns a new list of only elements in list1 that are not in list2." (should (equal (!difference '() '()) '()))