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-19

KMRCLを眺める (42) MAPAPPEND

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

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

MAPAPPENDも、昔からの定番ユーティリティで、70年代初頭位に定義されたものを見たことがある気がします。

MAPPENDだったり、MAP-APPENDだったり、APPEND-MAPだったり色々な名前で呼ばれていますが、MAPした結果をAPPENDで連結するという名前そのままな動作をする関数です。

定義は

(defun mapappend (func seq)
  (apply #'append (mapcar func seq)))

動作は、

(MAPAPPEND #'VALUES
           '((1 A) (2 B) (3 C) (4 D) (5 E)))
;⇒ (1 A 2 B 3 C 4 D 5 E)

こんな感じです。

CL標準でこういう動作をするものには、MAPCANがありますが、こちらは、破壊的に連結します。

上のようなことを元のリストを破壊しないように行なうには、

(MAPCAN #'COPY-LIST 
        '((1 A) (2 B)() (3 C) (4 D) (5 E)))

という感じでしょうか。

ゲスト



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