Next: Surprising Local Vars, Previous: Problems with Macros, Up: Problems with Macros [Contents][Index]
¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤È¤¤Ë¤Ï¡¢Å¸³«·Á¤ò¼Â¹Ô¤¹¤ë¤È¤¤Ë¡¢ °ú¿ô¤¬²¿²óɾ²Á¤«¤µ¤ì¤ë¤«¤ËÃí°Õ¤òʧ¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ¤Ä¤®¤Î¡Ê·«¤êÊÖ¤·¤ò¹Ô¤¦¡Ë¥Þ¥¯¥í¤Ç¡¢¤³¤ÎÌäÂê¤ò¼¨¤·¤Þ¤·¤ç¤¦¡£ ¤³¤Î¥Þ¥¯¥í¤Ç¡¢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))))
»Äǰ¤Ê¤³¤È¤Ë¡¢¤³¤Î½¤Àµ¤Ï¡¢ ¼¡Àá¤ËÀâÌÀ¤¹¤ëÊ̤ÎÌäÂê¤ò°ú¤µ¯¤³¤·¤Þ¤¹¡£