¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤ÊÑ¿ô¤òÀë¸À¤¹¤ë¤È¤¤Ë¡¤¤½¤ÎÄêµÁ¤Ë¤½¤ÎÊÑ¿ô ¼«¿È¤ò»²¾È¤¹¤ë¤È¤¤¤¦¡¤ºÆµ¢ÅªÄêµÁ(recursive definition)¤¬µö¤µ¤ì ¤Æ¤¤¤ë¡¥ML4 ¤Ç¤Ï¡¤¤³¤Î¤è¤¦¤ÊºÆµ¢ÅªÄêµÁ¤Îµ¡Ç½¤òƳÆþ¤¹¤ë¡¥¤¿¤À¤·¡¤ ñ½ã²½¤Î¤¿¤áºÆµ¢ÅªÄêµÁ¤ÎÂоݤò´Ø¿ô¤Ë¸ÂÄꤹ¤ë¡¥
¤Þ¤º¡¤ºÆµ¢ÅªÄêµÁ¤Î¤¿¤á¤Î¹½Ê¸ let rec ¼°¡¦Àë¸À¤ò¡¤°Ê²¼¤Îʸˡ¤ÇƳÆþ¤¹¤ë¡¥
|
¤³¤Î¹½Ê¸¤Î´ðËÜŪ¤Ê¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ï let ¼°¡¦Àë¸À¤È»÷¤Æ¤¤¤Æ¡¤´Ä¶ ¤òÀë¸À¤Ë¤·¤¿¤¬¤Ã¤Æ³ÈÄ¥¤·¤¿¤â¤È¤ÇËÜÂμ°¤òɾ²Á¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥¤¿¤À¤·¡¤´Ä ¶¤ò³ÈÄ¥¤¹¤ëºÝ¤Ë¡¤ºÆµ¢Åª¤ÊÄêµÁ¤ò½èÍý¤¹¤ë¹©Éפ¬É¬Íפˤʤ롥 ºÆµ¢ÅªÄêµÁ ¤Î¾ì¹ç¡¤ÄêµÁ¤µ¤ì¤ë´Ø¿ô¤ÎÊÄÊñÆâ¤Î´Ä¶¤ò¡¤º£¤³¤ì¤«¤éºî¤í¤¦¤È ¤·¤Æ¤¤¤ë«Çû´Ø·¸¤Þ¤Ç´Þ¤ó¤Ç¤¤¤ë¤â¤Î¤Ë¤·¤¿¤¤¡¥¤³¤ì¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¡¤¤¤ ¤ï¤æ¤ë¥Ñ¥Ã¥¯¥Ñ¥Ã¥Á(backpatching)¤È¸Æ¤Ð¤ì¤ë¼êË¡¤òÍѤ¤¤ë¡¥¥Ð¥Ã¥¯ ¥Ñ¥Ã¥Á¤Ï¡¤ºÇ½é¡¤¥À¥ß¡¼¤Î´Ä¶¤òÍѰդ·¤Æ¡¤¤È¤â¤«¤¯´Ø¿ôÊÄÊñ¤òºîÀ®¤·¡¤´Ä¶ ¤ò³ÈÄ¥¤·¤Æ¤·¤Þ¤¦¡¥¤½¤Î¤Î¤Á¥À¥ß¡¼¤Î´Ä¶¤ò¡¤¤¿¤Ã¤¿º£³ÈÄ¥¤·¤¿´Ä¶¤Ë ¹¹¿·¤¹¤ë¡¤¤È¤¤¤¦¼êË¡¤Ç¤¢¤ë¡¥Objective Caml ¤Ç¼ÂÁõ¤¹¤ëºÝ¤Ë¤Ï¡¤´Ø¿ôÊÄ Êñ¤Î´Ä¶¤ò¹¹¿·¤Ç¤¤ë¤è¤¦¤Ë¡¤(Î㤨¤Ð)»²¾È¤òÍѤ¤¤ë¡¥
syntax.ml:
type exp = ... | LetRecExp of id * id * exp * exp type program = ... | RecDecl of id * id * exp
eval.ml:
type exval = ... | ProcV of id * exp * dnval Environment.t ref let rec eval_exp env = function ... | LetRecExp (id, para, exp1, exp2) -> let dummyenv = ref Environment.empty in let newenv = Environment.extend id (ProcV (para, exp1, dummyenv)) env in dummyenv := newenv; eval_exp newenv exp2
Figure 10: ºÆµ¢Åª´Ø¿ôÄêµÁ
¿Þ10¤¬¡¤¼ç¤Ê¥×¥í¥°¥é¥à¤ÎÊѹ¹ÅÀ¤Ç¤¢¤ë¡¥ eval_exp ¤Î LetRecExp ¤ò½èÍý¤¹¤ëÉôʬ¤Ï¡¤¾å¤Ç½Ò¤Ù¤¿¥Ð¥Ã¥¯¥Ñ¥Ã¥Á¤ò ¤Þ¤µ¤Ë¼Â¸½¤·¤Æ¤¤¤ë¡¥