Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-12-15

KMRCLを眺める (39) FLATTEN

| 23:36 | KMRCLを眺める (39) FLATTEN - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (39) FLATTEN - わだばLisperになる

今回は、KMRCLのlists.lisp中からFLATTENです。

FLATTENも古からあるLISPの定番のユーティリティ関数ではないかと思います。

動作は、

(DEFVAR *TREE* '(1 A 2 B 3 C 4 D () () (5 E 6 F 7 G (8 9 10) 11 12) 13))

(FLATTEN *TREE*)
;⇒ (1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 9 10 11 12 13)

というもので、ツリー状の要素をべたなリストにします。

(defun flatten (lis)
  (cond ((atom lis) lis)
        ((listp (car lis))
         (append (flatten (car lis)) (flatten (cdr lis))))
        (t (append (list (car lis)) (flatten (cdr lis))))))

Common Lisp等のように空リスト()とNILというアトムが同一の表現だと()/NILをリストとみるか要素とみるかで若干迷ってしまう気もするんですが、NILは空リストとする動作の方がほとんどのようです。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20091215