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


12.6.1 ¥Þ¥¯¥í°ú¿ô¤ÎÊ£¿ô²óɾ²Á

¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤È¤­¤Ë¤Ï¡¢Å¸³«·Á¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢ °ú¿ô¤¬²¿²óɾ²Á¤«¤µ¤ì¤ë¤«¤ËÃí°Õ¤òʧ¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ¤Ä¤®¤Î¡Ê·«¤êÊÖ¤·¤ò¹Ô¤¦¡Ë¥Þ¥¯¥í¤Ç¡¢¤³¤ÎÌäÂê¤ò¼¨¤·¤Þ¤·¤ç¤¦¡£ ¤³¤Î¥Þ¥¯¥í¤Ç¡¢Pascal¤Ë¤¢¤ë¤è¤¦¤Êñ½ã¤Ê¡Øfor¡Ù¥ë¡¼¥×¤ò½ñ¤±¤Þ¤¹¡£

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  (list 'let (list (list var init))
        (cons 'while (cons (list '<= var final)
                           (append body (list (list 'inc var)))))))
⇒ for

(for i from 1 to 3 do
   (setq square (* i i))
   (princ (format "\n%d %d" i square)))
→
(let ((i 1))
  (while (<= i 3)
    (setq square (* i i))
    (princ (format "%d      %d" i square))
    (inc i)))
     -|1       1
     -|2       4
     -|3       9
⇒ nil

¤³¤Î¥Þ¥¯¥í¤Î°ú¿ô¡¢from¡¢to¡¢do¤Ï¡¢ ¡Ø¥·¥ó¥¿¥Ã¥¯¥¹¥·¥å¥¬¡¼¡Ù¤Ç¤¢¤ê¡¢´°Á´¤Ë̵»ë¤·¤Þ¤¹¡£ ¡Êfrom¡¢to¡¢do¤Ê¤É¤Î¡Ë;ʬ¤Êñ¸ì¤ò ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î¤³¤Î°ú¿ô°ÌÃ֤˽ñ¤±¤ë¤è¤¦¤Ë¤¹¤ë¤Î¤Ç¤¹¡£

¥Ð¥Ã¥¯¥¯¥©¡¼¥È¤ò»È¤Ã¤ÆÃ±½ã²½¤·¤¿Åù²Á¤ÊÄêµÁ¤ò¤Ä¤®¤Ë¼¨¤·¤Þ¤¹¡£

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  `(let ((,var ,init))
     (while (<= ,var ,final)
       ,@body
       (inc ,var))))

¤³¤ÎÄêµÁ¤Î¡Ê¥Ð¥Ã¥¯¥¯¥©¡¼¥È¤¢¤ê¤È¤Ê¤·¤Î¡Ë¤É¤Á¤é¤Î·Á¼°¤Ç¤â¡¢ ³Æ·«¤êÊÖ¤·¤´¤È¤Ëfinal¤¬É¾²Á¤µ¤ì¤ë¤È¤¤¤¦·ç´Ù¤¬¤¢¤ê¤Þ¤¹¡£ final¤¬Äê¿ô¤Ê¤é¤Ð¡¢¤³¤ì¤ÏÌäÂê¤Ë¤Ê¤ê¤Þ¤»¤ó¡£ ¤¿¤È¤¨¤Ð(long-complex-calculation x)¤Î¤è¤¦¤Ê¡¢ ¤è¤êÊ£»¨¤Ê¥Õ¥©¡¼¥à¤Ç¤¢¤ë¤È¡¢¼Â¹Ô®ÅÙ¤ò¤«¤Ê¤êÃÙ¤¯¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£ final¤ËÉûºîÍѤ¬¤¢¤ë¤È¡¢Ê£¿ô²óɾ²Á¤¹¤ë¤Î¤ÏÀµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£

·«¤êÊÖ¤·É¾²Á¤¹¤ë¤³¤È¤¬¥Þ¥¯¥í¤Î°Õ¿Þ¤·¤Æ¤¤¤ëÌÜŪ¤Î°ìÉô¤Ç¤Ê¤±¤ì¤Ð¡¢ ¤è¤¯À߷פµ¤ì¤¿¥Þ¥¯¥íÄêµÁ¤Ç¤Ï¡¢ °ú¿ô¤ò¤Á¤ç¤¦¤É1²ó¤À¤±É¾²Á¤¹¤ë¤è¤¦¤ÊŸ³«·Á¤òÀ¸À®¤·¤Æ¡¢ ¾å¤Î¤è¤¦¤ÊÌäÂê¤ò²óÈò¤¹¤ë¤è¤¦¤Ë¼êΩ¤Æ¤·¤Þ¤¹¡£

(let ((i 1)
      (max 3))
  (while (<= i max)
    (setq square (* i i))
    (princ (format "%d      %d" i square))
    (inc i)))

¤³¤Î¤è¤¦¤ÊŸ³«·Á¤òºî¤ë¥Þ¥¯¥íÄêµÁ¤Ï¤Ä¤®¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

(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 ((,var ,init)
         (max ,final))
     (while (<= ,var max)
       ,@body
       (inc ,var))))

»Äǰ¤Ê¤³¤È¤Ë¡¢¤³¤Î½¤Àµ¤Ï¡¢ ¼¡Àá¤ËÀâÌÀ¤¹¤ëÊ̤ÎÌäÂê¤ò°ú¤­µ¯¤³¤·¤Þ¤¹¡£