Next: , Previous: Simple Macro, Up: Macros   [Contents][Index]


12.2 ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎŸ³«

¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï¥Þ¥¯¥í̾¤Ç»Ï¤Þ¤ë¥ê¥¹¥È¤Ç¤¢¤ê¡¢ ´Ø¿ô¸Æ¤Ó½Ð¤·¤È¤Û¤È¤ó¤ÉƱ¤¸¤Ë¸«¤¨¤Þ¤¹¡£ ¥ê¥¹¥È¤Î»Ä¤ê¤ÎÍ×ÁǤϥޥ¯¥í¤Î°ú¿ô¤Ç¤¹¡£

¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Îɾ²Á¤Ï¡¢´Ø¿ô¸Æ¤Ó½Ð¤·¤Îɾ²Á¤Î¤è¤¦¤Ë»Ï¤á¤é¤ì¤Þ¤¹¤¬¡¢ 1¤Ä¤À¤±½ÅÍפʰ㤤¤¬¤¢¤ê¤Þ¤¹¡£ ¥Þ¥¯¥í¤Î°ú¿ô¤Ï¡¢¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë¸½¤ì¤¿¼ÂºÝ¤Î°ú¿ô¤Ç¤¹¡£ ¥Þ¥¯¥íÄêµÁ¤ËÅϤ¹¤Þ¤¨¤Ë¡¢¤½¤ì¤é¤òɾ²Á¤·¤Þ¤»¤ó¡£ °ìÊý¡¢´Ø¿ô¤Î°ú¿ô¤Ï¡¢´Ø¿ô¸Æ¤Ó½Ð¤·¤Î¥ê¥¹¥È¤ÎÍ×ÁǤòɾ²Á¤·¤¿·ë²Ì¤Ç¤¹¡£

°ú¿ô¤òÆÀ¤ë¤È¡¢Lisp¤Ï´Ø¿ôÄêµÁ¤òµ¯Æ°¤¹¤ë¤Î¤ÈƱÍͤ˥ޥ¯¥íÄêµÁ¤òµ¯Æ°¤·¤Þ¤¹¡£ ¥Þ¥¯¥í¤Î°ú¿ôÊÑ¿ô¤Ï¡¢¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ôÃͤä &rest°ú¿ô¤Î¾ì¹ç¤Ë¤Ï¤½¤ì¤é¤Î¥ê¥¹¥È¤Ë«Çû¤µ¤ì¤Þ¤¹¡£ ¤½¤¦¤·¤Æ¡¢¥Þ¥¯¥íËÜÂΤò¼Â¹Ô¤·¡¢´Ø¿ôËÜÂÎ¤ÈÆ±ÍͤËÃͤòÊÖ¤·¤Þ¤¹¡£

¥Þ¥¯¥í¤È´Ø¿ô¤Î½ÅÍפʰ㤤¤Î2¤Ä¤á¤Ï¡¢ ¥Þ¥¯¥íËÜÂΤ¬ÊÖ¤·¤¿Ãͤϥޥ¯¥í¸Æ¤Ó½Ð¤·¤ÎÃͤǤϤʤ¤¤³¤È¤Ç¤¹¡£ Ìá¤êÃͤÏÃͤò·×»»¤¹¤ë¤¿¤á¤Î¤«¤ï¤ê¤Î¼°¤Ç¤¢¤ê¡¢ ¤³¤ì¤ò¥Þ¥¯¥í¤ÎŸ³«·Á¡Êexpansion¡Ë¤È¤¤¤¤¤Þ¤¹¡£ Lisp¥¤¥ó¥¿¡¼¥×¥ê¥¿¤Ï¡¢¥Þ¥¯¥í¤«¤éÌá¤Ã¤Æ¤¯¤ë¤È¡¢ ¤¿¤À¤Á¤ËŸ³«·Á¤òɾ²Á¤¹¤ë¤³¤È¤Ø¿Ê¤ß¤Þ¤¹¡£

Ÿ³«·Á¤Ï¡¢Ä̾ï¤É¤ª¤ê¤Ëɾ²Á¤µ¤ì¤ë¤Î¤Ç¡¢ Ÿ³«·Á¤«¤é¾¤Î¥Þ¥¯¥í¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ Ʊ°ì¤Î¥Þ¥¯¥í¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¤¬¡¢ ¤½¤ì¤Ï°ìÈÌŪ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£

macroexpand¤ò¸Æ¤Ö¤È¡¢»ØÄꤷ¤¿¥Þ¥¯¥í¤ÎŸ³«·Á¤òÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

Function: macroexpand form &optional environment

¤³¤Î´Ø¿ô¤Ï¡¢form¤¬¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ê¤é¤Ð¡¢¤½¤ì¤òŸ³«¤¹¤ë¡£ ¤½¤Î·ë²Ì¤¬¤Þ¤¿Ê̤Υޥ¯¥í¸Æ¤Ó½Ð¤·¤Ç¤¢¤ì¤Ð¡¢¤µ¤é¤ËŸ³«¤¹¤ë¡£ ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤Ê¤¤·ë²Ì¤òÆÀ¤ë¤Þ¤Ç¤³¤ì¤ò·«¤êÊÖ¤¹¡£ ¤½¤ì¤¬¡¢macroexpand¤¬ÊÖ¤¹ÃͤǤ¢¤ë¡£ form¤¬»Ï¤á¤«¤é¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤Ê¤±¤ì¤Ð¡¢ Í¿¤¨¤é¤ì¤¿¤È¤ª¤ê¤Î¤â¤Î¤òÊÖ¤¹¡£

macroexpand¤Ïform¤ÎÉôʬ¼°¤òÄ´¤Ù¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ¤Û¤·¤¤ ¡Ê¤¿¤À¤·¡¢¥Þ¥¯¥íÄêµÁ¤Ë¤è¤Ã¤Æ¤ÏÄ´¤Ù¤ë¤«¤â¤·¤ì¤Ê¤¤¡Ë¡£ Éôʬ¼°¤¬¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤¢¤Ã¤¿¤È¤·¤Æ¤â¡¢ macroexpand¤Ï¤½¤ì¤é¤òŸ³«¤·¤Ê¤¤¡£

´Ø¿ômacroexpand¤Ï¡¢¥¤¥ó¥é¥¤¥ó´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤ÏŸ³«¤·¤Ê¤¤¡£ ¥¤¥ó¥é¥¤¥ó´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤òÍý²ò¤¹¤ë¤³¤È¤ÏÉáÄ̤δؿô¸Æ¤Ó½Ð¤·¤òÍý²ò¤¹¤ë¤Î¤È ¤«¤ï¤ê¤Ê¤¤¤Î¤Ç¡¢Ä̾¤½¤Î¤è¤¦¤ÊŸ³«¤ò¹Ô¤¦É¬ÍפϤʤ¤¡£

environment¤ò»ØÄꤹ¤ë¤È¡¢ ¤½¤ì¤Ï¡¢¸½ºßÄêµÁºÑ¤ß¤Î¥Þ¥¯¥í¤ò±£¤¹¥Þ¥¯¥íÄêµÁ¤ÎÏ¢Áۥꥹ¥È¤òɽ¤¹¡£ ¥Ð¥¤¥È¥³¥ó¥Ñ¥¤¥ë¤Ç¤Ï¤³¤Îµ¡Ç½¤ò»È¤¦¡£

(defmacro inc (var)
    (list 'setq var (list '1+ var)))
     ⇒ inc
(macroexpand '(inc r))
     ⇒ (setq r (1+ r))
(defmacro inc2 (var1 var2)
    (list 'progn (list 'inc var1) (list 'inc var2)))
     ⇒ inc2
(macroexpand '(inc2 r s))
     ⇒ (progn (inc r) (inc s))  ; ¤³¤³¤Ç¤Ïinc¤òŸ³«¤·¤Ê¤¤