4

最近のバージョンの Emacs は、elisp コード内の変数の字句バインディングをサポートしています。関数を字句的に再定義することも可能ですか? つまり、Emacs Lisp には次のようなものがありlexical-fletますか?

4

2 に答える 2

4

Emacs<24.3 では、 を(require 'cl)使用できますlabels。Emacs-24.3 以降では、実行してから または のいずれか(require 'cl-lib)を使用することもできます。cl-fletcl-labels

これらはすべて、のようなコードを生成する「複雑なマクロ」です(let ((fun (lambda (args) (body)))) ... (funcall fun my-args) ...)。これは、基礎となる言語がローカル関数定義をネイティブにサポートしていないためです。

于 2012-12-13T01:36:21.817 に答える
2

ありますがlabels、それがあなたが探しているものであるかどうかはわかりません:

(defun foo ()
  42)

(defun bar ()
  (foo))

(list
 (foo)
 (bar)
 (labels ((foo ()
               12))
   (list (foo)
         (bar)))
 (foo)
 (bar))

を返します(42 42 (12 42) 42 42)

于 2012-12-12T22:11:39.657 に答える