Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Portée de la variable ?

5 réponses
Avatar
Ph. Ivaldi
Bonsoir,

Que j'écrive:

(defun foo (x)
"..."
(add-hook toto-mode-hook
(lambda (y)
(func y)) x))

ou simplement:

(defun foo (x)
"..."
(add-hook toto-mode-hook
(lambda ()
(func x))))

le passage en toto-mode n'exécute jamais la commande "func" avec le
paramètre passé à "foo" (dans le premier cas le toto-mode-hook n'est
même pas modifié).
Comment dois-je faire ?

Plus généralement:

(defun foo (x)
(defun toto ()
(+ x 3)))
=> foo

(foo 3)
=> toto
(toto)
=> (void-variable x) (+ x 3)

C'est une question de « portée de la variable » ?
Quel est le contournement ?
--
Merci.
Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html

5 réponses

Avatar
lhabert
Oui, emacs lisp, ce n'est pas caml. Tu dois pouvoir t'en sortir avec une
macro (qui est du sucre syntaxique pour construire une liste qui a
la forme d'une fonction (c'est à dire un symbole « lambda » en tête, puis
une liste d'arguments, ...)).
Avatar
Matthieu Moy
(Luc Habert) writes:

Oui, emacs lisp, ce n'est pas caml.



Et non ;-). Pas de fermeture lexicale en emacs-lisp, et c'est bien
dommage.

Tu dois pouvoir t'en sortir avec une macro (qui est du sucre
syntaxique pour construire une liste qui a la forme d'une fonction
(c'est à dire un symbole « lambda » en tête, puis une liste
d'arguments, ...)).



Quelque chose comme ça devrait faire :

(defun foo (x)
(... `(lambda () (func ,x))))

qui n'est malheureusement pas très efficace vu que la fonction ne peut
pas être compilée (mais on s'en fout probablement ici ;-) ), ou

(defun foo (x)
(... (let ((local-x x))
(lambda () (func local-x)))))

--
Matthieu
Avatar
Ph. Ivaldi
Le 15 décembre 2006 à 10h33:08,
Matthieu Moy écrivit :

[...]

Quelque chose comme ça devrait faire :

(defun foo (x)
(... `(lambda () (func ,x))))




C'est exactement ce que je cherche et ça marche parfaitement.
J'ai pourtant vu beaucoup de codes de ce genre mais je n'avais pas
compris la différence entre la quote et l'anti-quote.
Ça porte un nom particulier cette structure ?

En revanche, pour répondre à Luc Habert, je n'ai pas réussi à faire la
même chose avec un defmacro; j'ai peut-être mal interprété les
conseils...

qui n'est malheureusement pas très efficace vu que la fonction ne peut
pas être compilée (mais on s'en fout probablement ici ;-) )



Si c'est juste pour gagner une micro seconde au chargement, je m'en fous
un peu, effectivement.

, ou

(defun foo (x)
(... (let ((local-x x))
(lambda () (func local-x)))))



Là par contre ça ne fonctionne pas avec mon exemple:
(defun foo (x)
(add-hook 'LaTeX-mode-hook (let ((local-x x))
(lambda () (func local-x)))))

Il faut encore "anti-quoter" le (lambda ...) et virguler le local-x.

--
Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html
Avatar
Matthieu Moy
Ph. Ivaldi writes:

(defun foo (x)
(... (let ((local-x x))





Il fallait bien sûr lire `lexical-let', mais le lecteur attentif aura
corrigé de lui-même ;-).

,----[ C-h f lexical-let RET ]
| lexical-let is a Lisp macro in `cl-macs.elc'.
| (lexical-let varlist body)
|
| Like `let', but lexically scoped.
| The main visible difference is that lambdas inside body will create
| lexical closures as in Common Lisp.
|
| [back]
`----

--
Matthieu
Avatar
Ph. Ivaldi
Le 15 décembre 2006 à 16h06:58,
Matthieu Moy écrivit :

Ph. Ivaldi writes:

(defun foo (x)
(... (let ((local-x x))





Il fallait bien sûr lire `lexical-let', mais le lecteur attentif aura
corrigé de lui-même ;-).




L'hypothèse selon laquelle les lecteurs de ce groupe ne sont pas
attentifs est bien sûr à exclure; d'ailleurs j'avais rectifié mais juste
après avoir posté... ;-)

Merci de ton aide!
--
Philippe Ivaldi.
http://home.tele2.fr/phivaldi/index.html