From: Stefan Monnier Date: Sat, 29 May 2021 18:24:23 +0000 (-0400) Subject: * lisp/mpc.el (mpc-format): Fix inf-loop in constructed predicate X-Git-Tag: emacs-28.0.90~2273 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c97716e9a201c8b5fe0aad414f1846ace878258e;p=emacs.git * lisp/mpc.el (mpc-format): Fix inf-loop in constructed predicate --- diff --git a/lisp/mpc.el b/lisp/mpc.el index f7302750389..9addb70f56a 100644 --- a/lisp/mpc.el +++ b/lisp/mpc.el @@ -1027,10 +1027,14 @@ If PLAYLIST is t or nil or missing, use the main playlist." (let ((dir (file-name-directory (cdr (assq 'file info))))) ;; (debug) (setq pred - (lambda (info) - (and (funcall pred info) - (equal dir (file-name-directory - (cdr (assq 'file info))))))) + ;; We want the closure to capture the current + ;; value of `pred' and not a reference to the + ;; variable itself. + (let ((oldpred pred)) + (lambda (info) + (and (funcall oldpred info) + (equal dir (file-name-directory + (cdr (assq 'file info)))))))) (if-let* ((covers '(".folder.png" "cover.jpg" "folder.jpg")) (cover (cl-loop for file in (directory-files (mpc-file-local-copy dir)) if (member (downcase file) covers) @@ -1057,9 +1061,13 @@ If PLAYLIST is t or nil or missing, use the main playlist." (when (and (null val) (eq tag 'Title)) (setq val (cdr (assq 'file info)))) (setq pred - (lambda (info) - (and (funcall pred info) - (equal val (cdr (assq ',tag info)))))) + ;; We want the closure to capture the current + ;; value of `pred' and not a reference to the + ;; variable itself. + (let ((oldpred pred)) + (lambda (info) + (and (funcall oldpred info) + (equal val (cdr (assq tag info))))))) (cond ((not (and (eq tag 'Date) (stringp val))) val) ;; For "date", only keep the year!