From: Stefan Monnier <monnier@iro.umontreal.ca>
To: emacs-devel@gnu.org
Subject: Re: Should mode commands be idempotent?
Date: Sat, 23 Sep 2017 16:37:08 -0400 [thread overview]
Message-ID: <jwvefqxrw85.fsf-monnier+gmane.emacs.devel@gnu.org> (raw)
In-Reply-To: jwv1smxtsab.fsf-monnier+gmane.emacs.devel@gnu.org
> the top of my todo list recently (close enough that I thought about it,
> but not close enough to get usable code out of it).
I finally found the the pseudo-code I wrote for it back then, in case
you're interested (it was in my local nadvice.el hacks). See below
(guaranteed 100% untested).
Stefan
;;; Changing variables in general (not just function-valued ones)
;; TODO: Handle buffer-local settings!
;; TODO: Make it work for arbitrary gv-places?
;; TODO: Maybe use it or something similar to keep track of effects of
;; loading a file (where `id' would be the file name)?
(defun advice--var-apply-op (val op v)
(pcase-exhaustive op
(:override v)
(:around (funcall v val))))
(defun advice--var-compute-val (var)
(let ((xs (get var 'advice-var-settings)))
(if (not xs)
(symbol-value var)
(let ((val (car xs)))
(pcase-dolist (`(,_id ,op ,v) (cdr xs))
(setq val (advice--var-apply-op val op v)))
val))))
(defun advice--var-set (var id op v) ;TODO: add a `depth'?
(let ((xs (get var 'advice-var-settings)))
(unless xs
(setq xs (list (symbol-value var)))
(setf (get var 'advice-var-settings) xs))
(unless (equal (symbol-value var)
(advice--var-compute-val var))
(message "Var %S changed outside of `advice-set'" var))
;; FIXME: We could almost use
;; (setf (alist-get id (cdr xs)) (list op v))
;; Except that we want to add new entries at the end!
(let ((x (assoc id (cdr xs))))
(if x
;; There's already another setting for `id'.
(setcdr x (list op v))
(setcdr (last xs) (list (list id op v)))))
(set var (advice--var-compute-val var))))
(defun advice--var-unset (var id)
(let* ((xs (get var 'advice-var-settings))
(x (assoc id (cdr xs))))
(when x
(delq x xs)
(set var (advice--var-compute-val var))
(unless (cdr xs)
(setf (get var 'advice-var-settings) nil)))))
next prev parent reply other threads:[~2017-09-23 20:37 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-19 19:58 Should mode commands be idempotent? Philipp Stephani
2017-09-19 22:10 ` Clément Pit-Claudel
2017-09-19 22:29 ` Stefan Monnier
2017-09-20 7:24 ` Clément Pit-Claudel
2017-09-20 14:52 ` John Wiegley
2017-09-20 22:30 ` Stefan Monnier
2017-09-20 23:05 ` Drew Adams
2017-10-08 15:09 ` Philipp Stephani
2017-09-20 22:25 ` Stefan Monnier
2017-09-23 8:16 ` Clément Pit-Claudel
2017-09-23 14:17 ` Stefan Monnier
2017-09-23 20:37 ` Stefan Monnier [this message]
2017-09-19 22:58 ` Drew Adams
2017-09-20 3:10 ` Stefan Monnier
2017-09-20 17:52 ` Drew Adams
2017-09-21 1:11 ` Stefan Monnier
2017-09-21 5:22 ` Drew Adams
2017-09-21 18:28 ` Richard Stallman
[not found] ` <<9f11a3c6-b113-4bf6-9dab-f894b2ad77b5@default>
[not found] ` <<E1dv6D1-0006Jr-Fl@fencepost.gnu.org>
2017-09-22 15:54 ` Drew Adams
2017-09-23 0:39 ` Richard Stallman
2017-09-23 8:05 ` Clément Pit-Claudel
2017-09-24 17:26 ` Drew Adams
2017-09-25 7:03 ` Clément Pit-Claudel
2017-09-25 13:57 ` Drew Adams
2017-09-26 0:36 ` Stefan Monnier
2017-09-26 3:30 ` John Wiegley
2017-09-26 17:55 ` Drew Adams
2017-09-26 18:01 ` John Wiegley
2017-09-26 18:50 ` Drew Adams
2017-09-26 18:54 ` John Wiegley
2017-10-08 15:28 ` Philipp Stephani
2017-10-08 19:04 ` Stefan Monnier
2017-10-10 2:10 ` John Wiegley
2017-12-21 20:49 ` Philipp Stephani
2017-12-22 2:20 ` Stefan Monnier
2017-10-10 23:15 ` Herring, Davis
[not found] ` <<E1dvYUB-0007na-Mx@fencepost.gnu.org>
2017-09-24 17:26 ` Drew Adams
2017-09-25 22:06 ` Richard Stallman
2017-09-19 23:50 ` John Wiegley
2017-09-20 3:09 ` Stefan Monnier
2017-09-20 13:01 ` Richard Stallman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwvefqxrw85.fsf-monnier+gmane.emacs.devel@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.