emacs-devel
[Top][All Lists]
Advanced

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

Re: [elpa] master 550ae83 1/2: [gnugo int] Decruft: Don't declare hook a


From: Thien-Thi Nguyen
Subject: Re: [elpa] master 550ae83 1/2: [gnugo int] Decruft: Don't declare hook and keymap vars.
Date: Thu, 09 Feb 2017 18:39:58 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.0.50 (gnu/linux)

() Stefan Monnier <address@hidden>
() Wed, 08 Feb 2017 17:28:44 -0500

   why you prefer the non-idiomatic way

I don't know what to call idiomatic or non-idiomatic.  I simply
try to muddle through (i.e., survive w/o {add,los}ing many gray
hairs) the evolution of Emacs.  In the old days, the model was:

 (defvar MODE-map nil)                    ; model A
 (defun MODE () ...)
 (unless MODE-map
   (setq MODE-amp INIT))

This and the byte-compiled result worked fine for many years,
satisfying the design goals: (a) declare once; (b) init once,
even during re-‘load’ (to avoid clobbering customizations); (c)
init only after commands are defined.  Aside: (c) is arguably
non-idiomatic to begin w/ for Emacs Lisp; it's a personal
aesthetic born from exposure to C and Guile, where keeping
definitions topologically sorted makes for less-cluttered code.

Then, at some point ‘define-derived-mode’ was introduced and i
tried the modified model:

 (defvar MODE-map nil)                    ; model B
 (define-derived-mode MODE ...)
 (unless MODE-map
   (setq MODE-map INIT))

This worked sometimes, but not others.  I suspect the times it
didn't work were when byte-compiling substituted the ‘nil’ in
the declaration for ‘(make-sparse-keymap)’, resulting in the
‘unless’ CONDITION evaluating to true and thus precluding init.

Rather than investigate further, i vaguely recall reluctantly
forgoing design goal (c) and adopting the model:

 (defvar MODE-map INIT)                   ; model C
 (define-derived-mode MODE ...)

The comment in the removed INIT in the patch (in Subject) shows
some of the hand-wringing involved w/ the B-C transition.  What
i (somewhat stupidly) didn't realize at the time is that using
‘define-derived-mode’ (models B and later) already departs from
design goal (a).  So that brings us to the present model:

 (define-derived-mode MODE ...)           ; model D
 (unless EXPECTED-MODE-map-BINDING
   (INITIALZE MODE-map))

which once again supports all three design goals, though less
perfectly (CONDITION was algorithmic, now heuristic) than model
A.  I think in this case, the chosen CONDITION is close enough.

Anyway, i especially enjoy the reduction in forms, which is what
i imagine the introduction of ‘define-derived-mode’ was supposed
to achieve.  Pruned profligacy for perplexable programmers!  :-D

-- 
Thien-Thi Nguyen -----------------------------------------------
 (defun responsep (query)
   (pcase (context query)
     (`(technical mailing-list) t)
     ...))                              748E A0E8 1CB8 A748 9BFA
--------------------------------------- 6CE4 6703 2224 4C80 7502

Attachment: signature.asc
Description: PGP signature


reply via email to

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