より効果的な方法でプロジェクトディレクトリにアクセスするために使用できる一連の関数を生成できるマクロを作成しようとしています。次のマクロを見ると、自分がやろうとしていることを知っているはずです。閉鎖を扱うelisp
(defmacro create-project-cmd (project-name project-dir &optional subdir-list)
(if (null subdir-list)
`(fset (intern ,project-name) #'(lambda() (interactive) (dired ,project-dir)))
`(dolist (dir ,subdir-list)
(fset (intern (concat ,project-name "-" dir))
#'(lambda() (interactive) (dired (concat ,project-dir "/" dir)))))))
ここでの問題は、最後の行に「DIR」はdolist句の「DIR」に結合することになっています。そして、elispにクロージャがないので、生成された関数を呼び出すと、dirが無効であると不平を言うでしょう。
コードからわかるように、私は "project-dir"のクロージャを偽造しています。私は "dir"と同じ方法でそれを偽造することはできません。レキシカルレットはここではうまく動作しますが、記憶に問題があるので避けようとしています。それを使用する習慣を育てたくない(おそらく私はあまりにも甘いかもしれません)。
私はこれを処理する良い方法がありません。誰でも良い提案がありますか?
の可能重複[克服する方法Emacs Lisp閉鎖のためのローカル変数の欠如](http://stackoverflow.com/questions/6955544/how-to-overローカル変数for-emacs-lisp-closure)があります。 – phils