emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Using lexical-binding


From: Kyle Meyer
Subject: Re: Using lexical-binding
Date: Tue, 09 Mar 2021 00:35:06 -0500

Looking at this one more time before applying, I noticed a couple of
backward compatibility issues.

Stefan Monnier writes:

> Subject: [PATCH] * lisp/org-agenda.el: Use lexical-binding
[...]
> +             (pcase type
> +               ('agenda
> +                (org-agenda-list current-prefix-arg))

Unfortunately Org's minimum Emacs version is still Emacs 24.3.  I'd like
to drop Emacs 24 support soon, but that hasn't been discussed or
announced.

And...

> +  (let* ((gprops (nth 1 series))
> +         (gvars (mapcar #'car gprops))
> +         (gvals (mapcar (lambda (binding) (eval (cadr binding) t)) gprops)))
> +    (cl-progv gvars gvals (org-agenda-prepare name))
> +    ;; We need to reset agenda markers here, because when constructing a
> +    ;; block agenda, the individual blocks do not do that.
> +    (org-agenda-reset-markers)
> +    (with-suppressed-warnings ((lexical match))

... I believe with-suppressed-warnings isn't available until Emacs 27.1,
right?

Any objections to me squashing the below changes into your patch?

diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index 001ca4b1b..d08cab061 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -2938,30 +2938,30 @@ (defun org-agenda (&optional arg keys restriction)
                  (mapcar #'car lprops)
                  (mapcar (lambda (binding) (eval (cadr binding) t)) lprops)
                (pcase type
-                 ('agenda
+                 (`agenda
                   (org-agenda-list current-prefix-arg))
-                 ('agenda*
+                 (`agenda*
                   (org-agenda-list current-prefix-arg nil nil t))
-                 ('alltodo
+                 (`alltodo
                   (org-todo-list current-prefix-arg))
-                 ('search
+                 (`search
                   (org-search-view current-prefix-arg org-match nil))
-                 ('stuck
+                 (`stuck
                   (org-agenda-list-stuck-projects current-prefix-arg))
-                 ('tags
+                 (`tags
                   (org-tags-view current-prefix-arg org-match))
-                 ('tags-todo
+                 (`tags-todo
                   (org-tags-view '(4) org-match))
-                 ('todo
+                 (`todo
                   (org-todo-list org-match))
-                 ('tags-tree
+                 (`tags-tree
                   (org-check-for-org-mode)
                   (org-match-sparse-tree current-prefix-arg org-match))
-                 ('todo-tree
+                 (`todo-tree
                   (org-check-for-org-mode)
                   (org-occur (concat "^" org-outline-regexp "[ \t]*"
                                      (regexp-quote org-match) "\\>")))
-                 ('occur-tree
+                 (`occur-tree
                   (org-check-for-org-mode)
                   (org-occur org-match))
                  ((pred functionp)
@@ -3263,7 +3263,7 @@ (defun org-agenda-run-series (name series)
     ;; We need to reset agenda markers here, because when constructing a
     ;; block agenda, the individual blocks do not do that.
     (org-agenda-reset-markers)
-    (with-suppressed-warnings ((lexical match))
+    (org-with-suppressed-warnings ((lexical match))
       (defvar match))          ;Used via the `eval' below.
     (let* ((org-agenda-multi t)
           ;; FIXME: Redo should contain lists of (FUNS . ARGS) rather
@@ -3285,21 +3285,21 @@ (defun org-agenda-run-series (name series)
               (lvals (mapcar (lambda (binding) (eval (cadr binding) t)) 
lprops)))
           (cl-progv (append gvars lvars) (append gvals lvals)
            (pcase type
-             ('agenda
+             (`agenda
               (call-interactively 'org-agenda-list))
-             ('agenda*
+             (`agenda*
               (funcall 'org-agenda-list nil nil t))
-             ('alltodo
+             (`alltodo
               (call-interactively 'org-todo-list))
-             ('search
+             (`search
               (org-search-view current-prefix-arg match nil))
-             ('stuck
+             (`stuck
               (call-interactively 'org-agenda-list-stuck-projects))
-             ('tags
+             (`tags
               (org-tags-view current-prefix-arg match))
-             ('tags-todo
+             (`tags-todo
               (org-tags-view '(4) match))
-             ('todo
+             (`todo
               (org-todo-list match))
              ((pred fboundp)
               (funcall type match))
@@ -5363,7 +5363,7 @@ (defun org-diary (&rest args)
 The function expects the lisp variables `entry' and `date' to be provided
 by the caller, because this is how the calendar works.  Don't use this
 function from a program - use `org-agenda-get-day-entries' instead."
-  (with-suppressed-warnings ((lexical date entry)) (defvar date) (defvar 
entry))
+  (org-with-suppressed-warnings ((lexical date entry)) (defvar date) (defvar 
entry))
   (when (> (- (float-time)
              org-agenda-last-marker-time)
           5)
@@ -5678,7 +5678,7 @@ (defun org-agenda-get-timestamps (&optional deadlines)
   "Return the date stamp information for agenda display.
 Optional argument DEADLINES is a list of deadline items to be
 displayed in agenda view."
-  (with-suppressed-warnings ((lexical date)) (defvar date))
+  (org-with-suppressed-warnings ((lexical date)) (defvar date))
   (let* ((props (list 'face 'org-agenda-calendar-event
                      'org-not-done-regexp org-not-done-regexp
                      'org-todo-regexp org-todo-regexp
@@ -5821,7 +5821,7 @@ (defun org-agenda-get-timestamps (&optional deadlines)
 (defun org-agenda-get-sexps ()
   "Return the sexp information for agenda display."
   (require 'diary-lib)
-  (with-suppressed-warnings ((lexical date entry)) (defvar date) (defvar 
entry))
+  (org-with-suppressed-warnings ((lexical date entry)) (defvar date) (defvar 
entry))
   (let* ((props (list 'face 'org-agenda-calendar-sexp
                      'mouse-face 'highlight
                      'help-echo
@@ -5910,7 +5910,7 @@ (defun org-class (y1 m1 d1 y2 m2 d2 dayname &rest 
skip-weeks)
 `holidays', then any date that is known by the Emacs calendar to be a
 holiday will also be skipped.  If SKIP-WEEKS arguments are holiday strings,
 then those holidays will be skipped."
-  (with-suppressed-warnings ((lexical date entry)) (defvar date) (defvar 
entry))
+  (org-with-suppressed-warnings ((lexical date entry)) (defvar date) (defvar 
entry))
   (let* ((date1 (calendar-absolute-from-gregorian (list m1 d1 y1)))
         (date2 (calendar-absolute-from-gregorian (list m2 d2 y2)))
         (d (calendar-absolute-from-gregorian date))
@@ -5930,7 +5930,7 @@ (defun org-class (y1 m1 d1 y2 m2 d2 dayname &rest 
skip-weeks)
 (defalias 'org-get-closed #'org-agenda-get-progress)
 (defun org-agenda-get-progress ()
   "Return the logged TODO entries for agenda display."
-  (with-suppressed-warnings ((lexical date)) (defvar date))
+  (org-with-suppressed-warnings ((lexical date)) (defvar date))
   (let* ((props (list 'mouse-face 'highlight
                      'org-not-done-regexp org-not-done-regexp
                      'org-todo-regexp org-todo-regexp
@@ -6162,7 +6162,7 @@ (defun org-agenda-get-deadlines (&optional with-hour)
   "Return the deadline information for agenda display.
 When WITH-HOUR is non-nil, only return deadlines with an hour
 specification like [h]h:mm."
-  (with-suppressed-warnings ((lexical date)) (defvar date))
+  (org-with-suppressed-warnings ((lexical date)) (defvar date))
   (let* ((props (list 'mouse-face 'highlight
                      'org-not-done-regexp org-not-done-regexp
                      'org-todo-regexp org-todo-regexp
@@ -6321,7 +6321,7 @@ (defun org-agenda-get-scheduled (&optional deadlines 
with-hour)
 Optional argument DEADLINES is a list of deadline items to be
 displayed in agenda view.  When WITH-HOUR is non-nil, only return
 scheduled items with an hour specification like [h]h:mm."
-  (with-suppressed-warnings ((lexical date)) (defvar date))
+  (org-with-suppressed-warnings ((lexical date)) (defvar date))
   (let* ((props (list 'org-not-done-regexp org-not-done-regexp
                      'org-todo-regexp org-todo-regexp
                      'org-complex-heading-regexp org-complex-heading-regexp
@@ -6522,7 +6522,7 @@ (defun org-agenda-get-scheduled (&optional deadlines 
with-hour)
 
 (defun org-agenda-get-blocks ()
   "Return the date-range information for agenda display."
-  (with-suppressed-warnings ((lexical date)) (defvar date))
+  (org-with-suppressed-warnings ((lexical date)) (defvar date))
   (let* ((props (list 'face nil
                      'org-not-done-regexp org-not-done-regexp
                      'org-todo-regexp org-todo-regexp
@@ -6691,7 +6691,7 @@ (defun org-agenda-format-item (extra txt &optional level 
category tags dotime
                 org-agenda-show-inherited-tags
                 org-agenda-hide-tags-regexp))
 
-      (with-suppressed-warnings
+      (org-with-suppressed-warnings
          ((lexical breadcrumbs category category-icon effort extra
                    level tag time))
        ;; `time', `tag', `effort' are needed for the eval of the prefix format.
diff --git a/lisp/org-macs.el b/lisp/org-macs.el
index 63f0a0acb..92fdef0a0 100644
--- a/lisp/org-macs.el
+++ b/lisp/org-macs.el
@@ -629,6 +629,12 @@ (defun org-unlogged-message (&rest args)
   (let ((message-log-max nil))
     (apply #'message args)))
 
+(if (fboundp 'with-suppressed-warnings)  ; Introduced in Emacs 27.1.
+    (defalias 'org-with-suppressed-warnings 'with-suppressed-warnings)
+  (defmacro org-with-suppressed-warnings (_warnings &rest body)
+    (declare (debug (sexp &optional body)) (indent 1))
+    `(progn ,@body)))
+
 (defmacro org-dlet (binders &rest body)
   "Like `let*' but using dynamic scoping."
   (declare (indent 1) (debug let))
@@ -636,7 +642,7 @@ (defmacro org-dlet (binders &rest body)
                         (if (consp binder) (car binder) binder))
                       binders)))
     `(progn
-       (with-suppressed-warnings ((lexical ,@vars))
+       (org-with-suppressed-warnings ((lexical ,@vars))
          ,@(mapcar (lambda (var) `(defvar ,var)) vars))
        (let* ,binders ,@body))))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]