2011-02-16 27 views
5

Benim güzel işlevi değişken yakalayan:elisp: iç işlevinden

(funcall (f 2) 2) 

4. dönmek için Ama ne yazık ki, ben bu yerine var: Sonra

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

, bunu bekliyoruz

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

Değişkenleri içsel işlevlerden nasıl alabilirim?

+3

Emacs 24'ten itibaren, dinamik kapsamdaki "bug" için başka bir çözüm daha var: '; - * - Sözcüksel bağlanma: t - * - 'sözcüksel açıklamayı etkinleştirmek için dosyanın üstünde. Bunu yaparsanız, yukarıdaki kod beklendiği gibi çalışır. –

cevap

7

Elisp'in dinamik kapsamı tarafından ısırıldınız. Lambda x lambda çağrıldığında kapsam içinde olan x değişkenini ifade eder (ve bu durumda arama yaptığınızda kapsamda x yoktur, bir hata alırsınız), kapsamda olan x değil lambda oluşturduğunuzda. Elisp'deki sözcüksel kapatmaları simüle etmenin bazı yolları, this page on the EmacsWiki'da açıklanmaktadır.