17

インストールした一部の elisp 関数で警告が生成されます。

`flet' is an obsolete macro (as of 24.3); use either `cl-flet' or `cl-letf'.

単にすべてfletをに置き換えると危険cl-fletですか? 交換しても良いとしたら、どちらが良いでしょうか?

置き換えても問題がなければ、プロジェクトにプル リクエストを送ります。

彼らがそれを変えないのには何か理由がありますか?

4

4 に答える 4

6

私は最近、この件に関する記事を書きました。投稿の要点は、flet(動的バインディングが必要な場合)の最適な代替品はnofletです。fletこれはサード パーティのライブラリですが、 (いくつかの追加機能を追加しながら)のほとんどドロップインの代替品です。

于 2013-09-19T19:51:09.787 に答える
5

このcl-letf関数は、Artur がこのブログ エントリで説明しているように、関数の動的バインディングに使用できます。

于 2015-03-08T16:00:46.050 に答える
1

エイリアスを使用または作成するように関数を変更できますlawlist-flet-私がしたことは、警告を削除してfletマクロの名前を次のように変更することだけでしたlawlist-flet:

;;;;;;;;;;;;;;;;;;;;;;;;;;;; FLET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defmacro lawlist-flet (bindings &rest body)
      "Make temporary overriding function definitions.
    This is an analogue of a dynamically scoped `let' that operates on the function
    cell of FUNCs rather than their value cell.
    If you want the Common-Lisp style of `flet', you should use `cl-flet'.
    The FORMs are evaluated with the specified function definitions in place,
    then the definitions are undone (the FUNCs go back to their previous
    definitions, or lack thereof).
    \(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
      (declare (indent 1) (debug cl-flet)
    ;;           (obsolete "use either `cl-flet' or `cl-letf'."  "24.3")
                    )
      `(letf ,(mapcar
               (lambda (x)
                 (if (or (and (fboundp (car x))
                              (eq (car-safe (symbol-function (car x))) 'macro))
                         (cdr (assq (car x) macroexpand-all-environment)))
                     (error "Use `labels', not `flet', to rebind macro names"))
                 (let ((func `(cl-function
                               (lambda ,(cadr x)
                                 (cl-block ,(car x) ,@(cddr x))))))
                   (when (cl--compiling-file)
                     ;; Bug#411.  It would be nice to fix this.
                     (and (get (car x) 'byte-compile)
                          (error "Byte-compiling a redefinition of `%s' \
    will not work - use `labels' instead" (symbol-name (car x))))
                     ;; FIXME This affects the rest of the file, when it
                     ;; should be restricted to the flet body.
                     (and (boundp 'byte-compile-function-environment)
                          (push (cons (car x) (eval func))
                                byte-compile-function-environment)))
                   (list `(symbol-function ',(car x)) func)))
               bindings)
         ,@body))
于 2013-09-19T14:16:35.447 に答える