Next: , Previous: Argument Evaluation, Up: Problems with Macros   [Contents][Index]


12.6.2 ¥Þ¥¯¥íŸ³«·ÁÆâ¤Î¥í¡¼¥«¥ëÊÑ¿ô

for¤Î¿·¤·¤¤ÄêµÁ¤Ë¤Ï¡¢¿·¤¿¤ÊÌäÂ꤬¤¢¤ê¤Þ¤¹¡£ ¥æ¡¼¥¶¡¼¤¬Í½´ü¤·¤Æ¤¤¤Ê¤¤¥í¡¼¥«¥ëÊÑ¿ômax¤òƳÆþ¤·¤Æ¤¤¤ë¤Î¤Ç¤¹¡£ ¤³¤ì¤Ï¡¢¤Ä¤®¤Î¤è¤¦¤Ê¾ì¹ç¡¢ÌäÂê¤ò°ú¤­µ¯¤³¤·¤Þ¤¹¡£

(let ((max 0))
  (for x from 0 to 10 do
    (let ((this (frob x)))
      (if (< max this)
          (setq max this)))))

for¤ÎËÜÂÎÆâ¤Ç¤Îmax¤Î»²¾È¤Ï¡¢ ¥æ¡¼¥¶¡¼¤¬Â«Çû¤·¤¿max¤ò»²¾È¤¹¤ë¤â¤Î¤È´üÂÔ¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢ ¼ÂºÝ¤Ë¤Ïfor¤¬ºî¤Ã¤¿Â«Çû¤ò»È¤¤¤Þ¤¹¡£

¤³¤ì¤ò½¤Àµ¤¹¤ë¤Ë¤Ï¡¢max¤Î¤«¤ï¤ê¤Ë¡¢ ¥¤¥ó¥¿¡¼¥ó¤·¤Æ¤Ê¤¤¥·¥ó¥Ü¥ë¡Êsee Creating Symbols¡Ë¤ò»È¤¤¤Þ¤¹¡£ ¥¤¥ó¥¿¡¼¥ó¤·¤Æ¤Ê¤¤¥·¥ó¥Ü¥ë¤Ï¡¢Â¾¤Î¥·¥ó¥Ü¥ë¤ÈƱÍͤˡ¢ «Çû¤·¤¿¤ê»²¾È¤·¤¿¤ê¤Ç¤­¤Þ¤¹¤¬¡¢for¤Çºî¤Ã¤¿¤Î¤Ç¡¢ ¥æ¡¼¥¶¡¼¥×¥í¥°¥é¥à¤Ë¤Ï¸½¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤Þ¤¹¡£ ¥¤¥ó¥¿¡¼¥ó¤·¤Æ¤Ê¤¤¤Î¤Ç¡¢¥æ¡¼¥¶¡¼¤¬¥×¥í¥°¥é¥à¤Î¤¢¤È¤ÎÉôʬ¤Ç »²¾È¤¹¤ëÊýË¡¤â¤¢¤ê¤Þ¤»¤ó¡£ for¤Ç»È¤Ã¤¿²Õ½ê°Ê³°¤Ë¤Ï¸½¤ì¤¨¤Ê¤¤¤Î¤Ç¤¹¡£ ¤³¤Î¤è¤¦¤Ëưºî¤¹¤ëfor¤ÎÄêµÁ¤ò¤Ä¤®¤Ë¼¨¤·¤Þ¤¹¡£

(defmacro for (var from init to final do &rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  (let ((tempvar (make-symbol "max")))
    `(let ((,var ,init)
           (,tempvar ,final))
       (while (<= ,var ,tempvar)
         ,@body
         (inc ,var)))))

¤³¤ì¤Ï¡¢max¤È¤¤¤¦Ì¾Á°¤Î¥¤¥ó¥¿¡¼¥ó¤·¤Æ¤Ê¤¤¥·¥ó¥Ü¥ë¤òºîÀ®¤·¡¢ ¤â¤È¤Î¼°¤Ë¸½¤ì¤Æ¤¤¤¿¥¤¥ó¥¿¡¼¥ó¤·¤¿¥·¥ó¥Ü¥ëmax¤Î¤«¤ï¤ê¤Ë Ÿ³«·ÁÆâÉô¤Ç»È¤¤¤Þ¤¹¡£