FunDecl.sml 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. structure FunDecl =
  2. struct
  3. open SMLUnit.Test SMLUnit.Assert
  4. fun testFunDecl () =
  5. let
  6. exception Exn1
  7. fun f1 x = x
  8. fun f2 x:int = 1
  9. fun f3 x:'a = x
  10. fun f4 x:''a = x
  11. fun f5 (x:int) = x:int
  12. fun f6 (x:'a) = x
  13. fun f7 (x:''a) = x
  14. fun (f8:int -> int) x = x
  15. fun (f9:'a -> 'a) x = x
  16. fun (f10:''a -> ''a) x = x
  17. fun (f11:'a -> 'a) x:'a = x
  18. fun (f12:'a -> 'a) x:'a = x:'a
  19. fun (f13:'a -> int) x = 1
  20. fun (f14:'a -> 'b) x = raise Exn1
  21. val _ = assertEqualInt 1 (f1 1)
  22. val _ = assertEqualInt 1 (f2 1)
  23. val _ = assertEqualInt 1 (f3 1)
  24. val _ = assertEqualInt 1 (f4 1)
  25. val _ = assertEqualInt 1 (f5 1)
  26. val _ = assertEqualInt 1 (f6 1)
  27. val _ = assertEqualInt 1 (f7 1)
  28. val _ = assertEqualInt 1 (f8 1)
  29. val _ = assertEqualInt 1 (f9 1)
  30. val _ = assertEqualInt 1 (f10 1)
  31. val _ = assertEqualInt 1 (f11 1)
  32. val _ = assertEqualInt 1 (f12 1)
  33. val _ = assertEqualInt 1 (f13 1)
  34. val _ = assertEqualInt 1 ((f14 1) handle Exn => 1)
  35. in
  36. ()
  37. end
  38. fun testFunDeclRec () =
  39. let
  40. fun f1 x = if x < 3 then x + f1 (x + 1) else x
  41. val _ = assertEqualInt 6 (f1 1)
  42. in
  43. ()
  44. end
  45. fun testFunDeclTailRec () =
  46. let
  47. fun f1 (x, y) = if x < 3 then f1 (x + 1, x + y) else x + y
  48. val _ = assertEqualInt 6 (f1 (1, 0))
  49. in
  50. ()
  51. end
  52. fun testFunDeclRecType () =
  53. let
  54. fun f x = f 1
  55. fun f x = f x
  56. fun f x : 'a = f x
  57. fun f x : ''a = f x
  58. fun f (x:int) = f 1
  59. fun f (x:'a) = f x
  60. fun f (x:''a) = f x
  61. fun f (x:'a) : 'a = f x
  62. fun f (x:''a) : ''a = f x
  63. fun f (x:'a) : 'b = f x
  64. fun f (x:''a) : ''b = f x
  65. in
  66. ()
  67. end
  68. fun testFunDeclPatInt () =
  69. let
  70. fun f1 1 = "A"
  71. | f1 2 = "B"
  72. | f1 ~1 = "C"
  73. | f1 _ = "D"
  74. val _ = assertEqualString "A" (f1 1)
  75. val _ = assertEqualString "B" (f1 2)
  76. val _ = assertEqualString "C" (f1 ~1)
  77. val _ = assertEqualString "D" (f1 3)
  78. in
  79. ()
  80. end
  81. fun testFunDeclPatWord () =
  82. let
  83. fun f1 0w1 = "A"
  84. | f1 0w2 = "B"
  85. | f1 _ = "C"
  86. val _ = assertEqualString "A" (f1 0w1)
  87. val _ = assertEqualString "B" (f1 0w2)
  88. val _ = assertEqualString "C" (f1 0w3)
  89. in
  90. ()
  91. end
  92. fun testFunDeclPatString () =
  93. let
  94. fun f1 "A" = 1
  95. | f1 "B" = 2
  96. | f1 _ = 3
  97. val _ = assertEqualInt 1 (f1 "A")
  98. val _ = assertEqualInt 2 (f1 "B")
  99. val _ = assertEqualInt 3 (f1 "C")
  100. in
  101. ()
  102. end
  103. fun testFunDeclPatExn () =
  104. let
  105. exception Exn1
  106. exception Exn2 of int
  107. exception Exn3
  108. fun f1 Exn1 = 1
  109. | f1 (Exn2 n) = n
  110. | f1 _ = 3
  111. val _ = assertEqualInt 1 (f1 Exn1)
  112. val _ = assertEqualInt 2 (f1 (Exn2 2))
  113. val _ = assertEqualInt 3 (f1 Exn3)
  114. in
  115. ()
  116. end
  117. fun testFunDeclPatTuple () =
  118. let
  119. fun f1 (x, y) = x
  120. fun f2 (x:'a, y:'b) = x
  121. fun f3 (x:'a, y:'b) = x : 'a
  122. fun f4 (x:''a, y:''b) = x
  123. fun f5 (x:''a, y:''b) = x : ''a
  124. fun f6 ((x, y) : 'a * 'b) = x
  125. fun f7 ((x, y) : 'a * 'b) = x : 'a
  126. fun f8 ((x:'a, y:'b) : 'a * 'b) = x
  127. fun f9 ((x, y) : ''a * ''b) = x
  128. fun f10 ((x, y) : ''a * ''b) = x : ''a
  129. fun f11 ((x:''a, y:''b) : ''a * ''b) = x
  130. val _ = assertEqualInt 1 (f1 (1, "A"))
  131. val _ = assertEqualInt 1 (f2 (1, "A"))
  132. val _ = assertEqualInt 1 (f3 (1, "A"))
  133. val _ = assertEqualInt 1 (f4 (1, "A"))
  134. val _ = assertEqualInt 1 (f5 (1, "A"))
  135. val _ = assertEqualInt 1 (f6 (1, "A"))
  136. val _ = assertEqualInt 1 (f7 (1, "A"))
  137. val _ = assertEqualInt 1 (f8 (1, "A"))
  138. val _ = assertEqualInt 1 (f9 (1, "A"))
  139. val _ = assertEqualInt 1 (f10 (1, "A"))
  140. val _ = assertEqualInt 1 (f11 (1, "A"))
  141. in
  142. ()
  143. end
  144. fun testFunDeclPatRecord () =
  145. let
  146. fun f1 {A = v1, B = v2} = v1
  147. fun f2 {A = _, B = _} = 2
  148. fun f3 {...} = 3
  149. fun f4 _ = 4
  150. fun f5 {A, B} = A
  151. fun f6 {A = v1, ...} = v1
  152. val _ = assertEqualInt 1 (f1 {A=1, B="A"})
  153. val _ = assertEqualInt 2 (f2 {A=1, B="A"})
  154. val _ = assertEqualInt 3 (f3 {A=1, B="A"})
  155. val _ = assertEqualInt 4 (f4 {A=1, B="A"})
  156. val _ = assertEqualInt 1 (f5 {A=1, B="A"})
  157. val _ = assertEqualInt 1 (f6 {A=1, B="A"})
  158. in
  159. ()
  160. end
  161. fun testFunDeclPatDatatype() =
  162. let
  163. datatype d1 = A
  164. | B
  165. datatype d2 = C of int
  166. | D of string
  167. fun f1 A = 1
  168. | f1 B = 2
  169. fun f2 (C n) = n
  170. | f2 (D "A") = 4
  171. | f2 (D _) = 5
  172. val _ = assertEqualInt 1 (f1 A)
  173. val _ = assertEqualInt 2 (f1 B)
  174. val _ = assertEqualInt 3 (f2 (C 3))
  175. val _ = assertEqualInt 4 (f2 (D "A"))
  176. val _ = assertEqualInt 5 (f2 (D "B"))
  177. in
  178. ()
  179. end
  180. fun testFunDeclTyvar () =
  181. let
  182. exception Exn1
  183. fun 'a f1 x:'a = x
  184. fun ''a f2 x:''a = x
  185. fun 'a f3 (x:'a) = x
  186. fun ''a f4 (x:''a) = x
  187. fun 'a (f5:'a -> 'a) x = x
  188. fun ''a (f6:''a -> ''a) x = x
  189. fun 'a (f7:'a -> 'a) x:'a = x
  190. fun 'a (f8:'a -> 'a) x:'a = x:'a
  191. fun 'a (f9:'a -> int) x = 1
  192. fun 'a (f10:'a -> 'b) x = raise Exn1
  193. val _ = assertEqualInt 1 (f1 1)
  194. val _ = assertEqualInt 1 (f2 1)
  195. val _ = assertEqualInt 1 (f3 1)
  196. val _ = assertEqualInt 1 (f4 1)
  197. val _ = assertEqualInt 1 (f5 1)
  198. val _ = assertEqualInt 1 (f6 1)
  199. val _ = assertEqualInt 1 (f7 1)
  200. val _ = assertEqualInt 1 (f8 1)
  201. val _ = assertEqualInt 1 (f9 1)
  202. val _ = assertEqualInt 1 ((f10 1) handle Exn => 1)
  203. in
  204. ()
  205. end
  206. fun testFunDeclTyvarSeq () =
  207. let
  208. fun ('a, 'b) f1 x:'a * 'b = x
  209. fun ('a, 'b) f2 (x:'a) y =
  210. let
  211. fun g z:'b = z
  212. in
  213. g y
  214. end
  215. fun (''a, ''b) f3 (x1:''a) (x2:''a) (y1:''b) (y2:''b) =
  216. ((x1 = x2), (y1 = y2))
  217. val _ = assertTrue ((1, "A") = (f1 (1, "A")))
  218. val _ = assertEqualInt 1 (f2 "A" 1)
  219. val _ = assertTrue ((true, false) = (f3 1 1 "A" "B"))
  220. in
  221. ()
  222. end
  223. fun testFunDeclAnd () =
  224. let
  225. fun f1 x = x
  226. and f2 x = x + 1
  227. fun f3 x = fail "NG"
  228. fun f4 x = fail "NG"
  229. fun f3 x = if 3 <= x then "A" else f4 x
  230. and f4 x = f3 (x + 1)
  231. fun f5 x = if 3 <= x then "A" else f6 x
  232. and f6 x =
  233. let
  234. fun f5 x = "B"
  235. in
  236. f5 (x + 1)
  237. end
  238. val _ = assertEqualString "A" (f1 "A")
  239. val _ = assertEqualInt 2 (f2 1)
  240. val _ = assertEqualString "A" (f3 1)
  241. val _ = assertEqualString "A" (f4 1)
  242. val _ = assertEqualString "B" (f5 1)
  243. val _ = assertEqualString "B" (f6 1)
  244. in
  245. ()
  246. end
  247. fun testFunDeclAndTyvar () =
  248. let
  249. fun 'a f1 (x:'a) = x
  250. and f2 (x:'a) = x
  251. val _ = assertEqualString "A" (f1 "A")
  252. val _ = assertEqualString "A" (f2 "A")
  253. val _ = assertEqualInt 1 (f1 1)
  254. val _ = assertEqualInt 1 (f2 1)
  255. in
  256. ()
  257. end
  258. val tests = TestList [
  259. Test ("testFunDecl", testFunDecl),
  260. Test ("testFunDeclTailRec", testFunDeclTailRec),
  261. Test ("testFunDeclRecType", testFunDeclRecType),
  262. Test ("testFunDeclRec", testFunDeclRec),
  263. Test ("testFunDeclPatInt", testFunDeclPatInt),
  264. Test ("testFunDeclPatWord", testFunDeclPatWord),
  265. Test ("testFunDeclPatString", testFunDeclPatString),
  266. Test ("testFunDeclPatExn", testFunDeclPatExn),
  267. Test ("testFunDeclPatTuple", testFunDeclPatTuple),
  268. Test ("testFunDeclPatRecord", testFunDeclPatRecord),
  269. Test ("testFunDeclPatDatatype", testFunDeclPatDatatype),
  270. Test ("testFunDeclTyvar", testFunDeclTyvar),
  271. Test ("testFunDeclTyvarSeq", testFunDeclTyvarSeq),
  272. Test ("testFunDeclAnd", testFunDeclAnd),
  273. Test ("testFunDeclAndTyvar", testFunDeclAndTyvar)
  274. ]
  275. end