我正在尝试在我写的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
定义中声明的其他函数。
我也不需要动态范围。是否有一个宏给我我想要的东西,或者我应该切换到更长的命名全局函数? (考虑到这些函数与代码的其他部分无关,这有点糟糕)
基本上我需要来自Scheme的letrec
或来自Common Lisp的labels
。
编辑|我最终只使用(lambda () .. )
,(funcall ...)
和(let* ...)
的自由组合。很想知道是否有更优雅的解决方案在Emacs Lisp中实际运行。
答案 0 :(得分:1)
您的代码看起来非常好。并且没有像您在Emacs自己的源代码中引用的那样的错误,因此错误由一些外部包发出信号。最后没有“24.3.1”或“24.3.2”版本。只有一个“24.3”版本,附加的“.1”或“.2”只是一个内部版本号,所以你的bug报告者使用的是与你相同版本的Emacs。他可能碰巧使用了一个有bug的包。