Next: , Previous: Nonlocal Exits, Up: Nonlocal Exits   [Contents][Index]


9.5.1 ÌÀ¼¨Åª¤ÊÈó¥í¡¼¥«¥ëæ½Ð¡§ catch¤Èthrow

¤Û¤È¤ó¤É¤ÎÀ©¸æ¹½Â¤¤Ï¡¢¤½¤Î¹½Â¤Æâ¤Ç¤ÎÀ©¸æ¤Îή¤ì¤À¤±¤Ë±Æ¶Á¤·¤Þ¤¹¡£ ´Ø¿ôthrow¤Ï¡¢Ä̾ï¤Î¥×¥í¥°¥é¥à¼Â¹Ô¤Î¤³¤Î¤è¤¦¤Êµ¬Â§¤ÎÎã³°¤Ç¤¹¡£ ¤Ä¤Þ¤ê¡¢Í×µá¤Ë½¾¤Ã¤ÆÈó¥í¡¼¥«¥ë¤Êæ½Ð¤ò¹Ô¤¤¤Þ¤¹¡£ ¡Ê¤Û¤«¤Ë¤âÎã³°¤Ï¤¢¤ë¤¬¡¢¤½¤ì¤é¤Ï¥¨¥é¡¼½èÍý¤Î¤¿¤á¤À¤±¤Ç¤¢¤ë¡£¡Ë throw¤Ïcatch¤ÎÆâ¦¤Ç»È¤¤¡¢ ¤½¤Îcatch¤ØÌá¤ê¤Þ¤¹¡£

(defun foo-outer ()
  (catch 'foo
    (foo-inner)))

(defun foo-inner ()
  …
  (if x
      (throw 'foo t))
  …)

¥Õ¥©¡¼¥àthrow¤ò¼Â¹Ô¤¹¤ë¤È¡¢Âбþ¤¹¤ëcatch¤ØÀ©¸æ¤¬Ìá¤ê¡¢ ¤½¤Îcatch¤Ï¤¿¤À¤Á¤Ë½ªÎ»¤·¤Þ¤¹¡£ throw¤Ë³¤¯¥³¡¼¥É¤Ï¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£ throw¤ÎÂè2°ú¿ô¤Ï¡¢catch¤ÎÌá¤êÃͤȤ·¤Æ»È¤ï¤ì¤Þ¤¹¡£

´Ø¿ôthrow¤Ï¡¢¤½¤ÎÂè1°ú¿ô¤Ë´ð¤Å¤¤¤ÆÂбþ¤¹¤ëcatch¤òõ¤·¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢catch¤ÎÂè1°ú¿ô¤¬ throw¤Ë»ØÄꤵ¤ì¤¿¤â¤Î¤Ëeq¤Ç¤¢¤ëcatch¤òõ¤·¤Þ¤¹¡£ ¤½¤Î¤è¤¦¤Êcatch¤¬Ê£¿ô¸Ä¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢ ¤â¤Ã¤È¤âÆâ¦¤Î¤â¤Î¤òÍ¥À褷¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¾å¤ÎÎã¤Ç¤Ï¡¢throw¤Ïfoo¤ò»ØÄꤷ¡¢ foo-outer¤Îcatch¤ÏƱ¤¸¥·¥ó¥Ü¥ë¤ò»ØÄꤷ¤Æ¤¤¤ë¤Î¤Ç¡¢ ¤½¤Îcatch¤ò»È¤¤¤Þ¤¹ ¡Ê¤¿¤À¤·¡¢¤³¤ì¤é¤Î¤¢¤¤¤À¤Ë¤Ï¾¤Î°ìÃפ¹¤ëcatch¤¬¤Ê¤¤¤È¤·¤Æ¡Ë¡£

throw¤Î¼Â¹Ô¤Ë¤è¤ê¡¢ Âбþ¤¹¤ëcatch¤Þ¤Ç¤Î¤¹¤Ù¤Æ¤ÎLisp¤Î¹½Â¤¤òÈ´¤±½Ð¤·¤Þ¤¹¡£ ¤³¤ì¤Ë¤Ï´Ø¿ô¸Æ¤Ó½Ð¤·¤â´Þ¤ß¤Þ¤¹¡£ let¤ä´Ø¿ô¸Æ¤Ó½Ð¤·¤Ê¤É¤Î«Çû¤òºî¤ë¹½Â¤¤«¤é¤â¤³¤Î¤è¤¦¤ËÈ´¤±½Ð¤¹¤Î¤Ç¡¢ Ä̾ï¤É¤ª¤êÈ´¤±½Ð¤¹¾ì¹ç¤ÈƱÍͤË«Çû¤ò²ò¤­¤Þ¤¹ ¡Êsee Local Variables¡Ë¡£ ƱÍͤˡ¢throw¤Ï¡¢save-excursion¡Êsee Excursions¡Ë¤Ç Êݸ¤·¤¿¥Ð¥Ã¥Õ¥¡¤ä°ÌÃÖ¾ðÊó¡¢ save-restriction¤ÇÊݸ¤·¤¿¥Ê¥í¥¤¥ó¥°¾õÂÖ¡¢ save-window-excursion¡Êsee Window Configurations¡Ë¤ÇÊݸ¤·¤¿ ¥¦¥£¥ó¥É¥¦¤ÎÁªÂò¾õÂÖ¤âÉü¸µ¤·¤Þ¤¹¡£ ¤µ¤é¤Ë¡¢¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥àunwind-protect¤ÇÀßÄꤷ¤¿¸å»ÏËö¤ò ¤³¤Î¥Õ¥©¡¼¥à¤«¤éÈ´¤±½Ð¤¹¤È¤­¤Ë¼Â¹Ô¤·¤Þ¤¹¡Êsee Cleanups¡Ë¡£

throw¤Ï¡¢¥Æ¥­¥¹¥È¾å¤Ç¡¢ ¥¸¥ã¥ó¥×Àè¤Ç¤¢¤ëcatch¤ÎÆâ¦¤Ë¸½¤ì¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ throw¤Ï¡¢catchÆâ¤«¤é¸Æ¤Ð¤ì¤¿Ê̤δؿô¤«¤é¤âÌá¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ throw¤Î¼Â¹Ô¤¬¡¢ »þ´ÖŪ¤Ëcatch¤ËÆþ¤Ã¤¿¤¢¤È¤Ç¡¢¤«¤Ä¡¢¤½¤ì¤«¤éÈ´¤±¤ë¤Þ¤¨¤Ç¤¢¤ë¸Â¤ê¡¢ throw¤ÏÂбþ¤¹¤ëcatch¤ò»²¾È¤Ç¤­¤Þ¤¹¡£ ¥¨¥Ç¥£¥¿¥³¥Þ¥ó¥É¥ë¡¼¥×¡Êsee Recursive Editing¡Ë¤«¤éÈ´¤±¤ë exit-recursive-edit¤Ê¤É¤Î¥³¥Þ¥ó¥É¤Ç throw¤ò»È¤¨¤ë¤Î¤Ï¡¢¤³¤Î¤è¤¦¤ÊÍýͳ¤«¤é¤Ç¤¹¡£

Common Lisp¤Ë´Ø¤·¤¿Ãí°Õ¡§ Common Lisp¤ò´Þ¤à¤Û¤È¤ó¤É¤Î¾¤ÎLisp¤Ë¤Ï¡¢ ÈóÃ༡Ū¤ËÀ©¸æ¤ò°Ü¤¹ÊýË¡¤¬¤¤¤¯¤Ä¤«¤¢¤ë¡£ ¤¿¤È¤¨¤Ð¡¢return¡¢return-from¡¢go¡£ Emacs Lisp¤Ë¤Ïthrow¤·¤«¤Ê¤¤¡£

Special Form: catch tag body…

catch¤Ï¡¢´Ø¿ôthrow¸þ¤±¤ËÌá¤ê°ÌÃÖ¤ò³ÎΩ¤¹¤ë¡£ ¤½¤ÎÌá¤ê°ÌÃ֤ϡ¢tag¤Ë¤è¤Ã¤ÆÂ¾¤ÎÌá¤ê°ÌÃ֤ȶèÊ̤µ¤ì¤ë¡£ tag¤Ï¡¢nil°Ê³°¤Ê¤é¤ÐǤ°Õ¤ÎLisp¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤è¤¤¡£ °ú¿ôtag¤Ï¡¢Ìá¤ê°ÌÃÖ¤ò³ÎΩ¤¹¤ë¤Þ¤¨¤Ë¡¢Ä̾ï¤É¤ª¤êɾ²Á¤µ¤ì¤ë¡£

Ìá¤ê°ÌÃÖ¤ò³ÎΩ¤·¤Æ¤«¤é¡¢catch¤Ï¡¢body¤Î¥Õ¥©¡¼¥à¤ò ¥Æ¥­¥¹¥È¾å¤Î½ç¤Ëɾ²Á¤¹¤ë¡£ ¥¨¥é¡¼¤äÈó¥í¡¼¥«¥ëæ½Ð¤Ê¤·¤Ë¥Õ¥©¡¼¥à¤Î¼Â¹Ô¤¬ÉáÄ̤˽ªÎ»¤·¤¿¾ì¹ç¡¢ catch¤Ï¡¢ºÇ¸å¤ÎËÜÂÎ¥Õ¥©¡¼¥à¤ÎÃͤòÊÖ¤¹¡£

body¤ÎÆâ¦¤Ç¡¢tag¤ÈƱ¤¸Ãͤò»ØÄꤷ¤¿throw¤¬¼Â¹Ô¤µ¤ì¤ë¤È¡¢ catch¤Ï¤¿¤À¤Á¤Ë½ªÎ»¤¹¤ë¡£ ¤³¤Î¤È¤­ÊÖ¤¹Ãͤϡ¢throw¤ÎÂè2°ú¿ô¤Ë»ØÄꤵ¤ì¤¿¤â¤Î¤Ç¤¢¤ë¡£

Function: throw tag value

throw¤ÎÌÜŪ¤Ï¡¢ catch¤Ç¤Þ¤¨¤â¤Ã¤Æ³ÎΩ¤·¤Æ¤ª¤¤¤¿Ìá¤ê°ÌÃÖ¤ØÉüµ¢¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£ °ú¿ôtag¤Ï¡¢¤µ¤Þ¤¶¤Þ¤Ê´û¸¤ÎÌá¤ê°ÌÃÖ¤«¤éÁª¤Ö¤¿¤á¤Ë»È¤¦¡£ tag¤Ï¡¢catch¤Ç»ØÄꤷ¤¿ÃͤÈeq¤Ç¤¢¤ëɬÍפ¬¤¢¤ë¡£ tag¤ËÊ£¿ô¤ÎÌá¤ê°ÌÃÖ¤¬°ìÃפ¹¤ë¾ì¹ç¤Ë¤Ï¡¢¤â¤Ã¤È¤âÆâ¦¤Î¤â¤Î¤ò»È¤¦¡£

°ú¿ôvalue¤Ï¡¢Âбþ¤¹¤ëcatch¤ÎÌá¤êÃͤȤ·¤Æ»È¤¦¡£

¥¿¥°tag¤Ç¤¢¤ëÍ­¸ú¤ÊÌá¤ê°ÌÃÖ¤¬¤Ê¤±¤ì¤Ð¡¢ (tag value)¤òȼ¤Ã¤¿¥¨¥é¡¼no-catch¤òÄÌÃΤ¹¤ë¡£