2016-06-15 5 views
1

私はemacsにはかなり新しく、実際に動作する必要があることを理解しているかどうかはわかりません。リファクタリングのためのelispヘルパ関数の書き方

は、私は2つの機能

(add-hook 'python-mode-hook (lambda() add-to-list (make-local-variable 'company-backends) 'company-jedi)) (add-hook 'js2-mode-hook (lambda() add-to-list (make-local-variable 'company-backends) 'company-tern))

私は次の関数に

(defun auto-complete (mode-hook backend) (add-hook mode-hook (lambda() add-to-list (make-local-variable 'company-backends) backend))) (auto-complete 'js2-mode-hook 'company-tern)

を書いたが、それは動作しませんがあるとします。私はオンラインで見ましたが、elispには閉鎖がないので、私はそれが見つけました! これらの2つのコードブロックをどのようにリファクタリングする必要がありますか?

答えて

2

add-to-listは関数なので、かっこで囲む必要があります((add-to-list...))。または、funcallまたはapplyを使用して呼び出します。

Elisp は、クロージャです。次のを行います。

ファイルローカル変数lexical-bindingnilで:

(defun auto-complete (mode-hook backend) 
    (add-hook mode-hook 
    (lambda() 
     (add-to-list (make-local-variable 'company-backends) backend)))) 

字句は、あなたが変数backendが定義されている環境をカプセル化するクロージャを、得る結合で。その環境におけるその値は、クロージャが作成されたときの値ですが、無名関数が使用されたときに変数が残っています。これを変数として使用できます。

ElispマニュアルノードUsing Lexical Bindingを参照してください。かかわらずlexical-bindingの値の

:この場合

(defun auto-complete (mode-hook backend) 
    (add-hook mode-hook 
    `(lambda() 
     (add-to-list (make-local-variable 'company-backends) ',backend)))) 

は、ない閉鎖存在せず、関数でない変数backendあります。代わりに、その変数はであり、そのときの値はと評価され、その値はに置き換えられています。匿名関数が呼び出されたときに変数を使用する必要がなく、必要なのはその値(その関数の定義時)だけです。

クロージャを使用すると、無名関数をバイトコンパイルすることができます。変数置換技法を使用する場合、それはできません。その場合、defun評価時(またはバイトコンパイル時)には無名関数を作成していません。代わりにリスト(lambda...)を作成しています。このリストは後で関数として解釈されます。

関連する問題