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 |

2008-07-01

サンプルコードによるLOOPマクロ入門 (4)

| 23:11 | サンプルコードによるLOOPマクロ入門 (4) - わだばLisperになる を含むブックマーク はてなブックマーク - サンプルコードによるLOOPマクロ入門 (4) - わだばLisperになる

フィルター

:collectを使って値を集めてリストにする方法を取り上げてきましたが、ただ集めるだけでなくて、対象を選別しつつ集めたいこともあります。

そのような場合には、:if、:when、:unless等の述語と:collectとを組み合わせます。

(loop :for i :in '(1 2 3 4 5 6 7) 
      :do (when (oddp i) :collect i))

のように書けば良さそうなものですが、飽くまで:collectは、LOOPのキーワードであり、LOOPの中でしか機能しないので、通常の式の中に組み込んで使うことができません。

ということで、

(loop :for i :in '(1 2 3 4 5 6 7) 
      :when (oddp i) :collect i)
;=> (1 3 5 7)

となります。

また、これらの述語と組み合わせると、:collectでは、:itで述語の結果を参照できるので

(loop :for i :in '(1 2 3 4 5 6 7) :when (and (oddp i) i) :collect :it)
;=> (1 3 5 7)

とも書けます。ちなみに、ここでは、わざわざ:itを使うために述語の部分が冗長になっていますが、

(loop :for i :in '(1 () 2 () 3 () 4) :when i :collect :it)
;=> (1 2 3 4)

という風に、nilか真値を返すような述語を使う場合に便利かもしれません。

また、:if、:when、:unlessは、2系統に分岐することができます。

(loop :for i :in '(1 2 3 4 5 6 7) 
      :when (oddp i)
        :collect i
      :else
        :collect '?
      :end)
;=> (1 ? 3 ? 5 ? 7)

若干ややこしいのですが、LOOPの:whenは、通常のLISPのwhenと違い、:ifとまったく同じなもので単なる別名です。

また、:endというキーワードが使えて区切りをハッキリさせる目的で使えます。

6/28第5回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 09:54 | 6/28第5回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 6/28第5回 慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

まとめが遅くなってしまいましたが、先日、6/28 20:00から5回目の勉強会を開催させて頂きました!

発言して頂いた方約7名、observer(ROM)の約方5、6名で、大体12名前後を推移しつつでした。

今回は、マクロの巻を終らせようということで、それが終り次第、CLの落し穴に移る予定だったのですが、マクロの巻をに1時間半費してしまいました。

今回人数は少なかったのですが、発言は多く、これまでと比べても割と活溌だったような気がします。

反省と課題

  • 30分で区切りでお題を変えるよりは、1時間半で一つのお題に集中して行なった方が良いかも。
  • 新しい課題を追加しなかったので、zickさんの予習ネタを切らしてしまった(笑) 目下、予習したくなるような面白そうなネタを探しています!

関連資料

ログ:
  1. The Power of LISP Macros

謝辞

勉強会の告知をして頂きありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

次回…。

7/5日 20時から開催したいと思います!

お題は、CLの落し穴がまだ完了していないので、それを中心にしたいと思っていますが、詳しくは、明日あたりでもエントリに書きたいと思います。

ゲスト



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