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

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

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

繰り返し途中での脱出等

繰り返しの中で脱出したい場合は、良くあります。

この場合、(return)や使える場所では:returnを使用して繰り返しから抜けることができます。

これら以外にも脱出の常套句的なものが用意されています。

  • :while

次の式の値がNILの場合即座にLOOPを終了させます

集積の結果や、:finally節は実行されます。

(loop :as i :upfrom 0 :while (< i 10)
      :collect i)
;=> (0 1 2 3 4 5 6 7 8 9)
  • :until

次の式の値が非NILの場合即座にLOOPを終了させます。

集積の結果や、:finally節は実行されます。

(loop :as i :upfrom 0 :until (>= i 10)
      :collect i)
;=> (0 1 2 3 4 5 6 7 8 9)

以上、2つは、脱出というよりは、LOOPの終了条件といった感じです。

  • :always

次の式の値がNILの場合即座にLOOPから抜けます。脱出した場合のLOOPの返り値は、NILですが、途中脱出しなかった場合は、Tになります。

集積の結果や、:finally節は実行されません。

(defun list= (x y)
  (loop :for xx :in x
        :for yy :in y
        :always (eql xx yy)))

(list= '(1 2 3 4) '(1 2 3 4))
;=> T
  • :never

次の式の値が非NILの場合即座にLOOPから抜けます。脱出した場合のLOOPの返り値は、NILですが、途中脱出しなかった場合は、Tになります。

集積の結果や、:finally節は実行されません。

(loop :never 1)
;=> NIL
  • :thereis

次の式の値が非NILの場合即座にLOOPから抜けます。脱出した場合のLOOPの返り値は、式の値ですが、途中脱出しなかった場合は、NILになります。

集積の結果や、:finally節は実行されません。

(loop :thereis 1)
;=> 1

その他

CLでは、someや、every等がありますが、CL以前のMacLISPには存在しないということもあり、

(if (some #'oddp '(1 2 3 4))
    'foo
    'bar)
;=> FOO

(if (loop :for x :in '(1 2 3 4) :thereis (oddp x))
    'foo
    'bar)
;=> FOO

と書いたような例がちらほらあります。