私が書いている 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 やlabels
Common Lisp のようなものが必要です。
編集 | 、 、 のリベラルな組み合わせを使用すること(lambda () .. )
に(funcall ...)
なり(let* ...)
ました。Emacs Lisp で実際に動作する、よりエレガントなソリューションがあるかどうか知りたいです。