01:37:18 [potix2'out] ; Remote host closed the connection
11:24:59 [g000014'in]
11:26:20 <g000014> 今日も暑いですが、Successful Lisp / David B. Lamkinsを読みます
11:26:33 <g000014> ((((Chapter 12 - Mapping Instead of Iteration))))
11:26:58 <g000014> 12章からですが、mapか繰り返しかというところでしょうか
11:27:44 <g000014> ((((MAPCAR, MAPC, and MAPCAN process successive list elements))))
11:30:14 <g000014> mapcar,mapc,mapcanの説明です
11:30:48 <g000014> まあ、ここの例の通りかなと思います
11:31:48 <g000014> schemeでいうと、mapcarは、map、mapcは、for-eachに相当しますが、mapcは元のリストを返り値とするところが、ちょっと違ったりします。スタイル的には返り値は使わないとされることが多いです
11:33:09 <g000014> mapcanは、(mapcan (lambda (x) (list x)) '(1 2 3 4)) ≡ (mapcar (lambda (x) x '(1 2 3 4))) ;=> (1 2 3 4)
11:33:28 <g000014> と覚えておくと、実際に使う時に思い出せる気がします
11:35:32 <g000014> mapcarだと名前のとおり、元のリストの写像なので同じ要素の個数を持つリストが結果になるのですが、map的だけど、縮めたいことがたまにあります、そういう時にはmapcanかなと私は、適当に覚えています
11:35:55 <g000014> ((((MAPLIST, MAPL, and MAPCON process successive sublists))))
11:37:33 <g000014> maplist,mapl,mapconの説明です。これも解説の通りかなと思います
11:38:17 <g000014> mapcar系に比べて利用頻度はかなり少ないですが、自分的には、mapcdrのようなものが欲しい時に使えるかなと思います
11:40:11 <g000014> リストが掴めるので元の破壊的に変更することができるので、maplistより、maplなどで破壊的な関数と組み合わせることの方が多い気がします。とはいえこういう場合は、汎用的な繰り返しを使う人の方が多いかなとは思います
11:44:25 <g000014> ((((MAP and MAP-INTO work on sequences, not just lists))))
11:45:45 <g000014> map,map-intoの説明です
11:46:33 <g000014> これも説明の通りですが、これらは、listだけでなくsequenceも扱えるので、型が変換されるような場面でも使えます
11:46:55 <g000014> map-intoは、
11:47:03 <g000014> (let ((a (make-sequence 'vector 3))) (print a) (map-into a #'+ (list 1 2 3) (list 4 5 6)) a)
11:47:29 <g000014> のような形式の説明ですが
11:48:36 <g000014> (map-into (print (make-sequence 'vector 3)) #'+ (list 1 2 3) (list 4 5 6))
11:48:38 <g000014> とも書けますね
11:48:44 <g000014> printがちょっとあれですが
11:51:52 <g000014> (map-into (make-sequence 'vector 3 :initial-element 0) (lambda () (random 8))) ;=> #(3 6 2)
11:52:23 <g000014> ある要素で適当に埋めたいという場合は引数を省くこともできたりします
11:52:35 <g000014> ((((Mapping functions are good for filtering))))
11:53:49 <g000014> 上で説明したmapcanの使い方がここで説明されていました
11:54:23 <g000014> whenの返り値を使うのは作法的に嫌(whenは副作用のために使う)というスタイルがありますが、
11:54:27 <g000014> その場合は、
11:54:50 <g000014> (mapcan #'(lambda (n) (and (evenp n) (list n))) numbers)
11:54:51 <g000014> でしょうか
11:56:18 <g000014> といっても、nil=空リストという特性も使っているので、そこは純粋な人からすれば捻れてますが
11:56:29 <g000014> ((((It's better to avoid mapping if you care about efficiency))))
11:58:15 <g000014> mapは良く使うので、処理系を効率良く実行するようにされてますが、
11:58:42 <g000014> どうしても、という時には繰り返しに書き直すこともありますよ、というようなところですね
11:59:11 <g000014> しかし、disassemblyで出てくるコードを眺めると、そんなに違わないことが多いので
12:00:04 <g000014> 常にloopでベタに書く必要もないですね
12:01:25 <g000014> ここでも書き直すのは良く確かめてから、という説明があります。確かめる方法は28章で解説とのこと
12:02:21 <g000014> ((((Predicate mapping functions test sequences))))
12:05:53 <g000014> sequenceを見て、そのsequenceの状態をブーリアンといて判定したいことがありますよねという話です
12:06:03 <g000014> ((((SOME, EVERY, NOTANY, NOTEVERY))))
12:07:39 <g000014> この辺り他の言語でもあるんですが、someとかanyとかallとか、その逆とかどう判定されるのか
12:07:47 <g000014> 良く分からなくなるところですね
12:08:54 <g000014> someの反対が、notanyで、everyの反対が、noteveryとなっているので、自分は、everyの対の方だけ覚えて、あとは残りの対応、という感じで覚えています
12:10:20 <g000014> 似たような機能にloopマクロのthereis always neverがあるんですが、ごっちゃになると良く分からなくなります
12:10:41 <g000014> ((((REDUCE combines sequence elements))))
12:11:50 <g000014> 所謂畳み込みで、map reduceのreduceですが、簡単な例の説明があります。
12:12:24 <g000014> もっと多機能ですが、多機能のお蔭で仕様を参照しないと分からなくなることも多いです
12:12:44 <g000014> というところで、12章は終了です。次回は、13章からです
12:13:16 [g000014'out] ; Quit: (return nil)
18:20:54 [potix2_'in]
18:21:10 [potix2_'out] ; Remote host closed the connection
20:37:36 <usaturn> 読書会お疲れ様です~