ブロックからの脱出 - lisp-cookbook-ja/common-lisp GitHub Wiki

制御構造

ブロックからの脱出

ブロックを定義するとその中から return-from を使って脱出できます。

(block foo
  (print 1)
  (return-from foo 2)
  (print 3))

return-from には脱出するブロックの名前と戻り値となる値を指定します。 指定した値がブロック全体の値になります。

暗黙のブロック名 nil から脱出する return もあります。

(block nil
  (print 1)
  (return 2)
  (print 3))

defun による関数定義は関数名を名前とするブロックで自動的につつまれます。 ですから、 return-from で脱出できます。

(defun foo ()
  (print 1)
  (return-from foo 2)
  (print 3))

loop は名前 nil のブロックで自動的につつまれます。 ですから、 return で脱出できます。

(loop for i in '(1 2 3 4 5)
      if (= i 3)
      do (return i))

named キーワードでブロックの名前を明示することもできます。 入れ子の loop から脱出する場合に便利です。

(loop named a
      for i in '((1) (2 3) (4 5 6 7))
      do (loop for j in i
               do (print (cons i j))
               if (= j 3)
               do (return-from a)))
;-> ((1) . 1) 
    ((2 3) . 2) 
    ((2 3) . 3) 
;=> NIL