branch: elpa/llama commit df15d5385b4add2c2768afb481dfd14680c28c64 Author: Jonas Bernoulli <jo...@bernoul.li> Commit: Jonas Bernoulli <jo...@bernoul.li>
Handle explicit unused arguments in vectors and dotted-lists too To do so, merge the code-paths for regular lists, dotted-lists and vectors. --- llama-test.el | 11 ----------- llama.el | 36 +++++++++++++++++++----------------- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/llama-test.el b/llama-test.el index 3e380b8c04..e06719d0e7 100644 --- a/llama-test.el +++ b/llama-test.el @@ -311,7 +311,6 @@ (cons 'list (nreverse body)))) (ert-deftest llama-test-502-vector nil - :expected-result :failed ;; Real world example: (##-let [val %1] ...). @@ -324,15 +323,11 @@ (llama-test--flatten [%2 [%1]])))) (should (equal (##llama-test--flatten [%1 _%2 %3]) - ;; failure: - ;; (lambda (%1 _%2 %3) - ;; (llama-test--flatten [%1 llama--unused-argument %3])) (lambda (%1 _%2 %3) (llama-test--flatten [%1 %3])))) ) (ert-deftest llama-test-502-dotted nil - :expected-result :failed ;; Real world example: ???. @@ -345,16 +340,10 @@ (llama-test--flatten (%1 %2 . %3))))) (should (equal (##llama-test--flatten (%1 _%2 . %3)) - ;; failure: - ;; (lambda (%1 _%2 %3) - ;; (llama-test--flatten (%1 _%2 . %3))) (lambda (%1 _%2 %3) (llama-test--flatten (%1 . %3))))) (should (equal (##llama-test--flatten (%1 _%2 %3 . %4)) - ;; failure: - ;; (lambda (%1 _%2 %3 %4) - ;; (llama-test--flatten (%1 _%2 %3 . %4))) (lambda (%1 _%2 %3 %4) (llama-test--flatten (%1 %3 . %4))))) ) diff --git a/llama.el b/llama.el index 591b28368a..0900a3ffe4 100644 --- a/llama.el +++ b/llama.el @@ -198,24 +198,26 @@ this trickery, you can alternatively use this macro under the name (expr))))) ((memq (car-safe expr) '(## quote)) expr) - ((and (listp expr) (ignore-errors (length expr))) - (let ((fnpos t)) - (mapcan (lambda (elt) - (setq elt (llama--collect elt args fnpos)) - (setq fnpos nil) - (and (not (eq elt llama--unused-argument)) - (list elt))) - expr))) - ((listp expr) - (prog1 expr - (while (consp (cdr expr)) - (llama--collect (car expr) args) - (setq expr (cdr expr))) + ((or (listp expr) + (vectorp expr)) + (let* ((vectorp (vectorp expr)) + (expr (if vectorp (append expr ()) expr)) + (fnpos (and (not vectorp) + (ignore-errors (length expr)))) ;proper-list-p + (ret ())) + (catch t + (while t + (let ((elt (llama--collect (car expr) args fnpos))) + (unless (eq elt llama--unused-argument) + (push elt ret))) + (setq fnpos nil) + (setq expr (cdr expr)) + (unless (and expr (listp expr)) + (throw t nil)))) + (setq ret (nreverse ret)) (when expr - (llama--collect (car expr) args) - (llama--collect (cdr expr) args)))) - ((vectorp expr) - (vconcat (mapcar (lambda (elt) (llama--collect elt args)) expr))) + (setcdr (last ret) (llama--collect expr args))) + (if vectorp (vconcat ret) ret))) (expr))) ;;; Advices