| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-19 13:59:20 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-19 13:59:20 +0200 |
| commit | 63b3c43af5d402530a8c10c1f71aa0e7ca3aa06f (patch) | |
| tree | c0703ae0bc72aac35dc92684588cac200fa5d698 | |
| parent | 190cf9e6c79375ab1ae9f36b5d13f1fd07c082e5 (diff) | |
...
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 ) ); |


