~bzg/emacsfr

4 3

Macro pour les variables custom

Details
Message ID
<87tu8m6qog.fsf@phundrak.com>
DKIM signature
pass
Download raw message
Hello !

Je suis en train de bosser sur une petite macro qui permettrait de
résoudre chez moi un problème assez pénible : gérer simplement la
valeur des variables custom (déclarées avec `defcustom').

Le truc est que les variables custom peuvent avoir leur propre setter
afin de modifier d’autres valeus ailleurs et exécuter du code lorsque
la valeur de la variable est changée, chose qui ne se produit pas
lorsqu’on utilise `setq'. La solution évidente serait d’utiliser
`custom-set-variables', mais je ne trouve pas cette fonction agréable à
utiliser face à la simplicité de `setq'.

Du coup, inspiré par [cet article], je vous présente ma solution pour
une macro ayant une syntaxe similaire à `setq' mais appliquant
correctement (je l’espère) les nouvelles valeurs aux variables custom.
Ma contribution principale à la macro originale est de pouvoir lui
donner plus qu’un couple forme/valeur à la fois, comme avec `setq'.

,----
| (defmacro csetq (&rest forms)
|   "Bind each custom variable FORM to the value of its VAL.
| 
| FORMS is a list of pairs of values [FORM VAL].
| 
| If FORM has a custom setter, use it to set FORM to VAL.
| Otherwise, use `set-default'.
| 
| \(fn [FORM VAL]...)"
|   (declare (debug (&rest sexp form))
|            (indent 1))
|   ;; Check if we have an even number of arguments
|   (when (= (mod (length forms) 2) 1)
|     (signal 'wrong-number-of-arguments (list 'csetq (1+ (length forms)))))
|   (let* (forms-and-values form value)
|     ;; Transform FORMS into a list of pairs (FORM . VALUE)
|     (while forms
|       (setq form  (pop forms))
|       (setq value (pop forms))
|       (add-to-list 'forms-and-values `(,form . ,value) t))
|     ;; Apply VAL to FORM
|     `(progn ,@(mapcar (lambda (form)
|                         `(,(or (get `,(car form) 'custom-set)
|                                'set-default)
|                           ',(car form)
|                           ,(cdr form)))
|                       forms-and-values))))
`----

Si jamais vous avez des retours pour des améliorations du code, je
suis preneur.

--
Lucien “Phundrak” Cartier-Tilet

<https://phundrak.com> (Français)

<https://phundrak.com/en> (English)

Sent from GNU/Emacs


[cet article] <https://oremacs.com/2015/01/17/setting-up-ediff/>
Details
Message ID
<87sfo66q1v.fsf@phundrak.com>
In-Reply-To
<87tu8m6qog.fsf@phundrak.com> (view parent)
DKIM signature
pass
Download raw message
Petite mise à jour du code après un retour sur le serveur Discord de
SystemCrafters :

,----
| (defmacro csetq (&rest forms)
|   "Bind each custom variable FORM to the value of its VAL.
| 
| FORMS is a list of pairs of values [FORM VAL].
| 
| If FORM has a custom setter, use it to set FORM to VAL.
| Otherwise, use `set-default'.
| 
| \(fn [FORM VAL]...)"
|   (declare (debug (&rest sexp form))
|            (indent 1))
|   ;; Check if we have an even number of arguments
|   (when (= (mod (length forms) 2) 1)
|     (signal 'wrong-number-of-arguments (list 'csetq (1+ (length forms)))))
|   (let (sexps)
|     ;; Transform FORMS into a list of pairs (FORM . VALUE)
|     `(progn ,@(progn
|                 (while forms
|                   (let ((form (pop forms))
|                         (value (pop forms)))
|                     (push `(,(or (get `,form 'custom-set)
|                                  'custom-set)
|                             ',form
|                             ,value)
|                           sexps)))
|                 (reverse sexps)))))
`----

--
Lucien “Phundrak” Cartier-Tilet
<https://phundrak.com> (Français)
<https://phundrak.com/en> (English)
Sent from GNU/Emacs
Details
Message ID
<87sfo5pt6n.fsf@phundrak.com>
In-Reply-To
<87sfo66q1v.fsf@phundrak.com> (view parent)
DKIM signature
pass
Download raw message
Promis j’arrête de vous embêter après ce mail, mais après une autre
conversation sur Discord, nouvelle petite màj de `csetq' qui simplifie
beaucoup son corps tout en gagnant un peu en performances --- gains
minimes par contre, j’ai une différence de 0.2 à 0.4 secondes en
faisant tourner 10.000 fois `csetq' sur 5000 paires.

,----
| (defmacro csetq (&rest forms)
|   "Bind each custom variable FORM to the value of its VAL.
| 
| FORMS is a list of pairs of values [FORM VAL].
| `customize-set-variable' is called sequentially on each pairs
| contained in FORMS. This means `csetq' has a similar behaviour as
| `setq': each VAL expression are evaluated sequentially, i.e. the
| first VAL is evaluated before the second, and so on. This means
| the value of the first FORM can be used to set the second FORM.
| 
| The return value of `csetq' is the value of the last VAL.
| 
| \(fn [FORM VAL]...)"
|   (declare (debug (&rest sexp form))
|            (indent 1))
|   ;; Check if we have an even number of arguments
|   (when (= (mod (length forms) 2) 1)
|     (signal 'wrong-number-of-arguments (list 'csetq (1+ (length forms)))))
|     ;; Transform FORMS into a list of pairs (FORM . VALUE)
|   `(progn ,@(cl-loop for (form value) on forms by 'cddr
|                      collect `(customize-set-variable ',form ,value))))
`----

--
Lucien “Phundrak” Cartier-Tilet
<https://phundrak.com> (Français)
<https://phundrak.com/en> (English)
Sent from GNU/Emacs
Details
Message ID
<2732e7407299a50d178a0a25ef2dc4d1@formats-ouverts.org>
In-Reply-To
<87sfo5pt6n.fsf@phundrak.com> (view parent)
DKIM signature
missing
Download raw message
Bonjour à vous !

Le 2022-06-15 22:26, Lucien Cartier-Tilet a écrit :
> Promis j’arrête de vous embêter après ce mail, mais après une autre
> conversation sur Discord, nouvelle petite màj de `csetq' qui simplifie
> beaucoup son corps tout en gagnant un peu en performances --- gains
> minimes par contre, j’ai une différence de 0.2 à 0.4 secondes en
> faisant tourner 10.000 fois `csetq' sur 5000 paires.

Il n'y a pas d'embêtance (!... c'est un format inédit ;-) ) à lire ces 
ligne de code elisp.

C'est à la fois « magique WAOU super incroyable c'est fou ! » + « Je ne 
sais pas faire et qu'est-ce que c'est énervant : mais par où commencer ? 
où trouver le temps ? voire pourquoi ne pas demander à celles et ceux 
qui savent ».

Bref, en ce temps de plume de chaleur caniculaire, comment plonger dans 
le grand bain rafraîchissant du codage...
Vaste sujet maintes fois évoqué... donc "C-h" et en avant ! :-) Ou un 
atelier en ligne (!!) ou une liste de diffusion (!!!) ou une rencontre. 
Bon Emacs à vous !

-- 
Thierry Stoehr, des formats ouverts, https://Formats-Ouverts.org

> ,----
> | (defmacro csetq (&rest forms)
> |   "Bind each custom variable FORM to the value of its VAL.
> |
> | FORMS is a list of pairs of values [FORM VAL].
> | `customize-set-variable' is called sequentially on each pairs
> | contained in FORMS. This means `csetq' has a similar behaviour as
> | `setq': each VAL expression are evaluated sequentially, i.e. the
> | first VAL is evaluated before the second, and so on. This means
> | the value of the first FORM can be used to set the second FORM.
> |
> | The return value of `csetq' is the value of the last VAL.
> |
> | \(fn [FORM VAL]...)"
> |   (declare (debug (&rest sexp form))
> |            (indent 1))
> |   ;; Check if we have an even number of arguments
> |   (when (= (mod (length forms) 2) 1)
> |     (signal 'wrong-number-of-arguments (list 'csetq (1+ (length 
> forms)))))
> |     ;; Transform FORMS into a list of pairs (FORM . VALUE)
> |   `(progn ,@(cl-loop for (form value) on forms by 'cddr
> |                      collect `(customize-set-variable ',form 
> ,value))))
> `----
Leo Vivier <zaeph@zaeph.net>
Details
Message ID
<87y1xm5w0u.fsf@hidden>
In-Reply-To
<87sfo5pt6n.fsf@phundrak.com> (view parent)
DKIM signature
pass
Download raw message
Salut Lucien,

Lucien Cartier-Tilet <lucien@phundrak.com> writes:

> nouvelle petite màj de `csetq' qui ***simplifie*** beaucoup son corps
> tout en gagnant un peu en performances [emphasis added]

cl-loop n’a pas que des amis, alors fais attention aux cercles dans
lesquels tu t’exprimes si tu ne veux pas te prendre un mapcar sur le
coin du nez. :o)

Ton benchmark m’a interpelé parce que cl-loop est réputé pour avoir un
setup assez coûteux ; alors, j’ai fait mes propres test.

(La liste n’aime pas les pièces-jointes en application/emacs-lisp, donc
débrouillez-vous pour l’ouvrir comme il faut dans Emacs.)
Reply to thread Export thread (mbox)