Previous Up Next
Chapter 2 ´ðËܥǡ¼¥¿·¿¡¤ÊÑ¿ô¤ÎÀë¸À¡¤´Êñ¤Ê´Ø¿ô

¤³¤Î¾Ï¤Î¥­¡¼¥ï¡¼¥É: ¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¡¤·¿¡¤·¿¥·¥¹¥Æ¥à¡¤·¿°ÂÁ´À­¡¤ Í­¸úÈÏ°Ï, ´Ä¶­¡¤´Ø¿ô

2.1 ¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤ò»È¤¦

Objective Caml½èÍý·Ï¤Ë¤Ï2¼ïÎà¤Î¥³¥ó¥Ñ¥¤¥é¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥¤Ò¤È¤Ä¤Ï gcc ¤ä javac ¤Ê¤É¤Î¤è¤¦¤Ë¡¤¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤«¤é¼Â¹Ô¤Î¤¿¤á¤Î¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¥Ð¥Ã ¥Á¥³¥ó¥Ñ¥¤¥é ocamlc¡¤¤â¤¦¤Ò¤È¤Ä¤Ï¡¤¥æ¡¼¥¶¤«¤é¤ÎÆþÎϤò¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ë ½èÍý¤¹¤ë ocaml ¤Ç¤¢¤ë¡¥¤³¤Î¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê½èÍý·Ï¤Ï¡¤(¥æ¡¼¥¶¤«¤é¤Î)¥× ¥í¥°¥é¥à¤ÎÆþÎÏ → ¥³¥ó¥Ñ¥¤¥ë → ¼Â¹Ô¡¦·ë²Ì¤Îɽ¼¨¡¤¤ò ·«¤êÊÖ¤¹¤â¤Î¤Ç1 ¡¤Ä¾Á°¤Ç¼Â¹Ô¤µ¤ì¤¿¥×¥í¥°¥é¥à¤Î·ë²Ì¤¬¼¡¤ÎÆþÎÏ»þ¤ËÈ¿±Ç¤µ¤ì¤ë ¤¿¤á¡¤³«È¯Ãæ¤Î¥Æ¥¹¥È¤Ê¤É¡¤»î¹Ôºø¸í¤òȼ¤¦²áÄø¤ÇÆäËÊØÍø¤Ê¤â¤Î¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤ ¸å½Ò¤¹¤ë¤è¤¦¤Ë¡¤ÆþÎϤϥ­¡¼¥Ü¡¼¥É¤«¤é¤À¤±¤Ç¤Ê¤¯¡¤¥Õ¥¡¥¤¥ë¤«¤é¤ÎÆɤ߹þ¤ß¤â¤Ç¤­ ¤ë¤Î¤Ç¡¤Ëè²ó¥×¥í¥°¥é¥à¤òºÇ½é¤«¤éÂǤ¿¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤Ê¤É¤ÎÉÔÊؤâ¤Ê¤¤¡¥

;Ã̤Ǥ¢¤ë¤¬¡¤´Ø¿ô·¿¸À¸ì½èÍý·Ï¤Ë¤Ï¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê½èÍý·Ï¤¬ÍÑ°Õ¤µ¤ì¤Æ ¤¤¤ë¤â¤Î¤¬Â¿¤¤¤è¤¦¤À¡¥

¤³¤Î±é½¬¤Ç¤Ï¡¤¤Þ¤º ocaml ¤ÎÊý¤òÍѤ¤¤Æ¿Ê¤á¤Æ¤¤¤¯¡¥

2.1.1 ´Êñ¤Ê»È¤¤Êý

µ¯Æ°ÊýË¡¤ÏEmacs ¤Ç M-x tuareg-run-caml (M-x ¤Ï¥¨¥¹¥±¡¼¥×¥­¡¼¤Ë³¤¤¤Æ x ¤ò¥¿¥¤¥×¤¹¤ë) ¤È¤¹¤ë(¸å½Ò¤¹¤ë Tuareg mode ¤Î¥Ð¥Ã¥Õ¥¡¤«¤é¤Ï C-c C-s ¤Çµ¯Æ°¤Ç¤­¤ë)¡¥ ¥ß¥Ë¥Ð¥Ã¥Õ¥¡(²èÌ̤κDz¼ÃÊ)¤Ë Caml toplevel to run: ¤È¤¤¤¦¥×¥í¥ó¥×¥È¤È ¤È¤â¤Ë¡¤µ¯Æ°¤¹¤ë¥³¥Þ¥ó¥É¤òʹ¤«¤ì¤ë¤¬(´û¤Ë ocaml ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ò³Î ǧ¤·)¡¤¤½¤Î¤Þ¤Þ Enter ¥­¡¼¤ò¥¿¥¤¥×¤¹¤ë¡¥¤¹¤ë¤È¡¤°Ê²¼¤Î¤è¤¦¤ÊÆâÍƤο·¤· ¤¤¥Ð¥Ã¥Õ¥¡¤¬¸½¤ï¤ì¤ë¡¥
        Objective Caml version 3.08.1

# 
# ¤Ï¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤ÎÆþÎÏ¥×¥í¥ó¥×¥È¤Ç¤¢¤ë¡¥

¤µ¤Æ¡¤¥×¥í¥ó¥×¥È¤Ë³¤¤¤Æ¡¤´Êñ¤Ê¼°¤òÆþÎϤ·¤Æ¤ß¤è¤¦¡¥
# 1 + 1;;
- : int = 2
¤³¤Î¥Æ¥­¥¹¥È¤Ç¤Ï¡¤¥æ¡¼¥¶¤ÎÆþÎϤò¹ÔƬ¤Ë#¤ò¤Ä¤±¡¤¥¿¥¤¥×¥é¥¤¥¿¡¼ÂÎ (abc)¤Ç¡¤¥³¥ó¥Ñ¥¤¥é¤«¤é¤Î½ÐÎϤò¥¿¥¤¥×¥é¥¤¥¿¡¼¼ÐÂÎ (abc)¤Ç¼¨¤¹¡¥ºÇ¸å¤Î ;; ¤ÏÆþÎϽªÎ»¤Î¤·¤ë¤·¤Ç¡¤¥×¥í¥ó¥× ¥È¤«¤é¤³¤³¤Þ¤Ç¤ÎÉôʬ¤¬¥³¥ó¥Ñ¥¤¥ë¡¦¼Â¹Ô¤µ¤ì¤ë¡¥(ÅÓÃæ¤Ë²þ¹Ô¤¬¤¢¤Ã¤Æ¤â¤è¤¤¡¥) ¥³¥ó¥Ñ¥¤¥é¤Î½ÐÎϤϡ¤É¾²Á·ë²Ì¤Ë¤Ä¤±¤é¤ì¤¿Ì¾Á°(¤³¤³¤Ç¤Ï¼°¤À¤±¤òÆþÎϤ·¤¿¤Î¤Ç¡¤ ̾Á°¤ò¤Ä¤±¤Æ¤¤¤Ê¤¤¤È¤¤¤¦°ÕÌ£¤Ç¤¢¤ë -)¡¤¼°¤ª¤è¤Óɾ²Á·ë²Ì¤Î·¿ (int)¡¤É¾²Á·ë²Ì(2)¤«¤é¤Ê¤Ã¤Æ¤¤¤ë¡¥

Ê£»¨¤Ê¼°¤Ï¡¤()¤Ç°Ï¤à¤³¤È¤Ç¡¤Éôʬ¼°¤Î¹½Â¤¤ò¼¨¤¹¤³¤È¤¬¤Ç¤­¤ë¡¥¤Þ¤¿¡¤Â¿¤¯¤Î ±é»»¤Ë¤Ï¾ï¼±Åª¤Ê·ë¹ç¤Î¶¯¤µ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¡¤()¤ò¾Êά¤Ç¤­¤ë¡¥
# 1 + 2 * 3;;
- : int = 7
# (1 + 2) * 3;;
- : int = 9
¤Þ¤¿¡¤ÆþÎÏÃæ ;; ¤òÆþÎϤ¹¤ëÁ°¤Ë Control-C ¤ò2²ó³¤±¤ÆÆþÎϤ¹¤ë¤³¤È¤Ç ¥³¥ó¥Ñ¥¤¥ë¤»¤º¡¤¥×¥í¥ó¥×¥È¤ËÌá¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

¤³¤Î¥Ð¥Ã¥Õ¥¡¤Ç¤Ï¼°¤ÎÆþÎϤò½õ¤±¤ë¥³¥Þ¥ó¥É¤¬¤¤¤¯¤Ä¤«ÍÑ°Õ¤µ¤ì¤Æ¤ª¤ê¡¤ Î㤨¤Ð M-p, M-n ¤Ç°ÊÁ°¤ËÆþÎϤ·¤¿¼°¤ò¸Æ¤Ó½Ð¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ (ɽ2.1¤Ë¥­¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò¤Þ¤È¤á¤Æ¤¢¤ë¡¥)


Table 2.1: ¥³¥ó¥Ñ¥¤¥é¥Ð¥Ã¥Õ¥¡(Tuareg Interactive mode)Æ⥭¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°

C-c C-c ÆþÎÏÅÓÃæ¤ÇÃæÃǤ·¥×¥í¥ó¥×¥È¤ËÌá¤ë
C-c TAB Caml¤Ë³ä¤ê¹þ¤ß¤òÆþ¤ì¤ë
C-c C-k Caml¤ò½ªÎ»
M-p ²áµî¤ËÆþÎϤ·¤¿¼°¤ÎÍúÎò¤òÁ̤ë
M-n ²áµî¤ËÆþÎϤ·¤¿¼°¤ÎÍúÎò¤ò¿·¤·¤¤Êý¤Øé¤ë

¤µ¤Æ¡¤¤¤¤¯¤Ä¤«¸í¤Ã¤¿ÆþÎÏÎã¤Ë¤Ä¤¤¤Æ¤â¤ß¤Æ¤¤¤³¤¦¡¥
# 2 + 3 - ;;
 2 + 3 - ;;
 ^^
Syntax error
# 5 + "abc";;
 5 + "abc";;
 ^^^^^
This expression has type string but is here used with type int
# 4 / 0;;
Exception: Division_by_zero.
(üËö¾å¤Ç¤Ï²¼Àþ¤Ç¼¨¤µ¤ì¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥) 1ÈÖÌܤÎÆþÎϤϡ¤¤¤¤ï¤æ¤ëʸˡ¥¨¥é¡¼¤Ç¤¢¤ë¡¥¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¤«¤Ê¤ê¤¢¤Ã¤µ¤ê¤· ¤Æ¤¤¤Æ¡¤C ¤ä Java ¥³¥ó¥Ñ¥¤¥é¤ËÈæ¤Ù¤Æ¤ä¤ä(¤«¤Ê¤ê?)ÉÔ¿ÆÀڤǤ¢¤ë¡¥2ÈÖÌܤϡ¤ÆþÎϤµ¤ì¤¿¼°¤Î¹½À®¼«ÂΤÏʸˡ¤Ë±è¤Ã¤Æ¤¤¤ë¤â¤Î¤Î¡¤·¿¥Á¥§¥Ã¥¯(typechecking) ¤òÄ̤é¤Ê¤«¤Ã¤¿¤³¤È¤ò¼¨¤¹¡¥Objective Caml ¤Ç¤Ï¡¤+ ¤ÎξÊդϡ¤À°¿ô¤Ëɾ²Á¤µ¤ì¤ë¼°¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¥¤·¤«¤·¡¤ ¤³¤³¤Ç¤Ï "abc" ¤È¤¤¤¦Ê¸»úÎó¤ò²Ã¤¨¤è¤¦¤È¤·¤Æ¤¤¤ë¤¿¤á¥¨¥é¡¼¤È¤Ê¤Ã¤Æ¤¤¤ë¡¥¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¡¤ ¡Ö²¼ÀþÉô(¥¨¥é¡¼¤ÎȯÀ¸¤·¤¿¸Ä½ê)¤Ïʸ»úÎó·¿(string)¤Î¼°¤Ç¤¢¤ë¤Î¤Ë¡¤ À°¿ô·¿(int)¤¬É¬ÍפʸĽê(¤Ä¤Þ¤ê +¤Î±¦Â¦)¤Ç»È¤ï¤ì¤Æ¤¤¤ë¡×¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥ ·¿(type)¤ä·¿¥Á¥§¥Ã¥¯¤Ï Objective Caml ¤Ç¤ÏÈó¾ï¤Ë½ÅÍפʳµÇ°¤Ç¡¤±é½¬¤òÄ̤·¤Æ¾Ü ¤·¤¯³Ø¤ó¤Ç¤¤¤¯¤³¤È¤Ë¤Ê¤ë¡¥ºÇ¸å¤ÎÎã¤Ç¤Ï¡¤¼°¤Ï·¿¥Á¥§¥Ã¥¯¤âÄ̤äƤ¤¤ë¤¬¡¤¥³¥ó ¥Ñ¥¤¥ë¸å¤Î¼Â¹ÔÃæ¤ËÎã³°(exception)---¤³¤³¤Ç¤Ï0¤Ç¤Î½ü»»---¤¬È¯À¸¤· ¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥Îã³°¤Ë¤Ä¤¤¤Æ¤â¾Ü¤·¤¯³Ø¤Ö¤¬¡¤¤³¤³¤Ç¤Ï¤È¤ê¤¢¤¨¤º¼Â¹Ô»þ¤Î ¥¨¥é¡¼¤ÎȯÀ¸¤À¤È»×¤Ã¤Æ¤¤¤ì¤Ð¤è¤¤¡¥

½ªÎ»¤Ï¥×¥í¥ó¥×¥È¤Î½Ð¤Æ¤¤¤ë¾õÂÖ¤Ç C-c C-d ¤ò¡¤¤â¤·¤¯¤Ï #quit;; ¤ÈÆþÎϤ¹ ¤ë¤³¤È¤Ç¹Ô¤¦¡¥
        Objective Caml version 3.08.3

# #quit;;
Process inferior-caml finished
2.1.2 ¤½¤Î¾: ¥Õ¥¡¥¤¥ë¤«¤é¤Î¥×¥í¥°¥é¥à¤ÎÆɤ߹þ¤ß¡¦¥³¥á¥ó¥È

ocaml Æâ¤Ç¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Î ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤È¸Æ¤Ð¤ì¤ë¤¤¤¯¤Ä¤«¤ÎÌ¿Î᤬ÍøÍѤǤ­¤ë¡¥¤¿¤È¤¨¤Ð¡¤¾å¤Ç¤Ç¤Æ¤­¤¿ #quit ¤â¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Î°ì¼ï¤Ç¤¢¤ë¡¥¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ï¿¿ô¤¢¤ë¤¬ ¤³¤³¤Ç¤Ï¥Õ¥¡¥¤¥ë¤«¤é¤Î¥×¥í¥°¥é¥àÆɤ߹þ¤ß¤Ë´Ø¤¹¤ë¤Õ¤¿¤Ä #use, #cd ¤ò¾Ò²ð¤¹¤ë¡¥¾Ü¤·¤¯¤Ï¥Þ¥Ë¥å¥¢¥ë[3]¤ò»²¾È¤Î¤³¤È¡¥

#use
¤Ï¥Õ¥¡¥¤¥ë̾¤ò°ú¿ô¤Ë¤È¤Ã¤Æ¡¤¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòÆþÎϤȤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò ¹Ô¤¦¡¥
two.ml ¤ÎÆâÍÆ
1 + 1;;
#use ¤ò»È¤¦
        Objective Caml version 3.08.3

# #use "two.ml";;
- : int = 2
¤Á¤Ê¤ß¤Ë¡¤¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ï¸À¸ì¤Î¼°¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¤ ¼°¤Î°ìÉô¤ËËä¤á¹þ¤ó¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
# 1 + #use "two.ml";;
 1 + #use "two.ml";;
 ^
Syntax error
#cd ¤Ï¡¤#use ¤ÈƱÍͤËʸ»úÎó¤ò°ú¿ô¤Ë¤È¤Ã¤Æ¡¤¥·¥§¥ë¤Î cd ¥³¥Þ¥ó¥É¤È ƱÍͤ˥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤ò°ú¿ô¤Î¤â¤Î¤ØÊѹ¹¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥

±é½¬¤Î¥ì¥Ý¡¼¥È¤Ï¡¤¥×¥í¥°¥é¥à¥Õ¥¡¥¤¥ë¤òÄó½Ð¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¤ ¼ç¤ËÊÌ¥Õ¥¡¥¤¥ë¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¡¤#use ¤Ç¥³¥ó¥Ñ¥¤¥é¤ËÆɤ߹þ¤ó¤Ç ¥Æ¥¹¥È¤ò¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥¤³¤Î»þ¡¤¥Õ¥¡¥¤¥ë̾¤Î³ÈÄ¥»Ò¤È¤·¤Æ .ml ¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤È¡¤Tuareg mode ¤È¤¤¤¦ Objective Caml¥×¥í¥°¥é¥à¤Î ÆþÎϤò»Ù±ç¤¹¤ë¥â¡¼¥É¤Ë¤Ê¤ê¡¤¥½¡¼¥¹¤Î¥¤¥ó¥Ç¥ó¥È¤Ê¤É¤¬ ¤Ç¤­¤ë¡¥¥³¥Þ¥ó¥É¤Ïɽ2.2¤Ë¤Þ¤È¤á¤Æ¤¢¤ë¡¥


Table 2.2: Tuareg mode ¥­¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°

TAB ¸½ºß¤Î¹Ô¤Î¥¤¥ó¥Ç¥ó¥È
C-c C-p Á°¤Î¥Õ¥ì¡¼¥º(°ÕÌ£¤Î¤¢¤ë¤Þ¤È¤Þ¤ê)¤Ø°ÜÆ°
C-c C-n ¼¡¤Î¥Õ¥ì¡¼¥º¤Ø°ÜÆ°
ESC C-h ¥Õ¥ì¡¼¥º¤Ë¥Þ¡¼¥¯
ESC q ¥Õ¥ì¡¼¥º¤ò¥¤¥ó¥Ç¥ó¥È
C-c . t try ¼°¤ÎÁÞÆþ
C-c . m match ¼°¤ÎÁÞÆþ
C-c . l let ¼°¤ÎÁÞÆþ
C-c . i if ¼°¤ÎÁÞÆþ
C-c . w while ¼°¤ÎÁÞÆþ
C-c . f for ¼°¤ÎÁÞÆþ
C-c . b begin ¼°¤ÎÁÞÆþ
C-c C-s ocaml ¤òµ¯Æ°¡¥µ¯Æ°Ãæ¤Ë¤Ï°Ê²¼¤Î¥³¥Þ¥ó¥É¤¬»ÈÍѲÄǽ
C-c C-k ocaml ¤ò½ªÎ»
C-c C-b ¥Ð¥Ã¥Õ¥¡¤òɾ²Á(ocaml ¥×¥í¥»¥¹¤ØÁ÷¿®)
C-c C-r ÁªÂòÉôʬ¤Îɾ²Á
C-c C-e ¥Õ¥ì¡¼¥º¤Îɾ²Á

¥³¥á¥ó¥È¡¤ÆüËܸì¤Î°·¤¤
¥Õ¥¡¥¤¥ë¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¤È¤­¤Ï¡¤¥³¥á¥ó¥È¤ò½ñ¤¯¤è¤¦¤Ë¤·¤¿¤¤¡¥ ¥×¥í¥°¥é¥àÃæ¤Î¥³¥á¥ó¥È¤Ï (* ¤È *) ¤Ç°Ï¤Þ¤ì¤¿Éôʬ¤Ç¤¢¤ë¡¥ ¤Þ¤¿¡¤¥³¥á¥ó¥È¤ÏÆþ¤ì»Ò¤Ë¤Ê¤Ã¤Æ¤â¤è¤¤¤·¡¤ÅÓÃæ¤Ë²þ¹Ô¤ò¤Ï¤µ¤ó¤Ç¤â¤è¤¤¡¥

EUC ¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¸Â¤ê¡¤¥³¥á¥ó¥È¡¤Ê¸»úÎóÄê¿ô¤ËÆüËܸì¤òÍѤ¤¤ë¤³ ¤È¤¬¤Ç¤­¤ë(¤è¤¦¤Ç¤¢¤ë)¡¥¤·¤«¤·¡¤Ê¸»úÎóÄê¿ô¤Ë´Ø¤·¤Æ¤Ï¡¤¤½¤ÎŤµ¤Ê¤É¤¬ (¥Ð¥¤¥È¿ô¤ò¿ô¤¨¤Æ¤·¤Þ¤¤)Àµ¤·¤¯Ç§¼±¤µ¤ì¤Ê¤¤¤Î¤Ç¡¤¤Ç¤­¤ì¤Ð»È¤ï¤Ê¤¤Êý¤¬Ìµ Æñ¤Ç¤¢¤í¤¦¡¥

2.2 ´ðËܥǡ¼¥¿·¿¤È¤½¤Î±é»»

Objective Caml ¥×¥í¥°¥é¥à¤Ï¼°(expression)¤«¤é¡¤ ¤½¤ì¤¬¼¨¤¹ÃÍ(value)(Î㤨¤Ð¡¤¼° 1 + 2 ¤ÎÃÍ¤Ï 3 ¤Ç¤¢¤ë)¤ò ·×»»¤¹¤ë¤³¤È¤Ç¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤¬¿Ê¤ó¤Ç¹Ô¤¯¡¥¼°¤«¤éÃͤò ·×»»¤¹¤ë²áÄø¤òɾ²Á(evaluation)¤È¤¤¤¦¡¥ ºÇ¤â´Êñ¤Ê¼°¤Ï¡¤À°¿ô¤äʸ»úÎó¤Ê¤É¤Î¡¤´ðËÜŪ¤Ê¥Ç¡¼¥¿Äê¿ô¤Ç¤¢¤ë¡¥¤³¤ì¤é¤Ï ¤½¤ì¼«¿È¤¬ÃͤǤ¢¤ë¡¥ Ê£»¨¤Ê¼°¤Ï´Êñ¤Ê¼°¤òÁȤ߹ç¤ï¤»¤ë¤³¤È¤Ç¹½À®¤¹¤ë¡¥Î㤨¤Ð¡¤1 + 2 ¤È¤¤¤¦ ¼°¤ÏÆó¤Ä¤ÎÉôʬ¼°(subexpression) 1 ¤È 2 ¤È + ¤È¤¤¤¦ Æó¹à±é»»»Ò¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤ë¡¥

ËܳÊŪ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¤ËÆþ¤ëÁ°¤Ë¡¤Objective Caml ¤Ç»ÈÍѤµ¤ì¤ë´ðËÜŪ¤Ê¥Ç¡¼¥¿(À°¿ô¡¤¼Â ¿ô¡¤Ê¸»úÎó¤Ê¤É)¤È¤½¤ì¤ËÂФ¹¤ë±é»»(²Ã¸º¾è½ü¡¤Ê¸»úÎó¤Î·ë¹ç¤Ê¤É)¤ò¡¤¥Ç¡¼¥¿¤Î·¿ ¤´¤È¤ËÀâÌÀ¤·¡¤Ê£»¨¤Ê¼°¤ò¹½À®¤¹¤ëÊýË¡¤ò¤ß¤Æ¤¤¤¯¡¥
¥á¥¿ÊÑ¿ô¤Ë¤Ä¤¤¤Æ ¥Æ¥­¥¹¥È Ã桤Objective Caml ¼°¤òɽµ­¤¹¤ëºÝ¤Ë¡¤ i + j¤Î¤è¤¦¤Ë¡¤¼ÐÂαѾ®Ê¸»ú¤È¥¿¥¤¥×¥é¥¤¥¿ÂΤò º®¤¼¤Æɽµ­¤¹¤ë¤³¤È¤¬¤¢¤ë¡¥+ µ­¹æ¤¬ Objective Caml ¤Î¼°¤Î°ìÉô¤Îʸ»ú¤Ç¤¢¤ë ¤³¤È¤ËÂФ·¤Æ¡¤i, j ¤Ï(¤³¤Î¥Æ¥­¥¹¥È Ãæ¤Ç¤Ï) Ǥ°Õ¤ÎÀ°¿ô¼°¤òɽ¤¹¤¿¤á¤Î¥Æ¥­¥¹¥È¾å¤Ç¤Îɽµ­¤Ç¤¢¤ë¡¥¤¹¤ë¤È¡¤Î㤨¤Ð Objective Caml ¼° 1 + 2 ¤Ï i ¤ò 1, j ¤ò 2¤È¹Í¤¨¤¿¾ì¹ç¤ÎÎã¤È¹Í¤¨ ¤ë¤³¤È¤Ë¤Ê¤ë¡¥¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤ÎÀ¤³¦¤Î³°¤Ç¤Îɽµ­¤Î¤¿¤á¤ÎÊÑ¿ô¤ò ¥á¥¿ÊÑ¿ô(metavariable)¤È¸Æ¤Ö¡¥¥×¥í¥°¥é¥à¤ËÍѤ¤¤é¤ì¤ëÊÑ¿ô (¥×¥í¥°¥é¥àÊÑ¿ô)¤Èº®Æ±¤·¤Ê¤¤¤è¤¦¤Ëµ¤¤ò¤Ä¤±¤¿¤¤¡¥Æäˡ¤¥×¥í¥°¥é¥àÊÑ¿ô ¤Î¤¿¤á¤Î¥á¥¿ÊÑ¿ô¤òÍѤ¤¤ë¾ì¹ç¤Ë¤ÏÃí°Õ¤¬É¬ÍפǤ¢¤ë¡¥Î㤨¤Ð¡¤¥Æ¥­¥¹¥ÈÃæ ¤Ç x, y ¤Ê¤É¤ò¥×¥í¥°¥é¥àÊÑ¿ô¤Î¤¿¤á¤Î¥á¥¿ÊÑ¿ô¤È¤·¤Æ»ÈÍѤ¹¤ë¤¬¡¤ x + 1¤È½ñ¤¤¤¿¤È¤­¤Ë¤Ï¡¤a + 1, pi + 1, hoge + 1, x + 1 ¤Ê ¤É¡¤a, pi, hoge, x ¤È¤¤¤¦¶ñÂÎŪ¤ÊÊÑ¿ô¤ò»È¤Ã¤¿Ç¤°Õ¤Î¼°¤òɽ¤ï¤· ¤Æ¤¤¤ë¡¥
2.2.1 unit·¿

unit¤Ï¡¤() (unit value ¤È¸Æ¤Ö) ¤È¤¤¤¦Ãͤò¤¿¤À¤Ò¤È¤Ä¤Î Í×ÁǤȤ·¤Æ´Þ¤à¤è¤¦¤Ê·¿¤Ç¤¢¤ë¡¥
# ();;
- : unit = ()
¤³¤ÎÃͤËÂФ·¤Æ¹Ô¤¨¤ë±é»»¤Ï¤Ê¤¯¡¤Ìò¤ËΩ¤¿¤Ê¤¤¤â¤Î¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥ ŵ·¿Åª¤Ê»ÈÍÑË¡¤Ë¤Ï¤Õ¤¿¤Ä¤¢¤ë¡¥¤Ò¤È¤Ä¤Ï¡¤ÊÖ¤êÃͤ˰ÕÌ£¤¬¤Ê¤¤¤è¤¦¤Ê¡¤Î㤨¤Ð ¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤ß¤ò¹Ô¤Ê¤¦¤À¤±¤Î¼°¤Ï¡¤unit·¿¤ò»ý¤Ä¡¥ ¤½¤Î°ÕÌ£¤Ç¡¤C ¤Ê¤É¤Ë¤ª¤±¤ë void ·¿¤È»÷¤Æ¤¤¤ë2¡¥ ¤Þ¤¿¡¤¤â¤¦¤Ò¤È¤Ä¤Ï¡¤(°ÕÌ£¤Î¤¢¤ë)°ú¿ô¤ÎÍפé¤Ê¤¤¼ê³¤­¤Ï unit·¿¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤È¤·¤Æɽ¤µ¤ì¤ë¡¥

2.2.2 int·¿

¤¤¤ï¤æ¤ëÀ°¿ô¡¤…, -2, -1, 0, 1, 2, … ¤Î·¿¤Ç¤¢¤ë¡¥»»½Ñ±é»»¤È¤·¤Æ »Í§±é»» +, -, *, /, ¾ê;¤òµá¤á¤ë mod ¤Ê¤É¤¬¡¤¤Þ¤¿¡¤¥Ó¥Ã¥È±é»»¤È ¤·¤Æ¼¡¤Î¤è¤¦¤Ê¤â¤Î¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥
2.2.3 float·¿

(ÉâÆ°¾®¿ôÅÀɽ¸½¤Î)¼Â¿ô¤Î·¿¤Ç¤¢¤ë¡¥3.1415 ¤Ê¤É¤Î¾®¿ôÅÀɽ¸½¤È 31.415e-1 ¤Ê¤É¤Î10¤ò´ðÄì¤È¤¹¤ë»Ø¿ôɽ¸½ (= 31.415 × 10-1) ¤¬ »ÈÍѤǤ­¤ë¡¥¤Þ¤¿¡¤¾®¿ôÅÀ¤ÎÁ°¤Î0¤Ï¾Êά¤Ç¤­¤Ê¤¤¡¥

Àè½Ò¤Î»Í§±é»»µ­¹æ¤ÏÉâÆ°¾®¿ôÅÀ¤ËÂФ·¤ÆÍѤ¤¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥¤½¤ÎÂå¤ê¤Ë ¾®¿ôÅÀ¤ò¤Ä¤±¤¿ +., -., *., /. ¤ò»È¤¦¡¥¤Þ¤¿¡¤µÕ¤ËÀ°¿ô¤ò ¡Ö¤½¤Î¤Þ¤Þ¡×¼Â¿ô¤È¤ß¤Ê¤·¡¤+. ¤Ê¤É¤ò»È¤¦¤³¤È¤â¤Ç¤­¤Ê¤¤¡¥ À°¿ô/¼Â¿ô´Ö¤ÎÊÑ´¹¤Ë¤Ï int_of_float, float_of_int ¤È¤¤¤¦´Ø¿ô¤¬ ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥(¤Ä¤Þ¤ê¡¤C ¸À¸ì¤Ê¤É¤Î¤è¤¦¤Ë°ÅÌۤη¿ÊÑ´¹¤Ï¸ºß¤·¤Ê¤¤¡¥)
# 2.1 +. 5.9;;
- : float = 8.
# 1 +. 3.4;;
 1 +. 3.4;;
 ^
This expression has type int but is here used with type float
# float_of_int(1) +. 3.4;;
- : float = 4.4
# float_of_int 1 +. 3.4;;
- : float = 4.4
# 1 + (int_of_float 3.4);;
- : int = 4
´Ø¿ô¤Î°ú¿ô¤Î¤Þ¤ï¤ê¤Î () ¤Ï¾Êά²Äǽ¤Ç¤¢¤ë¡¥¾Êά²Äǽ¡¤¤È¤¤¤¦¤è¤ê¡¤¤½¤â ¤½¤â´Ø¿ôŬÍѤÎʸˡ¤È³ç¸Ì¤Ï´Ø·¸¤¬¤Ê¤¯¡¤³ç¸Ì¤Ï¤¢¤¯¤Þ¤Ç (1+2)*3 ¤Ç»È¤¦ ¤è¤¦¤Ë±é»»¤Î·ë¹ç¤Î¶¯¤µ¤ËµÕ¤é¤Ã¤ÆÉôʬ¼°¤ò¤Þ¤È¤á¤ë¤¿¤á¤Î¤â¤Î¤È¹Í¤¨¤¿Êý¤¬ ¤è¤¤¡¥¾å¤Î4ÈÖÌܤÎÎã¤Ç¤ï¤«¤ë¤è¤¦¤Ë¡¤´Ø¿ôŬÍÑ (float_of_int 1) ¤Ï +. ¤Ê¤É¤ÎÆó¹à±é»»»Ò¤è¤ê¤â·ë¹ç¤¬¶¯¤¤¡¥¤½¤Î¤¿¤á¡¤°ú¿ô¤¬ 1+2 ¤Î¤è¤¦¤ÊÊ£»¨ ¤Ê¼°¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï¡¤ f 1 + 2 ¤Ï (f 1)+2 ¤Î»ö¤Ê¤Î¤Ç¡¤°ú¿ô¤Ë³ç¸Ì¤ò¤Ä ¤± f(1+2) ¤È½ñ¤¯É¬Íפ¬¤¢¤ë¡¥

¼Â¿ô±é»»¤Ë´Ø¤·¤Æ¤Ï¡¤»°³Ñ´Ø¿ô sin, cos, tan, Ê¿Êýº¬ sqrt ¤Ê¤É¤âͽ¤áÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥¾Ü¤·¤¯¤Ï¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤Î¤³¤È¡¥

2.2.4 char·¿

ASCII ʸ»ú¤Î·¿¤Ç¡¤Äê¿ô¤È¤·¤Æ°úÍÑÉä ' ¤Ç°Ï¤Þ¤ì¤¿Ê¸»ú¡¤¤â¤·¤¯¤Ïɽ 2.3 ¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹(\" ¤ò½ü¤¯)¡¤ ¤Þ¤¿¡¤int·¿¤È¤ÎÊÑ´¹´Ø¿ô char_of_int, int_of_char ¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥
# '\120';;
- : char = 'x'
# int_of_char 'Z';;
- : int = 90
2.2.5 string·¿

ʸ»úÎó¤Î·¿¤Ç¡¤Äê¿ô¤È¤·¤ÆÆó½Å°úÍÑÉä " ¤Ç°Ï¤Þ¤ì¤¿Ê¸»úÎ󤬻Ȥï¤ì¤ë¡¥ ʸ»úÎóÃæ¤Îʸ»ú¤Ë¤Ï¡¤ \' ¤ò½ü¤¯¡¤É½2.3 ¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹ ¤¬»ÈÍѤǤ­¤ë¡¥ ¤Þ¤¿¡¤C ¤È¤Ï°Û¤Ê¤ê¡¤\000 ¤Ïʸ»úÎó¤Î½ªÃ¼¤òɽ¤µ¤Ê¤¤¡¥

s1 ^ s2 ¤ÇÆó¤Ä¤Îʸ»úÎós1, s2¤ò·ë¹ç¤·¤¿Ê¸»úÎó¤Ëɾ²Á¤µ¤ì¤ë¡¥¤Þ¤¿¡¤ s.[i] ¤Ç s ¤«¤é i ÈÖÌܤÎʸ»ú¤ò ¼è¤ê½Ð¤¹¤³¤È¤¬¤Ç¤­¤ë¡¥
# "Hello," ^ " World!";;
- : string = "Hello, World!"
# ("Hello," ^ " World!").[10];;
- : char = 'l'


Table 2.3: ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹


\\ ¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\)
\' °úÍÑÉä ('), ' Æâ¤Ç¤Î¤ßÍ­¸ú
\" Æó½Å°úÍÑÉä ("), " Æâ¤Ç¤Î¤ßÍ­¸ú
\n ²þ¹Ô
\r (¹ÔƬ¤Ø¤Î)Éüµ¢
\t ¿åÊ¿¥¿¥Ö
\b ¥Ð¥Ã¥¯¥¹¥Ú¡¼¥¹
\ddd ddd ¤ò10¿Ê¤ÎASCII¥³¡¼¥É¤È¤¹¤ëʸ»ú

2.2.6 bool·¿

¿¿µ¶Ãͤò¼¨¤¹·¿¤Ç¡¤ÃÍ¤Ï true (¿¿), false (µ¶)¤ÎÆó¤Ä¤Ç¤¢¤ë¡¥ ±é»»¤È¤·¤Æ¡¤ ¤Þ¤¿°Ê²¼¤ÎÈæ³Ó±é»»»Ò¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥¤É¤Î±é»»»Ò¤â ξÊդη¿¤¬Æ±¤¸¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
# (not (1 < 2)) || (() = ());;
- : bool = true
# 3.2 > 5.1;;
- : bool = false
# 'a' >= 'Z';;
- : bool = true
# 2 < 4.1;;
 2 < 4.1;;
 ^^^
This expression has type float but is here used with type int
¤Þ¤¿¡¤if-¼°: if b then e1 else e2 ¤Ç¾ò·ïʬ´ô¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥b ¤¬ true ¤Ëɾ²Á¤µ¤ì¤¿¤È¤­¤Ï e1 ¤ÎÃÍ¡¤ false ¤Ç¤¢¤ì¤Ð e2 ¤ÎÃͤ¬¼°Á´ÂΤÎÃͤˤʤ롥
# (if 3 + 4 > 6 then "foo" else "bar") ^ "baz";;
- : string = "foobaz"
ʬ´ô¸å¤Ëɾ²Á¤µ¤ì¤ë¼° e1, e2 ¤Î·¿¤Ï°ìÃפ·¤Æ¤¤¤ëɬ Íפ¬¤¢¤ë¡¥¤Þ¤¿¡¤if-¼°¤Î else-Àá¤Ï¾Êά²Äǽ¤Ç¤¢¤ë¤¬¡¤¤½¤Î¾ì¹ç¤Ï else () ¤¬±£¤ì¤Æ¤¤¤ë¤È¸«¤Ê¤µ¤ì¤ë¡¥(¤¹¤Ê¤ï¤Á¡¤¤½¤Î¾ì¹ç then-Àá¤Ë¤Ï unit·¿¤Î¼°¤¬Íè¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥)

2.2.7 ·¿¥·¥¹¥Æ¥à¤È°ÂÁ´À­

Objective Caml ¤Ë¤Ï·¿(type)¤Î³µÇ°¤¬¤¢¤ê¡¤¤³¤ì¤«¤é³Ø¤ó¤Ç¤¤¤¯¤è¤¦¤Ë¸À¸ì¤ÎÂç ¤­¤ÊÆÃħ¤Î¤Ò¤È¤Ä¤ò¤Ê¤·¤Æ¤¤¤ë¡¥·¿¤Ï¡¤ºÇ¤âñ½ã¤Ë¤Ï¡¤¾å¤Ç¤ß¤¿ 1 ¤Ï int·¿¤Ë °¤¹¤ë¤È¤¤¤Ã¤¿¡¤¥×¥í¥°¥é¥àÃæ¤Ç»È¤ï¤ì¤ë¥Ç¡¼¥¿¤ÎʬÎà¤Ç¤¢¤ë¡¥ ¤³¤ÎʬÎà¤Ï¡¤ true ¤Ë²Ã»»¤ò¹Ô¤¦¤Ê¤É¤Î¡¤·¿¥¨¥é¡¼(type error)¤È¸Æ¤Ð¤ì¤ë¡¤¤¢¤ë ¼ï¤Î¡Ö°ÕÌ£¤Î¤Ê¤¤¡×Áàºî¤¬¹Ô¤ï¤ì¤ë¤Î¤òËɤ°¤Î¤ËÍѤ¤¤é¤ì¤ë¡¥·¿¥·¥¹¥Æ¥à(type system)¤È¤¤¤¦ÍѸì¤Ï¡¤¥×¥í¥°¥é¥à¤«¤é·¿¥Á¥§¥Ã¥¯(typecheck)¤Ë ¤è¤ê¡¤·¿¥¨¥é¡¼¤ÎȯÀ¸¤òËɤ®¡¤°ÂÁ´¤Ë¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Î»ÅÁȤߤǡ¤¸À¸ì ¤´¤È¤ËÂ礭¤¯°Û¤Ê¤Ã¤Æ¤¤¤ë¡¥¤½¤â¤½¤â·¿¥¨¥é¡¼¤¬¤Ê¤ó¤Ç¤¢¤ë¤«¡¤¤È¤¤¤¦¤³¤È¤â¸À¸ì ¤Ë¤è¤Ã¤Æ°ã¤Ã¤Æ¤¯¤ë¤â¤Î¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¡¥Î㤨¤Ð¡¤Â¿¤¯¤Î¸À¸ì¤Ç¤Ï0¤Ç¤Î½ü»»¤Ï ·¿¥¨¥é¡¼¤È¤Ï¸«¤Ê¤µ¤ì¤Ê¤¤¤³¤È¤¬Â¿¤¤¡¥

Lisp, Perl, Postscript ¤Ê¤É¤Î¸À¸ì¤Ç¤Ï¡¤Ê¸Ë¡¤Ë¨¤·¤¿¥×¥í¥°¥é¥à¤Ï¤½¤Î¤Þ¤Þ¼Â¹Ô ¤ò»Ï¤á¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥¤½¤Î¤«¤ï¤ê¼Â¹Ô»þ¤Ë¡¤²¿¤«¤ÎÁàºî¤¬¹Ô¤ï¤ì¤ëÅ٤ˡ¤¤½¤ì¤¬ ·¿¥¨¥é¡¼¤òµ¯¤¹¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë¡¥¤³¤Î¤è¤¦¤Ê¸À¸ì¤ò¡¤¤·¤Ð¤·¤Ð ưŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì(dynamically typed language) ¤È¸Æ¤Ö¡¥

¤³¤ì¤ËÂФ·¤Æ¡¤C, C++, Java ¤Ê¤É¤Î¸À¸ì¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤¬¥×¥í¥°¥é¥à¼Â¹ÔÁ°¤Ë·¿ ¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¡¤¤½¤ì¤òÄ̤俤â¤Î¤Î¤ß¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¡¥¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é ¥à¼Â¹ÔÁ°¤Ë·¿¥Á¥§¥Ã¥¯¤ò¹Ô¤¦¤â¤Î¤ò¡¤ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì(statically typed language)¤È¸Æ¤Ö3¡¥Objective Caml ¤âÀŠŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ç¤¢¤ë¡¥

ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ç¤â¡¤C ¤ä C++ ¤Ê¤É¤Ï·¿¥·¥¹¥Æ¥à¤¬¼å¤¯¡¤·¿¥¨¥é¡¼¤ò ´°Á´¤ËËɤ°¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥°ìÈ̤ËÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ë¤ª¤¤¤Æ¡¤·¿¥¨¥é¡¼¤ò µ¯¤¹Áàºî¤Î·ë²Ì¤Ï(¸À¸ì¥ì¥Ù¥ë¤Ç)̤ÄêµÁ 4 ¤Ê¤Î¤Ç¡¤C ¤Ê¤É¤Î¥×¥í¥°¥é¥à¤Ï¥¯¥é¥Ã¥·¥å¤·¤Æ ¤·¤Þ¤¦¡¥¤³¤ì¤ËÂФ·¤Æ Objective Caml ¤Ï°ìÅÙ·¿¥Á¥§¥Ã¥¯¤òÄ̤ä¿¥×¥í¥° ¥é¥à¤Ï·¿¥¨¥é¡¼¤òµ¯¤µ¤Ê¤¤À­¼Á(·¿°ÂÁ´À­)¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¡¥ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì°ÂÁ´ À­¤¬ÊݾڤǤ­¤ë¸À¸ì¤ò¶¯¤¯·¿¤Å¤±¤µ¤ì¤¿(strongly typed)¸À¸ì¤È¤¤¤¦¤³ ¤È¤¬¤¢¤ë¡¥

°Ê¾å¤ò¡¤¤Þ¤È¤á¤ë¤È°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡¥Æ°Åª¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤ÏɬÁ³Åª¤Ë Á´¤Æ¤Î°ÂÁ´À­¤Î¥Á¥§¥Ã¥¯¤ò¹Ô¤¨¤ë¤Î¤Ç unsafe--dynamically typed ¤ÎÍó¤¬ ¶õ¤¤¤Æ¤¤¤ë¡¥
  statically typed dynamically typed
unsafe C, C++, etc. ---
safe Java, ML, Haskell, etc. Lisp, Scheme, Perl, PostScript, etc.

ÀÅŪ·¿¥·¥¹¥Æ¥à¤Ï¡¤¥×¥í¥°¥é¥à¤ÎʸÌ̤À¤±¤«¤é¡¤¤Ä¤Þ¤ê·×»»Á°¤Î Ê£»¨¤Ê¼°¤ËÂФ·¤Æ·¿¤ÎÀ°¹çÀ­¤òȽÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¤¸«ÀѤâ¤ê¤¬¤É¤¦¤·¤Æ¤â ÊݼéŪ¤Ë¤Ê¤é¤¶¤ë¤òÆÀ¤Ê¤¤¡¥Î㤨¤Ð
if ⟨ Ê£»¨¤Ê¼° ⟩ then 1 else "foo"
¤Ï¡¤⟨ Ê£»¨¤Ê¼° ⟩¤¬¾ï¤Ë true¤òÊÖ¤¹¤è¤¦¤Ê¼°¤Ç¤¢¤Ã¤¿¤È¤·¤¿¤é¡¤ else-À᤬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤¬¤Ê¤¤¤Î¤Ç¡¤À°¿ô¤¬É¬ÍפÊʸ̮¤Ç»ÈÍѤ·¤Æ¤â ¼Â¹Ô»þ¤Ë¤Ï²¿¤ÎÌäÂê¤â¤Ê¤¤¡¥¤·¤«¤·¡¤·¿¥·¥¹¥Æ¥à¤Ï¾ò·ï¼°¤ÎÃͤ˴ط¸¤Ê¤¯¡¤Ê¬ ´ôÀè¤Î¼°¤Î·¿¤¬°ìÃפ¹¤ë¤³¤È¤òÍ׵᤹¤ë¡¥¤³¤Î¤¿¤á¡¤·¿¥¨¥é¡¼¤òµ¯¤µ¤º¤Ë¼Â¹Ô¤Ç¤­ ¤ë¤Ï¤º¤Î¥×¥í¥°¥é¥à¤¬·¿¥Á¥§¥Ã¥¯¤òÄ̤é¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ë¡¥ÀÅŪ·¿ÉÕ¸À¸ì¤ÎÀß ·×¼Ô¤Ë¤È¤Ã¤Æ¤Ï°ÂÁ´¤Ê¥×¥í¥°¥é¥à¤À¤±¤ò¼õÍý¤·¤Ä¤Ä¡¤¤Ç¤­¤ë¸Â¤ê¿¤¯¤Î°ÂÁ´¤Ê ¥×¥í¥°¥é¥à¤ò¼õÍý¤Ç¤­¤ë¤è¤¦¤Ê·¿¥·¥¹¥Æ¥à¤òÀ߷פ¹¤ë¤Î¤¬¡¤Æ¬¤ÎǺ¤Þ¤»¤É¤³¤í ¤Ç¤¢¤ë¡¥

°ìÊý¡¤Æ°Åª¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤ÏÁàºî¤¬¹Ô¤ï¤ì¤ëÅ٤ˡ¤¼Â¹Ô¤¬°ÂÁ´¤Ë¹Ô¤¨¤ë¤«¤É¤¦¤« ¥Á¥§¥Ã¥¯¤ò¤¹¤ë¤Î¤Ç¡¤¥Á¥§¥Ã¥¯¤ò¤Þ¤¸¤á¤Ë¤ä¤ë¸Â¤ê°ÂÁ´¤Ë¼Â¹Ô¤Ç¤­¤ë¤â¤Î¤Î¡¤ ¥Á¥§¥Ã¥¯¤Î¥³¥¹¥È¤ò;·×¤Ëʧ¤¦¤³¤È¤Ë¤Ê¤ë¡¥

2.2.8 Îý½¬ÌäÂê
Exercise 1  ¼¡¤Î¼°¤Î·¿¤Èɾ²Á·ë²Ì¤Ï?
  1. float_of_int 3 +. 2.5
  2. int_of_float 0.7
  3. if "11" > "100" then "foo" else "bar"
  4. char_of_int ((int_of_char 'A') + 20)
  5. int_of_string "0xff"
  6. 5.0 ** 2.0

Exercise 2  ¼¡¤Î¼°¤Ï¸í¤Ã¤¿¼°(ʸˡ¥¨¥é¡¼¡¤·¿¥¨¥é¡¼¡¤Îã³°¤òȯÀ¸¤¹¤ë)¤Ç¤¢¤ë¡¥¤Þ¤º¡¤¤É¤³¤¬ ¸í¤ê¤«¤ò»î¤µ¤º¤ËͽÁÛ¤»¤è¡¥ ¼¡¤Ë¡¤¥³¥ó¥Ñ¥¤¥é¤Ç¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò³Îǧ¤·¡¤Åö½éͽÁÛ¤·¤¿Íýͳ¤È ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤È°ã¤¦¾ì¹ç¡¤¥³¥ó¥Ñ¥¤¥é¤Î²ò¼á¤·¤¿¸í¤ê¤ÎÍýͳ¤òÀâÌÀ¤»¤è¡¥
  1. if true&&false then 2
  2. 8*-2
  3. int_of_string "0xfg"
  4. int_of_float -0.7

Exercise 3  ¼¡¤Î¼°¤Ï¡¤³ç¸Ì¤ÎÉÕ¤­Êý¤¬¤ª¤«¤·¤¤¡¤¤â¤·¤¯¤Ï·¿ÊÑ´¹´Ø¿ô¤òÆþ¤ì˺¤ì¤¿¤¿¤á¡¤·¿ ¥¨¥é¡¼¤¬È¯À¸¤¹¤ë¡¤¤â¤·¤¯¤Ï´üÂÔ¤·¤¿·ë²Ì¤Ëɾ²Á¤µ¤ì¤Ê¤¤¡¥³Æ¼°¤ò¤É¤¦Ä¾¤»¤Ð¡¤ ⇒ ¤Î¸å¤Ë¼¨¤¹´üÂÔ¤·¤¿·ë²Ì¤Ëɾ²Á¤µ¤ì¤ë¤«¡¥
  1. not true && falsetrue
  2. float_of_int int_of_float 5.05.0
  3. sin 3.14 /. 2.0 ** 2.0 +. cos 3.14 /. 2.0 ** 2.01.0
  4. sqrt 3 * 3 + 4 * 45 (À°¿ô)

Exercise 4  ¼° b1 && b2 ¤ò¡¤if-¼°¤È true, false, b1, b2 ¤Î¤ß¤òÍѤ¤¤Æ¡¤Æ±¤¸°ÕÌ£¤Ë¤Ê¤ë¤è¤¦¤Ë½ñ¤­Ä¾¤»¡¥ ¼° b1 || b2 ¤âƱÍͤ˽ñ¤­Ä¾¤»¡¥

2.3 ÊÑ¿ô¤Î«Çû

Á°Àá¤Ç³Ø¤ó¤À¤Î¤Ï´Êñ¤ÊÁàºî¤òÁȤ߹ç¤ï¤»¤Æ¡¤Ê£»¨¤Ê·×»»¤ò¹Ô¤¦¼°¤òÁȤßΩ¤Æ¤ëÊý Ë¡¤Ç¤¢¤ë¡¥·×»»¤·¤¿·ë²Ì¤ÎÃͤˤÏ̾Á°¤ò¤Ä¤±¤Æ¤ª¤¤¤Æ¤¢¤È¤Ç»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ ¤³¤ì¤ò¹Ô¤¦¤Î¤¬ let Àë¸À¤Ç¤¢¤ë¡¥

2.3.1 let Àë¸À

¤Þ¤º¤Ï¡¤let Àë¸À¤ÎÎã¤ò¤ß¤Æ¤ß¤ë¡¥
# let pi = 3.1415926535;;
val pi : float = 3.1415926535
¤³¤ì¤Ï pi ¤È¤¤¤¦Ì¾Á°¤ÎÊÑ¿ô¤òÀë¸À¤·¡¤¤½¤ÎÊÑ¿ô¤ò3.1415926535 ¤È¤¤¤¦¼Â¿ô¤Ë «Çû¤·¤Æ¤¤¤ë¡¥¥³¥ó¥Ñ¥¤¥é¤Î½ÐÎϤȤ·¤Æ¡¤ÃͤÎ̾Á°¤¬Àë¸À¤µ¤ì¤¿¤³¤È¤ò¼¨¤¹ val¡¤ÊÑ¿ô̾ pi¡¤¤½¤ÎÊÑ¿ô¤¬Â«Çû¤µ¤ì ¤¿ÃÍ(¤â¤Á¤í¤ó3.1415926535)¡¤¤È¤½¤Î·¿¤¬ÆÀ¤é¤ì¤ë¡¥¤³¤ÎÃͤϡ¤°Ê¹ß¤Ç pi ¤È ¤¤¤¦Ì¾Á°¤Ç»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤­¡¤pi ¤È½ñ¤¯¤³¤È¤È¡¤3.1415926535 ¤È½ñ¤¯¤³¤È ¤ÏƱ¤¸¤³¤È¤ò°ÕÌ£¤¹¤ë¡¥
# pi;;
- : float = 3.1415926535
# let area_circle2 = 2.0 *. 2.0 *. pi;;
val area_circle2 : float = 12.566370614
°ìÈÌŪ¤Ë¤Ï
let x = e;;
¤È¤¤¤¦·Á¤Ç¡¤Àë¸À¤µ¤ì¤¿ÊÑ¿ô x ¤ò¡Ö¼° e ¤òɾ²Á¤·¤¿Ã͡פË«Çû¤¹¤ë¡¥ÊÑ¿ô¤òÀë¸À¤¹¤ë¤³¤È¤Ë¤Ï¡¤ ¤È¤¤¤Ã¤¿°ÕµÁ¤¬¤¢¤ë¡¥¤Ò¤È¤Ä¤á¤Î´ÑÅÀ¤«¤é¸À¤¨¤Ð¡¤Ê¬¤«¤ê¤Ë¤¯¤¤ÊÑ¿ô̾¤ò ¤Ä¤±¤ë¤³¤È¤ÏÈò¤±¤ë¤Ù¤­¤Ç¤¢¤ê¡¤¤¿¤È¤¨°ì»þŪ¤Ë¤·¤«»È¤ï¤Ê¤¤ÊÑ¿ô¤Ç¤â °ÕÌ£¤òÈ¿±Ç¤·¤¿Ì¾Á°¤ò¤Ä¤±¤ë¤Ù¤­¤Ç¤¢¤ë¡¥¤Õ¤¿¤Ä¤á¤Ë´Ø¤·¤ÆÊä­¤·¤Æ¤ª¤¯¤È¡¤ ÊÑ¿ô¤¬Â«Çû¤µ¤ì¤ëÂоݤϷ׻»·ë²Ì¤ÎÃͤǤ¢¤Ã¤Æ¡¤¼°¼«ÂΤǤϤʤ¤¤³¤È¤ËÃí°Õ¡¥ ¾å¤Ç¡¤¡Öpi ¤È½ñ¤¯¤³¤È¤È¡¤3.1415926535 ¤È½ñ¤¯¤³¤È¤ÏƱ¤¸¤³¤È¤ò °ÕÌ£¤¹¤ë¡×¤È¤¤¤Ã¤¿¤Î¤Ï¼°¼«ÂΤ¬ÃͤˤʤäƤ¤¤ë¤«¤é¤Ç¤¢¤ë¡¥¤¿¤À¡¤ºÆÅÙ·×»» ¤¹¤ë¤³¤È¤Î̵Â̤ò½ü¤±¤Ð¡¤(¥Ç¥£¥¹¥×¥ì¥¤½ÐÎϤʤɤÎÉûºîÍѤ¬¤Ê¤¤¸Â¤ê) ¼°¤È¤½¤ÎÃͤϷ׻»·ë²Ì¤Ë±Æ¶Á¤ò¤ª¤è¤Ü¤µ¤Ê¤¤¡¥

Objective Caml ¤Ë¤ª¤±¤ëÊÑ¿ôÀë¸À¤ÏÃͤË̾Á°¤ò¤Ä¤±¤ë¤â¤Î¤Ç¡¤C, C++ ¤Î¤è¤¦¤Ë¡¤ ¥á¥â¥êÎΰè¤Ë̾Á°¤ò¤Ä¤±¤ë¤â¤Î¤Ç¤Ï¤Ê¤¯¡¤ÂåÆþʸ¤Î¤è¤¦¤Ê¤â¤Î¤Ç¡ÖÃæ¿È¤ò¹¹¿·¤¹¤ë¡× ¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥¤¿¤À¤·Æ±¤¸Ì¾Á°¤ÎÊÑ¿ô¤òºÆÀë¸À¤¹¤ë¤³¤È¤Ï¤Ç¤­¤ë¡¥
# let one = 1;;
val one : int = 1
# let two = one + one;;
val two : int = 2
# let one = "One";;
val one : string = "One"
# let three = one ^ one ^ one;;
val three : string = "OneOneOne"
¤³¤Î¾ì¹ç¡¤one ¤ÎÃÍ¤Ï 1 ¤«¤é "One" ¤Ë¹¹¿·¤µ¤ì¤¿¤ï¤±¤Ç¤Ï¤Ê¤¯¡¤ Ʊ¤¸Ì¾Á°¤ÎÊÑ¿ôÀë¸À¤Ë¤è¤êÁ°¤ÎÀë¸À¤¬±£¤µ¤ì¤Æ¸«¤¨¤Ê¤¯¤Ê¤Ã¤¿¤À¤±¤Ê¤Î¤Ç¤¢¤ë¡¥ (¤½¤â¤½¤âÂåÆþ¤À¤È¹Í¤¨¤ë¤È¡¤Á°¤ÎÀë¸À¤È±¦Êդη¿¤¬°ìÃפ·¤Æ¤¤¤Ê¤¤¤Î¤ÇÊѤǤ¢¤ë¡¥)

Àë¸À¤µ¤ì¤¿ÊÑ¿ô¤Ï¾ï¤ËÍ­¸úÈÏ°Ï(scope)¤È¤¤¤Ã¤Æ¡¤¤½¤ÎÊÑ¿ô¤ò»È¤Ã¤Æ ¤è¤¤¥×¥í¥°¥é¥àʸÌ̾å¤ÎÈϰϤ¬³äÅö¤Æ¤é¤ì¤ë¡¥Î㤨¤Ð¡¤letÀë¸À¤ÎÍ­¸úÈÏ°Ï(scope)¤ÏÀë¸À°Ê¹ß¡¤¥Õ¥¡¥¤¥ë(ocaml¥»¥Ã¥·¥ç¥ó)½ªÎ»¤Þ¤Ç¤Ç¤¢¤ë¡¥ ÊÑ¿ô¤Î¤Ò¤È¤Ä¤Ò¤È¤Ä¤Î»ÈÍÑ(Àë¸À¤È¶èÊ̤·¤ÆÊÑ¿ô»²¾È(variable reference)¤È¤â¸À¤¦)¤ËÂФ·¤Æ¡¤(°ÊÁ°¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ëʪ¤Ç)ºÇ¤â¶á¤¤¤â¤Î ¤¬Âбþ¤¹¤ë¡¥¤³¤ÎÂбþ´Ø·¸¤Ï¡¤¼Â¹Ô»þ¤Ç¤Ï¤Ê¤¯¥×¥í¥°¥é¥à¤¬½ñ¤«¤«¤ì¤¿(¤â¤·¤¯¤Ï ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿)»þÅÀ¤Ç·èÄꤵ¤ì¤ë¤Î¤Ç¡¤¡Ö¤³¤Î¸À¸ì¤Ç¤ÎÊÑ¿ôÀë¸À¤Ï ÀÅŪͭ¸úÈÏ°Ï(static scope¡¤ lexical scope)¤ò»ý¤Ä¡×¤È¸À¤ï¤ì¤ë¡¥

¤È¤³¤í¤Ç¡¤Objective Caml ¤Ç¤ÏÊÑ¿ô¤Î·¿¤Ï¥³¥ó¥Ñ¥¤¥é¤¬¼«Æ°Åª¤Ë¿äÏÀ¤·¤Æ¤¯¤ì¤ë¤¿ ¤á¡¤Àë¸À¤¹¤ëɬÍפ¬¤Ê¤¤¡¥¤¿¤À¡¤¥×¥í¥°¥é¥à¤Î°ÕÌ£¤ò¤ï¤«¤ê¤ä¤¹¤¯¤¹¤ë¤¿¤á¡¤ ¥Ç¥Ð¥Ã¥°¤Î¤¿¤á¡¤ÊÑ¿ô¤Î·¿¤òÌÀ¼¨Åª¤Ë¼¨¤·¤Æ¤ª¤­¤¿¤¤¤È¤­¤Ï¡¤ÊÑ¿ô̾¤Î¸å¤Ë ``: ⟨ ·¿ ⟩'' ¤È¤·¤ÆÀë¸À¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥¤Þ¤¿¡¤Ê£¿ô¤Îlet-Àë ¸À¤Ï¤½¤Î¶­Ìܤ¬¤Ï¤Ã¤­¤ê¤·¤Æ¤¤¤ë(¼¡¤Î let ¤¬Íè¤ëľÁ°¤ÇÀÚ¤ì¤ë)¤Î¤Ç´Ö¤Ë ;; ¤ò¤Ä¤±¤º¤Ëʤ٤뤳¤È¤¬¤Ç¤­¤ë¡¥
# let pi : float = 3.1415926535
# let e = 2.718281828;;
val pi : float = 3.1415926535
val e : float = 2.718281828
Æó¤Ä¤ÎÀë¸À¤¬¤Þ¤È¤á¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ·ë²Ì¤¬¤Þ¤È¤Þ¤Ã¤Æ½ÐÎϤµ¤ì¤Æ¤¤¤ë¤³¤È¤ËÃíÌÜ¡¥

ÊÑ¿ô¤Î̾Á°
ÊÑ¿ô¤Î̾Á°¤È¤·¤ÆÍѤ¤¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ï¡¤
  1. °ìʸ»úÌܤ¬±Ñ¾®Ê¸»ú¤Þ¤¿¤Ï¥¢¥ó¥À¡¼¥¹¥³¥¢ (_) ¤Ç¡¤
  2. Æóʸ»úÌܰʹߤϱѿô»ú(A...Z, a...z, 0...9)¡¤¥¢¥ó¥À¡¼¥¹¥³¥¢¤Þ¤¿¤Ï ¥×¥é¥¤¥à (')
¤Ç¤¢¤ë¤è¤¦¤ÊǤ°Õ¤ÎŤµ¤Îʸ»úÎó¤Ç¡¤É½2.4¤Î Objective Caml ¤Îʸˡ¥­¡¼¥ï¡¼ ¥É¤È _ °ìʸ»ú¤Î¤ß¤«¤é¤Ê¤ë¤â¤Î¤ò½ü¤¯¤â¤Î¤Ç¤¢¤ë¡¥

and as assert asr begin class
closed constraint do done downto else
end exception external false for fun
function functor if in include inherit
land lazy let lor lsl lsr
lxor match method mod module mutable
new of open or parser private
rec sig struct then to true
try type val virtual when while
with

Table 2.4: Objective Caml ¥­¡¼¥ï¡¼¥É


2.3.2 ´Ä¶­¤ÈÀÅŪͭ¸úÈÏ°Ï

¤³¤³¤Ç¹â¥ì¥Ù¥ë¤Ê¼°¤Î°ÕÌ£¤òÎ¥¤ì¤Æ¡¤Ì¾Á°»²¾È¤¬¤É¤Î¤è¤¦¤Ë¼Â¸½¤µ¤ì¤Æ¤¤¤ë¤«¤ò¤ß ¤Æ¤ß¤ë¡¥¥×¥í¥°¥é¥à¤Î¼Â¹ÔÃæ¤Ë¤Ï¡¤¼Â¹Ô¤·¤Æ¤¤¤ë»þÅÀ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë(Í­¸úÈÏ°Ï¤Ë ¤¢¤ë)ÊÑ¿ô̾¤È¤½¤ÎÃͤÎÁȤΥꥹ¥È¤¬¥á¥â¥ê¾å¤ËÊݸ¤µ¤ì¤Æ¤¤¤ë¡¥¤³¤Î¥Ç¡¼¥¿¤Î¤³¤È ¤ò´Ä¶­(environment)¤È¤¤¤¦¡¥Æäˡ¤¥×¥í¥°¥é¥à¤Î°ìÈÖ³°Â¦¤Ë¤ª¤±¤ë´Ä¶­ ¤ò¥È¥Ã¥×¥ì¥Ù¥ë´Ä¶­(top-level environment)¡¤¤Þ¤¿¤ÏÂç°è´Ä ¶­(global environment)¤È¤¤¤¦¡¥

Î㤨¤Ð¡¤ocaml ¤òµ¯Æ°¤·¤¿¤È¤­¤Ë¤Ï¡¤sin, max_int ¤Ê¤É¤Î̾Á°¤¬Âç°è´Ä¶­¤Ë ¤¢¤ë¾õÂ֤ǥ»¥Ã¥·¥ç¥ó¤¬»Ï¤Þ¤ë(¿Þ2.1)¡¥

ÊÑ¿ô̾ ÃÍ
sin Àµ¸¹´Ø¿ô
max_int 1073741823

Figure 2.1: ocaml µ¯Æ°»þ¤ÎÂç°è´Ä¶­


letÀë¸À¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë¤Ï¡¤¤³¤Î¥È¥Ã¥×¥ì¥Ù¥ë´Ä¶­¤ÎºÇ¸å¤Ë¡¤¿·¤·¤¤ÊÑ¿ô ¤È¤½¤ÎÃͤÎÁȤ¬Äɲ䵤ì¤ë(¿Þ2.2) ¡¥ÊÑ¿ô¤Î»²¾È¤Ï¡¤¤³¤Î´Ä¶­¤ò²¼¤«¤é ½çÈÖ¤ËÊÑ¿ô¤òõ¤·¤Æ¹Ô¤¯Áàºî¤ËÂбþ¤¹¤ë5¡¥¤½¤Î¤¿¤á¡¤Æ±¤¸Ì¾Á°¤ÎÊÑ¿ô¤¬ºÆÄêµÁ¤µ¤ì ¤¿¾ì¹ç¡¤¾å¤Î¥¨¥ó¥È¥ê¤Ëõº÷¤¬Åþ㤷¤Ê¤¤¤¿¤á¤Ë»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¡¥ Âç°è´Ä¶­¤«¤é¥¨¥ó¥È¥ê¤¬ºï½ü¤µ¤ì¤ë¤³¤È¤Ï¤Ê¤¤¡¥ ¤½¤Î¤¿¤áletÀë¸À¤ÎÍ­¸úÈϰϤÏÀë¸Àľ¸å¤«¤é¥×¥í¥°¥é¥à½ªÎ»¤Þ¤Ç¤Ê¤Î¤Ç¤¢¤ë¡¥

ÊÑ¿ô̾ ÃÍ
one 1
two 2
one "One"
three "OneOneOne"

Figure 2.2: letÀë¸À¼Â¹Ô¸å¤ÎÂç°è´Ä¶­


2.3.3 Îý½¬ÌäÂê
Exercise 5  ¼¡¤Î¤¦¤ÁÊÑ¿ô̾¤È¤·¤ÆÍ­¸ú¤Ê¤â¤Î¤Ï¤É¤ì¤«¡¥¼ÂºÝ¤Ë let Àë¸À¤ËÍѤ¤¤Æ³Î¤«¤á¤è¡¥
a_2'      ____      Cat      _'_'_      7eleven      'ab2_     _

2.4 ´Ø¿ôÀë¸À

¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤·×»»¼ê½ç¤Ë̾Á°¤ò¤Ä¤±¤ÆÃê¾Ý²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ Objective Caml ¤Ç¤Ï¤³¤ì¤ò´Ø¿ô(function)¤È¸Æ¤Ö¡¥

¾å¤ÇÄêµÁ¤·¤¿ÊÑ¿ô pi ¤ò»È¤Ã¤Æ¡¤±ß¤ÎÌÌÀѤòµá¤á¤ë¤³¤È¤ò¹Í¤¨¤ë¡¥±ß¤ÎÌÌÀÑ ¼«ÂΤϤâ¤Á¤í¤ó¡¤
⟨Ⱦ·Â⟩ *. ⟨Ⱦ·Â⟩ *. pi
¤È¤¤¤¦¼°¤Çµá¤Þ¤ë¤ï¤±¤À¤¬¡¤°ã¤Ã¤¿È¾·Â¤ËÂФ·¤Æ¡ÖƱ¤¸¤è¤¦¤Ê¼°¡×¤ò ²¿ÅÙ¤âÆþÎϤ¹¤ë¤Î¤Ï¡¤´Ö°ã¤¤¤Î¤â¤È¤Ç¤¢¤ê¡¤¤Þ¤¿¡¤¤½¤Î¼°¤¬²¿¤ò°ÕÌ£¤¹¤ë¤Î¤«¤¬ ¤ï¤«¤ê¤Ë¤¯¤¯¤Ê¤ë¡¥¤½¤³¤Ç¡¤¡Ö»÷¤¿¤è¤¦¤Ê·×»»¤Î¼ê½ç¡×¤Ë̾Á°¤ò¤Ä¤±¡¤ ½Ð¸½¸Ä½ê¤Ë¤è¤Ã¤Æ°ã¤¦Éôʬ(¼ÂºÝ¤ÎȾ·Â)¤Ï¡¤¥Ñ¥é¥á¡¼¥¿²½(parameterization) ¤¹¤ë¤³¤È¤ò¹Í¤¨¤ë¡¥¤³¤Î¡Ö¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·×»»¼ê½ç¡×¤¬´Ø ¿ô¤Ç¤¢¤ë¡¥

Objective Caml ¤Ç¤Ï±ß¤ÎÌÌÀѤòµá¤á¤ë´Ø¿ô¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
# let circle_area r = (* area of circle with radius r *)
#   r *. r *. pi;;
val circle_area : float -> float = <fun>
´Ø¿ôÀë¸À¤Ë¤â let Àë¸À¤ò»ÈÍѤ¹¤ë¡¥ÆþÎϤΠcircle_area ¤¬Àë¸À¤µ¤ì¤¿´Ø ¿ô¤Î̾Á°¤Ç¤¢¤ë¡¥´Ø¿ô̾¤Î¸å¤Î r ¤¬¥Ñ¥é¥á¡¼¥¿¤Ç¤¢¤ê¡¤ÄêµÁÆâ¤ÇÄ̾ï¤ÎÊÑ ¿ô¤ÈƱ¤¸¤è¤¦¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥= ¤è¤ê¤¢¤È¤Î¼° r *. r *. pi ¤¬ ´Ø¿ô¤ÎËÜÂÎ(body)¤È¸Æ¤Ð¤ì¤ëÉôʬ¤Ç·×»»¼ê½ç¤Ç¤¢¤ë¤È¤³¤í¤Î¼°¤ò½ñ ¤¯¤È¤³¤í¤Ç¤¢¤ë¡¥(;; ¤Ï¤¤¤Ä¤â¤Î¤è¤¦¤Ë¥³¥ó¥Ñ¥¤¥é¤ËÆþÎϽªÎ»¤òÃΤ餻¤ë¤â ¤Î¤Ç¤¢¤ë¡¥)¥³¥ó¥Ñ¥¤¥é¤«¤é¤Î±þÅú¤Ï¡¤Àë¸À¤µ¤ì¤¿Ì¾Á° circle_area¡¤¤½¤Î ·¿ float->float¡¤¤½¤ÎÃÍ <fun> ¤Èʤó¤Ç¤¤¤ë¡¥·¿¤ÎÃæ¤Î -> ¤Ï¡¤ ⟨ ¥Ñ¥é¥á¡¼¥¿¤Î·¿ ⟩->⟨ ·ë²Ì¤Î·¿ ⟩ ¤È¤¤¤¦·Á¤Ç¡¤¤½¤Î circle_area ¤¬´Ø¿ô¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤ª¤ê¡¤¤³¤³¤Ç¤Ï¼Â¿ô¤ò¤È¤Ã¤Æ¼Â¿ô ¤òÊÖ¤¹¤³¤È¤òɽ¤·¤Æ¤¤¤ë¡¥-> ¤Î¤è¤¦¤Ë¤è¤êñ½ã¤Ê·¿¤«¤é·¿¤ò¹½À®¤¹¤ëµ­¹æ ¤ò·¿¹½ÃÛ»Ò(type constructor)¤È¸Æ¤Ö¡¥´ðËÜ·¿¤â0¸Ä¤Î·¿¤«¤é·¿¤ò ºî¤ë·¿¹½ÃۻҤȹͤ¨¤é¤ì¤ë¡¥<fun> ¤Ï¡¤¤Ê¤ó¤é¤«¤Î´Ø¿ô¤Ç¤¢¤ë¤³¤È¤ò¼¨¤·¤Æ ¤¤¤ë¡¥º£¤Þ¤Ç¸«¤Æ¤­¤¿À°¿ô¤Ê¤É¤È¤Ï°Û¤Ê¤ê¡¤¥Ç¥£¥¹¥×¥ì¥¤¤Ëɽ¼¨¤Ç¤­¤ëɽ¸½ (``3'' ¤Ê¤É)¤ò»ý¤¿¤Ê¤¤¡¥

Àë¸À¤µ¤ì¤¿´Ø¿ô¤Ï¡¤ÁȤ߹þ¤ß¤Î int_of_float ¤Ê¤É¤ÈƱ¤¸¤è¤¦¤Ë¸Æ¤Ó½Ð¤¹¤³¤È¤¬ ¤Ç¤­¤ë¡¥
# circle_area 2.0;;
- : float = 12.566370614
´Ø¿ô¸Æ¤Ó½Ð¤·(´Ø¿ôŬÍÑ(function application)¤È¤â¤¤¤¦)¤Ï¡¤ ºÇ¤âÁÇËѤʸ«Êý¤Ç¤Ï¡¤´Ø¿ôËÜÂÎÃæ¤Î¥Ñ¥é¥á¡¼¥¿ r ¤ò°ú¿ô 2.0 ¤Ë ÃÖ¤­´¹¤¨¤¿¼°¡¤2.0 *. 2.0 *. pi ¤òɾ²Á¤·¡¤¤½¤ÎÃͤ¬¡¤¸Æ¤Ó½Ð¤·¼° Á´ÂΤÎÃͤȤʤ롥

Objective Caml ¤Ç¤Ï¡¤ÃͤΫÇû¤ÈƱÍÍ¡¤Àë¸À¤µ¤ì¤ë´Ø¿ô¤Î¥Ñ¥é¥á¡¼¥¿¤ª¤è¤Ó·ë²Ì¤Î ·¿¤òÌÀ¼¨Åª¤ËÀë¸À¤¹¤ëɬÍפ¬¤Ê¤¤¡¥¤³¤ì¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤¬·¿¿äÏÀ(type inference)¤ò¹Ô¤Ã¤Æ¡¤¾å¤ÎÎã¤Î¤è¤¦¤Ë·¿¾ðÊó¤òÊä¤Ã¤Æ¤¯¤ì¤ë¤¿¤á¤Ç¤¢¤ë¡¥ ´Êñ¤Ê·¿¿äÏÀ¤Î»ÅÁȤߤˤĤ¤¤Æ¤Ï¡¤¸åÄø¸«¤Æ¤¤¤¯¤³¤È¤Ë¤¹¤ë¡¥¤½¤ì¤Ç¤âÌÀ¼¨Åª ¤Ë·¿¤òÀë¸À¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¤ÃͤΫÇû¤ÈƱÍÍ¡¤·¿¾ðÊó¤òÊ䤦¤³¤È¤¬¤Ç¤­¤ë¡¥
# let circle_area(r : float) : float = (* area of circle with radius r *)
#   r *. r *. pi;;
val circle_area : float -> float = <fun>
·ë²Ì¤Î·¿¤Ï = ¤ÎÁ°¤Ëµ­½Ò¤¹¤ë¡¥¤Þ¤¿¡¤ ¥Ñ¥é¥á¡¼¥¿¤ò°Ï¤à () ¤¬É¬Íפˤʤ롥 (·¿Àë¸À¤ò¤·¤Ê¤¤¾ì¹ç¤Ç¤â () ¤ò¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¤¬¡¤¸Æ¤Ó½Ð¤·¤Î»þ¤Î¾Êά¤ò¹Ô ¤¦¤Î¤ÈƱÍͤÊÍýͳ¤Ç () ¤Ï¾Êά¤¹¤ë¤³¤È¤¬Â¿¤¤¡¥)

¤³¤³¤Ç¤Î¡¤´Ø¿ôÀë¸À¤Îʸˡ¤ò¤Þ¤È¤á¤ë¤È¡¤
let fparameter ⟩ [: t] = e
    ¤¿¤À¤· ⟨ parameter ⟩ ::= x | (x: t)
¤È¤Ê¤ë6¡¥ [ ] Éôʬ¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ë¡¥f ¤Ï´Ø¿ô̾¤òɽ¤¹¥á¥¿ÊÑ¿ô¡¤ t ¤Ï·¿¤òɽ¤¹¥á¥¿ÊÑ¿ô¤Ç¤¢¤ë¡¥ ´Ø¿ô̾¡¦¥Ñ¥é¥á¡¼¥¿Ì¾¤È¤·¤Æµö¤µ¤ì¤ë̾Á°¤ÏÊÑ¿ô¤Î¾ì¹ç¤ÈƱ¤¸¤Ç¤¢¤ë¡¥ (¼Â¤Ï¡¤ÊÑ¿ô̾¡¤´Ø¿ô̾¡¤¥Ñ¥é¥á¡¼¥¿Ì¾¤ò¶èÊ̤¹¤ëɬÍפϤʤ¤¡¥) ÃͤÎ̾Á°¤ÈƱ¤¸¤è¤¦¤Ë¡¤´Ø¿ô̾¡¦¥Ñ¥é¥á¡¼¥¿Ì¾¤â¤ï¤«¤ê¤ä¤¹¤¤¤â¤Î¤ò¤Ä¤±¡¤ ´Ø¿ô¤¬²¿¤ò·×»»¤¹¤ë¤Î¤«¡¤¥³¥á¥ó¥È¤ò½ñ¤¯Êʤò¤Ä¤±¤¿¤¤¡¥
ÀÅŪͭ¸úÈϰϤˤĤ¤¤ÆÊä­ ´Ø¿ôËÜÂÎÃæ¤Î pi ¤Ï¡¤ÀÅŪͭ¸úÈϰϤˤè¤Ã¤Æ¡¤´Ø¿ôÀë¸À¤Î»þÅÀ¤ÇÀë¸À¤µ ¤ì¤Æ¤¤¤ë¤â¤Î¤¬»²¾È¤µ¤ì¤ë¡¥¤½¤Î¤¿¤á¡¤circle_area ¤Î¤¢¤È¤Çpi ¤òºÆÀë ¸À¤·¤Æ¤â¡¤circle_area ¤ÎÄêµÁ¤Ë¤Ï±Æ¶Á¤¬¤Ê¤¤¡¥
# let pi = 1.0;;
val pi : float = 1.
# circle_area 2.0;;
- : float = 12.566370614
¤³¤ì¤ËÂФ·¤Æ¡¤´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤Î pi ¤ÎÃͤò¸«¤ë dynamic scoping ¤È¤¤¤¦ Êý¼°¤òºÎÍѤ·¤Æ¤¤¤ë¸À¸ì(Î㤨¤Ð Emacs Lisp)¤â¤¢¤ë¡¥dynamic scoping ¤Î²¼¤Ç¤Ï¡¤ ¾å¤Î·ë²Ì¤Ï¡¤4.0 (¤Ä¤Þ¤ê 2.0 *. 2.0 *. 1.0) ¤Ë¤Ê¤ë¡¥
2.4.1 Îý½¬ÌäÂê
Exercise 6  ¼¡¤Î´Ø¿ô¤òÄêµÁ¤»¤è¡¥¼Â¿ô¤ÎÀÚ¤ê¼Î¤Æ¤ò¹Ô¤¦´Ø¿ô floor ¤òÍѤ¤¤Æ¤è¤¤¡¥
  1. US¥É¥ë(¼Â¿ô)¤ò¼õ¤±¼è¤Ã¤Æ±ß(À°¿ô)¤Ë´¹»»¤¹¤ë´Ø¿ô(¤¿¤À¤·1±ß°Ê²¼»Í¼Î¸ÞÆþ)¡¥ (ÆþÎϤϾ®¿ôÅÀ°Ê²¼2·å¤Ç½ª¤ï¤ë¤È¤­¤ËƯ¤±¤Ð¤è¤¤¡¥)¥ì¡¼¥È¤Ï 1$ = 111.12 ±ß¤È¤¹ ¤ë¡¥

  2. ±ß(À°¿ô)¤ò¼õ¤±¼è¤Ã¤Æ¡¤US¥É¥ë(¥»¥ó¥È°Ê²¼¤ò¾®¿ô¤Ë¤·¤¿¼Â¿ô)¤Ë´¹»» ¤¹¤ë´Ø¿ô(¤¿¤À¤·1¥»¥ó¥È°Ê²¼»Í¼Î¸ÞÆþ)¡¥¥ì¡¼¥È¤Ï 1$ = 111.12 ±ß¤È¤¹ ¤ë¡¥

  3. US¥É¥ë(¼Â¿ô)¤ò¼õ¤±¼è¤Ã¤Æ¡¤Ê¸»úÎó "⟨ ¥É¥ë ⟩ dollars are ⟨ ±ß ⟩ yen." ¤òÊÖ¤¹´Ø¿ô¡¥

  4. ʸ»ú¤ò¼õ¤±¼è¤Ã¤Æ¡¤¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¤Î¾®Ê¸»ú¤Ê¤éÂçʸ»ú¤Ë¡¤¤½¤Î¾¤Îʸ »ú¤Ï¤½¤Î¤Þ¤ÞÊÖ¤¹´Ø¿ô capitalize¡¥(Îã: capitalize 'h''H', capitalize '1''1')


1
¤³¤Î¼ê½ç¤ò read-eval-print ¥ë¡¼¥×¤È¸Æ¤Ð¤ì¤ë¤³¤È¤â¤¢¤ë¡¥
2
¤¿¤À¤· C ¤Î void ·¿¤Ï¤½¤ì¤Ë°¤¹¤ëÃͤò¤â¤¿¤Ê¤¤¡¥
3
¥³¥ó¥Ñ¥¤¥ë¤ÈÀÅŪ¤Ê·¿¤Å¤±¤Î´Ö¤ËľÀܤδط¸¤Ï¤Ê¤¤¡¥ Lisp ¤ÏưŪ¤Ë¥Á¥§¥Ã¥¯¤¬¹Ô¤ï¤ì¤ë¤¬¥³¥ó¥Ñ¥¤¥é¤¬Â¸ºß¤¹¤ë¤·¡¤ ¥¤¥ó¥¿¥×¥ê¥¿¼Â¹Ô¤¹¤ë¸À¸ì¤ËÀÅŪ·¿¥·¥¹¥Æ¥à¤òƳÆþ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
4
Àè¤Ë¸«¤¿ 0 ¤Ç¤Î½ü»»¤Ï¡¤·¿¥¨¥é¡¼¤Ç¤Ï¤Ê¤¤¤È¤·¤¿¤¬¡¤ (Objective Caml¤Ç¤Ï)¤½¤Î·ë²Ì¤¬¸À¸ìÆâ¤Î³µÇ°¤Ç¤¢¤ëÎã³°¤ÎȯÀ¸¤È¤·¤Æ ÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¤¤·¤«¤â¼Â¹ÔÃæ¤Ë¤½¤ÎȯÀ¸¤ò¸¡ÃΤ¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥ (C ¤Ç¤Ï OS ¤Î½õ¤±¤ò¼Ú¤ê¤Ê¤¤¤È¡¤0¤Ç¤Î½ü»»¤ÎȯÀ¸¤ò¸¡ÃΤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥)
5
¼ÂºÝ¤Ë¼Â¹Ô»þ¤Ëõº÷¤ò¤¹¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤
6
¥Æ¥­¥¹¥È¤òÄ̤¸¤Æ´Ø¿ôÀë¸À¤Îʸˡ¤Ï½ù¡¹¤Ë³ÈÂ礵¤ì¤Æ¤¤¤¯¡¥

Previous Up Next