2

I was trying to understand the following code:

    def() ->commands
        if(deferred_passive_abilities != [],
           let [{ability: class passive_ability, creature: class creature}] items = [];
           let found = false;
           map(deferred_passive_abilities,
             if(cmd = null, add(items, [value]), [cmd, set(found, true)])
             where cmd = value.ability.static_effect(me, value.creature));

           if(found,
              set(deferred_passive_abilities, items);
              evaluate_deferred_passive_abilities(),
              set(deferred_passive_abilities, []))
        )

Haskell appears to have both let and where, but I didn't learn much by a superficial reading of their haskell docs. They also have a let...in, which I didn't understand but it would be good to know if FFL has that.

So, what is the significance of using let versus where? Was it necessary to use let here? (Also, possibly another question: why does it need those semicolons?)

Patrick Parker
  • 4,863
  • 4
  • 19
  • 51

2 Answers2

2

Never knew of let in FFL before this, must be very rare.

Regardless of the insights, the semicolon has to be absolutely necessary, in order to force execution before using the bound variable. In other words, until used the semicolon, the variable does not exist. Does not have a bound value.

This is a big difference to where, which doesn't need of semicolons.

Given the semicolon is not a construction for complete beginners, I could somewhat recommend beginners about variables to stick in where until understanding the trickery of the semicolons.

1737973
  • 159
  • 18
  • 42
  • 1
    You can check [the main question about the semicolon relationship to the comma](https://stackoverflow.com/q/50457675/1737973) as the reason to consider the semicolon an element somewhat less straightforward than it could seem at first sight. – 1737973 May 22 '18 at 09:25
2

Using let introduces a variable that can be modified. Note how found and items are modified. By contrast, where always introduces immutable symbols.

Semi-colons are used in FFL to create a command pipeline. Normally in FFL, an entire formula is evaluated, resulting in a command or list of commands, and then the commands are executed.

When a semi-colon is present, everything before the semi-colon is treated as an entirely separate formula to everything after the semi-colon. The first formula is evaluated and executed and then the second formula is evaluated and executed.

Semi-colons effectively allow a much more procedural programming style in FFL, without semi-colons it is a purely functional language.

Denivarius
  • 181
  • 2