emacs lisp中的尾部回复平坦功能



我正在通过LISP上的Paul Graham,并试图在Emacs LISP中实现功能。其中之一是扁平的:

(flatten '(a (b c) ((d e) f)))
;; Returns:
(a b c d e f)

然而,出于某种原因,保罗·格雷厄姆(Paul Graham(提供的实施不适用于emacs lisp(总是返回零(:

(defun flatten (x)
  (cl-labels ((rec (x acc))
              (cond ((null x) acc)
                    ((atom x) (cons x acc))
                    (t (rec (car x) (rec (cdr x) acc)))))
             (rec x nil)))
(flatten '(1 (3)))
;; Returns:
nil

它与ELISP的动态绑定有关吗?此代码怎么了?

正如我对问题的评论中所述,问题是一个放错的括号。定义应为:

(defun flatten (x)
  (cl-labels ((rec (x acc)
                   (cond ((null x) acc)
                         ((atom x) (cons x acc))
                         (t (rec (car x) (rec (cdr x) acc))))))
    (rec x nil)))

在原始中,((rec (x acc))rec定义为返回nil的函数。通过将其更改为((rec (x acc)cond表达式成为rec的主体,然后在condt子句之后再次平衡括号后再次平衡括号,flatten函数按预期工作:

(flatten '(1 (3)))
(1 3)

相关内容

  • 没有找到相关文章

最新更新