branch: elpa/llama
commit a5fb525684260dee7c3381740e61421f7bb0ecc3
Author: Jonas Bernoulli <jo...@bernoul.li>
Commit: Jonas Bernoulli <jo...@bernoul.li>

    Add special handling of backquote
---
 llama-test.el | 11 +++++++++++
 llama.el      | 18 ++++++++++++++----
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/llama-test.el b/llama-test.el
index e06719d0e7..6650c61e6f 100644
--- a/llama-test.el
+++ b/llama-test.el
@@ -355,6 +355,17 @@
                    (cons %1 '(%2)))))
   )
 
+(ert-deftest llama-test-504-backquoted nil
+
+  (should (equal (##list `(,%1 %2 ,%3))
+                 (lambda (%1 _%2 %3)
+                   (list `(,%1 %2 ,%3)))))
+
+  (should (equal (##list `(,%1 %2 (,%3) ,%4 . ,%5))
+                 (lambda (%1 _%2 %3 %4 %5)
+                   (list `(,%1 %2 (,%3) ,%4 . ,%5)))))
+  )
+
 (ert-deftest llama-test-901-errors-first nil
   (should-error (##list  %1   &1))
   (should-error (##list  &1   %1))
diff --git a/llama.el b/llama.el
index 7d58ba9d11..44a66c0a95 100644
--- a/llama.el
+++ b/llama.el
@@ -176,9 +176,16 @@ this trickery, you can alternatively use this macro under 
the name
 
 (defconst llama--unused-argument (make-symbol "llama--unused-argument"))
 
-(defun llama--collect (expr args &optional fnpos)
+(defun llama--collect (expr args &optional fnpos backquoted)
   (cond
    ((memq (car-safe expr) '(## quote)) expr)
+   ((and backquoted (symbolp expr)) expr)
+   ((and backquoted (eq (car-safe expr) backquote-unquote-symbol))
+    (cons backquote-unquote-symbol
+          (llama--collect (cdr expr) args)))
+   ((eq (car-safe expr) backquote-backquote-symbol)
+    (cons backquote-backquote-symbol
+          (llama--collect (cdr expr) args nil t)))
    ((symbolp expr)
     (let ((name (symbol-name expr)))
       (save-match-data
@@ -202,20 +209,23 @@ this trickery, you can alternatively use this macro under 
the name
     (let* ((vectorp (vectorp expr))
            (expr (if vectorp (append expr ()) expr))
            (fnpos (and (not vectorp)
+                       (not backquoted)
                        (ignore-errors (length expr)))) ;proper-list-p
            (ret ()))
       (catch t
         (while t
-          (let ((elt (llama--collect (car expr) args fnpos)))
+          (let ((elt (llama--collect (car expr) args fnpos backquoted)))
             (unless (eq elt llama--unused-argument)
               (push elt ret)))
           (setq fnpos nil)
           (setq expr (cdr expr))
-          (unless (and expr (listp expr))
+          (unless (and expr
+                       (listp expr)
+                       (not (eq (car expr) backquote-unquote-symbol)))
             (throw t nil))))
       (setq ret (nreverse ret))
       (when expr
-        (setcdr (last ret) (llama--collect expr args)))
+        (setcdr (last ret) (llama--collect expr args nil backquoted)))
       (if vectorp (vconcat ret) ret)))
    (expr)))
 

Reply via email to