2010/04/11

LOL flatten

これもLOLより(というよりOn Lispより?)。Gaucheで書いてみましたが、これも探せばどこかにありそうですね。

fold-rightで書いてみましたが、大丈夫かな。なんか怪しいような気もする。もしかするとfoldでreverseな方が良いかな。いやfold-rightで大丈夫か。
;; flatten
;; (flatten '(1 2 3 (4 5 6 (7)((8) 9))((() 10))))
;; -> (1 2 3 4 5 6 7 8 9 10)
(define (flatten tree)
(fold-right (lambda (e acc)
(cond
((null? e) acc)
((pair? e)
(append (flatten e) acc))
(else (cons e acc))))
'() tree))
(flatten '(1 2 3 (4 5 6 (7)((8) 9))((() 10))))
; -> (1 2 3 4 5 6 7 8 9 10)
view raw utils.scm hosted with ❤ by GitHub


追記

LOLより。Common Lispのlabelsはschemeのletrecみたいなもの、と考えて良いんだろう、きっと。なんかCLの方が美しい気がする(labelsに限らず)。
(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)))
(flatten '(1 2 3 (4 5 6 (7)((8) 9))((() 10))))
view raw temp.lisp hosted with ❤ by GitHub


プログラミングGaucheLET OVER LAMBDA Edition 1.0On Lisp

0 件のコメント:

コメントを投稿