“没有实现动态范围的cl标签”

时间:2013-05-21 01:43:42

标签: emacs elisp

我正在尝试在我写的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-labelshttps://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中实际运行。

1 个答案:

答案 0 :(得分:1)

您的代码看起来非常好。并且没有像您在Emacs自己的源代码中引用的那样的错误,因此错误由一些外部包发出信号。最后没有“24.3.1”或“24.3.2”版本。只有一个“24.3”版本,附加的“.1”或“.2”只是一个内部版本号,所以你的bug报告者使用的是与你相同版本的Emacs。他可能碰巧使用了一个有bug的包。