Discussion:
bug#22317: 25.0.50; mh-e: wrong usage of cl-flet
Glenn Morris
2016-01-14 17:46:20 UTC
Permalink
mh-e-devel, FYI:

http://debbugs.gnu.org/22317
Hi,
mh-e uses Gnus functions to render MIME messages and uses the
mh-cl-flet macro to modify some of them. Currently mh-e always
loads cl (see mh-acros.el), so both cl-flet and flet are available
,----
| ;; Emacs 24 renamed flet to cl-flet.
| (defalias 'mh-cl-flet
| (if (fboundp 'cl-flet)
| 'cl-flet
| 'flet))
`----
However, cl-flet is quite unlike flet, IIUC. For instance, if
cl-flet is used, the mh-cl-flet code in mh-display-emphasis
,----
| ;; (defun mh-display-emphasis ()
| ;; "Display graphical emphasis."
| ;; (when (and mh-graphical-emphasis-flag (mh-small-show-buffer-p))
| (mh-cl-flet
| ((article-goto-body ())) ; shadow this function to do nothing
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
| ;; ))
`----
will be expanded to
,----
| (progn
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
`----
,----
| (let* ((vnew (cl-function (lambda nil
| (cl-block article-goto-body))))
| (old (symbol-function 'article-goto-body)))
| (unwind-protect
| (progn
| (fset 'article-goto-body vnew)
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
| (fset 'article-goto-body old)))
`----
Note that the former doesn't achieve the original target, i.e.,
article-goto-body is not modified while running article-emphasize.
I don't know how it damages the behavior of mh-e, but I think it
should be fixed anyway. If mh-e keeps loading cl as ever,
(defalias 'mh-cl-flet 'flet)
Otherwise use this complete Emacs-Lisp style flet emulation macro
--8<---------------cut here---------------start------------->8---
(defmacro mh-cl-flet (bindings &rest body)
"Make temporary overriding function definitions.
This is an analogue of a dynamically scoped `let' that operates on
the function cell of FUNCs rather than their value cell.
\(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
(require 'cl)
(if (fboundp 'cl-letf)
`(cl-letf ,(mapcar (lambda (binding)
`((symbol-function ',(car binding))
bindings)
(put 'mh-cl-flet 'lisp-indent-function 1)
(put 'mh-cl-flet 'edebug-form-spec
'((&rest (sexp sexp &rest form)) &rest form))
--8<---------------cut here---------------end--------------->8---
I'm not the right person to install it since I'm not a mh-e user,
sorry.
Regards,
Bill Wohler
2016-01-14 18:42:15 UTC
Permalink
Thanks for the very detailed message. I'll implement your suggestions in
the next release of MH-E. I'm hoping it may fix some mysterious issues
we've been seeing since Emacs 24 came out.
Post by Glenn Morris
http://debbugs.gnu.org/22317
Hi,
mh-e uses Gnus functions to render MIME messages and uses the
mh-cl-flet macro to modify some of them. Currently mh-e always
loads cl (see mh-acros.el), so both cl-flet and flet are available
,----
| ;; Emacs 24 renamed flet to cl-flet.
| (defalias 'mh-cl-flet
| (if (fboundp 'cl-flet)
| 'cl-flet
| 'flet))
`----
However, cl-flet is quite unlike flet, IIUC. For instance, if
cl-flet is used, the mh-cl-flet code in mh-display-emphasis
,----
| ;; (defun mh-display-emphasis ()
| ;; "Display graphical emphasis."
| ;; (when (and mh-graphical-emphasis-flag (mh-small-show-buffer-p))
| (mh-cl-flet
| ((article-goto-body ())) ; shadow this function to do nothing
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
| ;; ))
`----
will be expanded to
,----
| (progn
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
`----
,----
| (let* ((vnew (cl-function (lambda nil
| (cl-block article-goto-body))))
| (old (symbol-function 'article-goto-body)))
| (unwind-protect
| (progn
| (fset 'article-goto-body vnew)
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
| (fset 'article-goto-body old)))
`----
Note that the former doesn't achieve the original target, i.e.,
article-goto-body is not modified while running article-emphasize.
I don't know how it damages the behavior of mh-e, but I think it
should be fixed anyway. If mh-e keeps loading cl as ever,
(defalias 'mh-cl-flet 'flet)
Otherwise use this complete Emacs-Lisp style flet emulation macro
--8<---------------cut here---------------start------------->8---
(defmacro mh-cl-flet (bindings &rest body)
"Make temporary overriding function definitions.
This is an analogue of a dynamically scoped `let' that operates on
the function cell of FUNCs rather than their value cell.
\(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
(require 'cl)
(if (fboundp 'cl-letf)
`(cl-letf ,(mapcar (lambda (binding)
`((symbol-function ',(car binding))
bindings)
(put 'mh-cl-flet 'lisp-indent-function 1)
(put 'mh-cl-flet 'edebug-form-spec
'((&rest (sexp sexp &rest form)) &rest form))
--8<---------------cut here---------------end--------------->8---
I'm not the right person to install it since I'm not a mh-e user,
sorry.
Regards,
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
mh-e-devel mailing list
https://lists.sourceforge.net/lists/listinfo/mh-e-devel
--
Bill Wohler <***@newt.com> aka <***@nasa.gov>
http://www.newt.com/wohler/
GnuPG ID:610BD9AD
Bill Wohler
2016-05-31 00:18:14 UTC
Permalink
Fixed and committed to emacs-25 release branch:

commit 0992ec3b0bfaf98edce1d08462e9ec8e11d6b6e6
Author: Bill Wohler <***@newt.com>
Date: Mon May 30 16:49:37 2016 -0700

Correct cl-flet usage (Bug#22317)

* mh-compat.el: Rename mh-cl-flet to mh-flet and convert alias to
macro using patch from Katsumi Yamaoka <***@jpl.org>.
* mh-thread.el (mh-thread-set-tables):
* mh-show.el (mh-gnus-article-highlight-citation):
* mh-mime.el (mh-display-with-external-viewer):
(mh-mime-display, mh-press-button, mh-push-button):
(mh-display-emphasis): Call mh-flet instead of mh-cl-flet.
Post by Glenn Morris
http://debbugs.gnu.org/22317
Hi,
mh-e uses Gnus functions to render MIME messages and uses the
mh-cl-flet macro to modify some of them. Currently mh-e always
loads cl (see mh-acros.el), so both cl-flet and flet are available
,----
| ;; Emacs 24 renamed flet to cl-flet.
| (defalias 'mh-cl-flet
| (if (fboundp 'cl-flet)
| 'cl-flet
| 'flet))
`----
However, cl-flet is quite unlike flet, IIUC. For instance, if
cl-flet is used, the mh-cl-flet code in mh-display-emphasis
,----
| ;; (defun mh-display-emphasis ()
| ;; "Display graphical emphasis."
| ;; (when (and mh-graphical-emphasis-flag (mh-small-show-buffer-p))
| (mh-cl-flet
| ((article-goto-body ())) ; shadow this function to do nothing
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
| ;; ))
`----
will be expanded to
,----
| (progn
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
`----
,----
| (let* ((vnew (cl-function (lambda nil
| (cl-block article-goto-body))))
| (old (symbol-function 'article-goto-body)))
| (unwind-protect
| (progn
| (fset 'article-goto-body vnew)
| (save-excursion
| (goto-char (point-min))
| (article-emphasize)))
| (fset 'article-goto-body old)))
`----
Note that the former doesn't achieve the original target, i.e.,
article-goto-body is not modified while running article-emphasize.
I don't know how it damages the behavior of mh-e, but I think it
should be fixed anyway. If mh-e keeps loading cl as ever,
(defalias 'mh-cl-flet 'flet)
Otherwise use this complete Emacs-Lisp style flet emulation macro
--8<---------------cut here---------------start------------->8---
(defmacro mh-cl-flet (bindings &rest body)
"Make temporary overriding function definitions.
This is an analogue of a dynamically scoped `let' that operates on
the function cell of FUNCs rather than their value cell.
\(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
(require 'cl)
(if (fboundp 'cl-letf)
`(cl-letf ,(mapcar (lambda (binding)
`((symbol-function ',(car binding))
bindings)
(put 'mh-cl-flet 'lisp-indent-function 1)
(put 'mh-cl-flet 'edebug-form-spec
'((&rest (sexp sexp &rest form)) &rest form))
--8<---------------cut here---------------end--------------->8---
I'm not the right person to install it since I'm not a mh-e user,
sorry.
Regards,
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
mh-e-devel mailing list
https://lists.sourceforge.net/lists/listinfo/mh-e-devel
--
Bill Wohler <***@newt.com> aka <***@nasa.gov>
http://www.newt.com/wohler/
GnuPG ID:610BD9AD
Loading...