Portée de la variable ?

Le
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
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
lhabert
Le #21793201
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, ...)).
Matthieu Moy
Le #21793191
(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
Ph. Ivaldi
Le #21793171
Le 15 décembre 2006 à 10h33:08,
Matthieu Moy
[...]

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
Matthieu Moy
Le #21793161
Ph. Ivaldi
(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
Ph. Ivaldi
Le #21793151
Le 15 décembre 2006 à 16h06:58,
Matthieu Moy
Ph. Ivaldi
(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
Publicité
Poster une réponse
Anonyme