Next: , Previous: Constant Variables, Up: Variables   [Contents][Index]


10.3 ¥í¡¼¥«¥ëÊÑ¿ô

¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤Ï¡¢ ÌÀ¼¨Åª¤Ë¿·¤·¤¤ÃͤÇÃÖ¤­´¹¤¨¤Ê¤¤¸Â¤ê¸³¤¹¤ëÃͤò»ý¤Á¤Þ¤¹¡£ °ì»þŪ¤Ë¤·¤«Â¸ºß¤·¤Ê¤¤ÊÑ¿ôÃÍ¡¢ ¤Ä¤Þ¤ê¡¢¥×¥í¥°¥é¥à¤Î¤¢¤ëÉôʬ¤ò´°Î»¤¹¤ë¤Þ¤Ç¤Î¤ß¸ºß¤¹¤ëÊÑ¿ôÃͤò ºî¤ì¤ë¤ÈÊØÍø¤Ê¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤ÊÃͤò¥í¡¼¥«¥ë¡Êlocal¡¢¶É½êŪ¡Ë¤È¸Æ¤Ó¡¢ ¤½¤Î¤è¤¦¤Ë»È¤ï¤ì¤ëÊÑ¿ô¤ò¥í¡¼¥«¥ëÊÑ¿ô¡Êlocal variables¡Ë¤È¸Æ¤Ó¤Þ¤¹¡£

¤¿¤È¤¨¤Ð¡¢´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤¿¤È¤­¡¢¤½¤Î°ú¿ôÊÑ¿ô¤Ï¡¢ ´Ø¿ô¤òÈ´¤±¤ë¤Þ¤Ç¸³¤¹¤ë¿·¤¿¤Ê¥í¡¼¥«¥ë¤ÊÃͤò¼õ¤±¼è¤ê¤Þ¤¹¡£ ¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥àlet¤Ï¡¢»ØÄꤷ¤¿ÊÑ¿ô¤Î¿·¤¿¤Ê¥í¡¼¥«¥ëÃͤò ÌÀ¼¨Åª¤Ë³ÎΩ¤·¤Þ¤¹¡£ ¤³¤ì¤é¤Ï¥Õ¥©¡¼¥àlet¤òÈ´¤±¤ë¤Þ¤Ç¸³¤·¤Þ¤¹¡£

¥í¡¼¥«¥ëÃͤò³ÎΩ¤¹¤ë¤È¡¢ ÊÑ¿ô¤Î°ÊÁ°¤ÎÃ͡ʤ¢¤ë¤¤¤ÏÃͤ¬¤Ê¤¤¤³¤È¡Ë¤òÊݸ¤·¤Þ¤¹¡£ ¥í¡¼¥«¥ëÃͤθ³´ü´Ö¤¬½ªÎ»¤¹¤ë¤È¡¢°ÊÁ°¤ÎÃͤòÉü¸µ¤·¤Þ¤¹¡£ ¤³¤Î´ü´Ö¤Ï¡¢°ÊÁ°¤ÎÃͤò±£¤·¤Æ¡Êshadowed¡Ë¤¤¤Æ °ÊÁ°¤ÎÃͤϸ«¤¨¤Þ¤»¤ó¡£ ¥°¥í¡¼¥Ð¥ëÃͤǤâ¥í¡¼¥«¥ëÃͤǤⱣ¤»¤Þ¤¹¡Êsee Scope¡Ë¡£

ÊÑ¿ô¤¬¥í¡¼¥«¥ë¤Ê¤È¤­¤Ë¡Êsetq¤Ê¤É¤Ç¡Ë¤½¤ÎÊÑ¿ô¤òÀßÄꤹ¤ë¤È¡¢ ¥í¡¼¥«¥ëÃͤòÃÖ¤­´¹¤¨¤Þ¤¹¡£ ±£¤µ¤ì¤Æ¤¤¤ë¥°¥í¡¼¥Ð¥ëÃͤä°ÊÁ°¤Î¥í¡¼¥«¥ëÃͤòÊѹ¹¤·¤Þ¤»¤ó¡£ ¤³¤Î¤Õ¤ë¤Þ¤¤¤ò¥â¥Ç¥ë²½¤¹¤ë¤¿¤á¤Ë¡¢ ÊÑ¿ô¤Î¥í¡¼¥«¥ëÃͤ˲䨤ÆÊÑ¿ô¤Î¥í¡¼¥«¥ë«Çû¡Êlocal binding¡Ë¤ò ¹Í¤¨¤Þ¤¹¡£

¥í¡¼¥«¥ë«Çû¤È¤Ï¡¢¥í¡¼¥«¥ëÃͤòÊÝ»ý¤¹¤ë³µÇ°Åª¤Ê¾ì½ê¤Ç¤¹¡£ ´Ø¿ô¤älet¤Ê¤É¤Î¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥à¤ËÆþ¤ë¤¿¤Ó¤Ë ¥í¡¼¥«¥ë«Çû¤òºîÀ®¤·¤Þ¤¹¡£ ´Ø¿ô¤ä¥Õ¥©¡¼¥àlet¤«¤éÈ´¤±¤ë¤È¥í¡¼¥«¥ë«Çû¤òºï½ü¤·¤Þ¤¹¡£ ¥í¡¼¥«¥ë«Çû¤¬Â¸Â³¤¹¤ë¸Â¤ê¡¢ÊÑ¿ô¤ÎÃͤϤ½¤³¤ËÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ¥í¡¼¥«¥ë«Çû¤¬Â¸ºß¤¹¤ë¤È¤­¤Ësetq¤äset¤ò»È¤¦¤È¡¢ ¥í¡¼¥«¥ë«Çû¤ÎÃæ¤ËÊ̤ÎÃͤò³ÊǼ¤·¤Þ¤¹¡£ ¿·¤¿¤Ê«Çû¤òºî¤ë¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£

¥°¥í¡¼¥Ð¥ëÃͤòÊÝ»ý¤¹¤ë³µÇ°Åª¤Ê¾ì½ê¤ò ¥°¥í¡¼¥Ð¥ë«Çû¡Êglobal binding¡Ë¤È¤â¤¤¤¤¤Þ¤¹¡£

ÊÑ¿ô¤Ë¤Ï°ìÅÙ¤ËÊ£¿ô¤Î¥í¡¼¥«¥ë«Çû¤¬¤¢¤ê¤¨¤Þ¤¹ ¡Ê¤¿¤È¤¨¤Ð¡¢Æ±¤¸ÊÑ¿ô¤ò«Çû¤¹¤ëÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥Õ¥©¡¼¥àlet¤¬¤¢¤ë¤È¤­¡Ë¡£ ¤½¤Î¤è¤¦¤Ê¾ì¹ç¡¢´û¸¤Î¤â¤Ã¤È¤âºÇ¶á¤ËºîÀ®¤µ¤ì¤¿¥í¡¼¥«¥ë«Çû¤¬¡¢ ÊÑ¿ô¤Î¸½ºß¤Î«Çû¡Êcurrent binding¡Ë¤Ç¤¹¡£ ¡Ê¤³¤Îµ¬Â§¤òưŪ¥¹¥³¡¼¥×¡Êdynamic scoping¡Ë¤È¸Æ¤Ó¤Þ¤¹¡£ see Variable Scoping¡Ë ¥í¡¼¥«¥ë«Çû¤¬¤Þ¤Ã¤¿¤¯¤Ê¤±¤ì¤Ð¡¢ÊÑ¿ô¤Î¥°¥í¡¼¥Ð¥ë«Çû¤¬¸½ºß¤Î«Çû¤Ç¤¹¡£ ¸½ºß¤Î«Çû¤Î¤³¤È¤ò¶¯Ä´¤·¤Æ´û¸¤ÎºÇ¥í¡¼¥«¥ë«Çû¤È¸Æ¤Ö¤³¤È¤â¤¢¤ê¤Þ¤¹¡£ ¥·¥ó¥Ü¥ë¤ÎÄ̾ï¤Îɾ²Á¤Ç¤Ï¡¢¤½¤Î¸½ºß¤Î«Çû¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£

¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥àlet¤älet*¤Ï¡¢ ¥í¡¼¥«¥ë«Çû¤òºî¤ë¤¿¤á¤Ë¤¢¤ê¤Þ¤¹¡£

Special Form: let (bindings…) forms…

¤³¤Î¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥à¤Ï¡¢bindings¤Ë½¾¤Ã¤ÆÊÑ¿ô¤ò«Çû¤·¡¢ forms¤Î¤¹¤Ù¤Æ¤ò¥Æ¥­¥¹¥È¾å¤Î½ç¤Ëɾ²Á¤¹¤ë¡£ let¥Õ¥©¡¼¥à¤Ï¡¢forms¤ÎºÇ¸å¤Î¥Õ¥©¡¼¥à¤ÎÃͤòÊÖ¤¹¡£

bindings¤Î¤ª¤Î¤ª¤Î¤Ï¡¢(i)¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤«¡¢ (ii)¥Õ¥©¡¼¥à(symbol value-form)¤Î¥ê¥¹¥È¤Ç¤¢¤ë¡£ Á°¼Ô¤Ï¡¢¥·¥ó¥Ü¥ë¤Ënil¤ò«Çû¤¹¤ë¡£ ¸å¼Ô¤Ï¡¢symbol¤Ëvalue-form¤Îɾ²Á·ë²Ì¤ò«Çû¤¹¤ë¡£ value-form¤ò¾Êά¤¹¤ë¤Ènil¤ò»È¤¦¡£

bindings¤Îvalue-form·²¤¹¤Ù¤Æ¤ò¸½¤ì¤ë½ç¤Ëɾ²Á¤·¤Æ¤«¤é¡¢ ¥·¥ó¥Ü¥ë¤Ë¤½¤ì¤é¤ÎÃͤò«Çû¤¹¤ë¡£ Îã¤ò¤Ä¤®¤Ë¼¨¤¹¡£ Z¤Ï¡¢Y¤Î¸Å¤¤ÃÍ2¤Ë«Çû¤µ¤ì¡¢Y¤Î¿·¤·¤¤ÃÍ1¤Ç¤Ï¤Ê¤¤¡£

(setq Y 2)
     ⇒ 2
(let ((Y 1) 
      (Z Y))
  (list Y Z))
     ⇒ (1 2)
Special Form: let* (bindings…) forms…

¤³¤Î¥¹¥Ú¥·¥ã¥ë¥Õ¥©¡¼¥à¤Ïlet¤Ë»÷¤Æ¤¤¤ë¤¬¡¢ ÊÑ¿ô¤Î¥í¡¼¥«¥ëÃͤò·×»»¤·½ª¤¨¤¿Ä¾¸å¤Ë¤½¤ÎÊÑ¿ô¤ò«Çû¤·¡¢ ¤Ä¤®¤ÎÊÑ¿ô¤Î¥í¡¼¥«¥ëÃͤη׻»¤Ë¿Ê¤à¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢bindingsÆâ¤Î¼°¤Ç¤Ï¡¢¤³¤Îlet*¥Õ¥©¡¼¥àÆâ¤Ç ¤Þ¤¨¤Ë¤¢¤ë¥·¥ó¥Ü¥ë¤ò»²¾È¤Ç¤­¤ë¡£ ¤Ä¤®¤ÎÎã¤ò¾å¤Îlet¤ÎÎã¤ÈÈæ³Ó¤·¤Æ¤Û¤·¤¤¡£

(setq Y 2)
     ⇒ 2
(let* ((Y 1)
       (Z Y))    ; ÀßÄꤷ½ª¤¨¤¿¤Ð¤«¤ê¤ÎY¤ÎÃͤò»È¤¦
  (list Y Z))
     ⇒ (1 1)

°Ê²¼¤Ë¥í¡¼¥«¥ë«Çû¤òºîÀ®¤¹¤ë¤½¤Î¾¤Îµ¡Ç½¤Î´°Á´¤Ê°ìÍ÷¤ò¤¢¤²¤Æ¤ª¤­¤Þ¤¹¡£

ÊÑ¿ô¤Ï¡¢¥Ð¥Ã¥Õ¥¡¥í¡¼¥«¥ë¤Ê«Çû¡Êsee Buffer-Local Variables¤ä ¥Õ¥ì¡¼¥à¥í¡¼¥«¥ë¤Ê«Çû¡Êsee Frame-Local Variables¡Ë¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¾¯¿ô¤ÎÊÑ¿ô¤Ï¡¢Ã¼Ëö¤Ë¥í¡¼¥«¥ë¤Ê«Çû¡Êsee Multiple Displays¡Ë ¤ò»ý¤Ä¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ¤³¤Î¼ï¤Î«Çû¤ÏÉáÄÌ¤Î¥í¡¼¥«¥ë«Çû¤ÈƱ¤¸¤è¤¦¤ËƯ¤­¤Þ¤¹¤¬¡¢ ¤³¤ì¤é¤ÏEmacs¤Î¡Ø¤É¤ÎÉôʬ¡Ù¤Ë¤¤¤ë¤«¤Ë°Í¸¤·¤¿¥í¡¼¥«¥ë²½¤Ç¤¢¤ê¡¢ »þ´ÖŪ¤Ê¥í¡¼¥«¥ë²½¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£

Variable: max-specpdl-size

¤³¤ÎÊÑ¿ô¤Ï¡¢¡Ê"Variable binding depth exceeds max-specpdl-size"¤ò ȼ¤Ã¤¿¡Ë¥¨¥é¡¼¤òÄÌÃΤ¹¤ë¤Þ¤Ç¤Ëµö¤µ¤ì¤ë¡¢ ¥í¡¼¥«¥ëÊÑ¿ô«Çû¤È unwind-protect¤Ë¤è¤ë¸å»ÏËö¡Êsee Nonlocal Exits¡Ë¤Î Á´ÂΤθĿô¤ÎÀ©¸Â¤òÄêµÁ¤¹¤ë¡£

¤³¤ÎÀ©¸Â¡¢¤ª¤è¤Ó¡¢¤³¤ì¤òͤ¨¤¿¤È¤­¤Î¥¨¥é¡¼¤Ï¡¢ ÉÔÀµ¤ËÄêµÁ¤µ¤ì¤¿´Ø¿ô¤Ë¤è¤Ã¤ÆLisp¤¬Ìµ¸Â¤ËºÆµ¢¤¹¤ë¤³¤È¤òËɻߤ¹¤ë 1¤Ä¤ÎÊýË¡¤Ç¤¢¤ë¡£

¥Ç¥Õ¥©¥ë¥ÈÃͤÏ600¤Ç¤¢¤ë¡£ Lisp¥Ç¥Ð¥Ã¥¬¤ËÆþ¤Ã¤¿¤È¤­¡¢ À©¸Â¤Ë¶á¤¤¾ì¹ç¤Ë¤Ï¥Ç¥Ð¥Ã¥¬¼«¿È¤¬¼Â¹Ô¤Ç¤­¤ë¤³¤È¤òÊݾڤ¹¤ë¤¿¤á¤ËÃͤòÁý¤ä¤¹¡£