diff number.rhope @ 51:7d6a6906b648

Added integer type conversions and started on the implementation of String
author Mike Pavone <pavone@retrodev.com>
date Thu, 22 Apr 2010 02:18:26 -0400
parents 3e20ed8959c4
children 079200bc3e75
line wrap: on
line diff
--- a/number.rhope	Fri Apr 16 01:57:04 2010 -0400
+++ b/number.rhope	Thu Apr 22 02:18:26 2010 -0400
@@ -60,13 +60,31 @@
 	
 }
 
+Compile Conversion Method[backend,intype,outtype,prefix:out]
+{
+	func <- [[[[[[backend]Create Function[[prefix]Append[[[outtype]Append["@"]]Append[intype]], ("in"), ("out"), "rhope"]
+	]Set Input Type[Type Instance[intype], 0]
+	]Set Output Type[Type Instance[outtype], 0]
+	]Register Constant[["Blueprint_"]Append[outtype], Type Instance[outtype]]
+	]Call["Build", [()]Append[ Constant[["Blueprint_"]Append[outtype]] ]]
+	]Move[Result[0], "out"]
+
+	,src <- [func]Read Field["in", "Num"]
+	{ ,dst <- [~]Write Field["out", "Num"]
+	{ ffunc <- [[~]Move[src, dst]]Release["in"] }}
+
+	out <- [backend]Store Function[ffunc]
+}
+
 _Generate Number Methods[backend, type:out]
 {
 	opmap <- (("+", "Add"), ("-", "Sub"), ("*", "Multiply"), ("/", "Divide"), ("LShift", "DoLShift"), ("RShift", "DoRShift"))
 	compops <- (("<", "CompLess"), (">", "CompGreater"), ("=", "CompEqual"), ("<=", "CompLessEqual"), (">=", "CompGreaterEqual"), ("!=", "CompNotEqual"))
 	
 	Fold[["Compile Number Method"]Set Input[2, type], backend, opmap]
-	{ out <- Fold[["Compile Number Comp Method"]Set Input[2, type], ~, compops] }
+	{ Fold[["Compile Number Comp Method"]Set Input[2, type], ~, compops]
+	{ Fold[[["Compile Conversion Method"]Set Input[1, type]]Set Input[3, ""], ~, Legal Conversions[type]]
+	{ out <- Fold[[["Compile Conversion Method"]Set Input[1, type]]Set Input[3, "Trunc "], ~, Legal Conversions[type]] }}}
 }
 		
 Generate Number Methods[backend:out]
@@ -91,6 +109,44 @@
 	]
 }
 
+Register Conversion Method[program, intype, outtype,prefix:out]
+{
+	name <- [prefix]Append[[[outtype]Append["@"]]Append[intype]]
+	Print[["Registering conversion: "]Append[name]]
+	out <- [[program]Register Worker[name, "rhope", 1, 1]
+	]Bind Worker[name,
+		[[[[[NWorker["rhope"]
+		]Inputs <<[("in")]
+		]Input Types <<[ [()]Append[Type Instance[intype]] ]
+		]Outputs <<[("out")]
+		]Output Types <<[ [()]Append[Type Instance[outtype]] ]
+		]Builtin? <<[Yes]
+	]
+}
+
+Legal Conversions[type:convs]
+{
+	bigger <- Filter[(16,32,64), [">"]Set Input[1, size]]
+        base convs <- Map[bigger, ["Append"]Set Input[0, "Int"]]
+        If[[type]Starts With["U"]]
+        {
+                [type]Slice[4] {}
+                { size <- <String@Whole Number[~] }
+                convs <- Concatenate[base convs, Map[bigger, ["Append"]Set Input[0, "UInt"]]]
+        }{
+                [type]Slice[3] {}
+                { size <- <String@Whole Number[~] }
+                convs <- Val[base convs]
+        }
+}
+
+Truncations[type:truncs]
+{
+	,u <- [type]Get DString["Int"]
+	{ size <- <String@Whole Number[~] }
+	truncs <- Map[Filter[(8,16,32), ["<"]Set Input[1, size]], ["Append"]Set Input[0, [u]Append["Int"]]]
+}
+
 _Register Number Methods[program,type:out]
 {
 	Print[["_Regsiter Number Methods: "]Append[type]]
@@ -98,7 +154,9 @@
 	compmethods <- ("<", ">", "=", "<=", ">=", "!=")
 	register <- ["Register Number Method"]Set Input[2, type]
 	Fold[[register]Set Input[3, type], program, methods]
-	{ out <- Fold[[register]Set Input[3, "Boolean"], ~, compmethods] }
+	{ Fold[[register]Set Input[3, "Boolean"], ~, compmethods]
+ 	{ Fold[[["Register Conversion Method"]Set Input[1, type]]Set Input[3, ""], ~, Legal Conversions[type]]
+	{ out <- Fold[[["Register Conversion Method"]Set Input[1, type]]Set Input[3, "Trunc ", ~, Truncations[type]]  }}}
 }
 
 Register Number Methods[program:out]