Previous Up Next

3.6  ML4 — ºÆµ¢Åª´Ø¿ôÄêµÁ¤ÎƳÆþ

¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤ÊÑ¿ô¤òÀë¸À¤¹¤ë¤È¤­¤Ë¡¤¤½¤ÎÄêµÁ¤Ë¤½¤ÎÊÑ¿ô ¼«¿È¤ò»²¾È¤¹¤ë¤È¤¤¤¦¡¤ºÆµ¢ÅªÄêµÁ(recursive definition)¤¬µö¤µ¤ì ¤Æ¤¤¤ë¡¥ML4 ¤Ç¤Ï¡¤¤³¤Î¤è¤¦¤ÊºÆµ¢ÅªÄêµÁ¤Îµ¡Ç½¤òƳÆþ¤¹¤ë¡¥¤¿¤À¤·¡¤ ñ½ã²½¤Î¤¿¤áºÆµ¢ÅªÄêµÁ¤ÎÂоݤò´Ø¿ô¤Ë¸ÂÄꤹ¤ë¡¥

¤Þ¤º¡¤ºÆµ¢ÅªÄêµÁ¤Î¤¿¤á¤Î¹½Ê¸ let rec ¼°¡¦Àë¸À¤ò¡¤°Ê²¼¤Îʸˡ¤ÇƳÆþ¤¹¤ë¡¥

 <¥×¥í¥°¥é¥à>::=… | let rec  <¼±ÊÌ»Ò1= fun <¼±ÊÌ»Ò2> → <¼°> ;;
  <¼°>::=… 
 |let rec  <ÊÑ¿ô1= fun <ÊÑ¿ô2> → <¼°1>  in <¼°2>

¤³¤Î¹½Ê¸¤Î´ðËÜŪ¤Ê¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ï 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 ¤ò½èÍý¤¹¤ëÉôʬ¤Ï¡¤¾å¤Ç½Ò¤Ù¤¿¥Ð¥Ã¥¯¥Ñ¥Ã¥Á¤ò ¤Þ¤µ¤Ë¼Â¸½¤·¤Æ¤¤¤ë¡¥

Exercise 14  [ɬ½¤²ÝÂê] ¿Þ¤Ë¼¨¤·¤¿ syntax.ml ¤Ë¤·¤¿¤¬¤Ã¤Æ¡¤parser.mly ¤È lexer.mll ¤ò ´°À®¤µ¤»¡¤ML4 ¥¤¥ó¥¿¥×¥ê¥¿¤òºîÀ®¤·¡¤¥Æ¥¹¥È¤»¤è¡¥(let recÀë¸À ¤â¼ÂÁõ¤¹¤ë¤³¤È¡¥)
Exercise 15  [Æñ°×ÅÙ 2] and¤ò»È¤Ã¤ÆÊÑ¿ô¤òƱ»þ¤Ë¤Õ¤¿¤Ä°Ê¾åÀë¸À¤Ç¤­¤ë¤è¤¦¤Ë let rec ¼°¡¦Àë¸À¤ò³ÈÄ¥¤·¡¤Áê¸ßºÆµ¢Åª´Ø¿ô¤ò¥Æ¥¹¥È¤»¤è¡¥

Previous Up Next