0

私が書いている Emacs パッケージで cl-labels を使おうとしています。バージョン 24.3.1 の自分の Emacs で私が確認していない問題について、あるユーザーがバグ レポートを提出しましたが、このユーザーは 24.3.2 を使用しています。

https://github.com/d11wtq/fiplr/issues/3

`cl-labels' with dynamic scoping is not implemented

私はcl-labelsここで使用しています: https://github.com/d11wtq/fiplr/blob/f368e84410d2ee57117b2d6501c0cf42359bc252/fiplr.el#L154-L177

;; Builds a gigantic `find' shell command with -prune, -o, -not and shit.
(defun fiplr-list-files-shell-command (type path ignored-globs)
  "Builds the `find' command to locate all project files & directories."
  "Path is the base directory to recurse from."
  "Ignored-globs is an alist with keys 'directories and 'files."
  (cl-labels ((type-abbrev (assoc-type)
                (cl-case assoc-type
                  ('directories "d")
                  ('files "f")))
              (name-matcher (glob)
                (mapconcat 'identity
                           `("-name" ,(shell-quote-argument glob))
                           " "))
              (grouped-name-matchers (type)
                (mapconcat 'identity
                           `(,(shell-quote-argument "(")
                             ,(mapconcat #'name-matcher
                                      (cadr (assoc type ignored-globs))
                                      " -o ")
                             ,(shell-quote-argument ")"))
                           " "))
              (matcher (assoc-type)
                (mapconcat 'identity
                           `(,(shell-quote-argument "(")
                             "-type"
                             ,(type-abbrev assoc-type)
                             ,(grouped-name-matchers assoc-type)
                             ,(shell-quote-argument ")"))
                           " ")))
    (mapconcat 'identity
               `("find"
                 ,(shell-quote-argument (directory-file-name path))
                 ,(matcher 'directories)
                 "-prune"
                 "-o"
                 "-not"
                 ,(matcher 'files)
                 "-type"
                 ,(type-abbrev type)
                 "-print")
               " ")))

現在、私が使用している唯一の理由は、いくつかのプライベートな内部関数を使用できるようにすることです。これらの関数はそれぞれ、定義cl-labelsで宣言された他の関数に依存しています。cl-labels

動的スコープも必要ありません。私が望むものを与えるマクロはありますか、それともより長い名前のグローバル関数に切り替える必要がありますか? (これらの関数がコードの他の部分とどれほど無関係であるかを考えると、これはちょっとひどいことです)

基本的にletrec、Scheme やlabelsCommon Lisp のようなものが必要です。

編集 | 、 、 のリベラルな組み合わせを使用すること(lambda () .. )(funcall ...)なり(let* ...)ました。Emacs Lisp で実際に動作する、よりエレガントなソリューションがあるかどうか知りたいです。

4

1 に答える 1