我正在通过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
的主体,然后在cond
的t
子句之后再次平衡括号后再次平衡括号,flatten
函数按预期工作:
(flatten '(1 (3)))
(1 3)