Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /trunk/src/compiler/typechecker/typechecker.sml
ViewVC logotype

Diff of /trunk/src/compiler/typechecker/typechecker.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 381, Tue Oct 5 21:42:17 2010 UTC revision 475, Thu Nov 4 18:57:11 2010 UTC
# Line 1  Line 1 
1  (* typechecker.sml  (* typechecker.sml
2   *   *
3   * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu)   * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4   * All rights reserved.   * All rights reserved.
5   *   *
6   *)   *)
# Line 150  Line 150 
150                  in                  in
151                    case (ty1, ty2)                    case (ty1, ty2)
152                     of (Ty.T_Bool, Ty.T_Bool) =>                     of (Ty.T_Bool, Ty.T_Bool) =>
153                          (AST.E_Cond(e1', AST.E_Lit(Literal.Bool true), e2'), Ty.T_Bool)                          (AST.E_Cond(e1', AST.E_Lit(Literal.Bool true), e2', Ty.T_Bool), Ty.T_Bool)
154                      | _ => err (cxt, [S "arguments to \"||\" must have bool type"])                      | _ => err (cxt, [S "arguments to \"||\" must have bool type"])
155                    (* end case *)                    (* end case *)
156                  end                  end
# Line 160  Line 160 
160                  in                  in
161                    case (ty1, ty2)                    case (ty1, ty2)
162                     of (Ty.T_Bool, Ty.T_Bool) =>                     of (Ty.T_Bool, Ty.T_Bool) =>
163                          (AST.E_Cond(e1', e2', AST.E_Lit(Literal.Bool false)), Ty.T_Bool)                          (AST.E_Cond(e1', e2', AST.E_Lit(Literal.Bool false), Ty.T_Bool), Ty.T_Bool)
164                      | _ => err (cxt, [S "arguments to \"&&\" must have bool type"])                      | _ => err (cxt, [S "arguments to \"&&\" must have bool type"])
165                    (* end case *)                    (* end case *)
166                  end                  end
# Line 171  Line 171 
171                    case checkExpr(env, cxt, cond)                    case checkExpr(env, cxt, cond)
172                     of (cond', Ty.T_Bool) =>                     of (cond', Ty.T_Bool) =>
173                          if U.matchType(ty1, ty2)                          if U.matchType(ty1, ty2)
174                            then (AST.E_Cond(cond', e1', e2'), ty1)                            then (AST.E_Cond(cond', e1', e2', ty1), ty1)
175                            else err (cxt, [                            else err (cxt, [
176                                S "type do not match in conditional expression\n",                                S "type do not match in conditional expression\n",
177                                S "  true branch:  ", TY ty1,                                S "  true branch:  ", TY ty1,
# Line 232  Line 232 
232                        end                        end
233                  val indices' = List.map checkIndex indices                  val indices' = List.map checkIndex indices
234                  val order = List.length indices'                  val order = List.length indices'
235                    val expectedTy = TU.mkTensorTy order
236                    val resultTy = TU.slice(expectedTy, List.map Option.isSome indices')
237                  in                  in
238                    if U.matchType(ty, TU.mkTensorTy order)                    if U.matchType(ty, expectedTy)
239                      then ()                      then ()
240                      else err (cxt, [                      else err (cxt, [
241                          S "type error in slice operation\n",                          S "type error in slice operation\n",
242                          S "  expected:  ", S(Int.toString order), S "-order tensor\n",                          S "  expected:  ", S(Int.toString order), S "-order tensor\n",
243                          S "  but found: ", TY ty, S "\n"                          S "  but found: ", TY ty, S "\n"
244                        ]);                        ]);
245  (* need to determine the new tensor type by copying dimensions that have ":"                    (AST.E_Slice(e', indices', resultTy), resultTy)
  * indices and removing dimensions that have integer indices.  
  *)  
 (* FIXME *)raise Fail "unimplemented"  
246                  end                  end
247              | PT.E_Tuple args => let              | PT.E_Tuple args => let
248                  val (args, tys) = checkExprList (env, cxt, args)                  val (args, tys) = checkExprList (env, cxt, args)
# Line 275  Line 274 
274                  val (args, ty::tys) = checkExprList (env, cxt, args)                  val (args, ty::tys) = checkExprList (env, cxt, args)
275                  in                  in
276                    case TU.pruneHead ty                    case TU.pruneHead ty
277                     of Ty.T_Tensor shape => let                     of ty as Ty.T_Tensor shape => let
278                            val Ty.Shape dd = TU.pruneShape shape (* NOTE: this may fail if we allow user polymorphism *)
279                          fun chkTy ty' = U.matchType(ty, ty')                          fun chkTy ty' = U.matchType(ty, ty')
280                          val resTy = Ty.T_Tensor(Ty.shapeExt(shape, Ty.DimConst(List.length args)))                          val resTy = Ty.T_Tensor(Ty.Shape(Ty.DimConst(List.length args) :: dd))
281                          in                          in
282                            if List.all chkTy tys                            if List.all chkTy tys
283                              then (AST.E_Cons args, resTy)                              then (AST.E_Cons args, resTy)

Legend:
Removed from v.381  
changed lines
  Added in v.475

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0