| summaryrefslogtreecommitdiff | 
diff options
27 files changed, 1337 insertions, 308 deletions
| diff --git a/data/examples/blackjack/cards.fate b/data/examples/blackjack/cards.fate index fa2d9f5..16d0bf7 100644 --- a/data/examples/blackjack/cards.fate +++ b/data/examples/blackjack/cards.fate @@ -1,97 +1,50 @@  (fate_version 1)  (declare_structure card -   ( text name ) -   ( int number ) -   ( int score ) +   (text name) +   (int number) +   (int score)  ) -(local (list card) heart_cards) -(local (list card) spade_cards) -(local (list card) club_cards) -(local (list card) diamond_cards) +(local (lambda (list card) (string)) card_generator) -(define_sequence generate_card_familly ((string name) ((ptr (list card)) deck)) -   (local int i) - -   (for (set i 1) (=< (var i) 13) (set i (+ (var i) 1)) -      (local card c) - -      (set c.number (var i)) - -      (set c.name -         (text -            (switch (var i) -               (1 Ace) -               (11 Jack) -               (12 Queen) -               (13 Kind) -               (cast string (var i)) +(set card_generator +   (lambda ( (string family) ) +      (map +         (lambda +            ( +               (int number) +               (string family)              ) -            of (var name)           ) -      ) - -      (set c.score -         (switch (var i) -            (11 10) -            (12 10) -            (13 10) -            (var i) +         (set_fields (default card) +            (number (var number)) +            (name +               (text +                  (switch (var number) +                     (1 Ace) +                     (11 Jack) +                     (12 Queen) +                     (13 Kind) +                     (cast string (var number)) +                  ) +                  of (var name) +               ) +            ) +            (score (max 10 number))           ) +         (range 1 13 1) +         (var family)        ) - -      (add! (var c) (at deck))     )  ) -(visit generate_card_familly Hearts (ptr heart_cards)) -(visit generate_card_familly Spades (ptr spade_cards)) -(visit generate_card_familly Diamonds (ptr diamond_cards)) -(visit generate_card_familly Clubs (ptr club_cards)) -  (global (list card) deck_template) -(add_all! heart_cards deck_template) -(add_all! spade_cards deck_template) -(add_all! diamond_cards deck_template) -(add_all! club_cards deck_template) - -(define_sequence shuffle_into_deck -   ( -      ((ptr (list card)) cards) -      ((ptr (list card)) deck) -   ) - -   (while (! (is_empty (at cards))) -      (local int o) -      (local int d) - -      (set o (rand 0 (- (size (at cards)) 1))) - -      (if_else (is_empty (at deck)) -         (set d 0) -         (set d (rand 0 (- (size (at deck)) 1))) -      ) - -      (add_at! (var d) (access (at cards) (var o)) (at deck)) -      (remove_at! (var o) (at cards)) -   ) -) - -(define_sequence generate_shuffled_deck (((ptr (list card)) result)) -   (local (list card) initial_deck) - -   (set initial_deck (var deck_template)) - -   (clear (at result)) -   (visit shuffle_into_deck (ptr initial_deck) (var result)) -) - -(define_sequence draw_a_card (((ptr (list card)) deck) ((ptr card) result)) -   (set (at result) (access (at deck) 0)) -   (remove_at! 0 (at deck)) -) +(add_all! (eval card_generator Hearts) deck_template) +(add_all! (eval card_generator Spades) deck_template) +(add_all! (eval card_generator Diamonds) deck_template) +(add_all! (eval card_generator Clubs) deck_template)  (define_sequence compute_score (((ptr (list card)) deck) ((ptr int) result))     (local int aces_count) @@ -100,17 +53,17 @@     (set (at result) 0)     (foreach (at deck) card -      (set (at result) (+ (var card.score) (at result))) -      (if (= (var card.number) 1) -         (set aces_count (+ (var aces_count) 1)) +      (set (at result) (+ card.score (at result))) +      (if (= card.number 1) +         (set aces_count (+ aces_count 1))        )     ) -   (while (> (var aces_count) 0) +   (while (> aces_count 0)        (set maybe_better_score (+ (at result) 10)) -      (if (=< (var maybe_better_score) 21) +      (if (=< maybe_better_score 21)           (set (at result) (var maybe_better_score))        ) -      (set aces_count (- (var aces_count) 1)) +      (set aces_count (- aces_count 1))     )  ) diff --git a/data/examples/blackjack/global.fate b/data/examples/blackjack/global.fate index 9c10c9f..16574e6 100644 --- a/data/examples/blackjack/global.fate +++ b/data/examples/blackjack/global.fate @@ -9,8 +9,8 @@  (set coins_word     (lambda ((int i))        (if_else (= (var i) 1) -         (text a single coin ) -         (text (var i) coins ) +         (text a single coin) +         (text (var i) coins)        )     )  ) @@ -18,8 +18,8 @@  (declare_text_effect action_description)  (define_sequence money_acquisition ((int amount)) -   (set player.money (+ (var player.money) (var amount))) -   (if (> (var amount) 0) +   (set player.money (+ player.money  amount)) +   (if (> amount 0)        (text_effect action_description           You acquired (eval coins_word (var amount))!        ) @@ -27,8 +27,8 @@  )  (define_sequence money_loss ((int amount)) -   (set player.money (- (var player.money) (var amount))) -   (if (> (var amount) 0) +   (set player.money (- player.money amount)) +   (if (> amount 0)        (text_effect action_description           You lost (eval coins_word (var amount)).        ) diff --git a/data/examples/blackjack/main.fate b/data/examples/blackjack/main.fate index 0ab9b7d..acfee7e 100644 --- a/data/examples/blackjack/main.fate +++ b/data/examples/blackjack/main.fate @@ -46,20 +46,20 @@ Now, you're all set to go... unless you don't know how to play?  (cond     ( -      (=< (var player.money) (/ (var original_amount) 2)) +      (=< player.money (/ original_amount 2))        Outch. I suppose all your luck was spent by getting these free coins.     )     ( -      (< (var player.money) (var original_amount)) +      (< player.money original_amount)        Well, that's not too bad for your first time. Come back tomorrow, I am        sure you'll be getting it all back.     )     ( -      (< (var player.money) (* (var original_amount) 2)) +      (< player.money (* original_amount 2))        Had a good day, I hope?     )     ( -      (< (var player.money) (* (var original_amount) 4)) +      (< player.money (* original_amount 4))        Well! That was some fine play, if I do say so myself!     )     ( diff --git a/data/examples/blackjack/play.fate b/data/examples/blackjack/play.fate index 3dc9536..2cf2407 100644 --- a/data/examples/blackjack/play.fate +++ b/data/examples/blackjack/play.fate @@ -15,20 +15,16 @@  (define_sequence play_a_game ()     (local card new_card) -   (if (not (var has_played)) -      ( -         (text_effect action_description -            Sitting yourself at a table, you see someone rushing to set up the -            cards and manage the game. -         ) -         (set has_played (true)) +   (if (not has_played) +      (text_effect action_description +         Sitting yourself at a table, you see someone rushing to set up the +         cards and manage the game.        ) +      (set has_played (true))     )     (if (= (var player.money) 0) -      ( -         I am sorry, (var player.name), but you appear to have ran out of coins. -         (done) -      ) +      I am sorry, (var player.name), but you appear to have ran out of coins. +      (done)     )     (prompt_integer        (ptr bet) @@ -42,9 +38,9 @@     (newline) -   (visit generate_shuffled_deck (ptr current_deck)) +   (set current_deck (shuffle deck_template)) -   (visit draw_a_card (ptr current_deck) (ptr new_card)) +   (pop_left! current_deck (ptr new_card))     (add! (var new_card) player.hand)     (text_effect action_description @@ -52,8 +48,7 @@        (newline)     ) - -   (visit draw_a_card (ptr current_deck) (ptr new_card)) +   (pop_left! current_deck (ptr new_card))     (add! (var new_card) dealer_hand)     (text_effect action_description @@ -61,7 +56,7 @@        (newline)     ) -   (visit draw_a_card (ptr current_deck) (ptr new_card)) +   (pop_left! current_deck (ptr new_card))     (add! (var new_card) player.hand)     (text_effect action_description @@ -71,7 +66,7 @@     (newline) -   (visit draw_a_card (ptr current_deck) (ptr new_card)) +   (pop_left! current_deck (ptr new_card))     (add! (var new_card) dealer_hand)     (text_effect action_description @@ -111,54 +106,50 @@     (visit compute_score (ptr player.hand) (ptr player_score))     (if (= (var dealer_score) 21) -      ( +      (text_effect action_description +         The dealer reveals their full hand: +      ) +      (foreach dealer_hand card           (text_effect action_description -            The dealer reveals their full hand: +            (newline) +            * The (var card.name), worth +            (if_else (= (var card.number) 1) +               (text 1 or 11 points.) +               (text (var card.score) points.) +            )           ) -         (foreach dealer_hand card +      ) +      (newline) +      (ifelse (= (var player_score) 21) +         (              (text_effect action_description -               (newline) -               * The (var card.name), worth -               (if_else (= (var card.number) 1) -                  (text 1 or 11 points. ) -                  (text (var card.score) points. ) -               ) +               The dealer looks very surprised.              ) +            (newline) +            Double Blackjack! A tie, then. +            (done)           ) -         (newline) -         (ifelse (= (var player_score) 21) -            ( -               (text_effect action_description -                  The dealer looks very surprised. -               ) -               (newline) -               Double Blackjack! A tie, then. -               (done) -            ) -            ( -               (text_effect action_description -                  The dealer looks surprised, but happy. -               ) -               (newline) -               Blackjack! Looks like I win, this time. -               (visit money_loss (var bet)) -               (done) +         ( +            (text_effect action_description +               The dealer looks surprised, but happy.              ) +            (newline) +            Blackjack! Looks like I win, this time. +            (visit money_loss (var bet)) +            (done)           )        )     )     (if (= (var player_score) 21) -      ( -         (text_effect action_description -            The dealer looks surprised. -         ) -         (newline) -         Blackjack! Looks like you win, this time. -         (newline) -         (visit money_acquisition (cast int (* (cast float (var bet)) 1.5))) -         (done) +      (text_effect action_description +         The dealer looks surprised.        ) +      (newline) +      Blackjack! Looks like you win, this time. +      (newline) +      (visit money_acquisition (cast int (* (cast float (var bet)) 1.5))) +      (done)     )     (player_choice @@ -171,10 +162,10 @@           ( I will stand. )           (jump_to resolve_dealer)        ) -      (if (and (>= (var player_score) 9) (<= (var player_score) 11)) +      (if (and (>= player_score 9) (<= player_score 11))           (              ( Double my bet, I'll only take one card. ) -            (set bet (* (var bet) 2)) +            (set bet (* bet 2))              (set has_doubled (true))              (jump_to acquire_card)           ) @@ -186,7 +177,7 @@     (local card new_card)     (local int player_score) -   (visit draw_a_card (ptr current_deck) (ptr new_card)) +   (pop_left! current_deck (ptr new_card))     (add! (var new_card) player.hand)     (visit compute_score (ptr player.hand) (ptr player_score)) @@ -201,24 +192,22 @@           (newline)           * The (var card.name), worth           (if_else (= (var card.number) 1) -            (text 1 or 11 points. ) -            (text (var card.score) points. ) +            (text 1 or 11 points.) +            (text (var card.score) points.)           )        )     )     (newline) -   (if (> (var player_score) 21) -      ( -         (text_effect action_description -            The dealer looks disappointed. -         ) -         (newline) -         A bust! What a shame... -         (newline) -         (visit money_loss (var bet)) -         (done) +   (if (> player_score 21) +      (text_effect action_description +         The dealer looks disappointed.        ) +      (newline) +      A bust! What a shame... +      (newline) +      (visit money_loss (var bet)) +      (done)     )     (if (var has_doubled) @@ -261,10 +250,10 @@     )     (newline) -   (while (< (var dealer_score) 17) +   (while (< dealer_score 17)        (local card new_card) -      (visit draw_a_card (ptr current_deck) (ptr new_card)) +      (pop_left! current_deck (ptr new_card))        (add! (var new_card) dealer_hand)        (text_effect action_description @@ -275,17 +264,15 @@        (visit compute_score (ptr dealer_hand) (ptr dealer_score))     ) -   (if (> (var dealer_score) 21) -      ( -         (text_effect action_description -            The dealer looks disappointed. -         ) -         (newline) -         Ah. It would appear I have gone above the limit. -         (newline) -         (visit money_acquisition (var bet)) -         (done) +   (if (> dealer_score 21) +      (text_effect action_description +         The dealer looks disappointed.        ) +      (newline) +      Ah. It would appear I have gone above the limit. +      (newline) +      (visit money_acquisition (var bet)) +      (done)     )     (visit compute_score (ptr player.hand) (ptr player_score)) @@ -295,13 +282,11 @@     (newline)     (if (= (var player_score) (var dealer_score)) -      ( -         A tie, then. -         (done) -      ) +      A tie, then. +      (done)     ) -   (if_else (> (var player_score) (var dealer_score)) +   (if_else (> player_score dealer_score)        (           Congratulation, you won.           (newline) diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java index 9fdb63f..821c231 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.computation;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -18,6 +20,7 @@ public class FilterComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -29,13 +32,15 @@ public class FilterComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     {        super(origin, collection.get_type());        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -46,22 +51,42 @@ public class FilterComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        ); -      return new FilterComputation(origin, lambda_function, collection); +      return +         new FilterComputation +         ( +            origin, +            lambda_function, +            collection, +            extra_params +         );     }     /**** Accessors ************************************************************/ @@ -82,6 +107,11 @@ public class FilterComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -92,6 +122,13 @@ public class FilterComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java index 2be97d1..1e9041b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java @@ -20,6 +20,7 @@ public class Fold extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation initial_value;     protected final Computation collection; @@ -36,6 +37,7 @@ public class Fold extends Computation        final Computation initial_value,        final Computation collection,        final boolean is_foldl, +      final List<Computation> extra_params,        final Type act_as     )     { @@ -45,6 +47,7 @@ public class Fold extends Computation        this.initial_value = initial_value;        this.collection = collection;        this.is_foldl = is_foldl; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -57,7 +60,8 @@ public class Fold extends Computation        final Computation lambda_function,        final Computation initial_value,        final Computation collection, -      final boolean is_foldl +      final boolean is_foldl, +      final List<Computation> extra_params     )     throws ParsingError     { @@ -73,6 +77,11 @@ public class Fold extends Computation           ((CollectionType) collection.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -88,6 +97,7 @@ public class Fold extends Computation              initial_value,              collection,              is_foldl, +            extra_params,              initial_value.get_type()           );     } @@ -120,6 +130,11 @@ public class Fold extends Computation        return is_foldl;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -141,6 +156,13 @@ public class Fold extends Computation        sb.append(initial_value.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java index 7190582..f85616a 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java @@ -20,6 +20,7 @@ public class IndexedMapComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -32,6 +33,7 @@ public class IndexedMapComputation extends Computation        final Origin origin,        final Computation lambda_function,        final Computation collection, +      final List<Computation> extra_params,        final Type output_type     )     { @@ -39,6 +41,7 @@ public class IndexedMapComputation extends Computation        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -49,7 +52,8 @@ public class IndexedMapComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws Throwable     { @@ -65,6 +69,11 @@ public class IndexedMapComputation extends Computation           ((CollectionType) collection.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         in_types.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types(lambda_function, in_types);        return @@ -73,6 +82,7 @@ public class IndexedMapComputation extends Computation              origin,              lambda_function,              collection, +            extra_params,              CollectionType.build              (                 origin, @@ -101,6 +111,11 @@ public class IndexedMapComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -111,6 +126,13 @@ public class IndexedMapComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java index 394dd9a..86bd6e4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.computation;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -19,6 +21,7 @@ public class MapComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -31,12 +34,15 @@ public class MapComputation extends Computation        final Origin origin,        final Computation lambda_function,        final Computation collection, +      final List<Computation> extra_params,        final Type output_type     )     {        super(origin, output_type); +        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -47,18 +53,31 @@ public class MapComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        );        return @@ -67,6 +86,7 @@ public class MapComputation extends Computation              origin,              lambda_function,              collection, +            extra_params,              CollectionType.build              (                 origin, @@ -95,6 +115,11 @@ public class MapComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -105,6 +130,13 @@ public class MapComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java index e961729..4df3d3b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java @@ -22,6 +22,7 @@ public class MergeComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection_in_a;     protected final Computation default_a; @@ -42,6 +43,7 @@ public class MergeComputation extends Computation        final Computation collection_in_b,        final Computation default_b,        final boolean to_set, +      final List<Computation> extra_params,        final Type output_type     )     { @@ -53,6 +55,7 @@ public class MergeComputation extends Computation        this.collection_in_b = collection_in_b;        this.default_b = default_b;        this.to_set = to_set; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -67,7 +70,8 @@ public class MergeComputation extends Computation        final Computation default_a,        final Computation collection_in_b,        final Computation default_b, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     throws Throwable     { @@ -103,6 +107,11 @@ public class MergeComputation extends Computation           ((CollectionType) collection_in_b.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types(lambda_function, types_in);        return @@ -115,6 +124,7 @@ public class MergeComputation extends Computation              collection_in_b,              default_b,              to_set, +            extra_params,              CollectionType.build              (                 origin, @@ -158,6 +168,11 @@ public class MergeComputation extends Computation        return default_b;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     public boolean to_set ()     {        return to_set; @@ -205,6 +220,12 @@ public class MergeComputation extends Computation           sb.append(default_b.toString());        } +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java index 75bc3d6..b240915 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.computation;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -19,6 +21,7 @@ public class PartitionComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -31,6 +34,7 @@ public class PartitionComputation extends Computation        final Origin origin,        final Computation lambda_function,        final Computation collection, +      final List<Computation> extra_params,        final Type output_type     )     { @@ -38,6 +42,7 @@ public class PartitionComputation extends Computation        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,22 +53,33 @@ public class PartitionComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws Throwable     {        final Type type; +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>();        RecurrentChecks.assert_is_a_collection(collection); +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        );        type = @@ -81,6 +97,7 @@ public class PartitionComputation extends Computation              origin,              lambda_function,              collection, +            extra_params,              type           );     } @@ -103,6 +120,11 @@ public class PartitionComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -113,6 +135,13 @@ public class PartitionComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java index 7127920..ebb9279 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java @@ -21,6 +21,7 @@ public class SortComputation extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Computation collection; @@ -32,13 +33,15 @@ public class SortComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     {        super(origin, collection.get_type());        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -49,7 +52,8 @@ public class SortComputation extends Computation     (        final Origin origin,        final Computation lambda_function, -      final Computation collection +      final Computation collection, +      final List<Computation> extra_params     )     throws ParsingError     { @@ -62,6 +66,11 @@ public class SortComputation extends Computation        types_in.add(((CollectionType) collection.get_type()).get_content_type());        types_in.add(types_in.get(0)); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -69,7 +78,8 @@ public class SortComputation extends Computation           types_in        ); -      return new SortComputation(origin, lambda_function, collection); +      return +         new SortComputation(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -90,6 +100,11 @@ public class SortComputation extends Computation        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -100,6 +115,13 @@ public class SortComputation extends Computation        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java index d81997c..d91f297 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java @@ -2,6 +2,7 @@ package tonkadur.fate.v1.lang.instruction;  import java.util.Collections;  import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -21,6 +22,7 @@ public class Filter extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -32,13 +34,15 @@ public class Filter extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -49,23 +53,34 @@ public class Filter extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>();        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      }        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        ); -      return new Filter(origin, lambda_function, collection); +      return new Filter(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -86,6 +101,11 @@ public class Filter extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -96,6 +116,13 @@ public class Filter extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java index a8751d1..0f29115 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java @@ -1,5 +1,7 @@  package tonkadur.fate.v1.lang.instruction; +import java.util.List; +  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -16,7 +18,7 @@ public class IfInstruction extends Instruction     /**** MEMBERS **************************************************************/     /***************************************************************************/     protected final Computation condition; -   protected final Instruction if_true; +   protected final List<Instruction> if_true;     /***************************************************************************/     /**** PROTECTED ************************************************************/ @@ -26,7 +28,7 @@ public class IfInstruction extends Instruction     (        final Origin origin,        final Computation condition, -      final Instruction if_true +      final List<Instruction> if_true     )     {        super(origin); @@ -43,7 +45,7 @@ public class IfInstruction extends Instruction     (        final Origin origin,        final Computation condition, -      final Instruction if_true +      final List<Instruction> if_true     )     throws ParsingError     { @@ -65,7 +67,7 @@ public class IfInstruction extends Instruction        return condition;     } -   public Instruction get_if_true () +   public List<Instruction> get_if_true ()     {        return if_true;     } @@ -79,8 +81,12 @@ public class IfInstruction extends Instruction        sb.append("(IfInstruction");        sb.append(System.lineSeparator());        sb.append(condition.toString()); -      sb.append(System.lineSeparator()); -      sb.append(if_true.toString()); + +      for (final Instruction instr: if_true) +      { +         sb.append(System.lineSeparator()); +         sb.append(instr.toString()); +      }        sb.append(")"); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java index 094561b..e603332 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java @@ -20,6 +20,7 @@ public class IndexedMap extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -31,13 +32,15 @@ public class IndexedMap extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,7 +51,8 @@ public class IndexedMap extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws Throwable     { @@ -64,6 +68,11 @@ public class IndexedMap extends Instruction           ((CollectionType) collection.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         in_types.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -71,7 +80,7 @@ public class IndexedMap extends Instruction           in_types        ); -      return new IndexedMap(origin, lambda_function, collection); +      return new IndexedMap(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -92,6 +101,11 @@ public class IndexedMap extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -102,6 +116,13 @@ public class IndexedMap extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java index 0cc941f..1bcb1e4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java @@ -2,6 +2,7 @@ package tonkadur.fate.v1.lang.instruction;  import java.util.Collections;  import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -20,6 +21,7 @@ public class Map extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -31,13 +33,15 @@ public class Map extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,22 +52,35 @@ public class Map extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           ((CollectionType) collection.get_type()).get_content_type(), -         Collections.singletonList -         ( -            ((CollectionType) collection.get_type()).get_content_type() -         ) +         target_signature        ); -      return new Map(origin, lambda_function, collection); +      return new Map(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -84,6 +101,11 @@ public class Map extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -94,6 +116,13 @@ public class Map extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java index b5821ed..f2396a9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java @@ -20,6 +20,7 @@ public class Merge extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection;     protected final Computation default_a; @@ -37,7 +38,8 @@ public class Merge extends Instruction        final Reference collection,        final Computation default_a,        final Computation collection_in_b, -      final Computation default_b +      final Computation default_b, +      final List<Computation> extra_params     )     {        super(origin); @@ -47,6 +49,7 @@ public class Merge extends Instruction        this.default_a = default_a;        this.collection_in_b = collection_in_b;        this.default_b = default_b; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -60,7 +63,8 @@ public class Merge extends Instruction        final Reference collection,        final Computation default_a,        final Computation collection_in_b, -      final Computation default_b +      final Computation default_b, +      final List<Computation> extra_params     )     throws Throwable     { @@ -96,6 +100,11 @@ public class Merge extends Instruction           ((CollectionType) collection_in_b.get_type()).get_content_type()        ); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -111,7 +120,8 @@ public class Merge extends Instruction              collection,              default_a,              collection_in_b, -            default_b +            default_b, +            extra_params           );     } @@ -148,6 +158,11 @@ public class Merge extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -182,6 +197,12 @@ public class Merge extends Instruction           sb.append(default_b.toString());        } +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java index c075c9b..33cb152 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java @@ -1,6 +1,8 @@  package tonkadur.fate.v1.lang.instruction;  import java.util.Collections; +import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; @@ -19,6 +21,7 @@ public class Partition extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection_in;     protected final Reference collection_out; @@ -32,7 +35,8 @@ public class Partition extends Instruction        final Origin origin,        final Computation lambda_function,        final Reference collection_in, -      final Reference collection_out +      final Reference collection_out, +      final List<Computation> extra_params     )     {        super(origin); @@ -40,6 +44,7 @@ public class Partition extends Instruction        this.lambda_function = lambda_function;        this.collection_in = collection_in;        this.collection_out = collection_out; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -51,10 +56,15 @@ public class Partition extends Instruction        final Origin origin,        final Computation lambda_function,        final Reference collection_in, -      final Reference collection_out +      final Reference collection_out, +      final List<Computation> extra_params     )     throws ParsingError     { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); +        RecurrentChecks.assert_is_a_collection(collection_in);        RecurrentChecks.assert_is_a_collection(collection_out);        RecurrentChecks.assert_can_be_used_as @@ -63,14 +73,21 @@ public class Partition extends Instruction           collection_out.get_type()        ); +      target_signature.add +      ( +         ((CollectionType) collection_in.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function,           Type.BOOL, -         Collections.singletonList -         ( -            ((CollectionType) collection_in.get_type()).get_content_type() -         ) +         target_signature        );        return @@ -79,7 +96,8 @@ public class Partition extends Instruction              origin,              lambda_function,              collection_in, -            collection_out +            collection_out, +            extra_params           );     } @@ -106,6 +124,11 @@ public class Partition extends Instruction        return collection_out;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -118,6 +141,13 @@ public class Partition extends Instruction        sb.append(collection_in.toString());        sb.append(" ");        sb.append(collection_out.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java index 083b1a1..f19a4fc 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java @@ -20,6 +20,7 @@ public class Sort extends Instruction     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ +   protected final List<Computation> extra_params;     protected final Computation lambda_function;     protected final Reference collection; @@ -31,13 +32,15 @@ public class Sort extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     {        super(origin);        this.lambda_function = lambda_function;        this.collection = collection; +      this.extra_params = extra_params;     }     /***************************************************************************/ @@ -48,7 +51,8 @@ public class Sort extends Instruction     (        final Origin origin,        final Computation lambda_function, -      final Reference collection +      final Reference collection, +      final List<Computation> extra_params     )     throws Throwable     { @@ -61,6 +65,11 @@ public class Sort extends Instruction        types_in.add(((CollectionType) collection.get_type()).get_content_type());        types_in.add(types_in.get(0)); +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } +        RecurrentChecks.assert_lambda_matches_types        (           lambda_function, @@ -68,7 +77,7 @@ public class Sort extends Instruction           types_in        ); -      return new Sort(origin, lambda_function, collection); +      return new Sort(origin, lambda_function, collection, extra_params);     }     /**** Accessors ************************************************************/ @@ -89,6 +98,11 @@ public class Sort extends Instruction        return collection;     } +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () @@ -99,6 +113,13 @@ public class Sort extends Instruction        sb.append(lambda_function.toString());        sb.append(" ");        sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } +        sb.append(")");        return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java b/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java new file mode 100644 index 0000000..554ae86 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java @@ -0,0 +1,66 @@ +package tonkadur.fate.v1.lang.meta; + +import java.util.Map; +import java.util.Deque; +import java.util.Arrays; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.computation.VariableReference; +import tonkadur.fate.v1.lang.computation.FieldReference; + +import tonkadur.fate.v1.lang.Variable; +import tonkadur.fate.v1.lang.World; + +public class VariableFromWord +{ +   /* Utility Class */ +   private VariableFromWord () { } + +   public static Reference generate +   ( +      final World WORLD, +      final Deque<Map<String, Variable>> LOCAL_VARIABLES, +      final Origin origin, +      final String word +   ) +   throws ParsingError +   { +      final String[] subrefs; +      Reference result; +      Variable target_var; + +      subrefs = word.split("\\."); + +      target_var = LOCAL_VARIABLES.peekFirst().get(subrefs[0]); + +      if (target_var == null) +      { +         target_var = WORLD.variables().get(origin, subrefs[0]); +      } + +      result = new VariableReference(origin, target_var); + +      if (subrefs.length > 1) +      { +         final List<String> subrefs_list; + +         subrefs_list = new ArrayList(Arrays.asList(subrefs)); + +         subrefs_list.remove(0); + +         result = +            FieldReference.build +            ( +               origin, +               result, +               subrefs_list +            ); +      } + +      return result; +   } +} diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 9f716b6..f4a3d12 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -820,7 +820,24 @@ returns [Instruction result]                 ($IMP_MAP_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_MAP_KW non_text_value WS+ value_reference WS+ value_list WS* R_PAREN +   { +      $result = +         tonkadur.fate.v1.lang.instruction.Map.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_MAP_KW.getLine()), +               ($IMP_MAP_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -835,7 +852,28 @@ returns [Instruction result]                 ($IMP_INDEXED_MAP_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_INDEXED_MAP_KW +         non_text_value WS+ +         value_reference WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         IndexedMap.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_INDEXED_MAP_KW.getLine()), +               ($IMP_INDEXED_MAP_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -857,7 +895,32 @@ returns [Instruction result]              ($value_reference.result),              null,              ($inv1.result), -            null +            null, +            new ArrayList() +         ); +   } + +   | IMP_MERGE_KW +         fun=non_text_value WS+ +         value_reference WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         Merge.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_MERGE_KW.getLine()), +               ($IMP_MERGE_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($value_reference.result), +            null, +            ($inv1.result), +            null, +            ($value_list.result)           );     } @@ -881,7 +944,34 @@ returns [Instruction result]              ($value_reference.result),              ($def0.result),              ($inv1.result), -            ($def1.result) +            ($def1.result), +            new ArrayList() +         ); +   } + +   | IMP_MERGE_KW +      fun=non_text_value WS+ +      def0=value WS+ +      value_reference WS+ +      def1=value WS+ +      inv1=non_text_value WS+ +      value_list WS* +      R_PAREN +   { +      $result = +         Merge.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_MERGE_KW.getLine()), +               ($IMP_MERGE_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($value_reference.result), +            ($def0.result), +            ($inv1.result), +            ($def1.result), +            ($value_list.result)           );     } @@ -916,7 +1006,24 @@ returns [Instruction result]                 ($IMP_FILTER_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_FILTER_KW non_text_value WS+ value_reference WS+ value_list WS* R_PAREN +   { +      $result = +         Filter.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_FILTER_KW.getLine()), +               ($IMP_FILTER_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -936,7 +1043,30 @@ returns [Instruction result]              ),              ($non_text_value.result),              ($iftrue.result), -            ($iffalse.result) +            ($iffalse.result), +            new ArrayList() +         ); +   } + +   | IMP_PARTITION_KW +      non_text_value WS+ +      iftrue=value_reference WS+ +      iffalse=value_reference WS+ +      value_list WS* +      R_PAREN +   { +      $result = +        Partition.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_PARTITION_KW.getLine()), +               ($IMP_PARTITION_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($iftrue.result), +            ($iffalse.result), +            ($value_list.result)           );     } @@ -951,7 +1081,24 @@ returns [Instruction result]                 ($IMP_SORT_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($value_reference.result) +            ($value_reference.result), +            new ArrayList() +         ); +   } + +   | IMP_SORT_KW non_text_value WS+ value_reference WS+ value_list WS* R_PAREN +   { +      $result = +        Sort.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_SORT_KW.getLine()), +               ($IMP_SORT_KW.getCharPositionInLine()) +            ), +            ($non_text_value.result), +            ($value_reference.result), +            ($value_list.result)           );     } @@ -1397,7 +1544,7 @@ returns [Instruction result]        {           HIERARCHICAL_VARIABLES.push(new ArrayList());        } -      general_fate_instr +      general_fate_sequence        {           for (final String s: HIERARCHICAL_VARIABLES.pop())           { @@ -1415,7 +1562,7 @@ returns [Instruction result]                 ($IF_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($general_fate_instr.result) +            ($general_fate_sequence.result)           );     } @@ -1713,7 +1860,10 @@ returns [Instruction result]           );     } -   | IF_KW non_text_value WS+ player_choice WS* R_PAREN +   | IF_KW +         non_text_value WS+ +         player_choice_list WS* +      R_PAREN     {        $result =           IfInstruction.build @@ -1724,7 +1874,7 @@ returns [Instruction result]                 ($IF_KW.getCharPositionInLine())              ),              ($non_text_value.result), -            ($player_choice.result) +            ($player_choice_list.result)           );     } @@ -3259,7 +3409,31 @@ returns [Computation result]              ($fun.result),              ($init.result),              ($inr.result), -            true +            true, +            new ArrayList() +         ); +   } + +   | FOLDL_KW +         fun=non_text_value WS+ +         init=value WS+ +         inr=value_reference WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         Fold.build +         ( +            CONTEXT.get_origin_at +            ( +               ($FOLDL_KW.getLine()), +               ($FOLDL_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($init.result), +            ($inr.result), +            true, +            ($value_list.result)           );     } @@ -3280,7 +3454,31 @@ returns [Computation result]              ($fun.result),              ($init.result),              ($inr.result), -            false +            false, +            new ArrayList() +         ); +   } + +   | FOLDR_KW +         fun=non_text_value WS+ +         init=value WS+ +         inr=value_reference WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         Fold.build +         ( +            CONTEXT.get_origin_at +            ( +               ($FOLDR_KW.getLine()), +               ($FOLDR_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($init.result), +            ($inr.result), +            false, +            ($value_list.result)           );     } @@ -3723,7 +3921,24 @@ returns [Computation result]                 ($MAP_KW.getCharPositionInLine())              ),              ($fun.result), -            ($inv.result) +            ($inv.result), +            new ArrayList() +         ); +   } + +   | MAP_KW fun=non_text_value WS+ inv=non_text_value WS+ value_list WS* R_PAREN +   { +      $result = +         tonkadur.fate.v1.lang.computation.MapComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MAP_KW.getLine()), +               ($MAP_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv.result), +            ($value_list.result)           );     } @@ -3738,7 +3953,28 @@ returns [Computation result]                 ($INDEXED_MAP_KW.getCharPositionInLine())              ),              ($fun.result), -            ($inv.result) +            ($inv.result), +            new ArrayList() +         ); +   } + +   | INDEXED_MAP_KW +         fun=non_text_value WS+ +         inv=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         IndexedMapComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($INDEXED_MAP_KW.getLine()), +               ($INDEXED_MAP_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv.result), +            ($value_list.result)           );     } @@ -3761,7 +3997,33 @@ returns [Computation result]              null,              ($inv1.result),              null, -            false +            false, +            new ArrayList() +         ); +   } + +   | MERGE_TO_LIST_KW +         fun=non_text_value WS+ +         inv0=non_text_value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_LIST_KW.getLine()), +               ($MERGE_TO_LIST_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            null, +            ($inv1.result), +            null, +            false, +            ($value_list.result)           );     } @@ -3786,7 +4048,35 @@ returns [Computation result]              ($def0.result),              ($inv1.result),              ($def1.result), -            false +            false, +            new ArrayList() +         ); +   } + +   | MERGE_TO_LIST_KW +         fun=non_text_value WS+ +         def0=value WS+ +         inv0=non_text_value WS+ +         def1=value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_LIST_KW.getLine()), +               ($MERGE_TO_LIST_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            ($def0.result), +            ($inv1.result), +            ($def1.result), +            false, +            ($value_list.result)           );     } @@ -3809,7 +4099,33 @@ returns [Computation result]              null,              ($inv1.result),              null, -            true +            true, +            new ArrayList() +         ); +   } + +   | MERGE_TO_SET_KW +         fun=non_text_value WS+ +         inv0=non_text_value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_SET_KW.getLine()), +               ($MERGE_TO_SET_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            null, +            ($inv1.result), +            null, +            true, +            ($value_list.result)           );     } @@ -3834,7 +4150,35 @@ returns [Computation result]              ($def0.result),              ($inv1.result),              ($def1.result), -            true +            true, +            new ArrayList() +         ); +   } + +   | MERGE_TO_SET_KW +         fun=non_text_value WS+ +         def0=value WS+ +         inv0=non_text_value WS+ +         def1=value WS+ +         inv1=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         MergeComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MERGE_TO_SET_KW.getLine()), +               ($MERGE_TO_SET_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($inv0.result), +            ($def0.result), +            ($inv1.result), +            ($def1.result), +            true, +            ($value_list.result)           );     } @@ -3869,7 +4213,28 @@ returns [Computation result]                 ($FILTER_KW.getCharPositionInLine())              ),              ($fun.result), -            ($coll.result) +            ($coll.result), +            new ArrayList() +         ); +   } + +   | FILTER_KW +         fun=non_text_value WS+ +         coll=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +         FilterComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($FILTER_KW.getLine()), +               ($FILTER_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($coll.result), +            ($value_list.result)           );     } @@ -3884,7 +4249,28 @@ returns [Computation result]                 ($PARTITION_KW.getCharPositionInLine())              ),              ($fun.result), -            ($coll.result) +            ($coll.result), +            new ArrayList() +         ); +   } + +   | PARTITION_KW +         fun=non_text_value WS+ +         coll=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +        PartitionComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($PARTITION_KW.getLine()), +               ($PARTITION_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($coll.result), +            ($value_list.result)           );     } @@ -3899,7 +4285,28 @@ returns [Computation result]                 ($SORT_KW.getCharPositionInLine())              ),              ($fun.result), -            ($coll.result) +            ($coll.result), +            new ArrayList() +         ); +   } + +   | SORT_KW +         fun=non_text_value WS+ +         coll=non_text_value WS+ +         value_list WS* +      R_PAREN +   { +      $result = +        SortComputation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($SORT_KW.getLine()), +               ($SORT_KW.getCharPositionInLine()) +            ), +            ($fun.result), +            ($coll.result), +            ($value_list.result)           );     } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 161acba..487554e 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -2219,6 +2219,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc, default_cc;        final Register result; @@ -2227,6 +2228,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        default_cc = new ComputationCompiler(compiler);        n.get_initial_value().get_visited_by(default_cc); @@ -2264,7 +2287,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              lambda_cc.get_computation(),              result_as_address,              in_collection_cc.get_address(), -            n.is_foldl() +            n.is_foldl(), +            params           )        );     } @@ -2276,6 +2300,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc;        final Register result; @@ -2284,6 +2309,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2308,7 +2355,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );     } @@ -2673,6 +2721,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc;        final ComputationCompiler in_collection_a_cc, in_collection_b_cc;        final Register result; @@ -2682,6 +2731,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2710,7 +2781,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              in_collection_a_cc.get_address(),              in_collection_b_cc.get_address(),              result_as_address, -            n.to_set() +            n.to_set(), +            params           )        );     } @@ -2752,6 +2824,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc;        final Register result; @@ -2760,6 +2833,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2784,7 +2879,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              compiler.registers(),              compiler.assembler(),              lambda_cc.get_computation(), -            result_as_address +            result_as_address, +            params           )        );     } @@ -2796,6 +2892,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { +      final List<Computation> params;        final ComputationCompiler lambda_cc, in_collection_cc;        final Register result; @@ -2804,6 +2901,28 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        result_as_address = result.get_address();        result_as_computation = result.get_value(); +      params = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         assimilate(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -2828,7 +2947,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );     } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index aeee56e..a0a5810 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -532,10 +532,40 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        /* This is one dangerous operation to do in-place, so we don't. */        final Register holder;        final ComputationCompiler lambda_cc, collection_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -578,13 +608,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );        lambda_cc.release_registers(result);        collection_cc.release_registers(result);        compiler.registers().release(holder, result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -607,8 +643,13 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        /* This is one dangerous operation to do in-place, so we don't. */        final Register holder;        final ComputationCompiler lambda_cc; +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        final ComputationCompiler collection_cc, in_collection_b_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -648,6 +689,31 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor           result.add(in_collection_b_cc.get_init());        } +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        result.add        (           MergeLambda.generate @@ -661,13 +727,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );        collection_cc.release_registers(result);        in_collection_b_cc.release_registers(result);        compiler.registers().release(holder, result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -717,8 +789,38 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        final ComputationCompiler lambda_cc, collection_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -744,12 +846,18 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              compiler.registers(),              compiler.assembler(),              lambda_cc.get_computation(), -            collection_cc.get_address() +            collection_cc.get_address(), +            params           )        );        lambda_cc.release_registers(result);        collection_cc.release_registers(result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -759,10 +867,40 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list;        /* This is one dangerous operation to do in-place, so we don't. */        final Register holder;        final ComputationCompiler lambda_cc, collection_cc; +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            n.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         /* Let's not re-compute the parameters on every iteration. */ +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } +        lambda_cc = new ComputationCompiler(compiler);        n.get_lambda_function().get_visited_by(lambda_cc); @@ -805,13 +943,19 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              (                 (tonkadur.fate.v1.lang.type.CollectionType)                 n.get_collection().get_type() -            ).is_set() +            ).is_set(), +            params           )        );        lambda_cc.release_registers(result);        collection_cc.release_registers(result);        compiler.registers().release(holder, result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      }     }     @Override @@ -1600,19 +1744,30 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor         *         * Wyrd (ifelse c0 i0 (nop))         */ +      final List<Instruction> instructions;        final ComputationCompiler cc; -      final InstructionCompiler if_true_ic; +      instructions = new ArrayList<Instruction>();        cc = new ComputationCompiler(compiler); -      if_true_ic = new InstructionCompiler(compiler);        n.get_condition().get_visited_by(cc);        compiler.registers().push_hierarchical_instruction_level(); -      n.get_if_true().get_visited_by(if_true_ic); + +      for (final tonkadur.fate.v1.lang.meta.Instruction instr: n.get_if_true()) +      { +         final InstructionCompiler if_true_ic; + +         if_true_ic = new InstructionCompiler(compiler); + +         instr.get_visited_by(if_true_ic); + +         instructions.add(if_true_ic.get_result()); +      } +        compiler.registers().pop_hierarchical_instruction_level        ( -         if_true_ic.result +         instructions        );        if (cc.has_init()) @@ -1627,7 +1782,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor              compiler.registers(),              compiler.assembler(),              cc.get_computation(), -            if_true_ic.get_result() +            compiler.assembler().merge(instructions)           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java index 8757fe7..83c947f 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java @@ -35,14 +35,13 @@ public class FilterLambda        final RegisterManager registers,        final InstructionManager assembler,        final Computation lambda, -      final Address collection +      final Address collection, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body, remove_instructions;        final Register iterator, index_storage, collection_size, storage; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>();        remove_instructions = new ArrayList<Instruction>(); @@ -58,8 +57,9 @@ public class FilterLambda           new SetValue(collection_size.get_address(), new Size(collection))        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -108,7 +108,7 @@ public class FilterLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java index 1596dff..7e6a225 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java @@ -37,15 +37,14 @@ public class Fold        final Computation lambda,        final Address storage_address,        final Address collection_in, -      final boolean is_foldl +      final boolean is_foldl, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size;        final Computation start_point, end_point, condition, increment; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -64,7 +63,8 @@ public class Fold           end_point = Constant.ZERO;           start_point =              Operation.minus(collection_in_size.get_value(), Constant.ONE); -         condition = Operation.greater_equal_than(iterator.get_value(), end_point); +         condition = +            Operation.greater_equal_than(iterator.get_value(), end_point);           increment = Operation.minus(iterator.get_value(), Constant.ONE);        } @@ -80,9 +80,9 @@ public class Fold        result.add(new SetValue(iterator.get_address(), start_point)); -      params.add(new ValueOf(storage_address)); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -95,6 +95,7 @@ public class Fold              )           )        ); +      extra_params.add(0, new ValueOf(storage_address));        while_body.add        ( @@ -107,7 +108,7 @@ public class Fold               * be a set.               */              storage_address, -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java index 1ff80d1..869b049 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java @@ -37,14 +37,13 @@ public class IndexedMapLambda        final Computation lambda,        final Address collection_in,        final Address collection_out, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size, storage; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -67,10 +66,10 @@ public class IndexedMapLambda           )        ); -      params.add(iterator.get_value()); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -82,6 +81,8 @@ public class IndexedMapLambda           )        ); +      extra_params.add(0, iterator.get_value()); +        while_body.add        (           LambdaEvaluation.generate @@ -93,7 +94,7 @@ public class IndexedMapLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java index 580bcb1..0b02130 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java @@ -37,14 +37,13 @@ public class MapLambda        final Computation lambda,        final Address collection_in,        final Address collection_out, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size, storage; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -67,8 +66,9 @@ public class MapLambda           )        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress @@ -93,7 +93,7 @@ public class MapLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java index f17cf02..d09f05f 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java @@ -39,15 +39,14 @@ public class MergeLambda        final Address collection_in_a,        final Address collection_in_b,        final Address collection_out, -      final boolean to_set +      final boolean to_set, +      final List<Computation> extra_params     )     { -      final List<Computation> params;        final List<Instruction> result, while_body;        final Register iterator, collection_in_size, storage;        final Register collection_in_b_size; -      params = new ArrayList<Computation>();        result = new ArrayList<Instruction>();        while_body = new ArrayList<Instruction>(); @@ -99,28 +98,30 @@ public class MergeLambda           )        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress              ( -               collection_in_a, +               collection_in_b,                 new Cast(iterator.get_value(), Type.STRING), -               ((MapType) collection_in_a.get_target_type()).get_member_type() +               ((MapType) collection_in_b.get_target_type()).get_member_type()              )           )        ); -      params.add +      extra_params.add        ( +         0,           new ValueOf           (              new RelativeAddress              ( -               collection_in_b, +               collection_in_a,                 new Cast(iterator.get_value(), Type.STRING), -               ((MapType) collection_in_b.get_target_type()).get_member_type() +               ((MapType) collection_in_a.get_target_type()).get_member_type()              )           )        ); @@ -136,7 +137,7 @@ public class MergeLambda               * be a set.               */              storage.get_address(), -            params +            extra_params           )        ); | 


