タグ付けされた質問 「let-binding」

1
Emacs let-bound advice
コード内の関数を一時的にオーバーライドしたいと思います。 たとえば、次のことを考えてください。 (defun nadvice/load-quiet (args) (cl-destructuring-bind (file &optional noerror nomessage nosuffix must-suffix) args (list file noerror t nosuffix must-suffix))) (defun nadvice/idle-require-quiet (old-fun &rest args) (advice-add 'load :filter-args #'nadvice/load-quiet) (apply old-fun args) (advice-remove #'load #'nadvice/load-quiet)) (advice-add 'idle-require-load-next :around #'nadvice/idle-require-quiet) 動作しないもの: この。アドバイスを手動で有効または無効にすることを避け、Emacsのシングルスレッドの性質を信頼して物事を処理できれば、ずっときれいになります。 cl-letf元の関数を参照させないため、:filter-args通常行うことを実装できません。 cl-flet 他の関数の関数をオーバーライドすることはできません。 noflet避けたい外部パッケージです。(また、私が必要とする以上のことをします)

2
リスト自体をバインドせずに、リストから複数の値を直接バインドします
Emacs Lispの一時変数を経由せずに、変数に複数の戻り値を直接割り当てることは可能ですか? たとえば、2つのリストのリストを返す関数があるとします。 (defun test-func () (setq a '(a b)) (setq b '(c d)) `(,a ,b)) 最初の戻り値をlist-aに、2番目の戻り値をに割り当てたい場合list-b、一時変数を使用してこれを行うことができます。temp例: (let* ((temp (test-func)) (list-a (car temp)) (list-b (cadr temp))) (message-box (prin1-to-string list-a)) (message-box (prin1-to-string list-b))) これをもっと簡単に行うことは可能ですか?(私はあなたが一時変数を指定する必要がないPerlとPythonに慣れています)


1
関数をローカルでオーバーライドしますが、元の関数の呼び出しを許可します
アドバイス機能により、関数の動作をグローバルに変更できます。アドバイス定義は、元の関数を呼び出すことができます。 (defadvice foo (around foo-bar activate compile) "Always set `qux' to t when running `foo'." (let ((qux t)) ad-do-it)) clパッケージは提供しflet、ローカルの機能を無効にするマクロを。 (defun foo () "global") (flet ((foo () "local")) (some-code-that-calls-foo)) それは元のfoo関数への参照を許可しません。ローカルのオーバーライドで元の関数を呼び出す必要がある場合はどうなりますか? (defun foo () "global") (flet ((foo () (concat (foo) "+local"))) ;; this will cause an infinite loop when (foo) is …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.