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


9.5.4 Èó¥í¡¼¥«¥ëæ½Ð»þ¤Î¸å»ÏËö

unwind-protect¹½Â¤¤Ï¡¢¥Ç¡¼¥¿¹½Â¤¤ò°ì»þŪ¤ËÀ°¹çÀ­¤Î¤Ê¤¤¾õÂÖ¤Ë ¤¹¤ë¤È¤­¤Ë¤ÏËܼÁŪ¤Ç¤¹¡£ ¤³¤Î¹½Â¤¤Ë¤è¤ê¡¢¥¨¥é¡¼¤äÈó¥í¡¼¥«¥ëæ½Ð¤¬µ¯¤³¤Ã¤¿¤È¤­¤Ë¡¢ ¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤ò²óÉü¤Ç¤­¤Þ¤¹¡£

Special Form: unwind-protect body cleanup-forms…

unwind-protect¤Ï¡¢body¤«¤é¤É¤Î¤è¤¦¤ËÀ©¸æ¤¬Î¥¤ì¤¿¾ì¹ç¤Ë¤â cleanup-forms¤Î¼Â¹Ô¤òÊݾڤ·¤Æ¡¢body¤ò¼Â¹Ô¤¹¤ë¡£ body¤ÏÄ̾ï¤É¤ª¤ê´°Î»¤¹¤ë¤«¡¢ throw¤ò¼Â¹Ô¤·¤Æunwind-protect¤«¤éæ½Ð¤¹¤ë¤«¡¢ ¥¨¥é¡¼¤ò°ú¤­µ¯¤³¤¹¡£ ¤¤¤º¤ì¤Î¾ì¹ç¤Ç¤â¡¢cleanup-forms¤Ïɾ²Á¤µ¤ì¤ë¡£

¥Õ¥©¡¼¥àbody¤¬Àµ¾ï¤Ë½ªÎ»¤¹¤ë¤È¡¢ unwind-protect¤Ï¡¢cleanup-forms¤òɾ²Á¤·¤¿¤¢¤È¤Ë¡¢ ¥Õ¥©¡¼¥àbody¤ÎºÇ¸å¤ÎÃͤòÊÖ¤¹¡£ ¥Õ¥©¡¼¥àbody¤¬´°Î»¤·¤Ê¤«¤Ã¤¿¾ì¹ç¡¢ unwind-protect¤ÏÉáÄ̤ΰÕÌ£¤Ç¤ÎÃͤÏÊÖ¤µ¤Ê¤¤¡£

unwind-protect¤¬Êݸ¤ë¤Î¤Ïbody¤À¤±¤Ç¤¢¤ë¡£ cleanup-forms¤½¤Î¤â¤Î¤Î¤É¤ì¤«¤¬¡Êthrow¤ä¥¨¥é¡¼¤Ç¡Ë Èó¥í¡¼¥«¥ëæ½Ð¤ò¹Ô¤¦¤È¡¢unwind-protect¤Ï¡¢ cleanup-forms¤Î»Ä¤ê¤òɾ²Á¤¹¤ë¤³¤È¤òÊݾڤ·¤Ê¤¤¡£ cleanup-forms¤Î¤É¤ì¤«¤¬¼ºÇÔ¤¹¤ë¤È¥È¥é¥Ö¥ë¤Ë¤Ê¤ë´í¸±À­¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢ cleanup-forms¤òÊ̤Îunwind-protect¤ÇÊݸ¤ë¡£

¥Õ¥©¡¼¥àunwind-protect¤Î¸½ºß¤ÎÆþ¤ì»Ò¤Î¸Ä¿ô¤Ï¡¢ ¥í¡¼¥«¥ëÊÑ¿ô«Çû¤Î¸Ä¿ô¤È¤È¤â¤Ë¿ô¤¨¤é¤ì¡¢ max-specpdl-size¤ËÀ©¸Â¤µ¤ì¤Æ¤¤¤ë¡Êsee Local Variables¡Ë¡£

¤¿¤È¤¨¤Ð¡¢É½¼¨¤·¤Ê¤¤¥Ð¥Ã¥Õ¥¡¤ò°ì»þŪ¤ËºîÀ®¤·¡¢ ½ªÎ»Á°¤Ë³Î¼Â¤Ë¤½¤ì¤ò¾Ãµî¤·¤¿¤¤¤È¤·¤Þ¤·¤ç¤¦¡£

(save-excursion
  (let ((buffer (get-buffer-create " *temp*")))
    (set-buffer buffer)
    (unwind-protect
        body
      (kill-buffer buffer))))

ÊÑ¿ôbuffer¤ò»È¤ï¤º¤Ë(kill-buffer (current-buffer))¤È ½ñ¤¯¤À¤±¤Ç½½Ê¬¤À¤È¹Í¤¨¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£ ¤·¤«¤·¡¢Ê̤ΥХåե¡¤ËÀÚ¤êÂØ¤¨¤¿¤¢¤È¤Çbody¤Ç¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¤Ï¡¢ ¾å¤ÎÊýË¡¤Ï¤è¤ê°ÂÁ´¤Ç¤¹¡£ ¡Ê¤¢¤ë¤¤¤Ï¡¢body¤Î¼þ¤ê¤ËÊ̤Îsave-excursion¤ò½ñ¤¤¤Æ¡¢ °ì»þ¥Ð¥Ã¥Õ¥¡¤ò¾Ãµî¤¹¤ë¤È¤­¤Ë¡¢¤½¤ì¤¬¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤Ë¤Ê¤ë¤³¤È¤ò Êݾڤ¹¤ë¡£¡Ë

Emacs¤Ë¤Ï¡¢¾å¤Î¤è¤¦¤Ê¥³¡¼¥É¤ËŸ³«¤µ¤ì¤ëwith-temp-buffer¤È¤¤¤¦ ɸ½à¥Þ¥¯¥í¤¬¤¢¤ê¤Þ¤¹¡Êsee Current Buffer¡Ë¡£ Ëܽñ¤ÇÄêµÁ¤·¤Æ¤¤¤ë¥Þ¥¯¥í¤Î¤¤¤¯¤Ä¤«¤Ç¤Ï¡¢ ¤³¤Î¤è¤¦¤Ëunwind-protect¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£

¥Õ¥¡¥¤¥ëftp.el¤«¤é»ý¤Ã¤Æ¤­¤¿¼ÂºÝ¤ÎÎã¤ò¼¨¤·¤Þ¤·¤ç¤¦¡£ ¥ê¥â¡¼¥È¤Î·×»»µ¡¤Ø¤ÎÀܳ¤ò³ÎΩ¤¹¤ë¥×¥í¥»¥¹¡Êsee Processes¡Ë¤òºî¤ê¤Þ¤¹¡£ ´Ø¿ôftp-login¤Ï¡¢¤½¤Î´Ø¿ô¤ÎºîÀ®¼Ô¤¬Í½ÁۤǤ­¤Ê¤¤¤Û¤É¤Î ¿ô¿¤¯¤ÎÌäÂê¤ËÂФ·¤Æ¤È¤Æ¤âÉÒ´¶¤Ç¤¹¤«¤é¡¢ ¼ºÇÔ¤·¤¿¤È¤­¤Ë¥×¥í¥»¥¹¤ò¾Ãµî¤¹¤ë¤³¤È¤òÊݾڤ¹¤ë¥Õ¥©¡¼¥à¤ÇÊݸ¤Þ¤¹¡£ ¤µ¤â¤Ê¤¤¤È¡¢Emacs¤Ï¡¢ÌµÍѤʥµ¥Ö¥×¥í¥»¥¹¤ÇËþ¤¿¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

(let ((win nil))
  (unwind-protect
      (progn
        (setq process (ftp-setup-buffer host file))
        (if (setq win (ftp-login process host user password))
            (message "Logged in")
          (error "Ftp login failed")))
    (or win (and process (delete-process process)))))

¤³¤ÎÎã¤Ë¤Ï¡¢¾®¤µ¤Ê¥Ð¥°¤¬1¤Ä¤¢¤ê¤Þ¤¹¡£ ¥æ¡¼¥¶¡¼¤¬C-g¤òÂǤäÆÃæÃǤ·¤è¤¦¤È¤·¤Æ¡¢¤«¤Ä¡¢ ´Ø¿ôftp-setup-buffer¤Î½ªÎ»¸å¤Ë ÊÑ¿ôprocess¤òÀßÄꤹ¤ë¤Þ¤¨¤Ë¼ÂºÝ¤ËÃæÃǤ¬¹Ô¤ï¤ì¤ë¤È¡¢ ¥×¥í¥»¥¹¤Ï¾Ãµî¤µ¤ì¤Þ¤»¤ó¡£ ¤³¤Î¥Ð¥°¤òľ¤¹´Êñ¤ÊÊýË¡¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢ ¾¯¤Ê¤¯¤È¤â¡¢¤Û¤È¤ó¤Éµ¯¤³¤ê¤¨¤Þ¤»¤ó¡£