flatten

今日も今日とて、電車でぷちぷち Emacs Lispプログラミング。今日は flatten。

> (flatten '(1 (2 3 (4 5)) ((6))))
(1 2 3 4 5 6)

オレ版

(defun flatten (lst)
  (let ( (acc nil) ) 
    (labels *1  
			(rec (cdr lst))))))  
      (rec lst))
    (reverse acc)))

ポール版

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

オレのは命令的、ポールのは関数的やね。修行が足りませぬ。

*1:rec (lst) (if lst (let ((c (car lst))) (if (atom c) (push c acc) (rec c