我正在尝试在我正在编写的 Emacs 包中使用 cl-labels。一个用户提交了一个错误报告,我在我自己的 Emacs 版本 24.3.1 中没有观察到这个问题,但是这个用户在 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 中实际运行。