ключевое слово - 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, похоже, есть и let, и where, но я мало что узнал, поверхностно прочитав их документы по хаскелю. У них также есть let...in, чего я не понял, но было бы неплохо узнать, есть ли он у FFL.

Итак, каково значение использования let по сравнению с where? Нужно ли было использовать здесь let? (Также, возможно, еще один вопрос: зачем нужны эти точки с запятой?)


person Patrick Parker    schedule 21.05.2018    source источник


Ответы (2)


Использование let вводит переменную, которую можно изменить. Обратите внимание, как изменяются found и items. Напротив, where всегда вводит неизменяемые символы.

Точки с запятой используются в FFL для создания конвейера команд. Обычно в FFL вся формула вычисляется, в результате получается команда или список команд, а затем команды выполняются.

Когда присутствует точка с запятой, все, что находится перед точкой с запятой, рассматривается как совершенно отдельная формула для всего, что находится после точки с запятой. Первая формула оценивается и выполняется, а затем оценивается и выполняется вторая формула.

Точки с запятой фактически допускают гораздо более процедурный стиль программирования в FFL, без точек с запятой это чисто функциональный язык.

person Denivarius    schedule 21.05.2018

Никогда не знал о let в FFL до этого, должно быть очень редко.

Независимо от понимания, точка с запятой должна быть абсолютно необходимой, чтобы принудительно выполнить выполнение перед использованием связанной переменной. Другими словами, пока не использована точка с запятой, переменная не существует. Не имеет связанного значения.

Это большое отличие от where, которому не нужны точки с запятой.

Учитывая, что точка с запятой не является конструкцией для полных новичков, я мог бы порекомендовать новичкам в отношении переменных придерживаться where до тех пор, пока не пойму хитрость точек с запятой.

person 1737973    schedule 21.05.2018
comment
Вы можете проверить основной вопрос об отношении точки с запятой к запятой как причину считать точку с запятой элементом несколько менее простым, чем может показаться на первый взгляд. - person 1737973; 22.05.2018