Chapter 2 |
´ðËܥǡ¼¥¿·¿¡¤ÊÑ¿ô¤ÎÀë¸À¡¤´Êñ¤Ê´Ø¿ô |
|
¤³¤Î¾Ï¤Î¥¡¼¥ï¡¼¥É: ¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¡¤·¿¡¤·¿¥·¥¹¥Æ¥à¡¤·¿°ÂÁ´À¡¤
͸úÈϰÏ, ´Ä¶¡¤´Ø¿ô |
|
2.1 |
¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤ò»È¤¦ |
|
Objective Caml½èÍý·Ï¤Ë¤Ï2¼ïÎà¤Î¥³¥ó¥Ñ¥¤¥é¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥¤Ò¤È¤Ä¤Ï gcc ¤ä
javac ¤Ê¤É¤Î¤è¤¦¤Ë¡¤¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤«¤é¼Â¹Ô¤Î¤¿¤á¤Î¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¥Ð¥Ã
¥Á¥³¥ó¥Ñ¥¤¥é ocamlc¡¤¤â¤¦¤Ò¤È¤Ä¤Ï¡¤¥æ¡¼¥¶¤«¤é¤ÎÆþÎϤò¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ë
½èÍý¤¹¤ë ocaml ¤Ç¤¢¤ë¡¥¤³¤Î¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê½èÍý·Ï¤Ï¡¤(¥æ¡¼¥¶¤«¤é¤Î)¥×
¥í¥°¥é¥à¤ÎÆþÎÏ → ¥³¥ó¥Ñ¥¤¥ë → ¼Â¹Ô¡¦·ë²Ì¤Îɽ¼¨¡¤¤ò
·«¤êÊÖ¤¹¤â¤Î¤Ç1
¡¤Ä¾Á°¤Ç¼Â¹Ô¤µ¤ì¤¿¥×¥í¥°¥é¥à¤Î·ë²Ì¤¬¼¡¤ÎÆþÎÏ»þ¤ËÈ¿±Ç¤µ¤ì¤ë
¤¿¤á¡¤³«È¯Ãæ¤Î¥Æ¥¹¥È¤Ê¤É¡¤»î¹Ôºø¸í¤òȼ¤¦²áÄø¤ÇÆÃ¤ËÊØÍø¤Ê¤â¤Î¤Ç¤¢¤ë¡¥¤Þ¤¿¡¤
¸å½Ò¤¹¤ë¤è¤¦¤Ë¡¤ÆþÎϤϥ¡¼¥Ü¡¼¥É¤«¤é¤À¤±¤Ç¤Ê¤¯¡¤¥Õ¥¡¥¤¥ë¤«¤é¤ÎÆÉ¤ß¹þ¤ß¤â¤Ç¤
¤ë¤Î¤Ç¡¤Ëè²ó¥×¥í¥°¥é¥à¤òºÇ½é¤«¤éÂǤ¿¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤Ê¤É¤ÎÉÔÊØ¤â¤Ê¤¤¡¥
;Ã̤Ǥ¢¤ë¤¬¡¤Lisp, Scheme ¤Ê¤É´Ø¿ô·¿¸À¸ì½èÍý·Ï¤Ë¤Ï¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê½èÍý·Ï
¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¤â¤Î¤¬Â¿¤¤¤è¤¦¤À¡¥
¤³¤Î±é½¬¤Ç¤Ï¡¤¼ç¤Ë ocaml ¤ÎÊý¤òÍѤ¤¤Æ¿Ê¤á¤Æ¤¤¤¯¡¥
µ¯Æ°ÊýË¡¤ÏEmacs ¤Ç M-x run-caml (M-x ¤Ï¥¨¥¹¥±¡¼¥×¥¡¼¤Ë³¤¤¤Æ x ¤ò¥¿¥¤¥×¤¹¤ë)
¤È¤¹¤ë¡¥¥ß¥Ë¥Ð¥Ã¥Õ¥¡(²èÌ̤κDz¼ÃÊ)¤Ë Caml toplevel to run: ¤È¤¤¤¦¥×¥í¥ó¥×¥È
¤È¤È¤â¤Ë¡¤µ¯Æ°¤¹¤ë¥³¥Þ¥ó¥É¤òʹ¤«¤ì¤ë¤¬(´û¤Ë ocaml ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ò
³Îǧ¤·)¡¤¤½¤Î¤Þ¤Þ Enter ¥¡¼¤ò¥¿¥¤¥×¤¹¤ë¡¥¤¹¤ë¤È¡¤°Ê²¼¤Î¤è¤¦¤Ê
ÆâÍÆ¤Î¿·¤·¤¤¥Ð¥Ã¥Õ¥¡¤¬¸½¤ï¤ì¤ë¡¥
Objective Caml version 3.06
#
# ¤Ï¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¥³¥ó¥Ñ¥¤¥é¤ÎÆþÎÏ¥×¥í¥ó¥×¥È¤Ç¤¢¤ë¡¥
¤µ¤Æ¡¤¥×¥í¥ó¥×¥È¤Ë³¤¤¤Æ¡¤´Êñ¤Ê¼°¤òÆþÎϤ·¤Æ¤ß¤è¤¦¡¥
# 1 + 1;;
- : int = 2
¤³¤Î¥Æ¥¥¹¥È¤Ç¤Ï¡¤¥æ¡¼¥¶¤ÎÆþÎϤò¹ÔƬ¤Ë#¤ò¤Ä¤±¡¤¥¿¥¤¥×¥é¥¤¥¿¡¼ÂÎ
(abc)¤Ç¡¤¥³¥ó¥Ñ¥¤¥é¤«¤é¤Î½ÐÎϤò¥¿¥¤¥×¥é¥¤¥¿¡¼¼ÐÂÎ
(abc)¤Ç¼¨¤¹¡¥ºÇ¸å¤Î ;; ¤ÏÆþÎϽªÎ»¤Î¤·¤ë¤·¤Ç¡¤¥×¥í¥ó¥×
¥È¤«¤é¤³¤³¤Þ¤Ç¤ÎÉôʬ¤¬¥³¥ó¥Ñ¥¤¥ë¡¦¼Â¹Ô¤µ¤ì¤ë¡¥(ÅÓÃæ¤Ë²þ¹Ô¤¬¤¢¤Ã¤Æ¤â¤è¤¤¡¥)
¥³¥ó¥Ñ¥¤¥é¤Î½ÐÎϤϡ¤É¾²Á·ë²Ì¤Ë¤Ä¤±¤é¤ì¤¿Ì¾Á°(¤³¤³¤Ç¤Ï¼°¤À¤±¤òÆþÎϤ·¤¿¤Î¤Ç¡¤
̾Á°¤ò¤Ä¤±¤Æ¤¤¤Ê¤¤¤È¤¤¤¦°ÕÌ£¤Ç¤¢¤ë -)¡¤¼°¤ª¤è¤Óɾ²Á·ë²Ì¤Î·¿
(int)¡¤É¾²Á·ë²Ì(2)¤«¤é¤Ê¤Ã¤Æ¤¤¤ë¡¥
Ê£»¨¤Ê¼°¤Ï¡¤()¤Ç°Ï¤à¤³¤È¤Ç¡¤Éôʬ¼°¤Î¹½Â¤¤ò¼¨¤¹¤³¤È¤¬¤Ç¤¤ë¡¥¤Þ¤¿¡¤Â¿¤¯¤Î
±é»»¤Ë¤Ï¾ï¼±Åª¤Ê·ë¹ç¤Î¶¯¤µ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¡¤()¤ò¾Êά¤Ç¤¤ë¡¥
# 1 + 2 * 3;;
- : int = 7
# (1 + 2) * 3;;
- : int = 9
¤³¤Î¥Ð¥Ã¥Õ¥¡¤Ç¤Ï¼°¤ÎÆþÎϤò½õ¤±¤ë¥³¥Þ¥ó¥É¤¬¤¤¤¯¤Ä¤«ÍѰդµ¤ì¤Æ¤ª¤ê¡¤
Î㤨¤Ð M-p, M-n ¤Ç°ÊÁ°¤ËÆþÎϤ·¤¿¼°¤ò¸Æ¤Ó½Ð¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
(ɽ2.1¤Ë¥¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò¤Þ¤È¤á¤Æ¤¢¤ë¡¥)
Table 2.1: ¥³¥ó¥Ñ¥¤¥é¥Ð¥Ã¥Õ¥¡Æâ¥¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°
C-c C-c |
ÆþÎÏÅÓÃæ¤ÇÃæÃǤ·¥×¥í¥ó¥×¥È¤ËÌá¤ë |
C-c C-d |
¥»¥Ã¥·¥ç¥ó¤Î½ªÎ» |
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.06
# #quit;;
Process inferior-caml finished
2.1.2 |
¤½¤Î¾: ¥Õ¥¡¥¤¥ë¤«¤é¤Î¥×¥í¥°¥é¥à¤ÎÆÉ¤ß¹þ¤ß¡¦¥³¥á¥ó¥È |
|
ocaml Æâ¤Ç¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤Îưºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Î
¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤È¸Æ¤Ð¤ì¤ë¤¤¤¯¤Ä¤«¤ÎÌ¿Îá¤¬ÍøÍѤǤ¤ë¡¥¤¿¤È¤¨¤Ð¡¤¾å¤Ç¤Ç¤Æ¤¤¿
#quit ¤â¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Î°ì¼ï¤Ç¤¢¤ë¡¥¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ï¿¿ô¤¢¤ë¤¬
¤³¤³¤Ç¤Ï¥Õ¥¡¥¤¥ë¤«¤é¤Î¥×¥í¥°¥é¥àÆÉ¤ß¹þ¤ß¤Ë´Ø¤¹¤ë¤Õ¤¿¤Ä #use, #cd
¤ò¾Ò²ð¤¹¤ë¡¥¾Ü¤·¤¯¤Ï¥Þ¥Ë¥å¥¢¥ë[3]¤ò»²¾È¤Î¤³¤È¡¥
#use ¤Ï¥Õ¥¡¥¤¥ë̾¤ò°ú¿ô¤Ë¤È¤Ã¤Æ¡¤¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¤òÆþÎϤȤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò
¹Ô¤¦¡¥
two.ml ¤ÎÆâÍÆ
1 + 1;;
#use ¤ò»È¤¦
Objective Caml version 3.06
# #use "two.ml";;
- : int = 2
¤Á¤Ê¤ß¤Ë¡¤¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ï¸À¸ì¤Î°ìÉô¤Ç¤Ï¤Ê¤¯¡¤
Ä̾ï¤Î¼°¤ÈÁȤ߹ç¤ï¤»¤Æ»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤¤³¤È¤ËÃí°Õ¡¥
# 1 + #use "two.ml";;
1 + #use "two.ml";;
^
Syntax error
#cd ¤Ï¡¤#use ¤ÈƱÍͤËʸ»úÎó¤ò°ú¿ô¤Ë¤È¤Ã¤Æ¡¤¥·¥§¥ë¤Î cd ¥³¥Þ¥ó¥É¤È
ƱÍͤ˥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤ò°ú¿ô¤Î¤â¤Î¤ØÊѹ¹¤¹¤ë¤â¤Î¤Ç¤¢¤ë¡¥
±é½¬¤Î¥ì¥Ý¡¼¥È¤Ï¡¤¥×¥í¥°¥é¥à¥Õ¥¡¥¤¥ë¤òÄó½Ð¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¤
¼ç¤ËÊÌ¥Õ¥¡¥¤¥ë¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¡¤#use ¤Ç¥³¥ó¥Ñ¥¤¥é¤ËÆÉ¤ß¹þ¤ó¤Ç
¥Æ¥¹¥È¤ò¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥¤³¤Î»þ¡¤¥Õ¥¡¥¤¥ë̾¤Î³ÈÄ¥»Ò¤È¤·¤Æ
.ml ¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤à¤È¡¤caml-mode ¤È¤¤¤¦ Objective Caml¥×¥í¥°¥é¥à¤Î
ÆþÎϤò»Ù±ç¤¹¤ë¥â¡¼¥É¤Ë¤Ê¤ê¡¤¥½¡¼¥¹¤Î¥¤¥ó¥Ç¥ó¥È¤Ê¤É¤¬
¤Ç¤¤ë¡¥¥³¥Þ¥ó¥É¤Ïɽ2.2¤Ë¤Þ¤È¤á¤Æ¤¢¤ë¡¥
Table 2.2: caml-mode ¥¡¼¥Ð¥¤¥ó¥Ç¥£¥ó¥°
TAB |
¸½ºß¤Î¹Ô¤Î¥¤¥ó¥Ç¥ó¥È |
M-C-q ¤ª¤è¤Ó |
|
C-c C-q |
¸½ºß¤Î¹Ô¤ò°Ï¤à¥Õ¥ì¡¼¥º(¼°¤È¤·¤Æ°ÕÌ£¤Î¤¢¤ë¤Þ¤È¤Þ¤ê)
¤Î¥¤¥ó¥Ç¥ó¥È |
M-C-h |
¥Õ¥ì¡¼¥º¤Ë¥Þ¡¼¥¯ |
C-c w |
¥Ð¥Ã¥Õ¥¡¤Ë while ¼°¤òÁÞÆþ |
C-c t |
try ¼°¤òÁÞÆþ |
C-c m |
match ¼°¤òÁÞÆþ |
C-c l |
let ¼°¤òÁÞÆþ |
C-c i |
if ¼°¤òÁÞÆþ |
C-c f |
for ¼°¤òÁÞÆþ |
C-c b |
begin ¼°¤òÁÞÆþ |
M-x run-caml |
ocaml ¤òµ¯Æ°¡¥µ¯Æ°Ãæ¤Ë¤Ï°Ê²¼¤Î¥³¥Þ¥ó¥É¤¬»ÈÍѲÄǽ |
M-C-x ¤ª¤è¤Ó |
|
C-c C-e |
¥Õ¥ì¡¼¥º¤ò caml ¥×¥í¥»¥¹¤ËÁ÷¤ë |
C-c C-r |
¥ê¡¼¥¸¥ç¥ó¤ò caml ¥×¥í¥»¥¹¤ËÁ÷¤ë |
C-c C-s |
caml ¥×¥í¥»¥¹¤Î¥Ð¥Ã¥Õ¥¡¤òɽ¼¨ |
C-c ` |
caml ¥×¥í¥»¥¹¤ËÁ÷¤Ã¤¿¼°¤Î¥³¥ó¥Ñ¥¤¥ë¥¨¥é¡¼¤ò½ç¼¡É½¼¨ |
¥³¥á¥ó¥È¡¤ÆüËܸì¤Î°·¤¤
¥Õ¥¡¥¤¥ë¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¤È¤¤Ï¡¤¥³¥á¥ó¥È¤ò½ñ¤¯¤è¤¦¤Ë¤·¤¿¤¤¡¥
¥×¥í¥°¥é¥àÃæ¤Î¥³¥á¥ó¥È¤Ï (* ¤È *) ¤Ç°Ï¤Þ¤ì¤¿Éôʬ¤Ç¤¢¤ë¡¥
¤Þ¤¿¡¤¥³¥á¥ó¥È¤ÏÆþ¤ì»Ò¤Ë¤Ê¤Ã¤Æ¤â¤è¤¤¤·¡¤ÅÓÃæ¤Ë²þ¹Ô¤ò¤Ï¤µ¤ó¤Ç¤â¤è¤¤¡¥
EUC ¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¸Â¤ê¡¤¥³¥á¥ó¥È¡¤Ê¸»úÎóÄê¿ô¤È¤·¤ÆÆüËܸì¤òÍѤ¤¤ë¤³¤È¤¬
¤Ç¤¤ë¡¥¤·¤«¤·¡¤Ê¸»úÎó¤Ë´Ø¤·¤Æ¤Ï¡¤Ê¸»ú¿ô¤Ê¤É¤¬Àµ¤·¤¯Ç§¼±¤µ¤ì¤Ê¤¤¤Î¤Ç
¤Ç¤¤ì¤Ð»È¤ï¤Ê¤¤Êý¤¬ÌµÆñ¤Ç¤¢¤ë¡¥
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 ¤È¤¤¤¦¶ñÂÎŪ¤ÊÊÑ¿ô¤ò»È¤Ã¤¿Ç¤°Õ¤Î¼°¤òɽ¤ï¤·
¤Æ¤¤¤ë¡¥
unit¤Ï¡¤() (unit value ¤È¸Æ¤Ö) ¤È¤¤¤¦Ãͤò¤¿¤À¤Ò¤È¤Ä¤Î
Í×ÁǤȤ·¤Æ´Þ¤à¤è¤¦¤Ê·¿¤Ç¤¢¤ë¡¥
# ();;
- : unit = ()
¤³¤ÎÃͤËÂФ·¤Æ¹Ô¤¨¤ë±é»»¤Ï¤Ê¤¯¡¤Ìò¤ËΩ¤¿¤Ê¤¤¤â¤Î¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
ŵ·¿Åª¤Ê»ÈÍÑË¡¤Ë¤Ï¤Õ¤¿¤Ä¤¢¤ë¡¥¤Ò¤È¤Ä¤Ï¡¤ÊÖ¤êÃͤ˰ÕÌ£¤¬¤Ê¤¤¤è¤¦¤Ê¡¤Î㤨¤Ð
¥Õ¥¡¥¤¥ë¤Ë½ñ¤¹þ¤ß¤ò¹Ô¤Ê¤¦¤À¤±¤Î¼°¤Ï¡¤unit·¿¤ò»ý¤Ä¡¥
¤½¤Î°ÕÌ£¤Ç¡¤C ¤Ê¤É¤Ë¤ª¤±¤ë void ·¿¤È»÷¤Æ¤¤¤ë2¡¥
¤Þ¤¿¡¤¤â¤¦¤Ò¤È¤Ä¤Ï¡¤(°ÕÌ£¤Î¤¢¤ë)°ú¿ô¤ÎÍפé¤Ê¤¤¼ê³¤¤Ï
unit·¿¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤È¤·¤ÆÉ½¤µ¤ì¤ë¡¥
¤¤¤ï¤æ¤ëÀ°¿ô¡¤…, -2, -1, 0, 1, 2, … ¤Î·¿¤Ç¤¢¤ë¡¥»»½Ñ±é»»¤È¤·¤Æ
»Í§±é»» +, -, *, /, ¾ê;¤òµá¤á¤ë mod ¤Ê¤É¤¬¡¤¤Þ¤¿¡¤¥Ó¥Ã¥È±é»»¤È
¤·¤Æ¼¡¤Î¤è¤¦¤Ê¤â¤Î¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥
-
i land j, i lor
j, i lxor j, lnot i:
¥Ó¥Ã¥ÈËè¤ÎÏÀÍýÀÑ/ÏÀÍýÏÂ/ÇÓ¾ŪÏÀÍýÏÂ/ÏÀÍýŪÈÝÄê¤ò¤È¤ë¡¥
- i lsl j: i ¤Îº¸Êý¸þ¤Ø¤Î
j ¥Ó¥Ã¥È¥·¥Õ¥È (= i * 2(j mod 32))¡¥
- i lsr j: i ¤Î±¦Êý¸þ¤Ø¤Îj¥Ó¥Ã
¥È(ÏÀÍý)¥·¥Õ¥È¡¥(ºÇ¾å°Ì¥Ó¥Ã¥È¤Ë¤Ï¾ï¤Ë0¤¬¤Ï¤¤¤ë¡¥)
- i asr j: i ¤Î±¦Êý¸þ¤Ø¤Îj¥Ó¥Ã
¥È(»»½Ñ)¥·¥Õ¥È¡¥(ºÇ¾å°Ì¥Ó¥Ã¥È¤Ë¤Ï i ¤ÎÀµÉé¤òÊݸ¤¹¤ë¤â¤Î¤¬¤Ï¤¤¤ë¡¥)
(ÉâÆ°¾®¿ôÅÀɽ¸½¤Î)¼Â¿ô¤Î·¿¤Ç¤¢¤ë¡¥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
´Ø¿ô¤Î°ú¿ô¤Î¤Þ¤ï¤ê¤Î () ¤Ï¾Êά²Äǽ¤Ç¤¢¤ë3¡¥¤Þ¤¿¡¤´Ø¿ôŬÍÑ(float_of_int 1) ¤Ï +. ¤Ê¤É¤ÎÆó¹à±é»»»Ò¤è¤ê¤â·ë¹ç¤¬¶¯¤¤¤³¤È¤ËÃí°Õ¡¥
¤³¤ì°Ê³°¤Ë¤â»°³Ñ´Ø¿ô sin, cos, tan, Ê¿Êýº¬ sqrt ¤Ê¤É¤¬ÍѰդµ¤ì
¤Æ¤¤¤ë¡¥¾Ü¤·¤¯¤Ï¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤Î¤³¤È¡¥
ASCII ʸ»ú¤Î·¿¤Ç¡¤Äê¿ô¤È¤·¤Æ°úÍÑÉä ' ¤Ç°Ï¤Þ¤ì¤¿Ê¸»ú¡¤¤â¤·¤¯¤Ïɽ
2.3 ¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹(\" ¤ò½ü¤¯)¡¤
¤Þ¤¿¡¤int·¿¤È¤ÎÊÑ´¹´Ø¿ô char_of_int, int_of_char ¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥
# '\120';;
- : char = 'x'
# int_of_char 'Z';;
- : int = 90
ʸ»úÎó¤Î·¿¤Ç¡¤Äê¿ô¤È¤·¤ÆÆó½Å°úÍÑÉä " ¤Ç°Ï¤Þ¤ì¤¿Ê¸»úÎ󤬻Ȥï¤ì¤ë¡¥
ʸ»úÎóÃæ¤Îʸ»ú¤Ë¤Ï¡¤
\' ¤ò½ü¤¯¡¤É½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¥³¡¼¥É¤È¤¹¤ëʸ»ú |
¿¿µ¶Ãͤò¼¨¤¹·¿¤Ç¡¤ÃÍ¤Ï true (¿¿), false (µ¶)¤ÎÆó¤Ä¤Ç¤¢¤ë¡¥
±é»»¤È¤·¤Æ¡¤
-
not b: b ¤ÎÈÝÄê¤òÊÖ¤¹¡¥
- b1 && b2 ¤Þ¤¿¤Ï b1 &
b2: b1, b2 ¤ÎÏÀÍý
ÀѤòÊÖ¤¹¡¥b1 ¤Îɾ²Á·ë²Ì¤¬ false ¤Î¾ì¹ç¤Ï b2
¤Îɾ²Á¤Ï¹Ô¤ï¤Ê¤¤¡¥
- b1 || b2 ¤Þ¤¿¤Ï b1 or
b2: b1, b2 ¤ÎÏÀÍý
ϤòÊÖ¤¹¡¥b1 ¤Îɾ²Á·ë²Ì¤¬ true ¤Î¾ì¹ç¤Ï b2
¤Îɾ²Á¤Ï¹Ô¤ï¤Ê¤¤¡¥
¤Þ¤¿°Ê²¼¤ÎÈæ³Ó±é»»»Ò¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¡¥¤É¤Î±é»»»Ò¤â
ξÊդη¿¤¬Æ±¤¸¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
-
e1 = e2: ¼°e1, e2 ¤ÎÃÍ
¤¬Åù¤·¤¤¤«È½Äꤹ¤ë¡¥
- e1 <> e2: ¼°e1, e2 ¤ÎÃÍ
¤¬Åù¤·¤¯¤Ê¤¤¾ì¹ç¤Ë¿¿¤òÊÖ¤¹¡¥
- e1 < e2, e1 > e2,
e1 <= e2, e1 >= e2:
e1, e2 ¤ÎÃͤÎÂç¾®Èæ³Ó¤ò¹Ô¤¦¡¥
# (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·¿¤Î¼°¤¬Íè¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥)
Objective Caml ¤Ë¤Ï·¿(type)¤Î³µÇ°¤¬¤¢¤ê¡¤¤³¤ì¤«¤é³Ø¤ó¤Ç¤¤¤¯¤è¤¦¤Ë¸À¸ì¤ÎÂç
¤¤ÊÆÃħ¤Î¤Ò¤È¤Ä¤ò¤Ê¤·¤Æ¤¤¤ë¡¥·¿¤Ï¡¤ºÇ¤âñ½ã¤Ë¤Ï¡¤¾å¤Ç¤ß¤¿ 1 ¤Ï int·¿¤Ë
°¤¹¤ë¤È¤¤¤Ã¤¿¡¤¥×¥í¥°¥é¥àÃæ¤Ç»È¤ï¤ì¤ë¥Ç¡¼¥¿¤ÎʬÎà¤Ç¤¢¤ë¡¥ ¤³¤ÎʬÎà¤Ï¡¤
true ¤Ë²Ã»»¤ò¹Ô¤¦¤Ê¤É¤Î¡¤·¿¥¨¥é¡¼(type error)¤È¸Æ¤Ð¤ì¤ë¡¤¤¢¤ë
¼ï¤Î¡Ö°ÕÌ£¤Î¤Ê¤¤¡×Áàºî¤¬¹Ô¤ï¤ì¤ë¤Î¤òËɤ°¤Î¤ËÍѤ¤¤é¤ì¤ë¡¥·¿¥·¥¹¥Æ¥à(type system)¤È¤¤¤¦ÍѸì¤Ï¡¤¥×¥í¥°¥é¥à¤«¤é·¿¥Á¥§¥Ã¥¯(typecheck)¤Ë
¤è¤ê¡¤·¿¥¨¥é¡¼¤ÎȯÀ¸¤òËɤ®¡¤°ÂÁ´¤Ë¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Î»ÅÁȤߤǡ¤¸À¸ì
¤´¤È¤ËÂ礤¯°Û¤Ê¤Ã¤Æ¤¤¤ë¡¥¤½¤â¤½¤â·¿¥¨¥é¡¼¤¬¤Ê¤ó¤Ç¤¢¤ë¤«¡¤¤È¤¤¤¦¤³¤È¤â¸À¸ì
¤Ë¤è¤Ã¤Æ°ã¤Ã¤Æ¤¯¤ë¤â¤Î¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¡¥Î㤨¤Ð¡¤Â¿¤¯¤Î¸À¸ì¤Ç¤Ï0¤Ç¤Î½ü»»¤Ï
·¿¥¨¥é¡¼¤È¤Ï¸«¤Ê¤µ¤ì¤Ê¤¤¤³¤È¤¬Â¿¤¤¡¥
Lisp, Perl, Postscript ¤Ê¤É¤Î¸À¸ì¤Ç¤Ï¡¤Ê¸Ë¡¤Ë¨¤·¤¿¥×¥í¥°¥é¥à¤Ï¤½¤Î¤Þ¤Þ¼Â¹Ô
¤ò»Ï¤á¤ë¤³¤È¤¬¤Ç¤¤ë¡¥¤½¤Î¤«¤ï¤ê¼Â¹Ô»þ¤Ë¡¤²¿¤«¤ÎÁàºî¤¬¹Ô¤ï¤ì¤ëÅ٤ˡ¤¤½¤ì¤¬
·¿¥¨¥é¡¼¤òµ¯¤¹¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë¡¥¤³¤Î¤è¤¦¤Ê¸À¸ì¤ò¡¤¤·¤Ð¤·¤Ð
ưŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì(dynamically typed language) ¤È¸Æ¤Ö¡¥
¤³¤ì¤ËÂФ·¤Æ¡¤C, C++, Java ¤Ê¤É¤Î¸À¸ì¤Ï¡¤¥³¥ó¥Ñ¥¤¥é¤¬¥×¥í¥°¥é¥à¼Â¹ÔÁ°¤Ë·¿
¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¡¤¤½¤ì¤òÄ̤俤â¤Î¤Î¤ß¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¡¥¤³¤Î¤è¤¦¤Ê¥×¥í¥°¥é
¥à¼Â¹ÔÁ°¤Ë·¿¥Á¥§¥Ã¥¯¤ò¹Ô¤¦¤â¤Î¤ò¡¤ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì(statically typed language)¤È¸Æ¤Ö4¡¥Objective Caml ¤âÀÅ
Ū¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ç¤¢¤ë¡¥
ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ç¤â¡¤C ¤ä C++ ¤Ê¤É¤Ï·¿¥·¥¹¥Æ¥à¤¬¼å¤¯¡¤·¿¥¨¥é¡¼¤ò
´°Á´¤ËËɤ°¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥°ìÈ̤ËÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤Ë¤ª¤¤¤Æ¡¤·¿¥¨¥é¡¼¤ò
µ¯¤¹Áàºî¤Î·ë²Ì¤Ï(¸À¸ì¥ì¥Ù¥ë¤Ç)̤ÄêµÁ
5
¤Ê¤Î¤Ç¡¤C ¤Ê¤É¤Î¥×¥í¥°¥é¥à¤Ï¥¯¥é¥Ã¥·¥å¤·¤Æ
¤·¤Þ¤¦¡¥¤³¤ì¤ËÂФ·¤Æ Objective Caml ¤Ï°ìÅÙ·¿¥Á¥§¥Ã¥¯¤òÄ̤ä¿¥×¥í¥°
¥é¥à¤Ï·¿¥¨¥é¡¼¤òµ¯¤µ¤Ê¤¤À¼Á(°ÂÁ´À)¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¡¥ÀÅŪ¤Ë·¿¤Å¤±¤µ¤ì°ÂÁ´
À¤¬ÊݾڤǤ¤ë¸À¸ì¤ò¶¯¤¯·¿¤Å¤±¤µ¤ì¤¿(strongly typed)¸À¸ì¤È¤¤¤¦¤³
¤È¤¬¤¢¤ë¡¥
°Ê¾å¤ò¡¤¤Þ¤È¤á¤ë¤È°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡¥Æ°Åª¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤ÏɬÁ³Åª¤Ë
Á´¤Æ¤Î°ÂÁ´À¤Î¥Á¥§¥Ã¥¯¤ò¹Ô¤¨¤ë¤Î¤Ç unsafe--dynamically typed ¤ÎÍó¤¬
¶õ¤¤¤Æ¤¤¤ë¡¥
|
statically typed |
dynamically typed |
unsafe |
C, C++, etc. |
--- |
safe |
Java, ML (Objective Caml, Standard ML), Haskell, etc. |
Lisp, Scheme,
Perl, PostScript, etc. |
ÀÅŪ·¿¥·¥¹¥Æ¥à¤Ï¡¤¥×¥í¥°¥é¥à¤ÎʸÌ̤À¤±¤«¤é¡¤¤Ä¤Þ¤ê·×»»Á°¤Î
Ê£»¨¤Ê¼°¤ËÂФ·¤Æ·¿¤ÎÀ°¹çÀ¤òȽÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¤¸«ÀѤâ¤ê¤¬¤É¤¦¤·¤Æ¤â
ÊݼéŪ¤Ë¤Ê¤é¤¶¤ë¤òÆÀ¤Ê¤¤¡¥Î㤨¤Ð
if 〈 Ê£»¨¤Ê¼° 〉 then 1 else "foo"
¤Ï¡¤Î㤨 〈 Ê£»¨¤Ê¼° 〉¤¬¾ï¤Ë true¤òÊÖ¤¹¤è¤¦¤Ê¼°¤Ç¤¢¤Ã¤¿¤È¤·¤¿¤é¡¤
else-À᤬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤¬¤Ê¤¤¤Î¤Ç¡¤À°¿ô¤¬É¬ÍפÊʸ̮¤Ç»ÈÍѤ·¤Æ¤â
¼Â¹Ô»þ¤Ë¤Ï²¿¤ÎÌäÂê¤â¤Ê¤¤¡¥¤·¤«¤·¡¤·¿¥·¥¹¥Æ¥à¤Ï¾ò·ï¼°¤ÎÃͤ˴ط¸¤Ê¤¯¡¤Ê¬
´ôÀè¤Î¼°¤Î·¿¤¬°ìÃפ¹¤ë¤³¤È¤òÍ׵᤹¤ë¡¥¤³¤Î¤¿¤á¡¤·¿¥¨¥é¡¼¤òµ¯¤µ¤º¤Ë¼Â¹Ô¤Ç¤
¤ë¤Ï¤º¤Î¥×¥í¥°¥é¥à¤¬·¿¥Á¥§¥Ã¥¯¤òÄ̤é¤Ê¤¤²ÄǽÀ¤¬¤¢¤ë¡¥¸À¸ìÀ߷׼ԤˤȤäƤÏ
°ÂÁ´¤Ê¥×¥í¥°¥é¥à¤À¤±¤ò¼õÍý¤·¤Ä¤Ä¡¤¤Ç¤¤ë¸Â¤ê¿¤¯¤Î°ÂÁ´¤Ê¥×¥í¥°¥é¥à¤ò¼õÍý¤Ç
¤¤ë¤è¤¦¤Ê·¿¥·¥¹¥Æ¥à¤òÀ߷פ¹¤ë¤Î¤¬¡¤Æ¬¤ÎǺ¤Þ¤»¤É¤³¤í¤Ç¤¢¤ë¡¥
°ìÊý¡¤Æ°Åª¤Ë·¿¤Å¤±¤µ¤ì¤ë¸À¸ì¤ÏÁàºî¤¬¹Ô¤ï¤ì¤ëÅ٤ˡ¤¼Â¹Ô¤¬°ÂÁ´¤Ë¹Ô¤¨¤ë¤«¤É¤¦¤«
¥Á¥§¥Ã¥¯¤ò¤¹¤ë¤Î¤Ç¡¤¥Á¥§¥Ã¥¯¤ò¤Þ¤¸¤á¤Ë¤ä¤ë¸Â¤ê°ÂÁ´¤Ë¼Â¹Ô¤Ç¤¤ë¤â¤Î¤Î¡¤
¥Á¥§¥Ã¥¯¤Î¥³¥¹¥È¤ò;·×¤Ëʧ¤¦¤³¤È¤Ë¤Ê¤ë¡¥
Exercise 1 ¼¡¤Î¼°¤Î·¿¤Èɾ²Á·ë²Ì¤Ï?
-
float_of_int 3 +. 2.5
- int_of_float 0.7
- if "11" > "100" then "foo" else "bar"
- char_of_int ((int_of_char 'A') + 20)
- int_of_string "0xff"
- 5.0 ** 2.0
Exercise 2 ¼¡¤Î¼°¤Ï¸í¤Ã¤¿¼°(ʸˡ¥¨¥é¡¼¡¤·¿¥¨¥é¡¼¡¤Îã³°¤òȯÀ¸¤¹¤ë)¤Ç¤¢¤ë¡¥¤Þ¤º¡¤¤É¤³¤¬
¸í¤ê¤«¤ò»î¤µ¤º¤ËͽÁÛ¤»¤è¡¥
¼¡¤Ë¡¤¥³¥ó¥Ñ¥¤¥é¤Ç¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò³Îǧ¤·¡¤Åö½éͽÁÛ¤·¤¿Íýͳ¤È
¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤È°ã¤¦¾ì¹ç¡¤¥³¥ó¥Ñ¥¤¥é¤Î²ò¼á¤·¤¿¸í¤ê¤ÎÍýͳ¤òÀâÌÀ¤»¤è¡¥
-
if true&&false then 2
- 8*-2
- int_of_string "0xfg"
- int_of_float -0.7
Exercise 3 ¼¡¤Î¼°¤Ï¡¤³ç¸Ì¤ÎÉÕ¤Êý¤¬¤ª¤«¤·¤¤¡¤¤â¤·¤¯¤Ï·¿ÊÑ´¹´Ø¿ô¤òÆþ¤ì˺¤ì¤¿¤¿¤á¡¤·¿
¥¨¥é¡¼¤¬È¯À¸¤¹¤ë¡¤¤â¤·¤¯¤Ï´üÂÔ¤·¤¿·ë²Ì¤Ëɾ²Á¤µ¤ì¤Ê¤¤¡¥³Æ¼°¤ò¤É¤¦Ä¾¤»¤Ð¡¤
⇒ ¤Î¸å¤Ë¼¨¤¹´üÂÔ¤·¤¿·ë²Ì¤Ëɾ²Á¤µ¤ì¤ë¤«¡¥
-
not true && false ⇒ true
- float_of_int int_of_float 5.0 ⇒ 5.0
- sin 3.14 /. 2.0 ** 2.0 +. cos 3.14 /. 2.0 ** 2.0 ⇒ 1.0
- sqrt 3 * 3 + 4 * 4 ⇒ 5 (À°¿ô)
Exercise 4 ¼° b1 && b2 ¤ò¡¤if-¼°¤È true, false,
b1, b2 ¤Î¤ß¤òÍѤ¤¤Æ¡¤Æ±¤¸°ÕÌ£¤Ë¤Ê¤ë¤è¤¦¤Ë½ñ¤Ä¾¤»¡¥
¼° b1 || b2 ¤âƱÍͤ˽ñ¤Ä¾¤»¡¥
Á°Àá¤Ç³Ø¤ó¤À¤Î¤Ï´Êñ¤ÊÁàºî¤òÁȤ߹ç¤ï¤»¤Æ¡¤Ê£»¨¤Ê·×»»¤ò¹Ô¤¦¼°¤òÁȤßΩ¤Æ¤ëÊý
Ë¡¤Ç¤¢¤ë¡¥·×»»¤·¤¿·ë²Ì¤ÎÃͤˤÏ̾Á°¤ò¤Ä¤±¤Æ¤ª¤¤¤Æ¤¢¤È¤Ç»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤³¤ì¤ò¹Ô¤¦¤Î¤¬ 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
¤òɾ²Á¤·¤¿Ã͡פË«Çû¤¹¤ë¡¥ÊÑ¿ô¤òÀë¸À¤¹¤ë¤³¤È¤Ë¤Ï¡¤
-
̾Á°¤ò¤Ä¤±¤ë¤³¤È¤Ë¤è¤ê¡¤·×»»·ë²Ì¤òÃê¾Ý²½(abstraction)¤¹¤ë¤³
¤È¤¬¤Ç¤¤ë¡¥¤Þ¤¿Ì¾Á°¤Ë¤è¤ê¥×¥í¥°¥é¥à¤Î°ÕÌ£¤òÌÀ¤é¤«¤Ë¤·¡¤´Ö°ã¤¤¤ò¸º¤é¤¹¡¥
- ¤¢¤ë·×»»·ë²Ì¤ò²¿ÅÙ¤â»È¤¦ºÝ¤Ë¡¤·ë²Ì¤Ë̾Á°¤ò¤Ä¤±¤ë¤³¤È¤Ç¡¤·×»»¤ò¤ä¤êľ
¤¹¤³¤È¤Ê¤¯ºÆÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
¤È¤¤¤Ã¤¿°ÕµÁ¤¬¤¢¤ë¡¥¤Ò¤È¤Ä¤á¤Î´ÑÅÀ¤«¤é¸À¤¨¤Ð¡¤Ê¬¤«¤ê¤Ë¤¯¤¤ÊÑ¿ô̾¤ò
¤Ä¤±¤ë¤³¤È¤ÏÈò¤±¤ë¤Ù¤¤Ç¤¢¤ê¡¤¤¿¤È¤¨°ì»þŪ¤Ë¤·¤«»È¤ï¤Ê¤¤ÊÑ¿ô¤Ç¤â
°ÕÌ£¤òÈ¿±Ç¤·¤¿Ì¾Á°¤ò¤Ä¤±¤ë¤Ù¤¤Ç¤¢¤ë¡¥¤Õ¤¿¤Ä¤á¤Ë´Ø¤·¤ÆÊ䤷¤Æ¤ª¤¯¤È¡¤
ÊÑ¿ô¤¬Â«Çû¤µ¤ì¤ëÂоݤϷ׻»·ë²Ì¤ÎÃͤǤ¢¤Ã¤Æ¡¤¼°¼«ÂΤǤϤʤ¤¤³¤È¤ËÃí°Õ¡¥
¾å¤Ç¡¤¡Ö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" ¤Ë¹¹¿·¤µ¤ì¤¿¤ï¤±¤Ç¤Ï¤Ê¤¯¡¤
Ʊ¤¸Ì¾Á°¤ÎÊÑ¿ôÀë¸À¤Ë¤è¤êÁ°¤ÎÀë¸À¤¬±£¤µ¤ì¤Æ¸«¤¨¤Ê¤¯¤Ê¤Ã¤¿¤À¤±¤Ê¤Î¤Ç¤¢¤ë¡¥
¤½¤â¤½¤âÁ°¤ÎÀë¸À¤È·¿¤¬°ìÃפ·¤Æ¤¤¤Ê¤¤¤³¤È¤ËÃí°Õ¡¥
ÊÑ¿ô¤Î¤Ò¤È¤Ä¤Ò¤È¤Ä¤Î»ÈÍѤËÂФ·¤Æ¡¤¤½¤ÎÄêµÁ¤Ï¡¤(°ÊÁ°¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ëʪ¤Ç)ºÇ
¤â¶á¤¤¤â¤Î¤¬»²¾È¤µ¤ì¤ë¡¥Ê̤θÀ¤¤Êý¤ò¤¹¤ë¤È¡¤¡ÖletÀë¸À¤Î͸úÈϰÏ(scope)¤Ï(ºÆÀë¸À¤Ç±£¤µ¤ì¤Ê¤¤¸Â¤ê)Àë¸À°Ê¹ß¡¤¥Õ¥¡¥¤¥ë(ocaml ¥»¥Ã¥·¥ç¥ó)½ªÎ»
¤Þ¤Ç¡×¤È¤¤¤ï¤ì¤ë¡¥¤³¤Î¤è¤¦¤ÊÄêµÁ¤Î»²¾È¤Î»ÅÊý¤òÀÅŪ͸úÈϰÏ(
lexical scope, static scope) ¤È¸Æ¤Ö¡¥
¤È¤³¤í¤Ç¡¤Objective Caml ¤Ç¤ÏÊÑ¿ô¤Î·¿¤Ï¥³¥ó¥Ñ¥¤¥é¤¬¼«Æ°Åª¤Ë¿äÏÀ¤·¤Æ¤¯¤ì¤ë¤¿
¤á¡¤Àë¸À¤¹¤ëɬÍפ¬¤Ê¤¤¡¥¤¿¤À¡¤¥×¥í¥°¥é¥à¤Î°ÕÌ£¤ò¤ï¤«¤ê¤ä¤¹¤¯¤¹¤ë¤¿¤á¡¤
¥Ç¥Ð¥Ã¥°¤Î¤¿¤á¡¤ÊÑ¿ô¤Î·¿¤òÌÀ¼¨Åª¤Ë¼¨¤·¤Æ¤ª¤¤¿¤¤¤È¤¤Ï¡¤ÊÑ¿ô̾¤Î¸å¤Ë
``: 〈 ·¿ 〉'' ¤È¤·¤ÆÀë¸À¤¹¤ë¤³¤È¤â¤Ç¤¤ë¡¥¤Þ¤¿¡¤Ê£¿ô¤Îlet-Àë
¸À¤Ï¤½¤Î¶Ìܤ¬¤Ï¤Ã¤¤ê¤·¤Æ¤¤¤ë(¼¡¤Î let ¤¬Íè¤ëľÁ°¤ÇÀÚ¤ì¤ë)¤Î¤Ç´Ö¤Ë
;; ¤ò¤Ä¤±¤º¤Ëʤ٤뤳¤È¤¬¤Ç¤¤ë¡¥
# let pi : float = 3.1415926535
# let e = 2.718281828;;
val pi : float = 3.1415926535
val e : float = 2.718281828
Æó¤Ä¤ÎÀë¸À¤¬¤Þ¤È¤á¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ·ë²Ì¤¬¤Þ¤È¤Þ¤Ã¤Æ½ÐÎϤµ¤ì¤Æ¤¤¤ë¤³¤È¤ËÃíÌÜ¡¥
ÊÑ¿ô¤Î̾Á°
ÊÑ¿ô¤Î̾Á°¤È¤·¤ÆÍѤ¤¤ë¤³¤È¤¬¤Ç¤¤ë¤Î¤Ï¡¤
-
°ìʸ»úÌܤ¬±Ñ¾®Ê¸»ú¤Þ¤¿¤Ï¥¢¥ó¥À¡¼¥¹¥³¥¢ (_) ¤Ç¡¤
- Æóʸ»úÌܰʹߤϱѿô»ú(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 |
´Ä¶¤È lexical scoping |
|
¤³¤³¤Ç¹â¥ì¥Ù¥ë¤Ê¼°¤Î°ÕÌ£¤òÎ¥¤ì¤Æ¡¤Ì¾Á°»²¾È¤¬¤É¤Î¤è¤¦¤Ë¼Â¸½¤µ¤ì¤Æ¤¤¤ë¤«¤ò¤ß
¤Æ¤ß¤ë¡¥¥×¥í¥°¥é¥à¤Î¼Â¹ÔÃæ¤Ë¤Ï¡¤¼Â¹Ô¤·¤Æ¤¤¤ë»þÅÀ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë(͸úÈϰϤË
¤¢¤ë)ÊÑ¿ô̾¤È¤½¤ÎÃͤÎÁȤΥꥹ¥È¤¬¥á¥â¥ê¾å¤ËÊݸ¤µ¤ì¤Æ¤¤¤ë¡¥¤³¤Î¥Ç¡¼¥¿¤Î¤³¤È
¤ò´Ä¶(environment)¤È¤¤¤¦¡¥ÆÃ¤Ë¡¤¥×¥í¥°¥é¥à¤Î°ìÈÖ³°Â¦¤Ë¤ª¤±¤ë´Ä¶
¤ò¥È¥Ã¥×¥ì¥Ù¥ë´Ä¶(top-level environment)¡¤¤Þ¤¿¤ÏÂç°è´Ä
¶(global environment)¤È¤¤¤¦¡¥
Î㤨¤Ð¡¤ocaml ¤òµ¯Æ°¤·¤¿¤È¤¤Ë¤Ï¡¤sin, max_int ¤Ê¤É¤Î̾Á°¤¬Âç°è´Ä¶¤Ë
¤¢¤ë¾õÂ֤ǥ»¥Ã¥·¥ç¥ó¤¬»Ï¤Þ¤ë(¿Þ2.1)¡¥
ÊÑ¿ô̾ |
ÃÍ |
⋮ |
⋮ |
⋮ |
⋮ |
sin |
Àµ¸¹´Ø¿ô |
max_int |
1073741823 |
⋮ |
⋮ |
Figure 2.1: ocaml µ¯Æ°»þ¤ÎÂç°è´Ä¶
letÀë¸À¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë¤Ï¡¤¤³¤Î¥È¥Ã¥×¥ì¥Ù¥ë´Ä¶¤ÎºÇ¸å¤Ë¡¤¿·¤·¤¤ÊÑ¿ô
¤È¤½¤ÎÃͤÎÁȤ¬Äɲ䵤ì¤ë(¿Þ2.2) ¡¥ÊÑ¿ô¤Î»²¾È¤Ï¡¤¤³¤Î´Ä¶¤ò²¼¤«¤é
½çÈÖ¤ËÊÑ¿ô¤òõ¤·¤Æ¹Ô¤¯Áàºî¤ËÂбþ¤¹¤ë¡¥¤½¤Î¤¿¤á¡¤Æ±¤¸Ì¾Á°¤ÎÊÑ¿ô¤¬ºÆÄêµÁ¤µ¤ì
¤¿¾ì¹ç¡¤¾å¤Î¥¨¥ó¥È¥ê¤Ëõº÷¤¬Åþ㤷¤Ê¤¤¤¿¤á¤Ë»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤¤Ê¤¯¤Ê¤ë¡¥
Âç°è´Ä¶¤«¤é¥¨¥ó¥È¥ê¤¬ºï½ü¤µ¤ì¤ë¤³¤È¤Ï¤Ê¤¤¡¥
¤½¤Î¤¿¤áletÀë¸À¤Î͸úÈϰϤÏÀë¸Àľ¸å¤«¤é¥×¥í¥°¥é¥à½ªÎ»¤Þ¤Ç¤Ê¤Î¤Ç¤¢¤ë¡¥
ÊÑ¿ô̾ |
ÃÍ |
⋮ |
⋮ |
⋮ |
⋮ |
one |
1 |
two |
2 |
one |
"One" |
three |
"OneOneOne" |
Figure 2.2: letÀë¸À¼Â¹Ô¸å¤ÎÂç°è´Ä¶
Exercise 5 ¼¡¤Î¤¦¤ÁÊÑ¿ô̾¤È¤·¤ÆÍ¸ú¤Ê¤â¤Î¤Ï¤É¤ì¤«¡¥¼ÂºÝ¤Ë let Àë¸À¤ËÍѤ¤¤Æ³Î¤«¤á¤è¡¥
a_2' ____ Cat _'_'_
7eleven 'ab2_ _
¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤·×»»¼ê½ç¤Ë̾Á°¤ò¤Ä¤±¤ÆÃê¾Ý²½¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
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 f 〈 parameter 〉 [: t] = e
¤¿¤À¤· 〈 parameter 〉 ::= x | (x: t)
¤È¤Ê¤ë6¡¥
[ ] Éôʬ¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ë¡¥f ¤Ï´Ø¿ô̾¤òɽ¤¹¥á¥¿ÊÑ¿ô¡¤
t ¤Ï·¿¤òɽ¤¹¥á¥¿ÊÑ¿ô¤Ç¤¢¤ë¡¥
´Ø¿ô̾¡¦¥Ñ¥é¥á¡¼¥¿Ì¾¤È¤·¤Æµö¤µ¤ì¤ë̾Á°¤ÏÊÑ¿ô¤Î¾ì¹ç¤ÈƱ¤¸¤Ç¤¢¤ë¡¥
(¼Â¤Ï¡¤ÊÑ¿ô̾¡¤´Ø¿ô̾¡¤¥Ñ¥é¥á¡¼¥¿Ì¾¤ò¶èÊ̤¹¤ëɬÍפϤʤ¤¡¥)
ÃͤÎ̾Á°¤ÈƱ¤¸¤è¤¦¤Ë¡¤´Ø¿ô̾¡¦¥Ñ¥é¥á¡¼¥¿Ì¾¤â¤ï¤«¤ê¤ä¤¹¤¤¤â¤Î¤ò¤Ä¤±¡¤
´Ø¿ô¤¬²¿¤ò·×»»¤¹¤ë¤Î¤«¡¤¥³¥á¥ó¥È¤ò½ñ¤¯Êʤò¤Ä¤±¤¿¤¤¡¥
lexical scoping ¤Ë¤Ä¤¤¤ÆÊäÂ
´Ø¿ôËÜÂÎÃæ¤Î pi ¤Ï¡¤lexical scoping ¤Ë¤è¤Ã¤Æ¡¤
´Ø¿ôÀë¸À¤ÎľÁ°¤ËÀë¸À¤µ¤ì¤¿¤â¤Î¤¬»²¾È¤µ¤ì¤ë¡¥¤½¤Î¤¿¤á¡¤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) ¤Ë¤Ê¤ë¡¥
Exercise 6 ¼¡¤Î´Ø¿ô¤òÄêµÁ¤»¤è¡¥¼Â¿ô¤ÎÀÚ¤ê¼Î¤Æ¤ò¹Ô¤¦´Ø¿ô floor ¤òÍѤ¤¤Æ¤è¤¤¡¥
-
US¥É¥ë(¼Â¿ô)¤ò¼õ¤±¼è¤Ã¤Æ±ß(À°¿ô)¤Ë´¹»»¤¹¤ë´Ø¿ô(¤¿¤À¤·1±ß°Ê²¼»Í¼Î¸ÞÆþ)¡¥
(ÆþÎϤϾ®¿ôÅÀ°Ê²¼2·å¤Ç½ª¤ï¤ë¤È¤¤ËƯ¤±¤Ð¤è¤¤¡¥)¥ì¡¼¥È¤Ï 1$ = 110.35 ±ß¤È¤¹
¤ë¡¥
- ±ß(À°¿ô)¤ò¼õ¤±¼è¤Ã¤Æ¡¤US¥É¥ë(¥»¥ó¥È°Ê²¼¤ò¾®¿ô¤Ë¤·¤¿¼Â¿ô)¤Ë´¹»»
¤¹¤ë´Ø¿ô(¤¿¤À¤·1¥»¥ó¥È°Ê²¼»Í¼Î¸ÞÆþ)¡¥¥ì¡¼¥È¤Ï 1$ = 110.35 ±ß¤È¤¹
¤ë¡¥
- US¥É¥ë(¼Â¿ô)¤ò¼õ¤±¼è¤Ã¤Æ¡¤Ê¸»úÎó "〈 ¥É¥ë 〉 dollars are
〈 ±ß 〉 yen." ¤òÊÖ¤¹´Ø¿ô¡¥
- ʸ»ú¤ò¼õ¤±¼è¤Ã¤Æ¡¤¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¤Î¾®Ê¸»ú¤Ê¤éÂçʸ»ú¤Ë¡¤¤½¤Î¾¤Îʸ
»ú¤Ï¤½¤Î¤Þ¤ÞÊÖ¤¹´Ø¿ô capitalize¡¥(Îã: capitalize 'h'
⇒ 'H', capitalize '1' ⇒ '1')
- 1
- ¤³¤Î¼ê½ç¤ò read-eval-print ¥ë¡¼¥×¤È¸Æ¤Ð¤ì¤ë¤³¤È¤â¤¢¤ë¡¥
- 2
- ¤¿¤À¤· C ¤Î void ·¿¤Ï¤½¤ì¤Ë°¤¹¤ëÃͤò¤â¤¿¤Ê¤¤¡¥
- 3
- ML ¤Îήµ·¤È¤·¤Æ¤Ï
°ú¿ô¤Î¤Þ¤ï¤ê¤Î()¤Ï(²Äǽ¤Ê¾ì¹ç¤Ï)¾Êά¤µ¤ì¤ë¡¥¤Ò¤È¤Ä¤Ë¤Ï¿ô³ØÅª¤ÊµË¡
¤Ë¤è¤ê¶á¤¤(sin(θ) ¤È¤Ï;¤ê½ñ¤«¤Ê¤¤¤Ç¤¹¤Í¡©)¤È¤¤¤¦¤³¤È¤«¤é
¤Ç¤¢¤ë¡¥¼°¤¬Ê£»¨¤Ç¤É¤¦·ë¹ç¤¹¤ë¤«¤ï¤«¤ê¤Ë¤¯¤¤¾ì¹ç¤Ë¤Ï¡¤¾å¤ÎºÇ¸å¤ÎÎã¤Î
¤è¤¦¤Ë´Ø¿ô¸Æ¤Ó½Ð¤·Á´ÂΤò()¤Ç³ç¤ë¡¥
- 4
- ¥³¥ó¥Ñ¥¤¥ë¤ÈÀÅŪ¤Ê·¿¤Å¤±¤Î´Ö¤ËľÀܤδط¸¤Ï¤Ê¤¤¡¥
Lisp ¤ÏưŪ¤Ë¥Á¥§¥Ã¥¯¤¬¹Ô¤ï¤ì¤ë¤¬¥³¥ó¥Ñ¥¤¥é¤¬Â¸ºß¤¹¤ë¤·¡¤
¥¤¥ó¥¿¥×¥ê¥¿¼Â¹Ô¤¹¤ë¸À¸ì¤ËÀÅŪ·¿¥·¥¹¥Æ¥à¤òƳÆþ¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
- 5
- Àè¤Ë¸«¤¿ 0 ¤Ç¤Î½ü»»¤Ï¡¤·¿¥¨¥é¡¼¤Ç¤Ï¤Ê¤¤¤È¤·¤¿¤¬¡¤
(Objective Caml¤Ç¤Ï)¤½¤Î·ë²Ì¤¬¸À¸ìÆâ¤Î³µÇ°¤Ç¤¢¤ëÎã³°¤ÎȯÀ¸¤È¤·¤Æ
ÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¤¤·¤«¤â¼Â¹ÔÃæ¤Ë¤½¤ÎȯÀ¸¤ò¸¡ÃΤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¡¥
(C ¤Ç¤Ï OS ¤Î½õ¤±¤ò¼Ú¤ê¤Ê¤¤¤È¡¤0¤Ç¤Î½ü»»¤ÎȯÀ¸¤ò¸¡ÃΤ¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡¥)
- 6
- ¥Æ¥¥¹¥È¤òÄ̤¸¤Æ´Ø¿ôÀë¸À¤Îʸˡ¤Ï½ù¡¹¤Ë³ÈÂ礵¤ì¤Æ¤¤¤¯¡¥