 The time (@n-units-ago) filter may not exactly match the
 original, but will be equal in its effect."
   (let ((output ()))
-    (cl-destructuring-bind
-        (after must-have must-not-have matches not-matches limit) filter
+    (let ((after (plist-get filter :after))
+          (must-have (plist-get filter :must-have))
+          (must-not-have (plist-get filter :must-not-have))
+          (matches (plist-get filter :matches))
+          (not-matches (plist-get filter :not-matches))
+          (limit (plist-get filter :limit)))
       (when after
         (push (elfeed-search--recover-units after) output))
       (dolist (tag must-have)


Executing a filter in bytecode form is generally faster than
\"interpreting\" the filter with `elfeed-search-filter'."
  (cl-destructuring-bind
      (after must-have must-not-have matches not-matches limit) filter
    `(lambda (,(if (or after matches not-matches must-have must-not-have)
                   'entry
                 '_entry)

      (insert "(" tags-str ")"))))

(defun elfeed-search-parse-filter (filter)
  "Parse the elements of a search filter into a plist."
  (let ((must-have ())
        (must-not-have ())
        (after nil)
