Особенности синтаксиса
Здесь обсуждаем особенности синтаксического разбора QSP. Не выполнение команд, а именно алгоритм разбора строки кода на составляющие.
Знак “&” служит для “склеивания” строк, и одновременно для разделения операторов. Это сильно усложняет синтаксический разбор кода, создавая всякие неоднозначности.
Например, вот так писать нельзя:
IF $CURLOC = 'S' & 'A' :
END
А так - можно.
IF $CURLOC = ('S' & 'A') :
END
Наряду со знаком “&”, для “склеивания” строк используется знак “+”. Но приоритет у них разный, поэтому следующие записи приведут к разному результату:
$b = 'ppp' & 'bbb'
$b = 'ppp' + 'bbb'
Первая строка - последовательное выполнение операторов присваивания и вывода на экран, вторая строка - “склейка” строки и запись результата в переменную.
Следующий код выведет разный результат:
('d1' = 'd' + 1)
('d1' = 'd' & 1)
Первая строка:
1. склейка “d” и “1”
2. сравнение, возвращает -1 (истина)
3. вывод “-1”
Вторая строка:
1. сравнение “d1” и “d”, возвращает 0 (ложь)
2. склейка “0” и “1”
3. вывод “01”
То есть лучше писать “and”?
Nex,
С приоритетом операции “&” сейчас ошибка - приоритет должен быть ниже, чем у “+”, но выше, чем у “=“.
Будет исправлено в след. версии.
Byte,
то есть записи станут эквивалентны?
Я бы предпочел, конечно, чтобы “&” использовался только для разделения операторов, иначе действительно очень много путаницы возникает. Это возможно?
Евген,
в эту тему вообще не заглядывай, эти вопросы настолько сложны, что я не в силах тебе их объяснить. Тебе нет нужды интересоваться этим. Чисто техническая тема.
Nex на мой взгляд путаницы нет, если разделять операторы и выражения :)
В операторах это разделитель операторов, в выражениях это объединение строк.
Byte,
на первый вопрос не ответил.
Nex,
нет, у “&” приоритет будет немного ниже, чем у “+”.
Byte,
я спросил конкретно про те строки - они выполнятся с одинаковым результатом?
Последние 2 строки - да.
Byte,
а остальные?
В остальных случаях будет также как было.
Nex:
Наряду со знаком “&”, для “склеивания” строк используется знак “+”. Но приоритет у них разный, поэтому следующие записи приведут к разному результату
Здесь дело не в приоритете, а в разном контексте использования.
В «Документации QSP» в разделе «Выражения» написано:
Для значения “верно” настоятельно рекомендуется использовать -1, т.к. только в этом случае будут адекватно работать побитовые операторы в роли логических.
Я не понимаю, что и в каком случае будет работать неадекватно и почему.
snail:
В «Документации QSP» в разделе «Выражения» написано:
Для значения “верно” настоятельно рекомендуется использовать -1, т.к. только в этом случае будут адекватно работать побитовые операторы в роли логических.
Я не понимаю, что и в каком случае будет работать неадекватно и почему.
Присоиденяюсь к даному вопросу.
Побитовые операторы NO, OR и AND будут работать как логические операторы только для 0 и -1
Например, 1 and 2 = 0