关键字 - FFL:Where vs. Let

时间:2018-05-21 22:21:13

标签: where-clause let anura ffl

我试图理解以下代码:

    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似乎同时拥有letwhere,但我对他们的haskell文档的肤浅解读并没有太多的了解。他们也有一个let...in,我不明白,但知道FFL是否有这个很好。

那么,使用letwhere的重要性是什么?是否有必要在这里使用let? (另外,可能还有另一个问题:为什么需要那些分号?)

2 个答案:

答案 0 :(得分:2)

在此之前从不知道FFL中的let,必须非常罕见。

无论有什么见解,分号都必须是绝对必要的,以便在使用绑定变量之前强制执行。换句话说,在使用分号之前,变量不存在 。没有约束值。

这与where有很大不同,后者不需要分号。

鉴于分号不是完整初学者的结构,我可以在某种程度上建议初学者将变量放在where中,直到理解分号的诡计。

答案 1 :(得分:2)

使用let引入了一个可以修改的变量。请注意founditems的修改方式。相比之下,where总是引入不可变符号。

在FFL中使用分号来创建命令管道。通常在FFL中,整个公式评估,导致命令或命令列表,然后命令执行

当存在分号时,分号前的所有内容都被视为与分号后的所有内容完全分开的公式。第一个公式是评估执行,然后评估并执行第二个公式。

半冒号在FFL中有效地允许更多程序化的编程风格,没有分号,它是纯函数式语言。