summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-19 13:59:20 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-19 13:59:20 +0200
commit63b3c43af5d402530a8c10c1f71aa0e7ca3aa06f (patch)
treec0703ae0bc72aac35dc92684588cac200fa5d698
parent190cf9e6c79375ab1ae9f36b5d13f1fd07c082e5 (diff)
...
-rw-r--r--data/examples/blackjack/cards.fate123
-rw-r--r--data/examples/blackjack/global.fate12
-rw-r--r--data/examples/blackjack/main.fate8
-rw-r--r--data/examples/blackjack/play.fate155
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/FilterComputation.java51
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Fold.java24
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IndexedMapComputation.java24
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/MapComputation.java42
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/MergeComputation.java23
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/PartitionComputation.java39
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SortComputation.java28
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Filter.java41
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java18
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java27
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Map.java43
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java27
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Partition.java44
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Sort.java27
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java66
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g4451
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java130
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java173
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/FilterLambda.java10
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/Fold.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IndexedMapLambda.java13
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java10
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/MergeLambda.java21
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
)
);