23 | 23 |
|
24 | 24 |
# Fuel factor 0 won't ever be enough to sustain anything.
|
25 | 25 |
|
26 | |
echo -n "((*))" | $FOUNTAIN --dump-state --initial-fuel 0 --fuel-factor 0 parse eg/nested-parens.fountain -- n=2 | \
|
|
26 |
echo -n "((*))" | $FOUNTAIN --dump-state --convert-loops --initial-fuel 0 --fuel-factor 0 parse eg/nested-parens.fountain -- n=2 | \
|
27 | 27 |
expect 'Left "Out of fuel"'
|
28 | 28 |
|
29 | 29 |
# But if you have enough fuel initially, it doesn't have to be sustainable.
|
30 | 30 |
|
31 | |
echo -n "((*))" | $FOUNTAIN --dump-state --initial-fuel 4 --fuel-factor 0 parse eg/nested-parens.fountain -- n=2 | \
|
|
31 |
echo -n "((*))" | $FOUNTAIN --dump-state --convert-loops --initial-fuel 4 --fuel-factor 0 parse eg/nested-parens.fountain -- n=2 | \
|
32 | 32 |
expect 'Right (Parsing {input = "", store = fromList [(Var "a",2),(Var "n",2)], fuel = FuelState {currentFuel = 1, fuelFactor = Just 0}})'
|
33 | 33 |
|
34 | 34 |
# Fuel factor 1 is sufficient for this parsing problem.
|
35 | 35 |
|
36 | |
echo -n "((*))" | $FOUNTAIN --dump-state --initial-fuel 1 --fuel-factor 1 parse eg/nested-parens.fountain -- n=2 | \
|
|
36 |
echo -n "((*))" | $FOUNTAIN --dump-state --convert-loops --initial-fuel 1 --fuel-factor 1 parse eg/nested-parens.fountain -- n=2 | \
|
37 | 37 |
expect 'Right (Parsing {input = "", store = fromList [(Var "a",2),(Var "n",2)], fuel = FuelState {currentFuel = 3, fuelFactor = Just 1}})'
|
38 | 38 |
|
39 | 39 |
# If you can do something with fuel factor 1, you can do it with fuel factor 2 as well.
|
40 | 40 |
|
41 | |
echo -n "((*))" | $FOUNTAIN --dump-state --initial-fuel 1 --fuel-factor 2 parse eg/nested-parens.fountain -- n=2 | \
|
|
41 |
echo -n "((*))" | $FOUNTAIN --dump-state --convert-loops --initial-fuel 1 --fuel-factor 2 parse eg/nested-parens.fountain -- n=2 | \
|
42 | 42 |
expect 'Right (Parsing {input = "", store = fromList [(Var "a",2),(Var "n",2)], fuel = FuelState {currentFuel = 8, fuelFactor = Just 2}})'
|
43 | 43 |
|
44 | 44 |
### Fuel Consumption During Generation ###
|
45 | 45 |
|
46 | 46 |
# Given enough fuel, it does generate.
|
47 | 47 |
|
48 | |
$FOUNTAIN --fuel-factor 1 --initial-fuel 4 generate eg/nested-parens.fountain n=3 | \
|
|
48 |
$FOUNTAIN --convert-loops --fuel-factor 1 --initial-fuel 4 generate eg/nested-parens.fountain n=3 | \
|
49 | 49 |
expect '(((*)))'
|
50 | 50 |
|
51 | 51 |
# It does need some initial fuel.
|
52 | 52 |
|
53 | |
$FOUNTAIN --fuel-factor 1 --initial-fuel 0 generate eg/nested-parens.fountain n=3 | \
|
|
53 |
$FOUNTAIN --convert-loops --fuel-factor 1 --initial-fuel 0 generate eg/nested-parens.fountain n=3 | \
|
54 | 54 |
expect 'Failure'
|
55 | 55 |
|
56 | 56 |
# Fuel gain, and usage, is proportional to the given n in this case.
|
57 | 57 |
|
58 | |
$FOUNTAIN --fuel-factor 1 --initial-fuel 4 generate eg/nested-parens.fountain n=10 | \
|
|
58 |
$FOUNTAIN --convert-loops --fuel-factor 1 --initial-fuel 4 generate eg/nested-parens.fountain n=10 | \
|
59 | 59 |
expect '((((((((((*))))))))))'
|
60 | 60 |
|
61 | 61 |
# If fuel factor is 0 it is reliant on the initial fuel.
|
62 | 62 |
|
63 | |
$FOUNTAIN --fuel-factor 0 --initial-fuel 4 generate eg/nested-parens.fountain n=10 | \
|
|
63 |
$FOUNTAIN --convert-loops --fuel-factor 0 --initial-fuel 4 generate eg/nested-parens.fountain n=10 | \
|
64 | 64 |
expect 'Failure'
|
65 | 65 |
|
66 | |
$FOUNTAIN --fuel-factor 0 --initial-fuel 15 generate eg/nested-parens.fountain n=10 | \
|
|
66 |
$FOUNTAIN --convert-loops --fuel-factor 0 --initial-fuel 15 generate eg/nested-parens.fountain n=10 | \
|
67 | 67 |
expect '((((((((((*))))))))))'
|