 See `elfeed-search-set-filter' for format/syntax documentation.
 This function must *only* be called within the body of
 `with-elfeed-db-visit' because it may perform a non-local exit."
-  (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)))
     (let* ((tags (elfeed-entry-tags entry))
            (date (elfeed-entry-date entry))
            (age (- (float-time) date))


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)

The time (@n-units-ago) filter may not exactly match the
original, but will be equal in its effect."
  (let ((output ()))
    (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)
