0

我正在尝试在我正在编写的 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 或labelsCommon Lisp 的东西。

编辑 | 我最终只使用了(lambda () .. ),(funcall ...)和的自由组合(let* ...)。很想知道是否有更优雅的解决方案可以在 Emacs Lisp 中实际运行。

4

1 回答 1

1

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

于 2013-05-21T05:12:54.567 回答