расширенный ffl: условное выражение тогда-выражения активация - PullRequest
0 голосов
/ 06 ноября 2018

Вот фрагмент из https://github.com/anura-engine/anura/blob/55bc02244f0faba5e0831578a3c1c9a82e7bf569/src/formula_function.cpp#L923-L931:

    FUNCTION_DEF(if, 2, -1, "if(a,b,c)")

        const int nargs = static_cast<int>(NUM_ARGS);
        for(int n = 0; n < nargs-1; n += 2) {
            const bool result = EVAL_ARG(n).as_bool();
            if(result) {
                return EVAL_ARG(n+1);
            }
        }

Как мы видим, если существует более одного условия, оценивающего как истинное, возвращается только then-выражение , соответствующее первому условию, оценивающему как истинное.

На самом деле, только первое условие, оцениваемое как истинное, оценивается как истинное.

Мета-обсуждение FFL, (1) имело бы смысл, что выражение должно оценивать все условия и возвращать список всех тогда-выражений , соответствующих истинным условиям, до тех пор, пока внутри целого условное выражение не содержит триггеров выполнения (bind_command, ; и т. д.)? Также (2) это уже существует (очевидно, с другой подписью)?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

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

С другой стороны, структура для реализации повторяющихся else-if очень полезна для уменьшения вложенности. (Чрезмерное вложение вызывает проблемы с читаемостью и создает возможность для путаницы.)

if condition, then action
else-if condition, then action (optional)
...
else-if condition, then action (optional)
else action (optional)
0 голосов
/ 15 ноября 2018

Я думаю, что это может иметь смысл для функции if для оценки и возврата прохождения. Я видел только 2- и 3-параметрические функции if, используемые в дикой природе, поэтому я не могу комментировать версию с n-параметрами, как только что узнал об этом. (Кажется, это эквивалентно «если, еще, если,…, еще». Ххх.)

Ближайший синтаксис, который я знаю для списка условий / операторов, выглядит примерно так:

on_create: "filter([
    true and debug('cmd 1'),
    false and debug('cmd 2'),
    true and debug('cmd 3'),
], value)",

Это выведет «cmd 1» и «cmd 3» на экран.

Это работает, потому что and замыкает накоротко, и возвращает только первое, что должно пройти, или последнее, что выйдет из строя. Вызов filter() требуется только в том случае, если вы хотите использовать true и false, в противном случае вы можете использовать true и null и удалить filter(). Обратите внимание, что вы также можете использовать ; с этой конструкцией, я думаю, что она оценивает последовательность команд, которую вы можете использовать и обрабатывать как обычную команду. Например:

on_create: "filter([
    true and debug('cmd 1'),
    false and (debug('cmd 2'); debug('cmd 3')),
    true and (debug('cmd 4'); debug('cmd 5')),
], value)",

Печатает «cmd 1», «cmd 4» и «cmd 5» на экран.

Это эквивалентно:

on_create: "[
    if(true, debug('cmd 1')),
    if(false, debug('cmd 2'); debug('cmd 3')),
    if(true, debug('cmd 4'); debug('cmd 5')),
]",

, который также выводит на экран «cmd 1», «cmd 4» и «cmd 5». Если вам нужно исключить из списка пустые элементы, можно использовать фильтр, как в первом примере.

...