2011-02-16 13 views
5

Mi función preciosa:elisp: la captura de variables de función interna

(defun f (x) 
    (lambda (y) (+ x y))) 

Entonces, espero que esto:

(funcall (f 2) 2) 

Para volver 4. Pero, por desgracia, tengo esto en su lugar:

Debugger entered--Lisp error: (void-variable x) 

Entonces, ¿cómo puedo capturar la variable de la función interna?

+3

A partir de Emacs 24, hay otra solución alternativa para el "error" de alcance dinámico: puede poner ';; - * - enlace léxico: t - * - 'en la parte superior del archivo para habilitar el alcance léxico. Si hace esto, el código anterior se ejecuta como se esperaba. –

Respuesta

7

Has sido mordido por el alcance dinámico de elisp. El x en la lambda hace referencia a la variable x que está en el alcance cuando se llama a la lambda (y dado que en este caso no hay x en el alcance cuando lo llamas, obtienes un error), no al x que está en el alcance cuando creas el lambda

Algunas formas de simular cierres léxicos en elisp se explican en this page on the EmacsWiki.

Cuestiones relacionadas