| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-12-28 22:17:19 +0100 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-12-28 22:17:19 +0100 | 
| commit | 17903cc8333e0f50d3b4e3567f52a8de92101ad3 (patch) | |
| tree | d478edcddd4da48444c113a4d5bea25deb97900c /src/Tonkadur/Compute.elm | |
| parent | 18ebe6e6ca4299b7f903426502c5a5fb73747c81 (diff) | |
...
Diffstat (limited to 'src/Tonkadur/Compute.elm')
| -rw-r--r-- | src/Tonkadur/Compute.elm | 292 | 
1 files changed, 191 insertions, 101 deletions
| diff --git a/src/Tonkadur/Compute.elm b/src/Tonkadur/Compute.elm index 2a3410f..149f37d 100644 --- a/src/Tonkadur/Compute.elm +++ b/src/Tonkadur/Compute.elm @@ -18,15 +18,24 @@ add_text_effect : (        Tonkadur.Types.State ->        String ->        (List Tonkadur.Types.Computation) -> +      (List Tonkadur.Types.Computation) ->        Tonkadur.Types.Value     )  add_text_effect state name parameters content = -   (TextValue -      (AugmentedText +   (Tonkadur.Types.TextValue +      (Tonkadur.Types.AugmentedText           { -            content = (List.map (compute state) content), +            content = +               (List.map +                  (\val -> +                     (Tonkadur.Types.value_to_text_or_string +                        (compute state val) +                     ) +                  ) +                  content +               ),              effect_name = name, -            effect_parameters = parameters +            effect_parameters = (List.map (compute state) parameters)           }        )     ) @@ -38,13 +47,19 @@ address : (     )  address state param =     case (compute state param) of -      (PointerValue address) -> (PointerValue address) -      (StringValue singleton) -> (PointerValue (List.singleton singleton)) -      _ -> (PointerValue []) +      (Tonkadur.Types.PointerValue address_v) -> +         (Tonkadur.Types.PointerValue address_v) + +      (Tonkadur.Types.StringValue singleton) -> +         (Tonkadur.Types.PointerValue (List.singleton singleton)) + +      _ -> (Tonkadur.Types.PointerValue [])  unsupported_cast : String -> String -> Tonkadur.Types.Value  unsupported_cast from to = -   (StringValue ("Unsupported cast from " + from + " to " + to + ".")) +   (Tonkadur.Types.StringValue +      ("Unsupported cast from " ++ from ++ " to " ++ to ++ ".") +   )  cast : (        Tonkadur.Types.State -> @@ -55,68 +70,84 @@ cast : (     )  cast state from to param =     case (compute state param) of -      (BoolValue bool) -> +      (Tonkadur.Types.BoolValue bool) ->           case to of              "string" ->                 if bool -               then (StringValue "true") -               else (StringValue "false") +               then (Tonkadur.Types.StringValue "true") +               else (Tonkadur.Types.StringValue "false")              "text" ->                 if bool -               then (TextValue (StringText "true")) -               else (TextValue (StringText "false")) +               then +                  (Tonkadur.Types.TextValue (Tonkadur.Types.StringText "true")) +               else +                  (Tonkadur.Types.TextValue (Tonkadur.Types.StringText "false")) -            "bool" -> (BoolValue bool) +            "bool" -> (Tonkadur.Types.BoolValue bool)              _ -> (unsupported_cast from to) -      (FloatValue float) -> +      (Tonkadur.Types.FloatValue float) ->           case to of -            "string" -> (StringValue (String.fromFloat float)) -            "text" -> (TextValue (StringText (String.fromFloat float))) -            "int" -> (IntValue (Math.floor float)) -            "float" -> (FloatValue float) +            "string" -> (Tonkadur.Types.StringValue (String.fromFloat float)) +            "text" -> +               (Tonkadur.Types.TextValue +                  (Tonkadur.Types.StringText (String.fromFloat float)) +               ) + +            "int" -> (Tonkadur.Types.IntValue (floor float)) +            "float" -> (Tonkadur.Types.FloatValue float)              _ -> (unsupported_cast from to) -      (IntValue int) -> +      (Tonkadur.Types.IntValue int) ->           case to of -            "string" -> (StringValue (String.fromInt int)) -            "text" -> (TextValue (StringText (String.fromInt int))) -            "float" -> (FloatValue (Math.toFloat int)) -            "int" -> (IntValue int) +            "string" -> (Tonkadur.Types.StringValue (String.fromInt int)) +            "text" -> +               (Tonkadur.Types.TextValue +                  (Tonkadur.Types.StringText (String.fromInt int)) +               ) + +            "float" -> (Tonkadur.Types.FloatValue (toFloat int)) +            "int" -> (Tonkadur.Types.IntValue int)              _ -> (unsupported_cast from to) -      (TextValue text) -> -         let as_string = (Tonkadur.Types.value_to_string (TextValue text)) in +      (Tonkadur.Types.TextValue text_v) -> +         let +            as_string = +               (Tonkadur.Types.value_to_string +                  (Tonkadur.Types.TextValue text_v) +               ) +         in           case to of -            "string" -> (StringValue as_string) +            "string" -> (Tonkadur.Types.StringValue as_string)              "float" ->                 case (String.toFloat as_string) of                    Nothing -> (unsupported_cast from to) -                  (Just result) -> (FloatValue result) +                  (Just result) -> (Tonkadur.Types.FloatValue result)              "int" ->                 case (String.toInt as_string) of                    Nothing -> (unsupported_cast from to) -                  (Just result) -> (IntValue result) +                  (Just result) -> (Tonkadur.Types.IntValue result) -            "text" -> (TextValue text) +            "text" -> (Tonkadur.Types.TextValue text_v)              _ -> (unsupported_cast from to) -      (StringValue string) -> +      (Tonkadur.Types.StringValue string) ->           case to of -            "string" -> (StringValue string) +            "string" -> (Tonkadur.Types.StringValue string)              "float" -> -               case (String.fromFloat string) of +               case (String.toFloat string) of                    Nothing -> (unsupported_cast from to) -                  (Just result) -> (FloatValue result) +                  (Just result) -> (Tonkadur.Types.FloatValue result)              "int" ->                 case (String.toInt string) of                    Nothing -> (unsupported_cast from to) -                  (Just result) -> (IntValue result) +                  (Just result) -> (Tonkadur.Types.IntValue result) -            "text" -> (TextValue (StringText string)) +            "text" -> +               (Tonkadur.Types.TextValue (Tonkadur.Types.StringText string))              _ -> (unsupported_cast from to) @@ -129,7 +160,22 @@ constant : (        Tonkadur.Types.Value     )  constant state target_type as_string = -   (cast state "string" target_type as_string) +   case target_type of +      "string" -> (Tonkadur.Types.StringValue as_string) +      "float" -> +         case (String.toFloat as_string) of +            Nothing -> (unsupported_cast as_string target_type) +            (Just result) -> (Tonkadur.Types.FloatValue result) + +      "int" -> +         case (String.toInt as_string) of +            Nothing -> (unsupported_cast as_string target_type) +            (Just result) -> (Tonkadur.Types.IntValue result) + +      "text" -> +         (Tonkadur.Types.TextValue (Tonkadur.Types.StringText as_string)) + +      _ -> (unsupported_cast as_string target_type)  extra_computation : (        Tonkadur.Types.State -> @@ -139,7 +185,10 @@ extra_computation : (     )  extra_computation state name parameters =     case name of -      _ -> (StringValue ("Unsupported extra computation '" + name + "'")) +      _ -> +         (Tonkadur.Types.StringValue +            ("Unsupported extra computation '" ++ name ++ "'") +         )  if_else : (        Tonkadur.Types.State -> @@ -149,21 +198,26 @@ if_else : (        Tonkadur.Types.Value     )  if_else state condition if_true if_false = -   if (WyrdType.to_boolean (compute state condition)) +   if (Tonkadur.Types.value_to_bool (compute state condition))     then (compute state if_true)     else (compute state if_false)  last_choice_index : Tonkadur.Types.State -> Tonkadur.Types.Value -last_choice_index state = (IntValue state.last_choice_index) +last_choice_index state = (Tonkadur.Types.IntValue state.last_choice_index)  newline : Tonkadur.Types.State -> Tonkadur.Types.Value -newline state = (TextValue Newline) +newline state = (Tonkadur.Types.TextValue Tonkadur.Types.NewlineText)  next_allocable_address : Tonkadur.Types.State -> Tonkadur.Types.Value  next_allocable_address state = -   if (List.isEmpty state.freed_addresses) -   then (PointerValue [(".alloc." ++ (String.fromInt state.allocated_data))]) -   else (PointerValue [state.freed_addresses[0]]) +   case state.freed_addresses of +      [] -> +         (Tonkadur.Types.PointerValue +            [(".alloc." ++ (String.fromInt state.allocated_data))] +         ) + +      (available_address :: _) -> +         (Tonkadur.Types.PointerValue [available_address])  operation : (        Tonkadur.Types.State -> @@ -180,11 +234,13 @@ operation state name param0 param1 =     case name of        "divide" ->           case value0 of -            (IntValue val) -> -               (IntValue (val // (Tonkadur.Types.value_to_int value1))) +            (Tonkadur.Types.IntValue val) -> +               (Tonkadur.Types.IntValue +                  (val // (Tonkadur.Types.value_to_int value1)) +               )              _ -> -               (FloatValue +               (Tonkadur.Types.FloatValue                    (                       (Tonkadur.Types.value_to_float value0)                       / (Tonkadur.Types.value_to_float value1) @@ -193,11 +249,13 @@ operation state name param0 param1 =        "minus" ->           case value0 of -            (IntValue val) -> -               (IntValue (val - (Tonkadur.Types.value_to_int value1))) +            (Tonkadur.Types.IntValue val) -> +               (Tonkadur.Types.IntValue +                  (val - (Tonkadur.Types.value_to_int value1)) +               )              _ -> -               (FloatValue +               (Tonkadur.Types.FloatValue                    (                       (Tonkadur.Types.value_to_float value0)                       - (Tonkadur.Types.value_to_float value1) @@ -205,7 +263,7 @@ operation state name param0 param1 =                 )        "modulo" -> -         (IntValue +         (Tonkadur.Types.IntValue              (modBy                 (Tonkadur.Types.value_to_int value0)                 (Tonkadur.Types.value_to_int value1) @@ -214,11 +272,13 @@ operation state name param0 param1 =        "plus" ->           case value0 of -            (IntValue val) -> -               (IntValue (val + (Tonkadur.Types.value_to_int value1))) +            (Tonkadur.Types.IntValue val) -> +               (Tonkadur.Types.IntValue +                  (val + (Tonkadur.Types.value_to_int value1)) +               )              _ -> -               (FloatValue +               (Tonkadur.Types.FloatValue                    (                       (Tonkadur.Types.value_to_float value0)                       + (Tonkadur.Types.value_to_float value1) @@ -227,11 +287,13 @@ operation state name param0 param1 =        "power" ->           case value0 of -            (IntValue val) -> -               (IntValue (val ^ (Tonkadur.Types.value_to_int value1))) +            (Tonkadur.Types.IntValue val) -> +               (Tonkadur.Types.IntValue +                  (val ^ (Tonkadur.Types.value_to_int value1)) +               )              _ -> -               (FloatValue +               (Tonkadur.Types.FloatValue                    (                       (Tonkadur.Types.value_to_float value0)                       ^ (Tonkadur.Types.value_to_float value1) @@ -240,11 +302,13 @@ operation state name param0 param1 =        "times" ->           case value0 of -            (IntValue val) -> -               (IntValue (val * (Tonkadur.Types.value_to_int value1))) +            (Tonkadur.Types.IntValue val) -> +               (Tonkadur.Types.IntValue +                  (val * (Tonkadur.Types.value_to_int value1)) +               )              _ -> -               (FloatValue +               (Tonkadur.Types.FloatValue                    (                       (Tonkadur.Types.value_to_float value0)                       * (Tonkadur.Types.value_to_float value1) @@ -252,41 +316,57 @@ operation state name param0 param1 =                 )        "and" -> -         (BoolValue -            (and +         (Tonkadur.Types.BoolValue +            (                 (Tonkadur.Types.value_to_bool value0) -               (Tonkadur.Types.value_to_bool value1) +               && (Tonkadur.Types.value_to_bool value1)              )           ) -      "not" -> (BoolValue (not (Tonkadur.Types.value_to_bool value0))) +      "not" -> +         (Tonkadur.Types.BoolValue (not (Tonkadur.Types.value_to_bool value0)))        "less_than" ->           case value0 of -            (BoolValue bool) -> -               (and (Tonkadur.Types.value_to_bool value1) (not boot)) +            (Tonkadur.Types.BoolValue bool) -> +               (Tonkadur.Types.BoolValue +                  ((Tonkadur.Types.value_to_bool value1) && (not bool)) +               ) -            (FloatValue float) -> -               (BoolValue (float < (Tonkadur.Types.value_to_float value1))) +            (Tonkadur.Types.FloatValue float) -> +               (Tonkadur.Types.BoolValue +                  (float < (Tonkadur.Types.value_to_float value1)) +               ) -            (IntValue int) -> -               (BoolValue (int < (Tonkadur.Types.value_to_int value1))) +            (Tonkadur.Types.IntValue int) -> +               (Tonkadur.Types.BoolValue +                  (int < (Tonkadur.Types.value_to_int value1)) +               ) -            (StringValue str) -> -               (BoolValue (str < (Tonkadur.Types.value_to_string value1))) +            (Tonkadur.Types.StringValue str) -> +               (Tonkadur.Types.BoolValue +                  (str < (Tonkadur.Types.value_to_string value1)) +               ) -            (PointerValue ptr) -> -               (BoolValue +            (Tonkadur.Types.PointerValue ptr) -> +               (Tonkadur.Types.BoolValue                    (                       (Tonkadur.Types.compare_pointers                          ptr -                        (Tonadur.Wyrd.value_to_dict value1) +                        (Tonkadur.Types.value_to_address value1)                       )                       > 0                    )                 ) -      "equals" -> (value0 == value1) +            _ -> (Tonkadur.Types.StringValue ("Not a comparable type.")) + +      "equals" -> (Tonkadur.Types.BoolValue (value0 == value1)) + +      other -> +         (Tonkadur.Types.StringValue +            ("Unknown operation '" ++ other ++ "'") +         )  relative_address : (        Tonkadur.Types.State -> @@ -295,10 +375,10 @@ relative_address : (        Tonkadur.Types.Value     )  relative_address state base extra = -   (PointerValue +   (Tonkadur.Types.PointerValue        (List.append -         (Tonkadur.Types.value_to_list (compute state base)) -         (Tonkadur.Types.value_to_list (compute state extra)) +         (Tonkadur.Types.value_to_address (compute state base)) +         (Tonkadur.Types.value_to_address (compute state extra))        )     ) @@ -308,7 +388,7 @@ size : (        Tonkadur.Types.Value     )  size state computation = -   (IntValue +   (Tonkadur.Types.IntValue        (Dict.size (Tonkadur.Types.value_to_dict (compute state computation)))     ) @@ -321,14 +401,16 @@ text : (  text state content =     (List.foldl        (\addition result -> -         (TextValue +         (Tonkadur.Types.TextValue              (Tonkadur.Types.append_text_content -               (Tonkadur.Types.value_to_text result) -               (Tonkadur.Types.value_to_text (compute state addition)) +               (Tonkadur.Types.value_to_text_or_string result) +               (Tonkadur.Types.value_to_text_or_string (compute state addition))              )           )        ) -      (TextValue (Tonkadur.Types.default_text_data)) +      (Tonkadur.Types.TextValue +         (Tonkadur.Types.AugmentedText (Tonkadur.Types.default_text_data)) +      )        content     ) @@ -341,11 +423,14 @@ value_of state computation =     (List.foldl        (\next_step object ->           case (Dict.get next_step (Tonkadur.Types.value_to_dict object)) of -            Nothing -> (StringValue "Segmentation Fault (incorrect address)")              (Just value) -> value +            Nothing -> +               (Tonkadur.Types.StringValue +                  "Segmentation Fault (incorrect address)" +               )        ) -      (StructureValue state.memory) -      (Tonkadur.Types.value_to_list (compute state computation)) +      (Tonkadur.Types.StructureValue state.memory) +      (Tonkadur.Types.value_to_address (compute state computation))     )  -------------------------------------------------------------------------------- @@ -358,23 +443,28 @@ compute : (     )  compute state computation =     case computation of -      (AddTextEffect effect_name effect_parameters content) -> +      (Tonkadur.Types.AddTextEffect effect_name effect_parameters content) ->           (add_text_effect state effect_name effect_parameters content) -      (Address param) -> (address state param) -      (Cast from to value) -> (cast state from to value) -      (Constant true_type as_string) -> (constant state true_type as_string) -      (ExtraComputation name parameters) -> +      (Tonkadur.Types.Address param) -> (address state param) +      (Tonkadur.Types.Cast from to value) -> (cast state from to value) +      (Tonkadur.Types.Constant true_type as_string) -> +         (constant state true_type as_string) + +      (Tonkadur.Types.ExtraComputation name parameters) ->           (extra_computation state name parameters) -      (IfElse condition if_true if_false) -> +      (Tonkadur.Types.IfElse condition if_true if_false) ->           (if_else state condition if_true if_false) -      LastChoiceIndex -> (last_choice_index state) -      Newline -> (newline state) -      NextAllocableAddress -> (next_allocable_address state) -      (Operation name arg_0 arg_1) -> (operation state name arg_0 arg_1) -      (RelativeAddress base extra) -> (relative_address state base extra) -      (Size value) -> (size state value) -      (Text content) -> (text state content) -      (ValueOf address) -> (value_of state address) +      Tonkadur.Types.LastChoiceIndex -> (last_choice_index state) +      Tonkadur.Types.Newline -> (newline state) +      Tonkadur.Types.NextAllocableAddress -> (next_allocable_address state) +      (Tonkadur.Types.Operation name arg_0 arg_1) -> +         (operation state name arg_0 arg_1) +      (Tonkadur.Types.RelativeAddress base extra) -> +         (relative_address state base extra) + +      (Tonkadur.Types.Size value) -> (size state value) +      (Tonkadur.Types.Text content) -> (text state content) +      (Tonkadur.Types.ValueOf address_c) -> (value_of state address_c) | 


