Mercurial > repos > rhope
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]