我试图理解以下代码:
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似乎同时拥有let
和where
,但我对他们的haskell文档的肤浅解读并没有太多的了解。他们也有一个let...in
,我不明白,但知道FFL是否有这个很好。
那么,使用let
与where
的重要性是什么?是否有必要在这里使用let
? (另外,可能还有另一个问题:为什么需要那些分号?)
答案 0 :(得分:2)
在此之前从不知道FFL中的let
,必须非常罕见。
无论有什么见解,分号都必须是绝对必要的,以便在使用绑定变量之前强制执行。换句话说,在使用分号之前,变量不存在 。没有约束值。
这与where
有很大不同,后者不需要分号。
鉴于分号不是完整初学者的结构,我可以在某种程度上建议初学者将变量放在where
中,直到理解分号的诡计。
答案 1 :(得分:2)
使用let
引入了一个可以修改的变量。请注意found
和items
的修改方式。相比之下,where
总是引入不可变符号。
在FFL中使用分号来创建命令管道。通常在FFL中,整个公式评估,导致命令或命令列表,然后命令执行。
当存在分号时,分号前的所有内容都被视为与分号后的所有内容完全分开的公式。第一个公式是评估和执行,然后评估并执行第二个公式。
半冒号在FFL中有效地允许更多程序化的编程风格,没有分号,它是纯函数式语言。