summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/examples/blackjack/cards.fate21
-rw-r--r--data/examples/blackjack/global.fate10
-rw-r--r--data/examples/blackjack/main.fate6
-rw-r--r--data/examples/blackjack/play.fate17
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g483
10 files changed, 115 insertions, 40 deletions
diff --git a/data/examples/blackjack/cards.fate b/data/examples/blackjack/cards.fate
index 7245436..f9c734f 100644
--- a/data/examples/blackjack/cards.fate
+++ b/data/examples/blackjack/cards.fate
@@ -41,21 +41,26 @@
(global (list card) deck_template)
-(list:add_all! (eval card_generator Hearts) deck_template)
-(list:add_all! (eval card_generator Spades) deck_template)
-(list:add_all! (eval card_generator Diamonds) deck_template)
-(list:add_all! (eval card_generator Clubs) deck_template)
+(list:add_all!
+ (eval card_generator Hearts)
+ (eval card_generator Spades)
+ (eval card_generator Diamonds)
+ (eval card_generator Clubs)
+ deck_template
+)
+
+
(define_sequence compute_score (((ptr (list card)) deck) ((ptr int) result))
- (local int aces_count)
- (local int maybe_better_score)
+ (local int aces_count 0)
+ (local int maybe_better_score 0)
(set! (at result) 0)
(foreach (at deck) card
(set! (at result) (+ card.score (at result)))
(if (= (var card.number) 1)
- (set! aces_count (+ aces_count 1))
+ (++! aces_count)
)
)
@@ -64,6 +69,6 @@
(if (=< maybe_better_score 21)
(set! (at result) (var maybe_better_score))
)
- (set! aces_count (- aces_count 1))
+ (--! aces_count)
)
)
diff --git a/data/examples/blackjack/global.fate b/data/examples/blackjack/global.fate
index acf054e..d08706b 100644
--- a/data/examples/blackjack/global.fate
+++ b/data/examples/blackjack/global.fate
@@ -15,12 +15,8 @@
)
)
-(global int marker_0)
-
(declare_text_effect action_description)
-(global int marker_1)
-
(define_sequence money_acquisition ((int amount))
(set! player.money (+ player.money amount))
(if (> amount 0)
@@ -30,8 +26,6 @@
)
)
-(global int marker_2)
-
(define_sequence money_loss ((int amount))
(set! player.money (- player.money amount))
(if (> amount 0)
@@ -41,8 +35,4 @@
)
)
-(global int marker_3)
-
(declare_input_event escape)
-
-(global int marker_4)
diff --git a/data/examples/blackjack/main.fate b/data/examples/blackjack/main.fate
index 170ef29..2738ce3 100644
--- a/data/examples/blackjack/main.fate
+++ b/data/examples/blackjack/main.fate
@@ -19,7 +19,7 @@ you some coins.
Just between you and me, someone left those laying around, they aren't mine.
(visit! money_acquisition (+ 100 (rand 0 100)))
-(set! original_amount (var player.money))
+(set! original_amount player.money)
Now, you're all set to go... unless you don't know how to play?
@@ -72,8 +72,8 @@ Now, you're all set to go... unless you don't know how to play?
)
(text_effect action_description
- You walk out, having turned (eval coins_word (var original_amount)) into
- (eval coins_word (var player.money)).
+ You walk out, having turned (eval coins_word original_amount) into
+ (eval coins_word player.money).
)
(end!)
diff --git a/data/examples/blackjack/play.fate b/data/examples/blackjack/play.fate
index fd4d65c..76b9e2b 100644
--- a/data/examples/blackjack/play.fate
+++ b/data/examples/blackjack/play.fate
@@ -4,14 +4,12 @@
(require global.fate)
(require cards.fate)
-(global bool has_played)
+(global bool has_played (false))
(global (list card) current_deck)
(global (list card) dealer_hand)
(global int bet)
(global bool has_doubled)
-(set! has_played (false))
-
(define_sequence play_a_game ()
(local card new_card)
@@ -29,7 +27,7 @@
(prompt_integer!
(ptr bet)
1
- (var player.money)
+ player.money
How much would you like to bet?
)
(text_effect action_description
@@ -41,7 +39,7 @@
(set! current_deck (list:shuffle deck_template))
(list:pop_left! current_deck new_card)
- (list:add! (var new_card) player.hand)
+ (list:add! new_card player.hand)
(text_effect action_description
You have been dealt the (var new_card.name).
@@ -49,7 +47,7 @@
)
(list:pop_left! current_deck new_card)
- (list:add! (var new_card) dealer_hand)
+ (list:add! new_card dealer_hand)
(text_effect action_description
The dealer has drawn the (var new_card.name).
@@ -57,7 +55,7 @@
)
(list:pop_left! current_deck new_card)
- (list:add! (var new_card) player.hand)
+ (list:add! new_card player.hand)
(text_effect action_description
You have been dealt the (var new_card.name).
@@ -67,7 +65,7 @@
(newline)
(list:pop_left! current_deck new_card)
- (list:add! (var new_card) dealer_hand)
+ (list:add! new_card dealer_hand)
(text_effect action_description
The dealer has drawn a card, face down.
@@ -76,8 +74,7 @@
(visit! initial_draw)
- (list:clear! dealer_hand)
- (list:clear! player.hand)
+ (list:clear! dealer_hand player.hand)
(newline)
Interesting. Would you like to go again?
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java
index 3d60f88..9fabde5 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java
@@ -76,7 +76,7 @@ public class Clear extends GenericInstruction
result = new ArrayList<Instruction>();
sub_call_parameters = new ArrayList<Computation>();
- sub_call_parameters.add(sub_call_parameters.get(0));
+ sub_call_parameters.add(call_parameters.get(0));
for (int i = 0; i < size_minus_one; ++i)
{
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java
index 9f3be2e..c8800b4 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java
@@ -70,7 +70,7 @@ public class Decrement extends GenericInstruction
result = new ArrayList<Instruction>();
sub_call_parameters = new ArrayList<Computation>();
- sub_call_parameters.add(call_parameters.get(size_minus_one));
+ sub_call_parameters.add(call_parameters.get(0));
for (int i = 0; i < size_minus_one; ++i)
{
@@ -88,10 +88,10 @@ public class Decrement extends GenericInstruction
element = call_parameters.get(0);
- RecurrentChecks.assert_can_be_used_as(element, Type.INT);
-
element.expect_non_string();
+ RecurrentChecks.assert_can_be_used_as(element, Type.INT);
+
element.use_as_reference();
return new Decrement(origin, element);
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java
index 92e8290..8f81c88 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java
@@ -70,7 +70,7 @@ public class Increment extends GenericInstruction
result = new ArrayList<Instruction>();
sub_call_parameters = new ArrayList<Computation>();
- sub_call_parameters.add(call_parameters.get(size_minus_one));
+ sub_call_parameters.add(call_parameters.get(0));
for (int i = 0; i < size_minus_one; ++i)
{
@@ -88,10 +88,10 @@ public class Increment extends GenericInstruction
element = call_parameters.get(0);
- RecurrentChecks.assert_can_be_used_as(element, Type.INT);
-
element.expect_non_string();
+ RecurrentChecks.assert_can_be_used_as(element, Type.INT);
+
element.use_as_reference();
return new Increment(origin, element);
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java
index 15835e1..e71a117 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java
@@ -67,7 +67,7 @@ public class ReverseList extends GenericInstruction
result = new ArrayList<Instruction>();
sub_call_parameters = new ArrayList<Computation>();
- sub_call_parameters.add(sub_call_parameters.get(0));
+ sub_call_parameters.add(call_parameters.get(0));
for (int i = 0; i < size_minus_one; ++i)
{
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java
index eac8434..6f3a55f 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java
@@ -66,7 +66,7 @@ public class Shuffle extends GenericInstruction
result = new ArrayList<Instruction>();
sub_call_parameters = new ArrayList<Computation>();
- sub_call_parameters.add(sub_call_parameters.get(0));
+ sub_call_parameters.add(call_parameters.get(0));
for (int i = 0; i < size_minus_one; ++i)
{
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 71d1d36..2aa2695 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -371,6 +371,44 @@ first_level_instruction
PARSER.get_world().variables().add(new_variable);
}
+ | DECLARE_GLOBAL_VARIABLE_KW
+ type WS+
+ name=identifier WS+
+ value=computation WS*
+ R_PAREN
+ {
+ final Origin start_origin, type_origin;
+ final Variable new_variable;
+
+ start_origin =
+ PARSER.get_origin_at
+ (
+ ($DECLARE_GLOBAL_VARIABLE_KW.getLine()),
+ ($DECLARE_GLOBAL_VARIABLE_KW.getCharPositionInLine())
+ );
+
+ new_variable =
+ new Variable
+ (
+ start_origin,
+ ($type.result),
+ ($name.result),
+ false
+ );
+
+ PARSER.get_world().variables().add(new_variable);
+
+ PARSER.get_world().add_global_instruction
+ (
+ SetValue.build
+ (
+ start_origin,
+ new VariableReference(start_origin, new_variable),
+ ($value.result)
+ )
+ );
+ }
+
| DECLARE_EXTERNAL_VARIABLE_KW type WS+ name=identifier WS* R_PAREN
{
final Origin start_origin, type_origin;
@@ -592,6 +630,51 @@ returns [Instruction result]
$result = new LocalVariable(new_variable);
}
+ | DECLARE_LOCAL_VARIABLE_KW
+ type WS+
+ name=identifier WS+
+ value=computation WS*
+ R_PAREN
+ {
+ final Origin start_origin, type_origin;
+ final Variable new_variable;
+ final Map<String, Variable> variable_map;
+ final List<Instruction> shorthand;
+
+ shorthand = new ArrayList<Instruction>();
+
+ start_origin =
+ PARSER.get_origin_at
+ (
+ ($DECLARE_LOCAL_VARIABLE_KW.getLine()),
+ ($DECLARE_LOCAL_VARIABLE_KW.getCharPositionInLine())
+ );
+
+ new_variable =
+ new Variable
+ (
+ start_origin,
+ ($type.result),
+ ($name.result),
+ false
+ );
+
+ PARSER.add_local_variable(new_variable);
+
+ shorthand.add(new LocalVariable(new_variable));
+ shorthand.add
+ (
+ SetValue.build
+ (
+ start_origin,
+ new VariableReference(start_origin, new_variable),
+ ($value.result)
+ )
+ );
+
+ $result = new InstructionList(start_origin, shorthand);
+ }
+
/******************************************************************************/
/**** LOOPS *******************************************************************/
/******************************************************************************/