Next: , Previous: Scope, Up: Variable Scoping   [Contents][Index]


10.9.2 ¸³´ü´Ö

¸³´ü´Ö¡ÊExtent¡Ë¤È¤Ï¡¢¥×¥í¥°¥é¥à¤Î¼Â¹ÔÃæ¤Ë¤ª¤¤¤Æ¡¢ ÊÑ¿ô̾¤¬Í­¸ú¤Ç¤¢¤ë´ü´Ö¤ò»Ø¤·¤Þ¤¹¡£ Emacs Lisp¤Ç¤Ï¡¢Â«Çû¤òºî¤Ã¤¿¥Õ¥©¡¼¥à¤ò¼Â¹Ô¤·¤Æ¤¤¤ë´ü´ÖÃæ¤À¤±¡¢ ÊÑ¿ô¤ÏÍ­¸ú¤Ç¤¹¡£ ¤³¤ì¤òưŪ¸³´ü´Ö¡Êdynamic extent¡Ë¤È¸Æ¤Ó¤Þ¤¹¡£ C¤äPascal¤Ê¤É¤Î¤Û¤È¤ó¤É¤Î¸À¸ì¤Î¡Ø¥í¡¼¥«¥ë¡ÙÊÑ¿ô¤ä¡Ø¼«Æ°¡ÙÊÑ¿ô¤â ưŪ¸³´ü´Ö¤Ç¤¹¡£

ưŪ¸³´ü´Ö¤È¤ÏÊ̤Τâ¤Î¤Ë̵¸Â¤Î¸³´ü´Ö¡Êindefinite extent¡Ë¤¬¤¢¤ê¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢ÊÑ¿ô«Çû¤Ï¡¢¤½¤Î«Çû¤òºî¤Ã¤¿¥Õ¥©¡¼¥à¤«¤éÈ´¤±¤Æ¤â¸³¤¹¤ë¤Î¤Ç¤¹¡£ ¤¿¤È¤¨¤Ð¡¢Common Lisp¤äScheme¤Ë¤Ï¤³¤ì¤¬¤¢¤ê¤Þ¤¹¤¬¡¢Emacs Lisp¤Ë¤Ï¤¢¤ê¤Þ¤»¤ó¡£

¤³¤ì¤òÀâÌÀ¤¹¤ë¤¿¤á¤Ë¡¢¤Ä¤®¤Î´Ø¿ômake-add¤ò¹Í¤¨¤Þ¤¹¡£ ¤³¤Î´Ø¿ô¤Ï¡¢n¤Ë¼«¿È¤Î°ú¿ôm¤ò²Ã»»¤¹¤ë´Ø¿ô¤òÊÖ¤·¤Þ¤¹¡£ ¤³¤Î´Ø¿ô¤ÏCommon Lisp¤Ç¤Ïưºî¤·¤Þ¤¹¤¬¡¢Emacs Lisp¤Ç¤Ï¤À¤á¤Ç¤¹¡£ ¤È¤¤¤¦¤Î¤Ï¡¢make-add¤Î¸Æ¤Ó½Ð¤·¤òÈ´¤±¤ë¤È¡¢ ÊÑ¿ôn¤Ï¼Â°ú¿ô2¤Ë«Çû¤µ¤ì¤Ê¤¯¤Ê¤ë¤«¤é¤Ç¤¹¡£

(defun make-add (n)
    (function (lambda (m) (+ n m))))  ; ´Ø¿ô¤òÊÖ¤¹
     ⇒ make-add
(fset 'add2 (make-add 2))  ; ´Ø¿ôadd2¤ò
                           ;   (make-add 2)¤ò»È¤Ã¤ÆÄêµÁ¤¹¤ë
     ⇒ (lambda (m) (+ n m))
(add2 4)                   ; 4¤Ë2¤ò²Ã»»¤·¤Æ¤ß¤ë
error→ Symbol's value as variable is void: n

Lisp¤ÎÊý¸À¤Î¤¤¤¯¤Ä¤«¤Ë¤Ï¡Ø¥¯¥í¡¼¥¸¥ã¡Ù¡Êclosure¡Ë¤¬¤¢¤ê¤Þ¤¹¡£ ¤½¤ì¤Ï´Ø¿ô¤Î¤è¤¦¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¹¤¬¡¢ÄɲäÎÊÑ¿ô«Çû¤òµ­Ï¿¤·¤Þ¤¹¡£ Emacs Lisp¤Ë¤Ï¥¯¥í¡¼¥¸¥ã¤Ï¤¢¤ê¤Þ¤»¤ó¡£